From 57079ad5a516f538aba6d6dc6ddcb35f38f6b338 Mon Sep 17 00:00:00 2001 From: Michal Sojka Date: Mon, 26 Oct 2009 17:23:31 +0100 Subject: [PATCH] Introduce src parameter in FWP contracts 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 | 17 +++++++++++++++-- fwp/lib/frsh_fwp/fwp_fra.c | 15 ++++++++++++--- fwp/lib/frsh_fwp/fwp_idl.idl | 10 ++++++++++ fwp/lib/fwp/fwp_vres.h | 5 +++++ 4 files changed, 42 insertions(+), 5 deletions(-) diff --git a/fwp/lib/frsh_fwp/fwp_block.c b/fwp/lib/frsh_fwp/fwp_block.c index 596ff67..44ba0fe 100644 --- a/fwp/lib/frsh_fwp/fwp_block.c +++ b/fwp/lib/frsh_fwp/fwp_block.c @@ -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; } diff --git a/fwp/lib/frsh_fwp/fwp_fra.c b/fwp/lib/frsh_fwp/fwp_fra.c index 31559cc..85038db 100644 --- a/fwp/lib/frsh_fwp/fwp_fra.c +++ b/fwp/lib/frsh_fwp/fwp_fra.c @@ -52,6 +52,7 @@ #include "fwp_res.h" #include "fwp_idl.h" #include +#include 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; } diff --git a/fwp/lib/frsh_fwp/fwp_idl.idl b/fwp/lib/frsh_fwp/fwp_idl.idl index 399d9af..26577c2 100644 --- a/fwp/lib/frsh_fwp/fwp_idl.idl +++ b/fwp/lib/frsh_fwp/fwp_idl.idl @@ -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; + }; }; }; diff --git a/fwp/lib/fwp/fwp_vres.h b/fwp/lib/fwp/fwp_vres.h index 44f9d6b..24188f8 100644 --- a/fwp/lib/fwp/fwp_vres.h +++ b/fwp/lib/fwp/fwp_vres.h @@ -46,6 +46,8 @@ #ifndef _FWP_VRES_H #define _FWP_VRES_H +#include + 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); -- 2.39.2