diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index 810d3465c2ee651ab9227d7b1e62505633de99b4..7fb0c0c6a945a74d491920c68022ce12e384b1c9 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -1287,7 +1287,7 @@ set(L2_SRC ${RLC_DIR}/rlc.c ${RLC_DIR}/rlc_rrc.c ${RLC_DIR}/rlc_mpls.c - ${RRC_DIR}/rrc_UE.c +# ${RRC_DIR}/rrc_UE.c ${RRC_DIR}/rrc_eNB.c ${RRC_DIR}/rrc_eNB_S1AP.c ${RRC_DIR}/rrc_eNB_UE_context.c diff --git a/openair1/SIMULATION/ETH_TRANSPORT/netlink_init.c b/openair1/SIMULATION/ETH_TRANSPORT/netlink_init.c index 358a561c21ca9d52e9471c047287546e4591a435..cdda4dfe78669717710a4c79ea519c3afabf90c3 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/netlink_init.c +++ b/openair1/SIMULATION/ETH_TRANSPORT/netlink_init.c @@ -93,12 +93,12 @@ static int tun_alloc(char *dev) { return fd; } -int netlink_init_tun(void) { +int netlink_init_tun(char *ifprefix) { int ret; char ifname[64]; for (int i = 0; i < NUMBER_OF_UE_MAX; i++) { - sprintf(ifname, "oaitun_ue%d",i+1); + sprintf(ifname, "oaitun_%.3s%d",ifprefix,i+1); nas_sock_fd[i] = tun_alloc(ifname); if (nas_sock_fd[i] == -1) { diff --git a/openair1/SIMULATION/ETH_TRANSPORT/proto.h b/openair1/SIMULATION/ETH_TRANSPORT/proto.h index 6d54bfb24cd9d3a2f2c682c93a8001ef54c40fb9..d84322da31faacc25cacf54aa954b2a8642a1ab1 100644 --- a/openair1/SIMULATION/ETH_TRANSPORT/proto.h +++ b/openair1/SIMULATION/ETH_TRANSPORT/proto.h @@ -62,6 +62,6 @@ int multicast_link_read_data_from_sock(uint8_t eNB_flag); void clear_eNB_transport_info(uint8_t); void clear_UE_transport_info(uint8_t); int netlink_init(void); -int netlink_init_tun(void); +int netlink_init_tun(char *ifsuffix); #endif /* EMU_PROTO_H_ */ diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c index 76e36dca9a0438a951d6718ed30515ead6140656..3801df9a3927bd9b9365cac04e312d83723afc93 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c @@ -51,7 +51,7 @@ #include "targets/COMMON/openairinterface5g_limits.h" #include "SIMULATION/ETH_TRANSPORT/proto.h" #include "UTIL/OSA/osa_defs.h" - +#include "openair2/RRC/NAS/nas_config.h" # include "intertask_interface.h" @@ -1145,9 +1145,10 @@ pdcp_run ( } while(msg_p != NULL); // IP/NAS -> PDCP traffic : TX, read the pkt from the upper layer buffer - if (LINK_ENB_PDCP_TO_GTPV1U && ctxt_pP->enb_flag == ENB_FLAG_NO) { - pdcp_fifo_read_input_sdus(ctxt_pP); - } +// if (LINK_ENB_PDCP_TO_GTPV1U && ctxt_pP->enb_flag == ENB_FLAG_NO) { + if (!EPC_MODE_ENABLED || ctxt_pP->enb_flag == ENB_FLAG_NO ) { + pdcp_fifo_read_input_sdus(ctxt_pP); + } // PDCP -> NAS/IP traffic: RX if (ctxt_pP->enb_flag) { @@ -2027,9 +2028,6 @@ rrc_pdcp_config_req ( } } - -//----------------------------------------------------------------------------- - uint64_t pdcp_module_init( uint64_t pdcp_optmask ) { /* temporary enforce netlink when UE_NAS_USE_TUN is set, this is while switching from noS1 as build option @@ -2045,8 +2043,14 @@ uint64_t pdcp_module_init( uint64_t pdcp_optmask ) { if (PDCP_USE_NETLINK) { if(UE_NAS_USE_TUN) { - netlink_init_tun(); + netlink_init_tun("ue"); + LOG_I(PDCP, "UE pdcp will use tun interface\n"); + } else if(ENB_NAS_USE_TUN) { + netlink_init_tun("enb"); + nas_config(1, 1, 1, "enb"); + LOG_I(PDCP, "ENB pdcp will use tun interface\n"); } else { + LOG_I(PDCP, "pdcp will use kernel modules\n"); netlink_init(); } } @@ -2054,6 +2058,7 @@ uint64_t pdcp_module_init( uint64_t pdcp_optmask ) { return pdcp_params.optmask ; } + //----------------------------------------------------------------------------- void pdcp_free ( diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h index 8f30608cd8a8504a21953606834aaa0279227f1a..cf8d1a1fd617c4b62ef37d82e9700b66d8a8dcf3 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h @@ -55,6 +55,7 @@ #define LINK_ENB_PDCP_TO_IP_DRIVER_BIT (1<< 13) #define LINK_ENB_PDCP_TO_GTPV1U_BIT (1<< 14) #define UE_NAS_USE_TUN_BIT (1<< 15) +#define ENB_NAS_USE_TUN_BIT (1<< 16) typedef struct { uint64_t optmask; } pdcp_params_t; @@ -63,6 +64,7 @@ typedef struct { #define LINK_ENB_PDCP_TO_IP_DRIVER ( get_pdcp_optmask() & LINK_ENB_PDCP_TO_IP_DRIVER_BIT) #define LINK_ENB_PDCP_TO_GTPV1U ( get_pdcp_optmask() & LINK_ENB_PDCP_TO_GTPV1U_BIT) #define UE_NAS_USE_TUN ( get_pdcp_optmask() & UE_NAS_USE_TUN_BIT) +#define ENB_NAS_USE_TUN ( get_pdcp_optmask() & ENB_NAS_USE_TUN_BIT) uint64_t get_pdcp_optmask(void); extern pthread_t pdcp_thread; diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c index a55cf906a0f94593ab9e9a55c2d8b02b4c8729ec..8a44d7b1a86179a9bc10b1f527de10c232c82353 100644 --- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c +++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c @@ -125,7 +125,9 @@ int pdcp_fifo_flush_sdus(const protocol_ctxt_t *const ctxt_pP) { sizeof(sidelink_pc5s_element), 0, (struct sockaddr *)&prose_pdcp_addr,sizeof(prose_pdcp_addr) ); } else if (UE_NAS_USE_TUN) { ret = write(nas_sock_fd[ctxt_pP->module_id], &(sdu_p->data[sizeof(pdcp_data_ind_header_t)]),sizeToWrite ); - } else if (PDCP_USE_NETLINK) {//UE_NAS_USE_TUN + } else if (ENB_NAS_USE_TUN) { + ret = write(nas_sock_fd[0], &(sdu_p->data[sizeof(pdcp_data_ind_header_t)]),sizeToWrite ); + } else if (PDCP_USE_NETLINK) { memcpy(NLMSG_DATA(nas_nlh_tx), (uint8_t *) sdu_p->data, sizeToWrite); nas_nlh_tx->nlmsg_len = sizeToWrite; ret = sendmsg(nas_sock_fd[0],&nas_msg_tx,0); @@ -143,8 +145,9 @@ int pdcp_fifo_flush_sdus(const protocol_ctxt_t *const ctxt_pP) { //----------------------------------------------------------------------------- int pdcp_fifo_read_input_sdus (const protocol_ctxt_t *const ctxt_pP) { pdcp_data_req_header_t pdcp_read_header_g; + - if (UE_NAS_USE_TUN) { + if (UE_NAS_USE_TUN || ENB_NAS_USE_TUN) { protocol_ctxt_t ctxt = *ctxt_pP; hash_key_t key = HASHTABLE_NOT_A_KEY_VALUE; hashtable_rc_t h_rc; @@ -155,20 +158,31 @@ int pdcp_fifo_read_input_sdus (const protocol_ctxt_t *const ctxt_pP) { do { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_FIFO_READ, 1 ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_FIFO_READ_BUFFER, 1 ); - len = read(nas_sock_fd[ctxt_pP->module_id], &nl_rx_buf, NL_MAX_PAYLOAD); + len = read(UE_NAS_USE_TUN?nas_sock_fd[ctxt_pP->module_id]:nas_sock_fd[0], &nl_rx_buf, NL_MAX_PAYLOAD); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_FIFO_READ_BUFFER, 0 ); if (len<=0) continue; - LOG_D(PDCP, "PDCP_COLL_KEY_DEFAULT_DRB_VALUE(module_id=%d, rnti=%x, enb_flag=%d)\n", + + if (UE_NAS_USE_TUN) { + key = PDCP_COLL_KEY_DEFAULT_DRB_VALUE(ctxt.module_id, ctxt.rnti, ctxt.enb_flag); + h_rc = hashtable_get(pdcp_coll_p, key, (void **)&pdcp_p); + } else { + ctxt.rnti=pdcp_eNB_UE_instance_to_rnti[0]; + ctxt.enb_flag=ENB_FLAG_YES; + ctxt.module_id=0; + key = PDCP_COLL_KEY_VALUE(ctxt.module_id, ctxt.rnti, ctxt.enb_flag, rab_id, SRB_FLAG_YES); + h_rc = hashtable_get(pdcp_coll_p, key, (void **)&pdcp_p); + } + LOG_D(PDCP, "PDCP_COLL_KEY_DEFAULT_DRB_VALUE(module_id=%d, rnti=%x, enb_flag=%d)\n", ctxt.module_id, ctxt.rnti, ctxt.enb_flag); - key = PDCP_COLL_KEY_DEFAULT_DRB_VALUE(ctxt.module_id, ctxt.rnti, ctxt.enb_flag); - h_rc = hashtable_get(pdcp_coll_p, key, (void **)&pdcp_p); + + if (h_rc == HASH_TABLE_OK) { LOG_D(PDCP, "[FRAME %5u][UE][NETLINK][IP->PDCP] INST %d: Received socket with length %d on Rab %d \n", ctxt.frame, ctxt.instance, len, rab_id); - LOG_D(PDCP, "[FRAME %5u][UE][IP][INSTANCE %u][RB %u][--- PDCP_DATA_REQ / %d Bytes --->][PDCP][MOD %u][UE %u][RB %u]\n", + LOG_D(PDCP, "[FRAME %5u][UE][IP][INSTANCE %u][RB %u][--- PDCP_DATA_REQ / %d Bytes --->][PDCP][MOD %u][UE %04x][RB %u]\n", ctxt.frame, ctxt.instance, rab_id, len, ctxt.module_id, ctxt.rnti, rab_id); MSC_LOG_RX_MESSAGE((ctxt_pP->enb_flag == ENB_FLAG_YES) ? MSC_PDCP_ENB:MSC_PDCP_UE, @@ -192,7 +206,7 @@ int pdcp_fifo_read_input_sdus (const protocol_ctxt_t *const ctxt_pP) { MSC_AS_TIME_ARGS(ctxt_pP), ctxt.instance, rab_id, rab_id, len); LOG_D(PDCP, - "[FRAME %5u][UE][IP][INSTANCE %u][RB %u][--- PDCP_DATA_REQ / %d Bytes ---X][PDCP][MOD %u][UE %u][RB %u] NON INSTANCIATED INSTANCE key 0x%"PRIx64", DROPPED\n", + "[FRAME %5u][UE][IP][INSTANCE %u][RB %u][--- PDCP_DATA_REQ / %d Bytes ---X][PDCP][MOD %u][UE %04x][RB %u] NON INSTANCIATED INSTANCE key 0x%"PRIx64", DROPPED\n", ctxt.frame, ctxt.instance, rab_id, len, ctxt.module_id, ctxt.rnti, rab_id, key); } diff --git a/openair2/LAYER2/RLC/rlc.c b/openair2/LAYER2/RLC/rlc.c index 309facf34bba27d22f14c742ece2a8cf5ea9373b..b07f5b99fde04a07d766063cf282abc112285530 100644 --- a/openair2/LAYER2/RLC/rlc.c +++ b/openair2/LAYER2/RLC/rlc.c @@ -584,14 +584,14 @@ void rlc_data_ind ( const sdu_size_t sdu_sizeP, mem_block_t *sdu_pP) { //----------------------------------------------------------------------------- -#if defined(TRACE_RLC_PAYLOAD) + LOG_D(RLC, PROTOCOL_CTXT_FMT"[%s %u] Display of rlc_data_ind: size %u\n", PROTOCOL_CTXT_ARGS(ctxt_pP), (srb_flagP) ? "SRB" : "DRB", rb_idP, sdu_sizeP); rlc_util_print_hex_octets(RLC, (unsigned char *)sdu_pP->data, sdu_sizeP); -#endif + #if T_TRACER if (ctxt_pP->enb_flag) diff --git a/openair2/RRC/LTE/rrc_UE.c b/openair2/RRC/LTE/rrc_UE.c index d70d7030abb6b41df074ef41b22f790bb352dfa8..f8711da6391f6e6921879d29de1b2d6439bb1fad 100644 --- a/openair2/RRC/LTE/rrc_UE.c +++ b/openair2/RRC/LTE/rrc_UE.c @@ -810,18 +810,18 @@ rrc_ue_establish_drb( (eNB_index * NB_RB_MAX) + *DRB_config->logicalChannelIdentity, RADIO_ACCESS_BEARER,Rlc_info_um); */ - if(!EPC_MODE_ENABLED) { +// if(!EPC_MODE_ENABLED) { //# if !defined(OAI_NW_DRIVER_TYPE_ETHERNET) && !defined(EXMIMO) && !defined(OAI_USRP) && !defined(OAI_BLADERF) && !defined(ETHERNET) && !defined(LINK_ENB_PDCP_TO_GTPV1U) ip_addr_offset3 = 0; ip_addr_offset4 = 1; - LOG_I(OIP,"[UE %d] trying to bring up the OAI interface oai%d, IP 10.0.%d.%d\n", ue_mod_idP, ip_addr_offset3+ue_mod_idP, + LOG_I(OIP,"[UE %d] trying to bring up the OAI interface oip%d, IP 10.0.%d.%d\n", ue_mod_idP, ip_addr_offset3+ue_mod_idP, ip_addr_offset3+ue_mod_idP+1,ip_addr_offset4+ue_mod_idP+1); oip_ifup=nas_config(ip_addr_offset3+ue_mod_idP+1, // interface_id ip_addr_offset3+ue_mod_idP+1, // third_octet ip_addr_offset4+ue_mod_idP+1, // fourth_octet - "ue"); // interface suffix + "oip"); // interface suffix - if (oip_ifup == 0 && (!IS_SOFTMODEM_NOKRNMOD)) { // interface is up --> send a config the DRB + if (oip_ifup == 0 && (!UE_NAS_USE_TUN)) { // interface is up --> send a config the DRB LOG_I(OIP,"[UE %d] Config the ue net interface %d to send/receive pkt on DRB %ld to/from the protocol stack\n", ue_mod_idP, ip_addr_offset3+ue_mod_idP, @@ -837,7 +837,7 @@ rrc_ue_establish_drb( } //# endif - } +// } return(0); } diff --git a/openair2/RRC/LTE/rrc_eNB.c b/openair2/RRC/LTE/rrc_eNB.c index d377f3a8d6be01cfb53025c9412544d7349bdcd5..77519b2015bd010f1003ba893c0d6c090b55ea7d 100644 --- a/openair2/RRC/LTE/rrc_eNB.c +++ b/openair2/RRC/LTE/rrc_eNB.c @@ -6150,9 +6150,6 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( int i, drb_id; int oip_ifup = 0; int dest_ip_offset = 0; - /* avoid gcc warnings */ - (void)oip_ifup; - (void)dest_ip_offset; uint8_t *kRRCenc = NULL; uint8_t *kRRCint = NULL; uint8_t *kUPenc = NULL; @@ -6272,10 +6269,7 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( LOG_D(RRC, "[eNB %d] Frame %d: Establish RLC UM Bidirectional, DRB %d Active\n", ctxt_pP->module_id, ctxt_pP->frame, (int)DRB_configList->list.array[i]->drb_Identity); - if (!EPC_MODE_ENABLED) { -// if (PDCP_USE_NETLINK && (!LINK_ENB_PDCP_TO_GTPV1U)) { - // can mean also IPV6 since ether -> ipv6 autoconf -//# if !defined(OAI_NW_DRIVER_TYPE_ETHERNET) && !defined(EXMIMO) && !defined(OAI_USRP) && !defined(OAI_BLADERF) && !defined(ETHERNET) + if (!EPC_MODE_ENABLED && !ENB_NAS_USE_TUN) { LOG_I(OIP, "[eNB %d] trying to bring up the OAI interface oai%d\n", ctxt_pP->module_id, ctxt_pP->module_id); @@ -6283,7 +6277,7 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( ctxt_pP->module_id, // interface index ctxt_pP->module_id + 1, // thrid octet ctxt_pP->module_id + 1, // fourth octet - "enb"); + "oai"); if (oip_ifup == 0) { // interface is up --> send a config the DRB module_id_t ue_module_id; dest_ip_offset = 8; @@ -6301,10 +6295,8 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( ipv4_address(ctxt_pP->module_id + 1, dest_ip_offset + ue_module_id + 1)); //daddr LOG_D(RRC, "[eNB %d] State = Attached (UE rnti %x module id %u)\n", ctxt_pP->module_id, ue_context_pP->ue_context.rnti, ue_module_id); - } - -//# endif - } + } /* oip_ifup */ + } /* !EPC_MODE_ENABLED && ENB_NAS_USE_TUN*/ LOG_D(RRC, PROTOCOL_RRC_CTXT_UE_FMT" RRC_eNB --- MAC_CONFIG_REQ (DRB) ---> MAC_eNB\n", diff --git a/openair2/RRC/NAS/nas_config.c b/openair2/RRC/NAS/nas_config.c index 96ef60c13ad64114e6b3dbbd42536e745fbc0de8..2c432cf92243e5bd41604d439b9730d25ab6fdb1 100644 --- a/openair2/RRC/NAS/nas_config.c +++ b/openair2/RRC/NAS/nas_config.c @@ -236,7 +236,7 @@ int NAS_config(char *interfaceName, char *ipAddress, char *networkMask, char *br } // non blocking full configuration of the interface (address, and the two lest octets of the address) -int nas_config(int interface_id, int thirdOctet, int fourthOctet, char *ifsuffix) +int nas_config(int interface_id, int thirdOctet, int fourthOctet, char *ifname) { //char buf[5]; char ipAddress[20]; @@ -248,8 +248,8 @@ int nas_config(int interface_id, int thirdOctet, int fourthOctet, char *ifsuffix sprintf(broadcastAddress, "10.0.%d.255", thirdOctet); - sprintf(interfaceName, "%s%s%d", UE_NAS_USE_TUN?"oaitun_":"oip", - UE_NAS_USE_TUN?ifsuffix:"",interface_id); + sprintf(interfaceName, "%s%s%d", (UE_NAS_USE_TUN || ENB_NAS_USE_TUN)?"oaitun_":ifname, + UE_NAS_USE_TUN?"ue": (ENB_NAS_USE_TUN?"enb":""),interface_id); bringInterfaceUp(interfaceName, 0); // sets the machine address diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 60920eb401e97fabfca6265381bc1e4e21bffd7c..0ee3d6dcf972aa284370d44cca84f7f6ac09220a 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -653,9 +653,12 @@ int main( int argc, char **argv ) { LOG_I(HW, "Version: %s\n", PACKAGE_VERSION); printf("Runtime table\n"); fill_modeled_runtime_table(runtime_phy_rx,runtime_phy_tx); - pdcp_module_init( ( IS_SOFTMODEM_NOS1 && !(IS_SOFTMODEM_NOKRNMOD))? ( PDCP_USE_NETLINK_BIT | LINK_ENB_PDCP_TO_IP_DRIVER_BIT) : LINK_ENB_PDCP_TO_GTPV1U_BIT); + uint32_t pdcp_initmask = ( IS_SOFTMODEM_NOS1 )? ( PDCP_USE_NETLINK_BIT | LINK_ENB_PDCP_TO_IP_DRIVER_BIT) : LINK_ENB_PDCP_TO_GTPV1U_BIT; # - + if ( IS_SOFTMODEM_NOS1) + pdcp_initmask = pdcp_initmask | ENB_NAS_USE_TUN_BIT | SOFTMODEM_NOKRNMOD_BIT ; + pdcp_module_init(pdcp_initmask); + if (RC.nb_inst > 0) { // don't create if node doesn't connect to RRC/S1/GTP if (create_tasks(1) < 0) { diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index c8709f87c591cac19b36982ef152b87cd3aa8676..853c98df3f5d9c587901b2e3fb9284aa97f57b7f 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -578,11 +578,7 @@ static void *UE_thread_synch(void *arg) case pbch: -#if DISABLE_LOG_X - printf("[UE thread Synch] Running Initial Synch (mode %d)\n",UE->mode); -#else LOG_I(PHY, "[UE thread Synch] Running Initial Synch (mode %d)\n",UE->mode); -#endif if (initial_sync( UE, UE->mode ) == 0) { LOG_I( HW, "Got synch: hw_slot_offset %d, carrier off %d Hz, rxgain %d (DL %u, UL %u), UE_scan_carrier %d\n", @@ -702,19 +698,11 @@ static void *UE_thread_synch(void *arg) return &UE_thread_synch_retval; // not reached } } -#if DISABLE_LOG_X - printf("[initial_sync] trying carrier off %d Hz, rxgain %d (DL %u, UL %u)\n", - freq_offset, - UE->rx_total_gain_dB, - downlink_frequency[0][0]+freq_offset, - downlink_frequency[0][0]+uplink_frequency_offset[0][0]+freq_offset ); -#else LOG_I(PHY, "[initial_sync] trying carrier off %d Hz, rxgain %d (DL %u, UL %u)\n", freq_offset, UE->rx_total_gain_dB, downlink_frequency[0][0]+freq_offset, downlink_frequency[0][0]+uplink_frequency_offset[0][0]+freq_offset ); -#endif for (i=0; i<openair0_cfg[UE->rf_map.card].rx_num_channels; i++) { openair0_cfg[UE->rf_map.card].rx_freq[UE->rf_map.chain+i] = downlink_frequency[CC_id][i]+freq_offset; @@ -793,11 +781,7 @@ static void *UE_thread_rxn_txnp4(void *arg) { // most of the time, the thread is waiting here pthread_cond_wait( &proc->cond_rxtx, &proc->mutex_rxtx ); } - 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"); - } - + //printf("Processing sub frqme %d in %s\n", proc->subframe_rx, threadname); initRefTimes(t2); initRefTimes(t3); pickTime(current); @@ -870,12 +854,8 @@ static void *UE_thread_rxn_txnp4(void *arg) { phy_procedures_UE_S_TX(UE,0,0); updateTimes(current, &t3, 10000, "Delay to process sub-frame (case 3)"); - if (pthread_mutex_lock(&proc->mutex_rxtx) != 0) { - LOG_E( PHY, "[SCHED][UE] error locking mutex for UE RXTX\n" ); - exit_fun("noting to add"); - } proc->instance_cnt_rxtx--; - if ( IS_SOFTMODEM_BASICSIM ) { + if ( IS_SOFTMODEM_BASICSIM || IS_SOFTMODEM_RFSIM ) { if (pthread_cond_signal(&proc->cond_rxtx) != 0) abort(); } if (pthread_mutex_unlock(&proc->mutex_rxtx) != 0) { @@ -1665,7 +1645,7 @@ void *UE_thread(void *arg) { // update thread index for received subframe UE->current_thread_id[sub_frame] = thread_idx; - if (IS_SOFTMODEM_BASICSIM) { + if (IS_SOFTMODEM_BASICSIM || IS_SOFTMODEM_RFSIM ) { int t; for (t = 0; t < 2; t++) { UE_rxtx_proc_t *proc = &UE->proc.proc_rxtx[t]; @@ -1748,8 +1728,21 @@ void *UE_thread(void *arg) { LOG_E(PHY,"can't compensate: diff =%d\n", first_symbols); } pickTime(gotIQs); + struct timespec tv={0}; + tv.tv_nsec=10*1000; + if( IS_SOFTMODEM_BASICSIM || IS_SOFTMODEM_RFSIM) + tv.tv_sec=INT_MAX; // operate on thread sf mod 2 - AssertFatal(pthread_mutex_lock(&proc->mutex_rxtx) ==0,""); + if (pthread_mutex_timedlock(&proc->mutex_rxtx, &tv) !=0) { + if ( errno == ETIMEDOUT) { + LOG_E(PHY,"Missed real time\n"); + continue; + } else { + LOG_E(PHY,"System error\n"); + abort(); + } + } + //usleep(3000); if(sub_frame == 0) { //UE->proc.proc_rxtx[0].frame_rx++; //UE->proc.proc_rxtx[1].frame_rx++; @@ -1771,11 +1764,6 @@ void *UE_thread(void *arg) { proc->instance_cnt_rxtx++; LOG_D( PHY, "[SCHED][UE %d] UE RX instance_cnt_rxtx %d subframe %d !!\n", UE->Mod_id, proc->instance_cnt_rxtx,proc->subframe_rx); - if (proc->instance_cnt_rxtx != 0) { - LOG_E( PHY, "[SCHED][UE %d] UE RX thread busy (IC %d)!!\n", UE->Mod_id, proc->instance_cnt_rxtx); - if (proc->instance_cnt_rxtx > 2) - exit_fun("instance_cnt_rxtx > 2"); - } AssertFatal (pthread_cond_signal(&proc->cond_rxtx) ==0 ,""); AssertFatal(pthread_mutex_unlock(&proc->mutex_rxtx) ==0,""); diff --git a/targets/RT/USER/lte-uesoftmodem.c b/targets/RT/USER/lte-uesoftmodem.c index 78d5bebc43ab6354280c1138663a2545e98a1282..2eeb4cd426f638165f707d72770520a6bacf47cc 100644 --- a/targets/RT/USER/lte-uesoftmodem.c +++ b/targets/RT/USER/lte-uesoftmodem.c @@ -751,7 +751,6 @@ int main( int argc, char **argv ) { cpuf=get_cpu_freq_GHz(); pthread_cond_init(&sync_cond,NULL); pthread_mutex_init(&sync_mutex, NULL); -#if defined(ENABLE_ITTI) printf("ITTI init\n"); itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info); @@ -761,9 +760,9 @@ int main( int argc, char **argv ) { } MSC_INIT(MSC_E_UTRAN, THREAD_MAX+TASK_MAX); -#endif + init_opt(); - uint32_t pdcp_initmask = ((!IS_SOFTMODEM_NOS1) || IS_SOFTMODEM_NOKRNMOD)? LINK_ENB_PDCP_TO_GTPV1U_BIT : (LINK_ENB_PDCP_TO_GTPV1U_BIT | PDCP_USE_NETLINK_BIT | LINK_ENB_PDCP_TO_IP_DRIVER_BIT); + uint32_t pdcp_initmask = (!IS_SOFTMODEM_NOS1 )? LINK_ENB_PDCP_TO_GTPV1U_BIT : (LINK_ENB_PDCP_TO_GTPV1U_BIT | PDCP_USE_NETLINK_BIT | LINK_ENB_PDCP_TO_IP_DRIVER_BIT); if ( IS_SOFTMODEM_BASICSIM || IS_SOFTMODEM_RFSIM || (nfapi_mode == 3) ) { pdcp_initmask = pdcp_initmask | UE_NAS_USE_TUN_BIT; @@ -772,12 +771,11 @@ int main( int argc, char **argv ) { pdcp_initmask = pdcp_initmask | UE_NAS_USE_TUN_BIT; pdcp_module_init( pdcp_initmask ); //TTN for D2D -#if (LTE_RRC_VERSION >= MAKE_VERSION(14, 0, 0)) printf ("RRC control socket\n"); rrc_control_socket_init(); printf ("PDCP PC5S socket\n"); pdcp_pc5_socket_init(); -#endif + // to make a graceful exit when ctrl-c is pressed signal(SIGSEGV, signal_handler); signal(SIGINT, signal_handler);