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.c51
1 files changed, 13 insertions, 38 deletions
diff --git a/ospfd/ospf_packet.c b/ospfd/ospf_packet.c
index 990fe6ab..67215ebc 100644
--- a/ospfd/ospf_packet.c
+++ b/ospfd/ospf_packet.c
@@ -31,6 +31,7 @@
#include "sockunion.h"
#include "stream.h"
#include "log.h"
+#include "sockopt.h"
#include "md5-gnu.h"
#include "ospfd/ospfd.h"
@@ -1880,17 +1881,17 @@ ospf_recv_packet (int fd, struct interface **ifp)
unsigned int ifindex = 0;
struct iovec iov;
struct cmsghdr *cmsg;
-#if defined (IP_PKTINFO)
- struct in_pktinfo *pktinfo;
-#elif defined (IP_RECVIF)
- struct sockaddr_dl *pktinfo;
-#else
- char *pktinfo; /* dummy */
-#endif
- char buff [sizeof (*cmsg) + sizeof (*pktinfo)];
- struct msghdr msgh = {NULL, 0, &iov, 1, buff,
- sizeof (*cmsg) + sizeof (*pktinfo), 0};
-
+ char buff [sizeof (*cmsg) + SOPT_SIZE_CMSG_PKTINFO_IPV4()];
+ struct msghdr msgh;
+
+ msgh.msg_name = NULL;
+ msgh.msg_namelen = 0;
+ msgh.msg_iov = &iov;
+ msgh.msg_iovlen = 1;
+ msgh.msg_control = (caddr_t) buff;
+ msgh.msg_controllen = sizeof (buff);
+ msgh.msg_flags = 0;
+
ret = recvfrom (fd, (void *)&iph, sizeof (iph), MSG_PEEK, NULL, 0);
if (ret != sizeof (iph))
@@ -1928,33 +1929,7 @@ ospf_recv_packet (int fd, struct interface **ifp)
iov.iov_len = ip_len;
ret = recvmsg (fd, &msgh, 0);
- cmsg = CMSG_FIRSTHDR (&msgh);
-
- if (cmsg != NULL && //cmsg->cmsg_len == sizeof (*pktinfo) &&
- cmsg->cmsg_level == IPPROTO_IP &&
-#if defined (IP_PKTINFO)
- cmsg->cmsg_type == IP_PKTINFO
-#elif defined (IP_RECVIF)
- cmsg->cmsg_type == IP_RECVIF
-#else
- 0
-#endif
- )
- {
-#if defined (IP_PKTINFO)
- pktinfo = (struct in_pktinfo *)CMSG_DATA(cmsg);
- ifindex = pktinfo->ipi_ifindex;
-#elif defined (IP_RECVIF)
-#ifdef SUNOS_5
- ifindex = *(uint_t *)CMSG_DATA(cmsg);
-#else
- pktinfo = (struct sockaddr_dl *)CMSG_DATA(cmsg);
- ifindex = pktinfo->sdl_index;
-#endif /* SUNOS_5 */
-#else
- ifindex = 0;
-#endif
- }
+ ifindex = getsockopt_pktinfo_ifindex (AF_INET, &msgh);
*ifp = if_lookup_by_index (ifindex);