struct flow_dissector_key_ipv4_addrs *addr;
        struct flow_dissector_key_basic *basic;
 
-       /* Wildcard TOS/TTL for now. */
        memset(frame, 0, sizeof(struct nfp_flower_ipv4));
 
        if (dissector_uses_key(flow->dissector,
                                                  target);
                frame->proto = basic->ip_proto;
        }
+
+       if (dissector_uses_key(flow->dissector, FLOW_DISSECTOR_KEY_IP)) {
+               struct flow_dissector_key_ip *flow_ip;
+
+               flow_ip = skb_flow_dissector_target(flow->dissector,
+                                                   FLOW_DISSECTOR_KEY_IP,
+                                                   target);
+               frame->tos = flow_ip->tos;
+               frame->ttl = flow_ip->ttl;
+       }
 }
 
 static void
 
                /* Ethernet type is present in the key. */
                switch (key_basic->n_proto) {
                case cpu_to_be16(ETH_P_IP):
-                       if (mask_ip && mask_ip->tos)
-                               return -EOPNOTSUPP;
-                       if (mask_ip && mask_ip->ttl)
-                               return -EOPNOTSUPP;
                        key_layer |= NFP_FLOWER_LAYER_IPV4;
                        key_size += sizeof(struct nfp_flower_ipv4);
                        break;