macoS: update QoSSession with SO_NET_SERVICE_TYPE.

macOS does not support `SO_PRIORITY` on sockets, but it does apparently
support configuring sockets with a priority flag via a parameter called
`SO_NET_SERVICE_TYPE`. It doesn't appear to be especially well
documented, but it seems to exist as far back as 10.11 (El Capitan).

This patch sets QoSSession to treat connections as
"responsive multimedia audio/video", which some docs appear to describe
as "low delay tolerant, low-medium, loss tolerant, elastic flow,
variable packet interval, rate and size".
This commit is contained in:
Ryan McGrath 2025-09-22 17:30:18 -04:00
commit 5a6730ab4e
No known key found for this signature in database
GPG key ID: DA6CBD9233593DEA

View file

@ -54,6 +54,15 @@ QoSSession::~QoSSession()
#else
QoSSession::QoSSession(ENetPeer* peer, int tos_val)
{
// Apple systems don't support SO_PRIORITY on BSD sockets, but they do support a flag for
// marking sockets as a specific type of traffic. `NET_SERVICE_TYPE_RV` should roughly
// correspond to "low delay tolerant, low-medium loss tolerant, elastic flow, variable
// packet interval, rate and size".
#if defined(__APPLE__)
constexpr int srv_type = NET_SERVICE_TYPE_RV;
setsockopt(peer->host->socket, SOL_SOCKET, SO_NET_SERVICE_TYPE, &srv_type, sizeof(srv_type));
#endif
#if defined(__linux__)
constexpr int priority = 7;
setsockopt(peer->host->socket, SOL_SOCKET, SO_PRIORITY, &priority, sizeof(priority));