]> rtime.felk.cvut.cz Git - frescor/frsh-forb.git/blobdiff - src/fwp/fwp/demo/sender_adaptive.c
fwp: demo_sender: added contract cancellation
[frescor/frsh-forb.git] / src / fwp / fwp / demo / sender_adaptive.c
index f8fa17e452b5575d86f69483813ccef8e2e0449f..6abf24a4f36b16223093164db81f7c8dcf3c0519 100644 (file)
@@ -79,15 +79,24 @@ long long mac_addr_string_to_number(char * mac)
        return number;
 }
 
+char * prepare_msg(int size) {
+       int i;
+       char * ret = (char*)malloc(size*sizeof(char));
+       for(i=0; i<size; i++) {
+               ret[i] = '0'; //just insert some characters
+       }
+       return ret;
+}
+
 int main(int argc, char* argv[])
 {
-       char msg[MSGBUFFSIZE];
+       char *msg;
 
        frsh_resource_id_t resource_id = TEST_RESOURCE_ID;
        frsh_stream_id_t port = TEST_STREAM_ID;
        long int num_msg = TEST_NUM_MSG;
        size_t msg_size = MSGBUFFSIZE;
-       int time_period = 1000;
+       int time_period = 100;
        int dst_ip = 0;
        char mac_addr[20];
 
@@ -99,12 +108,30 @@ int main(int argc, char* argv[])
        frsh_rel_time_t budget, period;
        int count;
 
-       struct fwp_vres_params vparam;
+       bool opt_daemon = false;
+       char *opt_pidfile = NULL;
+       frsh_rel_time_t zero = fosa_msec_to_rel_time(0);
+
+       frsh_utilization_set_t utilization_set;
+       utilization_set.size = 4;
+       utilization_set.utilizations[1].period = fosa_msec_to_rel_time(100);
+       utilization_set.utilizations[1].budget = fosa_usec_to_rel_time(3);
+       utilization_set.utilizations[1].deadline = fosa_msec_to_rel_time(100);
+       utilization_set.utilizations[2].period = fosa_msec_to_rel_time(100);
+       utilization_set.utilizations[2].budget = fosa_usec_to_rel_time(9);
+       utilization_set.utilizations[2].deadline = fosa_msec_to_rel_time(100);
+       utilization_set.utilizations[3].period = fosa_msec_to_rel_time(100);
+       utilization_set.utilizations[3].budget = fosa_usec_to_rel_time(14);
+       utilization_set.utilizations[3].deadline = fosa_msec_to_rel_time(100);
 
        opterr = 0;
-       while ((opt = getopt (argc, argv, "d:p:s:m:t:a:")) != -1) {
+       while ((opt = getopt (argc, argv, "e:d:p:s:m:t:a:")) != -1) {
 
                switch (opt) {
+                       case 'e':
+                               opt_daemon = true;
+                               opt_pidfile = optarg;
+                               break;
                        case 'd':
                                dst_ip = inet_addr(optarg);
                                break;
@@ -121,7 +148,7 @@ int main(int argc, char* argv[])
                                time_period = atoi(optarg);
                                break;
                        case 'a':
-                               strcpy(mac_addr, optarg); //msg_size = atoi(optarg);
+                               strcpy(mac_addr, optarg);
                                break;
                        case '?':
                                printf("Usage: %s -e -d dst_ip_addr -p port"
@@ -130,61 +157,71 @@ int main(int argc, char* argv[])
                }
        }
 
-       WVFRSH(frsh_init());
+       if (opt_daemon)
+               forb_daemon_prepare(opt_pidfile);
 
+       WVFRSH(frsh_init());
        send_pinfo.body = NULL;
-       
        WVPASSNE(frsh_send_endpoint_create(resource_id, dst_ip, port, send_pinfo, &sepoint), 0);
-
-       /* Contract negotiation */
+       
+       /* Contract parameters */
        WVFRSH(frsh_contract_init(&contract));
-
-       WVFRSH(frsh_network_bytes_to_budget(resource_id, msg_size, &budget));
-       period = fosa_msec_to_rel_time(time_period);
+       WVFRSH(frsh_network_bytes_to_budget(resource_id, msg_size, &utilization_set.utilizations[0].budget));
+       utilization_set.utilizations[0].period = fosa_msec_to_rel_time(time_period);
        WVFRSH(frsh_contract_set_basic_params(&contract,
-                                            &budget,
-                                            &period,
+                                            &utilization_set.utilizations[0].budget,
+                                            &utilization_set.utilizations[0].period,
                                             FRSH_WT_BOUNDED,
                                             FRSH_CT_REGULAR));
        WVFRSH(frsh_contract_set_resource_and_label(&contract,FRSH_RT_NETWORK,
-                                               resource_id, "net_cont1"));
+                                               resource_id, "net_cont"));
 
-       // TODO: Add fwp block with MAC address
+       /* Add fwp block with MAC address */
        fres_block_fwp *fwp_block;
        WVPASS((fwp_block = (fres_block_fwp*)malloc(sizeof(fres_block_fwp))) != NULL);
-       /*Add mac address for each contract*/
        fwp_block->mac_address = mac_addr_string_to_number(mac_addr);
        WVPASS(fres_contract_add_block(contract, FRES_BLOCK_FWP, fwp_block) == 0);
 
+       /* Add spare capacity block */
+       //TODO: Delete extra spare capacity block initialization, since spare capacity is initialized in set_reclamation_params function        
+       //fres_block_spare_capacity *s;
+       //WVPASS((s = malloc(sizeof(*s))) != NULL);
+       //s->budget = (fosa_rel_time_t)budget;
+       //s->budget = (fosa_rel_time_t)utilization_set.utilizations[0].budget;
+       //s->period = (fosa_rel_time_t)utilization_set.utilizations[0].period;
+       //WVPASS(fres_contract_add_spare_capacity(contract, s) == 0);
+
+       WVFRSH(frsh_contract_set_reclamation_params(&contract,
+               &zero,
+               &utilization_set.utilizations[utilization_set.size-1].budget,
+               &utilization_set.utilizations[utilization_set.size-1].period,
+               FRSH_GR_DISCRETE,
+               &utilization_set,
+               0,
+               0));
+
        WVFRSH(frsh_contract_negotiate(&contract, &vres));
        WVFRSH(frsh_send_endpoint_bind(vres, sepoint));
 
-       //TODO : Create vres
-       // Create vres
-       //vparam.ac_id = FWP_AC_VO;     
-       //vparam.budget = size_of_budget_actual;
-       //vparam.period.tv_sec = 0; 
-       //vparam.period.tv_nsec = size_of_period_ms*1000*1000; 
-       //printf("Create VRES\n");
-       //if (fwp_vres_create(&vparam, &vres) < 0) {
-       //      printf("Unable to create VRES\n");
-       //      return -1;
-       //}
-       //printf("VRES created \n");
+       if (opt_daemon)
+               forb_daemon_ready();
 
        count = 0;
        while (count != num_msg) {
-               // TODO: Synchronize with receiver
-               sleep(1);
                count++;
-               // TODO: call fres_... function to find out actuall budget
-               //if(frsh_vres_get_budget_and_period (const frsh_vres_id_t vres, frsh_rel_time_t *budget, frsh_rel_time_t *period) != 0)
-               //      printf("Error");
-               WVPASSEQ(frsh_send_async(sepoint, msg, msg_size), msg_size);
-       }
+               WVPASS(frsh_vres_get_budget_and_period (vres, &budget, &period) == 0);
+               WVFRSH(frsh_network_budget_to_bytes(resource_id, &budget, &msg_size));
+
+               //TODO: Delete printf below
+               printf("msg_size....%d\n", msg_size);
+               printf("count....%d\n", count);
 
-       /* TODO: destroy vres and send enpoint */
+               msg = prepare_msg(msg_size);
+               WVPASSEQ(frsh_send_sync(sepoint, msg, msg_size), msg_size);
+       }
 
+       frsh_contract_cancel(vres);
+       frsh_contract_destroy((struct fres_contract **)contract);
        printf("Test PASSED!\n");
        return 0;
 }