diff options
author | Tobias Brunner <tobias@strongswan.org> | 2009-05-12 17:35:19 +0200 |
---|---|---|
committer | Tobias Brunner <tobias@strongswan.org> | 2009-05-12 17:40:43 +0200 |
commit | 75a354bb6b1cc57c76811caba8aa6419cb3751d1 (patch) | |
tree | 6d33012bcbd788e18eacb48350ba96657b85a005 /src | |
parent | 0a3ca29021ffe389ae4f7400ee05f42dcf384d6b (diff) | |
download | strongswan-75a354bb6b1cc57c76811caba8aa6419cb3751d1.tar.bz2 strongswan-75a354bb6b1cc57c76811caba8aa6419cb3751d1.tar.xz |
fixing compilation of socket_t on systems that have neither IP_PKTINFO (Linux) nor IP_SENDSRCADDR (FreeBSD)
Diffstat (limited to 'src')
-rw-r--r-- | src/charon/network/socket.c | 55 |
1 files changed, 33 insertions, 22 deletions
diff --git a/src/charon/network/socket.c b/src/charon/network/socket.c index 5ccc9bfa9..ba3b37a73 100644 --- a/src/charon/network/socket.c +++ b/src/charon/network/socket.c @@ -54,7 +54,11 @@ /* these are not defined on some platforms */ #ifndef SOL_IP #define SOL_IP IPPROTO_IP +#endif +#ifndef SOL_IPV6 #define SOL_IPV6 IPPROTO_IPV6 +#endif +#ifndef SOL_UDP #define SOL_UDP IPPROTO_UDP #endif @@ -213,22 +217,24 @@ static status_t receiver(private_socket_t *this, packet_t **packet) dest = host_create_from_sockaddr((sockaddr_t*)&dst); } if (cmsgptr->cmsg_level == SOL_IP && -#ifdef IP_RECVDSTADDR +#ifdef IP_PKTINFO + cmsgptr->cmsg_type == IP_PKTINFO +#elif defined(IP_RECVDSTADDR) cmsgptr->cmsg_type == IP_RECVDSTADDR #else - cmsgptr->cmsg_type == IP_PKTINFO + FALSE #endif ) { struct in_addr *addr; - struct sockaddr_in dst; + struct sockaddr_in dst; -#ifdef IP_RECVDSTADDR - addr = (struct in_addr*)CMSG_DATA(cmsgptr); -#else +#ifdef IP_PKTINFO struct in_pktinfo *pktinfo; pktinfo = (struct in_pktinfo*)CMSG_DATA(cmsgptr); addr = &pktinfo->ipi_addr; +#elif defined(IP_RECVDSTADDR) + addr = (struct in_addr*)CMSG_DATA(cmsgptr); #endif memset(&dst, 0, sizeof(dst)); memcpy(&dst.sin_addr, addr, sizeof(dst.sin_addr)); @@ -355,31 +361,33 @@ status_t sender(private_socket_t *this, packet_t *packet) { if (family == AF_INET) { +#if defined(IP_PKTINFO) || defined(IP_SENDSRCADDR) struct in_addr *addr; struct sockaddr_in *sin; -#ifdef IP_SENDSRCADDR - char buf[CMSG_SPACE(sizeof(struct in_addr))]; -#else +#ifdef IP_PKTINFO char buf[CMSG_SPACE(sizeof(struct in_pktinfo))]; struct in_pktinfo *pktinfo; +#elif defined(IP_SENDSRCADDR) + char buf[CMSG_SPACE(sizeof(struct in_addr))]; #endif msg.msg_control = buf; msg.msg_controllen = sizeof(buf); cmsg = CMSG_FIRSTHDR(&msg); cmsg->cmsg_level = SOL_IP; -#ifdef IP_SENDSRCADDR - cmsg->cmsg_type = IP_SENDSRCADDR; - cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_addr)); - addr = (struct in_addr*)CMSG_DATA(cmsg); -#else +#ifdef IP_PKTINFO cmsg->cmsg_type = IP_PKTINFO; cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo)); pktinfo = (struct in_pktinfo*)CMSG_DATA(cmsg); memset(pktinfo, 0, sizeof(struct in_pktinfo)); addr = &pktinfo->ipi_spec_dst; +#elif defined(IP_SENDSRCADDR) + cmsg->cmsg_type = IP_SENDSRCADDR; + cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_addr)); + addr = (struct in_addr*)CMSG_DATA(cmsg); #endif sin = (struct sockaddr_in*)src->get_sockaddr(src); memcpy(addr, &sin->sin_addr, sizeof(struct in_addr)); +#endif /* IP_PKTINFO || IP_SENDSRCADDR */ } else { @@ -419,7 +427,7 @@ static int open_socket(private_socket_t *this, int family, u_int16_t port) int type = UDP_ENCAP_ESPINUDP; struct sockaddr_storage addr; socklen_t addrlen; - u_int sol, pktinfo; + u_int sol, pktinfo = 0; int skt; memset(&addr, 0, sizeof(addr)); @@ -434,10 +442,10 @@ static int open_socket(private_socket_t *this, int family, u_int16_t port) sin->sin_port = htons(port); addrlen = sizeof(struct sockaddr_in); sol = SOL_IP; -#ifdef IP_RECVDSTADDR - pktinfo = IP_RECVDSTADDR; -#else +#ifdef IP_PKTINFO pktinfo = IP_PKTINFO; +#elif defined(IP_RECVDSTADDR) + pktinfo = IP_RECVDSTADDR; #endif break; } @@ -478,11 +486,14 @@ static int open_socket(private_socket_t *this, int family, u_int16_t port) } /* get additional packet info on receive */ - if (setsockopt(skt, sol, pktinfo, &on, sizeof(on)) < 0) + if (pktinfo > 0) { - DBG1(DBG_NET, "unable to set IP_PKTINFO on socket: %s", strerror(errno)); - close(skt); - return 0; + if (setsockopt(skt, sol, pktinfo, &on, sizeof(on)) < 0) + { + DBG1(DBG_NET, "unable to set IP_PKTINFO on socket: %s", strerror(errno)); + close(skt); + return 0; + } } /* enable UDP decapsulation globally, only for one socket needed */ |