26 RCSID(
"$Id: 3d1794bffa841e33d7c761f94c6d22b82d62d4fe $")
28 #include <freeradius-devel/udp.h>
36 #define UDP_UNUSED UNUSED
39 #define FR_DEBUG_STRERROR_PRINTF if (fr_debug_lvl) fr_strerror_printf
60 rcode = send(sockfd, data, data_len, 0);
63 struct sockaddr_storage dst;
79 if ((src_ipaddr->af != AF_UNSPEC) && (dst_ipaddr->
af != AF_UNSPEC) &&
81 struct sockaddr_storage src;
86 rcode = sendfromto(sockfd, data, data_len, 0,
87 (
struct sockaddr *)&src, sizeof_src,
88 (
struct sockaddr *)&dst, sizeof_dst, if_index);
91 rcode = sendto(sockfd, data, data_len, 0,
92 (
struct sockaddr *) &dst, sizeof_dst);
108 struct sockaddr_storage src;
109 socklen_t sizeof_src =
sizeof(src);
111 (void) recvfrom(sockfd, data,
sizeof(data), 0,
112 (
struct sockaddr *)&src, &sizeof_src);
128 struct sockaddr_storage src;
129 socklen_t sizeof_src =
sizeof(src);
132 peeked = recv(sockfd, data, data_len, MSG_PEEK);
134 if ((errno == EAGAIN) || (errno == EINTR))
return 0;
141 peeked = recvfrom(sockfd, data, data_len, MSG_PEEK, (
struct sockaddr *)&src, &sizeof_src);
143 if ((errno == EAGAIN) || (errno == EINTR))
return 0;
180 struct timeval *when)
183 struct sockaddr_storage src;
184 struct sockaddr_storage dst;
185 socklen_t sizeof_src =
sizeof(src);
186 socklen_t sizeof_dst =
sizeof(dst);
206 #ifdef WITH_UDPFROMTO
208 received = recvfromto(sockfd, data, data_len, sock_flags,
209 (
struct sockaddr *)&src, &sizeof_src,
210 (
struct sockaddr *)&dst, &sizeof_dst,
213 received = recvfrom(sockfd, data, data_len, sock_flags,
214 (
struct sockaddr *)&src, &sizeof_src);
217 received = recvfrom(sockfd, data, data_len, sock_flags,
218 (
struct sockaddr *)&src, &sizeof_src);
223 if (dst_ipaddr && (getsockname(sockfd, (
struct sockaddr *)&dst, &sizeof_dst) < 0))
return -1;
225 if (if_index) *if_index = 0;
228 if (received < 0)
return received;
233 if (when && !when->tv_sec) gettimeofday(when, NULL);
int fr_ipaddr_from_sockaddr(struct sockaddr_storage const *sa, socklen_t salen, fr_ipaddr_t *ipaddr, uint16_t *port)
int fr_is_inaddr_any(fr_ipaddr_t *ipaddr)
Determine if an address is the INADDR_ANY address for its address family.
ssize_t udp_recv(int sockfd, void *data, size_t data_len, int flags, fr_ipaddr_t *src_ipaddr, uint16_t *src_port, fr_ipaddr_t *dst_ipaddr, uint16_t *dst_port, UDP_UNUSED int *if_index, struct timeval *when)
Read a UDP packet.
ssize_t udp_send(int sockfd, void *data, size_t data_len, int flags, UDP_UNUSED fr_ipaddr_t *src_ipaddr, UDP_UNUSED uint16_t src_port, UDP_UNUSED int if_index, fr_ipaddr_t *dst_ipaddr, uint16_t dst_port)
Send a packet via a UDP socket.
char const * fr_syserror(int num)
Guaranteed to be thread-safe version of strerror.
void udp_recv_discard(int sockfd)
Discard the next UDP packet.
ssize_t udp_recv_peek(int sockfd, void *data, size_t data_len, int flags, fr_ipaddr_t *src_ipaddr, uint16_t *src_port)
Peek at the header of a UDP packet.
#define FR_DEBUG_STRERROR_PRINTF
void fr_strerror_printf(char const *,...) CC_HINT(format(printf
#define UDP_FLAGS_CONNECTED
int fr_ipaddr_to_sockaddr(fr_ipaddr_t const *ipaddr, uint16_t port, struct sockaddr_storage *sa, socklen_t *salen)