From 0778481f7577a64f20780821b0f1b3ba860e949d Mon Sep 17 00:00:00 2001
From: Robert Schmidt <robert.schmidt@eurecom.fr>
Date: Sat, 19 May 2018 18:24:25 +0200
Subject: [PATCH] FlexRAN RAN API: extend scheduler set&get functions

- setter & getter have been renamed
- setter sets scheduler name and links to the corresponding function
- it also returns whether it succeeded (whether the scheduler callback is
  non-null)
- it performs a strdup on the scheduler name
- the remove function free the scheduler function name
---
 openair2/ENB_APP/flexran_agent_ran_api.c | 25 ++++++++++++++----------
 openair2/ENB_APP/flexran_agent_ran_api.h |  8 ++++----
 2 files changed, 19 insertions(+), 14 deletions(-)

diff --git a/openair2/ENB_APP/flexran_agent_ran_api.c b/openair2/ENB_APP/flexran_agent_ran_api.c
index bea680c48c..4ab5858dda 100644
--- a/openair2/ENB_APP/flexran_agent_ran_api.c
+++ b/openair2/ENB_APP/flexran_agent_ran_api.c
@@ -26,6 +26,7 @@
  * \version 0.1
  */
 
+#include <dlfcn.h>
 #include "flexran_agent_ran_api.h"
 
 static inline int phy_is_present(mid_t mod_id, uint8_t cc_id)
@@ -1483,6 +1484,7 @@ int flexran_remove_dl_slice(mid_t mod_id, int slice_idx)
   slice_info_t *sli = &RC.mac[mod_id]->slice_info;
   if (sli->n_dl <= 1) return -1;
 
+  if (sli->dl[slice_idx].sched_name) free(sli->dl[slice_idx].sched_name);
   --sli->n_dl;
   /* move last element to the position of the removed one */
   if (slice_idx != sli->n_dl)
@@ -1701,16 +1703,17 @@ void flexran_set_dl_slice_accounting_policy(mid_t mod_id, int slice_idx, Protoco
   }
 }
 
-char *flexran_get_dl_slice_scheduler_name(mid_t mod_id, int slice_idx)
+char *flexran_get_dl_slice_scheduler(mid_t mod_id, int slice_idx)
 {
   if (!mac_is_present(mod_id)) return NULL;
   return RC.mac[mod_id]->slice_info.dl[slice_idx].sched_name;
 }
-void flexran_set_dl_slice_scheduler_name(mid_t mod_id, int slice_idx, char *name)
+int flexran_set_dl_slice_scheduler(mid_t mod_id, int slice_idx, char *name)
 {
-  if (!mac_is_present(mod_id)) return;
-  RC.mac[mod_id]->slice_info.dl[slice_idx].sched_name = name;
-  RC.mac[mod_id]->slice_info.dl[slice_idx].update_sched = 1;
+  if (!mac_is_present(mod_id)) return 0;
+  RC.mac[mod_id]->slice_info.dl[slice_idx].sched_name = strdup(name);
+  RC.mac[mod_id]->slice_info.dl[slice_idx].sched_cb = dlsym(NULL, name);
+  return RC.mac[mod_id]->slice_info.dl[slice_idx].sched_cb != NULL;
 }
 
 int flexran_create_ul_slice(mid_t mod_id, slice_id_t slice_id, int slice_default_values_idx)
@@ -1760,6 +1763,7 @@ int flexran_remove_ul_slice(mid_t mod_id, int slice_idx)
   slice_info_t *sli = &RC.mac[mod_id]->slice_info;
   if (sli->n_ul <= 1) return -1;
 
+  if (sli->dl[slice_idx].sched_name) free(sli->dl[slice_idx].sched_name);
   --sli->n_ul;
   /* move last element to the position of the removed one */
   if (slice_idx != sli->n_ul)
@@ -1832,14 +1836,15 @@ void flexran_set_ul_slice_maxmcs(mid_t mod_id, int slice_idx, int maxmcs)
   RC.mac[mod_id]->slice_info.ul[slice_idx].maxmcs = maxmcs;
 }
 
-char *flexran_get_ul_slice_scheduler_name(mid_t mod_id, int slice_idx)
+char *flexran_get_ul_slice_scheduler(mid_t mod_id, int slice_idx)
 {
   if (!mac_is_present(mod_id)) return NULL;
   return RC.mac[mod_id]->slice_info.ul[slice_idx].sched_name;
 }
-void flexran_set_ul_slice_scheduler_name(mid_t mod_id, int slice_idx, char *name)
+int flexran_set_ul_slice_scheduler(mid_t mod_id, int slice_idx, char *name)
 {
-  if (!mac_is_present(mod_id)) return;
-  RC.mac[mod_id]->slice_info.ul[slice_idx].sched_name = name;
-  RC.mac[mod_id]->slice_info.ul[slice_idx].update_sched = 1;
+  if (!mac_is_present(mod_id)) return 0;
+  RC.mac[mod_id]->slice_info.ul[slice_idx].sched_name = strdup(name);
+  RC.mac[mod_id]->slice_info.ul[slice_idx].sched_cb = dlsym(NULL, name);
+  return RC.mac[mod_id]->slice_info.ul[slice_idx].sched_cb != NULL;
 }
diff --git a/openair2/ENB_APP/flexran_agent_ran_api.h b/openair2/ENB_APP/flexran_agent_ran_api.h
index 18cd353f71..a959c4fd50 100644
--- a/openair2/ENB_APP/flexran_agent_ran_api.h
+++ b/openair2/ENB_APP/flexran_agent_ran_api.h
@@ -589,9 +589,9 @@ Protocol__FlexDlAccountingPolicy flexran_get_dl_slice_accounting_policy(mid_t mo
 void flexran_set_dl_slice_accounting_policy(mid_t mod_id, int slice_idx, Protocol__FlexDlAccountingPolicy accounting);
 
 /* Get the scheduler name for a slice in DL */
-char *flexran_get_dl_slice_scheduler_name(mid_t mod_id, int slice_idx);
+char *flexran_get_dl_slice_scheduler(mid_t mod_id, int slice_idx);
 /* Set the scheduler name for a slice in DL */
-void flexran_set_dl_slice_scheduler_name(mid_t mod_id, int slice_idx, char *name);
+int flexran_set_dl_slice_scheduler(mid_t mod_id, int slice_idx, char *name);
 
 /* Get the number of slices in UL */
 int flexran_get_num_ul_slices(mid_t mod_id);
@@ -653,6 +653,6 @@ void flexran_set_ul_slice_maxmcs(mid_t mod_id, int slice_idx, int maxmcs);
 /*void flexran_get_ul_slice_accounting_policy(mid_t mod_id, int slice_idx, Protocol__UlAccountingPolicy accountin);*/
 
 /* Get the scheduler name for a slice in UL */
-char *flexran_get_ul_slice_scheduler_name(mid_t mod_id, int slice_idx);
+char *flexran_get_ul_slice_scheduler(mid_t mod_id, int slice_idx);
 /* Set the scheduler name for a slice in UL */
-void flexran_set_ul_slice_scheduler_name(mid_t mod_id, int slice_idx, char *name);
+int flexran_set_ul_slice_scheduler(mid_t mod_id, int slice_idx, char *name);
-- 
GitLab