--- net/socket/udp_socket_posix.cc.orig 2026-08-13 07:41:05 UTC +++ net/socket/udp_socket_posix.cc @@ -77,6 +77,10 @@ #include "base/mac/mac_util.h" #endif // BUILDFLAG(IS_MAC) +#if !defined(CMSG_ALIGN) +#define CMSG_ALIGN(n) _ALIGN(n) +#endif + namespace net { namespace { @@ -84,7 +88,7 @@ namespace { constexpr int kBindRetries = 10; constexpr int kPortStart = 1024; constexpr int kPortEnd = 65535; -#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD) // Maximum number of UDP packets that can be read at a time from recvmmsg. constexpr size_t kMaxMmsgMessages = 128; #endif @@ -181,7 +185,7 @@ uint32_t GetInterfaceForDestination(const IPAddress& d } #endif // BUILDFLAG(IS_MAC) -#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) && !BUILDFLAG(IS_FUCHSIA) +#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) && !BUILDFLAG(IS_FUCHSIA) && !BUILDFLAG(IS_BSD) // Helper for IPv4 SSM. Sets sin_len on macOS, no-op on Linux. group_source_req CreateIPv4SourceGroupRequest(const IPAddress& group_address, const IPAddress& source_address, @@ -495,7 +499,7 @@ base::expected UDPSocketPosi CHECK_GT(maximum_packet_size, 0u); CHECK_GE(buf_len, maximum_packet_size); -#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD) base::expected nread = InternalReadMultiple(buffer, buf_len, maximum_packet_size); if (nread.has_value() || nread.error() != ERR_IO_PENDING) { @@ -777,12 +781,17 @@ int UDPSocketPosix::SetRecvTos() { #endif // BUILDFLAG(IS_APPLE) } +#ifdef IP_RECVTOS int rv = setsockopt(socket_, IPPROTO_IP, IP_RECVTOS, &ecn, sizeof(ecn)); +#else + int rv = -1; + errno = EOPNOTSUPP; +#endif return rv == 0 ? OK : MapSystemError(errno); } void UDPSocketPosix::SetMsgConfirm(bool confirm) { -#if !BUILDFLAG(IS_APPLE) +#if !BUILDFLAG(IS_APPLE) && !BUILDFLAG(IS_BSD) if (confirm) { sendto_flags_ |= MSG_CONFIRM; } else { @@ -803,7 +812,7 @@ int UDPSocketPosix::SetBroadcast(bool broadcast) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); int value = broadcast ? 1 : 0; int rv; -#if BUILDFLAG(IS_APPLE) +#if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_BSD) // SO_REUSEPORT on OSX permits multiple processes to each receive // UDP multicast or broadcast datagrams destined for the bound // port. @@ -1011,7 +1020,7 @@ base::expected UDPSocketPosi // This read API currently only supports connected UDP sockets. CHECK(is_connected_); CHECK(remote_address_); -#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD) return InternalRecvMmsg(buffer, buf_len / maximum_packet_size, maximum_packet_size); #else @@ -1019,7 +1028,7 @@ base::expected UDPSocketPosi #endif } -#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_BSD) base::expected UDPSocketPosix::InternalRecvMmsg( IOBuffer* buffer, size_t num_messages, @@ -1315,7 +1324,7 @@ int UDPSocketPosix::DoBind(const IPEndPoint& address) #if BUILDFLAG(IS_CHROMEOS) if (last_error == EINVAL) return ERR_ADDRESS_IN_USE; -#elif BUILDFLAG(IS_APPLE) +#elif BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_BSD) if (last_error == EADDRNOTAVAIL) return ERR_ADDRESS_IN_USE; #endif @@ -1415,7 +1424,7 @@ int UDPSocketPosix::LeaveGroup(const IPAddress& group_ int UDPSocketPosix::SetSourceGroupMembership(const IPAddress& group_address, const IPAddress& source_address, int option) const { -#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS) || BUILDFLAG(IS_FUCHSIA) +#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS) || BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_BSD) return ERR_NOT_IMPLEMENTED; #else uint32_t interface_index = multicast_interface_; @@ -1441,6 +1450,10 @@ int UDPSocketPosix::SetSourceGroupMembership(const IPA #endif } +#if !defined(MCAST_JOIN_SOURCE_GROUP) +#define MCAST_JOIN_SOURCE_GROUP 0 +#endif + int UDPSocketPosix::JoinSourceGroup(const IPAddress& group_address, const IPAddress& source_address) const { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); @@ -1456,6 +1469,10 @@ int UDPSocketPosix::JoinSourceGroup(const IPAddress& g return SetSourceGroupMembership(group_address, source_address, MCAST_JOIN_SOURCE_GROUP); } + +#if !defined(MCAST_LEAVE_SOURCE_GROUP) +#define MCAST_LEAVE_SOURCE_GROUP 0 +#endif int UDPSocketPosix::LeaveSourceGroup(const IPAddress& group_address, const IPAddress& source_address) const {