--- src/libradius/radius_socket.c.orig 2023-03-28 04:00:49.000000000 +0700 +++ src/libradius/radius_socket.c 2023-11-07 14:02:24.056213000 +0700 @@ -130,6 +130,15 @@ struct private_radius_socket_t { static bool check_connection(private_radius_socket_t *this, int *fd, uint16_t port) { + union { + struct sockaddr sockaddr; + struct sockaddr_in sin; + struct sockaddr_in6 sin6; + } addr; + socklen_t addrlen; + char *s; + int family; + if (*fd == -1) { host_t *server; @@ -141,13 +150,29 @@ static bool check_connection(private_radius_socket_t * this->address); return FALSE; } - *fd = socket(server->get_family(server), SOCK_DGRAM, IPPROTO_UDP); + + family = server->get_family(server); + *fd = socket(family, SOCK_DGRAM, IPPROTO_UDP); if (*fd == -1) { DBG1(DBG_CFG, "opening RADIUS socket for %#H failed: %s", server, strerror(errno)); server->destroy(server); return FALSE; + } + + switch (family) + { + case AF_INET: + memset(&addr, 0, sizeof(addr)); + addr.sockaddr.sa_family = family; + addrlen = sizeof(addr.sin); + s = getenv("STRONGSWAN_RADCLIENT_BIND"); + if (s && inet_pton(family, s, &addr.sin.sin_addr)) + if (bind(*fd, &addr.sockaddr, addrlen) < 0) + DBG1(DBG_NET, + "unable to bind RADIUS socket to %s: %s", + s, strerror(errno)); } if (connect(*fd, server->get_sockaddr(server), *server->get_sockaddr_len(server)) < 0)