]> rtime.felk.cvut.cz Git - frescor/fna.git/blobdiff - src_frescan/frescan_bwres.c
changes until i get bwres_negotiate_in_slave and in_master work... TODO: test more...
[frescor/fna.git] / src_frescan / frescan_bwres.c
index 23bc3c9a18aa19d24e338e3411390bc425f52801..b3d02994ae16f56ccf386468b87fbad6ca44633b 100644 (file)
@@ -64,6 +64,7 @@
  *
  */
 
+#include "frsh.h"
 #include "frescan_bwres.h"
 #include "frescan_bwres_requests.h"
 #include "frescan_bwres_robjs.h"
 int frescan_bwres_init(frescan_network_t net)
 {
         int ret;
-        frescan_server_params_t  server_params;  // TODO: improve this...
-        frescan_bwres_sa_init_params_t init_params; // TODO: improve this...
+        frescan_node_t node;
+        frescan_ss_t neg_msg_ss_id;
+        frescan_server_params_t server_params;
+        frescan_bwres_sa_init_params_t init_params;
+        frsh_contract_t neg_msgs_contract;
+        frsh_rel_time_t neg_msgs_budget;
+        frsh_rel_time_t neg_msgs_period;
 
-        init_params.max_prio = 30;
-        init_params.min_prio = 1;
+        init_params.min_prio = FRESCAN_BWRES_SS_MIN_PRIO;
+        init_params.max_prio = FRESCAN_BWRES_SS_MAX_PRIO;
 
         if (frescan_data[net].local_node == FRESCAN_BWRES_MASTER_NODE) {
             ret = frescan_bwres_sa_init(&frescan_data[net].scenario,
                                         &init_params);
             if (ret != 0) return ret;
+
+            // Add contracts for the negotiation messages
+            ret = frsh_contract_init(&neg_msgs_contract);
+            if (ret != 0) return ret;
+
+            neg_msgs_budget = frsh_usec_to_rel_time(
+                                        (long)FRESCAN_FRAME_TX_TIME_US *
+                                              FRESCAN_BWRES_NEG_MSG_BUDGET);
+            neg_msgs_period = frsh_usec_to_rel_time(
+                                        (long)FRESCAN_BWRES_NEG_MSG_PERIOD);
+            ret = frsh_contract_set_preemption_level
+                                        (&neg_msgs_contract,
+                                         FRESCAN_BWRES_NEG_MSG_PRIO);
+            if (ret != 0) return ret;
+
+            ret = frsh_contract_set_basic_params(&neg_msgs_contract,
+                                                 &neg_msgs_budget,
+                                                 &neg_msgs_period,
+                                                 FRSH_WT_INDETERMINATE,
+                                                 FRSH_CT_REGULAR);
+            if (ret != 0) return ret;
+
+            for(node=0; node<FRESCAN_MX_NODES; node++) {
+                    ret = freelist_init(&frescan_data[net].scenario.
+                                                        ss_id_freelist[node],
+                                                        FRESCAN_MX_IDS);
+                    if (ret != 0) return ret;
+
+                    ret = freelist_alloc(&frescan_data[net].scenario.
+                                                        ss_id_freelist[node]);
+                    if (ret < 0) return -1;
+
+                    neg_msg_ss_id = (frescan_ss_t)ret;
+
+                    ret = frescan_bwres_sa_add_contract
+                                    (&frescan_data[net].scenario,
+                                     neg_msg_ss_id,
+                                     node,
+                                     &neg_msgs_contract);
+                    if (ret != 0) return ret;
+            }
         }
 
-        server_params.budget = 5;
-        server_params.period.tv_sec = 1;
-        server_params.period.tv_nsec = 0;
-        server_params.prio = FRESCAN_BWRES_NEG_MESSAGES_PRIO;
+        server_params.budget = FRESCAN_BWRES_NEG_MSG_BUDGET;
+        server_params.period = frsh_rel_time_to_timespec(
+                                        frsh_usec_to_rel_time(
+                                        (long)FRESCAN_BWRES_NEG_MSG_PERIOD));
+        server_params.prio   = FRESCAN_BWRES_NEG_MSG_PRIO;
 
         ret = frescan_servers_create(net, &server_params,
                                      &frescan_data[net].neg_messages_ss_id);
         if (ret != 0) return ret;
 
-        // TODO: we have to add this negotiation contracts to the sa table
-
         ret = frescan_bwres_robjs_init(FRESCAN_BWRES_ROBJS_MX_CEILING);
         if (ret != 0) return ret;
 
@@ -160,13 +206,45 @@ int frescan_bwres_group_change_mode_sync
         req_data->type         = FRESCAN_BWRES_REQ_GN;
         req_data->req          = req;
         req_data->request_node = frescan_data[net].local_node;
-        req_data->contracts_to_neg   = (frsh_contracts_group_t *)
-                                                        contracts_to_neg;
-        req_data->contracts_to_reneg = (frsh_contracts_group_t *)
-                                                        contracts_to_reneg;
-        req_data->ss_to_reneg        = (frescan_ss_group_t *)ss_to_reneg;
-        req_data->ss_to_cancel       = (frescan_ss_group_t *)ss_to_cancel;
-        req_data->ss_new             = ss_new;
+
+        if (contracts_to_neg == NULL) {
+                req_data->contracts_to_neg = &req_data->contracts_to_neg_data;
+                req_data->contracts_to_neg->size = 0;
+        } else {
+                req_data->contracts_to_neg =
+                                (frsh_contracts_group_t *)contracts_to_neg;
+        }
+
+        if (contracts_to_reneg == NULL) {
+                req_data->contracts_to_reneg = &req_data->
+                                                       contracts_to_reneg_data;
+                req_data->contracts_to_reneg->size = 0;
+        } else {
+                req_data->contracts_to_reneg = (frsh_contracts_group_t *)
+                                contracts_to_reneg;
+        }
+
+        if (ss_to_reneg == NULL) {
+                req_data->ss_to_reneg = &req_data->ss_to_reneg_data;
+                req_data->ss_to_reneg->size = 0;
+        } else {
+                req_data->ss_to_reneg = (frescan_ss_group_t *)ss_to_reneg;
+        }
+
+        if (ss_to_cancel == NULL) {
+                req_data->ss_to_cancel = &req_data->ss_to_cancel_data;
+                req_data->ss_to_cancel->size = 0;
+        } else {
+                req_data->ss_to_cancel = (frescan_ss_group_t *)ss_to_cancel;
+
+        }
+
+        if (ss_new == NULL) {
+                req_data->ss_new = &req_data->ss_new_data;
+                req_data->ss_new->size = 0;
+        } else {
+                req_data->ss_new = ss_new;
+        }
 
         ret = frescan_bwres_robjs_alloc(&req_data->robj, FRESCAN_BWRES_MX_PRIO);
         if (ret != 0) return ret;