]> rtime.felk.cvut.cz Git - frescor/fna.git/blobdiff - src_frescan/frescan_bwres_mode_change.c
tested negotiation in master.. TODO: check if the waiting time of the mode change...
[frescor/fna.git] / src_frescan / frescan_bwres_mode_change.c
index fa5d88d7619825d6d4989c9e879c85b541b10ab8..0bfb7e989c9052c45689269e798521ee9d7b2930 100644 (file)
  *
  */
 
-#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);
 
@@ -93,6 +95,8 @@ int frescan_bwres_mode_change_protocol(frescan_request_data_t *req_data)
         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]);
@@ -126,7 +130,7 @@ int frescan_bwres_mode_change_protocol(frescan_request_data_t *req_data)
                             (&(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) {
@@ -141,19 +145,26 @@ int frescan_bwres_mode_change_protocol(frescan_request_data_t *req_data)
 
                 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
@@ -194,7 +205,7 @@ int frescan_bwres_mode_change_protocol(frescan_request_data_t *req_data)
         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)
@@ -205,9 +216,17 @@ static int frescan_bwres_budget_change
         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 {
@@ -217,42 +236,54 @@ static int frescan_bwres_budget_change
 
         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;
@@ -260,9 +291,9 @@ static int frescan_bwres_budget_change
                 }
         }
 
-        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;