diff --git a/openair2/LAYER2/MAC/config.c b/openair2/LAYER2/MAC/config.c index 8e266b920f14ba6bab3652f530c959d851481c9a..69fb7731e35574ce1ec2e2a50770cad20a08f5e4 100644 --- a/openair2/LAYER2/MAC/config.c +++ b/openair2/LAYER2/MAC/config.c @@ -1384,58 +1384,92 @@ rrc_mac_config_req_ue( UE_mac_inst[Mod_idP].sourceL2Id = *sourceL2Id; LOG_I(MAC,"[UE %d] Configure source L2Id 0x%08x \n", Mod_idP, *sourceL2Id ); } - if (destinationL2Id) { - j = 0; - k = 0; - LOG_I(MAC,"[UE %d] Configure destination L2Id 0x%08x\n", Mod_idP, *destinationL2Id ); - for (k=0; k< MAX_NUM_DEST; k++) { - if ((UE_mac_inst[Mod_idP].destinationList[k] == 0) && (j == 0)) j = k+1; - if (UE_mac_inst[Mod_idP].destinationList[k] == *destinationL2Id) break; //destination already exists! - } - if ((k == MAX_NUM_DEST) && (j > 0)) { - UE_mac_inst[Mod_idP].destinationList[j-1] = *destinationL2Id; - // UE_mac_inst[Mod_idP].numCommFlows++; - } - for (k=0; k< MAX_NUM_DEST; k++) { - LOG_I(MAC,"[UE %d] destination %d L2Id 0x%08x\n", Mod_idP,k,UE_mac_inst[Mod_idP].destinationList[k] ); - } - } - if (groupL2Id) { - j = 0; - k = 0; - LOG_I(MAC,"[UE %d] Configure group L2Id 0x%08x\n", Mod_idP, *groupL2Id ); - for (k=0; k< MAX_NUM_DEST; k++) { - if ((UE_mac_inst[Mod_idP].groupList[k] == 0) && (j == 0)) j = k+1; - if (UE_mac_inst[Mod_idP].groupList[k] == *groupL2Id) break; //group already exists! - } - if ((k == MAX_NUM_DEST) && (j > 0)) { - UE_mac_inst[Mod_idP].groupList[j-1] = *groupL2Id; - // UE_mac_inst[Mod_idP].numCommFlows++; - } - for (k=0; k< MAX_NUM_DEST; k++) { - LOG_I(MAC,"[UE %d] group %d L2Id 0x%08x\n", Mod_idP,k,UE_mac_inst[Mod_idP].groupList[k] ); - } - } - //store list of LCIDs for SL - if (logicalChannelIdentity >0 ){ - j = 0; - k = 0; - for (k=0; k< MAX_NUM_LCID; k++) { - if ((UE_mac_inst[Mod_idP].SL_LCID[k] == 0) && (j == 0)) j = k+1; - if (UE_mac_inst[Mod_idP].SL_LCID[k] == logicalChannelIdentity) break; //LCID already exists! - } - if ((k == MAX_NUM_LCID) && (j > 0)) { - UE_mac_inst[Mod_idP].SL_LCID[j-1] = logicalChannelIdentity; - UE_mac_inst[Mod_idP].numCommFlows++; + + //store list of (S,D,G,LCID) for SL + if ((logicalChannelIdentity > 0) && (logicalChannelIdentity < MAX_NUM_LCID_DATA)) { + if (groupL2Id){ + LOG_I(MAC,"[UE %d] Configure group L2Id 0x%08x\n", Mod_idP, *groupL2Id ); + j = 0; + k = 0; + for (k=0; k< MAX_NUM_LCID_DATA; k++) { + if ((UE_mac_inst[Mod_idP].sl_info[k].LCID == 0) && (j == 0)) j = k+1; + if ((UE_mac_inst[Mod_idP].sl_info[k].LCID == logicalChannelIdentity) && (UE_mac_inst[Mod_idP].sl_info[k].groupL2Id == *groupL2Id)) break; //(LCID, G) already exists! + } + if ((k == MAX_NUM_LCID_DATA) && (j > 0)) { + UE_mac_inst[Mod_idP].sl_info[j-1].LCID = logicalChannelIdentity; + UE_mac_inst[Mod_idP].sl_info[j-1].groupL2Id = *groupL2Id; + UE_mac_inst[Mod_idP].numCommFlows++; + + } + for (k=0; k< MAX_NUM_LCID_DATA; k++) { + LOG_I(MAC,"[UE %d] logical channel %d channel id %d, groupL2Id %d\n", Mod_idP,k,UE_mac_inst[Mod_idP].sl_info[k].LCID, UE_mac_inst[Mod_idP].sl_info[k].groupL2Id ); + } } - for (k=0; k< MAX_NUM_LCID; k++) { - LOG_I(MAC,"[UE %d] logical channel %d channel id %d\n", Mod_idP,k,UE_mac_inst[Mod_idP].SL_LCID[k] ); + if (destinationL2Id){ + LOG_I(MAC,"[UE %d] Configure destination L2Id 0x%08x\n", Mod_idP, *destinationL2Id ); + j = 0; + k = 0; + for (k=0; k< MAX_NUM_LCID_DATA; k++) { + if ((UE_mac_inst[Mod_idP].sl_info[k].LCID == 0) && (j == 0)) j = k+1; + if ((UE_mac_inst[Mod_idP].sl_info[k].LCID == logicalChannelIdentity) && (UE_mac_inst[Mod_idP].sl_info[k].destinationL2Id == *destinationL2Id)) break; //(LCID, D) already exists! + } + if ((k == MAX_NUM_LCID_DATA) && (j > 0)) { + UE_mac_inst[Mod_idP].sl_info[j-1].LCID = logicalChannelIdentity; + UE_mac_inst[Mod_idP].sl_info[j-1].destinationL2Id = *destinationL2Id; + UE_mac_inst[Mod_idP].numCommFlows++; + + } + for (k=0; k< MAX_NUM_LCID_DATA; k++) { + LOG_I(MAC,"[UE %d] logical channel %d channel id %d, destinationL2Id %d\n", Mod_idP,k,UE_mac_inst[Mod_idP].sl_info[k].LCID, UE_mac_inst[Mod_idP].sl_info[k].destinationL2Id); + } } + } else if ((logicalChannelIdentity >= MAX_NUM_LCID_DATA) && (logicalChannelIdentity < MAX_NUM_LCID)) { + if (destinationL2Id){ + LOG_I(MAC,"[UE %d] Configure destination L2Id 0x%08x for PC5S\n", Mod_idP, *destinationL2Id ); + j = 0; + k = 0; + for (k=MAX_NUM_LCID_DATA; k< MAX_NUM_LCID; k++) { + if ((UE_mac_inst[Mod_idP].sl_info[k].LCID == 0) && (j == 0)) j = k+1; + if ((UE_mac_inst[Mod_idP].sl_info[k].LCID == logicalChannelIdentity) && (UE_mac_inst[Mod_idP].sl_info[k].destinationL2Id == *destinationL2Id)) break; //(LCID, D) already exists! + } + if ((k == MAX_NUM_LCID) && (j > 0)) { + UE_mac_inst[Mod_idP].sl_info[j-1].LCID = logicalChannelIdentity; + UE_mac_inst[Mod_idP].sl_info[j-1].destinationL2Id = *destinationL2Id; + UE_mac_inst[Mod_idP].numCommFlows++; + + } + for (k=MAX_NUM_LCID_DATA; k< MAX_NUM_LCID; k++) { + LOG_I(MAC,"[UE %d] logical channel %d channel id %d, destinationL2Id %d\n", Mod_idP,k,UE_mac_inst[Mod_idP].sl_info[k].LCID, UE_mac_inst[Mod_idP].sl_info[k].destinationL2Id); + } + } } + + break; case CONFIG_ACTION_REMOVE: - //TODO + // OK for the moment since LCID is unique per flow + if ((logicalChannelIdentity > 0) && (logicalChannelIdentity < MAX_NUM_LCID_DATA)) { + LOG_I(MAC,"[UE %d] Remove (logicalChannelIdentity %d)\n", Mod_idP, logicalChannelIdentity ); + k = 0; + for (k = 0; k < MAX_NUM_LCID_DATA; k++) { + if (UE_mac_inst[Mod_idP].sl_info[k].LCID == logicalChannelIdentity) { + UE_mac_inst[Mod_idP].sl_info[k].LCID = 0; + UE_mac_inst[Mod_idP].sl_info[k].destinationL2Id = 0; + UE_mac_inst[Mod_idP].sl_info[k].groupL2Id = 0; + UE_mac_inst[Mod_idP].numCommFlows--; + break; + } + } + + for (k = 0; k < MAX_NUM_LCID_DATA; k++) { + LOG_I(MAC,"[UE %d] channel id %d, destinationL2Id %d, groupL2Id %d\n", Mod_idP, UE_mac_inst[Mod_idP].sl_info[k].LCID, UE_mac_inst[Mod_idP].sl_info[k].destinationL2Id, UE_mac_inst[Mod_idP].sl_info[k].groupL2Id); + } + } else if ((logicalChannelIdentity >= MAX_NUM_LCID_DATA) && (logicalChannelIdentity < MAX_NUM_LCID)) { + //Todo - remove RBID for PCS5 + } + break; + default: break; } diff --git a/openair2/LAYER2/MAC/defs.h b/openair2/LAYER2/MAC/defs.h index fab9715942499962f29a98102ff6dd73e4ea605b..bc7134d94b1dcfd7023d55f495fa781a4e8ad62a 100644 --- a/openair2/LAYER2/MAC/defs.h +++ b/openair2/LAYER2/MAC/defs.h @@ -127,6 +127,7 @@ #define LCGID3 3 /*!\brief Maximum number of logical chanels */ #define MAX_NUM_LCID 11 +#define MAX_NUM_LCID_DATA 8 /*!\brief Maximum number od control elemenets */ #define MAX_NUM_CE 5 /*!\brief Maximum number of random access process */ @@ -1294,6 +1295,16 @@ typedef struct { // Bucket size per lcid int16_t bucket_size[MAX_NUM_LCID]; } UE_SCHEDULING_INFO; + +typedef struct { + //SL groupL2Id + uint32_t groupL2Id; + //SL destinationL2Id + uint32_t destinationL2Id; + //LCID + uint32_t LCID; +} SL_INFO; + /*!\brief Top level UE MAC structure */ typedef struct { uint16_t Node_id; @@ -1342,12 +1353,9 @@ typedef struct { uint32_t groupL2Id; //SL destinationL2Id uint32_t destinationL2Id; - //List of destinations (unicast) - uint32_t destinationList[MAX_NUM_DEST]; - //List of group (multicast) - uint32_t groupList[MAX_NUM_DEST]; uint8_t numCommFlows; - uint32_t SL_LCID[MAX_NUM_LCID]; + //list of (SLID, G, D)s + SL_INFO sl_info[MAX_NUM_LCID]; #endif /// pointer to TDD Configuration (NULL for FDD) diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c index a957c9ba621175c92cd7faae9bb39f3a55f74501..2e200a1680161eb83008086a89f0e02baa835962 100644 --- a/openair2/LAYER2/MAC/ue_procedures.c +++ b/openair2/LAYER2/MAC/ue_procedures.c @@ -773,17 +773,17 @@ void ue_send_sl_sdu(module_id_t module_idP, LOG_D( MAC, "[DestinationL2Id: 0x%08x] \n", destinationL2Id ); //in case of 1-n communication, verify that UE belongs to that group int i = 0; - for (i=0; i< MAX_NUM_DEST; i++) - if (UE_mac_inst[module_idP].groupList[i] == destinationL2Id) break; + for (i=0; i< MAX_NUM_LCID; i++) + if (UE_mac_inst[module_idP].sl_info[i].groupL2Id == destinationL2Id) break; int j = 0; - for (j=0; j< MAX_NUM_DEST; j++) - if (UE_mac_inst[module_idP].destinationList[j] == sourceL2Id) break; + for (j=0; j< MAX_NUM_LCID; j++) + if (UE_mac_inst[module_idP].sl_info[j].destinationL2Id == sourceL2Id) break; //match the destinationL2Id with UE L2Id or groupL2ID - if (!(((destinationL2Id == UE_mac_inst[module_idP].sourceL2Id) && (j < MAX_NUM_DEST)) | ((destinationL2Id == UE_mac_inst[module_idP].sourceL2Id) && (longh->LCID == 10)) | (i < MAX_NUM_DEST))){ - LOG_D( MAC, "[Destination Id is neither matched with Source Id nor with Group Id, drop the packet!!! \n"); - return; - } + if (!(((destinationL2Id == UE_mac_inst[module_idP].sourceL2Id) && (j < MAX_NUM_LCID)) | ((destinationL2Id == UE_mac_inst[module_idP].sourceL2Id) && (longh->LCID >= MAX_NUM_LCID_DATA)) | (i < MAX_NUM_LCID))){ + LOG_D( MAC, "[Destination Id is neither matched with Source Id nor with Group Id, drop the packet!!! \n"); + return; + } if (longh->F==1) { @@ -2807,7 +2807,7 @@ SLSCH_t *ue_get_slsch(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_ LOG_D(MAC,"Checking SLSCH for absSF %d\n",absSF); if ((absSF%40) == 0) { // fill PSCCH data later in first subframe of SL period ue->sltx_active = 0; - +/* for (i = 0; i < MAX_NUM_LCID; i++){ if (ue->SL_LCID[i] > 0) { for (int j = 0; j < ue->numCommFlows; j++){ @@ -2843,6 +2843,42 @@ SLSCH_t *ue_get_slsch(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_ } if ( ue->sltx_active == 1) break; } + */ + for (i = 0; i < MAX_NUM_LCID; i++){ + if (ue->sl_info[i].LCID > 0) { + for (int j = 0; j < ue->numCommFlows; j++){ + if ((ue->sourceL2Id > 0) && (ue->sl_info[j].destinationL2Id >0) ){ + rlc_status = mac_rlc_status_ind(module_idP, 0x1234,0,frameP,subframeP,ENB_FLAG_NO,MBMS_FLAG_NO, + ue->sl_info[i].LCID, 0xFFFF, ue->sourceL2Id, ue->sl_info[j].destinationL2Id ); + if (rlc_status.bytes_in_buffer > 2){ + LOG_I(MAC,"SFN.SF %d.%d: Scheduling for %d bytes in Sidelink buffer\n",frameP,subframeP,rlc_status.bytes_in_buffer); + // Fill in group id for off-network communications + ue->sltx_active = 1; + //store LCID, destinationL2Id + ue->slsch_lcid = ue->sl_info[i].LCID; + ue->destinationL2Id = ue->sl_info[j].destinationL2Id; + break; + } + } + + if ((ue->sourceL2Id > 0) && (ue->sl_info[j].groupL2Id >0) ){ + rlc_status = mac_rlc_status_ind(module_idP, 0x1234,0,frameP,subframeP,ENB_FLAG_NO,MBMS_FLAG_NO, + ue->sl_info[i].LCID, 0xFFFF, ue->sourceL2Id, ue->sl_info[j].groupL2Id); + if (rlc_status.bytes_in_buffer > 2){ + LOG_I(MAC,"SFN.SF %d.%d: Scheduling for %d bytes in Sidelink buffer\n",frameP,subframeP,rlc_status.bytes_in_buffer); + // Fill in group id for off-network communications + ue->sltx_active = 1; + //store LCID, destinationL2Id + ue->slsch_lcid = ue->sl_info[i].LCID; + ue->destinationL2Id = ue->sl_info[j].groupL2Id; + break; + } + } + + } + } + if ( ue->sltx_active == 1) break; + } } // we're not in the SCCH period else if (((absSF & 3) == 0 ) && (ue->sltx_active == 1)) { // every 4th subframe, check for new data from RLC diff --git a/openair2/RRC/LITE/defs.h b/openair2/RRC/LITE/defs.h index a08984d1c2b28812ae3654a481a70dabeeb6b0fb..93728d22120c1289c8358d79342d6c0ca0cc8df2 100644 --- a/openair2/RRC/LITE/defs.h +++ b/openair2/RRC/LITE/defs.h @@ -84,13 +84,13 @@ #define DIRECT_COMMUNICATION_ESTABLISH_RSP 6 #define GROUP_COMMUNICATION_RELEASE_REQ 7 #define GROUP_COMMUNICATION_RELEASE_RSP 8 -#define PC5S_ESTABLISH_REQ 9 -#define PC5S_ESTABLISH_RSP 10 -#define PC5_DISCOVERY_MESSAGE 11 - - -#define PC5_DISCOVERY_PAYLOAD_SIZE 29 +#define DIRECT_COMMUNICATION_RELEASE_REQ 9 +#define DIRECT_COMMUNICATION_RELEASE_RSP 10 +#define PC5S_ESTABLISH_REQ 11 +#define PC5S_ESTABLISH_RSP 12 +#define PC5_DISCOVERY_MESSAGE 13 +#define PC5_DISCOVERY_PAYLOAD_SIZE 29 typedef enum { UE_STATE_OFF_NETWORK, @@ -140,6 +140,10 @@ typedef struct { uint32_t measuredPower; } __attribute__((__packed__)) PC5DiscoveryMessage ; +typedef enum { + DIRECT_COMMUNICATION_RELEASE_OK = 0, + DIRECT_COMMUNICATION_RELEASE_FAILURE +} Direct_Communication_Status_t; struct sidelink_ctrl_element { unsigned short type; @@ -147,7 +151,7 @@ struct sidelink_ctrl_element { struct GroupCommunicationEstablishReq group_comm_establish_req; struct DirectCommunicationEstablishReq direct_comm_establish_req; Group_Communication_Status_t group_comm_release_rsp; - //struct DirectCommunicationReleaseReq direct_comm_release_req; + Direct_Communication_Status_t direct_comm_release_rsp; SL_UE_STATE_t ue_state; int slrb_id; struct PC5SEstablishReq pc5s_establish_req; @@ -741,10 +745,7 @@ typedef struct UE_RRC_INST_s { uint32_t groupL2Id; //current destination uint32_t destinationL2Id; - //List of destinations (unicast) - uint32_t destinationList[MAX_NUM_DEST]; - //List of groups (multicast) - uint32_t groupList[MAX_NUM_DEST]; + SL_INFO sl_info[MAX_NUM_LCID]; //sl_discovery.. SRB_INFO SL_Discovery[NB_CNX_UE]; #endif diff --git a/openair2/RRC/LITE/rrc_UE.c b/openair2/RRC/LITE/rrc_UE.c index 8e9f30d24fea5b947927b183df8cc4390a958fde..adf07c0fd55a8262374eb49f9e0254376d281952 100644 --- a/openair2/RRC/LITE/rrc_UE.c +++ b/openair2/RRC/LITE/rrc_UE.c @@ -5478,6 +5478,7 @@ void *rrc_control_socket_thread_fct(void *arg) long *logicalchannelgroup_drb = NULL; int j = 0; int i = 0; + int slrb_id =0; //from the main program, listen for the incoming messages from control socket (ProSe App) prose_addr_len = sizeof(prose_app_addr); @@ -5543,7 +5544,7 @@ void *rrc_control_socket_thread_fct(void *arg) case GROUP_COMMUNICATION_ESTABLISH_REQ: sourceL2Id = sl_ctrl_msg_recv->sidelinkPrimitive.group_comm_establish_req.sourceL2Id; groupL2Id = sl_ctrl_msg_recv->sidelinkPrimitive.group_comm_establish_req.groupL2Id; - int group_comm_rbid = 4; + int group_comm_rbid = 0; #ifdef DEBUG_CTRL_SOCKET LOG_I(RRC,"[GroupCommunicationEstablishReq] Received on socket from ProSe App (msg type: %d)\n",sl_ctrl_msg_recv->type); @@ -5557,11 +5558,24 @@ void *rrc_control_socket_thread_fct(void *arg) UE_rrc_inst[module_id].groupL2Id = groupL2Id; j = 0; i = 0; - for (i=0; i< MAX_NUM_DEST; i++) { - if ((UE_rrc_inst[module_id].groupList[i] == 0) && (j == 0)) j = i+1; - if (UE_rrc_inst[module_id].groupList[i] == groupL2Id) break; //group already exists! + + //get available rbid for this communication and store (LCID, G) + if (groupL2Id > 0){ + for (i=0; i< MAX_NUM_LCID_DATA; i++) { + if ((UE_rrc_inst[module_id].sl_info[i].LCID == 0) && (j == 0)) j = i+1; + if (UE_rrc_inst[module_id].sl_info[i].groupL2Id == groupL2Id) { + group_comm_rbid = UE_rrc_inst[module_id].sl_info[i].LCID; + LOG_I(RRC,"[GroupCommunicationEstablishReq] rbid %d for group Id: 0x%08x\n already exists",group_comm_rbid, UE_rrc_inst[module_id].sl_info[i].groupL2Id ); + break; //(LCID, G) already exists! + } + } + if ((i == MAX_NUM_LCID_DATA) && (j > 0)) { + UE_rrc_inst[module_id].sl_info[j-1].LCID = (j-1)+3; + group_comm_rbid = UE_rrc_inst[module_id].sl_info[j-1].LCID; + UE_rrc_inst[module_id].sl_info[j-1].groupL2Id = groupL2Id; + LOG_I(RRC,"[GroupCommunicationEstablishReq] establish rbid %d for group Id: 0x%08x\n",group_comm_rbid, UE_rrc_inst[module_id].sl_info[j-1].groupL2Id ); + } } - if ((i == MAX_NUM_DEST) && (j > 0)) UE_rrc_inst[module_id].groupList[j-1] = groupL2Id; // configure lower layers PDCP/MAC/PHY for this communication //Establish a new RBID/LCID for this communication @@ -5725,10 +5739,24 @@ void *rrc_control_socket_thread_fct(void *arg) LOG_I(RRC,"[GroupCommunicationReleaseRequest] Received on socket from ProSe App (msg type: %d)\n",sl_ctrl_msg_recv->type); LOG_I(RRC,"[GroupCommunicationReleaseRequest] Slrb Id: %i\n",sl_ctrl_msg_recv->sidelinkPrimitive.slrb_id); #endif + slrb_id = sl_ctrl_msg_recv->sidelinkPrimitive.slrb_id; //reset groupL2ID from MAC LAYER UE_rrc_inst[module_id].groupL2Id = 0x00000000; sourceL2Id = UE_rrc_inst[module_id].sourceL2Id; + + //find the corresponding record and reset the values + if (slrb_id > 0){ + for (i=0; i< MAX_NUM_LCID_DATA; i++) { + if (UE_rrc_inst[module_id].sl_info[i].LCID == slrb_id) { + UE_rrc_inst[module_id].sl_info[i].LCID = 0; + LOG_I(RRC,"[GroupCommunicationReleaseRequest] rbid %d for group Id: 0x%08x\n has been removed",slrb_id, UE_rrc_inst[module_id].sl_info[i].groupL2Id ); + UE_rrc_inst[module_id].sl_info[i].groupL2Id = 0x00; + break; + } + } + } + rrc_mac_config_req_ue(module_id,0,0, //eNB_index =0 (RadioResourceConfigCommonSIB_t *)NULL, (struct PhysicalConfigDedicated *)NULL, @@ -5738,7 +5766,7 @@ void *rrc_control_socket_thread_fct(void *arg) #endif (MeasObjectToAddMod_t **)NULL, (MAC_MainConfig_t *)NULL, - 0, + slrb_id, (struct LogicalChannelConfig *)NULL, (MeasGapConfig_t *)NULL, (TDD_Config_t *)NULL, @@ -5763,7 +5791,7 @@ void *rrc_control_socket_thread_fct(void *arg) #if defined(Rel10) || defined(Rel14) ,CONFIG_ACTION_REMOVE, &sourceL2Id, - &destinationL2Id, + NULL, NULL #endif ); @@ -5774,15 +5802,8 @@ void *rrc_control_socket_thread_fct(void *arg) sl_ctrl_msg_send = calloc(1, sizeof(struct sidelink_ctrl_element)); sl_ctrl_msg_send->type = GROUP_COMMUNICATION_RELEASE_RSP; - //if the requested id exists -> release this ID - if (sl_ctrl_msg_recv->sidelinkPrimitive.slrb_id == slrb_id) { - sl_ctrl_msg_send->sidelinkPrimitive.group_comm_release_rsp = GROUP_COMMUNICATION_RELEASE_OK; - // pthread_mutex_lock(&slrb_mutex); - slrb_id = 0; //Reset slrb_id - //pthread_mutex_unlock(&slrb_mutex); - } else { - sl_ctrl_msg_send->sidelinkPrimitive.group_comm_release_rsp = GROUP_COMMUNICATION_RELEASE_FAILURE; - } + sl_ctrl_msg_send->sidelinkPrimitive.group_comm_release_rsp = GROUP_COMMUNICATION_RELEASE_OK; + memcpy((void *)send_buf, (void *)sl_ctrl_msg_send, sizeof(struct sidelink_ctrl_element)); free(sl_ctrl_msg_send); @@ -5798,7 +5819,7 @@ void *rrc_control_socket_thread_fct(void *arg) case DIRECT_COMMUNICATION_ESTABLISH_REQ: sourceL2Id = sl_ctrl_msg_recv->sidelinkPrimitive.direct_comm_establish_req.sourceL2Id; destinationL2Id = sl_ctrl_msg_recv->sidelinkPrimitive.direct_comm_establish_req.destinationL2Id; - int direct_comm_rbid = 3; + int direct_comm_rbid = 0; #ifdef DEBUG_CTRL_SOCKET LOG_I(RRC,"[DirectCommunicationEstablishReq] Received on socket from ProSe App (msg type: %d)\n",sl_ctrl_msg_recv->type); @@ -5810,11 +5831,25 @@ void *rrc_control_socket_thread_fct(void *arg) UE_rrc_inst[module_id].sourceL2Id = sourceL2Id; i = 0; j = 0; - for (i=0; i< MAX_NUM_DEST; i++) { - if ((UE_rrc_inst[module_id].destinationList[i] == 0) && (j == 0)) j = i+1; - if (UE_rrc_inst[module_id].destinationList[i] == destinationL2Id) break; //destination already exists! + + //get available rbid for this communication and store (LCID, D) + if (destinationL2Id >0){ + for (i=0; i< MAX_NUM_LCID_DATA; i++) { + if ((UE_rrc_inst[module_id].sl_info[i].LCID == 0) && (j == 0)) j = i+1; + if (UE_rrc_inst[module_id].sl_info[i].destinationL2Id == destinationL2Id) { + direct_comm_rbid = UE_rrc_inst[module_id].sl_info[i].LCID; + LOG_I(RRC,"[DirectCommunicationEstablishReq] rbid %d for destination Id: 0x%08x already exists!\n",direct_comm_rbid, UE_rrc_inst[module_id].sl_info[i].destinationL2Id ); + break; //(LCID, D) already exists! + } + } + if ((i == MAX_NUM_LCID_DATA) && (j > 0)) { + UE_rrc_inst[module_id].sl_info[j-1].LCID = (j-1)+3; + direct_comm_rbid = UE_rrc_inst[module_id].sl_info[j-1].LCID; + UE_rrc_inst[module_id].sl_info[j-1].destinationL2Id = destinationL2Id; + LOG_I(RRC,"[DirectCommunicationEstablishReq] establish rbid %d for destination Id: 0x%08x\n",direct_comm_rbid, UE_rrc_inst[module_id].sl_info[j-1].destinationL2Id ); + } } - if ((i == MAX_NUM_DEST) && (j > 0)) UE_rrc_inst[module_id].destinationList[j-1] = destinationL2Id; + // configure lower layers PDCP/MAC/PHY for this communication //Establish a new RBID/LCID for this communication @@ -5972,10 +6007,92 @@ void *rrc_control_socket_thread_fct(void *arg) #endif break; + case DIRECT_COMMUNICATION_RELEASE_REQ: + printf("-----------------------------------\n"); + #ifdef DEBUG_CTRL_SOCKET + LOG_I(RRC,"[DirectCommunicationReleaseRequest] Received on socket from ProSe App (msg type: %d)\n",sl_ctrl_msg_recv->type); + LOG_I(RRC,"[DirectCommunicationReleaseRequest] Slrb Id: %i\n",sl_ctrl_msg_recv->sidelinkPrimitive.slrb_id); + #endif + slrb_id = sl_ctrl_msg_recv->sidelinkPrimitive.slrb_id; + //reset groupL2ID from MAC LAYER + UE_rrc_inst[module_id].destinationL2Id = 0x00000000; + sourceL2Id = UE_rrc_inst[module_id].sourceL2Id; + + //find the corresponding record and reset the values + if (slrb_id > 0){ + for (i=0; i< MAX_NUM_LCID_DATA; i++) { + if (UE_rrc_inst[module_id].sl_info[i].LCID == slrb_id) { + UE_rrc_inst[module_id].sl_info[i].LCID = 0; + LOG_I(RRC,"[GroupCommunicationReleaseRequest] rbid %d for destination Id: 0x%08x\n has been removed",slrb_id, UE_rrc_inst[module_id].sl_info[i].destinationL2Id ); + UE_rrc_inst[module_id].sl_info[i].destinationL2Id = 0x00; + break; + } + } + } + + rrc_mac_config_req_ue(module_id,0,0, //eNB_index =0 + (RadioResourceConfigCommonSIB_t *)NULL, + (struct PhysicalConfigDedicated *)NULL, + #if defined(Rel10) || defined(Rel14) + (SCellToAddMod_r10_t *)NULL, + //struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10, + #endif + (MeasObjectToAddMod_t **)NULL, + (MAC_MainConfig_t *)NULL, + slrb_id, + (struct LogicalChannelConfig *)NULL, + (MeasGapConfig_t *)NULL, + (TDD_Config_t *)NULL, + (MobilityControlInfo_t *)NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + #if defined(Rel10) || defined(Rel14) + ,0, + (MBSFN_AreaInfoList_r9_t *)NULL, + (PMCH_InfoList_r9_t *)NULL + + #endif + #ifdef CBA + , + 0, + 0 + #endif + #if defined(Rel10) || defined(Rel14) + ,CONFIG_ACTION_REMOVE, + &sourceL2Id, + NULL, + NULL + #endif + ); + + + LOG_I(RRC,"Send DirectCommunicationReleaseResponse to ProSe App \n"); + memset(send_buf, 0, BUFSIZE); + + sl_ctrl_msg_send = calloc(1, sizeof(struct sidelink_ctrl_element)); + sl_ctrl_msg_send->type = DIRECT_COMMUNICATION_RELEASE_RSP; + sl_ctrl_msg_send->sidelinkPrimitive.direct_comm_release_rsp = DIRECT_COMMUNICATION_RELEASE_OK; + + 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"); + exit(EXIT_FAILURE); + } + break; + + case PC5S_ESTABLISH_REQ: type = sl_ctrl_msg_recv->sidelinkPrimitive.pc5s_establish_req.type; sourceL2Id = sl_ctrl_msg_recv->sidelinkPrimitive.pc5s_establish_req.sourceL2Id; - int pc5s_rbid = 10; + int pc5s_rbid = 0; #ifdef DEBUG_CTRL_SOCKET LOG_I(RRC,"[PC5EstablishReq] Received on socket from ProSe App (msg type: %d)\n",sl_ctrl_msg_recv->type); LOG_I(RRC,"[PC5EstablishReq] type: %d\n",sl_ctrl_msg_recv->sidelinkPrimitive.pc5s_establish_req.type); //RX/TX @@ -5993,18 +6110,32 @@ void *rrc_control_socket_thread_fct(void *arg) UE_rrc_inst[module_id].sourceL2Id = sourceL2Id; j = 0; i = 0; - for (i=0; i< MAX_NUM_DEST; i++) { - if ((UE_rrc_inst[module_id].destinationList[i] == 0) && (j == 0)) j = i+1; - if (UE_rrc_inst[module_id].destinationList[i] == destinationL2Id) break; //destination already exists! + if (destinationL2Id > 0){ + for (i = MAX_NUM_LCID_DATA; i < MAX_NUM_LCID; i++) { + if ((UE_rrc_inst[module_id].sl_info[i].LCID == 0) && (j == 0)) j = i+1; + if (UE_rrc_inst[module_id].sl_info[i].destinationL2Id == destinationL2Id) { + pc5s_rbid = UE_rrc_inst[module_id].sl_info[i].LCID; + LOG_I(RRC,"[PC5EstablishReq] rbid %d for destination Id: 0x%08x\n ",pc5s_rbid, UE_rrc_inst[module_id].sl_info[i].destinationL2Id ); + break; //(LCID, D) already exists! + } + } + if ((i == MAX_NUM_LCID) && (j > 0)) { + UE_rrc_inst[module_id].sl_info[j-1].LCID = (j-1); + pc5s_rbid = UE_rrc_inst[module_id].sl_info[j-1].LCID; + UE_rrc_inst[module_id].sl_info[j-1].destinationL2Id = destinationL2Id; + LOG_I(RRC,"[PC5EstablishReq] establish rbid %d for destinationL2Id Id: 0x%08x\n",pc5s_rbid, UE_rrc_inst[module_id].sl_info[j-1].destinationL2Id ); + } } - if ((i == MAX_NUM_DEST) && (j > 0)) UE_rrc_inst[module_id].destinationList[j-1] = destinationL2Id; + + + } else {//RX UE_rrc_inst[module_id].sourceL2Id = sourceL2Id; } // configure lower layers PDCP/MAC/PHY for this communication //Establish a new RBID/LCID for this communication - // Establish a SLRB (using DRB 10 for now) + // Establish a SLRB (starting from 8 for now) UE = &UE_rrc_inst[module_id]; PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, 0, ENB_FLAG_NO, 0x1234, 0, 0,0);