Commit eacf5525 authored by Navid Nikaein's avatar Navid Nikaein

add ho stats

parent 080405f6
......@@ -48,6 +48,7 @@ typedef struct {
long long p_time; /*!< \brief absolute process duration */
long long diff_square; /*!< \brief process duration square */
long long max;
long long min;
int trials;
} time_stats_t;
#elif defined(__arm__)
......@@ -58,6 +59,7 @@ typedef struct {
uint32_t p_time; /*!< \brief absolute process duration */
uint32_t diff_square; /*!< \brief process duration square */
uint32_t max;
uint32_t min;
int trials;
} time_stats_t;
......@@ -124,9 +126,11 @@ static inline void stop_meas(time_stats_t *ts)
if ((out-ts->in) > ts->max)
ts->max = out-ts->in;
if ((out-ts->in) < ts->min)
ts->min = out-ts->in;
}
}
}
static inline void reset_meas(time_stats_t *ts) {
......@@ -136,7 +140,7 @@ static inline void reset_meas(time_stats_t *ts) {
ts->p_time=0;
ts->diff_square=0;
ts->max=0;
ts->min=0xFFFFFFFF;
}
static inline void copy_meas(time_stats_t *dst_ts,time_stats_t *src_ts)
......
......@@ -433,7 +433,11 @@ void mac_top_cleanup(void)
free(eNB_mac_inst);
}
rrc_top_cleanup();
free( Mac_rlc_xface);
}
int l2_init(LTE_DL_FRAME_PARMS *frame_parms,int eMBMS_active, char *uecap_xer,uint8_t cba_group_active, uint8_t HO_active)
......
......@@ -55,6 +55,8 @@
#include "COMMON/mac_rrc_primitives.h"
#include "LAYER2/MAC/defs.h"
//#include "PHY/TOOLS/time_meas.h"
#include "UTIL/LISTS/list.h"
//#include "COMMON/openair_defs.h"
#ifndef USER_MODE
#include <rtai.h>
......@@ -158,7 +160,7 @@ typedef enum UE_STATE_e {
RRC_SI_RECEIVED,
RRC_CONNECTED,
RRC_RECONFIGURED,
RRC_HO_EXECUTION
RRC_HO_EXECUTION // oai specific intermediate state == idle state
} UE_STATE_t;
typedef enum HO_STATE_e {
......@@ -363,6 +365,7 @@ typedef struct eNB_RRC_UE_s {
transport_layer_addr_t enb_gtp_addrs[S1AP_MAX_E_RAB];
rb_id_t enb_gtp_ebi[S1AP_MAX_E_RAB];
#endif
} eNB_RRC_UE_t;
typedef uid_t ue_uid_t;
......@@ -527,6 +530,13 @@ typedef struct UE_RRC_INST_s {
/* Used integrity/ciphering algorithms */
e_SecurityAlgorithmConfig__cipheringAlgorithm ciphering_algorithm;
e_SecurityAlgorithmConfig__integrityProtAlgorithm integrity_algorithm;
// X2 HO stats and measurments
uint8_t rrc_ue_do_meas; // flag to start the meas only once
time_stats_t rrc_ue_x2_src_enb; // form connected to idle : include x2 delay
struct list rrc_ue_x2_src_enb_list;
time_stats_t rrc_ue_x2_target_enb; // from idle to connected
struct list rrc_ue_x2_target_enb_list;
} UE_RRC_INST;
#include "proto.h"
......
......@@ -1967,14 +1967,19 @@ rrc_ue_decode_dcch(
eNB_indexP);
if (target_eNB_index != 0xFF) {
init_meas_timers(ctxt_pP); // Initialize handover measurement timers
UE_rrc_inst[ctxt_pP->module_id].rrc_ue_do_meas=0;
stop_meas(&UE_rrc_inst[ctxt_pP->module_id].rrc_ue_x2_src_enb);
double t_x2_src_enb = (double)UE_rrc_inst[ctxt_pP->module_id].rrc_ue_x2_src_enb.p_time/get_cpu_freq_GHz()/1000.0;
push_front(&UE_rrc_inst[ctxt_pP->module_id].rrc_ue_x2_src_enb_list, t_x2_src_enb);
start_meas(&UE_rrc_inst[ctxt_pP->module_id].rrc_ue_x2_target_enb);
init_meas_timers(ctxt_pP); // Initialize handover measurement timers
rrc_ue_generate_RRCConnectionReconfigurationComplete(
ctxt_pP,
target_eNB_index,
dl_dcch_msg->message.choice.c1.choice.rrcConnectionReconfiguration.rrc_TransactionIdentifier);
UE_rrc_inst[ctxt_pP->module_id].Info[eNB_indexP].State = RRC_HO_EXECUTION;
if(eNB_indexP!=target_eNB_index){
UE_rrc_inst[ctxt_pP->module_id].Info[target_eNB_index].State = RRC_RECONFIGURED;
UE_rrc_inst[ctxt_pP->module_id].Info[target_eNB_index].State = RRC_RECONFIGURED;
}
LOG_I(RRC, "[UE %d] State = RRC_RECONFIGURED during HO (eNB %d)\n",
ctxt_pP->module_id, target_eNB_index);
......@@ -3686,9 +3691,14 @@ void ue_measurement_report_triggering( const protocol_ctxt_t* const ctxt_pP, con
UE_rrc_inst[ctxt_pP->module_id].measReportList[i][j]->measId = UE_rrc_inst[ctxt_pP->module_id].MeasId[i][j]->measId;
UE_rrc_inst[ctxt_pP->module_id].measReportList[i][j]->numberOfReportsSent = 0;
rrc_ue_generate_MeasurementReport(
ctxt_pP,
eNB_index);
if (UE_rrc_inst[ctxt_pP->module_id].rrc_ue_do_meas == 0 ){
UE_rrc_inst[ctxt_pP->module_id].rrc_ue_do_meas = 1;
start_meas(&UE_rrc_inst[ctxt_pP->module_id].rrc_ue_x2_src_enb);
}
rrc_ue_generate_MeasurementReport(
ctxt_pP,
eNB_index);
//UE_rrc_inst[ctxt_pP->module_id].HandoverInfoUe.measFlag = 1;
LOG_I(RRC,"[UE %d] Frame %d: A3 event detected, state: %d \n",
ctxt_pP->module_id, ctxt_pP->frame, UE_rrc_inst[ctxt_pP->module_id].Info[0].State);
......
......@@ -82,7 +82,9 @@ openair_rrc_on(
} else {
LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" OPENAIR RRC IN....\n",
PROTOCOL_RRC_CTXT_ARGS(ctxt_pP));
reset_meas(&UE_rrc_inst[ctxt_pP->module_id].rrc_ue_x2_src_enb);
reset_meas(&UE_rrc_inst[ctxt_pP->module_id].rrc_ue_x2_target_enb);
for (i = 0; i < NB_eNB_INST; i++) {
LOG_D(RRC, PROTOCOL_RRC_CTXT_FMT" Activating CCCH (eNB %d)\n",
PROTOCOL_RRC_CTXT_ARGS(ctxt_pP), i);
......@@ -95,6 +97,7 @@ openair_rrc_on(
}
}
//-----------------------------------------------------------------------------
int
rrc_init_global_param(
......@@ -356,7 +359,30 @@ rrc_top_cleanup(
if (NB_eNB_INST > 0) {
free (eNB_rrc_inst);
}
uint8_t module_id=0;
LOG_I(RRC,"[SRC]median;q1;q3;min;max;\n");
for (module_id = 0; module_id < NB_UE_INST; module_id++) {
double x2_src_table[UE_rrc_inst[module_id].rrc_ue_x2_src_enb_list.size];
totable(x2_src_table, &UE_rrc_inst[module_id].rrc_ue_x2_src_enb_list);
qsort (x2_src_table, UE_rrc_inst[module_id].rrc_ue_x2_src_enb_list.size, sizeof(double), &compare);
// create stats
double x2_src_median = x2_src_table[UE_rrc_inst[module_id].rrc_ue_x2_src_enb_list.size/2];
double x2_src_q1 = x2_src_table[UE_rrc_inst[module_id].rrc_ue_x2_src_enb_list.size/4]; // Q1
double x2_src_q3 = x2_src_table[3*UE_rrc_inst[module_id].rrc_ue_x2_src_enb_list.size/4]; // Q3
LOG_I(RRC,"%lf;%lf;%lf;%d;%d;\n",x2_src_median,x2_src_q1,x2_src_q3,UE_rrc_inst[module_id].rrc_ue_x2_src_enb.min, UE_rrc_inst[module_id].rrc_ue_x2_src_enb.max);
}
LOG_I(RRC,"[DST]median;q1;q3;min;max;\n");
for (module_id = 0; module_id < NB_UE_INST; module_id++) {
double x2_target_table[UE_rrc_inst[module_id].rrc_ue_x2_target_enb_list.size];
totable(x2_target_table, &UE_rrc_inst[module_id].rrc_ue_x2_target_enb_list);
qsort (x2_target_table, UE_rrc_inst[module_id].rrc_ue_x2_target_enb_list.size, sizeof(double), &compare);
// create stats
double x2_target_median = x2_target_table[UE_rrc_inst[module_id].rrc_ue_x2_target_enb_list.size/2];
double x2_target_q1 = x2_target_table[UE_rrc_inst[module_id].rrc_ue_x2_target_enb_list.size/4]; // Q1
double x2_target_q3 = x2_target_table[3*UE_rrc_inst[module_id].rrc_ue_x2_target_enb_list.size/4]; // Q3
LOG_I(RRC,"%lf;%lf;%lf;%d;%d;\n",x2_target_median,x2_target_q1,x2_target_q3,UE_rrc_inst[module_id].rrc_ue_x2_target_enb.min, UE_rrc_inst[module_id].rrc_ue_x2_target_enb.max);
}
}
......
......@@ -4292,7 +4292,13 @@ rrc_eNB_decode_dcch(
rrcConnectionReconfigurationComplete.
criticalExtensions.choice.
rrcConnectionReconfigurationComplete_r8);
ue_context_p->ue_context.Status = RRC_RECONFIGURED;
if (ue_context_p->ue_context.Status == RRC_HO_EXECUTION){
stop_meas(&UE_rrc_inst[ctxt_pP->module_id].rrc_ue_x2_target_enb);
double t_x2_target_enb = (double)UE_rrc_inst[ctxt_pP->module_id].rrc_ue_x2_target_enb.p_time/get_cpu_freq_GHz()/1000.0;
push_front(&UE_rrc_inst[ctxt_pP->module_id].rrc_ue_x2_target_enb_list, t_x2_target_enb);
}
ue_context_p->ue_context.Status = RRC_RECONFIGURED;
LOG_I(RRC,
PROTOCOL_RRC_CTXT_UE_FMT" UE State = RRC_RECONFIGURED \n",
PROTOCOL_RRC_CTXT_UE_ARGS(ctxt_pP));
......
......@@ -281,7 +281,7 @@
</APPLICATION_CONFIG>
<EMULATION_CONFIG>
<EMULATION_TIME_ms>17000</EMULATION_TIME_ms>
<EMULATION_TIME_ms>6000</EMULATION_TIME_ms>
<CURVE>disable</CURVE> <!-- option: enabled, disabled. If CURVE is enabled, graphes
are ploted in real time (UL and DL) of WOD and throughput measurement for each packet -->
......
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