Commit e94b0bde authored by Robert Schmidt's avatar Robert Schmidt

FlexRAN fixes

* properly allocate memory for scheduler name/sorting
* free mem of sc_update, include todo for slice_config
* set has_x to one, add fct whether sorting update necessary
* set n_ul/n_dl to correct value after every loop iteration
* support for delete of multiple slices
* allocate memory for scheduler name in slice_config
* check that we really set the scheduler
parent 0c0e7b6e
...@@ -1405,40 +1405,67 @@ void flexran_create_config_structures(mid_t mod_id) ...@@ -1405,40 +1405,67 @@ void flexran_create_config_structures(mid_t mod_id)
void flexran_check_and_remove_slices(mid_t mod_id) void flexran_check_and_remove_slices(mid_t mod_id)
{ {
int i;
Protocol__FlexDlSlice **dl = sc_update[mod_id]->dl; Protocol__FlexDlSlice **dl = sc_update[mod_id]->dl;
size_t n_dl = sc_update[mod_id]->n_dl; Protocol__FlexDlSlice **dlreal = slice_config[mod_id]->dl;
for (i = 0; i < n_dl; i++) { int i = 0;
while (i < sc_update[mod_id]->n_dl) {
/* remove slices whose percentage is zero */ /* remove slices whose percentage is zero */
if (dl[i]->percentage > 0) continue; if (dl[i]->percentage > 0) {
++i;
continue;
}
if (flexran_remove_dl_slice(mod_id, i) < 1) { if (flexran_remove_dl_slice(mod_id, i) < 1) {
LOG_W(FLEXRAN_AGENT, "[%d] can not remove slice index %d ID %d\n", LOG_W(FLEXRAN_AGENT, "[%d] can not remove slice index %d ID %d\n",
mod_id, i, dl[i]->id); mod_id, i, dl[i]->id);
++i;
continue; continue;
} }
LOG_I(FLEXRAN_AGENT, "[%d] removed slice index %d ID %d\n", LOG_I(FLEXRAN_AGENT, "[%d] removed slice index %d ID %d\n",
mod_id, i, dl[i]->id); mod_id, i, dl[i]->id);
/* don't update slice_config, it will be read in below */ if (dl[i]->n_sorting > 0) free(dl[i]->sorting);
/* we need to memcpy the higher slice to the position we just deleted */ free(dl[i]->scheduler_name);
memcpy(dl[i], dl[n_dl-1], sizeof(*dl[n_dl-1])); if (dlreal[i]->n_sorting > 0) {
memset(dl[n_dl-1], 0, sizeof(*dl[n_dl-1])); dlreal[i]->n_sorting = 0;
free(dlreal[i]->sorting);
}
free(dlreal[i]->scheduler_name);
--sc_update[mod_id]->n_dl; --sc_update[mod_id]->n_dl;
--slice_config[mod_id]->n_dl;
const size_t last = sc_update[mod_id]->n_dl;
/* we need to memcpy the higher slice to the position we just deleted */
memcpy(dl[i], dl[last], sizeof(*dl[last]));
memset(dl[last], 0, sizeof(*dl[last]));
memcpy(dlreal[i], dlreal[last], sizeof(*dlreal[last]));
memset(dlreal[last], 0, sizeof(*dlreal[last]));
/* dont increase i but recheck the slice which has been copied to here */
} }
Protocol__FlexUlSlice **ul = sc_update[mod_id]->ul; Protocol__FlexUlSlice **ul = sc_update[mod_id]->ul;
size_t n_ul = sc_update[mod_id]->n_ul; Protocol__FlexUlSlice **ulreal = slice_config[mod_id]->ul;
for (i = 0; i < n_ul; i++) { i = 0;
if (ul[i]->percentage > 0) continue; while (i < sc_update[mod_id]->n_ul) {
if (ul[i]->percentage > 0) {
++i;
continue;
}
if (flexran_remove_ul_slice(mod_id, i) < 1) { if (flexran_remove_ul_slice(mod_id, i) < 1) {
LOG_W(FLEXRAN_AGENT, "[%d] can not remove slice index %d ID %d\n", LOG_W(FLEXRAN_AGENT, "[%d] can not remove slice index %d ID %d\n",
mod_id, i, ul[i]->id); mod_id, i, ul[i]->id);
++i;
continue; continue;
} }
LOG_I(FLEXRAN_AGENT, "[%d] removed slice index %d ID %d\n", LOG_I(FLEXRAN_AGENT, "[%d] removed slice index %d ID %d\n",
mod_id, i, ul[i]->id); mod_id, i, ul[i]->id);
/* see DL remarks */ free(ul[i]->scheduler_name);
memcpy(ul[i], ul[n_ul-1], sizeof(*ul[n_ul-1])); free(ulreal[i]->scheduler_name);
memset(ul[n_ul-1], 0, sizeof(*ul[n_ul-1]));
--sc_update[mod_id]->n_ul; --sc_update[mod_id]->n_ul;
--slice_config[mod_id]->n_ul;
const size_t last = sc_update[mod_id]->n_ul;
/* see DL remarks */
memcpy(ul[i], ul[last], sizeof(*ul[last]));
memset(ul[last], 0, sizeof(*ul[last]));
memcpy(ulreal[i], ulreal[last], sizeof(*ulreal[last]));
memset(ulreal[last], 0, sizeof(*ulreal[last]));
/* dont increase i but recheck the slice which has been copied to here */
} }
} }
...@@ -1480,12 +1507,13 @@ void flexran_agent_slice_update(mid_t mod_id) ...@@ -1480,12 +1507,13 @@ void flexran_agent_slice_update(mid_t mod_id)
/* create new DL and UL slices if necessary */ /* create new DL and UL slices if necessary */
for (i = slice_config[mod_id]->n_dl; i < sc_update[mod_id]->n_dl; i++) { for (i = slice_config[mod_id]->n_dl; i < sc_update[mod_id]->n_dl; i++) {
flexran_create_dl_slice(mod_id, sc_update[mod_id]->dl[i]->id); flexran_create_dl_slice(mod_id, sc_update[mod_id]->dl[i]->id);
slice_config[mod_id]->n_dl = flexran_get_num_dl_slices(mod_id);
} }
for (i = slice_config[mod_id]->n_ul; i < sc_update[mod_id]->n_ul; i++) { for (i = slice_config[mod_id]->n_ul; i < sc_update[mod_id]->n_ul; i++) {
flexran_create_ul_slice(mod_id, sc_update[mod_id]->ul[i]->id); flexran_create_ul_slice(mod_id, sc_update[mod_id]->ul[i]->id);
slice_config[mod_id]->n_ul = flexran_get_num_ul_slices(mod_id);
} }
slice_config[mod_id]->n_dl = flexran_get_num_dl_slices(mod_id);
slice_config[mod_id]->n_ul = flexran_get_num_ul_slices(mod_id);
changes += apply_new_slice_config(mod_id, slice_config[mod_id], sc_update[mod_id]);
for (i = 0; i < slice_config[mod_id]->n_dl; i++) { for (i = 0; i < slice_config[mod_id]->n_dl; i++) {
changes += apply_new_slice_dl_config(mod_id, changes += apply_new_slice_dl_config(mod_id,
slice_config[mod_id]->dl[i], slice_config[mod_id]->dl[i],
......
...@@ -969,7 +969,12 @@ void flexran_agent_read_slice_dl_config(mid_t mod_id, int slice_idx, Protocol__F ...@@ -969,7 +969,12 @@ void flexran_agent_read_slice_dl_config(mid_t mod_id, int slice_idx, Protocol__F
if (dl_slice->n_sorting < 1) dl_slice->sorting = NULL; if (dl_slice->n_sorting < 1) dl_slice->sorting = NULL;
dl_slice->accounting = flexran_get_dl_slice_accounting_policy(mod_id, slice_idx); dl_slice->accounting = flexran_get_dl_slice_accounting_policy(mod_id, slice_idx);
dl_slice->has_accounting = 1; dl_slice->has_accounting = 1;
dl_slice->scheduler_name = flexran_get_dl_slice_scheduler(mod_id, slice_idx); const char *s_name = flexran_get_dl_slice_scheduler(mod_id, slice_idx);
if (!dl_slice->scheduler_name
|| strcmp(dl_slice->scheduler_name, s_name) != 0) {
dl_slice->scheduler_name = realloc(dl_slice->scheduler_name, strlen(s_name) + 1);
strcpy(dl_slice->scheduler_name, s_name);
}
} }
void flexran_agent_read_slice_ul_config(mid_t mod_id, int slice_idx, Protocol__FlexUlSlice *ul_slice) void flexran_agent_read_slice_ul_config(mid_t mod_id, int slice_idx, Protocol__FlexUlSlice *ul_slice)
...@@ -1007,7 +1012,34 @@ void flexran_agent_read_slice_ul_config(mid_t mod_id, int slice_idx, Protocol__F ...@@ -1007,7 +1012,34 @@ void flexran_agent_read_slice_ul_config(mid_t mod_id, int slice_idx, Protocol__F
if (ul_slice->n_sorting < 1) ul_slice->sorting = NULL;*/ if (ul_slice->n_sorting < 1) ul_slice->sorting = NULL;*/
/*ul_slice->accounting = flexran_get_ul_slice_accounting_policy(mod_id, slice_idx);*/ /*ul_slice->accounting = flexran_get_ul_slice_accounting_policy(mod_id, slice_idx);*/
ul_slice->has_accounting = 0; ul_slice->has_accounting = 0;
ul_slice->scheduler_name = flexran_get_ul_slice_scheduler(mod_id, slice_idx); const char *s_name = flexran_get_ul_slice_scheduler(mod_id, slice_idx);
if (!ul_slice->scheduler_name
|| strcmp(ul_slice->scheduler_name, s_name) != 0) {
ul_slice->scheduler_name = realloc(ul_slice->scheduler_name, strlen(s_name) + 1);
strcpy(ul_slice->scheduler_name, s_name);
}
}
int check_dl_sorting_update(Protocol__FlexDlSlice *old, Protocol__FlexDlSlice *new)
{
/* sorting_update => true when old->n_sorting == 0 or different numbers of
* elements; otherwise will check * element-wise */
int sorting_update = old->n_sorting == 0 || (old->n_sorting != new->n_sorting);
for (int i = 0; i < old->n_sorting && !sorting_update; ++i) {
sorting_update = sorting_update || (new->sorting[i] != old->sorting[i]);
}
return sorting_update;
}
int check_ul_sorting_update(Protocol__FlexUlSlice *old, Protocol__FlexUlSlice *new)
{
/* sorting_update => true when old->n_sorting == 0 or different numbers of
* elements; otherwise will check * element-wise */
int sorting_update = old->n_sorting == 0 || (old->n_sorting != new->n_sorting);
for (int i = 0; i < old->n_sorting && !sorting_update; ++i) {
sorting_update = sorting_update || (new->sorting[i] != old->sorting[i]);
}
return sorting_update;
} }
void overwrite_slice_config_dl(Protocol__FlexDlSlice *exist, Protocol__FlexDlSlice *update) void overwrite_slice_config_dl(Protocol__FlexDlSlice *exist, Protocol__FlexDlSlice *update)
...@@ -1016,65 +1048,66 @@ void overwrite_slice_config_dl(Protocol__FlexDlSlice *exist, Protocol__FlexDlSli ...@@ -1016,65 +1048,66 @@ void overwrite_slice_config_dl(Protocol__FlexDlSlice *exist, Protocol__FlexDlSli
LOG_I(FLEXRAN_AGENT, "[DL slice %d] update label: %d -> %d\n", LOG_I(FLEXRAN_AGENT, "[DL slice %d] update label: %d -> %d\n",
update->id, exist->label, update->label); update->id, exist->label, update->label);
exist->label = update->label; exist->label = update->label;
exist->has_label = 1;
} }
if (update->percentage != exist->percentage) { if (update->percentage != exist->percentage) {
LOG_I(FLEXRAN_AGENT, "[DL slice %d] update percentage: %d -> %d\n", LOG_I(FLEXRAN_AGENT, "[DL slice %d] update percentage: %d -> %d\n",
update->id, exist->percentage, update->percentage); update->id, exist->percentage, update->percentage);
exist->percentage = update->percentage; exist->percentage = update->percentage;
exist->has_percentage = 1;
} }
if (update->isolation != exist->isolation) { if (update->isolation != exist->isolation) {
LOG_I(FLEXRAN_AGENT, "[DL slice %d] update isolation: %d -> %d\n", LOG_I(FLEXRAN_AGENT, "[DL slice %d] update isolation: %d -> %d\n",
update->id, exist->isolation, update->isolation); update->id, exist->isolation, update->isolation);
exist->isolation = update->isolation; exist->isolation = update->isolation;
exist->has_isolation = 1;
} }
if (update->priority != exist->priority) { if (update->priority != exist->priority) {
LOG_I(FLEXRAN_AGENT, "[DL slice %d] update priority: %d -> %d\n", LOG_I(FLEXRAN_AGENT, "[DL slice %d] update priority: %d -> %d\n",
update->id, exist->priority, update->priority); update->id, exist->priority, update->priority);
exist->priority = update->priority; exist->priority = update->priority;
exist->has_priority = 1;
} }
if (update->position_low != exist->position_low) { if (update->position_low != exist->position_low) {
LOG_I(FLEXRAN_AGENT, "[DL slice %d] update position_low: %d -> %d\n", LOG_I(FLEXRAN_AGENT, "[DL slice %d] update position_low: %d -> %d\n",
update->id, exist->position_low, update->position_low); update->id, exist->position_low, update->position_low);
exist->position_low = update->position_low; exist->position_low = update->position_low;
exist->has_position_low = 1;
} }
if (update->position_high != exist->position_high) { if (update->position_high != exist->position_high) {
LOG_I(FLEXRAN_AGENT, "[DL slice %d] update position_high: %d -> %d\n", LOG_I(FLEXRAN_AGENT, "[DL slice %d] update position_high: %d -> %d\n",
update->id, exist->position_high, update->position_high); update->id, exist->position_high, update->position_high);
exist->position_high = update->position_high; exist->position_high = update->position_high;
exist->has_position_high = 1;
} }
if (update->maxmcs != exist->maxmcs) { if (update->maxmcs != exist->maxmcs) {
LOG_I(FLEXRAN_AGENT, "[DL slice %d] update maxmcs: %d -> %d\n", LOG_I(FLEXRAN_AGENT, "[DL slice %d] update maxmcs: %d -> %d\n",
update->id, exist->maxmcs, update->maxmcs); update->id, exist->maxmcs, update->maxmcs);
exist->maxmcs = update->maxmcs; exist->maxmcs = update->maxmcs;
exist->has_maxmcs = 1;
} }
int sorting_update = 0; if (check_dl_sorting_update(exist, update)) {
int n = min(exist->n_sorting, update->n_sorting);
/* check whether something has changed. If update->n_sorting is 0,
* sorting_update will remain false, so no update will be done */
int i = 0;
while(i < n && !sorting_update) {
sorting_update = sorting_update || (update->sorting[i] != exist->sorting[i]);
i++;
}
if (sorting_update) {
LOG_I(FLEXRAN_AGENT, "[DL slice %d] update sorting array\n", update->id); LOG_I(FLEXRAN_AGENT, "[DL slice %d] update sorting array\n", update->id);
if (exist->n_sorting != update->n_sorting) if (exist->n_sorting != update->n_sorting) {
LOG_W(FLEXRAN_AGENT, "[slice %d] only writing %d elements\n", exist->n_sorting = update->n_sorting;
update->id, n); exist->sorting = realloc(exist->sorting, exist->n_sorting * sizeof(Protocol__FlexDlSorting));
for (int i = 0; i < n; i++) if (!exist->sorting) exist->n_sorting = 0;
}
for (int i = 0; i < exist->n_sorting; i++)
exist->sorting[i] = update->sorting[i]; exist->sorting[i] = update->sorting[i];
} }
if (update->accounting != exist->accounting) { if (update->accounting != exist->accounting) {
LOG_I(FLEXRAN_AGENT, "[DL slice %d] update accounting: %d -> %d\n", LOG_I(FLEXRAN_AGENT, "[DL slice %d] update accounting: %d -> %d\n",
update->id, exist->accounting, update->accounting); update->id, exist->accounting, update->accounting);
exist->accounting = update->accounting; exist->accounting = update->accounting;
exist->has_accounting = 1;
} }
if (!exist->scheduler_name if (!exist->scheduler_name
|| strcmp(update->scheduler_name, exist->scheduler_name) != 0) { || strcmp(update->scheduler_name, exist->scheduler_name) != 0) {
LOG_I(FLEXRAN_AGENT, "[DL slice %d] update scheduler: %s -> %s\n", LOG_I(FLEXRAN_AGENT, "[DL slice %d] update scheduler: %s -> %s\n",
update->id, exist->scheduler_name, update->scheduler_name); update->id, exist->scheduler_name, update->scheduler_name);
/* TODO dangerous? */ if (exist->scheduler_name) free(exist->scheduler_name);
exist->scheduler_name = update->scheduler_name; exist->scheduler_name = strdup(update->scheduler_name);
} }
} }
...@@ -1084,26 +1117,31 @@ void overwrite_slice_config_ul(Protocol__FlexUlSlice *exist, Protocol__FlexUlSli ...@@ -1084,26 +1117,31 @@ void overwrite_slice_config_ul(Protocol__FlexUlSlice *exist, Protocol__FlexUlSli
LOG_I(FLEXRAN_AGENT, "[UL slice %d] update label: %d -> %d\n", LOG_I(FLEXRAN_AGENT, "[UL slice %d] update label: %d -> %d\n",
update->id, exist->label, update->label); update->id, exist->label, update->label);
exist->label = update->label; exist->label = update->label;
exist->has_label = 1;
} }
if (update->percentage != exist->percentage) { if (update->percentage != exist->percentage) {
LOG_I(FLEXRAN_AGENT, "[UL slice %d] update percentage: %d -> %d\n", LOG_I(FLEXRAN_AGENT, "[UL slice %d] update percentage: %d -> %d\n",
update->id, exist->percentage, update->percentage); update->id, exist->percentage, update->percentage);
exist->percentage = update->percentage; exist->percentage = update->percentage;
exist->has_percentage = 1;
} }
if (update->isolation != exist->isolation) { if (update->isolation != exist->isolation) {
LOG_I(FLEXRAN_AGENT, "[UL slice %d] update isolation: %d -> %d\n", LOG_I(FLEXRAN_AGENT, "[UL slice %d] update isolation: %d -> %d\n",
update->id, exist->isolation, update->isolation); update->id, exist->isolation, update->isolation);
exist->isolation = update->isolation; exist->isolation = update->isolation;
exist->has_isolation = 1;
} }
if (update->priority != exist->priority) { if (update->priority != exist->priority) {
LOG_I(FLEXRAN_AGENT, "[UL slice %d] update priority: %d -> %d\n", LOG_I(FLEXRAN_AGENT, "[UL slice %d] update priority: %d -> %d\n",
update->id, exist->priority, update->priority); update->id, exist->priority, update->priority);
exist->priority = update->priority; exist->priority = update->priority;
exist->has_priority = 1;
} }
if (update->first_rb != exist->first_rb) { if (update->first_rb != exist->first_rb) {
LOG_I(FLEXRAN_AGENT, "[UL slice %d] update first_rb: %d -> %d\n", LOG_I(FLEXRAN_AGENT, "[UL slice %d] update first_rb: %d -> %d\n",
update->id, exist->first_rb, update->first_rb); update->id, exist->first_rb, update->first_rb);
exist->first_rb = update ->first_rb; exist->first_rb = update ->first_rb;
exist->has_first_rb = 1;
} }
/*if (update->lenght_rb != exist->lenght_rb) { /*if (update->lenght_rb != exist->lenght_rb) {
LOG_I(FLEXRAN_AGENT, "[UL slice %d] update lenght_rb: %d -> %d\n", LOG_I(FLEXRAN_AGENT, "[UL slice %d] update lenght_rb: %d -> %d\n",
...@@ -1114,11 +1152,11 @@ void overwrite_slice_config_ul(Protocol__FlexUlSlice *exist, Protocol__FlexUlSli ...@@ -1114,11 +1152,11 @@ void overwrite_slice_config_ul(Protocol__FlexUlSlice *exist, Protocol__FlexUlSli
LOG_I(FLEXRAN_AGENT, "[UL slice %d] update maxmcs: %d -> %d\n", LOG_I(FLEXRAN_AGENT, "[UL slice %d] update maxmcs: %d -> %d\n",
update->id, exist->maxmcs, update->maxmcs); update->id, exist->maxmcs, update->maxmcs);
exist->maxmcs = update->maxmcs; exist->maxmcs = update->maxmcs;
exist->has_maxmcs = 1;
} }
/* TODO
int sorting_update = 0; int sorting_update = 0;
int n = min(exist->n_sorting, update->n_sorting); int n = min(exist->n_sorting, update->n_sorting);
/* check whether something has changed. If update-> n_sorting is 0,
* sorting_update will remain false, so no update will be done */
int i = 0; int i = 0;
while (i < n && !sorting_update) { while (i < n && !sorting_update) {
sorting_update = sorting_update || (update->sorting[i] != exist->sorting[i]); sorting_update = sorting_update || (update->sorting[i] != exist->sorting[i]);
...@@ -1132,17 +1170,19 @@ void overwrite_slice_config_ul(Protocol__FlexUlSlice *exist, Protocol__FlexUlSli ...@@ -1132,17 +1170,19 @@ void overwrite_slice_config_ul(Protocol__FlexUlSlice *exist, Protocol__FlexUlSli
for (i = 0; i < n; i++) for (i = 0; i < n; i++)
exist->sorting[i] = update->sorting[i]; exist->sorting[i] = update->sorting[i];
} }
*/
if (update->accounting != exist->accounting) { if (update->accounting != exist->accounting) {
LOG_I(FLEXRAN_AGENT, "[UL slice %d] update accounting: %d -> %d\n", LOG_I(FLEXRAN_AGENT, "[UL slice %d] update accounting: %d -> %d\n",
update->id, exist->accounting, update->accounting); update->id, exist->accounting, update->accounting);
exist->accounting = update->accounting; exist->accounting = update->accounting;
exist->has_accounting = 1;
} }
if (!exist->scheduler_name if (!exist->scheduler_name
|| strcmp(update->scheduler_name, exist->scheduler_name) != 0) { || strcmp(update->scheduler_name, exist->scheduler_name) != 0) {
LOG_I(FLEXRAN_AGENT, "[UL slice %d] update scheduler: %s -> %s\n", LOG_I(FLEXRAN_AGENT, "[UL slice %d] update scheduler: %s -> %s\n",
update->id, exist->scheduler_name, update->scheduler_name); update->id, exist->scheduler_name, update->scheduler_name);
/* TODO dangerous? */ if (exist->scheduler_name) free(exist->scheduler_name);
exist->scheduler_name = update->scheduler_name; exist->scheduler_name = strdup(update->scheduler_name);
} }
} }
...@@ -1181,16 +1221,16 @@ void fill_dl_slice(mid_t mod_id, Protocol__FlexDlSlice *s, Protocol__FlexDlSlice ...@@ -1181,16 +1221,16 @@ void fill_dl_slice(mid_t mod_id, Protocol__FlexDlSlice *s, Protocol__FlexDlSlice
} }
if (s->n_sorting == 0) { if (s->n_sorting == 0) {
s->n_sorting = from ? from->n_sorting : sc_update[mod_id]->dl[0]->n_sorting; s->n_sorting = from ? from->n_sorting : sc_update[mod_id]->dl[0]->n_sorting;
/* TODO Dangerous? */ s->sorting = calloc(s->n_sorting, sizeof(Protocol__FlexDlSorting));
s->sorting = from ? from->sorting : sc_update[mod_id]->dl[0]->sorting; if (!s->sorting) s->n_sorting = 0;
for (int i = 0; i < s->n_sorting; ++i)
s->sorting[i] = from ? from->sorting[i] : sc_update[0]->dl[0]->sorting[i];
} }
if (!s->has_accounting) { if (!s->has_accounting) {
/* TODO Dangerous? */
s->accounting = from ? from->accounting : sc_update[mod_id]->dl[0]->accounting; s->accounting = from ? from->accounting : sc_update[mod_id]->dl[0]->accounting;
} }
if (!s->scheduler_name) { if (!s->scheduler_name) {
/* TODO Dangerous? */ s->scheduler_name = strdup(from ? from->scheduler_name : sc_update[mod_id]->dl[0]->scheduler_name);
s->scheduler_name = from ? from->scheduler_name : sc_update[mod_id]->dl[0]->scheduler_name;
} }
} }
...@@ -1248,16 +1288,16 @@ void fill_ul_slice(mid_t mod_id, Protocol__FlexUlSlice *s, Protocol__FlexUlSlice ...@@ -1248,16 +1288,16 @@ void fill_ul_slice(mid_t mod_id, Protocol__FlexUlSlice *s, Protocol__FlexUlSlice
} }
if (s->n_sorting == 0) { if (s->n_sorting == 0) {
s->n_sorting = from ? from->n_sorting : sc_update[0]->ul[0]->n_sorting; s->n_sorting = from ? from->n_sorting : sc_update[0]->ul[0]->n_sorting;
/* TODO Dangerous? */ s->sorting = calloc(s->n_sorting, sizeof(Protocol__FlexUlSorting));
s->sorting = from ? from->sorting : sc_update[0]->ul[0]->sorting; if (!s->sorting) s->n_sorting = 0;
for (int i = 0; i < s->n_sorting; ++i)
s->sorting[i] = from ? from->sorting[i] : sc_update[0]->ul[0]->sorting[i];
} }
if (!s->has_accounting) { if (!s->has_accounting) {
/* TODO Dangerous? */
s->accounting = from ? from->accounting : sc_update[0]->ul[0]->accounting; s->accounting = from ? from->accounting : sc_update[0]->ul[0]->accounting;
} }
if (!s->scheduler_name) { if (!s->scheduler_name) {
/* TODO Dangerous? */ s->scheduler_name = strdup(from ? from->scheduler_name : sc_update[mod_id]->ul[0]->scheduler_name);
s->scheduler_name = from ? from->scheduler_name : sc_update[mod_id]->ul[0]->scheduler_name;
} }
} }
...@@ -1374,7 +1414,6 @@ int apply_new_slice_dl_config(mid_t mod_id, Protocol__FlexDlSlice *oldc, Protoco ...@@ -1374,7 +1414,6 @@ int apply_new_slice_dl_config(mid_t mod_id, Protocol__FlexDlSlice *oldc, Protoco
* later when reading the configuration. There is thus a direct feedback * later when reading the configuration. There is thus a direct feedback
* whether it has been set. */ * whether it has been set. */
int changes = 0; int changes = 0;
int n;
int slice_idx = flexran_find_dl_slice(mod_id, newc->id); int slice_idx = flexran_find_dl_slice(mod_id, newc->id);
if (slice_idx < 0) { if (slice_idx < 0) {
LOG_W(FLEXRAN_AGENT, "cannot find index for slice ID %d\n", newc->id); LOG_W(FLEXRAN_AGENT, "cannot find index for slice ID %d\n", newc->id);
...@@ -1404,13 +1443,9 @@ int apply_new_slice_dl_config(mid_t mod_id, Protocol__FlexDlSlice *oldc, Protoco ...@@ -1404,13 +1443,9 @@ int apply_new_slice_dl_config(mid_t mod_id, Protocol__FlexDlSlice *oldc, Protoco
flexran_set_dl_slice_maxmcs(mod_id, slice_idx, newc->maxmcs); flexran_set_dl_slice_maxmcs(mod_id, slice_idx, newc->maxmcs);
changes++; changes++;
} }
n = min(oldc->n_sorting, newc->n_sorting); if (check_dl_sorting_update(oldc, newc)) {
for (int i = 0; i < n; i++) { flexran_set_dl_slice_sorting(mod_id, slice_idx, newc->sorting, newc->n_sorting);
if (oldc->sorting[i] != newc->sorting[i]) { changes++;
flexran_set_dl_slice_sorting(mod_id, slice_idx, newc->sorting, n);
changes++;
break;
}
} }
if (oldc->accounting != newc->accounting) { if (oldc->accounting != newc->accounting) {
flexran_set_dl_slice_accounting_policy(mod_id, slice_idx, newc->accounting); flexran_set_dl_slice_accounting_policy(mod_id, slice_idx, newc->accounting);
...@@ -1418,7 +1453,9 @@ int apply_new_slice_dl_config(mid_t mod_id, Protocol__FlexDlSlice *oldc, Protoco ...@@ -1418,7 +1453,9 @@ int apply_new_slice_dl_config(mid_t mod_id, Protocol__FlexDlSlice *oldc, Protoco
} }
if (!oldc->scheduler_name if (!oldc->scheduler_name
|| strcmp(oldc->scheduler_name, newc->scheduler_name) != 0) { || strcmp(oldc->scheduler_name, newc->scheduler_name) != 0) {
flexran_set_dl_slice_scheduler(mod_id, slice_idx, newc->scheduler_name); int ret = flexran_set_dl_slice_scheduler(mod_id, slice_idx, newc->scheduler_name);
AssertFatal(ret, "could not set DL slice scheduler for slice %d idx %d\n",
newc->id, slice_idx);
changes++; changes++;
} }
return changes; return changes;
...@@ -1430,7 +1467,6 @@ int apply_new_slice_ul_config(mid_t mod_id, Protocol__FlexUlSlice *oldc, Protoco ...@@ -1430,7 +1467,6 @@ int apply_new_slice_ul_config(mid_t mod_id, Protocol__FlexUlSlice *oldc, Protoco
* later when reading the configuration. There is thus a direct feedback * later when reading the configuration. There is thus a direct feedback
* whether it has been set. */ * whether it has been set. */
int changes = 0; int changes = 0;
int n;
int slice_idx = flexran_find_ul_slice(mod_id, newc->id); int slice_idx = flexran_find_ul_slice(mod_id, newc->id);
if (slice_idx < 0) { if (slice_idx < 0) {
LOG_W(FLEXRAN_AGENT, "cannot find index for slice ID %d\n", newc->id); LOG_W(FLEXRAN_AGENT, "cannot find index for slice ID %d\n", newc->id);
...@@ -1466,15 +1502,11 @@ int apply_new_slice_ul_config(mid_t mod_id, Protocol__FlexUlSlice *oldc, Protoco ...@@ -1466,15 +1502,11 @@ int apply_new_slice_ul_config(mid_t mod_id, Protocol__FlexUlSlice *oldc, Protoco
flexran_set_ul_slice_maxmcs(mod_id, slice_idx, newc->maxmcs); flexran_set_ul_slice_maxmcs(mod_id, slice_idx, newc->maxmcs);
changes++; changes++;
} }
n = min(oldc->n_sorting, newc->n_sorting); if (check_ul_sorting_update(oldc, newc)) {
for (int i = 0; i < n; i++) { /*flexran_set_ul_slice_sorting(mod_id, slice_idx, newc->sorting, n);
if (oldc->sorting[i] != newc->sorting[i]) { changes++;*/
/*flexran_set_ul_slice_sorting(mod_id, slice_idx, newc->sorting, n); LOG_W(FLEXRAN_AGENT, "[%d][UL slice %d] setting the sorting is not supported\n",
changes++;*/ mod_id, slice_idx);
LOG_W(FLEXRAN_AGENT, "[%d][UL slice %d] setting the sorting is not supported\n",
mod_id, slice_idx);
break;
}
} }
if (oldc->accounting != newc->accounting) { if (oldc->accounting != newc->accounting) {
/*flexran_set_ul_slice_accounting_policy(mod_id, slice_idx, newc->accounting); /*flexran_set_ul_slice_accounting_policy(mod_id, slice_idx, newc->accounting);
...@@ -1484,7 +1516,9 @@ int apply_new_slice_ul_config(mid_t mod_id, Protocol__FlexUlSlice *oldc, Protoco ...@@ -1484,7 +1516,9 @@ int apply_new_slice_ul_config(mid_t mod_id, Protocol__FlexUlSlice *oldc, Protoco
} }
if (!oldc->scheduler_name if (!oldc->scheduler_name
|| strcmp(oldc->scheduler_name, newc->scheduler_name) != 0) { || strcmp(oldc->scheduler_name, newc->scheduler_name) != 0) {
flexran_set_ul_slice_scheduler(mod_id, slice_idx, newc->scheduler_name); int ret = flexran_set_ul_slice_scheduler(mod_id, slice_idx, newc->scheduler_name);
AssertFatal(ret, "could not set DL slice scheduler for slice %d idx %d\n",
newc->id, slice_idx);
changes++; changes++;
} }
return changes; return changes;
......
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