]> rtime.felk.cvut.cz Git - frescor/fwp.git/blobdiff - fwp/lib/frsh_fwp/fwp_fra.c
Introduce src parameter in FWP contracts
[frescor/fwp.git] / fwp / lib / frsh_fwp / fwp_fra.c
index b466306cb774653a3878757b38469e7b50386f4a..85038db65b4576d4500b08ac3dc79c700156a778 100644 (file)
@@ -52,6 +52,7 @@
 #include "fwp_res.h"
 #include "fwp_idl.h"
 #include <stdio.h>
+#include <arpa/inet.h>
 
 
 UL_LOG_CUST(ulogd_fra_fwp);
@@ -63,19 +64,29 @@ static int create_vres(fres_vres_t *vres, void *priv)
        char id[40];
        fres_block_basic *basic;
        fres_block_fwp_sched *fwp_sched;
+       fres_block_fwp *fwp;
        fwp_vres_params_t vparams;
-       fwp_vres_d_t      fwp_vresd;
+       fwp_vres_d_t      fwp_vresd = {0};
        int rv;
        size_t bytes;
+       char src[21] = "";
        
        /* Prepare vres parameters */
        basic = fres_contract_get_basic(vres->new);
        fwp_sched = fres_contract_get_block(vres->new, FRES_BLOCK_FWP_SCHED);
+       if (!fwp_sched)
+               return FRES_ERR_NEEDS_MORE_DATA_IN_CONTRACT;
+
+       fwp = fres_contract_get_block(vres->new, FRES_BLOCK_FWP);
 
        frsh_network_budget_to_bytes(FRSH_NETPF_FWP, &basic->budget, &bytes);
        vparams.budget = bytes;
        vparams.period = basic->period;
-       vparams.ac_id = fwp_sched->ac_id;       
+       vparams.ac_id = fwp_sched->ac_id;
+       if (fwp) {
+               vparams.src.s_addr = fwp->src;
+               snprintf(src, sizeof(src), " src=%s", inet_ntoa(vparams.src));
+       }
        /* Create vres */
        if ((rv = fwp_vres_create(&vparams, &fwp_vresd))) {
                return  rv;
@@ -83,9 +94,9 @@ static int create_vres(fres_vres_t *vres, void *priv)
        vres->priv = fwp_vresd;
 
        fres_contract_id_to_string(id, &vres->id, sizeof(id));
-       printf("Creating FWP VRes (id=%s, period=%ld ms, budget=%ld bytes AC=%d)\n",
+       ul_logmsg("Creating FWP VRes (id=%s, period=%ld ms, budget=%ld bytes AC=%d%s)\n",
                id, fosa_rel_time_to_msec(basic->period), 
-               vparams.budget, vparams.ac_id);
+                 vparams.budget, vparams.ac_id, src);
        
        return 0;
 }
@@ -101,7 +112,7 @@ static int cancel_vres(fres_vres_t *vres, void *priv)
 
        basic = fres_contract_get_basic(vres->allocated);
        fres_contract_id_to_string(id, &vres->id, sizeof(id));
-       printf("Creating FWP VRes (id=%s, period=%ld ms, budget=%ld bytes)\n",
+       ul_logmsg("Canceling FWP VRes (id=%s, period=%ld ms, budget=%ld bytes)\n",
               id, fosa_rel_time_to_msec(basic->period), basic->budget.tv_sec);
 
        return 0;
@@ -109,6 +120,36 @@ static int cancel_vres(fres_vres_t *vres, void *priv)
 
 int change_vres(fres_vres_t *vres, void *priv)
 {
+       char id[40];
+       fres_block_basic *basic;
+       fres_block_fwp_sched *fwp_sched;
+       fwp_vres_params_t vparams;
+       fwp_vres_d_t      fwp_vresd;
+       int rv;
+       size_t bytes;
+       
+       /* Prepare vres parameters */
+       basic = fres_contract_get_basic(vres->new);
+       fwp_sched = fres_contract_get_block(vres->new, FRES_BLOCK_FWP_SCHED);
+
+       frsh_network_budget_to_bytes(FRSH_NETPF_FWP, &basic->budget, &bytes);
+       vparams.budget = bytes;
+       vparams.period = basic->period;
+       vparams.ac_id = fwp_sched->ac_id;
+       fwp_vresd = vres->priv;
+
+       /* Changing vres */
+       if ((rv = fwp_vres_set_params(fwp_vresd, &vparams))) {
+               return  rv;
+       }
+
+       fres_contract_id_to_string(id, &vres->id, sizeof(id));
+       printf("Changing FWP VRes (id=%s, period=%ld ms, budget=%ld bytes AC=%d)\n",
+               id, fosa_rel_time_to_msec(basic->period), 
+               vparams.budget, vparams.ac_id);
+
+       vres->perceived = vres->new;
+       
        return 0;
 }