From c205e2be76bf5672af36138ac62b69bc10971277 Mon Sep 17 00:00:00 2001 From: William Kemper Date: Mon, 4 Jan 2016 12:07:50 -0800 Subject: [PATCH] Set DSCP bits for IPv6 when setting traffic class. Motivation: Linux uses different socket options to set the traffic class (DSCP) on IPv6 Modifications: Also set IPV6_TCLASS for IPv6 sockets Result: TrafficClass will work on IPv4 and IPv6 correctly --- .../src/main/c/io_netty_channel_epoll_Native.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/transport-native-epoll/src/main/c/io_netty_channel_epoll_Native.c b/transport-native-epoll/src/main/c/io_netty_channel_epoll_Native.c index f98f228160..c953425aef 100644 --- a/transport-native-epoll/src/main/c/io_netty_channel_epoll_Native.c +++ b/transport-native-epoll/src/main/c/io_netty_channel_epoll_Native.c @@ -405,6 +405,12 @@ JNIEXPORT void JNICALL Java_io_netty_channel_epoll_Native_setTcpNotSentLowAt(JNI JNIEXPORT void JNICALL Java_io_netty_channel_epoll_Native_setTrafficClass(JNIEnv* env, jclass clazz, jint fd, jint optval) { netty_unix_socket_setOption(env, fd, IPPROTO_IP, IP_TOS, &optval, sizeof(optval)); + + /* Try to set the ipv6 equivalent, but don't throw if this is an ipv4 only socket. */ + int rc = setsockopt(fd, IPPROTO_IPV6, IPV6_TCLASS, &optval, sizeof(optval)); + if (rc < 0 && errno != ENOPROTOOPT) { + netty_unix_errors_throwChannelExceptionErrorNo(env, "setting ipv6 dscp failed: ", errno); + } } JNIEXPORT void JNICALL Java_io_netty_channel_epoll_Native_setBroadcast(JNIEnv* env, jclass clazz, jint fd, jint optval) {