From 772dc508e89bf334077d4c62a5767f768a97d161 Mon Sep 17 00:00:00 2001
From: Konstantinos Alexandris <konstantinos.alexandris@eurecom.fr>
Date: Wed, 24 Apr 2019 17:21:11 +0200
Subject: [PATCH] Fix: Segfault error, free properly measurement info struct,
 add rsrp/rsrq filter coefficient

---
 openair2/ENB_APP/flexran_agent_ran_api.c | 16 ++++++++++++++
 openair2/ENB_APP/flexran_agent_ran_api.h |  6 ++++++
 openair2/RRC/LTE/rrc_defs.h              |  4 +++-
 openair2/RRC/LTE/rrc_eNB.c               | 27 +++++++++++++-----------
 4 files changed, 40 insertions(+), 13 deletions(-)

diff --git a/openair2/ENB_APP/flexran_agent_ran_api.c b/openair2/ENB_APP/flexran_agent_ran_api.c
index fbda394db20..634dc775f17 100644
--- a/openair2/ENB_APP/flexran_agent_ran_api.c
+++ b/openair2/ENB_APP/flexran_agent_ran_api.c
@@ -1597,6 +1597,22 @@ long flexran_get_rrc_ocn(mid_t mod_id, rnti_t rnti, long cell_id) {
   return ue_context_p->ue_context.measurement_info->cellIndividualOffset[cell_id+1];
 }
 
+long flexran_get_filter_coeff_rsrp(mid_t mod_id, rnti_t rnti) {
+  if (!rrc_is_present(mod_id)) return -1;
+  struct rrc_eNB_ue_context_s* ue_context_p = rrc_eNB_get_ue_context(RC.rrc[mod_id], rnti);
+  if (!ue_context_p) return -1;
+  if (!ue_context_p->ue_context.measurement_info) return -1;
+  return ue_context_p->ue_context.measurement_info->filterCoefficientRSRP;
+}
+
+long flexran_get_filter_coeff_rsrq(mid_t mod_id, rnti_t rnti) {
+  if (!rrc_is_present(mod_id)) return -1;
+  struct rrc_eNB_ue_context_s* ue_context_p = rrc_eNB_get_ue_context(RC.rrc[mod_id], rnti);
+  if (!ue_context_p) return -1;
+  if (!ue_context_p->ue_context.measurement_info) return -1;
+  return ue_context_p->ue_context.measurement_info->filterCoefficientRSRQ;
+}
+
 /* Periodic event */
 
 long flexran_get_rrc_per_event_maxReportCells(mid_t mod_id, rnti_t rnti) {
diff --git a/openair2/ENB_APP/flexran_agent_ran_api.h b/openair2/ENB_APP/flexran_agent_ran_api.h
index 224b19a2646..4a65284cba9 100644
--- a/openair2/ENB_APP/flexran_agent_ran_api.h
+++ b/openair2/ENB_APP/flexran_agent_ran_api.h
@@ -570,6 +570,12 @@ long flexran_get_rrc_a3_event_a3_offset(mid_t mod_id, rnti_t rnti);
 /* Get A3 Event report on leave */
 int flexran_get_rrc_a3_event_reportOnLeave(mid_t mod_id, rnti_t rnti);
 
+/* Get filter coefficient for rsrp */
+long flexran_get_filter_coeff_rsrp(mid_t mod_id, rnti_t rnti);
+
+/* Get filter coefficient for rsrq */
+long flexran_get_filter_coeff_rsrq(mid_t mod_id, rnti_t rnti);
+
 /* Get number of PLMNs that is broadcasted in SIB1 */
 uint8_t flexran_get_rrc_num_plmn_ids(mid_t mod_id);
 
diff --git a/openair2/RRC/LTE/rrc_defs.h b/openair2/RRC/LTE/rrc_defs.h
index a7ec8cc567f..21feaf5e4c2 100644
--- a/openair2/RRC/LTE/rrc_defs.h
+++ b/openair2/RRC/LTE/rrc_defs.h
@@ -538,8 +538,10 @@ typedef struct EVENTS_s {
 typedef struct MEASUREMENT_INFO_s {
   //TODO: Extend to multiple meas objects for OFP/OFN offsets
   long  offsetFreq;
-  //TODO: extend to multiple cells for OCP/OCN offsets
+  //TODO: extend to multiple carriers for OCP/OCN offsets
   long cellIndividualOffset[MAX_NUM_NEIGH_CELLs+1];
+  long filterCoefficientRSRP;
+  long filterCoefficientRSRQ;
   EVENTS_t *events;
 } MEASUREMENT_INFO;
 
diff --git a/openair2/RRC/LTE/rrc_eNB.c b/openair2/RRC/LTE/rrc_eNB.c
index c09fd86bd88..37888c9716b 100644
--- a/openair2/RRC/LTE/rrc_eNB.c
+++ b/openair2/RRC/LTE/rrc_eNB.c
@@ -977,20 +977,16 @@ rrc_eNB_free_mem_UE_context(
     ue_context_pP->ue_context.handover_info = NULL;
   }
 
-  if (ue_context_pP->ue_context.measurement_info->events->a3_event) {
-    /* TODO: be sure free is enough here (check memory leaks) */
-    free(ue_context_pP->ue_context.measurement_info->events->a3_event);
-    ue_context_pP->ue_context.measurement_info->events->a3_event = NULL;
-  }
-
-  if (ue_context_pP->ue_context.measurement_info->events) {
-    /* TODO: be sure free is enough here (check memory leaks) */
-    free(ue_context_pP->ue_context.measurement_info->events);
-    ue_context_pP->ue_context.measurement_info->events = NULL;
-  }
-
   if (ue_context_pP->ue_context.measurement_info) {
     /* TODO: be sure free is enough here (check memory leaks) */
+    if (ue_context_pP->ue_context.measurement_info->events) {
+      if (ue_context_pP->ue_context.measurement_info->events->a3_event) {
+        free(ue_context_pP->ue_context.measurement_info->events->a3_event);
+        ue_context_pP->ue_context.measurement_info->events->a3_event = NULL;
+      }
+      free(ue_context_pP->ue_context.measurement_info->events);
+      ue_context_pP->ue_context.measurement_info->events = NULL;
+    }
     free(ue_context_pP->ue_context.measurement_info);
     ue_context_pP->ue_context.measurement_info = NULL;
   }
@@ -3486,6 +3482,9 @@ void rrc_eNB_generate_defaultRRCConnectionReconfiguration(const protocol_ctxt_t
   *quantityConfig->quantityConfigEUTRA->filterCoefficientRSRP = LTE_FilterCoefficient_fc4;
   *quantityConfig->quantityConfigEUTRA->filterCoefficientRSRQ = LTE_FilterCoefficient_fc4;
 
+  ue_context_pP->ue_context.measurement_info->filterCoefficientRSRP = *quantityConfig->quantityConfigEUTRA->filterCoefficientRSRP;
+  ue_context_pP->ue_context.measurement_info->filterCoefficientRSRQ = *quantityConfig->quantityConfigEUTRA->filterCoefficientRSRQ;
+
   /* Initialize NAS list */
   dedicatedInfoNASList = CALLOC(1, sizeof(struct LTE_RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList));
 
@@ -5542,6 +5541,10 @@ rrc_eNB_generate_HO_RRCConnectionReconfiguration(const protocol_ctxt_t *const ct
     CALLOC(1, sizeof(*(quantityConfig->quantityConfigEUTRA->filterCoefficientRSRQ)));
   *quantityConfig->quantityConfigEUTRA->filterCoefficientRSRP = LTE_FilterCoefficient_fc4;
   *quantityConfig->quantityConfigEUTRA->filterCoefficientRSRQ = LTE_FilterCoefficient_fc4;
+
+  ue_context_pP->ue_context.measurement_info->filterCoefficientRSRP = *quantityConfig->quantityConfigEUTRA->filterCoefficientRSRP;
+  ue_context_pP->ue_context.measurement_info->filterCoefficientRSRQ = *quantityConfig->quantityConfigEUTRA->filterCoefficientRSRQ;
+
   /* mobilityinfo  */
   mobilityInfo = ue_context_pP->ue_context.mobilityInfo;
 
-- 
GitLab