From 4d617adfb0fdd6e836c4fe6116e0328df6ff87d6 Mon Sep 17 00:00:00 2001 From: babarosaM33 Date: Fri, 17 Jan 2020 19:11:54 +0800 Subject: [PATCH] refine tos setsockopt in redir and udprelay make tos setup working at ipv4 and ipv6 --- src/redir.c | 9 +++++++-- src/udprelay.c | 10 ++++++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/redir.c b/src/redir.c index e3d250ae..4ba1c3f8 100644 --- a/src/redir.c +++ b/src/redir.c @@ -752,8 +752,13 @@ accept_cb(EV_P_ ev_io *w, int revents) setnonblocking(remotefd); if (listener->tos >= 0) { - if (setsockopt(remotefd, IPPROTO_IP, IP_TOS, &listener->tos, sizeof(listener->tos)) != 0) { - ERROR("setsockopt IP_TOS"); + int rc = setsockopt(remotefd, IPPROTO_IP, IP_TOS, &listener->tos, sizeof(listener->tos)); + if (rc < 0 && errno != ENOPROTOOPT) { + LOGE("setting ipv4 dscp failed: %d", errno); + } + rc = setsockopt(remotefd, IPPROTO_IPV6, IPV6_TCLASS, &listener->tos, sizeof(listener->tos)); + if (rc < 0 && errno != ENOPROTOOPT) { + LOGE("setting ipv6 dscp failed: %d", errno); } } diff --git a/src/udprelay.c b/src/udprelay.c index c5f23f54..6498cb6d 100644 --- a/src/udprelay.c +++ b/src/udprelay.c @@ -497,8 +497,14 @@ create_server_socket(const char *host, const char *port) #ifdef IP_TOS // Set QoS flag int tos = 46 << 2; - int proto = rp->ai_family == AF_INET6 ? IPPROTO_IP : IPPROTO_IPV6; - setsockopt(server_sock, proto, IP_TOS, &tos, sizeof(tos)); + int rc = setsockopt(server_sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos)); + if (rc < 0 && errno != ENOPROTOOPT) { + LOGE("setting ipv4 dscp failed: %d", errno); + } + rc = setsockopt(server_sock, IPPROTO_IPV6, IPV6_TCLASS, &tos, sizeof(tos)); + if (rc < 0 && errno != ENOPROTOOPT) { + LOGE("setting ipv6 dscp failed: %d", errno); + } #endif #ifdef MODULE_REDIR