fres_block_basic *basic;
fres_block_fwp_sched *fwp_sched;
fres_block_fwp *fwp;
- fwp_vres_params_t vparams;
+ fwp_vres_params_t vparams = {0};
fwp_vres_d_t fwp_vresd = {0};
int rv;
size_t bytes;
- char src[21] = "";
+ char src[21] = "N/A";
/* Prepare vres parameters */
basic = fres_contract_get_basic(vres->new);
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));
+ snprintf(src, sizeof(src), "%s", inet_ntoa(vparams.src));
}
/* Create vres */
if ((rv = fwp_vres_create(&vparams, &fwp_vresd))) {
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%s)\n",
+ ul_logmsg("Creating FWP VRes (id=%s, period=%ld ms, budget=%ld bytes AC=%d src=%s)\n",
id, fosa_rel_time_to_msec(basic->period),
vparams.budget, vparams.ac_id, src);
return ret;
}
-static inline ssize_t
-_fwp_send(int s, const void *buf, size_t len, int flags)
-{
- ssize_t ret;
- ret = send(s, buf, len, flags);
- return ret;
-}
-
static inline ssize_t
_fwp_recv(int s, void *buf, size_t len, int flags)
{
}
#endif
-static inline int _fwp_vres_send(unsigned int ac_sockd, struct fwp_msgb* msgb)
+static inline int _fwp_vres_send(fwp_vres_t *vres, struct fwp_msgb* msgb)
{
- /*_fwp_sendto(ac_sockd, msgb->data, msgb->len, 0,
- msgb->peer->addr, msgb->peer->addrlen);*/
- return _fwp_send(ac_sockd, msgb->data, msgb->len, 0);
+ struct iovec iov;
+ struct msghdr msg = {0};
+ ssize_t ret;
+ char cmsg_buf[CMSG_SPACE(sizeof(struct in_pktinfo))];
+
+ iov.iov_base = msgb->data;
+ iov.iov_len = msgb->len;
+
+ msg.msg_iov = &iov;
+ msg.msg_iovlen = 1;
+
+
+
+ if (vres->params.src.s_addr != 0) {
+ struct cmsghdr *cmsg;
+ struct in_pktinfo *ipi;
+
+ msg.msg_control = cmsg_buf;
+ msg.msg_controllen = sizeof(cmsg_buf);
+
+ cmsg = CMSG_FIRSTHDR(&msg);
+
+ cmsg->cmsg_level = SOL_IP;
+ cmsg->cmsg_type = IP_PKTINFO;
+ cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo));
+
+ ipi = (struct in_pktinfo*)CMSG_DATA(cmsg);
+ ipi->ipi_spec_dst = vres->params.src;
+ }
+ ret = sendmsg(vres->ac_sockd, &msg, 0);
+ return ret;
}
static inline void fwp_vres_free(fwp_vres_t *vres)
curr_budget = budget;
}
- rc = _fwp_vres_send(vres->ac_sockd, msgb);
+ rc = _fwp_vres_send(vres, msgb);
if (!(rc < 0)) {
FWP_DEBUG("Message sent through AC%d\n",ac_id);
curr_budget -= msgb->len;