Skip to content
  • Maciej Żenczykowski's avatar
    net: ipv6: sysctl to specify IPv6 ND traffic class · 2210d6b2
    Maciej Żenczykowski authored
    Add a per-device sysctl to specify the default traffic class to use for
    kernel originated IPv6 Neighbour Discovery packets.
    
    Currently this includes:
    
      - Router Solicitation (ICMPv6 type 133)
        ndisc_send_rs() -> ndisc_send_skb() -> ip6_nd_hdr()
    
      - Neighbour Solicitation (ICMPv6 type 135)
        ndisc_send_ns() -> ndisc_send_skb() -> ip6_nd_hdr()
    
      - Neighbour Advertisement (ICMPv6 type 136)
        ndisc_send_na() -> ndisc_send_skb() -> ip6_nd_hdr()
    
      - Redirect (ICMPv6 type 137)
        ndisc_send_redirect() -> ndisc_send_skb() -> ip6_nd_hdr()
    
    and if the kernel ever gets around to generating RA's,
    it would presumably also include:
    
      - Router Advertisement (ICMPv6 type 134)
        (radvd daemon could pick up on the kernel setting and use it)
    
    Interface drivers may examine the Traffic Class value and translate
    the DiffServ Code Point into a link-layer appropriate traffic
    prioritization scheme.  An example of mapping IETF DSCP values to
    IEEE 802.11 User Priority values can be found here:
    
        https://tools.ietf.org/html/draft-ietf-tsvwg-ieee-802-11
    
    
    
    The expected primary use case is to properly prioritize ND over wifi.
    
    Testing:
      jzem22:~# cat /proc/sys/net/ipv6/conf/eth0/ndisc_tclass
      0
      jzem22:~# echo -1 > /proc/sys/net/ipv6/conf/eth0/ndisc_tclass
      -bash: echo: write error: Invalid argument
      jzem22:~# echo 256 > /proc/sys/net/ipv6/conf/eth0/ndisc_tclass
      -bash: echo: write error: Invalid argument
      jzem22:~# echo 0 > /proc/sys/net/ipv6/conf/eth0/ndisc_tclass
      jzem22:~# echo 255 > /proc/sys/net/ipv6/conf/eth0/ndisc_tclass
      jzem22:~# cat /proc/sys/net/ipv6/conf/eth0/ndisc_tclass
      255
      jzem22:~# echo 34 > /proc/sys/net/ipv6/conf/eth0/ndisc_tclass
      jzem22:~# cat /proc/sys/net/ipv6/conf/eth0/ndisc_tclass
      34
    
      jzem22:~# echo $[0xDC] > /proc/sys/net/ipv6/conf/eth0/ndisc_tclass
      jzem22:~# tcpdump -v -i eth0 icmp6 and src host jzem22.pgc and dst host fe80::1
      tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
      IP6 (class 0xdc, hlim 255, next-header ICMPv6 (58) payload length: 24)
      jzem22.pgc > fe80::1: [icmp6 sum ok] ICMP6, neighbor advertisement,
      length 24, tgt is jzem22.pgc, Flags [solicited]
    
    (based on original change written by Erik Kline, with minor changes)
    
    v2: fix 'suspicious rcu_dereference_check() usage'
        by explicitly grabbing the rcu_read_lock.
    
    Cc: Lorenzo Colitti <lorenzo@google.com>
    Signed-off-by: default avatarErik Kline <ek@google.com>
    Signed-off-by: default avatarMaciej Żenczykowski <maze@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    2210d6b2