1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-24 21:34:56 +03:00

swrap: Implement support for IP_RECVDSTADDR on BSD.

Pair-Programmed-With: Michael Adam <obnox@samba.org>
Signed-off-by: Andreas Schneider <asn@samba.org>
Signed-off-by: Michael Adam <obnox@samba.org>
This commit is contained in:
Andreas Schneider 2014-06-03 15:02:17 +02:00 committed by Michael Adam
parent aa1e24ead4
commit 0247bdbbc8

View File

@ -125,6 +125,18 @@ enum swrap_dbglvl_e {
# endif /* IPV6_RECVPKTINFO */
#endif /* IPV6_PKTINFO */
/*
* On BSD IP_PKTINFO has a different name because during
* the time when they implemented it, there was no RFC.
* The name for IPv6 is the same as on Linux.
*/
#ifndef IP_PKTINFO
# ifdef IP_RECVDSTADDR
# define IP_PKTINFO IP_RECVDSTADDR
# endif
#endif
#define SWRAP_DLIST_ADD(list,item) do { \
if (!(list)) { \
(item)->prev = NULL; \
@ -3053,10 +3065,15 @@ static int swrap_msghdr_add_pktinfo(struct socket_info *si,
{
/* Add packet info */
switch (si->pktinfo) {
#if defined(IP_PKTINFO) && defined(HAVE_STRUCT_IN_PKTINFO)
#if defined(IP_PKTINFO)
/* && (defined(HAVE_STRUCT_IN_PKTINFO) || defined(IP_RECVDSTADDR)) */
case AF_INET: {
struct sockaddr_in *sin;
#if defined(HAVE_STRUCT_IN_PKTINFO)
struct in_pktinfo pkt;
#elif defined(IP_RECVDSTADDR)
struct in_addr pkt;
#endif
if (si->bindname_len == sizeof(struct sockaddr_in)) {
sin = (struct sockaddr_in*)si->bindname;
@ -3069,8 +3086,12 @@ static int swrap_msghdr_add_pktinfo(struct socket_info *si,
ZERO_STRUCT(pkt);
#if defined(HAVE_STRUCT_IN_PKTINFO)
pkt.ipi_ifindex = socket_wrapper_default_iface();
pkt.ipi_addr.s_addr = sin->sin_addr.s_addr;
#elif defined(IP_RECVDSTADDR)
pkt = sin->sin_addr;
#endif
swrap_msghdr_add_cmsghdr(msg, IPPROTO_IP, IP_PKTINFO,
&pkt, sizeof(pkt));