Fix setsockopt for setting Traffic Class in IPv6
authorRonald in 't Velt <velt@xs4all.nl>
Fri, 19 Apr 2013 16:51:49 +0000 (18:51 +0200)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Fri, 19 Apr 2013 19:32:31 +0000 (21:32 +0200)
HiOLSR-developers,

For your consideration:

Setting Traffic Class (the counterpart of TOS in IPv4) on OLSR IPv6 packets is currently broken.
The code does not distinguish between the IPv4 and IPv6 cases, but it should, as the required
'level' and 'optname' arguments to setsockopt differ.

I tested this patch by monitoring OLSR IPv6 packets with 'tcpdump -v': it appears to be working.

Note this is for Linux only.

This is my modest contribution to Dave Täht's quest to fix "TOS setting" in IPv6 :-)
See: http://www.bufferbloat.net/issues/249

Thanks,
Ronald

Signed-off-by: Ronald in 't Velt <velt@xs4all.nl>
src/unix/ifnet.c

index 654c169..5ec8e32 100644 (file)
@@ -783,9 +783,17 @@ chk_if_up(struct olsr_if *iface, int debuglvl __attribute__ ((unused)))
     perror("setsockopt(SO_PRIORITY)");
     olsr_syslog(OLSR_LOG_ERR, "OLSRD: setsockopt(SO_PRIORITY) error %m");
   }
-  if (setsockopt(ifp->send_socket, IPPROTO_IP, IP_TOS, (char *)&tos_bits, sizeof(tos_bits)) < 0) {
-    perror("setsockopt(IP_TOS)");
-    olsr_syslog(OLSR_LOG_ERR, "setsockopt(IP_TOS) error %m");
+  if (olsr_cnf->ip_version == AF_INET) {
+    if (setsockopt(ifp->send_socket, IPPROTO_IP, IP_TOS, (char *)&tos_bits, sizeof(tos_bits)) < 0) {
+      perror("setsockopt(IP_TOS)");
+      olsr_syslog(OLSR_LOG_ERR, "setsockopt(IP_TOS) error %m");
+    }
+  } else {
+    /* IP version 6 */
+    if (setsockopt(ifp->send_socket, IPPROTO_IPV6, IPV6_TCLASS, (char *)&tos_bits, sizeof(tos_bits)) < 0) {
+      perror("setsockopt(IPV6_TCLASS)");
+      olsr_syslog(OLSR_LOG_ERR, "setsockopt(IPV6_TCLASS) error %m");
+    }
   }
 #endif /* __linux__ */