]> rtime.felk.cvut.cz Git - frescor/fwp.git/commitdiff
Introduce src parameter in FWP contracts
authorMichal Sojka <sojkam1@fel.cvut.cz>
Mon, 26 Oct 2009 16:23:31 +0000 (17:23 +0100)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Mon, 26 Oct 2009 17:03:40 +0000 (18:03 +0100)
If set, this parameter will be used to force the packets to be sent through
a specific interface given by IPv4 address of the interface.

fwp/lib/frsh_fwp/fwp_block.c
fwp/lib/frsh_fwp/fwp_fra.c
fwp/lib/frsh_fwp/fwp_idl.idl
fwp/lib/fwp/fwp_vres.h

index 596ff670f229d8ff4de7a909f45bc743884999a4..44ba0fee28614dbdaa2a719fc2d69bc36ba59908 100644 (file)
@@ -53,9 +53,22 @@ static const struct fres_block_desc fwp_sched_block_desc = {
        .duplicate = fres_block_duplicate_default
 };
 
+static const struct fres_block_desc fwp_block_desc = {
+       .size = sizeof(fres_block_fwp),
+       .serialize = (fres_block_serialize_fnc_t*)fres_block_fwp_serialize,
+       .deserialize = (fres_block_deserialize_fnc_t*)fres_block_fwp_deserialize,
+       .duplicate = fres_block_duplicate_default
+};
+
 int fres_block_register_fwp()
 {
-               return fres_block_register(FRES_BLOCK_FWP_SCHED,
-                                                  &fwp_sched_block_desc);
+       int ret;
+       ret = fres_block_register(FRES_BLOCK_FWP_SCHED,
+                                 &fwp_sched_block_desc);
+       if (ret)
+               return ret;
+       ret = fres_block_register(FRES_BLOCK_FWP,
+                                 &fwp_block_desc);
+       return ret;
 }
 
index 31559cc12ca8187b9e6243ed0e5b5a96500b260a..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,10 +64,12 @@ 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);
@@ -74,10 +77,16 @@ static int create_vres(fres_vres_t *vres, void *priv)
        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;
+       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;
@@ -85,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));
-       ul_logmsg("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;
 }
index 399d9afab56a9c194b9a197f837db0342fd3115c..26577c27c14a8b10cf9e8757543bfbbdea1c802e 100644 (file)
@@ -9,8 +9,18 @@
  */
 module fres {
        module block {
+               /// Data passed from FWP manager to allocator.
                struct fwp_sched {
                        octet ac_id;
                };
+               /// Data passed by application to manager and/or
+               /// allocator.
+               struct fwp {
+                       /// Non-zero value speciefies source address
+                       /// used for sending packets. This value is
+                       /// used to set ipi_spec_dst field of
+                       /// IP_PKTINFO socket option - see ip(7).
+                       long src;
+               };
        };
 };
index 44f9d6b6c4fa1a4f22ad7e5fdd9df88d938fff76..24188f8c6288eb42be3770aafe44a0a59edf6687 100644 (file)
@@ -46,6 +46,8 @@
 #ifndef _FWP_VRES_H
 #define _FWP_VRES_H
 
+#include <netinet/in.h>
+
 struct fwp_vres;
 typedef struct fwp_vres* fwp_vres_d_t;
 
@@ -83,6 +85,9 @@ struct fwp_vres_params {
        /** all time units are in microseconds */       
        fwp_period_t    period; 
        fwp_ac_t        ac_id;          /**< AC id ~ priority of vres */
+       /** Forced source address. If non-zero, packets are sent over
+        * the specified interface. */
+       struct in_addr  src;
 } fwp_vres_params_t;
 
 int fwp_vres_table_init(unsigned int max_vres);