From 98da2afa58b7bdf5350de16fd99905ddb04e1b0d Mon Sep 17 00:00:00 2001
From: Dan Walters <dan@walters.io>
Date: Sun, 13 Oct 2019 10:08:36 -0500
Subject: [PATCH] Apply the configured peer socket TOS to UDP sockets, not just
 TCP.

---
 libtransmission/session.c |  2 ++
 libtransmission/tr-udp.c  | 20 ++++++++++++++++++++
 libtransmission/tr-udp.h  |  1 +
 3 files changed, 23 insertions(+)

--- a/libtransmission/session.c
+++ b/libtransmission/session.c
@@ -2274,6 +2274,8 @@ static void toggle_utp(void* data)
 
     tr_udpSetSocketBuffers(session);
 
+    tr_udpSetSocketTOS(session);
+
     /* But don't call tr_utpClose -- see reset_timer in tr-utp.c for an
        explanation. */
 }
--- a/libtransmission/tr-udp.c
+++ b/libtransmission/tr-udp.c
@@ -125,6 +125,24 @@ void tr_udpSetSocketBuffers(tr_session*
     }
 }
 
+void tr_udpSetSocketTOS(tr_session* session)
+{
+    if (session->peerSocketTOS == 0)
+    {
+        return;
+    }
+
+    if (session->udp_socket != TR_BAD_SOCKET)
+    {
+        tr_netSetTOS(session->udp_socket, session->peerSocketTOS, TR_AF_INET);
+    }
+
+    if (session->udp6_socket != TR_BAD_SOCKET)
+    {
+        tr_netSetTOS(session->udp6_socket, session->peerSocketTOS, TR_AF_INET6);
+    }
+}
+
 /* BEP-32 has a rather nice explanation of why we need to bind to one
    IPv6 address, if I may say so myself. */
 
@@ -363,6 +381,8 @@ ipv6:
 
     tr_udpSetSocketBuffers(ss);
 
+    tr_udpSetSocketTOS(ss);
+
     if (ss->isDHTEnabled)
     {
         tr_dhtInit(ss);
--- a/libtransmission/tr-udp.h
+++ b/libtransmission/tr-udp.h
@@ -30,5 +30,6 @@ THE SOFTWARE.
 void tr_udpInit(tr_session*);
 void tr_udpUninit(tr_session*);
 void tr_udpSetSocketBuffers(tr_session*);
+void tr_udpSetSocketTOS(tr_session*);
 
 bool tau_handle_message(tr_session* session, uint8_t const* msg, size_t msglen);
