fr_ipaddr_t *dst_ipaddr, int dst_port)
{
struct sockaddr_storage dst;
- socklen_t sizeof_dst = sizeof(dst);
+ socklen_t sizeof_dst;
#ifdef WITH_UDPFROMTO
struct sockaddr_storage src;
- socklen_t sizeof_src = sizeof(src);
-
- memset(&src, 0, sizeof(src));
-#endif
- memset(&dst, 0, sizeof(dst));
-
- /*
- * IPv4 is supported.
- */
- if (dst_ipaddr->af == AF_INET) {
- struct sockaddr_in s4;
-
- sizeof_dst = sizeof(s4);
-
- s4.sin_family = AF_INET;
- s4.sin_addr = dst_ipaddr->ipaddr.ip4addr;
- s4.sin_port = htons(dst_port);
- memset(&dst, 0, sizeof(dst));
- memcpy(&dst, &s4, sizeof_dst);
-
-#ifdef WITH_UDPFROMTO
- sizeof_src = sizeof(s4);
+ socklen_t sizeof_src;
- s4.sin_family = AF_INET;
- s4.sin_addr = src_ipaddr->ipaddr.ip4addr;
- s4.sin_port = htons(src_port);
- memset(&src, 0, sizeof(src));
- memcpy(&src, &s4, sizeof_src);
+ fr_ipaddr2sockaddr(src_ipaddr, src_port, &src, &sizeof_src);
#else
- src_port = src_port; /* -Wunused */
+ src_port = src_port; /* -Wunused */
#endif
- /*
- * IPv6 MAY be supported.
- */
-#ifdef HAVE_STRUCT_SOCKADDR_IN6
- } else if (dst_ipaddr->af == AF_INET6) {
- struct sockaddr_in6 s6;
-
- sizeof_dst = sizeof(s6);
-
- s6.sin6_family = AF_INET6;
- s6.sin6_addr = dst_ipaddr->ipaddr.ip6addr;
- s6.sin6_port = htons(dst_port);
- memset(&dst, 0, sizeof(dst));
- memcpy(&dst, &s6, sizeof_dst);
-
-#ifdef WITH_UDPFROMTO
- return -1; /* UDPFROMTO && IPv6 are not supported */
-#if 0
- sizeof_src = sizeof(s6);
-
- s6.sin6_family = AF_INET6;
- s6.sin6_addr = src_ipaddr->ipaddr.ip6addr;
- memset(&src, 0, sizeof(src));
- memcpy(&src, &s6, sizeof_src);
-#endif /* #if 0 */
-#endif /* WITH_UDPFROMTO */
-#endif /* HAVE_STRUCT_SOCKADDR_IN6 */
- } else return -1; /* Unknown address family, Die Die Die! */
+ if (!fr_ipaddr2sockaddr(dst_ipaddr, dst_port, &dst, &sizeof_dst)) {
+ return -1;
+ }
#ifdef WITH_UDPFROMTO
/*
}
}
- if (src.ss_family == AF_INET) {
- struct sockaddr_in s4;
-
- memcpy(&s4, &src, sizeof(s4));
- src_ipaddr->af = AF_INET;
- src_ipaddr->ipaddr.ip4addr = s4.sin_addr;
- *src_port = ntohs(s4.sin_port);
-
-#ifdef HAVE_STRUCT_SOCKADDR_IN6
- } else if (src.ss_family == AF_INET6) {
- struct sockaddr_in6 s6;
-
- memcpy(&s6, &src, sizeof(s6));
- src_ipaddr->af = AF_INET6;
- src_ipaddr->ipaddr.ip6addr = s6.sin6_addr;
- *src_port = ntohs(s6.sin6_port);
-
-#endif
- } else {
+ /*
+ * Convert AF. If unknown, discard packet.
+ */
+ if (!fr_sockaddr2ipaddr(&src, sizeof_src, src_ipaddr, src_port)) {
recvfrom(sockfd, header, sizeof(header), 0,
(struct sockaddr *)&src, &sizeof_src);
return 1;
uint8_t header[4];
void *buf;
size_t len;
+ int port;
memset(&src, 0, sizeof_src);
memset(&dst, 0, sizeof_dst);
return data_len;
}
- /*
- * Check address families, and update src/dst ports, etc.
- */
- if (src.ss_family == AF_INET) {
- struct sockaddr_in s4;
-
- memcpy(&s4, &src, sizeof(s4));
- src_ipaddr->af = AF_INET;
- src_ipaddr->ipaddr.ip4addr = s4.sin_addr;
- *src_port = ntohs(s4.sin_port);
-
- memcpy(&s4, &dst, sizeof(s4));
- dst_ipaddr->af = AF_INET;
- dst_ipaddr->ipaddr.ip4addr = s4.sin_addr;
- *dst_port = ntohs(s4.sin_port);
-
-#ifdef HAVE_STRUCT_SOCKADDR_IN6
- } else if (src.ss_family == AF_INET6) {
- struct sockaddr_in6 s6;
-
- memcpy(&s6, &src, sizeof(s6));
- src_ipaddr->af = AF_INET6;
- src_ipaddr->ipaddr.ip6addr = s6.sin6_addr;
- *src_port = ntohs(s6.sin6_port);
-
- memcpy(&s6, &dst, sizeof(s6));
- dst_ipaddr->af = AF_INET6;
- dst_ipaddr->ipaddr.ip6addr = s6.sin6_addr;
- *dst_port = ntohs(s6.sin6_port);
-#endif
- } else {
+ if (!fr_sockaddr2ipaddr(&src, sizeof_src, src_ipaddr, &port)) {
free(buf);
return -1; /* Unknown address family, Die Die Die! */
}
+ *src_port = port;
+
+ fr_sockaddr2ipaddr(&dst, sizeof_dst, dst_ipaddr, &port);
+ *dst_port = port;
/*
* Different address families should never happen.