From d4102b55a917db80e9c3a59001bd5a67a20e1313 Mon Sep 17 00:00:00 2001 From: William Johnson <wjohnson@vencorelabs.com> Date: Mon, 22 Jan 2018 15:20:55 -0500 Subject: [PATCH] Resolved issues with PC5-D implementation. --- openair2/LAYER2/MAC/ue_procedures.c | 8 ++++++- openair2/RRC/LITE/defs.h | 10 +++++--- openair2/RRC/LITE/rrc_UE.c | 36 +++++++++++++++++------------ 3 files changed, 35 insertions(+), 19 deletions(-) diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c index bf629e55ee..3fc7616243 100644 --- a/openair2/LAYER2/MAC/ue_procedures.c +++ b/openair2/LAYER2/MAC/ue_procedures.c @@ -797,18 +797,24 @@ void ue_send_sl_sdu(module_id_t module_idP, NULL); } else { //SL_DISCOVERY +<<<<<<< 7fb0902dbc37c2a91252b7b956d2c0158d3b2ff5 //call mac_rrc_data_ind uint16_t len = sdu_len; printf("SL DISCOVERY: "); for (int i=0;i<len;i++) printf("%x ",((uint8_t*)sdu)[i]); printf("\n"); +======= + LOG_I( MAC, "SL DISCOVERY \n"); + //call mac_rrc_data_ind + //uint16_t len; +>>>>>>> Resolved issues with PC5-D implementation. mac_rrc_data_ind(module_idP, CC_id, frameP,subframeP, UE_mac_inst[module_idP].crnti, SL_DISCOVERY, sdu, //(uint8_t*)&UE_mac_inst[Mod_id].SL_Discovery[0].Rx_buffer.Payload[0], - len, + sdu_len, ENB_FLAG_NO, eNB_index, 0); diff --git a/openair2/RRC/LITE/defs.h b/openair2/RRC/LITE/defs.h index afa7ef9a83..7aac2e8938 100644 --- a/openair2/RRC/LITE/defs.h +++ b/openair2/RRC/LITE/defs.h @@ -87,7 +87,10 @@ #define GROUP_COMMUNICATION_RELEASE_RSP 8 #define PC5S_ESTABLISH_REQ 9 #define PC5S_ESTABLISH_RSP 10 -#define PC5_DISCOVERY_MESSAGE 11 +#define PC5_DISCOVERY_MESSAGE 11 + + +#define PC5_DISCOVERY_PAYLOAD_SIZE 29 typedef enum { @@ -132,9 +135,10 @@ struct PC5SEstablishRsp{ uint8_t status; }; -//example of PC5_DSICOVERY MESSAGE (for testing only) +//PC5_DISCOVERY MESSAGE typedef struct { - unsigned char bytes[29]; + unsigned char payload[PC5_DISCOVERY_PAYLOAD_SIZE]; + uint32_t measuredPower; } __attribute__((__packed__)) PC5DiscoveryMessage ; diff --git a/openair2/RRC/LITE/rrc_UE.c b/openair2/RRC/LITE/rrc_UE.c index dee7159d9c..a9c9ab1027 100644 --- a/openair2/RRC/LITE/rrc_UE.c +++ b/openair2/RRC/LITE/rrc_UE.c @@ -5806,15 +5806,13 @@ void *rrc_control_socket_thread_fct(void *arg) #ifdef DEBUG_CTRL_SOCKET LOG_I(RRC,"[PC5DiscoveryMessage] Received on socket from ProSe App (msg type: %d)\n",sl_ctrl_msg_recv->type); - // LOG_I(RRC,"[PC5DiscoveryMessage] type: %d\n",sl_ctrl_msg_recv->sidelinkPrimitive.pc5_discovery_message.msg_type); - // LOG_D(RRC,"[PC5DiscoveryMessage] discoveryGroupId: 0x%08x\n",sl_ctrl_msg_recv->sidelinkPrimitive.pc5_discovery_message.discoveryGroupId); - // LOG_D(RRC,"[PC5DiscoveryMessage] proSeUEId: 0x%08x\n",sl_ctrl_msg_recv->sidelinkPrimitive.pc5_discovery_message.proSeUEId); #endif //prepare SL_Discovery buffer if (UE_rrc_inst) { - memcpy((void*)&UE_rrc_inst[module_id].SL_Discovery[0].Tx_buffer.Payload[0], (void*)receive_buf, n); - UE_rrc_inst[module_id].SL_Discovery[0].Tx_buffer.payload_size = n; - LOG_I(RRC,"[PC5DiscoveryMessage] Copied %d bytes\n",n); + memcpy((void*)&UE_rrc_inst[module_id].SL_Discovery[0].Tx_buffer.Payload[0], (void*)&sl_ctrl_msg_recv->sidelinkPrimitive.pc5_discovery_message.payload[0], PC5_DISCOVERY_PAYLOAD_SIZE); + //memcpy((void*)&UE_rrc_inst[module_id].SL_Discovery[0].Tx_buffer.Payload[0], (void*)receive_buf, n); + UE_rrc_inst[module_id].SL_Discovery[0].Tx_buffer.payload_size = PC5_DISCOVERY_PAYLOAD_SIZE; + LOG_I(RRC,"[PC5DiscoveryMessage] Copied %d bytes\n",PC5_DISCOVERY_PAYLOAD_SIZE); } break; default: @@ -5837,9 +5835,8 @@ int decode_SL_Discovery_Message( int prose_addr_len; char send_buf[BUFSIZE]; int n; - struct sidelink_ctrl_element *sl_ctrl_msg_recv = NULL; + struct sidelink_ctrl_element *sl_ctrl_msg_send = NULL; - LOG_I(RRC,"[decode_SL_Discovery_Message] received %d bytes (sizeof(struct sidelink_ctrl_element) %d)\n",Sdu_len, sizeof(struct sidelink_ctrl_element)); //from the main program, listen for the incoming messages from control socket (ProSe App) prose_addr_len = sizeof(prose_app_addr); @@ -5847,21 +5844,30 @@ int decode_SL_Discovery_Message( memcpy((void*)&UE_rrc_inst[ctxt_pP->module_id].SL_Discovery[0].Rx_buffer.Payload[0], (void*)Sdu, Sdu_len); UE_rrc_inst[ctxt_pP->module_id].SL_Discovery[0].Rx_buffer.payload_size = Sdu_len; - sl_ctrl_msg_recv = calloc(1, sizeof(struct sidelink_ctrl_element)); - memcpy((void *)sl_ctrl_msg_recv, (void *)Sdu, sizeof(struct sidelink_ctrl_element)); - LOG_I(RRC,"[decode_SL_Discovery_Message] Message type %d\n", sl_ctrl_msg_recv->type); - memset(send_buf, 0, BUFSIZE); //send to ProSeApp memcpy((void *)send_buf, (void*)Sdu, Sdu_len); prose_addr_len = sizeof(prose_app_addr); - n = sendto(ctrl_sock_fd, (char *)send_buf, Sdu_len, 0, (struct sockaddr *)&prose_app_addr, prose_addr_len); + sl_ctrl_msg_send = calloc(1, sizeof(struct sidelink_ctrl_element)); + sl_ctrl_msg_send->type = PC5_DISCOVERY_MESSAGE; + int num_bytes = 29; + // TODO: Add a check for the SDU size. + memcpy((void*)&sl_ctrl_msg_send->sidelinkPrimitive.pc5_discovery_message.payload[0], (void*) Sdu, num_bytes); + + memcpy((void *)send_buf, (void *)sl_ctrl_msg_send, sizeof(struct sidelink_ctrl_element)); + free(sl_ctrl_msg_send); + + prose_addr_len = sizeof(prose_app_addr); + + n = sendto(ctrl_sock_fd, (char *)send_buf, sizeof(struct sidelink_ctrl_element), 0, (struct sockaddr *)&prose_app_addr, prose_addr_len); if (n < 0){ - LOG_E(RRC, "ERROR: Failed to send to ProSe App\n"); + // TODO: We should not just exit if the Prose App has not yet attached. It creates a race condition. + LOG_I(RRC, "ERROR: Failed to send to ProSe App\n"); //exit(EXIT_FAILURE); } - free(sl_ctrl_msg_recv); + + return(0); } -- 2.26.2