]> rtime.felk.cvut.cz Git - frescor/fna.git/blobdiff - src_frescan/frescan_bwres_mode_change.c
bug corrected: initialize the mode change list for local mode changes
[frescor/fna.git] / src_frescan / frescan_bwres_mode_change.c
index e4eb1a56136d2e37edb8b84948dd3e01f3ba6a1d..dd858e86f935552a275d2be0230568271c626514 100644 (file)
@@ -77,7 +77,8 @@
 
 static int frescan_bwres_send_mc_messages
                         (frescan_network_t net,
-                         frescan_bwres_mode_change_type_t mode_change_type);
+                         frescan_bwres_mode_change_type_t mode_change_type,
+                         frescan_ss_group_t *ss_to_cancel);
 
 /**
  * frescan_bwres_mode_change_protocol() - performs the mode change protocol
@@ -117,6 +118,16 @@ int frescan_bwres_mode_change_protocol(frescan_bwres_request_data_t *req_data)
                                                 [vres->fsa_vres_global_id];
                 vres->mode_change_type = 0;
 
+                if ((vres->old_c == 0) &&
+                    (vres->old_t == 0) &&
+                    (vres->old_p == 0)) {
+                        //new vres (transmitted in the reply message)
+                        vres->old_c = sa_vres_data->c;
+                        vres->old_t = sa_vres_data->t;
+                        vres->old_p = sa_vres_data->p;
+                        continue;
+                }
+
                 if (sa_vres_data->c > vres->old_c) {
                         vres->mode_change_type |= FRESCAN_BWRES_MC_BUDGET_INC;
                         if (sa_vres_data->t > max_period_in_budget_inc) {
@@ -163,11 +174,13 @@ int frescan_bwres_mode_change_protocol(frescan_bwres_request_data_t *req_data)
         DEBUG(FRESCAN_BWRES_MC_ENABLE_DEBUG, "2.- Budget decrease\n");
 
         ret = frescan_bwres_send_mc_messages(req_data->net,
-                                             FRESCAN_BWRES_MC_BUDGET_DEC);
+                                             FRESCAN_BWRES_MC_BUDGET_DEC,
+                                             req_data->ss_to_cancel);
         if (ret != 0) return -1;
 
         ret = frescan_bwres_mode_change_local(req_data->net,
-                                              FRESCAN_BWRES_MC_BUDGET_DEC);
+                                              FRESCAN_BWRES_MC_BUDGET_DEC,
+                                              req_data->ss_to_cancel);
         if (ret != 0) return -1;
 
         DEBUG(FRESCAN_BWRES_MC_ENABLE_DEBUG, "3.- Wait max_period\n");
@@ -190,11 +203,13 @@ int frescan_bwres_mode_change_protocol(frescan_bwres_request_data_t *req_data)
         DEBUG(FRESCAN_BWRES_MC_ENABLE_DEBUG, "4.- Budget increase\n");
 
         ret = frescan_bwres_send_mc_messages(req_data->net,
-                                             FRESCAN_BWRES_MC_BUDGET_INC);
+                                             FRESCAN_BWRES_MC_BUDGET_INC,
+                                             NULL);
         if (ret != 0) return -1;
 
         ret = frescan_bwres_mode_change_local(req_data->net,
-                                              FRESCAN_BWRES_MC_BUDGET_INC);
+                                              FRESCAN_BWRES_MC_BUDGET_INC,
+                                              NULL);
         if (ret != 0) return -1;
 
         return 0;
@@ -209,7 +224,8 @@ int frescan_bwres_mode_change_protocol(frescan_bwres_request_data_t *req_data)
 
 static int frescan_bwres_send_mc_messages
                         (frescan_network_t net,
-                         frescan_bwres_mode_change_type_t mode_change_type)
+                         frescan_bwres_mode_change_type_t mode_change_type,
+                         frescan_ss_group_t *ss_to_cancel)
 {
         int ret;
         frescan_node_t node;
@@ -229,6 +245,7 @@ static int frescan_bwres_send_mc_messages
                       "send MC message to node:%u\n", node);
 
                 tmp_req_data.request_node = node;
+                tmp_req_data.ss_to_cancel = ss_to_cancel;
 
                 ret = frescan_messages_send_request(&tmp_req_data);
                 if (ret != 0) return -1;
@@ -246,9 +263,10 @@ static int frescan_bwres_send_mc_messages
 
 int frescan_bwres_mode_change_local
                 (frescan_network_t net,
-                 frescan_bwres_mode_change_type_t mode_change_type)
+                 frescan_bwres_mode_change_type_t mode_change_type,
+                 frescan_ss_group_t *ss_to_cancel)
 {
-        int ret;
+        int ret, i;
         frescan_server_params_t server_params;
         frescan_bwres_vres_t *vres;
         struct timespec start_timestamp, next_activation;
@@ -286,6 +304,20 @@ int frescan_bwres_mode_change_local
 
         if (mode_change_type == FRESCAN_BWRES_MC_BUDGET_INC) return 0;
 
+        // for ss cancelled set the perceived capacity to cero
+        if (ss_to_cancel != NULL) {
+                for(i=0; i<ss_to_cancel->size; i++) {
+                        server_params.budget = 0;
+                        server_params.period = frsh_usec_to_rel_time(0);
+                        server_params.prio   = 0;
+                        ret = frescan_servers_set_perceived
+                                                        (net,
+                                                        &server_params,
+                                                        ss_to_cancel->ss[i]);
+                        if (ret != 0) return ret;
+                }
+        }
+
         ret = clock_gettime(CLOCK_MONOTONIC, &start_timestamp);
         if (ret != 0) return -1;
 
@@ -314,5 +346,13 @@ int frescan_bwres_mode_change_local
                 if (ret != 0) return ret;
         }
 
+        if (ss_to_cancel != NULL) {
+                for(i=0; i<ss_to_cancel->size; i++) {
+                        ret = frescan_servers_destroy
+                                        (net, ss_to_cancel->ss[i]);
+                        if (ret != 0) return ret;
+                }
+        }
+
         return 0;
 }