1 - Generate unsolicited neighbour advertisements when device is brought
            up or hardware address changes.
 
+ndisc_tclass - INTEGER
+       The IPv6 Traffic Class to use by default when sending IPv6 Neighbor
+       Discovery (Router Solicitation, Router Advertisement, Neighbor
+       Solicitation, Neighbor Advertisement, Redirect) messages.
+       These 8 bits can be interpreted as 6 high order bits holding the DSCP
+       value and 2 low order bits representing ECN (which you probably want
+       to leave cleared).
+       0 - (default)
+
 mldv1_unsolicited_report_interval - INTEGER
        The interval in milliseconds in which the next unsolicited
        MLDv1 report retransmit will take place.
 
        __u32           enhanced_dad;
        __u32           addr_gen_mode;
        __s32           disable_policy;
+       __s32           ndisc_tclass;
 
        struct ctl_table_header *sysctl_header;
 };
 
        DEVCONF_ADDR_GEN_MODE,
        DEVCONF_DISABLE_POLICY,
        DEVCONF_ACCEPT_RA_RT_INFO_MIN_PLEN,
+       DEVCONF_NDISC_TCLASS,
        DEVCONF_MAX
 };
 
 
        array[DEVCONF_ENHANCED_DAD] = cnf->enhanced_dad;
        array[DEVCONF_ADDR_GEN_MODE] = cnf->addr_gen_mode;
        array[DEVCONF_DISABLE_POLICY] = cnf->disable_policy;
+       array[DEVCONF_NDISC_TCLASS] = cnf->ndisc_tclass;
 }
 
 static inline size_t inet6_ifla6_size(void)
 }
 
 static int minus_one = -1;
+static const int zero = 0;
 static const int one = 1;
 static const int two_five_five = 255;
 
                .mode           = 0644,
                .proc_handler   = addrconf_sysctl_disable_policy,
        },
+       {
+               .procname       = "ndisc_tclass",
+               .data           = &ipv6_devconf.ndisc_tclass,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec_minmax,
+               .extra1         = (void *)&zero,
+               .extra2         = (void *)&two_five_five,
+       },
        {
                /* sentinel */
        }
 
                       int hop_limit, int len)
 {
        struct ipv6hdr *hdr;
+       struct inet6_dev *idev;
+       unsigned tclass;
+
+       rcu_read_lock();
+       idev = __in6_dev_get(skb->dev);
+       tclass = idev ? idev->cnf.ndisc_tclass : 0;
+       rcu_read_unlock();
 
        skb_push(skb, sizeof(*hdr));
        skb_reset_network_header(skb);
        hdr = ipv6_hdr(skb);
 
-       ip6_flow_hdr(hdr, 0, 0);
+       ip6_flow_hdr(hdr, tclass, 0);
 
        hdr->payload_len = htons(len);
        hdr->nexthdr = IPPROTO_ICMPV6;