]> rtime.felk.cvut.cz Git - frescor/fna.git/commitdiff
servers perceived params and commit of those params
authorsangorrin <sangorrin@35b4ef3e-fd22-0410-ab77-dab3279adceb>
Thu, 25 Sep 2008 15:35:47 +0000 (15:35 +0000)
committersangorrin <sangorrin@35b4ef3e-fd22-0410-ab77-dab3279adceb>
Thu, 25 Sep 2008 15:35:47 +0000 (15:35 +0000)
git-svn-id: http://www.frescor.org/private/svn/frescor/fna/trunk@1336 35b4ef3e-fd22-0410-ab77-dab3279adceb

src_frescan/frescan_data.h
src_frescan/frescan_servers.c
src_frescan/frescan_servers_replenishments.c
tests/tests_frescan/test_frescan_servers_perceived_commit.c [new file with mode: 0644]
tests/tests_frescan/test_frescan_servers_update.c [new file with mode: 0644]

index 320ccaeadc0391f5a118c29ec554dccfe4f5486f..b4c046327dc3e702c0b54b54a02dc8da4bbdd677 100644 (file)
@@ -118,8 +118,8 @@ typedef struct {
 /**
  * frescan_server_data_t - server data
  *
- * @params: the fixed parameters (budget, period and priority)
- * @old_params: a copy of old params for the perceived-commit process
+ * @committed_params: the committed params (C,T,Prio) for the server
+ * @perceived_params: the params perceived by the user (we can lie to him)
  * @current_priority: the current priority (0=background)
  * @repl_list: the list of pending replenishment operations
  * @repl_timer: the timer for the replenishments associated to this server
@@ -130,8 +130,8 @@ typedef struct {
  */
 
 typedef struct {
-        frescan_server_params_t params;
-        frescan_server_params_t old_params;
+        frescan_server_params_t committed_params;
+        frescan_server_params_t perceived_params;
         frescan_network_t       net;
         frescan_ss_t            id;
         frescan_prio_t          current_priority;
index 5f151b3d1bc6a0b82194159c2f5dbc923de537fd..f1cc09d769d40fd5892b74ed9eab050d715a1def 100644 (file)
@@ -138,7 +138,8 @@ int frescan_servers_create(frescan_network_t net,
 
         server->net = net;
         server->id  = *id;
-        server->params = *params;
+        server->committed_params  = *params;
+        server->perceived_params = server->committed_params;
         server->current_priority = params->prio;
         server->pending_packets = 0;
 
@@ -171,7 +172,8 @@ int frescan_servers_create(frescan_network_t net,
 
         DEBUG(FRESCAN_SERVERS_ENABLE_DEBUG,
               "server created, id:%u budget:%u prio:%u\n",
-              *id, server->params.budget, server->params.prio);
+              *id, server->committed_params.budget,
+              server->committed_params.prio);
 
         return 0;
 }
@@ -189,13 +191,7 @@ int frescan_servers_set_perceived(frescan_network_t net,
                                   const frescan_server_params_t *params,
                                   frescan_ss_t id)
 {
-        frescan_server_data_t *server;
-
-        server = &the_servers_pool[net][id];
-
-        server->old_params = server->params;
-        server->params = *params;
-
+        the_servers_pool[net][id].perceived_params = *params;
         return 0;
 }
 
@@ -219,7 +215,8 @@ int frescan_servers_commit_perceived(frescan_network_t net,
         struct list_head *pos;
 
         server = &the_servers_pool[net][id];
-        budget_variation = server->params.budget - server->old_params.budget;
+        budget_variation = server->perceived_params.budget -
+                           server->committed_params.budget;
 
         if (budget_variation > 0) {
                 // we have more budget: add repl ops to the tail
@@ -247,6 +244,8 @@ int frescan_servers_commit_perceived(frescan_network_t net,
                 }
         }
 
+        server->committed_params = server->perceived_params;
+
         return 0;
 }
 
@@ -344,7 +343,7 @@ int frescan_servers_get_data(frescan_network_t net,
                              frescan_server_params_t *params,
                              frescan_ss_t id)
 {
-        *params = the_servers_pool[net][id].params;
+        *params = the_servers_pool[net][id].perceived_params;
         return 0;
 }
 
@@ -356,7 +355,11 @@ int frescan_servers_get_data(frescan_network_t net,
  * @current_budget: the current budget of the server
  *
  * Traverse the capacity queue until we find a replenishment operation
- * that was programmed for a time later than now.
+ * that was programmed for a time later than now. The number of iterations
+ * is the budget in the capacity queue.
+ *
+ * That budget must be modified if the perceived budget has not been
+ * committed yet.
  *
  */
 
@@ -367,20 +370,31 @@ int frescan_servers_get_current_budget(frescan_network_t net,
         struct timespec now;
         frescan_repl_op_t *repl;
         frescan_server_data_t *server;
+        int count;
 
         server = &the_servers_pool[net][id];
 
+        // first we get the current real budget in the capacity queue
         clock_gettime (CLOCK_MONOTONIC, &now);
 
-        *current_budget = 0;
-
+        count = 0;
         list_for_each_entry(repl,
                             &server->replenishments.repl_list,
                             repl_list) {
                 if (smaller_timespec(now, repl->when)) break;
-                *current_budget = *current_budget + 1;
+                count = count + 1;
         }
 
+        // if the perceived budget is less than the real budget
+        // we have to give a _perceived_ current budget
+        if (server->perceived_params.budget < server->committed_params.budget) {
+                count = server->perceived_params.budget -
+                        (server->committed_params.budget - count);
+                if (count < 0) count = 0;
+        }
+
+        *current_budget = (frescan_budget_t)count;
+
         return 0;
 }
 
index df3b51683f44ce4f4283dd2b388c338620373e5f..3ae76abb7541e159cbdc2a08bc2815f5004e8182 100644 (file)
@@ -169,7 +169,7 @@ static void *frescan_repl_thread(void *arg)
                 DEBUG(FRESCAN_REPLENSH_ENABLE_DEBUG,
                       "id:%u current_prio:%u\n", id, server->current_priority);
 
-                server->current_priority = server->params.prio;
+                server->current_priority = server->committed_params.prio;
 
                 if (!list_empty(&server->packet_list.fifo_list)) {
                         clock_gettime (CLOCK_MONOTONIC, &server->act_time);
@@ -291,7 +291,7 @@ int frescan_replenishment_program(frescan_network_t net,
 
         // move to tail with new repl value
         repl->when = *timestamp;
-        incr_timespec(repl->when, server->params.period);
+        incr_timespec(repl->when, server->committed_params.period);
         repl->amount = 1;
 
         list_add_tail(&repl->repl_list,
diff --git a/tests/tests_frescan/test_frescan_servers_perceived_commit.c b/tests/tests_frescan/test_frescan_servers_perceived_commit.c
new file mode 100644 (file)
index 0000000..aab9297
--- /dev/null
@@ -0,0 +1,225 @@
+// mgcc test_frescan_servers_send_basic.c -L. -lfrescan -o mprogram_wifi2
+// mgcc test_frescan_servers_send_basic.c -DSENDER -L. -lfrescan -o mprogram_wifi1
+
+#include <stdio.h>  // perror
+#include <stdlib.h> // exit
+#include <unistd.h>   // sleep
+
+#include "frescan.h"
+#include "frescan_servers.h"
+
+#define PUT_ERROR(s) {perror (s); exit (-1);}
+
+#define NETWORK 0
+
+#define SENDER
+// #define ENABLE_LOGGING
+
+#ifdef SENDER
+
+#define LOCAL_NODE 0
+
+#ifdef ENABLE_LOGGING
+
+#include <drivers/console_switcher.h>
+#include <misc/logger.h>
+#include <assert.h>
+#define LOG_DEVICE LOG_ETHERNET
+
+#endif
+
+static void pause(){
+        char key;
+        printf(" press Enter...");
+        key = getchar();
+}
+
+int main ()
+{
+        int i, ret;
+        frescan_send_params_t params;
+        char msg[200];
+        int written;
+        frescan_init_params_t init_params;
+        frescan_server_params_t server_params, server_params_read;
+        frescan_budget_t current_budget;
+
+#ifdef ENABLE_LOGGING
+        ret = logger_init(LOG_DEVICE);
+        assert(ret == 0);
+        printf("Changing to membuffer console\n");
+        MEMBUFFER_CONSOLE_INIT();
+#endif
+
+        printf(">> Initializing FRESCAN\n");
+
+        init_params.net = NETWORK;
+        init_params.node = LOCAL_NODE;
+        init_params.tx_fp_max_prio = 10;
+        init_params.rx_num_of_channels = 5;
+        init_params.rx_channel_max_prio = NULL;
+
+        ret = frescan_init(&init_params);
+        if (ret != 0) PUT_ERROR ("could not init FRESCAN");
+
+        printf(">> Creating a Server\n");
+
+        server_params.budget = 6;
+        server_params.period.tv_sec  = 3;
+        server_params.period.tv_nsec = 0;
+        server_params.prio = 4;
+
+        ret = frescan_servers_create(NETWORK,
+                                     &server_params,
+                                     &params.ss);
+        if (ret != 0) PUT_ERROR ("could not create server");
+
+        printf(">> Getting data from Server\n");
+
+        ret = frescan_servers_get_data(NETWORK,
+                                       &server_params_read,
+                                       params.ss);
+        if (ret != 0) PUT_ERROR ("could not get data from server");
+
+        printf("params: C = %d\n T = (%d, %d) P = %d\n",
+               server_params_read.budget,
+               server_params_read.period.tv_sec,
+               server_params_read.period.tv_nsec,
+               server_params_read.prio);
+
+        printf(">> Getting current_budget from Server\n");
+
+        ret = frescan_servers_get_current_budget(NETWORK,
+                                                 params.ss,
+                                                 &current_budget);
+        if (ret != 0) PUT_ERROR ("could not get current_budget");
+
+        printf("current_budget = %d\n", current_budget);
+
+        printf(">> Setting perceived\n");
+
+        server_params.budget = 4;
+        server_params.period.tv_sec  = 2;
+        server_params.period.tv_nsec = 0;
+        server_params.prio = 8;
+
+        ret = frescan_servers_set_perceived(NETWORK,
+                                            &server_params,
+                                            params.ss);
+        if (ret != 0) PUT_ERROR ("could not set perceived");
+
+        printf(">> Getting data from Server\n");
+
+        ret = frescan_servers_get_data(NETWORK,
+                                       &server_params_read,
+                                       params.ss);
+        if (ret != 0) PUT_ERROR ("could not get data from server");
+
+        printf("params: C = %d\n T = (%d, %d) P = %d\n",
+               server_params_read.budget,
+               server_params_read.period.tv_sec,
+               server_params_read.period.tv_nsec,
+               server_params_read.prio);
+
+        ret = frescan_servers_get_current_budget(NETWORK,
+                                                 params.ss,
+                                                 &current_budget);
+        if (ret != 0) PUT_ERROR ("could not get current_budget");
+
+        printf("current_budget = %d\n", current_budget);
+
+        printf(">> Commit params to Server\n");
+
+        ret = frescan_servers_commit_perceived(NETWORK, params.ss);
+        if (ret != 0) PUT_ERROR ("could not commit params");
+
+        ret = frescan_servers_get_current_budget(NETWORK,
+                                                 params.ss,
+                                                 &current_budget);
+        if (ret != 0) PUT_ERROR ("could not get current_budget");
+
+        printf("current_budget = %d\n", current_budget);
+
+        printf(">> Enter in loop for sending packets\n");
+
+        params.net      = NETWORK;
+        params.to       = 1;
+        params.channel  = 0;
+        params.flags    = FRESCAN_SS | FRESCAN_ASYNC;
+
+        while(1) {
+                pause();
+                for (i=0; i<=2; i++) {
+                        written = snprintf(msg, sizeof(msg),
+                                           "his number is: %d", i);
+
+                        ret = frescan_send(&params, (uint8_t *)msg, written);
+                        if (ret != 0) PUT_ERROR ("could not send message\n");
+                        printf("SENT: %d\n", i);
+
+                        ret = frescan_servers_get_current_budget
+                                        (NETWORK, params.ss, &current_budget);
+                        if (ret != 0) PUT_ERROR ("could not get current_budget");
+                        printf("current_budget = %d\n", current_budget);
+                }
+                pause();
+                ret = frescan_servers_get_current_budget
+                                (NETWORK, params.ss, &current_budget);
+                if (ret != 0) PUT_ERROR ("could not get current_budget");
+                printf("current_budget = %d\n", current_budget);
+
+#ifdef ENABLE_LOGGING
+                while (logger_manual_call() > 0);
+#endif
+}
+
+        return 0;
+}
+
+#else
+
+#define LOCAL_NODE 1
+
+int main ()
+{
+        int ret;
+        frescan_recv_params_t params;
+        uint8_t msg[3000];
+        size_t recv_bytes;
+        frescan_node_t from;
+        frescan_init_params_t init_params;
+        frescan_prio_t prio;
+
+        init_params.net = NETWORK;
+        init_params.node = LOCAL_NODE;
+        init_params.tx_fp_max_prio = 10;
+        init_params.rx_num_of_channels = 5;
+        init_params.rx_channel_max_prio = NULL;
+
+        ret = frescan_init(&init_params);
+        if (ret != 0) PUT_ERROR ("could not init FRESCAN");
+
+        printf("FRESCAN initialized\n");
+
+        params.net      = NETWORK;
+        params.channel  = 0;
+        params.flags    = FRESCAN_SYNC;
+
+        while (1) {
+                printf("RECEIVING...\n");
+                ret = frescan_recv(&params, (uint8_t *)msg, sizeof(msg),
+                                   &recv_bytes, &from, &prio);
+                if (ret != 0) PUT_ERROR ("could not send message");
+
+                msg[recv_bytes] = '\0';
+                printf("RECEIVED: %s with prio:%u\n", msg, prio);
+
+//                 for (i=0; i<recv_bytes; i++) {
+//                         printf("msg[%d] = 0x%X;\n", i, msg[i]);
+//                 }
+        }
+
+        return 0;
+}
+
+#endif
diff --git a/tests/tests_frescan/test_frescan_servers_update.c b/tests/tests_frescan/test_frescan_servers_update.c
new file mode 100644 (file)
index 0000000..285fd07
--- /dev/null
@@ -0,0 +1,155 @@
+// mgcc test_frescan_servers_send_basic.c -L. -lfrescan -o mprogram_wifi2
+// mgcc test_frescan_servers_send_basic.c -DSENDER -L. -lfrescan -o mprogram_wifi1
+
+#include <stdio.h>  // perror
+#include <stdlib.h> // exit
+#include <unistd.h>   // sleep
+
+#include "frescan.h"
+#include "frescan_servers.h"
+
+#define PUT_ERROR(s) {perror (s); exit (-1);}
+
+#define NETWORK 0
+
+#define SENDER
+// #define ENABLE_LOGGING
+
+#ifdef SENDER
+
+#define LOCAL_NODE 0
+
+#ifdef ENABLE_LOGGING
+
+#include <drivers/console_switcher.h>
+#include <misc/logger.h>
+#include <assert.h>
+#define LOG_DEVICE LOG_ETHERNET
+
+#endif
+
+static void pause(){
+        char key;
+        printf(" press Enter...");
+        key = getchar();
+}
+
+int main ()
+{
+        int i, ret;
+        frescan_send_params_t params;
+        char msg[200];
+        int written;
+        frescan_init_params_t init_params;
+        frescan_server_params_t server_params;
+
+#ifdef ENABLE_LOGGING
+        ret = logger_init(LOG_DEVICE);
+        assert(ret == 0);
+        printf("Changing to membuffer console\n");
+        MEMBUFFER_CONSOLE_INIT();
+#endif
+
+        printf(">> Initializing FRESCAN\n");
+
+        init_params.net = NETWORK;
+        init_params.node = LOCAL_NODE;
+        init_params.tx_fp_max_prio = 10;
+        init_params.rx_num_of_channels = 5;
+        init_params.rx_channel_max_prio = NULL;
+
+        ret = frescan_init(&init_params);
+        if (ret != 0) PUT_ERROR ("could not init FRESCAN");
+
+        printf(">> Creating a Server\n");
+
+        server_params.budget = 8;
+        server_params.period.tv_sec  = 3;
+        server_params.period.tv_nsec = 0;
+        server_params.prio = 6;
+
+        ret = frescan_servers_create(NETWORK,
+                                     &server_params,
+                                     &params.ss);
+        if (ret != 0) PUT_ERROR ("could not create server");
+
+        server_params.budget = 3;
+        server_params.period.tv_sec  = 2;
+        server_params.period.tv_nsec = 0;
+        server_params.prio = 4;
+
+        ret = frescan_servers_update(NETWORK,
+                                     &server_params,
+                                     params.ss);
+        if (ret != 0) PUT_ERROR ("could not update server");
+
+        printf(">> Enter in loop for sending packets\n");
+
+        params.net      = NETWORK;
+        params.to       = 1;
+        params.channel  = 0;
+        params.flags    = FRESCAN_SS | FRESCAN_ASYNC;
+
+        while(1) {
+                pause();
+                for (i=0; i<=2; i++) {
+                        written = snprintf(msg, sizeof(msg), "his number is: %d", i);
+                        ret = frescan_send(&params, (uint8_t *)msg, written);
+                        if (ret != 0) PUT_ERROR ("could not send message\n");
+                        printf("SENT: %d\n", i);
+}
+#ifdef ENABLE_LOGGING
+                while (logger_manual_call() > 0);
+#endif
+}
+
+        return 0;
+}
+
+#else
+
+#define LOCAL_NODE 1
+
+int main ()
+{
+        int ret;
+        frescan_recv_params_t params;
+        uint8_t msg[3000];
+        size_t recv_bytes;
+        frescan_node_t from;
+        frescan_init_params_t init_params;
+        frescan_prio_t prio;
+
+        init_params.net = NETWORK;
+        init_params.node = LOCAL_NODE;
+        init_params.tx_fp_max_prio = 10;
+        init_params.rx_num_of_channels = 5;
+        init_params.rx_channel_max_prio = NULL;
+
+        ret = frescan_init(&init_params);
+        if (ret != 0) PUT_ERROR ("could not init FRESCAN");
+
+        printf("FRESCAN initialized\n");
+
+        params.net      = NETWORK;
+        params.channel  = 0;
+        params.flags    = FRESCAN_SYNC;
+
+        while (1) {
+                printf("RECEIVING...\n");
+                ret = frescan_recv(&params, (uint8_t *)msg, sizeof(msg),
+                                   &recv_bytes, &from, &prio);
+                if (ret != 0) PUT_ERROR ("could not send message");
+
+                msg[recv_bytes] = '\0';
+                printf("RECEIVED: %s with prio:%u\n", msg, prio);
+
+//                 for (i=0; i<recv_bytes; i++) {
+//                         printf("msg[%d] = 0x%X;\n", i, msg[i]);
+//                 }
+        }
+
+        return 0;
+}
+
+#endif