*
*/
-#include "frescan_bwres_mode_change.h"
+#include <misc/linux_list.h>
+#include <stdbool.h>
+
#include "frescan_data.h"
#include "frescan_servers.h"
#include "frescan_bwres_messages.h"
-#include <misc/linux_list.h>
-
+#include "frescan_bwres_mode_change.h"
+#include "frescan_debug.h"
-static int frescan_bwres_budget_change(frescan_request_data_t *req_data,
+int frescan_bwres_budget_change(frescan_request_data_t *req_data,
frescan_node_t node,
frescan_sa_mode_change_type_t mode_change_type);
frsh_sa_time_t max_period_in_budget_inc;
struct timespec start_timestamp, next_activation;
+ DEBUG(FRESCAN_MODECHANGE_ENABLE_DEBUG, "starting mode change\n");
+
for(node=0; node<FRESCAN_MX_NODES; node++) {
INIT_LIST_HEAD(&the_networks[req_data->net].
mode_change_budget_inc_list_head[node]);
(&(vres->mode_change_list),
&(the_networks[req_data->net].
mode_change_budget_inc_list_head[vres->node]));
- } else {
+ } else if (sa_vres_data->c < vres->old_c) {
vres->mode_change_type |= FRESCAN_SA_BUDGET_DEC;
if (sa_vres_data->t > max_period_in_budget_dec) {
if (sa_vres_data->t > vres->old_t) {
vres->mode_change_type |= FRESCAN_SA_PERIOD_INC;
- } else {
+ } else if (sa_vres_data->t < vres->old_t) {
vres->mode_change_type |= FRESCAN_SA_PERIOD_DEC;
}
if (sa_vres_data->p > vres->old_p) {
vres->mode_change_type |= FRESCAN_SA_PRIO_INC;
- } else {
+ } else if (sa_vres_data->p < vres->old_p) {
vres->mode_change_type |= FRESCAN_SA_PRIO_DEC;
}
vres->old_c = sa_vres_data->c;
vres->old_t = sa_vres_data->t;
vres->old_p = sa_vres_data->p;
+
+ DEBUG(FRESCAN_MODECHANGE_ENABLE_DEBUG,
+ "vres: %u type: %X budget_change: %s\n",
+ vres->fsa_vres_global_id,
+ vres->mode_change_type,
+ ((vres->mode_change_type & FRESCAN_SA_BUDGET_INC) ==
+ FRESCAN_SA_BUDGET_INC) ? "inc" : "dec");
}
// 1.- mode change for B- members
return 0;
}
-static int frescan_bwres_budget_change
+int frescan_bwres_budget_change
(frescan_request_data_t *req_data,
frescan_node_t node,
frescan_sa_mode_change_type_t mode_change_type)
frescan_request_data_t tmp_req_data;
struct timespec start_timestamp, next_activation;
struct list_head *the_mode_change_list;
+ frescan_node_t me = the_networks[req_data->net].local_node;
+ bool is_increase;
+ is_increase = (mode_change_type & FRESCAN_SA_BUDGET_INC) ==
+ FRESCAN_SA_BUDGET_INC;
- if (mode_change_type == FRESCAN_SA_BUDGET_INC) {
+ DEBUG(FRESCAN_MODECHANGE_ENABLE_DEBUG,
+ "budget change node: %u (me: %u) type: '%s'\n",
+ node, me, is_increase ? "inc" : "dec");
+
+ if (is_increase) {
the_mode_change_list = &the_networks[req_data->net].
mode_change_budget_inc_list_head[node];
} else {
list_for_each_entry(vres, the_mode_change_list, mode_change_list)
{
+ DEBUG(FRESCAN_MODECHANGE_ENABLE_DEBUG,
+ "vres %u\n", vres->fsa_vres_global_id);
+
server_params.budget = frsh_rel_time_to_usec(
frsh_sa_time_to_rel_time(vres->old_c)) /
FRESCAN_FRAME_TX_TIME_US;
server_params.period = frsh_sa_time_to_rel_time(vres->old_t);
server_params.prio = vres->old_p;
- if (node == FRESCAN_NEG_MASTER_NODE) {
- if (mode_change_type == FRESCAN_SA_BUDGET_INC) {
- // Local: Update server
+ if (node == me) {
+ if (is_increase) {
+ DEBUG(FRESCAN_MODECHANGE_ENABLE_DEBUG,
+ "Local: update server\n");
ret = frescan_servers_update(req_data->net,
&server_params,
vres->ss);
if (ret != 0) return ret;
} else {
- // Local: Change perceived allocation
+ DEBUG(FRESCAN_MODECHANGE_ENABLE_DEBUG,
+ "Local: set perceived\n");
ret = frescan_servers_set_perceived
- (req_data->net,
- &server_params,
- vres->ss);
+ (req_data->net, &server_params, vres->ss);
if (ret != 0) return ret;
}
} else {
if ((node == req_data->request_node) &&
(vres->ss == req_data->ss)) {
- // External: send reply to reneg
+ DEBUG(FRESCAN_MODECHANGE_ENABLE_DEBUG,
+ "External: send reply to reneg\n");
req_data->type = FRESCAN_REP_NEG;
req_data->final_values = server_params;
ret = frescan_messages_send_request(req_data);
if (ret != 0) return -1;
} else {
- // External: send SC change update
+ DEBUG(FRESCAN_MODECHANGE_ENABLE_DEBUG,
+ "External: send SC change update\n");
tmp_req_data.net = req_data->net;
- tmp_req_data.type = mode_change_type;
tmp_req_data.request_node = node;
+ if (is_increase) {
+ tmp_req_data.type =
+ FRESCAN_REP_INC_BUDGET;
+ } else {
+ tmp_req_data.type =
+ FRESCAN_REP_DEC_BUDGET;
+ }
+
ret = frescan_messages_send_request
(&tmp_req_data);
if (ret != 0) return -1;
}
}
- if (mode_change_type == FRESCAN_SA_BUDGET_INC) return 0;
+ if (is_increase) return 0;
- if (node == FRESCAN_NEG_MASTER_NODE) {
+ if (node == me) {
ret = clock_gettime(CLOCK_MONOTONIC, &start_timestamp);
if (ret != 0) return -1;