/**
* 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
*/
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;
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;
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;
}
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;
}
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
}
}
+ server->committed_params = server->perceived_params;
+
return 0;
}
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;
}
* @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.
*
*/
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;
}
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);
// 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,
--- /dev/null
+// 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,
+ ¶ms.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,
+ ¤t_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,
+ ¤t_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,
+ ¤t_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(¶ms, (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, ¤t_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, ¤t_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(¶ms, (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
--- /dev/null
+// 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,
+ ¶ms.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(¶ms, (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(¶ms, (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