diff --git a/src/modules/module-netjack2-driver.c b/src/modules/module-netjack2-driver.c index dab6a51e2..adf29d3aa 100644 --- a/src/modules/module-netjack2-driver.c +++ b/src/modules/module-netjack2-driver.c @@ -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"); diff --git a/src/modules/module-netjack2-manager.c b/src/modules/module-netjack2-manager.c index 2d8608c5e..6df2c6577 100644 --- a/src/modules/module-netjack2-manager.c +++ b/src/modules/module-netjack2-manager.c @@ -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"); diff --git a/src/modules/module-rtp-sap.c b/src/modules/module-rtp-sap.c index 21e387eba..452bc18fc 100644 --- a/src/modules/module-rtp-sap.c +++ b/src/modules/module-rtp-sap.c @@ -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); diff --git a/src/modules/module-rtp-sink.c b/src/modules/module-rtp-sink.c index c77fc067a..0edea4e5b 100644 --- a/src/modules/module-rtp-sink.c +++ b/src/modules/module-rtp-sink.c @@ -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) diff --git a/src/modules/module-vban-send.c b/src/modules/module-vban-send.c index a3ea7c760..e54f41998 100644 --- a/src/modules/module-vban-send.c +++ b/src/modules/module-vban-send.c @@ -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"); diff --git a/src/modules/network-utils.h b/src/modules/network-utils.h index 8a8546461..ca7aa541d 100644 --- a/src/modules/network-utils.h +++ b/src/modules/network-utils.h @@ -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