From 7781cd5875013ec1b049a15dd503ed4883846ed5 Mon Sep 17 00:00:00 2001 From: Tien-Thinh Nguyen <tien-thinh.nguyen@eurecom.fr> Date: Fri, 5 Jan 2018 00:08:49 +0100 Subject: [PATCH] Configure MAC with Source/groupL2Id, add possiblility to filter at MAC layer --- d2d_emulator_setup.txt | 2 - openair2/LAYER2/MAC/config.c | 13 +++++ openair2/LAYER2/MAC/defs.h | 7 +++ openair2/LAYER2/MAC/proto.h | 5 ++ openair2/LAYER2/MAC/ue_procedures.c | 39 ++++++++++++- openair2/RRC/LITE/rrc_UE.c | 91 +++++++++++++++++++++++++++++ 6 files changed, 152 insertions(+), 5 deletions(-) diff --git a/d2d_emulator_setup.txt b/d2d_emulator_setup.txt index 6fde29eff32..5e2fa4f8322 100644 --- a/d2d_emulator_setup.txt +++ b/d2d_emulator_setup.txt @@ -10,8 +10,6 @@ auto eth0 netmask 255.255.255.0 gateway 10.10.10.1 - - Prepare the environment: - git clone https://gitlab.eurecom.fr/matzakos/LTE-D2D.git This branch contains all the current development for DDPS diff --git a/openair2/LAYER2/MAC/config.c b/openair2/LAYER2/MAC/config.c index 24727eb4083..65a55a21c4d 100644 --- a/openair2/LAYER2/MAC/config.c +++ b/openair2/LAYER2/MAC/config.c @@ -65,6 +65,7 @@ extern void phy_reset_ue(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_index); extern uint8_t nfapi_mode; + /* sec 5.9, 36.321: MAC Reset Procedure */ void ue_mac_reset(module_id_t module_idP,uint8_t eNB_index) { @@ -1046,6 +1047,11 @@ rrc_mac_config_req_ue( ,uint8_t num_active_cba_groups, uint16_t cba_rnti #endif +#if defined(Rel14) + ,uint32_t *sourceL2Id, + uint32_t *groupL2Id +#endif + ) { @@ -1363,6 +1369,13 @@ rrc_mac_config_req_ue( // Panos: Call to the phy_config_request_ue() function of the interface to copy the UE_PHY_Config_t interface // configuration to the PHY common and dedicated configuration originating from RRC. +//for D2D +#if defined(Rel10) || defined(Rel14) + if ( sourceL2Id && groupL2Id) { + UE_mac_inst[Mod_idP].sourceL2Id = *sourceL2Id; + UE_mac_inst[Mod_idP].groupL2Id = *groupL2Id; + } +#endif return(0); } diff --git a/openair2/LAYER2/MAC/defs.h b/openair2/LAYER2/MAC/defs.h index ee8bc56197d..8722afa3312 100644 --- a/openair2/LAYER2/MAC/defs.h +++ b/openair2/LAYER2/MAC/defs.h @@ -1325,6 +1325,13 @@ typedef struct { struct SL_DiscConfig_r12 *sl_DiscConfig_r12; /// Dedicated TX config for Sidelink struct SL_CommConfig_r12 *sl_CommConfig_r12; + //SL sourceL2ID + uint32_t sourceL2Id; + //SL groupL2Id + uint32_t groupL2Id; + //SL destinationL2Id + uint32_t destinationL2Id; + #endif /// pointer to TDD Configuration (NULL for FDD) TDD_Config_t *tdd_Config; diff --git a/openair2/LAYER2/MAC/proto.h b/openair2/LAYER2/MAC/proto.h index 6745b925da0..b14b6d8367b 100644 --- a/openair2/LAYER2/MAC/proto.h +++ b/openair2/LAYER2/MAC/proto.h @@ -928,6 +928,11 @@ int rrc_mac_config_req_ue(module_id_t module_idP, , uint8_t num_active_cba_groups, uint16_t cba_rnti +#endif +#if defined(Rel14) + , + uint32_t *sourceL2Id, + uint32_t *groupL2Id #endif ); diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c index 27a39a4fa2a..8adf78bb605 100644 --- a/openair2/LAYER2/MAC/ue_procedures.c +++ b/openair2/LAYER2/MAC/ue_procedures.c @@ -753,6 +753,8 @@ void ue_send_sl_sdu(module_id_t module_idP, int rlc_sdu_len; char *rlc_sdu; + uint32_t sourceL2Id; + uint32_t destinationL2Id =0x00000000; // Notes: 1. no control elements are supported yet // 2. we exit with error if LCID != 3 @@ -761,6 +763,16 @@ void ue_send_sl_sdu(module_id_t module_idP, SLSCH_SUBHEADER_24_Bit_DST_LONG *longh = (SLSCH_SUBHEADER_24_Bit_DST_LONG *)sdu; AssertFatal(longh->E==0,"E is non-zero\n"); AssertFatal(longh->LCID==3,"LCID is %d (not 3)\n",longh->LCID); + //filter incoming packet based on destination address + destinationL2Id = (longh->DST07<<16) | (longh->DST815 <<8) | (longh->DST1623); + LOG_I( MAC, "[DestinationL2Id: %"PRIu32"] \n", destinationL2Id ); + //match the destinationL2Id with UE L2Id or groupL2ID + if (!((destinationL2Id == UE_mac_inst[module_idP].sourceL2Id) | (destinationL2Id == UE_mac_inst[module_idP].groupL2Id))){ + LOG_I( MAC, "[Destination Id is neither matched with Source Id nor with Group Id, drop the packet!!! \n"); + return; + } + //AssertFatal(((destinationL2Id == UE_mac_inst[module_idP].sourceL2Id) | (destinationL2Id == UE_mac_inst[module_idP].groupL2Id)), "Destination Id is neither matched with Source Id nor with Group Id \n") + if (longh->F==1) { rlc_sdu_len = ((longh->L_MSB<<8)&0x7F00)|(longh->L_LSB&0xFF); rlc_sdu = sdu+sizeof(SLSCH_SUBHEADER_24_Bit_DST_LONG); @@ -2773,7 +2785,11 @@ SLSCH_t *ue_get_slsch(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_ // 2. LCID hard-coded to 3 // 3. SRC/DST IDs with debug values if (sdu_length > 0) { + LOG_I(MAC,"SFN.SF %d.%d : got %d bytes from Sidelink buffer (%d requested)\n",frameP,subframeP,sdu_length,req); + LOG_I(MAC,"sourceL2Id %d: \n",ue->sourceL2Id); + LOG_I(MAC,"groupL2Id %d: \n",ue->groupL2Id); + slsch->payload = (unsigned char*)ue->slsch_pdu.payload; if (sdu_length < 128) { slsch->payload++; @@ -2782,12 +2798,20 @@ SLSCH_t *ue_get_slsch(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_ shorth->L=sdu_length; shorth->E=0; shorth->LCID=3; - shorth->SRC07=0x12; - shorth->SRC815=0x34; + /* shorth->SRC07=0x12; shorth->SRC1623=0x56; + shorth->SRC815=0x34; shorth->DST07=0x78; shorth->DST815=0x9A; - shorth->DST1623=0xBC; + shorth->DST1623=0xBC;*/ + + shorth->SRC07 = (ue->sourceL2Id>>16) & 0x000000ff; + shorth->SRC815 = (ue->sourceL2Id>>8) & 0x000000ff; + shorth->SRC1623 = ue->sourceL2Id & 0x000000ff; + shorth->DST07 = (ue->groupL2Id >>16) & 0x000000ff; + shorth->DST815 = (ue->groupL2Id>>8) & 0x000000ff; + shorth->DST1623 = ue->groupL2Id & 0x000000ff; + shorth->V=0x1; } else { @@ -2797,12 +2821,21 @@ SLSCH_t *ue_get_slsch(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_ longh->L_MSB=(sdu_length>>8)&0x7f; longh->E=0; longh->LCID=3; + /* longh->SRC07=0x12; longh->SRC815=0x34; longh->SRC1623=0x56; longh->DST07=0x78; longh->DST815=0x9A; longh->DST1623=0xBC; + */ + longh->SRC07 = (ue->sourceL2Id >>16) & 0x000000ff; + longh->SRC815 = (ue->sourceL2Id>>8) & 0x000000ff; + longh->SRC1623 = ue->sourceL2Id & 0x000000ff; + longh->DST07 = (ue->groupL2Id >>16) & 0x000000ff; + longh->DST815 = (ue->groupL2Id>>8) & 0x000000ff; + longh->DST1623 = ue->groupL2Id & 0x000000ff; + longh->V=0x1; } slsch->rvidx = 0; diff --git a/openair2/RRC/LITE/rrc_UE.c b/openair2/RRC/LITE/rrc_UE.c index 9b59ecf1f8e..2439cacf53c 100644 --- a/openair2/RRC/LITE/rrc_UE.c +++ b/openair2/RRC/LITE/rrc_UE.c @@ -1031,6 +1031,11 @@ rrc_ue_process_measConfig( , 0, 0 +#endif +#if defined(Rel14) + , + NULL, + NULL #endif ); } @@ -1543,6 +1548,11 @@ rrc_ue_process_radioResourceConfigDedicated( , 0, 0 +#endif +#if defined(Rel14) + , + NULL, + NULL #endif ); } @@ -1602,6 +1612,11 @@ rrc_ue_process_radioResourceConfigDedicated( , 0, 0 +#endif +#if defined(Rel14) + , + NULL, + NULL #endif ); } @@ -1709,6 +1724,11 @@ rrc_ue_process_radioResourceConfigDedicated( , UE_rrc_inst[ue_mod_idP].num_active_cba_groups, // UE_rrc_inst[ue_mod_idP].cba_rnti[0] +#endif +#if defined(Rel14) + , + NULL, + NULL #endif ); @@ -2292,6 +2312,11 @@ rrc_ue_process_mobilityControlInfo( #ifdef CBA ,0, 0 +#endif +#if defined(Rel14) + , + NULL, + NULL #endif ); @@ -3154,6 +3179,11 @@ int decode_SIB1( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB_index, , 0, 0 +#endif +#if defined(Rel14) + , + NULL, + NULL #endif ); @@ -3833,6 +3863,11 @@ uint64_t arfcn_to_freq(long arfcn) { #ifdef CBA ,0, 0 +#endif +#if defined(Rel14) + , + NULL, + NULL #endif ); // After SI is received, prepare RRCConnectionRequest @@ -4013,6 +4048,11 @@ uint64_t arfcn_to_freq(long arfcn) { #ifdef CBA ,0, 0 +#endif +#if defined(Rel14) + , + NULL, + NULL #endif ); break; @@ -4509,6 +4549,11 @@ int decode_MCCH_Message( const protocol_ctxt_t* const ctxt_pP, const uint8_t eNB , 0, 0 +#endif +#if defined(Rel14) + , + NULL, + NULL #endif ); @@ -5373,6 +5418,9 @@ void *rrc_control_socket_thread_fct(void *arg) int n; // message byte size struct sidelink_ctrl_element *sl_ctrl_msg_recv = NULL; struct sidelink_ctrl_element *sl_ctrl_msg_send = NULL; + uint32_t sourceL2Id; + uint32_t groupL2Id; + module_id_t module_id; //from the main program, listen for the incoming messages from control socket (ProSe App) @@ -5438,6 +5486,10 @@ void *rrc_control_socket_thread_fct(void *arg) break; 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; + //sourceL2Id = 0x123456; + //groupL2Id = 0x789ABC; #ifdef DEBUG_CTRL_SOCKET LOG_I(RRC,"[rrc_control_socket_thread_fct][GroupCommunicationEstablishReq] Received on socket from ProSe App (msg type: %d)\n",sl_ctrl_msg_recv->type); LOG_I(RRC,"[rrc_control_socket_thread_fct][GroupCommunicationEstablishReq] type: %d\n",sl_ctrl_msg_recv->sidelinkPrimitive.group_comm_establish_req.type); @@ -5447,6 +5499,45 @@ void *rrc_control_socket_thread_fct(void *arg) #endif // configure lower layers PDCP/MAC/PHY for this communication //init_SL_preconfig() + //configure MAC with sourceL2Id/groupL2ID (to be used in MAC/ue_procedures.c) + module_id = 0 ; //hardcoded for testing only + 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, + 0, + (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) + , + &sourceL2Id, + &groupL2Id + #endif + ); LOG_I(RRC,"[rrc_control_socket_thread_fct]Send GroupCommunicationEstablishResp to ProSe App\n"); memset(send_buf, 0, BUFSIZE); -- GitLab