diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index 2082de7f52771030b60a51c0ab3baa9eb0174bce..abefdca363c196671050d36029606f3c2bb46405 100644 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -1587,7 +1587,6 @@ static inline int wakeup_thread(pthread_mutex_t *mutex,pthread_cond_t *cond,int return(-1); } *instance_cnt = *instance_cnt + 1; - // the thread can now be woken up if (pthread_cond_signal(cond) != 0) { LOG_E( PHY, "ERROR pthread_cond_signal\n"); diff --git a/openair2/LAYER2/MAC/proto.h b/openair2/LAYER2/MAC/proto.h index 1ca8dcda183d75ee77f9fe3c7069510326248470..6745b925da06b8b65a5fa1e41684b61bd6c1dfdd 100644 --- a/openair2/LAYER2/MAC/proto.h +++ b/openair2/LAYER2/MAC/proto.h @@ -447,6 +447,14 @@ void ue_decode_p(module_id_t module_idP, int CC_id,frame_t frame, uint8_t CH_ind void ue_send_sdu(module_id_t module_idP, uint8_t CC_id,frame_t frame, sub_frame_t subframe, uint8_t *sdu,uint16_t sdu_len,uint8_t CH_index); +void ue_send_sl_sdu(module_id_t module_idP, + uint8_t CC_id, + frame_t frameP, + sub_frame_t subframeP, + uint8_t* sdu, + uint16_t sdu_len, + uint8_t eNB_index + ); #if defined(Rel10) || defined(Rel14) /* \brief Called by PHY to transfer MCH transport block to ue MAC. diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c index f0fef4cf9dc413f99eb235e0e27ca65862523abd..7f10b32366850d1d0141b3d2167727b34650b811 100644 --- a/openair2/LAYER2/MAC/ue_procedures.c +++ b/openair2/LAYER2/MAC/ue_procedures.c @@ -741,6 +741,31 @@ void ue_send_mch_sdu(module_id_t module_idP, uint8_t CC_id, frame_t frameP, uint #endif } + +void ue_send_sl_sdu(module_id_t module_idP, + uint8_t CC_id, + frame_t frameP, + sub_frame_t subframeP, + uint8_t* sdu, + uint16_t sdu_len, + uint8_t eNB_index + ) { + + mac_rlc_data_ind( + module_idP, + 0x1234, + eNB_index, + frameP, + ENB_FLAG_NO, + MBMS_FLAG_NO, + 3, + (char *)sdu, + sdu_len, + 1, + NULL); +} + + int8_t ue_get_mbsfn_sf_alloction (module_id_t module_idP, uint8_t mbsfn_sync_area, unsigned char eNB_index) { // currently there is one-to-one mapping between sf allocation pattern and sync area diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index b7e80add5de2595c884265090e62a9bd9ee11a9a..2ed153a873769dddb4cec453e2f9ca62b1ca0bd9 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -760,7 +760,8 @@ void ue_stub_rx_handler(unsigned int num_bytes, char *rx_buffer) { PHY_VARS_UE *UE; UE = PHY_vars_UE_g[0][0]; - LOG_I(PHY,"Received %d bytes on UE-UE link, packet type %d\n",num_bytes,((UE_tport_header_t*)rx_buffer)->packet_type); + UE_tport_t *pdu = (UE_tport_t*)rx_buffer; + SLSCH_t *slsch = (SLSCH_t*)&pdu->slsch; switch (((UE_tport_header_t*)rx_buffer)->packet_type) { case TTI_SYNC: @@ -768,6 +769,23 @@ void ue_stub_rx_handler(unsigned int num_bytes, char *rx_buffer) { wakeup_thread(&UE->timer_mutex,&UE->timer_cond,&UE->instance_cnt_timer,"timer_thread"); break; case SLSCH: + + + LOG_I(PHY,"Emulator SFN.SF %d.%d, Got SLSCH packet\n",emulator_absSF/10,emulator_absSF%10); + LOG_I(PHY,"Received %d bytes on UE-UE link for SFN.SF %d.%d, sending SLSCH payload (%d bytes) to MAC\n",num_bytes, + pdu->header.absSF/10,pdu->header.absSF%10, + slsch->payload_length); + printf("SLSCH:"); + for (int i=0;i<sizeof(SLSCH_t);i++) printf("%x ",((uint8_t*)slsch)[i]); + printf("\n"); + + ue_send_sl_sdu(0, + 0, + pdu->header.absSF/10, + pdu->header.absSF%10, + pdu->payload, + slsch->payload_length, + 0); break; } } @@ -1498,6 +1516,7 @@ static void* timer_thread( void* param ) { timer_subframe = absSFm1%10; pthread_mutex_lock(&UE->timer_mutex); UE->instance_cnt_timer = -1; + pthread_mutex_unlock(&UE->timer_mutex); LOG_I(PHY,"Running with external timer\n"); } else LOG_I(PHY,"Running with internal timer\n"); @@ -1514,7 +1533,7 @@ static void* timer_thread( void* param ) { timer_subframe++; } //printf("[timer_thread] Frame: %d, Subframe: %d \n", timer_frame, timer_subframe); - LOG_D(MAC," Panos-D [timer_thread] Frame: %d, Subframe: %d \n", timer_frame, timer_subframe); + //LOG_I(MAC," Panos-D [timer_thread] Frame: %d, Subframe: %d \n", timer_frame, timer_subframe); //AssertFatal( 0 == pthread_cond_signal(&phy_stub_ticking->cond_ticking), ""); AssertFatal(pthread_mutex_lock(&phy_stub_ticking->mutex_ticking) ==0,""); phy_stub_ticking->ticking_var++; @@ -1544,7 +1563,7 @@ static void* timer_thread( void* param ) { sizeof(UE_tport_header_t)); } - else { + else { wait_on_condition(&UE->timer_mutex,&UE->timer_cond,&UE->instance_cnt_timer,"timer_thread"); release_thread(&UE->timer_mutex,&UE->instance_cnt_timer,"timer_thread"); } @@ -1587,7 +1606,11 @@ static void* timer_thread( void* param ) { } int init_timer_thread(void) { + PHY_VARS_UE *UE=PHY_vars_UE_g[0]; phy_stub_ticking = (SF_ticking*)malloc(sizeof(SF_ticking)); + pthread_mutex_init(&UE->timer_mutex,NULL); + pthread_mutex_init(&UE->timer_cond,NULL); + UE->instance_cnt_timer = -1; pthread_mutex_init(&phy_stub_ticking->mutex_ticking,NULL); pthread_cond_init(&phy_stub_ticking->cond_ticking,NULL); pthread_create(&phy_stub_ticking->pthread_timer, NULL, &timer_thread, NULL);