coap_io.c: set send address when IP_PKTINFO is missing

Try IP_SENDSRCADDR to set the address of the sending interface for
sendmsg() on platforms that do not provide IP_PKTINFO (such as
FreeBSD).
This commit is contained in:
Olaf Bergmann committed 2018-12-13 17:08:11 +01:00
1 parent e6661fbdfc
commit 167ce8b144
1 file changed
+21
+21
View File
@@ -812,6 +812,16 @@ coap_network_send(coap_socket_t *sock, const coap_session_t *session, const uint
pktinfo->ipi_ifindex = session->ifindex;
memcpy(&pktinfo->ipi_spec_dst, session->local_addr.addr.sin6.sin6_addr.s6_addr + 12, sizeof(pktinfo->ipi_spec_dst));
#elif defined(IP_SENDSRCADDR)
mhdr.msg_control = buf;
mhdr.msg_controllen = CMSG_SPACE(sizeof(struct in_addr));
cmsg = CMSG_FIRSTHDR(&mhdr);
cmsg->cmsg_level = IPPROTO_IP;
cmsg->cmsg_type = IP_SENDSRCADDR;
cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_addr));
memcpy(CMSG_DATA(cmsg), session->local_addr.addr.sin6.sin6_addr.s6_addr + 12, sizeof(struct in_addr));
#endif /* IP_PKTINFO */
} else {
struct in6_pktinfo *pktinfo;
@@ -848,6 +858,17 @@ coap_network_send(coap_socket_t *sock, const coap_session_t *session, const uint
pktinfo->ipi_ifindex = session->ifindex;
memcpy(&pktinfo->ipi_spec_dst, &session->local_addr.addr.sin.sin_addr, sizeof(pktinfo->ipi_spec_dst));
#elif defined(IP_SENDSRCADDR)
struct cmsghdr *cmsg;
mhdr.msg_control = buf;
mhdr.msg_controllen = CMSG_SPACE(sizeof(struct in_addr));
cmsg = CMSG_FIRSTHDR(&mhdr);
cmsg->cmsg_level = IPPROTO_IP;
cmsg->cmsg_type = IP_SENDSRCADDR;
cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_addr));
memcpy(CMSG_DATA(cmsg), &session->local_addr.addr.sin.sin_addr, sizeof(struct in_addr));
#endif /* IP_PKTINFO */
break;
}