* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  * |                         ipv4_addr_dst                         |
  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- * |                            Reserved                           |
+ * |           Reserved            |      tos      |      ttl      |
  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  * |                            Reserved                           |
  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 struct nfp_flower_ipv4_udp_tun {
        __be32 ip_src;
        __be32 ip_dst;
-       __be32 reserved[2];
+       __be16 reserved1;
+       u8 tos;
+       u8 ttl;
+       __be32 reserved2;
        __be32 tun_id;
 };
 
 
        struct fl_flow_key *target = mask_version ? flow->mask : flow->key;
        struct flow_dissector_key_ipv4_addrs *tun_ips;
        struct flow_dissector_key_keyid *vni;
+       struct flow_dissector_key_ip *ip;
 
        memset(frame, 0, sizeof(struct nfp_flower_ipv4_udp_tun));
 
                frame->ip_src = tun_ips->src;
                frame->ip_dst = tun_ips->dst;
        }
+
+       if (dissector_uses_key(flow->dissector, FLOW_DISSECTOR_KEY_ENC_IP)) {
+               ip = skb_flow_dissector_target(flow->dissector,
+                                              FLOW_DISSECTOR_KEY_ENC_IP,
+                                              target);
+               frame->tos = ip->tos;
+               frame->ttl = ip->ttl;
+       }
 }
 
 int nfp_flower_compile_flow_match(struct tc_cls_flower_offload *flow,
 
         BIT(FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS) | \
         BIT(FLOW_DISSECTOR_KEY_ENC_CONTROL) | \
         BIT(FLOW_DISSECTOR_KEY_ENC_PORTS) | \
+        BIT(FLOW_DISSECTOR_KEY_ENC_IP) | \
         BIT(FLOW_DISSECTOR_KEY_MPLS) | \
         BIT(FLOW_DISSECTOR_KEY_IP))
 
         BIT(FLOW_DISSECTOR_KEY_ENC_KEYID) | \
         BIT(FLOW_DISSECTOR_KEY_ENC_IPV4_ADDRS) | \
         BIT(FLOW_DISSECTOR_KEY_ENC_IPV6_ADDRS) | \
-        BIT(FLOW_DISSECTOR_KEY_ENC_PORTS))
+        BIT(FLOW_DISSECTOR_KEY_ENC_PORTS) | \
+        BIT(FLOW_DISSECTOR_KEY_ENC_IP))
 
 #define NFP_FLOWER_WHITELIST_TUN_DISSECTOR_R \
        (BIT(FLOW_DISSECTOR_KEY_ENC_CONTROL) | \