mirror of
https://gitlab.freedesktop.org/pipewire/pipewire
synced 2024-10-07 00:20:09 +00:00
module-rtp: improve ipv5 support
Use the IPV6 versions for loop and ttl. Improve debug.
This commit is contained in:
parent
af59bf9137
commit
09feb8a18c
|
@ -414,6 +414,21 @@ static int make_unix_socket(const char *path) {
|
|||
return spa_steal_fd(fd);
|
||||
}
|
||||
|
||||
static int get_ip(const struct sockaddr_storage *sa, char *ip, size_t len, bool *ip4)
|
||||
{
|
||||
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
|
||||
return -EIO;
|
||||
if (ip4)
|
||||
*ip4 = sa->ss_family == AF_INET;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int make_send_socket(
|
||||
struct sockaddr_storage *src, socklen_t src_len,
|
||||
struct sockaddr_storage *sa, socklen_t salen,
|
||||
|
@ -437,13 +452,23 @@ static int make_send_socket(
|
|||
goto error;
|
||||
}
|
||||
if (is_multicast((struct sockaddr*)sa, salen)) {
|
||||
val = loop;
|
||||
if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, &val, sizeof(val)) < 0)
|
||||
pw_log_warn("setsockopt(IP_MULTICAST_LOOP) failed: %m");
|
||||
if (sa->ss_family == AF_INET) {
|
||||
val = loop;
|
||||
if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, &val, sizeof(val)) < 0)
|
||||
pw_log_warn("setsockopt(IP_MULTICAST_LOOP) failed: %m");
|
||||
|
||||
val = ttl;
|
||||
if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, &val, sizeof(val)) < 0)
|
||||
pw_log_warn("setsockopt(IP_MULTICAST_TTL) failed: %m");
|
||||
val = ttl;
|
||||
if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, &val, sizeof(val)) < 0)
|
||||
pw_log_warn("setsockopt(IP_MULTICAST_TTL) failed: %m");
|
||||
} else {
|
||||
val = loop;
|
||||
if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &val, sizeof(val)) < 0)
|
||||
pw_log_warn("setsockopt(IPV6_MULTICAST_LOOP) failed: %m");
|
||||
|
||||
val = ttl;
|
||||
if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &val, sizeof(val)) < 0)
|
||||
pw_log_warn("setsockopt(IPV6_MULTICAST_HOPS) failed: %m");
|
||||
}
|
||||
}
|
||||
return fd;
|
||||
error:
|
||||
|
@ -456,6 +481,7 @@ static int make_recv_socket(struct sockaddr_storage *sa, socklen_t salen,
|
|||
{
|
||||
int af, fd, val, res;
|
||||
struct ifreq req;
|
||||
char addr[128];
|
||||
|
||||
af = sa->ss_family;
|
||||
if ((fd = socket(af, SOCK_DGRAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0)) < 0) {
|
||||
|
@ -484,6 +510,8 @@ static int make_recv_socket(struct sockaddr_storage *sa, socklen_t salen,
|
|||
memset(&mr4, 0, sizeof(mr4));
|
||||
mr4.imr_multiaddr = sa4->sin_addr;
|
||||
mr4.imr_ifindex = req.ifr_ifindex;
|
||||
get_ip(sa, addr, sizeof(addr), NULL);
|
||||
pw_log_info("join IPV4 group: %s", addr);
|
||||
res = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mr4, sizeof(mr4));
|
||||
} else {
|
||||
sa4->sin_addr.s_addr = INADDR_ANY;
|
||||
|
@ -495,6 +523,8 @@ static int make_recv_socket(struct sockaddr_storage *sa, socklen_t salen,
|
|||
memset(&mr6, 0, sizeof(mr6));
|
||||
mr6.ipv6mr_multiaddr = sa6->sin6_addr;
|
||||
mr6.ipv6mr_interface = req.ifr_ifindex;
|
||||
get_ip(sa, addr, sizeof(addr), NULL);
|
||||
pw_log_info("join IPV6 group: %s iface:%d", addr, req.ifr_ifindex);
|
||||
res = setsockopt(fd, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mr6, sizeof(mr6));
|
||||
} else {
|
||||
sa6->sin6_addr = in6addr_any;
|
||||
|
@ -521,22 +551,6 @@ error:
|
|||
return res;
|
||||
}
|
||||
|
||||
static int get_ip(const struct sockaddr_storage *sa, char *ip, size_t len, bool *ip4)
|
||||
{
|
||||
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);
|
||||
*ip4 = false;
|
||||
} else
|
||||
return -EIO;
|
||||
if (ip4)
|
||||
*ip4 = sa->ss_family == AF_INET;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void update_ts_refclk(struct impl *impl)
|
||||
{
|
||||
if (!impl->ptp_mgmt_socket || impl->ptp_fd < 0)
|
||||
|
@ -1470,6 +1484,7 @@ static int start_sap(struct impl *impl)
|
|||
{
|
||||
int fd, res;
|
||||
struct timespec value, interval;
|
||||
char addr[128] = "invalid";
|
||||
|
||||
if ((fd = make_send_socket(&impl->src_addr, impl->src_len,
|
||||
&impl->sap_addr, impl->sap_len,
|
||||
|
@ -1494,7 +1509,8 @@ static int start_sap(struct impl *impl)
|
|||
if ((fd = make_recv_socket(&impl->sap_addr, impl->sap_len, impl->ifname)) < 0)
|
||||
return fd;
|
||||
|
||||
pw_log_info("starting SAP listener");
|
||||
get_ip(&impl->sap_addr, addr, sizeof(addr), NULL);
|
||||
pw_log_info("starting SAP listener on %s", addr);
|
||||
impl->sap_source = pw_loop_add_io(impl->loop, fd,
|
||||
SPA_IO_IN, true, on_sap_io, impl);
|
||||
if (impl->sap_source == NULL) {
|
||||
|
|
|
@ -249,14 +249,26 @@ static int make_socket(struct sockaddr_storage *src, socklen_t src_len,
|
|||
goto error;
|
||||
}
|
||||
if (is_multicast((struct sockaddr*)dst, dst_len)) {
|
||||
val = loop;
|
||||
if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, &val, sizeof(val)) < 0)
|
||||
pw_log_warn("setsockopt(IP_MULTICAST_LOOP) failed: %m");
|
||||
if (dst->ss_family == AF_INET) {
|
||||
val = loop;
|
||||
if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, &val, sizeof(val)) < 0)
|
||||
pw_log_warn("setsockopt(IP_MULTICAST_LOOP) failed: %m");
|
||||
|
||||
val = ttl;
|
||||
if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, &val, sizeof(val)) < 0)
|
||||
pw_log_warn("setsockopt(IP_MULTICAST_TTL) failed: %m");
|
||||
val = ttl;
|
||||
if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, &val, sizeof(val)) < 0)
|
||||
pw_log_warn("setsockopt(IP_MULTICAST_TTL) failed: %m");
|
||||
} else {
|
||||
val = loop;
|
||||
if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &val, sizeof(val)) < 0)
|
||||
pw_log_warn("setsockopt(IPV6_MULTICAST_LOOP) failed: %m");
|
||||
|
||||
val = ttl;
|
||||
if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &val, sizeof(val)) < 0)
|
||||
pw_log_warn("setsockopt(IPV6_MULTICAST_HOPS) failed: %m");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#ifdef SO_PRIORITY
|
||||
val = 6;
|
||||
if (setsockopt(fd, SOL_SOCKET, SO_PRIORITY, &val, sizeof(val)) < 0)
|
||||
|
|
|
@ -234,6 +234,7 @@ static int make_socket(const struct sockaddr* sa, socklen_t salen, char *ifname)
|
|||
struct ifreq req;
|
||||
struct sockaddr_storage ba = *(struct sockaddr_storage *)sa;
|
||||
bool do_connect = false;
|
||||
char addr[128];
|
||||
|
||||
af = sa->sa_family;
|
||||
if ((fd = socket(af, SOCK_DGRAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0)) < 0) {
|
||||
|
@ -271,6 +272,8 @@ static int make_socket(const struct sockaddr* sa, socklen_t salen, char *ifname)
|
|||
memset(&mr4, 0, sizeof(mr4));
|
||||
mr4.imr_multiaddr = sa4->sin_addr;
|
||||
mr4.imr_ifindex = req.ifr_ifindex;
|
||||
get_ip((struct sockaddr_storage*)sa, addr, sizeof(addr));
|
||||
pw_log_info("join IPV6 group: %s", addr);
|
||||
res = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mr4, sizeof(mr4));
|
||||
} else {
|
||||
struct sockaddr_in *ba4 = (struct sockaddr_in*)&ba;
|
||||
|
@ -286,6 +289,8 @@ static int make_socket(const struct sockaddr* sa, socklen_t salen, char *ifname)
|
|||
memset(&mr6, 0, sizeof(mr6));
|
||||
mr6.ipv6mr_multiaddr = sa6->sin6_addr;
|
||||
mr6.ipv6mr_interface = req.ifr_ifindex;
|
||||
get_ip((struct sockaddr_storage*)sa, addr, sizeof(addr));
|
||||
pw_log_info("join IPV6 group: %s", addr);
|
||||
res = setsockopt(fd, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mr6, sizeof(mr6));
|
||||
} else {
|
||||
struct sockaddr_in6 *ba6 = (struct sockaddr_in6*)&ba;
|
||||
|
|
Loading…
Reference in a new issue