]> 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 307575637ee6ecae16d9ed17e09b6d7d1c830a78..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"
 
 int frescan_bwres_budget_change(frescan_request_data_t *req_data,
                                 frescan_node_t node,
@@ -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
@@ -206,8 +217,16 @@ int frescan_bwres_budget_change
         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;
 
-        if (mode_change_type == FRESCAN_SA_BUDGET_INC) {
+        is_increase = (mode_change_type & FRESCAN_SA_BUDGET_INC) ==
+                       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,6 +236,9 @@ 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;
@@ -224,12 +246,16 @@ int frescan_bwres_budget_change
                 server_params.prio   = vres->old_p;
 
                 if (node == me) {
-                        if (mode_change_type == FRESCAN_SA_BUDGET_INC) {
+                        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 {
+                                DEBUG(FRESCAN_MODECHANGE_ENABLE_DEBUG,
+                                      "Local: set perceived\n");
                                 ret = frescan_servers_set_perceived
                                      (req_data->net, &server_params, vres->ss);
                                 if (ret != 0) return ret;
@@ -237,18 +263,20 @@ int frescan_bwres_budget_change
                 } 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.request_node = node;
 
-                                if (mode_change_type == FRESCAN_SA_BUDGET_INC) {
+                                if (is_increase) {
                                         tmp_req_data.type =
                                                         FRESCAN_REP_INC_BUDGET;
                                 } else {
@@ -263,7 +291,7 @@ int frescan_bwres_budget_change
                 }
         }
 
-        if (mode_change_type == FRESCAN_SA_BUDGET_INC) return 0;
+        if (is_increase) return 0;
 
         if (node == me) {
                 ret = clock_gettime(CLOCK_MONOTONIC, &start_timestamp);