.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;
}
#include "fwp_res.h"
#include "fwp_idl.h"
#include <stdio.h>
+#include <arpa/inet.h>
UL_LOG_CUST(ulogd_fra_fwp);
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);
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;
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;
}
*/
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;
+ };
};
};
#ifndef _FWP_VRES_H
#define _FWP_VRES_H
+#include <netinet/in.h>
+
struct fwp_vres;
typedef struct fwp_vres* fwp_vres_d_t;
/** 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);