diff options
| author | Chirag Shah <chirag@cumulusnetworks.com> | 2017-09-12 17:27:26 -0700 |
|---|---|---|
| committer | Chirag Shah <chirag@cumulusnetworks.com> | 2017-10-03 09:22:47 -0700 |
| commit | e7503eab31d1efc6586b785ebc00b79b0497dc1e (patch) | |
| tree | bfb1ae50be3c886da64c32e2d1d2cf4ca1c1397a /ospfd/ospf_packet.c | |
| parent | 35955c14c2a553b567fc479277b8008028ae2a1e (diff) | |
ospfd: Bind socket to vrf device
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
Diffstat (limited to 'ospfd/ospf_packet.c')
| -rw-r--r-- | ospfd/ospf_packet.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/ospfd/ospf_packet.c b/ospfd/ospf_packet.c index 6ac7bdc2b4..a9a4adf72c 100644 --- a/ospfd/ospf_packet.c +++ b/ospfd/ospf_packet.c @@ -648,6 +648,9 @@ static int ospf_write(struct thread *thread) /* clang-format off */ #define OSPF_WRITE_IPHL_SHIFT 2 int pkt_count = 0; + unsigned char cmsgbuf[64] = {}; + struct cmsghdr *cm = (struct cmsghdr *)cmsgbuf; + struct in_pktinfo *pi; ospf->t_write = NULL; @@ -753,14 +756,27 @@ static int ospf_write(struct thread *thread) msg.msg_namelen = sizeof(sa_dst); msg.msg_iov = iov; msg.msg_iovlen = 2; + msg.msg_control = (caddr_t)cm; + iov[0].iov_base = (char *)&iph; iov[0].iov_len = iph.ip_hl << OSPF_WRITE_IPHL_SHIFT; iov[1].iov_base = STREAM_PNT(op->s); iov[1].iov_len = op->length; -/* Sadly we can not rely on kernels to fragment packets because of either - * IP_HDRINCL and/or multicast destination being set. - */ + cm->cmsg_level = SOL_IP; + cm->cmsg_type = IP_PKTINFO; + cm->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo)); + pi = (struct in_pktinfo *)CMSG_DATA(cm); + pi->ipi_ifindex = oi->ifp->ifindex; + + msg.msg_controllen = cm->cmsg_len; + + + /* Sadly we can not rely on kernels to fragment packets + * because of either IP_HDRINCL and/or multicast + * destination being set. + */ + #ifdef WANT_OSPF_WRITE_FRAGMENT if (op->length > maxdatasize) ospf_write_frags(ospf->fd, op, &iph, &msg, maxdatasize, |
