Support IPv6 link-local addresses

Use `getaddrinfo` in `parse_address` instead of `inet_pton`.
Display Ipv6 addresses with scope identifiers correctly in `get_ip`
functions using `if_indextoname`.
This commit is contained in:
dsee 2024-02-25 09:19:11 +01:00 committed by Wim Taymans
parent c3d3e6f48b
commit 4888b35284
9 changed files with 107 additions and 275 deletions

View file

@ -36,6 +36,7 @@
#include "module-netjack2/packets.h"
#include "module-netjack2/peer.c"
#include "network-utils.h"
#ifdef __FreeBSD__
#define ifr_ifindex ifr_index
@ -738,26 +739,6 @@ static int create_filters(struct follower *follower)
return res;
}
static int parse_address(const char *address, uint16_t port,
struct sockaddr_storage *addr, socklen_t *len)
{
struct sockaddr_in *sa4 = (struct sockaddr_in*)addr;
struct sockaddr_in6 *sa6 = (struct sockaddr_in6*)addr;
if (inet_pton(AF_INET, address, &sa4->sin_addr) > 0) {
sa4->sin_family = AF_INET;
sa4->sin_port = htons(port);
*len = sizeof(*sa4);
} else if (inet_pton(AF_INET6, address, &sa6->sin6_addr) > 0) {
sa6->sin6_family = AF_INET6;
sa6->sin6_port = htons(port);
*len = sizeof(*sa6);
} else
return -EINVAL;
return 0;
}
static bool is_multicast(struct sockaddr *sa, socklen_t salen)
{
if (sa->sa_family == AF_INET) {
@ -882,20 +863,6 @@ error:
return res;
}
static const char *get_ip(const struct sockaddr_storage *sa, char *ip, size_t len)
{
if (sa->ss_family == AF_INET) {
struct sockaddr_in *in = (struct sockaddr_in*)sa;
inet_ntop(sa->ss_family, &in->sin_addr, ip, len);
} else if (sa->ss_family == AF_INET6) {
struct sockaddr_in6 *in = (struct sockaddr_in6*)sa;
inet_ntop(sa->ss_family, &in->sin6_addr, ip, len);
} else {
snprintf(ip, len, "invalid address");
}
return ip;
}
static int handle_follower_available(struct impl *impl, struct nj2_session_params *params,
struct sockaddr_storage *addr, socklen_t addr_len)
{
@ -1039,8 +1006,7 @@ static int handle_follower_available(struct impl *impl, struct nj2_session_param
nj2_session_params_hton(params, &peer->params);
params->packet_id = htonl(NJ2_ID_FOLLOWER_SETUP);
pw_log_info("sending follower setup to %s", get_ip(addr, buffer, sizeof(buffer)));
pw_log_info("sending follower setup to %s", get_ip_fmt(addr, buffer, sizeof(buffer)));
nj2_dump_session_params(params);
send(follower->socket->fd, params, sizeof(*params), 0);
@ -1139,7 +1105,7 @@ static int create_netjack2_socket(struct impl *impl)
goto out;
}
pw_log_info("listening for AVAILABLE on %s",
get_ip(&impl->src_addr, buffer, sizeof(buffer)));
get_ip_fmt(&impl->src_addr, buffer, sizeof(buffer)));
return 0;
out:
return res;