summaryrefslogtreecommitdiff
path: root/ospfd/ospf_packet.c
diff options
context:
space:
mode:
Diffstat (limited to 'ospfd/ospf_packet.c')
-rw-r--r--ospfd/ospf_packet.c22
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,