if (!spec || !unused_tuple)
                return -EINVAL;
 
-       *unused_tuple |= BIT(INNER_SRC_MAC) | BIT(INNER_DST_MAC) |
-               BIT(INNER_IP_TOS);
+       *unused_tuple |= BIT(INNER_SRC_MAC) | BIT(INNER_DST_MAC);
 
        /* check whether src/dst ip address used */
        if (ipv6_addr_any((struct in6_addr *)spec->ip6src))
        if (!spec->pdst)
                *unused_tuple |= BIT(INNER_DST_PORT);
 
-       if (spec->tclass)
-               return -EOPNOTSUPP;
+       if (!spec->tclass)
+               *unused_tuple |= BIT(INNER_IP_TOS);
 
        return 0;
 }
                return -EINVAL;
 
        *unused_tuple |= BIT(INNER_SRC_MAC) | BIT(INNER_DST_MAC) |
-               BIT(INNER_IP_TOS) | BIT(INNER_SRC_PORT) | BIT(INNER_DST_PORT);
+                       BIT(INNER_SRC_PORT) | BIT(INNER_DST_PORT);
 
        /* check whether src/dst ip address used */
        if (ipv6_addr_any((struct in6_addr *)spec->ip6src))
        if (!spec->l4_proto)
                *unused_tuple |= BIT(INNER_IP_PROTO);
 
-       if (spec->tclass)
-               return -EOPNOTSUPP;
+       if (!spec->tclass)
+               *unused_tuple |= BIT(INNER_IP_TOS);
 
        if (spec->l4_4_bytes)
                return -EOPNOTSUPP;
        rule->tuples.ether_proto = ETH_P_IPV6;
        rule->tuples_mask.ether_proto = 0xFFFF;
 
+       rule->tuples.ip_tos = fs->h_u.tcp_ip6_spec.tclass;
+       rule->tuples_mask.ip_tos = fs->m_u.tcp_ip6_spec.tclass;
+
        rule->tuples.ip_proto = ip_proto;
        rule->tuples_mask.ip_proto = 0xFF;
 }
        rule->tuples.ip_proto = fs->h_u.usr_ip6_spec.l4_proto;
        rule->tuples_mask.ip_proto = fs->m_u.usr_ip6_spec.l4_proto;
 
+       rule->tuples.ip_tos = fs->h_u.tcp_ip6_spec.tclass;
+       rule->tuples_mask.ip_tos = fs->m_u.tcp_ip6_spec.tclass;
+
        rule->tuples.ether_proto = ETH_P_IPV6;
        rule->tuples_mask.ether_proto = 0xFFFF;
 }
                cpu_to_be32_array(spec_mask->ip6dst, rule->tuples_mask.dst_ip,
                                  IPV6_SIZE);
 
+       spec->tclass = rule->tuples.ip_tos;
+       spec_mask->tclass = rule->unused_tuple & BIT(INNER_IP_TOS) ?
+                       0 : rule->tuples_mask.ip_tos;
+
        spec->psrc = cpu_to_be16(rule->tuples.src_port);
        spec_mask->psrc = rule->unused_tuple & BIT(INNER_SRC_PORT) ?
                        0 : cpu_to_be16(rule->tuples_mask.src_port);
                cpu_to_be32_array(spec_mask->ip6dst,
                                  rule->tuples_mask.dst_ip, IPV6_SIZE);
 
+       spec->tclass = rule->tuples.ip_tos;
+       spec_mask->tclass = rule->unused_tuple & BIT(INNER_IP_TOS) ?
+                       0 : rule->tuples_mask.ip_tos;
+
        spec->l4_proto = rule->tuples.ip_proto;
        spec_mask->l4_proto = rule->unused_tuple & BIT(INNER_IP_PROTO) ?
                        0 : rule->tuples_mask.ip_proto;