mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2026-05-17 21:41:45 -04:00
modules: make and use pw_net_is_multicast
This commit is contained in:
parent
6d998a9193
commit
b54bac1862
6 changed files with 20 additions and 72 deletions
|
|
@ -731,19 +731,6 @@ on_data_io(void *data, int fd, uint32_t mask)
|
|||
}
|
||||
}
|
||||
|
||||
static bool is_multicast(struct sockaddr *sa, socklen_t salen)
|
||||
{
|
||||
if (sa->sa_family == AF_INET) {
|
||||
static const uint32_t ipv4_mcast_mask = 0xe0000000;
|
||||
struct sockaddr_in *sa4 = (struct sockaddr_in*)sa;
|
||||
return (ntohl(sa4->sin_addr.s_addr) & ipv4_mcast_mask) == ipv4_mcast_mask;
|
||||
} else if (sa->sa_family == AF_INET6) {
|
||||
struct sockaddr_in6 *sa6 = (struct sockaddr_in6*)sa;
|
||||
return sa6->sin6_addr.s6_addr[0] == 0xff;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static int make_socket(struct sockaddr_storage *src, socklen_t src_len,
|
||||
struct sockaddr_storage *dst, socklen_t dst_len,
|
||||
bool loop, int ttl, int dscp, const char *ifname)
|
||||
|
|
@ -789,7 +776,7 @@ static int make_socket(struct sockaddr_storage *src, socklen_t src_len,
|
|||
pw_log_error("bind() failed: %m");
|
||||
goto error;
|
||||
}
|
||||
if (is_multicast((struct sockaddr*)dst, dst_len)) {
|
||||
if (pw_net_is_multicast(dst)) {
|
||||
val = loop;
|
||||
if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, &val, sizeof(val)) < 0)
|
||||
pw_log_warn("setsockopt(IP_MULTICAST_LOOP) failed: %m");
|
||||
|
|
|
|||
|
|
@ -810,19 +810,6 @@ static int create_filters(struct follower *follower)
|
|||
return res;
|
||||
}
|
||||
|
||||
static bool is_multicast(struct sockaddr *sa, socklen_t salen)
|
||||
{
|
||||
if (sa->sa_family == AF_INET) {
|
||||
static const uint32_t ipv4_mcast_mask = 0xe0000000;
|
||||
struct sockaddr_in *sa4 = (struct sockaddr_in*)sa;
|
||||
return (ntohl(sa4->sin_addr.s_addr) & ipv4_mcast_mask) == ipv4_mcast_mask;
|
||||
} else if (sa->sa_family == AF_INET6) {
|
||||
struct sockaddr_in6 *sa6 = (struct sockaddr_in6*)sa;
|
||||
return sa6->sin6_addr.s6_addr[0] == 0xff;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static int make_data_socket(struct sockaddr_storage *sa, socklen_t salen,
|
||||
bool loop, int ttl, int dscp, const char *ifname)
|
||||
{
|
||||
|
|
@ -857,7 +844,7 @@ static int make_data_socket(struct sockaddr_storage *sa, socklen_t salen,
|
|||
if (setsockopt(fd, IPPROTO_IP, IP_TOS, &val, sizeof(val)) < 0)
|
||||
pw_log_warn("setsockopt(IP_TOS) failed: %m");
|
||||
}
|
||||
if (is_multicast((struct sockaddr*)sa, salen)) {
|
||||
if (pw_net_is_multicast(sa)) {
|
||||
val = loop;
|
||||
if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, &val, sizeof(val)) < 0)
|
||||
pw_log_warn("setsockopt(IP_MULTICAST_LOOP) failed: %m");
|
||||
|
|
|
|||
|
|
@ -389,19 +389,6 @@ static void session_free(struct session *sess)
|
|||
free(sess);
|
||||
}
|
||||
|
||||
static bool is_multicast(struct sockaddr *sa, socklen_t salen)
|
||||
{
|
||||
if (sa->sa_family == AF_INET) {
|
||||
static const uint32_t ipv4_mcast_mask = 0xe0000000;
|
||||
struct sockaddr_in *sa4 = (struct sockaddr_in*)sa;
|
||||
return (ntohl(sa4->sin_addr.s_addr) & ipv4_mcast_mask) == ipv4_mcast_mask;
|
||||
} else if (sa->sa_family == AF_INET6) {
|
||||
struct sockaddr_in6 *sa6 = (struct sockaddr_in6*)sa;
|
||||
return sa6->sin6_addr.s6_addr[0] == 0xff;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static int make_unix_ptp_mgmt_socket(const char *path) {
|
||||
struct sockaddr_un addr;
|
||||
|
||||
|
|
@ -451,7 +438,7 @@ static int make_send_socket(
|
|||
pw_log_error("connect() failed: %m");
|
||||
goto error;
|
||||
}
|
||||
if (is_multicast((struct sockaddr*)sa, salen)) {
|
||||
if (pw_net_is_multicast(sa)) {
|
||||
if (sa->ss_family == AF_INET) {
|
||||
val = loop;
|
||||
if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, &val, sizeof(val)) < 0)
|
||||
|
|
@ -762,7 +749,7 @@ static int make_sdp(struct impl *impl, struct session *sess, char *buffer, size_
|
|||
if ((user_name = pw_get_user_name()) == NULL)
|
||||
user_name = "-";
|
||||
|
||||
multicast = is_multicast((struct sockaddr*)&sdp->dst_addr, sdp->dst_len);
|
||||
multicast = pw_net_is_multicast(&sdp->dst_addr);
|
||||
|
||||
spa_zero(dst_ttl);
|
||||
if (multicast)
|
||||
|
|
@ -813,7 +800,7 @@ static int make_sdp(struct impl *impl, struct session *sess, char *buffer, size_
|
|||
sdp->payload, sdp->mime_type, sdp->rate);
|
||||
}
|
||||
|
||||
if (is_multicast((struct sockaddr*)&sdp->dst_addr, sdp->dst_len))
|
||||
if (pw_net_is_multicast(&sdp->dst_addr))
|
||||
spa_strbuf_append(&buf,
|
||||
"a=source-filter: incl IN %s %s %s\n", dst_ip4 ? "IP4" : "IP6",
|
||||
dst_addr, src_addr);
|
||||
|
|
|
|||
|
|
@ -198,19 +198,6 @@ struct impl {
|
|||
int rtp_fd;
|
||||
};
|
||||
|
||||
static bool is_multicast(struct sockaddr *sa, socklen_t salen)
|
||||
{
|
||||
if (sa->sa_family == AF_INET) {
|
||||
static const uint32_t ipv4_mcast_mask = 0xe0000000;
|
||||
struct sockaddr_in *sa4 = (struct sockaddr_in*)sa;
|
||||
return (ntohl(sa4->sin_addr.s_addr) & ipv4_mcast_mask) == ipv4_mcast_mask;
|
||||
} else if (sa->sa_family == AF_INET6) {
|
||||
struct sockaddr_in6 *sa6 = (struct sockaddr_in6*)sa;
|
||||
return sa6->sin6_addr.s6_addr[0] == 0xff;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static int make_socket(struct sockaddr_storage *src, socklen_t src_len,
|
||||
struct sockaddr_storage *dst, socklen_t dst_len,
|
||||
bool loop, int ttl, int dscp, char *ifname)
|
||||
|
|
@ -239,7 +226,7 @@ static int make_socket(struct sockaddr_storage *src, socklen_t src_len,
|
|||
pw_log_error("connect() failed: %m");
|
||||
goto error;
|
||||
}
|
||||
if (is_multicast((struct sockaddr*)dst, dst_len)) {
|
||||
if (pw_net_is_multicast(dst)) {
|
||||
if (dst->ss_family == AF_INET) {
|
||||
val = loop;
|
||||
if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, &val, sizeof(val)) < 0)
|
||||
|
|
|
|||
|
|
@ -223,19 +223,6 @@ static const struct vban_stream_events stream_events = {
|
|||
.send_packet = stream_send_packet,
|
||||
};
|
||||
|
||||
static bool is_multicast(struct sockaddr *sa, socklen_t salen)
|
||||
{
|
||||
if (sa->sa_family == AF_INET) {
|
||||
static const uint32_t ipv4_mcast_mask = 0xe0000000;
|
||||
struct sockaddr_in *sa4 = (struct sockaddr_in*)sa;
|
||||
return (ntohl(sa4->sin_addr.s_addr) & ipv4_mcast_mask) == ipv4_mcast_mask;
|
||||
} else if (sa->sa_family == AF_INET6) {
|
||||
struct sockaddr_in6 *sa6 = (struct sockaddr_in6*)sa;
|
||||
return sa6->sin6_addr.s6_addr[0] == 0xff;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static int make_socket(struct sockaddr_storage *src, socklen_t src_len,
|
||||
struct sockaddr_storage *dst, socklen_t dst_len,
|
||||
bool loop, int ttl, int dscp)
|
||||
|
|
@ -257,7 +244,7 @@ static int make_socket(struct sockaddr_storage *src, socklen_t src_len,
|
|||
pw_log_error("connect() failed: %m");
|
||||
goto error;
|
||||
}
|
||||
if (is_multicast((struct sockaddr*)dst, dst_len)) {
|
||||
if (pw_net_is_multicast(dst)) {
|
||||
val = loop;
|
||||
if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, &val, sizeof(val)) < 0)
|
||||
pw_log_warn("setsockopt(IP_MULTICAST_LOOP) failed: %m");
|
||||
|
|
|
|||
|
|
@ -196,6 +196,19 @@ static inline bool pw_net_addr_is_any(struct sockaddr_storage *addr)
|
|||
return false;
|
||||
}
|
||||
|
||||
static inline bool pw_net_is_multicast(struct sockaddr_storage *addr)
|
||||
{
|
||||
if (addr->ss_family == AF_INET) {
|
||||
static const uint32_t ipv4_mcast_mask = 0xe0000000;
|
||||
struct sockaddr_in *sa4 = (struct sockaddr_in*)addr;
|
||||
return (ntohl(sa4->sin_addr.s_addr) & ipv4_mcast_mask) == ipv4_mcast_mask;
|
||||
} else if (addr->ss_family == AF_INET6) {
|
||||
struct sockaddr_in6 *sa6 = (struct sockaddr_in6*)addr;
|
||||
return sa6->sin6_addr.s6_addr[0] == 0xff;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
#ifndef LISTEN_FDS_START
|
||||
#define LISTEN_FDS_START 3
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue