]> rtime.felk.cvut.cz Git - frescor/fna.git/commitdiff
changes until i get bwres_negotiate_in_slave and in_master work... TODO: test more...
authorsangorrin <sangorrin@35b4ef3e-fd22-0410-ab77-dab3279adceb>
Thu, 20 Nov 2008 10:45:40 +0000 (10:45 +0000)
committersangorrin <sangorrin@35b4ef3e-fd22-0410-ab77-dab3279adceb>
Thu, 20 Nov 2008 10:45:40 +0000 (10:45 +0000)
git-svn-id: http://www.frescor.org/private/svn/frescor/fna/trunk@1405 35b4ef3e-fd22-0410-ab77-dab3279adceb

18 files changed:
src/fna_configuration.c
src_frescan/frescan_bwres.c
src_frescan/frescan_bwres_analysis.c
src_frescan/frescan_bwres_messages.c
src_frescan/frescan_bwres_mode_change.c
src_frescan/frescan_bwres_mode_change.h
src_frescan/frescan_bwres_threads.c
src_frescan/frescan_config.h
src_frescan/frescan_debug.h
src_frescan/frescan_types.h
tests/tests_frescan/test_frescan_bwres_init.c
tests/tests_frescan/test_frescan_bwres_negotiate_in_master.c
tests/tests_frescan/test_frescan_bwres_negotiate_in_slave.c
tests/tests_frescan/test_frescan_bwres_robjs_timedwait.c
tests/tests_frescan/test_frescan_bwres_robjs_wait.c
tests/tests_frescan/test_frescan_fp_send_basic.c
tests/tests_frescan/test_frescan_init.c
tests/tests_frescan/test_frescan_queues.c

index ed323174eb07890d6d332d094358c4fc597f4960..656f9c652de7f4cbb373b533013baf81cce621f1 100644 (file)
 #endif
 
 fna_operations_t  *fna_operations[FNA_MAX_NETWORKS] = {
-#ifdef RTEP_FNA_ENABLED
-        &rtep_fna_operations,
+#ifdef FRESCAN_FNA_ENABLED
+        &frescan_fna_operations,
 #else
         NULL,
 #endif
-#ifdef FRESCAN_FNA_ENABLED
-        &frescan_fna_operations,
+#ifdef RTEP_FNA_ENABLED
+        &rtep_fna_operations,
 #else
-       NULL,
+        NULL,
 #endif
 #ifdef UNIX_FNA_ENABLED
         &unix_fna_operations,
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;
index c77d616b66c05e5546ebc29cb9d6126afc871496..448ac552850c8d4539bcf34239299e0fff249b79 100644 (file)
@@ -97,8 +97,8 @@ int frescan_bwres_sa_init(frescan_bwres_sa_scenario_t          *scenario,
                             FRESCAN_MX_NODES*FRESCAN_MX_IDS);
         if (ret != 0) return ret;
 
-        fsa_scenario_init_data.min_priority = 1;
-        fsa_scenario_init_data.max_priority = 15;
+        fsa_scenario_init_data.min_priority = params->min_prio;
+        fsa_scenario_init_data.max_priority = params->max_prio;
         fsa_scenario_init_data.ovhd_data.np =
                         frsh_rel_time_to_sa_time(frsh_usec_to_rel_time(0));
 
@@ -127,6 +127,9 @@ int frescan_bwres_sa_add_contract(frescan_bwres_sa_scenario_t *scenario,
         sa_vres->contract = *contract;
         sa_vres->node     = node;
         sa_vres->ss       = ss;
+        sa_vres->old_c    = 0;
+        sa_vres->old_t    = 0;
+        sa_vres->old_p    = 0;
 
         ret = freelist_alloc(&scenario->fsa_vres_global_id_freelist);
         if (ret < 0) return -1;
index 7bef5f0de4275783142796d5e4aa714b4f3a7e14..169a49c4ad3140567292704afc70877596ab1e9a 100644 (file)
@@ -69,6 +69,7 @@
 #include "frescan_bwres_messages.h"
 #include "frescan_bwres_requests.h"
 #include "frescan.h"
+#include "frescan_servers.h"
 #include "frescan_data.h"
 #include "frescan_config.h"
 #include "frescan_debug.h"
@@ -88,13 +89,13 @@ int frescan_messages_init(frescan_network_t net)
         DEBUG(FRESCAN_BWRES_MESSAGES_ENABLE_DEBUG, "initialization\n");
 
         send_params[net].net     = net;
-        send_params[net].channel = FRESCAN_BWRES_NEG_CHANNEL;
+        send_params[net].channel = FRESCAN_BWRES_NEG_MSG_CHAN;
         send_params[net].flags   = FRESCAN_SS | FRESCAN_ASYNC;
         send_params[net].ss      = frescan_data[net].neg_messages_ss_id;
         send_params[net].to      = FRESCAN_BWRES_MASTER_NODE;
 
         recv_params[net].net     = net;
-        recv_params[net].channel = FRESCAN_BWRES_NEG_CHANNEL;
+        recv_params[net].channel = FRESCAN_BWRES_NEG_MSG_CHAN;
         recv_params[net].flags   = FRESCAN_SYNC;
 
         return 0;
@@ -134,7 +135,7 @@ static int frescan_request_to_gn_message
 
         // NEG-GROUP
         DEBUG(FRESCAN_BWRES_MESSAGES_ENABLE_DEBUG,
-              "NEG-GROUP num contracts:%u\n", data->contracts_to_neg->size);
+              "NEG-GROUP num contracts:%d\n", data->contracts_to_neg->size);
 
         *((uint8_t *)msg) = (uint8_t)data->contracts_to_neg->size;
         bytes_written = sizeof(uint8_t);
@@ -164,7 +165,7 @@ static int frescan_request_to_gn_message
 
         // RENEG-GROUP
         DEBUG(FRESCAN_BWRES_MESSAGES_ENABLE_DEBUG,
-              "RENEG-GROUP num contracts:%u\n",data->contracts_to_reneg->size);
+              "RENEG-GROUP num contracts:%d\n",data->contracts_to_reneg->size);
 
         *((uint8_t *)msg) = (uint8_t)data->contracts_to_reneg->size;
         bytes_written = sizeof(uint8_t);
@@ -198,7 +199,7 @@ static int frescan_request_to_gn_message
         }
 
         // CANCEL-GROUP
-        DEBUG(FRESCAN_BWRES_MESSAGES_ENABLE_DEBUG, "CANCEL-GROUP num ss:%u\n",
+        DEBUG(FRESCAN_BWRES_MESSAGES_ENABLE_DEBUG, "CANCEL-GROUP num ss:%d\n",
               data->ss_to_cancel->size);
 
         *((uint8_t *)msg) = (uint8_t)data->ss_to_cancel->size;
@@ -473,8 +474,10 @@ static int frescan_request_to_rep_gn_message
                          uint8_t *msg,
                          size_t  *size)
 {
+        int i;
         uint8_t *msg_begin;
         size_t bytes_written;
+        frescan_bwres_vres_t *vres;
 
         msg_begin = msg;
 
@@ -493,6 +496,33 @@ static int frescan_request_to_rep_gn_message
         bytes_written = sizeof(uint8_t);
         msg = msg + bytes_written;
 
+        if (data->return_value == FRESCAN_BWRES_REQ_ACCEPTED) {
+                // new ss values
+                for(i=0; i<data->contracts_to_neg->size; i++) {
+                        // SS
+                        *((uint16_t *)msg) = data->ss_new->ss[i];
+                        bytes_written = sizeof(uint16_t);
+                        msg = msg + bytes_written;
+
+                        // B - T - P
+                        vres = &frescan_data[data->net].scenario.
+                                                vres_pool[data->request_node]
+                                                         [data->ss_new->ss[i]];
+
+                        *((frsh_sa_time_t *)msg) = vres->old_c;
+                        bytes_written = sizeof(frsh_sa_time_t);
+                        msg = msg + bytes_written;
+
+                        *((frsh_sa_time_t *)msg) = vres->old_t;
+                        bytes_written = sizeof(frsh_sa_time_t);
+                        msg = msg + bytes_written;
+
+                        *((frsh_sa_prio_t *)msg) = vres->old_p;
+                        bytes_written = sizeof(frsh_sa_prio_t);
+                        msg = msg + bytes_written;
+                }
+        }
+
         *size = msg - msg_begin;
 
         DEBUG(FRESCAN_BWRES_MESSAGES_ENABLE_DEBUG, "size:%u\n", *size);
@@ -505,8 +535,11 @@ static int frescan_rep_gn_message_to_request
                                          frescan_bwres_request_data_t *data,
                                          size_t size)
 {
+        int ret;
         uint8_t *msg;
         size_t bytes_read;
+        frescan_ss_t ss;
+        frescan_server_params_t server_params;
 
         msg = (uint8_t *)msg_to_parse;
 
@@ -520,6 +553,46 @@ static int frescan_rep_gn_message_to_request
         bytes_read = sizeof(uint8_t);
         msg = msg + bytes_read;
 
+        // create the new sporadic servers
+        data->ss_new->size = 0;
+
+        while(msg < msg_to_parse + size) {
+                // SS
+                data->ss_new->ss[data->ss_new->size] = *((uint16_t *)msg);
+                bytes_read = sizeof(uint16_t);
+                msg = msg + bytes_read;
+
+                // Budget
+                server_params.budget =
+                        frsh_rel_time_to_usec
+                        (frsh_sa_time_to_rel_time(*((frsh_sa_time_t *)msg))) /
+                                                FRESCAN_FRAME_TX_TIME_US;
+                bytes_read = sizeof(frsh_sa_time_t);
+                msg = msg + bytes_read;
+
+                // Period
+                server_params.period = frsh_sa_time_to_rel_time
+                                                (*((frsh_sa_time_t *)msg));
+                bytes_read = sizeof(frsh_sa_time_t);
+                msg = msg + bytes_read;
+
+                // Prio
+                server_params.prio = *((frsh_sa_prio_t *)msg);
+                bytes_read = sizeof(frsh_sa_prio_t);
+                msg = msg + bytes_read;
+
+                // Create server
+                ret = frescan_servers_create(data->net, &server_params, &ss);
+                if (ret != 0) return ret;
+
+                if (ss != data->ss_new->ss[data->ss_new->size]) {
+                        FRESCAN_ERROR("ss from master != ss created\n");
+                        return -1;
+                }
+
+                data->ss_new->size++;
+        }
+
         return 0;
 }
 
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;
 }
index 9e635d52c54a090b39bad0b502640b6b110450c1..59e6bb763d6170c430b9ad6d7d8a48e0d6c465e4 100644 (file)
@@ -89,6 +89,7 @@ extern int frescan_bwres_mode_change_protocol
 
 extern 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);
 
 #endif // _FRESCAN_BWRES_MODE_CHANGE_H_
index 38bcc21f535b0fd77157962bb3df874a555057d2..a33b36db54eb6f8e1d90f61103d7041ec32ca3c9 100644 (file)
@@ -231,10 +231,13 @@ static void *frescan_acceptor_thread(void *arg)
 
 static void frescan_manager_req_gn(frescan_bwres_request_data_t *req_data)
 {
-        int ret;
+        int ret, i;
         frescan_node_t me;
         bool accepted;
         frescan_bwres_sa_scenario_t *scenario;
+        frescan_ss_t ss;
+        frescan_server_params_t server_params;
+        frescan_bwres_vres_t *vres;
 
         me = frescan_data[req_data->net].local_node;
 
@@ -274,6 +277,28 @@ static void frescan_manager_req_gn(frescan_bwres_request_data_t *req_data)
         }
 
         if (req_data->request_node == me) {
+                // create servers for new contracts
+                for(i=0; i<req_data->contracts_to_neg->size; i++) {
+                        vres = &frescan_data[req_data->net].scenario.
+                                        vres_pool[me]
+                                                 [req_data->ss_new->ss[i]];
+
+                        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;
+
+                        // Create server
+                        ret = frescan_servers_create(req_data->net,
+                                                     &server_params,
+                                                     &ss);
+                        assert(ret == 0);
+                        assert (req_data->ss_new->ss[i] == ss);
+                }
+
                 DEBUG(FRESCAN_BWRES_MANAGER_ENABLE_DEBUG, "signal robj\n");
                 ret = frescan_bwres_robjs_signal(req_data->robj);
                 assert(ret == 0);
@@ -294,19 +319,14 @@ static void frescan_manager_gn_prepare_scenario
                                  frescan_bwres_request_data_t *req_data)
 {
         int ret, i;
-        frescan_server_params_t server_params;
 
         // NEG-GROUP
-        server_params.budget         = 0;
-        server_params.period.tv_sec  = 0;
-        server_params.period.tv_nsec = 0;
-        server_params.prio           = 0;
-
         for(i=0; i<req_data->contracts_to_neg->size; i++) {
-                ret = frescan_servers_create(req_data->net,
-                                             &server_params,
-                                             &req_data->ss_new->ss[i]);
-                assert(ret == 0);
+                ret = freelist_alloc(&frescan_data[req_data->net].scenario.
+                                      ss_id_freelist[req_data->request_node]);
+                assert(ret >= 0);
+
+                req_data->ss_new->ss[i] = (frescan_ss_t)ret;
 
                 ret = frescan_bwres_sa_add_contract
                                 (scenario,
@@ -363,8 +383,9 @@ static void frescan_manager_gn_restore_scenario
                                  NULL);
                 assert(ret == 0);
 
-                ret = frescan_servers_destroy(req_data->net,
-                                              req_data->ss_new->ss[i]);
+                ret = freelist_free(&frescan_data[req_data->net].scenario.
+                                        ss_id_freelist[req_data->request_node],
+                                    req_data->ss_new->ss[i]);
                 assert(ret == 0);
         }
 
@@ -396,18 +417,24 @@ static void frescan_manager_gn_restore_scenario
 
 static void frescan_manager_rep_gn(frescan_bwres_request_data_t *req_data)
 {
-        int ret;
-        frescan_bwres_request_data_t *orig_req_data;
+        int ret, i;
+        frescan_bwres_request_data_t *caller_req;
 
-        ret = frescan_bwres_requests_get_data(req_data->req, &orig_req_data);
+        ret = frescan_bwres_requests_get_data(req_data->req, &caller_req);
         assert(ret == 0);
 
         DEBUG(FRESCAN_BWRES_MANAGER_ENABLE_DEBUG,
               "reply to gn, return value:%d\n", req_data->return_value);
 
-        orig_req_data->return_value = req_data->return_value;
+        caller_req->return_value = req_data->return_value;
+
+        assert (req_data->ss_new->size == caller_req->contracts_to_neg->size);
+
+        for (i=0; i<req_data->ss_new->size; i++) {
+                caller_req->ss_new->ss[i] = req_data->ss_new->ss[i];
+        }
 
-        ret = frescan_bwres_robjs_signal(orig_req_data->robj);
+        ret = frescan_bwres_robjs_signal(caller_req->robj);
         assert(ret == 0);
 }
 
@@ -420,6 +447,7 @@ static void frescan_manager_req_mc(frescan_bwres_request_data_t *req_data)
         int ret;
 
         ret = frescan_bwres_mode_change_local(req_data->net,
-                                              req_data->mode_change_type);
+                                              req_data->mode_change_type,
+                                              req_data->ss_to_cancel);
         assert(ret == 0);
 }
index 45af9236bc7f2b12b022af20f44625c9a0bfde21..8a232457de47b5ed578f81388ef81d7318b755db 100644 (file)
@@ -78,8 +78,8 @@
 #define FRESCAN_BROADCAST_ADDR    0xF
 #define FRESCAN_MX_IDS            255
 #define FRESCAN_MX_PRIOS          32
-#define FRESCAN_REPL_SIGNAL_NUM   FOSA_SIGNAL_MIN + 10 // real-time signal
 #define FRESCAN_BACKGROUND_PRIO   0
+#define FRESCAN_REPL_SIGNAL_NUM   FOSA_SIGNAL_MIN + 10 // real-time signal
 #define FRESCAN_REPL_THREAD_PRIO  60
 #define FRESCAN_MX_NODES          2
 #define FRESCAN_MX_REPL_OPS       FRESCAN_MX_IDS*10
 #define FRESCAN_BWRES_MX_PRIO           60
 #define FRESCAN_BWRES_NEG_THREAD_PRIO   50
 #define FRESCAN_BWRES_ACCEPTOR_PRIO     FRESCAN_BWRES_NEG_THREAD_PRIO - 1
-#define FRESCAN_BWRES_NEG_MESSAGES_PRIO 8
-#define FRESCAN_BWRES_NEG_CHANNEL       0
+#define FRESCAN_BWRES_NEG_MSG_PRIO      8
+#define FRESCAN_BWRES_NEG_MSG_BUDGET    5 // packets
+#define FRESCAN_BWRES_NEG_MSG_PERIOD    1000000 // us
+#define FRESCAN_BWRES_NEG_MSG_CHAN      0
 #define FRESCAN_BWRES_MX_CONTRACTS      (FRESCAN_MX_NODES*FRESCAN_MX_IDS)
 #define FRESCAN_BWRES_MAX_GROUP_OPS     5
+#define FRESCAN_BWRES_SS_MIN_PRIO       1
+#define FRESCAN_BWRES_SS_MAX_PRIO       FRESCAN_MX_PRIOS
 
 // FRESCAN_FRAME_TX_TIME_US: measured transmission time of an 8byte frame
 #define FRESCAN_FRAME_TX_TIME_US        200
index 0f2222b373e1fc973d3373868bf60fc1106c136b..3d0bf4158e523ffc1209650dbc858fda7b5b6376 100644 (file)
 #define FRESCAN_HW_BUFFER_ENABLE_DEBUG  false
 #define FRESCAN_REPLENSH_ENABLE_DEBUG   false
 
-#define FRESCAN_BWRES_ENABLE_DEBUG            false
+#define FRESCAN_BWRES_ENABLE_DEBUG            true
 #define FRESCAN_BWRES_ROBJS_ENABLE_DEBUG      false
 #define FRESCAN_BWRES_REQUESTS_ENABLE_DEBUG   false
-#define FRESCAN_BWRES_MANAGER_ENABLE_DEBUG    false
-#define FRESCAN_BWRES_ACCEPTOR_ENABLE_DEBUG   false
-#define FRESCAN_BWRES_MC_ENABLE_DEBUG         false
+#define FRESCAN_BWRES_MANAGER_ENABLE_DEBUG    true
+#define FRESCAN_BWRES_ACCEPTOR_ENABLE_DEBUG   true
+#define FRESCAN_BWRES_MC_ENABLE_DEBUG         true
 #define FRESCAN_BWRES_FNA_ENABLE_DEBUG        false
-#define FRESCAN_BWRES_MESSAGES_ENABLE_DEBUG   false
-#define FRESCAN_BWRES_SA_ENABLE_DEBUG         false
+#define FRESCAN_BWRES_MESSAGES_ENABLE_DEBUG   true
+#define FRESCAN_BWRES_SA_ENABLE_DEBUG         true
 
 /**
  * MEASUREMENT FLAGS
index db5c81913159daa3f0462f2e5a7cdfd15ce1983a..46da17c557c518421487b5d5b9eedd12eb8e5eb8 100644 (file)
@@ -441,6 +441,7 @@ typedef struct {
         frescan_bwres_vres_t vres_pool[FRESCAN_MX_NODES][FRESCAN_MX_IDS];
         frescan_bwres_vres_t vres_head; // TODO: use struct list_head
         freelist_t fsa_vres_global_id_freelist;
+        freelist_t ss_id_freelist[FRESCAN_MX_NODES];
         frsh_sa_scenario_t fsa_scenario;
         frsh_contracts_group_t backup_contracts_to_reneg;
         frsh_contracts_group_t backup_contracts_to_cancel;
index 00f988ef6754feb1b9c5b26b0df38bf25373a6bd..2a922400d0505103f84302c3173190735ec1c8b6 100644 (file)
@@ -29,6 +29,8 @@ int main ()
         ret = frescan_bwres_init(NETWORK);
         if (ret != 0) PUT_ERROR ("could not init BWRES");
 
+        printf("BWRES Initialized\n");
+
         while (1) {
                 sleep(1);
         }
index b9d34e94c2edbd58f892eb74dabcf166ad386b82..5669eefd94b56a268b8b799faddb09db31744426 100644 (file)
 #define NETWORK 0
 #define LOCAL_NODE 0
 
+extern int frescan_fna_network_bytes_to_budget
+                                    (const frsh_resource_id_t resource_id,
+                                    const size_t nbytes,
+                                    frsh_rel_time_t *budget);
+
 int main ()
 {
         int ret;
index 8671cef520595968404af6faad81f682a318edf2..00478b8f8cede38da662bbd0f10a77b44aed6a85 100644 (file)
 #define NETWORK 0
 #define LOCAL_NODE 1
 
+extern int frescan_fna_network_bytes_to_budget
+                                    (const frsh_resource_id_t resource_id,
+                                    const size_t nbytes,
+                                    frsh_rel_time_t *budget);
+
 int main ()
 {
         int ret;
index b0b0cec5348f46e92f4654ccc7a97a120bdbb644..26a7fdcba4000125e9b2f0d079fb37a1c867c0f8 100644 (file)
@@ -38,7 +38,7 @@ static void *thread_code(void *arg);
 int main()
 {
         int err;
-        frescan_robj_id_t id;
+        frescan_bwres_robj_id_t id;
         fosa_thread_attr_t th_attr;
         fosa_thread_id_t tid;
         struct timespec now;
@@ -97,7 +97,7 @@ int main()
 static void *thread_code(void *arg)
 {
         int err;
-        frescan_robj_id_t reply = (frescan_robj_id_t)arg;
+        frescan_bwres_robj_id_t reply = (frescan_bwres_robj_id_t)arg;
 
         printf("Thread signaling\n");
         err = frescan_bwres_robjs_signal(reply);
index 80cd7c45f9ce736234c55f283f70bb8a815fd491..ba3916697e8fe7e93c7bdbe043fabedcef0845e7 100644 (file)
@@ -35,7 +35,7 @@ static void *thread_code(void *arg);
 int main()
 {
         int err;
-        frescan_robj_id_t id;
+        frescan_bwres_robj_id_t id;
         fosa_thread_attr_t th_attr;
         fosa_thread_id_t tid;
 
@@ -77,7 +77,7 @@ int main()
 static void *thread_code(void *arg)
 {
         int err;
-        frescan_robj_id_t reply = (frescan_robj_id_t)arg;
+        frescan_bwres_robj_id_t reply = (frescan_bwres_robj_id_t)arg;
 
         printf("Thread executing\n");
         sleep(2);
index 6b2e48a92645ac8c791758ad1b083b13f95a4b8f..262d137c53ad0c50b4b772b1f7313fa7adcc12a7 100644 (file)
@@ -1,6 +1,3 @@
-// mgcc test_frescan_send_basic.c -L. -lfrescan -o mprogram_wifi2
-// mgcc test_frescan_send_basic.c -DSENDER -L. -lfrescan -o mprogram_wifi1
-
 #include <stdio.h>  // perror
 #include <stdlib.h> // exit
 #include <unistd.h>   // sleep
index 56a0f94397d9ed2606cdbec8a2bc8124b01adeaa..ca0245e3fad586a7830289b96598660fa41dbe48 100644 (file)
@@ -4,7 +4,7 @@
 
 #include "frescan.h"
 
-#define ERROR(s) {perror (s); exit (-1);}
+#define PUT_ERROR(s) {perror (s); exit (-1);}
 
 #define NETWORK 0
 #define LOCAL_NODE 1
@@ -21,7 +21,7 @@ int main ()
         init_params.rx_channel_max_prio = NULL;
 
         ret = frescan_init(&init_params);
-        if (ret != 0) ERROR ("could not init FRESCAN");
+        if (ret != 0) PUT_ERROR ("could not init FRESCAN");
 
         printf("FRESCAN initialized\n");
 
index a809f3e4aa9f11711181db503d27811f75564844..cd03ad82ff7b37348b17f6633c876f9c8b7b2968 100644 (file)
@@ -4,6 +4,7 @@
 #include <stdint.h> // uint32_t
 
 #include "frescan_queues.h"
+#include "frescan_packets.h"
 #include "frescan_debug.h"
 #include <drivers/can.h>
 #include <misc/linux_list.h>