During these strange times of lockdown I’ve been trying to keep myself 
occupied/entertained/sane(???) by ‘fiddling with stuff’ and improving my 
coding.  This started with an idea of learning Python which was great until the 
on-line bit of it ran out and someone posted an idea on the Openwrt forum about 
graphing Cake stats.

That had nothing to do with Python and involved (new to me) technologies such 
as ‘collectd’, ‘JSON’, a bit of javascript and my usual level of cobbling 
something together in ‘ash’…. So that course was well spent :-)

Anyway, data was collected and graphs produced in a very small household.  
What’s immediately apparent from those graphs and cake in ‘diffserv4’ mode is 
that very, very few applications are using DSCP at all.  Most things are to 
port 443.

I was also a little surprised to see that my DNS over foo proxies such as 
stubby & https-dns-proxy don’t use DSCP coding.  It surprised me even more to 
see RFC recommendations that DNS be treated as ‘Best Effort’.  Now in the days 
of udp only and no dnssec (with fallback to tcp) this may be good enough, but I 
wonder if this is realistic these days?

So putting aside the discussion of what codepoint should be used, I then 
wondered how hard it would be to actually set a dscp in these applications.  
And this is where I had another surprise.  For example https-dns-proxy uses 
libcurl.  libcurl has no standard ‘in-library’ method for setting a socket’s 
dscp.  I cobbled a workaround in the application 
https://github.com/aarond10/https_dns_proxy/pull/83 - it works.

Next I attacked stubby, which uses getdns.  getdns doesn’t even have a callback 
or parameters passing so you can set a dscp on the socket from a client 
application, pure ‘hack the library’ stuff.

To be blunt and on a small sample of 2 libraries/applications, it seems that 
DSCP is completely ignored.  Applications signalling ’this is/isnt latency 
sensitive/bulk’ isn’t going to happen if it isn’t easy to do.

Apple should be marking facetime calls as being ‘video conference’ or whatever. 
 BBC iplayer Radio apps should be marking ‘audio streaming’. But every f*ing 
thing is CS0 port 443.  And I’m wondering how much of this is because library 
support is simply missing.  Maybe gaming apps are better? (I don’t game)

Right, I’m off for a lie down.  Sorry for the rant.


Hack for getdns/stubby

diff --git a/src/stub.c b/src/stub.c
index 2547d10f..7e47aba5 100644
--- a/src/stub.c
+++ b/src/stub.c
@@ -52,6 +52,7 @@
 #include "platform.h"
 #include "general.h"
 #include "pubkey-pinning.h"
+#include <netinet/ip.h>

 /* WSA TODO:
  * STUB_TCP_RETRY added to deal with edge triggered event loops (versus
@@ -381,6 +382,9 @@ tcp_connect(getdns_upstream *upstream, 
getdns_transport_list_t transport)
 # else
        static const int  enable = 1;
 # endif
+#endif
+#if defined(IP_TOS)
+       int dscp = IPTOS_CLASS_CS4;
 #endif
        int fd = -1;

@@ -390,6 +394,12 @@ tcp_connect(getdns_upstream *upstream, 
getdns_transport_list_t transport)
                   __FUNC__, (void*)upstream);
        if ((fd = socket(upstream->addr.ss_family, SOCK_STREAM, IPPROTO_TCP)) 
== -1)
                return -1;
+#if defined(IP_TOS)
+       if (upstream->addr.ss_family == AF_INET6)
+               (void)setsockopt(fd, IPPROTO_IPV6, IP_TOS, &dscp, sizeof(dscp));
+       else if (upstream->addr.ss_family == AF_INET)
+               (void)setsockopt(fd, IPPROTO_IP, IP_TOS, &dscp, sizeof(dscp));
+#endif


Cheers,

Kevin D-B

gpg: 012C ACB2 28C6 C53E 9775  9123 B3A2 389B 9DE2 334A

Attachment: signature.asc
Description: Message signed with OpenPGP

_______________________________________________
Cake mailing list
[email protected]
https://lists.bufferbloat.net/listinfo/cake

Reply via email to