]> rtime.felk.cvut.cz Git - frescor/fwp.git/commitdiff
Rework fwp_send() to obey src parameter
authorMichal Sojka <sojkam1@fel.cvut.cz>
Mon, 26 Oct 2009 16:38:08 +0000 (17:38 +0100)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Mon, 26 Oct 2009 17:03:46 +0000 (18:03 +0100)
I had to replace send() by sendmsg() in order to specify control message
which is the only way to specify source interface.

fwp/lib/frsh_fwp/fwp_fra.c
fwp/lib/fwp/fwp_utils.h
fwp/lib/fwp/fwp_vres.c

index 85038db65b4576d4500b08ac3dc79c700156a778..813cd5e5bc9a8852adc1a8cdf98e4296dc4028b2 100644 (file)
@@ -65,11 +65,11 @@ static int create_vres(fres_vres_t *vres, void *priv)
        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);
@@ -85,7 +85,7 @@ static int create_vres(fres_vres_t *vres, void *priv)
        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))) {
@@ -94,7 +94,7 @@ 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%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);
        
index bf20ec5f5fb5409b158aba0834ca6e961a527b52..3b0b77b1589ef7e6127aa3f3e486e8c43b25cac4 100644 (file)
@@ -82,14 +82,6 @@ _fwp_recvfrom(int s, void *buf, size_t len, int flags,
        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)
 {
index 83f872568aedb25ea28bb8cd9fcb119cbf042a5a..8ef6f0389881e0d45460b8d3fdc53a3b13ea8447 100644 (file)
@@ -180,11 +180,39 @@ static int fwp_vres_ac_open(fwp_ac_t ac_id)
 }
 #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)
@@ -436,7 +464,7 @@ static void* fwp_vres_tx_thread(void *_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;