]> rtime.felk.cvut.cz Git - frescor/fna.git/commitdiff
added the functions to renegotiate and cancel a contract. TODO: there is a bug when...
authorsangorrin <sangorrin@35b4ef3e-fd22-0410-ab77-dab3279adceb>
Wed, 23 Apr 2008 09:23:29 +0000 (09:23 +0000)
committersangorrin <sangorrin@35b4ef3e-fd22-0410-ab77-dab3279adceb>
Wed, 23 Apr 2008 09:23:29 +0000 (09:23 +0000)
git-svn-id: http://www.frescor.org/private/svn/frescor/fna/trunk@1137 35b4ef3e-fd22-0410-ab77-dab3279adceb

src_frescan/frescan_bwres.c
src_frescan/frescan_bwres.h
src_frescan/frescan_bwres_analysis.c
src_frescan/frescan_bwres_analysis.h
src_frescan/frescan_bwres_messages.c
src_frescan/frescan_bwres_threads.c
tests/tests_frescan/test_frescan_bwres_cancel_in_master.c [new file with mode: 0644]
tests/tests_frescan/test_frescan_bwres_cancel_in_slave.c [new file with mode: 0644]
tests/tests_frescan/test_frescan_bwres_renegotiate_in_master.c [new file with mode: 0644]
tests/tests_frescan/test_frescan_bwres_renegotiate_in_slave.c [new file with mode: 0644]

index 33918f2032073877c972651ba097752283e96def..f45fb8a9f50d482568ad075ec78737d239d3ae18 100644 (file)
@@ -81,12 +81,11 @@ int frescan_bwres_init(frescan_network_t net)
  * 2.- enqueue the request
  * 3.- wait in the reply object for a reply
  * 4.- return the final values and free the request
- *
  */
 
 int frescan_bwres_negotiate(frescan_network_t net,
                             const frescan_contract_t *contract,
-                            frescan_ss_t *id,
+                            frescan_ss_t *ss,
                             bool *accepted)
 {
         int ret;
@@ -133,27 +132,146 @@ int frescan_bwres_negotiate(frescan_network_t net,
         if (ret != 0) return ret;
 
         switch (req_data->return_value) {
-                case FRESCAN_REQ_ACCEPTED:
-                        DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation OK\n");
-                        *accepted = true;
-                        *id = req_data->ss;
-                        server_params.prio = req_data->final_values.server_prio;
-                        ret = frescan_servers_update(net, &server_params, *id);
-                        if (ret != 0) return ret;
-                        break;
-
-                case FRESCAN_REQ_NOT_ACCEPTED:
-                        DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation FAIL\n");
-                        *accepted = false;
-                        ret = frescan_servers_destroy(net, req_data->ss);
-                        if (ret != 0) return ret;
-                        break;
-
-                default:
-                        ERROR("return_value unknown\n");
-                        return -1;
+        case FRESCAN_REQ_ACCEPTED:
+                DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation OK\n");
+                *accepted = true;
+                *ss = req_data->ss;
+                server_params.prio = req_data->final_values.server_prio;
+                ret = frescan_servers_update(net, &server_params, *ss);
+                if (ret != 0) return ret;
+                break;
+
+        case FRESCAN_REQ_NOT_ACCEPTED:
+                DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation FAIL\n");
+                *accepted = false;
+                ret = frescan_servers_destroy(net, req_data->ss);
+                if (ret != 0) return ret;
+                break;
+
+        default:
+                ERROR("return_value unknown\n");
+                return -1;
         }
 
         frescan_requests_free(req);
         return 0;
 }
+
+/**
+ * frescan_bwres_renegotiate()
+ */
+
+int frescan_bwres_renegotiate(frescan_network_t net,
+                              const frescan_contract_t *contract,
+                              frescan_ss_t ss,
+                              bool *accepted)
+{
+        int ret;
+        frescan_request_id_t   req;
+        frescan_request_data_t *req_data;
+        frescan_server_params_t server_params;
+
+        DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "preparing renegotiation request\n");
+
+        ret = frescan_requests_alloc(&req);
+        if (ret != 0) return ret;
+
+        ret = frescan_requests_get_data(req, &req_data);
+        if (ret != 0) return ret;
+
+        req_data->type         = FRESCAN_REQ_RENEG;
+        req_data->req          = req;
+        req_data->contract     = (frescan_contract_t *)contract;
+        req_data->request_node = the_networks[net].local_node;
+        req_data->net          = net;
+        req_data->ss           = ss;
+
+        ret = frescan_bwres_robjs_alloc(&req_data->robj, FRESCAN_BWRES_MX_PRIO);
+        if (ret != 0) return ret;
+
+        DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "enqueue renegotiation request\n");
+
+        ret = frescan_requests_enqueue(req);
+        if (ret != 0) return ret;
+
+        DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "wait for a reply\n");
+
+        ret = frescan_bwres_robjs_wait(req_data->robj);
+        if (ret != 0) return ret;
+
+        ret = frescan_bwres_robjs_free(req_data->robj);
+        if (ret != 0) return ret;
+
+        switch (req_data->return_value) {
+        case FRESCAN_REQ_ACCEPTED:
+                DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "renegotiation OK\n");
+                *accepted = true;
+                server_params.values.budget = contract->min_values.budget;
+                server_params.values.period = contract->min_values.period;
+                server_params.prio = req_data->final_values.server_prio;
+                ret = frescan_servers_update(net, &server_params, ss);
+                if (ret != 0) return ret;
+                break;
+
+        case FRESCAN_REQ_NOT_ACCEPTED:
+                DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "negotiation FAIL\n");
+                *accepted = false;
+                if (ret != 0) return ret;
+                break;
+
+        default:
+                ERROR("return_value unknown\n");
+                return -1;
+        }
+
+        frescan_requests_free(req);
+        return 0;
+}
+
+/**
+ * frescan_bwres_cancel()
+ */
+
+int frescan_bwres_cancel(frescan_network_t net,
+                         frescan_ss_t      ss)
+{
+        int ret;
+        frescan_request_id_t   req;
+        frescan_request_data_t *req_data;
+
+        DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "preparing cancel request\n");
+
+        ret = frescan_requests_alloc(&req);
+        if (ret != 0) return ret;
+
+        ret = frescan_requests_get_data(req, &req_data);
+        if (ret != 0) return ret;
+
+        req_data->type         = FRESCAN_REQ_CANCEL;
+        req_data->req          = req;
+        req_data->request_node = the_networks[net].local_node;
+        req_data->net          = net;
+        req_data->ss           = ss;
+
+        ret = frescan_bwres_robjs_alloc(&req_data->robj, FRESCAN_BWRES_MX_PRIO);
+        if (ret != 0) return ret;
+
+        DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "enqueue cancel request\n");
+
+        ret = frescan_requests_enqueue(req);
+        if (ret != 0) return ret;
+
+        DEBUG(FRESCAN_BWRES_ENABLE_DEBUG, "wait for a signal\n");
+
+        ret = frescan_bwres_robjs_wait(req_data->robj);
+        if (ret != 0) return ret;
+
+        ret = frescan_bwres_robjs_free(req_data->robj);
+        if (ret != 0) return ret;
+
+        ret = frescan_servers_destroy(net, ss);
+        if (ret != 0) return ret;
+
+        frescan_requests_free(req);
+        return 0;
+}
index af476d67f0b88374314243efd665c6ba01ce590d..a8b3b595f7961ecf57f8d80b45683eebbeaa96a2 100644 (file)
@@ -24,9 +24,17 @@ extern int frescan_bwres_init(frescan_network_t net);
 
 extern int frescan_bwres_negotiate(frescan_network_t net,
                                    const frescan_contract_t *contract,
-                                   frescan_ss_t *id,
+                                   frescan_ss_t *ss,
                                    bool *accepted);
 
-// TODO: add other functions: renegotiate, cancel...
+extern int frescan_bwres_renegotiate(frescan_network_t net,
+                                     const frescan_contract_t *contract,
+                                     frescan_ss_t ss,
+                                     bool *accepted);
+
+extern int frescan_bwres_cancel(frescan_network_t net,
+                                frescan_ss_t      ss);
+
+// TODO: add other functions: renegotiate_async
 
 #endif // _FRESCAN_BANDWIDTH_RESERVATION_H_
index 5c8c7bc26f838466164a3fc7707381e8d6a4fc49..00d5fe61cc1278684e27a682e89345a7693e48b7 100644 (file)
@@ -135,14 +135,16 @@ int frescan_sa_add_contract(frescan_sa_scenario_t    *scenario,
  *
  * @scenario: the scenario (in out)
  * @ss: the ss identificator (in)
- * @contract: the values to update the contract (in)
  * @node: the node this contract belongs to (in)
+ * @contract: the values to update the contract (in)
+ * @old_contract: the values of the previous contract. Can be NULL (out)
  */
 
 int frescan_sa_update_contract(frescan_sa_scenario_t   *scenario,
                                frescan_ss_t             ss,
+                               frescan_node_t           node,
                                const frescan_contract_t *contract,
-                               frescan_node_t           node)
+                               frescan_contract_t       *old_contract)
 {
 //         int ret;
 //
@@ -152,9 +154,11 @@ int frescan_sa_update_contract(frescan_sa_scenario_t   *scenario,
 
         sa_contract = &scenario->contracts[node][ss];
 
+        if (old_contract != NULL) {
+                *old_contract = sa_contract->contract;
+        }
+
         sa_contract->contract = *contract;
-        sa_contract->node     = node;
-        sa_contract->ss       = ss;
 
         return 0;
 }
@@ -221,7 +225,7 @@ int frescan_sa_sched_test(frescan_sa_scenario_t *scenario,
         int num_contracts;
         double utilization, max_utilization, budget, period;
 
-        WARNING("simplified ub test (no blockings, prio ordered)\n");
+        WARNING("simplified ub test (no blocks, prio ordered)\n");
 
         utilization = 0.0;
         num_contracts = 0;
index ad9fca6aa4a71a559fe4ef80250e7731d7bb764a..9058f56e6d16772b9f96f1db86149e914a4bad8f 100644 (file)
@@ -107,14 +107,16 @@ extern int frescan_sa_add_contract(frescan_sa_scenario_t    *scenario,
  *
  * @scenario: the scenario (in out)
  * @ss: the ss identificator (in)
- * @contract: the values to update the contract (in)
  * @node: the node this contract belongs to (in)
+ * @contract: the values to update the contract (in)
+ * @old_contract: the values of the previous contract. Can be NULL (out)
  */
 
-extern int frescan_sa_update_contract(frescan_sa_scenario_t *scenario,
-                                      frescan_ss_t          ss,
+extern int frescan_sa_update_contract(frescan_sa_scenario_t   *scenario,
+                                      frescan_ss_t             ss,
+                                      frescan_node_t           node,
                                       const frescan_contract_t *contract,
-                                      frescan_node_t           node);
+                                      frescan_contract_t       *old_contract);
 
 /**
  * frescan_sa_remove_contract() - remove a contract from the scenario
index 6d1982aef87f8545120ff2e68b749bfd622dc680..870af2b56f8c0d2a9a3d345b00b23aadf0d9ca2e 100644 (file)
@@ -293,6 +293,9 @@ int frescan_messages_send_request(const frescan_request_data_t *req_data)
                         return -1;
         }
 
+        DEBUG(true, "request type %X sent, size %d\n",
+              *(frescan_request_type_t *)msg, size);
+
         ret = frescan_send(&send_params[req_data->net], msg, size);
         if (ret != 0) return ret;
 
@@ -354,7 +357,8 @@ int frescan_messages_recv_request(frescan_network_t    net,
                 case FRESCAN_REP_NEG:
                         return frescan_repneg_message_to_request(msg, req_data);
                 default:
-                        ERROR("request type not supported\n");
+                        ERROR("request type %X not supported\n",
+                              *(frescan_request_type_t *)msg);
                         return -1;
         }
 }
index 3216a1b2779c40fbbeb0cd2d79e5342537bff1fe..ef750b8b7beb1dfe0cbe3dbc7e22eba9b2d32212 100644 (file)
@@ -135,7 +135,7 @@ static void *frescan_manager_thread(void *arg)
                 }
 
                 if(req_data->request_node != the_networks[net].local_node) {
-                        ret = frescan_requests_free(req);
+                        ret = frescan_requests_free(req); // acceptor request
                         assert(ret == 0);
                 }
         }
@@ -233,20 +233,98 @@ static void frescan_manager_neg(frescan_request_data_t *req_data)
 
 static void frescan_manager_reneg(frescan_request_data_t *req_data)
 {
+        int ret;
+        bool accepted;
+        frescan_contract_t old_contract;
+
         DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "renegotiation request\n");
+
+        if (the_networks[req_data->net].local_node == FRESCAN_NEG_MASTER_NODE) {
+                // scheduling analysis
+                ret = frescan_sa_update_contract
+                                (&the_networks[req_data->net].scenario,
+                                 req_data->ss,
+                                 req_data->request_node,
+                                 req_data->contract,
+                                 &old_contract);
+                assert(ret == 0);
+
+                ret = frescan_sa_sched_test
+                                (&the_networks[req_data->net].scenario,
+                                 &accepted);
+                assert(ret == 0);
+
+                if (accepted) {
+                        ret = frescan_sa_get_final_values
+                                        (&the_networks[req_data->net].scenario,
+                                          req_data->ss,
+                                          req_data->request_node,
+                                          &req_data->final_values);
+                        assert(ret == 0);
+                        req_data->return_value = FRESCAN_REQ_ACCEPTED;
+                } else {
+                        ret = frescan_sa_update_contract
+                                        (&the_networks[req_data->net].scenario,
+                                         req_data->ss,
+                                         req_data->request_node,
+                                         &old_contract,
+                                         NULL);
+                        assert(ret == 0);
+                        req_data->return_value = FRESCAN_REQ_NOT_ACCEPTED;
+                }
+
+                // signal or reply the results
+                if (req_data->request_node == FRESCAN_NEG_MASTER_NODE) {
+                        DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "master local\n");
+                        ret = frescan_bwres_robjs_signal(req_data->robj);
+                        assert(ret == 0);
+                } else {
+                        DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+                              "master external, sending reply\n");
+
+                        req_data->type = FRESCAN_REP_NEG;
+                        ret = frescan_messages_send_request(req_data);
+                        assert(ret == 0);
+                }
+        } else {
+                DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+                      "send renegotiation request to master\n");
+                ret = frescan_messages_send_request(req_data);
+                assert(ret == 0);
+        }
 }
 
 /**
- * frescan_manager_neg
+ * frescan_manager_cancel
  */
 
 static void frescan_manager_cancel(frescan_request_data_t *req_data)
 {
+        int ret;
+
         DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG, "cancel request\n");
+
+        if (the_networks[req_data->net].local_node == FRESCAN_NEG_MASTER_NODE) {
+                ret = frescan_sa_remove_contract
+                                (&the_networks[req_data->net].scenario,
+                                 req_data->ss,
+                                 req_data->request_node);
+                assert(ret == 0);
+        } else {
+                DEBUG(FRESCAN_MANAGER_ENABLE_DEBUG,
+                      "send cancel request to master\n");
+                ret = frescan_messages_send_request(req_data);
+                assert(ret == 0);
+        }
+
+        if (req_data->request_node == the_networks[req_data->net].local_node) {
+                ret = frescan_bwres_robjs_signal(req_data->robj);
+                assert(ret == 0);
+        }
 }
 
 /**
- * frescan_manager_neg
+ * frescan_manager_repneg
  */
 
 static void frescan_manager_repneg(frescan_request_data_t *req_data)
diff --git a/tests/tests_frescan/test_frescan_bwres_cancel_in_master.c b/tests/tests_frescan/test_frescan_bwres_cancel_in_master.c
new file mode 100644 (file)
index 0000000..5c6e803
--- /dev/null
@@ -0,0 +1,113 @@
+#include <stdio.h>  // perror
+#include <stdlib.h> // exit
+#include <unistd.h>   // sleep
+
+#include "frescan.h"
+#include "frescan_bwres.h"
+#include "frescan_servers.h"
+
+#define ERROR(s) {perror (s); exit (-1);}
+
+#define NETWORK 0
+#define LOCAL_NODE 0
+
+int main ()
+{
+        int ret;
+        frescan_init_params_t init_params;
+        frescan_ss_t ss1, ss2, ss3;
+        frescan_contract_t contract;
+        bool accepted;
+        frescan_server_params_t server_params;
+
+        init_params.net = NETWORK;
+        init_params.node = LOCAL_NODE;
+        init_params.tx_fp_max_prio = 10;
+        init_params.rx_num_of_channels = 10;
+        init_params.rx_channel_max_prio = NULL;
+
+        printf("Initializing FRESCAN\n");
+        ret = frescan_init(&init_params);
+        if (ret != 0) ERROR ("could not init FRESCAN");
+
+        printf("Initializing BWRES\n");
+        ret = frescan_bwres_init(NETWORK);
+        if (ret != 0) ERROR ("could not init BWRES");
+
+        contract.min_values.budget = 5;
+        contract.min_values.period.tv_sec  = 3;
+        contract.min_values.period.tv_nsec = 69;
+        contract.prio = 7;
+
+        ret = frescan_bwres_negotiate(NETWORK, &contract, &ss1, &accepted);
+        if (ret != 0) ERROR ("could not negotiate");
+
+        if (accepted) {
+                printf("The contract was accepted, ss:%u\n", ss1);
+                ret = frescan_servers_get_data(NETWORK, &server_params, ss1);
+                if (ret != 0) ERROR ("could not get servers data");
+
+                printf("B:%u, T=(%u,%u), P:%u\n",
+                       server_params.values.budget,
+                       server_params.values.period.tv_sec,
+                       server_params.values.period.tv_nsec,
+                       server_params.prio);
+        } else {
+                printf("The contract was not accepted\n");
+        }
+
+        contract.min_values.budget = 6;
+        contract.min_values.period.tv_sec  = 2;
+        contract.min_values.period.tv_nsec = 6;
+        contract.prio = 4;
+
+        ret = frescan_bwres_negotiate(NETWORK, &contract, &ss2, &accepted);
+        if (ret != 0) ERROR ("could not negotiate");
+
+        if (accepted) {
+                printf("The contract was accepted, ss:%u\n", ss2);
+                ret = frescan_servers_get_data(NETWORK, &server_params, ss2);
+                if (ret != 0) ERROR ("could not get servers data");
+
+                printf("B:%u, T=(%u,%u), P:%u\n",
+                       server_params.values.budget,
+                       server_params.values.period.tv_sec,
+                       server_params.values.period.tv_nsec,
+                       server_params.prio);
+        } else {
+                printf("The contract was not accepted\n");
+        }
+
+        ret = frescan_bwres_cancel(NETWORK, ss1);
+        if (ret != 0) ERROR ("could not cancel server");
+
+        contract.min_values.budget = 1;
+        contract.min_values.period.tv_sec  = 6;
+        contract.min_values.period.tv_nsec = 666;
+        contract.prio = 3;
+
+        ret = frescan_bwres_negotiate(NETWORK, &contract, &ss3, &accepted);
+        if (ret != 0) ERROR ("could not negotiate");
+
+        if (accepted) {
+                printf("The contract was accepted, ss:%u\n", ss3);
+                ret = frescan_servers_get_data(NETWORK, &server_params, ss3);
+                if (ret != 0) ERROR ("could not get servers data");
+
+                printf("B:%u, T=(%u,%u), P:%u\n",
+                       server_params.values.budget,
+                       server_params.values.period.tv_sec,
+                       server_params.values.period.tv_nsec,
+                       server_params.prio);
+        } else {
+                printf("The contract was not accepted\n");
+        }
+
+        while (1) {
+                sleep(1);
+        }
+
+        return 0;
+}
+
+
diff --git a/tests/tests_frescan/test_frescan_bwres_cancel_in_slave.c b/tests/tests_frescan/test_frescan_bwres_cancel_in_slave.c
new file mode 100644 (file)
index 0000000..4b4c5e2
--- /dev/null
@@ -0,0 +1,117 @@
+#include <stdio.h>  // perror
+#include <stdlib.h> // exit
+#include <unistd.h>   // sleep
+
+#include "frescan.h"
+#include "frescan_bwres.h"
+#include "frescan_servers.h"
+
+#define ERROR(s) {perror (s); exit (-1);}
+
+#define NETWORK 0
+#define LOCAL_NODE 1
+
+int main ()
+{
+        int ret;
+        frescan_init_params_t init_params;
+        frescan_ss_t ss1, ss2, ss3;
+        frescan_contract_t contract;
+        frescan_server_params_t server_params;
+        bool accepted;
+
+        init_params.net = NETWORK;
+        init_params.node = LOCAL_NODE;
+        init_params.tx_fp_max_prio = 10;
+        init_params.rx_num_of_channels = 10;
+        init_params.rx_channel_max_prio = NULL;
+
+        printf("Initializing FRESCAN\n");
+        ret = frescan_init(&init_params);
+        if (ret != 0) ERROR ("could not init FRESCAN");
+
+        printf("Initializing BWRES\n");
+        ret = frescan_bwres_init(NETWORK);
+        if (ret != 0) ERROR ("could not init BWRES");
+
+        contract.min_values.budget = 5;
+        contract.min_values.period.tv_sec = 3;
+        contract.min_values.period.tv_nsec = 0;
+        contract.prio = 5;
+
+        printf("Negotiating a contract 1\n");
+        ret = frescan_bwres_negotiate(NETWORK, &contract, &ss1, &accepted);
+        if (ret != 0) ERROR ("could not negotiate succesfully");
+
+        if (accepted) {
+                printf("The contract was accepted, ss:%u\n", ss1);
+                ret = frescan_servers_get_data(NETWORK, &server_params, ss1);
+                if (ret != 0) ERROR ("could not get servers data");
+
+                printf("B:%u, T=(%u,%u), P:%u\n",
+                       server_params.values.budget,
+                       server_params.values.period.tv_sec,
+                       server_params.values.period.tv_nsec,
+                       server_params.prio);
+        } else {
+                printf("The contract was not accepted\n");
+        }
+
+        contract.min_values.budget = 6;
+        contract.min_values.period.tv_sec  = 2;
+        contract.min_values.period.tv_nsec = 6;
+        contract.prio = 4;
+
+        printf("Negotiating a contract 2\n");
+        ret = frescan_bwres_negotiate(NETWORK, &contract, &ss2, &accepted);
+        if (ret != 0) ERROR ("could not negotiate");
+
+        if (accepted) {
+                printf("The contract was accepted, ss:%u\n", ss2);
+                ret = frescan_servers_get_data(NETWORK, &server_params, ss2);
+                if (ret != 0) ERROR ("could not get servers data");
+
+                printf("B:%u, T=(%u,%u), P:%u\n",
+                       server_params.values.budget,
+                       server_params.values.period.tv_sec,
+                       server_params.values.period.tv_nsec,
+                       server_params.prio);
+        } else {
+                printf("The contract was not accepted\n");
+        }
+
+        printf("cancelling contract for ss:%u\n", ss1);
+        ret = frescan_bwres_cancel(NETWORK, ss1);
+        if (ret != 0) ERROR ("could not cancel server");
+
+        contract.min_values.budget = 1;
+        contract.min_values.period.tv_sec  = 6;
+        contract.min_values.period.tv_nsec = 666;
+        contract.prio = 3;
+
+        printf("Negotiating a contract 3\n");
+        ret = frescan_bwres_negotiate(NETWORK, &contract, &ss3, &accepted);
+        if (ret != 0) ERROR ("could not negotiate");
+
+        if (accepted) {
+                printf("The contract was accepted, ss:%u\n", ss3);
+                ret = frescan_servers_get_data(NETWORK, &server_params, ss3);
+                if (ret != 0) ERROR ("could not get servers data");
+
+                printf("B:%u, T=(%u,%u), P:%u\n",
+                       server_params.values.budget,
+                       server_params.values.period.tv_sec,
+                       server_params.values.period.tv_nsec,
+                       server_params.prio);
+        } else {
+                printf("The contract was not accepted\n");
+        }
+
+        while (1) {
+                sleep(1);
+        }
+
+        return 0;
+}
+
+
diff --git a/tests/tests_frescan/test_frescan_bwres_renegotiate_in_master.c b/tests/tests_frescan/test_frescan_bwres_renegotiate_in_master.c
new file mode 100644 (file)
index 0000000..98db77c
--- /dev/null
@@ -0,0 +1,90 @@
+#include <stdio.h>  // perror
+#include <stdlib.h> // exit
+#include <unistd.h>   // sleep
+
+#include "frescan.h"
+#include "frescan_bwres.h"
+#include "frescan_servers.h"
+
+#define ERROR(s) {perror (s); exit (-1);}
+
+#define NETWORK 0
+#define LOCAL_NODE 0
+
+int main ()
+{
+        int ret;
+        frescan_init_params_t init_params;
+        frescan_ss_t ss;
+        frescan_contract_t contract;
+        bool accepted;
+        frescan_server_params_t server_params;
+
+        init_params.net = NETWORK;
+        init_params.node = LOCAL_NODE;
+        init_params.tx_fp_max_prio = 10;
+        init_params.rx_num_of_channels = 10;
+        init_params.rx_channel_max_prio = NULL;
+
+        printf("Initializing FRESCAN\n");
+        ret = frescan_init(&init_params);
+        if (ret != 0) ERROR ("could not init FRESCAN");
+
+        printf("Initializing BWRES\n");
+        ret = frescan_bwres_init(NETWORK);
+        if (ret != 0) ERROR ("could not init BWRES");
+
+        contract.min_values.budget = 5;
+        contract.min_values.period.tv_sec  = 3;
+        contract.min_values.period.tv_nsec = 69;
+        contract.prio = 7;
+
+        ret = frescan_bwres_negotiate(NETWORK, &contract, &ss, &accepted);
+        if (ret != 0) ERROR ("could not negotiate");
+
+        if (accepted) {
+                printf("The contract was accepted, ss:%u\n", ss);
+                ret = frescan_servers_get_data(NETWORK, &server_params, ss);
+                if (ret != 0) ERROR ("could not get servers data");
+
+                printf("B:%u, T=(%u,%u), P:%u\n",
+                       server_params.values.budget,
+                       server_params.values.period.tv_sec,
+                       server_params.values.period.tv_nsec,
+                       server_params.prio);
+        } else {
+                printf("The contract was not accepted\n");
+        }
+
+        printf("Renegotiate the contract in 2 seconds\n");
+        sleep(2);
+
+        contract.min_values.budget = 7;
+        contract.min_values.period.tv_sec  = 2;
+        contract.min_values.period.tv_nsec = 45;
+        contract.prio = 8;
+
+        ret = frescan_bwres_renegotiate(NETWORK, &contract, ss, &accepted);
+        if (ret != 0) ERROR ("could not renegotiate");
+
+        if (accepted) {
+                printf("The contract renegotiation was accepted, ss:%u\n", ss);
+                ret = frescan_servers_get_data(NETWORK, &server_params, ss);
+                if (ret != 0) ERROR ("could not get servers data");
+
+                printf("B:%u, T=(%u,%u), P:%u\n",
+                       server_params.values.budget,
+                       server_params.values.period.tv_sec,
+                       server_params.values.period.tv_nsec,
+                       server_params.prio);
+        } else {
+                printf("The contract was not accepted\n");
+        }
+
+
+        while (1) {
+                sleep(1);
+        }
+
+        return 0;
+}
diff --git a/tests/tests_frescan/test_frescan_bwres_renegotiate_in_slave.c b/tests/tests_frescan/test_frescan_bwres_renegotiate_in_slave.c
new file mode 100644 (file)
index 0000000..0996408
--- /dev/null
@@ -0,0 +1,92 @@
+#include <stdio.h>  // perror
+#include <stdlib.h> // exit
+#include <unistd.h>   // sleep
+
+#include "frescan.h"
+#include "frescan_bwres.h"
+#include "frescan_servers.h"
+
+#define ERROR(s) {perror (s); exit (-1);}
+
+#define NETWORK 0
+#define LOCAL_NODE 1
+
+int main ()
+{
+        int ret;
+        frescan_init_params_t init_params;
+        frescan_ss_t ss;
+        frescan_contract_t contract;
+        frescan_server_params_t server_params;
+        bool accepted;
+
+        init_params.net = NETWORK;
+        init_params.node = LOCAL_NODE;
+        init_params.tx_fp_max_prio = 10;
+        init_params.rx_num_of_channels = 10;
+        init_params.rx_channel_max_prio = NULL;
+
+        printf("Initializing FRESCAN\n");
+        ret = frescan_init(&init_params);
+        if (ret != 0) ERROR ("could not init FRESCAN");
+
+        printf("Initializing BWRES\n");
+        ret = frescan_bwres_init(NETWORK);
+        if (ret != 0) ERROR ("could not init BWRES");
+
+        contract.min_values.budget = 5;
+        contract.min_values.period.tv_sec = 3;
+        contract.min_values.period.tv_nsec = 0;
+        contract.prio = 5;
+
+        printf("Negotiating a contract\n");
+        ret = frescan_bwres_negotiate(NETWORK, &contract, &ss, &accepted);
+        if (ret != 0) ERROR ("could not negotiate succesfully");
+
+        if (accepted) {
+                printf("The contract was accepted, ss:%u\n", ss);
+                ret = frescan_servers_get_data(NETWORK, &server_params, ss);
+                if (ret != 0) ERROR ("could not get servers data");
+
+                printf("B:%u, T=(%u,%u), P:%u\n",
+                       server_params.values.budget,
+                       server_params.values.period.tv_sec,
+                       server_params.values.period.tv_nsec,
+                       server_params.prio);
+        } else {
+                printf("The contract was not accepted\n");
+        }
+
+        printf("Renegotiate the contract in 2 seconds\n");
+        sleep(2);
+
+        contract.min_values.budget = 2;
+        contract.min_values.period.tv_sec  = 6;
+        contract.min_values.period.tv_nsec = 43;
+        contract.prio = 2;
+
+        ret = frescan_bwres_renegotiate(NETWORK, &contract, ss, &accepted);
+        if (ret != 0) ERROR ("could not renegotiate");
+
+        if (accepted) {
+                printf("The contract renegotiation was accepted, ss:%u\n", ss);
+                ret = frescan_servers_get_data(NETWORK, &server_params, ss);
+                if (ret != 0) ERROR ("could not get servers data");
+
+                printf("B:%u, T=(%u,%u), P:%u\n",
+                       server_params.values.budget,
+                       server_params.values.period.tv_sec,
+                       server_params.values.period.tv_nsec,
+                       server_params.prio);
+        } else {
+                printf("The contract was not accepted\n");
+        }
+
+        while (1) {
+                sleep(1);
+        }
+
+        return 0;
+}
+
+