Commit 7a5fda00 authored by Jerome Peraldi's avatar Jerome Peraldi

Merge branch 'sqn/private/bugz125147' into 'sqn/3GPP_TTCN_System_Simulator'

Bug #125147 [eNB]support of 3GPP 8.2.1.6 under improved mac scheduler

See merge request sequans/system/ttcn/openairinterface5g!19
parents 03d0ff08 20a8fdb7
...@@ -94,6 +94,7 @@ typedef struct ss_nr_sys_port_msg_cnf { ...@@ -94,6 +94,7 @@ typedef struct ss_nr_sys_port_msg_cnf {
/** SYS */ /** SYS */
typedef struct ss_set_timinfo_s { typedef struct ss_set_timinfo_s {
uint16_t hsfn;
uint16_t sfn; uint16_t sfn;
uint8_t sf; uint8_t sf;
int cell_index; int cell_index;
......
...@@ -6965,12 +6965,18 @@ void rrc_eNB_as_security_configuration_req( ...@@ -6965,12 +6965,18 @@ void rrc_eNB_as_security_configuration_req(
* Each RB entry will be freed invidually when the pdcp_remove_ue is invoked * Each RB entry will be freed invidually when the pdcp_remove_ue is invoked
* during the UE release process. * during the UE release process.
*/ */
kRRCint = CALLOC(1,32); if(ASSecConfReq->Integrity.kRRCint) {
kUPenc = CALLOC(1,16); kRRCint = CALLOC(1,32);
kRRCenc = CALLOC(1,16); memcpy(kRRCint,ASSecConfReq->Integrity.kRRCint, 32);
memcpy(kRRCint,ASSecConfReq->Integrity.kRRCint, 32); }
memcpy(kUPenc,ASSecConfReq->Ciphering.kUPenc, 16); if(ASSecConfReq->Ciphering.kUPenc) {
memcpy(kRRCenc,ASSecConfReq->Ciphering.kRRCenc, 16); kUPenc = CALLOC(1,16);
memcpy(kUPenc,ASSecConfReq->Ciphering.kUPenc, 16);
}
if(ASSecConfReq->Ciphering.kRRCenc) {
kRRCenc = CALLOC(1,16);
memcpy(kRRCenc,ASSecConfReq->Ciphering.kRRCenc, 16);
}
pdcp_config_set_security( pdcp_config_set_security(
ctxt_pP, ctxt_pP,
......
...@@ -98,7 +98,7 @@ static void ss_send_drb_data(ss_drb_pdu_ind_t *pdu_ind, int cell_index){ ...@@ -98,7 +98,7 @@ static void ss_send_drb_data(ss_drb_pdu_ind_t *pdu_ind, int cell_index){
ind.Common.TimingInfo.v.SubFrame.Subframe.v.Number = pdu_ind->subframe; ind.Common.TimingInfo.v.SubFrame.Subframe.v.Number = pdu_ind->subframe;
ind.Common.TimingInfo.v.SubFrame.HSFN.d = SystemFrameNumberInfo_Type_Number; ind.Common.TimingInfo.v.SubFrame.HSFN.d = SystemFrameNumberInfo_Type_Number;
ind.Common.TimingInfo.v.SubFrame.HSFN.v.Number = 0; ind.Common.TimingInfo.v.SubFrame.HSFN.v.Number = SS_context.hsfn;
ind.Common.TimingInfo.v.SubFrame.Slot.d = SlotTimingInfo_Type_Any; ind.Common.TimingInfo.v.SubFrame.Slot.d = SlotTimingInfo_Type_Any;
ind.Common.TimingInfo.v.SubFrame.Slot.v.Any = true; ind.Common.TimingInfo.v.SubFrame.Slot.v.Any = true;
......
...@@ -257,9 +257,8 @@ void ss_port_man_send_data( ...@@ -257,9 +257,8 @@ void ss_port_man_send_data(
cnf.Common.TimingInfo.v.SubFrame.Subframe.d = SubFrameInfo_Type_Number; cnf.Common.TimingInfo.v.SubFrame.Subframe.d = SubFrameInfo_Type_Number;
cnf.Common.TimingInfo.v.SubFrame.Subframe.v.Number = tinfo->sf; cnf.Common.TimingInfo.v.SubFrame.Subframe.v.Number = tinfo->sf;
/** TODO: Always filling HSFN as 0, need to change this */
cnf.Common.TimingInfo.v.SubFrame.HSFN.d = SystemFrameNumberInfo_Type_Number; cnf.Common.TimingInfo.v.SubFrame.HSFN.d = SystemFrameNumberInfo_Type_Number;
cnf.Common.TimingInfo.v.SubFrame.HSFN.v.Number = 0; cnf.Common.TimingInfo.v.SubFrame.HSFN.v.Number = tinfo->hsfn;
/** TODO: Always marking as first slot, need to change this */ /** TODO: Always marking as first slot, need to change this */
cnf.Common.TimingInfo.v.SubFrame.Slot.d = SlotTimingInfo_Type_FirstSlot; cnf.Common.TimingInfo.v.SubFrame.Slot.d = SlotTimingInfo_Type_FirstSlot;
......
...@@ -123,8 +123,8 @@ static void ss_send_srb_data(ss_rrc_pdu_ind_t *pdu_ind,int cell_index) ...@@ -123,8 +123,8 @@ static void ss_send_srb_data(ss_rrc_pdu_ind_t *pdu_ind,int cell_index)
ind.Common.TimingInfo.v.SubFrame.Subframe.d = SubFrameInfo_Type_Number; ind.Common.TimingInfo.v.SubFrame.Subframe.d = SubFrameInfo_Type_Number;
ind.Common.TimingInfo.v.SubFrame.Subframe.v.Number = pdu_ind->subframe; ind.Common.TimingInfo.v.SubFrame.Subframe.v.Number = pdu_ind->subframe;
ind.Common.TimingInfo.v.SubFrame.HSFN.d = SystemFrameNumberInfo_Type_Any; ind.Common.TimingInfo.v.SubFrame.HSFN.d = SystemFrameNumberInfo_Type_Number;
ind.Common.TimingInfo.v.SubFrame.HSFN.v.Number = 0; ind.Common.TimingInfo.v.SubFrame.HSFN.v.Number = SS_context.hsfn;
ind.Common.TimingInfo.v.SubFrame.Slot.d = SlotTimingInfo_Type_Any; ind.Common.TimingInfo.v.SubFrame.Slot.d = SlotTimingInfo_Type_Any;
ind.Common.TimingInfo.v.SubFrame.Slot.v.Any = true; ind.Common.TimingInfo.v.SubFrame.Slot.v.Any = true;
...@@ -257,6 +257,7 @@ static void ss_task_handle_rrc_pdu_req(struct EUTRA_RRC_PDU_REQ *req) ...@@ -257,6 +257,7 @@ static void ss_task_handle_rrc_pdu_req(struct EUTRA_RRC_PDU_REQ *req)
SS_RRC_PDU_REQ(message_p).rnti = rnti_g; SS_RRC_PDU_REQ(message_p).rnti = rnti_g;
vt_add_sf(&req->Common.TimingInfo, -2); //RRC PDU schedule(if future timing) shall be ahead 2 subframe because of latency between VT_Timer_task --RRC -- PDCP
if (!vt_timer_push_msg(&req->Common.TimingInfo, TASK_RRC_ENB, instance_g, message_p)) if (!vt_timer_push_msg(&req->Common.TimingInfo, TASK_RRC_ENB, instance_g, message_p))
{ {
itti_send_msg_to_task(TASK_RRC_ENB, instance_g, message_p); itti_send_msg_to_task(TASK_RRC_ENB, instance_g, message_p);
......
...@@ -295,7 +295,8 @@ static void ss_task_sys_handle_timing_info(ss_set_timinfo_t *tinfo) ...@@ -295,7 +295,8 @@ static void ss_task_sys_handle_timing_info(ss_set_timinfo_t *tinfo)
MessageDef *message_p = itti_alloc_new_message(TASK_SYS, 0, SS_SET_TIM_INFO); MessageDef *message_p = itti_alloc_new_message(TASK_SYS, 0, SS_SET_TIM_INFO);
if (message_p) if (message_p)
{ {
LOG_A(ENB_SS_SYS_TASK, "Reporting info sfn:%d\t sf:%d.\n", tinfo->sfn, tinfo->sf); LOG_A(ENB_SS_SYS_TASK, "Reporting info hsfn:%d sfn:%d\t sf:%d.\n",tinfo->hsfn, tinfo->sfn, tinfo->sf);
SS_SET_TIM_INFO(message_p).hsfn = tinfo->hsfn;
SS_SET_TIM_INFO(message_p).sf = tinfo->sf; SS_SET_TIM_INFO(message_p).sf = tinfo->sf;
SS_SET_TIM_INFO(message_p).sfn = tinfo->sfn; SS_SET_TIM_INFO(message_p).sfn = tinfo->sfn;
SS_SET_TIM_INFO(message_p).cell_index = cell_index; SS_SET_TIM_INFO(message_p).cell_index = cell_index;
...@@ -2190,6 +2191,7 @@ static void ss_task_sys_handle_req(struct SYSTEM_CTRL_REQ *req, ss_set_timinfo_t ...@@ -2190,6 +2191,7 @@ static void ss_task_sys_handle_req(struct SYSTEM_CTRL_REQ *req, ss_set_timinfo_t
case SystemRequest_Type_Paging: case SystemRequest_Type_Paging:
LOG_A(ENB_SS_SYS_TASK, "SystemRequest_Type Paging received\n"); LOG_A(ENB_SS_SYS_TASK, "SystemRequest_Type Paging received\n");
ss_set_timinfo_t pg_timinfo ; ss_set_timinfo_t pg_timinfo ;
pg_timinfo.hsfn = req->Common.TimingInfo.v.SubFrame.HSFN.v.Number;
pg_timinfo.sfn = req->Common.TimingInfo.v.SubFrame.SFN.v.Number; pg_timinfo.sfn = req->Common.TimingInfo.v.SubFrame.SFN.v.Number;
pg_timinfo.sf = req->Common.TimingInfo.v.SubFrame.Subframe.v.Number; pg_timinfo.sf = req->Common.TimingInfo.v.SubFrame.Subframe.v.Number;
sys_handle_paging_req(&(req->Request.v.Paging), pg_timinfo); sys_handle_paging_req(&(req->Request.v.Paging), pg_timinfo);
...@@ -2373,7 +2375,8 @@ void *ss_eNB_sys_process_itti_msg(void *notUsed) ...@@ -2373,7 +2375,8 @@ void *ss_eNB_sys_process_itti_msg(void *notUsed)
{ {
MessageDef *received_msg = NULL; MessageDef *received_msg = NULL;
int result; int result;
static ss_set_timinfo_t tinfo = {.sfn = 0xFFFF, .sf = 0xFF}; static ss_set_timinfo_t tinfo = {.hsfn=0xFFFF, .sfn = 0xFFFF, .sf = 0xFF};
SS_context.hsfn = tinfo.hsfn;
SS_context.sfn = tinfo.sfn; SS_context.sfn = tinfo.sfn;
SS_context.sf = tinfo.sf; SS_context.sf = tinfo.sf;
...@@ -2402,17 +2405,26 @@ void *ss_eNB_sys_process_itti_msg(void *notUsed) ...@@ -2402,17 +2405,26 @@ void *ss_eNB_sys_process_itti_msg(void *notUsed)
} }
case SS_UPD_TIM_INFO: case SS_UPD_TIM_INFO:
{ {
/*WA: calculate hsfn here */
if(tinfo.hsfn == 0xFFFF){
tinfo.hsfn = 0;
} else if(tinfo.sfn == 1023 && SS_UPD_TIM_INFO(received_msg).sfn == 0){
tinfo.hsfn++;
if(tinfo.hsfn == 1024){
tinfo.hsfn = 0;
}
}
tinfo.sf = SS_UPD_TIM_INFO(received_msg).sf; tinfo.sf = SS_UPD_TIM_INFO(received_msg).sf;
tinfo.sfn = SS_UPD_TIM_INFO(received_msg).sfn; tinfo.sfn = SS_UPD_TIM_INFO(received_msg).sfn;
SS_context.sfn = tinfo.sfn; SS_context.sfn = tinfo.sfn;
SS_context.sf = tinfo.sf; SS_context.sf = tinfo.sf;
// SS_context.hsfn = tinfo.hsfn; SS_context.hsfn = tinfo.hsfn;
g_log->sfn = tinfo.sfn; g_log->sfn = tinfo.sfn;
g_log->sf = (uint32_t)tinfo.sf; g_log->sf = (uint32_t)tinfo.sf;
if (g_log->sfn % 64 == 0 && g_log->sf == 0) { if (g_log->sfn % 64 == 0 && g_log->sf == 0) {
LOG_I(ENB_SS_SYS_TASK, "[SYS] received SS_UPD_TIM_INFO SFN: %d SF: %d\n", tinfo.sfn, tinfo.sf); LOG_I(ENB_SS_SYS_TASK, "[SYS] received SS_UPD_TIM_INFO HSFN:%d SFN: %d SF: %d\n", tinfo.hsfn,tinfo.sfn, tinfo.sf);
} }
} }
break; break;
......
...@@ -96,7 +96,7 @@ static void ss_send_sysind_data(ss_system_ind_t *p_ind,int cell_index) ...@@ -96,7 +96,7 @@ static void ss_send_sysind_data(ss_system_ind_t *p_ind,int cell_index)
ind.Common.TimingInfo.v.SubFrame.Subframe.v.Number = p_ind->sf; ind.Common.TimingInfo.v.SubFrame.Subframe.v.Number = p_ind->sf;
ind.Common.TimingInfo.v.SubFrame.HSFN.d = SystemFrameNumberInfo_Type_Number; ind.Common.TimingInfo.v.SubFrame.HSFN.d = SystemFrameNumberInfo_Type_Number;
ind.Common.TimingInfo.v.SubFrame.HSFN.v.Number = 0; ind.Common.TimingInfo.v.SubFrame.HSFN.v.Number = SS_context.hsfn;
ind.Common.TimingInfo.v.SubFrame.Slot.d = SlotTimingInfo_Type_Any; ind.Common.TimingInfo.v.SubFrame.Slot.d = SlotTimingInfo_Type_Any;
ind.Common.TimingInfo.v.SubFrame.Slot.v.Any = true; ind.Common.TimingInfo.v.SubFrame.Slot.v.Any = true;
......
...@@ -37,15 +37,11 @@ ...@@ -37,15 +37,11 @@
extern SSConfigContext_t SS_context; extern SSConfigContext_t SS_context;
extern RAN_CONTEXT_t RC; extern RAN_CONTEXT_t RC;
static uint8_t _vt_timer_setup(ss_set_timinfo_t* tinfo, task_id_t task_id,instance_t instance, void *msg);
static uint8_t _msg_can_be_queued(ss_set_timinfo_t* req_tinfo);
/* /*
* Function : vt_subtract_sf * Function : _vt_subtract_sf
* Description: Helper function to substract offset to SFN_SF * Description: Helper function to substract offset to SFN_SF
*/ */
static void vt_subtract_sf(uint16_t *frameP, uint8_t *subframeP, int offset) static void _vt_subtract_sf(uint16_t *frameP, uint8_t *subframeP, int offset)
{ {
if (*subframeP < offset) if (*subframeP < offset)
{ {
...@@ -54,11 +50,26 @@ static void vt_subtract_sf(uint16_t *frameP, uint8_t *subframeP, int offset) ...@@ -54,11 +50,26 @@ static void vt_subtract_sf(uint16_t *frameP, uint8_t *subframeP, int offset)
*subframeP = (*subframeP+10-offset)%10; *subframeP = (*subframeP+10-offset)%10;
} }
/*
* Function : vt_add_sf
* Description: Helper function to add offset to SFN_SF
*/
static void _vt_add_sf(uint16_t *frameP, uint8_t *subframeP, int offset)
{
if (offset > 0) {
*frameP = (*frameP + ((*subframeP + offset) / 10)) % 1024;
*subframeP = ((*subframeP + offset) % 10);
} else {
_vt_subtract_sf(frameP,subframeP,0-offset);
}
}
/* /*
* Function : msg_can_be_queued * Function : msg_can_be_queued
* Description: Helper function to check if the received MSG shall be queued * Description: Helper function to check if the received MSG shall be queued
*/ */
uint8_t msg_can_be_queued(ss_set_timinfo_t req_tinfo, ss_set_timinfo_t *timer_tinfo) static uint8_t _msg_can_be_queued(ss_set_timinfo_t req_tinfo, ss_set_timinfo_t *timer_tinfo)
{ {
ss_set_timinfo_t curr_tinfo; ss_set_timinfo_t curr_tinfo;
curr_tinfo.sfn = SS_context.sfn; curr_tinfo.sfn = SS_context.sfn;
...@@ -69,7 +80,7 @@ uint8_t msg_can_be_queued(ss_set_timinfo_t req_tinfo, ss_set_timinfo_t *timer_ti ...@@ -69,7 +80,7 @@ uint8_t msg_can_be_queued(ss_set_timinfo_t req_tinfo, ss_set_timinfo_t *timer_ti
/*It is nonsense to check req_tinfo is after curr_tinfo */ /*It is nonsense to check req_tinfo is after curr_tinfo */
if(req_tinfo.sfn != curr_tinfo.sfn || ((req_tinfo.sfn == curr_tinfo.sfn) && (req_tinfo.sf - curr_tinfo.sf) > 0) ) if(req_tinfo.sfn != curr_tinfo.sfn || ((req_tinfo.sfn == curr_tinfo.sfn) && (req_tinfo.sf - curr_tinfo.sf) > 0) )
{ {
vt_subtract_sf(&timer_tinfo->sfn,&timer_tinfo->sf, 4); /* queued ahead of 4 subframes because of mac schedule 4 subframes ahead when processing */ _vt_subtract_sf(&timer_tinfo->sfn,&timer_tinfo->sf, 4); /* queued ahead of 4 subframes because of mac schedule 4 subframes ahead when processing */
LOG_A(ENB_SS_VT_TIMER,"VT_TIMER MSG to be queued TRUE for SFN %d , SF %d\n",timer_tinfo->sfn,timer_tinfo->sf); LOG_A(ENB_SS_VT_TIMER,"VT_TIMER MSG to be queued TRUE for SFN %d , SF %d\n",timer_tinfo->sfn,timer_tinfo->sf);
return true; return true;
} }
...@@ -77,41 +88,37 @@ uint8_t msg_can_be_queued(ss_set_timinfo_t req_tinfo, ss_set_timinfo_t *timer_ti ...@@ -77,41 +88,37 @@ uint8_t msg_can_be_queued(ss_set_timinfo_t req_tinfo, ss_set_timinfo_t *timer_ti
return false; return false;
} }
/* /*
* Function : vt_timer_setup * Function : vt_timer_setup
* Description: Function to set upt the VT timer for the SFN_SF * Description: Function to set upt the VT timer for the SFN_SF
* and store the message to received * and store the message to received
*/ */
uint8_t vt_timer_setup(ss_set_timinfo_t tinfo, task_id_t task_id,instance_t instance, void *msg) static uint8_t _vt_timer_setup(ss_set_timinfo_t* tinfo, task_id_t task_id,instance_t instance, void *msg)
{ {
return _vt_timer_setup(&tinfo,task_id,instance, msg); uint32_t sfnSfKey = (tinfo->sfn << 4) | tinfo->sf;
}
/* vt_timer_elm_t *timer_ele_p = calloc(1, sizeof(vt_timer_elm_t));
* Function : vt_add_sf assert(timer_ele_p);
* Description: Helper function to add offset to SFN_SF timer_ele_p->instance = instance;
*/ timer_ele_p->task_id = task_id;
timer_ele_p->msg = msg;
static void _vt_add_sf(uint16_t *frameP, uint8_t *subframeP, int offset) if (hashtable_insert(SS_context.vt_timer_table,
{ (hash_key_t)sfnSfKey, (void *)timer_ele_p) == HASH_TABLE_OK)
if (offset > 0) { {
*frameP = (*frameP + ((*subframeP + offset) / 10)) % 1024; LOG_A(ENB_SS_VT_TIMER,"VT_TIMER setup for SFN %d , SF %d\n",tinfo->sfn,tinfo->sf);
*subframeP = ((*subframeP + offset) % 10); return 1;
} else {
if (*subframeP < offset) {
*frameP = (*frameP + 1024 - 1) % 1024;
}
*subframeP = (*subframeP + 10 - offset) % 10;
} }
return false;
} }
void vt_add_sf(struct TimingInfo_Type* at, int offset) void vt_add_sf(struct TimingInfo_Type* at, int offset)
{ {
if (at != NULL && at->d == TimingInfo_Type_SubFrame) if (at != NULL && at->d == TimingInfo_Type_SubFrame)
{ {
uint8_t sfn = SS_context.sfn; uint16_t sfn = SS_context.sfn;
uint16_t sf = SS_context.sf; uint8_t sf = SS_context.sf;
if (at->v.SubFrame.SFN.d == SystemFrameNumberInfo_Type_Number) if (at->v.SubFrame.SFN.d == SystemFrameNumberInfo_Type_Number)
{ {
sfn = at->v.SubFrame.SFN.v.Number; sfn = at->v.SubFrame.SFN.v.Number;
...@@ -121,8 +128,8 @@ void vt_add_sf(struct TimingInfo_Type* at, int offset) ...@@ -121,8 +128,8 @@ void vt_add_sf(struct TimingInfo_Type* at, int offset)
{ {
sf = at->v.SubFrame.Subframe.v.Number; sf = at->v.SubFrame.Subframe.v.Number;
} }
LOG_D(ENB_SS_VT_TIMER,"vt_add_sf SFN %d SF %d offset %d\n",sfn,sf,offset);
_vt_add_sf(&sf, &sfn, offset); _vt_add_sf(&sfn, &sf, offset);
at->v.SubFrame.SFN.d = SystemFrameNumberInfo_Type_Number; at->v.SubFrame.SFN.d = SystemFrameNumberInfo_Type_Number;
at->v.SubFrame.SFN.v.Number = sfn; at->v.SubFrame.SFN.v.Number = sfn;
at->v.SubFrame.Subframe.d = SubFrameInfo_Type_Number; at->v.SubFrame.Subframe.d = SubFrameInfo_Type_Number;
...@@ -136,11 +143,6 @@ int vt_timer_push_msg(struct TimingInfo_Type* at, task_id_t task_id,instance_t i ...@@ -136,11 +143,6 @@ int vt_timer_push_msg(struct TimingInfo_Type* at, task_id_t task_id,instance_t i
int msg_queued = 0; int msg_queued = 0;
if (at != NULL && at->d == TimingInfo_Type_SubFrame) if (at != NULL && at->d == TimingInfo_Type_SubFrame)
{ {
if (at->v.SubFrame.HSFN.d == SystemFrameNumberInfo_Type_Number)
{
return 0;
}
ss_set_timinfo_t timer_tinfo = { ss_set_timinfo_t timer_tinfo = {
.sfn = SS_context.sfn, .sfn = SS_context.sfn,
.sf = SS_context.sf + 6, .sf = SS_context.sf + 6,
...@@ -160,69 +162,17 @@ int vt_timer_push_msg(struct TimingInfo_Type* at, task_id_t task_id,instance_t i ...@@ -160,69 +162,17 @@ int vt_timer_push_msg(struct TimingInfo_Type* at, task_id_t task_id,instance_t i
return 0; return 0;
} }
msg_queued = _msg_can_be_queued(&timer_tinfo); msg_queued = _msg_can_be_queued(timer_tinfo,&timer_tinfo);
if(msg_queued) if(msg_queued)
{ {
msg_queued = _vt_timer_setup(&timer_tinfo, task_id, instance ,msg_p); msg_queued = _vt_timer_setup(&timer_tinfo, task_id, instance ,msg_p);
LOG_E(ENB_SS, "Message Queued as the scheduled SFN is %d SF: %d and curr SFN %d , SF %d, msg_queued: %d\r\n", LOG_A(ENB_SS_VT_TIMER, "Message Queued as the scheduled SFN is %d SF: %d and curr SFN %d , SF %d, msg_queued: %d\r\n",
timer_tinfo.sfn,timer_tinfo.sf, SS_context.sfn,SS_context.sf, msg_queued); timer_tinfo.sfn,timer_tinfo.sf, SS_context.sfn,SS_context.sf, msg_queued);
} }
else
{
vt_add_sf(at, -3);
LOG_E(ENB_SS,"VT_TIMER SYS Rescheduling MSG %p for future SFN %d , SF %d\r\n", msg_p, timer_tinfo.sfn,timer_tinfo.sf);
return vt_timer_push_msg(at, task_id, instance, msg_p);
}
} }
return msg_queued; return msg_queued;
} }
/*
* Function : msg_can_be_queued
* Description: Helper function to check if the received MSG shall be queued
*/
static uint8_t _msg_can_be_queued(ss_set_timinfo_t* req_tinfo)
{
ss_set_timinfo_t curr_tinfo;
curr_tinfo.sfn = SS_context.sfn;
curr_tinfo.sf = SS_context.sf;
uint32_t sfnSfKey = (req_tinfo->sfn << 4) | req_tinfo->sf;
/*It is nonsense to check req_tinfo is after curr_tinfo */
if(hashtable_is_key_exists(SS_context.vt_timer_table, sfnSfKey) != HASH_TABLE_OK &&
(req_tinfo->sfn != curr_tinfo.sfn || ((req_tinfo->sfn == curr_tinfo.sfn) && (req_tinfo->sf - curr_tinfo.sf) > 0)))
{
LOG_E(ENB_APP,"VT_TIMER MSG to be queued TRUE for SFN %d , SF %d\n",req_tinfo->sfn,req_tinfo->sf);
return true;
}
return false;
}
/*
* Function : vt_timer_setup
* Description: Function to set upt the VT timer for the SFN_SF
* and store the message to received
*/
static uint8_t _vt_timer_setup(ss_set_timinfo_t* tinfo, task_id_t task_id,instance_t instance, void *msg)
{
uint32_t sfnSfKey = (tinfo->sfn << 4) | tinfo->sf;
vt_timer_elm_t *timer_ele_p = calloc(1, sizeof(vt_timer_elm_t));
assert(timer_ele_p);
timer_ele_p->instance = instance;
timer_ele_p->task_id = task_id;
timer_ele_p->msg = msg;
if (hashtable_insert(SS_context.vt_timer_table,
(hash_key_t)sfnSfKey, (void *)timer_ele_p) == HASH_TABLE_OK)
{
LOG_E(ENB_APP,"VT_TIMER setup for SFN %d , SF %d\n", tinfo->sfn,tinfo->sf);
return 1;
}
return false;
}
/* /*
* Function : ss_vt_timer_check * Function : ss_vt_timer_check
* Description: Function to check if any SFN_SF is timed out and forward * Description: Function to check if any SFN_SF is timed out and forward
...@@ -237,7 +187,7 @@ static inline void ss_vt_timer_check(ss_set_timinfo_t tinfo) ...@@ -237,7 +187,7 @@ static inline void ss_vt_timer_check(ss_set_timinfo_t tinfo)
//printf("VT_TIMER foudn queued SFN %d , SF %d\n",tinfo.sfn,tinfo.sf); //printf("VT_TIMER foudn queued SFN %d , SF %d\n",tinfo.sfn,tinfo.sf);
while (hashtable_is_key_exists(SS_context.vt_timer_table, (hash_key_t)sfnSfKey) == HASH_TABLE_OK) while (hashtable_is_key_exists(SS_context.vt_timer_table, (hash_key_t)sfnSfKey) == HASH_TABLE_OK)
{ {
LOG_E(ENB_APP,"VT_TIMER Timeout sending curr SFN %d SF %d\n", LOG_D(ENB_SS_VT_TIMER,"VT_TIMER Timeout sending curr SFN %d SF %d\n",
SS_context.sfn,SS_context.sf); SS_context.sfn,SS_context.sf);
hashtable_get(SS_context.vt_timer_table, (hash_key_t)sfnSfKey, (void **)&timer_ele_p); hashtable_get(SS_context.vt_timer_table, (hash_key_t)sfnSfKey, (void **)&timer_ele_p);
...@@ -249,15 +199,15 @@ static inline void ss_vt_timer_check(ss_set_timinfo_t tinfo) ...@@ -249,15 +199,15 @@ static inline void ss_vt_timer_check(ss_set_timinfo_t tinfo)
int send_res = itti_send_msg_to_task(timer_ele_p->task_id,timer_ele_p->instance, (MessageDef *)timer_ele_p->msg); int send_res = itti_send_msg_to_task(timer_ele_p->task_id,timer_ele_p->instance, (MessageDef *)timer_ele_p->msg);
if (send_res < 0) if (send_res < 0)
{ {
LOG_E(ENB_APP, "[VT_TIMER] Error in SS_VT_TIME_OUT itti_send_msg_to_task"); LOG_E(ENB_SS_VT_TIMER, "[VT_TIMER] Error in SS_VT_TIME_OUT itti_send_msg_to_task");
} }
else else
{ {
LOG_E(ENB_APP,"VT_TIMER Sent message to taskID %d timer_ele.task_id instance %ld \n", LOG_A(ENB_SS_VT_TIMER,"VT_TIMER Sent message to taskID %d timer_ele.task_id instance %ld \n",
timer_ele_p->task_id,timer_ele_p->instance); timer_ele_p->task_id,timer_ele_p->instance);
hashtable_remove(SS_context.vt_timer_table, (hash_key_t)sfnSfKey); hashtable_remove(SS_context.vt_timer_table, (hash_key_t)sfnSfKey);
} }
LOG_E(ENB_APP,"VT_TIMER Timeout sending done curr SFN %d SF %d\n", LOG_D(ENB_SS_VT_TIMER,"VT_TIMER Timeout sending done curr SFN %d SF %d\n",
SS_context.sfn,SS_context.sf); SS_context.sfn,SS_context.sf);
} }
} }
...@@ -282,7 +232,7 @@ void *ss_eNB_vt_timer_process_itti_msg(void *notUsed) ...@@ -282,7 +232,7 @@ void *ss_eNB_vt_timer_process_itti_msg(void *notUsed)
ss_set_timinfo_t tinfo; ss_set_timinfo_t tinfo;
tinfo.sf = SS_UPD_TIM_INFO(received_msg).sf; tinfo.sf = SS_UPD_TIM_INFO(received_msg).sf;
tinfo.sfn = SS_UPD_TIM_INFO(received_msg).sfn; tinfo.sfn = SS_UPD_TIM_INFO(received_msg).sfn;
LOG_D(ENB_APP, "[VT_TIMER] received_UPD_TIM_INFO SFN: %d SF: %d\n", tinfo.sfn, tinfo.sf); LOG_D(ENB_SS_VT_TIMER, "[VT_TIMER] received_UPD_TIM_INFO SFN: %d SF: %d\n", tinfo.sfn, tinfo.sf);
ss_vt_timer_check(tinfo); ss_vt_timer_check(tinfo);
} }
...@@ -293,7 +243,7 @@ void *ss_eNB_vt_timer_process_itti_msg(void *notUsed) ...@@ -293,7 +243,7 @@ void *ss_eNB_vt_timer_process_itti_msg(void *notUsed)
break; break;
} }
default: default:
LOG_E(ENB_APP, "[SS-VT_TIMER] Received unhandled message %d:%s\n", LOG_E(ENB_SS_VT_TIMER, "[SS-VT_TIMER] Received unhandled message %d:%s\n",
ITTI_MSG_ID(received_msg), ITTI_MSG_NAME(received_msg)); ITTI_MSG_ID(received_msg), ITTI_MSG_NAME(received_msg));
} }
result = itti_free(ITTI_MSG_ORIGIN_ID(received_msg), received_msg); result = itti_free(ITTI_MSG_ORIGIN_ID(received_msg), received_msg);
...@@ -324,14 +274,14 @@ void* ss_eNB_vt_timer_task(void *arg) { ...@@ -324,14 +274,14 @@ void* ss_eNB_vt_timer_task(void *arg) {
int retVal = ss_eNB_vt_timer_init(); int retVal = ss_eNB_vt_timer_init();
if (retVal != -1) { if (retVal != -1) {
LOG_A(ENB_APP, "[SS-VT_TIMER] Enabled TASK_VT_TIMER starting the itti_msg_handler \n"); LOG_A(ENB_SS_VT_TIMER, "[SS-VT_TIMER] Enabled TASK_VT_TIMER starting the itti_msg_handler \n");
while (1) { while (1) {
(void) ss_eNB_vt_timer_process_itti_msg(NULL); (void) ss_eNB_vt_timer_process_itti_msg(NULL);
} }
} else { } else {
LOG_A(ENB_APP, "[SS-VT_TIMER] TASK_VT_TIMER port disabled at eNB \n"); LOG_A(ENB_SS_VT_TIMER, "[SS-VT_TIMER] TASK_VT_TIMER port disabled at eNB \n");
sleep(10); sleep(10);
} }
......
...@@ -41,11 +41,6 @@ void *ss_eNB_vt_timer_task(void *arg); ...@@ -41,11 +41,6 @@ void *ss_eNB_vt_timer_task(void *arg);
int vt_timer_push_msg(struct TimingInfo_Type* at, task_id_t task_id,instance_t instance, MessageDef *msg_p); int vt_timer_push_msg(struct TimingInfo_Type* at, task_id_t task_id,instance_t instance, MessageDef *msg_p);
void vt_add_sf(struct TimingInfo_Type* at, int offset); void vt_add_sf(struct TimingInfo_Type* at, int offset);
uint8_t msg_can_be_queued(ss_set_timinfo_t req_tinfo, ss_set_timinfo_t *timer_tinfo);
uint8_t vt_timer_setup(ss_set_timinfo_t tinfo, task_id_t task_id,instance_t instance,void *msg);
typedef struct vt_timer_elm_s { typedef struct vt_timer_elm_s {
//uint8_t msg_type; ///MSG type //uint8_t msg_type; ///MSG type
task_id_t task_id; task_id_t task_id;
......
...@@ -88,15 +88,14 @@ void ss_vtp_send_tinfo( ...@@ -88,15 +88,14 @@ void ss_vtp_send_tinfo(
size_t msgSize = size; size_t msgSize = size;
memset(&virtualTime, 0, sizeof(virtualTime)); memset(&virtualTime, 0, sizeof(virtualTime));
virtualTime.Enable = true; virtualTime.Enable = true;
virtualTime.TimingInfo.SFN.d = true; virtualTime.TimingInfo.SFN.d = SystemFrameNumberInfo_Type_Number;
virtualTime.TimingInfo.SFN.v.Number = tinfo->sfn; virtualTime.TimingInfo.SFN.v.Number = tinfo->sfn;
virtualTime.TimingInfo.Subframe.d = true; virtualTime.TimingInfo.Subframe.d = SubFrameInfo_Type_Number;
virtualTime.TimingInfo.Subframe.v.Number = tinfo->sf; virtualTime.TimingInfo.Subframe.v.Number = tinfo->sf;
/** TODO: Always filling HSFN as 0, need to check this */ virtualTime.TimingInfo.HSFN.d = SystemFrameNumberInfo_Type_Number;
virtualTime.TimingInfo.HSFN.d = false; virtualTime.TimingInfo.HSFN.v.Number = tinfo->hsfn;
virtualTime.TimingInfo.HSFN.v.Number = 0;
/** TODO: Always marking as first slot, need to check this */ /** TODO: Always marking as first slot, need to check this */
virtualTime.TimingInfo.Slot.d = SlotTimingInfo_Type_FirstSlot; virtualTime.TimingInfo.Slot.d = SlotTimingInfo_Type_FirstSlot;
...@@ -327,6 +326,7 @@ void *ss_eNB_vtp_process_itti_msg(void *notUsed) ...@@ -327,6 +326,7 @@ void *ss_eNB_vtp_process_itti_msg(void *notUsed)
case SS_UPD_TIM_INFO: case SS_UPD_TIM_INFO:
{ {
ss_set_timinfo_t tinfo; ss_set_timinfo_t tinfo;
tinfo.hsfn = SS_context.hsfn; //it is supposed that SS_UPD_TIM_INFO processed by eNB_sys task firstly
tinfo.sf = SS_UPD_TIM_INFO(received_msg).sf; tinfo.sf = SS_UPD_TIM_INFO(received_msg).sf;
tinfo.sfn = SS_UPD_TIM_INFO(received_msg).sfn; tinfo.sfn = SS_UPD_TIM_INFO(received_msg).sfn;
if(SS_UPD_TIM_INFO(received_msg).physCellId) { if(SS_UPD_TIM_INFO(received_msg).physCellId) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment