Flagging packets with IP version is only needed at the netdev-dpdk level.

In most cases, OVS is already inspecting the IP header in packet data,
so maintaining such IP version metadata won't save much cycles
(given the cost of additional branches necessary for handling
outer/inner flags).

Cleanup OVS shared code and only set those informations in
netdev-dpdk.c.

Signed-off-by: David Marchand <david.march...@redhat.com>
---
Changes since v1:
- moved conntrack change in previous separate patch,
- fixed sw TSO when stopping at this point of the series
  (a ip csum request in Tx flags was missing),

---
 .../topics/userspace-checksum-offloading.rst  |   8 +-
 lib/dp-packet-gso.c                           |  29 ++---
 lib/dp-packet.h                               | 120 +++++-------------
 lib/dpif-netdev-extract-avx512.c              |  11 --
 lib/flow.c                                    |   8 --
 lib/netdev-dpdk.c                             |  24 ++--
 lib/netdev-linux.c                            |  33 ++---
 lib/netdev-native-tnl.c                       |  11 --
 lib/packets.c                                 |  30 +----
 9 files changed, 78 insertions(+), 196 deletions(-)

diff --git a/Documentation/topics/userspace-checksum-offloading.rst 
b/Documentation/topics/userspace-checksum-offloading.rst
index 036d3965fa..e5f87ff1fe 100644
--- a/Documentation/topics/userspace-checksum-offloading.rst
+++ b/Documentation/topics/userspace-checksum-offloading.rst
@@ -81,16 +81,12 @@ Rules
 5) The ingress packet parser can only set ``DP_PACKET_OL_TX_IP_CKSUM`` if the
    packet has ``DP_PACKET_OL_RX_IP_CKSUM_GOOD`` to not violate rule #2.
 
-6) Packet with flag ``DP_PACKET_OL_TX_IPV4`` is an IPv4 packet.
-
-7) Packet with flag ``DP_PACKET_OL_TX_IPV6`` is an IPv6 packet.
-
-8) Packet with flag ``DP_PACKET_OL_TX_IP_CKSUM`` tells the datapath to skip
+6) Packet with flag ``DP_PACKET_OL_TX_IP_CKSUM`` tells the datapath to skip
    updating the IP checksum if the packet is modified. The IP checksum will be
    calculated by the egress interface if that supports IP checksum offload,
    otherwise the IP checksum will be performed in software before handing over
    the packet to the interface.
 
-9) When there are modifications to the packet that requires a checksum update,
+7) When there are modifications to the packet that requires a checksum update,
    the datapath needs to remove the ``DP_PACKET_OL_RX_IP_CKSUM_GOOD`` flag,
    otherwise the checksum is assumed to be good in the packet.
diff --git a/lib/dp-packet-gso.c b/lib/dp-packet-gso.c
index 2356359772..80652ba9f9 100644
--- a/lib/dp-packet-gso.c
+++ b/lib/dp-packet-gso.c
@@ -95,6 +95,7 @@ dp_packet_gso(struct dp_packet *p, struct dp_packet_batch 
**batches)
     static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
     struct dp_packet_batch *curr_batch = *batches;
     struct tcp_header *tcp_hdr;
+    struct ip_header *ip_hdr;
     uint16_t inner_ip_id = 0;
     uint16_t outer_ip_id = 0;
     struct dp_packet *seg;
@@ -116,24 +117,20 @@ dp_packet_gso(struct dp_packet *p, struct dp_packet_batch 
**batches)
     }
 
     if (udp_tnl || gre_tnl) {
-        outer_ipv4 = dp_packet_hwol_is_outer_ipv4(p);
-        tcp_hdr = dp_packet_inner_l4(p);
-
-        if (outer_ipv4) {
-            outer_ip_id = ntohs(((struct ip_header *) dp_packet_l3(p))->ip_id);
-        }
-        if (dp_packet_hwol_is_ipv4(p)) {
-            struct ip_header *ip_hdr = dp_packet_inner_l3(p);
+        ip_hdr = dp_packet_inner_l3(p);
+        if (IP_VER(ip_hdr->ip_ihl_ver) == 4) {
             inner_ip_id = ntohs(ip_hdr->ip_id);
         }
+
+        tcp_hdr = dp_packet_inner_l4(p);
     } else {
-        outer_ipv4 = dp_packet_hwol_is_ipv4(p);
         tcp_hdr = dp_packet_l4(p);
+    }
 
-        if (outer_ipv4) {
-            struct ip_header *ip_hdr = dp_packet_l3(p);
-            outer_ip_id = ntohs(ip_hdr->ip_id);
-        }
+    ip_hdr = dp_packet_l3(p);
+    outer_ipv4 = IP_VER(ip_hdr->ip_ihl_ver) == 4;
+    if (outer_ipv4) {
+        outer_ip_id = ntohs(ip_hdr->ip_id);
     }
 
     tcp_offset = TCP_OFFSET(tcp_hdr->tcp_ctl);
@@ -164,8 +161,8 @@ dp_packet_gso(struct dp_packet *p, struct dp_packet_batch 
**batches)
 
         if (udp_tnl || gre_tnl) {
             /* Update tunnel inner L3 header. */
-            if (dp_packet_hwol_is_ipv4(seg)) {
-                struct ip_header *ip_hdr = dp_packet_inner_l3(seg);
+            ip_hdr = dp_packet_inner_l3(seg);
+            if (IP_VER(ip_hdr->ip_ihl_ver) == 4) {
                 ip_hdr->ip_tot_len = htons(dp_packet_inner_l3_size(seg));
                 ip_hdr->ip_id = htons(inner_ip_id);
                 ip_hdr->ip_csum = 0;
@@ -181,7 +178,7 @@ dp_packet_gso(struct dp_packet *p, struct dp_packet_batch 
**batches)
 
         /* Update L3 header. */
         if (outer_ipv4) {
-            struct ip_header *ip_hdr = dp_packet_l3(seg);
+            ip_hdr = dp_packet_l3(seg);
             ip_hdr->ip_tot_len = htons(dp_packet_l3_size(seg));
             ip_hdr->ip_id = htons(outer_ip_id);
             ip_hdr->ip_csum = 0;
diff --git a/lib/dp-packet.h b/lib/dp-packet.h
index 084e89bd99..cf33aa83e0 100644
--- a/lib/dp-packet.h
+++ b/lib/dp-packet.h
@@ -74,10 +74,6 @@ enum dp_packet_offload_mask {
                 0x20),
     /* TCP Segmentation Offload. */
     DEF_OL_FLAG(DP_PACKET_OL_TX_TCP_SEG, RTE_MBUF_F_TX_TCP_SEG, 0x40),
-    /* Offloaded packet is IPv4. */
-    DEF_OL_FLAG(DP_PACKET_OL_TX_IPV4, RTE_MBUF_F_TX_IPV4, 0x80),
-    /* Offloaded packet is IPv6. */
-    DEF_OL_FLAG(DP_PACKET_OL_TX_IPV6, RTE_MBUF_F_TX_IPV6, 0x100),
     /* Offload TCP checksum. */
     DEF_OL_FLAG(DP_PACKET_OL_TX_TCP_CKSUM, RTE_MBUF_F_TX_TCP_CKSUM, 0x200),
     /* Offload UDP checksum. */
@@ -92,18 +88,12 @@ enum dp_packet_offload_mask {
     /* Offload packet is tunnel VXLAN. */
     DEF_OL_FLAG(DP_PACKET_OL_TX_TUNNEL_VXLAN,
                 RTE_MBUF_F_TX_TUNNEL_VXLAN, 0x4000),
-    /* Offload tunnel packet, outer header is IPv4. */
-    DEF_OL_FLAG(DP_PACKET_OL_TX_OUTER_IPV4,
-                RTE_MBUF_F_TX_OUTER_IPV4, 0x8000),
     /* Offload tunnel outer IPv4 checksum. */
     DEF_OL_FLAG(DP_PACKET_OL_TX_OUTER_IP_CKSUM,
                 RTE_MBUF_F_TX_OUTER_IP_CKSUM, 0x10000),
     /* Offload tunnel outer UDP checksum. */
     DEF_OL_FLAG(DP_PACKET_OL_TX_OUTER_UDP_CKSUM,
                 RTE_MBUF_F_TX_OUTER_UDP_CKSUM, 0x20000),
-    /* Offload tunnel packet, outer header is IPv6. */
-    DEF_OL_FLAG(DP_PACKET_OL_TX_OUTER_IPV6,
-                RTE_MBUF_F_TX_OUTER_IPV6, 0x40000),
     /* Offload packet is GRE tunnel. */
     DEF_OL_FLAG(DP_PACKET_OL_TX_TUNNEL_GRE,
                 RTE_MBUF_F_TX_TUNNEL_GRE, 0x80000),
@@ -118,8 +108,6 @@ enum dp_packet_offload_mask {
                                      DP_PACKET_OL_RX_L4_CKSUM_GOOD   | \
                                      DP_PACKET_OL_RX_IP_CKSUM_GOOD   | \
                                      DP_PACKET_OL_TX_TCP_SEG         | \
-                                     DP_PACKET_OL_TX_IPV4            | \
-                                     DP_PACKET_OL_TX_IPV6            | \
                                      DP_PACKET_OL_TX_TCP_CKSUM       | \
                                      DP_PACKET_OL_TX_UDP_CKSUM       | \
                                      DP_PACKET_OL_TX_SCTP_CKSUM      | \
@@ -127,10 +115,8 @@ enum dp_packet_offload_mask {
                                      DP_PACKET_OL_TX_TUNNEL_GENEVE   | \
                                      DP_PACKET_OL_TX_TUNNEL_VXLAN    | \
                                      DP_PACKET_OL_TX_TUNNEL_GRE      | \
-                                     DP_PACKET_OL_TX_OUTER_IPV4      | \
                                      DP_PACKET_OL_TX_OUTER_IP_CKSUM  | \
-                                     DP_PACKET_OL_TX_OUTER_UDP_CKSUM | \
-                                     DP_PACKET_OL_TX_OUTER_IPV6)
+                                     DP_PACKET_OL_TX_OUTER_UDP_CKSUM)
 
 #define DP_PACKET_OL_TX_L4_MASK (DP_PACKET_OL_TX_TCP_CKSUM | \
                                  DP_PACKET_OL_TX_UDP_CKSUM | \
@@ -1113,20 +1099,6 @@ dp_packet_hwol_is_tso(const struct dp_packet *b)
     return !!(*dp_packet_ol_flags_ptr(b) & DP_PACKET_OL_TX_TCP_SEG);
 }
 
-/* Returns 'true' if packet 'b' is marked for IPv4 checksum offloading. */
-static inline bool
-dp_packet_hwol_is_ipv4(const struct dp_packet *b)
-{
-    return !!(*dp_packet_ol_flags_ptr(b) & DP_PACKET_OL_TX_IPV4);
-}
-
-/* Returns 'true' if packet 'p' is marked as IPv6. */
-static inline bool
-dp_packet_hwol_tx_ipv6(const struct dp_packet *p)
-{
-    return !!(*dp_packet_ol_flags_ptr(p) & DP_PACKET_OL_TX_IPV6);
-}
-
 /* Returns 'true' if packet 'b' is marked for TCP checksum offloading. */
 static inline bool
 dp_packet_hwol_l4_is_tcp(const struct dp_packet *b)
@@ -1151,20 +1123,6 @@ dp_packet_hwol_l4_is_sctp(struct dp_packet *b)
             DP_PACKET_OL_TX_SCTP_CKSUM;
 }
 
-/* Returns 'true' if packet 'b' is marked as having an outer IPv6 header. */
-static inline bool
-dp_packet_hwol_is_outer_ipv6(const struct dp_packet *b)
-{
-    return *dp_packet_ol_flags_ptr(b) & DP_PACKET_OL_TX_OUTER_IPV6;
-}
-
-/* Returns 'true' if packet 'b' is marked as having an outer IPv4 header. */
-static inline bool
-dp_packet_hwol_is_outer_ipv4(const struct dp_packet *b)
-{
-    return *dp_packet_ol_flags_ptr(b) & DP_PACKET_OL_TX_OUTER_IPV4;
-}
-
 /* Returns 'true' if packet 'b' is marked for tunnel GENEVE
  * checksum offloading. */
 static inline bool
@@ -1190,7 +1148,7 @@ dp_packet_hwol_is_tunnel_gre(struct dp_packet *b)
 
 /* Returns true if packet 'b' has any offloadable tunnel type. */
 static inline bool
-dp_packet_hwol_is_tunnel(struct dp_packet *b)
+dp_packet_hwol_is_tunnel(const struct dp_packet *b)
 {
     return !!(*dp_packet_ol_flags_ptr(b) & (DP_PACKET_OL_TX_TUNNEL_VXLAN |
                                             DP_PACKET_OL_TX_TUNNEL_GRE |
@@ -1224,30 +1182,6 @@ dp_packet_hwol_reset_tx_l4_csum(struct dp_packet *p)
     *dp_packet_ol_flags_ptr(p) &= ~DP_PACKET_OL_TX_L4_MASK;
 }
 
-/* Mark packet 'p' as IPv4. */
-static inline void
-dp_packet_hwol_set_tx_ipv4(struct dp_packet *p)
-{
-    *dp_packet_ol_flags_ptr(p) &= ~DP_PACKET_OL_TX_IPV6;
-    *dp_packet_ol_flags_ptr(p) |= DP_PACKET_OL_TX_IPV4;
-}
-
-/* Mark packet 'a' as IPv6. */
-static inline void
-dp_packet_hwol_set_tx_ipv6(struct dp_packet *a)
-{
-    *dp_packet_ol_flags_ptr(a) &= ~DP_PACKET_OL_TX_IPV4;
-    *dp_packet_ol_flags_ptr(a) |= DP_PACKET_OL_TX_IPV6;
-}
-
-/* Mark packet 'a' as a tunnel packet with outer IPv6 header. */
-static inline void
-dp_packet_hwol_set_tx_outer_ipv6(struct dp_packet *a)
-{
-    *dp_packet_ol_flags_ptr(a) &= ~DP_PACKET_OL_TX_OUTER_IPV4;
-    *dp_packet_ol_flags_ptr(a) |= DP_PACKET_OL_TX_OUTER_IPV6;
-}
-
 /* Returns 'true' if packet 'p' is marked for IPv4 checksum offloading. */
 static inline bool
 dp_packet_hwol_tx_ip_csum(const struct dp_packet *p)
@@ -1322,13 +1256,6 @@ dp_packet_hwol_set_tunnel_gre(struct dp_packet *b)
     *dp_packet_ol_flags_ptr(b) |= DP_PACKET_OL_TX_TUNNEL_GRE;
 }
 
-/* Mark packet 'b' as a tunnel packet with outer IPv4 header. */
-static inline void
-dp_packet_hwol_set_tx_outer_ipv4(struct dp_packet *b)
-{
-    *dp_packet_ol_flags_ptr(b) |= DP_PACKET_OL_TX_OUTER_IPV4;
-}
-
 /* Mark packet 'b' for csum offloading in outer IPv4 header. */
 static inline void
 dp_packet_hwol_set_tx_outer_ipv4_csum(struct dp_packet *b)
@@ -1362,24 +1289,31 @@ dp_packet_hwol_reset_tcp_seg(struct dp_packet *p)
 {
     uint64_t ol_flags = *dp_packet_ol_flags_ptr(p)
                         | DP_PACKET_OL_TX_TCP_CKSUM;
+    const struct ip_header *ip_hdr;
 
     ol_flags = ol_flags & ~(DP_PACKET_OL_TX_TCP_SEG
                             | DP_PACKET_OL_RX_L4_CKSUM_GOOD
                             | DP_PACKET_OL_RX_IP_CKSUM_GOOD);
 
-    if (ol_flags & DP_PACKET_OL_TX_IPV4) {
+    if (dp_packet_hwol_is_tunnel(p)) {
+        ip_hdr = dp_packet_inner_l3(p);
+    } else {
+        ip_hdr = dp_packet_l3(p);
+    }
+    if (IP_VER(ip_hdr->ip_ihl_ver) == 4) {
         ol_flags |= DP_PACKET_OL_TX_IP_CKSUM;
     }
 
-    if (ol_flags & (DP_PACKET_OL_TX_TUNNEL_VXLAN |
-                    DP_PACKET_OL_TX_TUNNEL_GENEVE)) {
-        if (ol_flags & DP_PACKET_OL_TX_OUTER_IPV4) {
+    if (dp_packet_hwol_is_tunnel(p)) {
+        ip_hdr = dp_packet_l3(p);
+        if (IP_VER(ip_hdr->ip_ihl_ver) == 4) {
             ol_flags |= DP_PACKET_OL_TX_OUTER_IP_CKSUM;
         }
-        ol_flags |= DP_PACKET_OL_TX_OUTER_UDP_CKSUM;
-    } else if (ol_flags & DP_PACKET_OL_TX_TUNNEL_GRE &&
-               ol_flags & DP_PACKET_OL_TX_OUTER_IPV4) {
-        ol_flags |= DP_PACKET_OL_TX_OUTER_IP_CKSUM;
+
+        if (dp_packet_hwol_is_tunnel_geneve(p)
+            || dp_packet_hwol_is_tunnel_vxlan(p)) {
+            ol_flags |= DP_PACKET_OL_TX_OUTER_UDP_CKSUM;
+        }
     }
 
     *dp_packet_ol_flags_ptr(p) = ol_flags;
@@ -1430,9 +1364,14 @@ dp_packet_ol_set_ip_csum_bad(struct dp_packet *p)
 static inline bool
 dp_packet_hwol_l3_csum_ipv4_ol(const struct dp_packet *b)
 {
-    if (dp_packet_hwol_is_outer_ipv4(b)) {
-        return dp_packet_hwol_is_outer_ipv4_cksum(b);
-    } else if (!dp_packet_hwol_is_outer_ipv6(b)) {
+    const struct ip_header *ip_hdr;
+
+    if (dp_packet_hwol_is_tunnel(b)) {
+        ip_hdr = dp_packet_l3(b);
+        if (IP_VER(ip_hdr->ip_ihl_ver) == 4) {
+            return dp_packet_hwol_is_outer_ipv4_cksum(b);
+        }
+    } else {
         return dp_packet_hwol_tx_ip_csum(b) &&
                !dp_packet_ip_checksum_good(b);
     }
@@ -1446,9 +1385,12 @@ dp_packet_hwol_l3_csum_ipv4_ol(const struct dp_packet *b)
 static inline bool
 dp_packet_hwol_l3_ipv4(const struct dp_packet *b)
 {
-    if (dp_packet_hwol_is_outer_ipv4(b)) {
-        return true;
-    } else if (!dp_packet_hwol_is_outer_ipv6(b)) {
+    const struct ip_header *ip_hdr;
+
+    if (dp_packet_hwol_is_tunnel(b)) {
+        ip_hdr = dp_packet_l3(b);
+        return IP_VER(ip_hdr->ip_ihl_ver) == 4;
+    } else {
         return dp_packet_hwol_tx_ip_csum(b);
     }
     return false;
diff --git a/lib/dpif-netdev-extract-avx512.c b/lib/dpif-netdev-extract-avx512.c
index 3ae850c2d5..20e1b5d691 100644
--- a/lib/dpif-netdev-extract-avx512.c
+++ b/lib/dpif-netdev-extract-avx512.c
@@ -761,18 +761,11 @@ mfex_check_tcp_data_offset(const struct tcp_header *tcp)
 static void
 mfex_ipv4_set_hwol(struct dp_packet *pkt)
 {
-    dp_packet_hwol_set_tx_ipv4(pkt);
     if (dp_packet_ip_checksum_good(pkt)) {
         dp_packet_hwol_set_tx_ip_csum(pkt);
     }
 }
 
-static void
-mfex_ipv6_set_hwol(struct dp_packet *pkt)
-{
-    dp_packet_hwol_set_tx_ipv6(pkt);
-}
-
 static void
 mfex_tcp_set_hwol(struct dp_packet *pkt)
 {
@@ -956,7 +949,6 @@ mfex_avx512_process(struct dp_packet_batch *packets,
                 /* Process UDP header. */
                 mfex_handle_ipv6_l4((void *)&pkt[54], &blocks[9]);
                 dp_packet_update_rss_hash_ipv6_tcp_udp(packet);
-                mfex_ipv6_set_hwol(packet);
                 mfex_udp_set_hwol(packet);
             } break;
 
@@ -981,7 +973,6 @@ mfex_avx512_process(struct dp_packet_batch *packets,
                 }
                 mfex_handle_tcp_flags(tcp, &blocks[9]);
                 dp_packet_update_rss_hash_ipv6_tcp_udp(packet);
-                mfex_ipv6_set_hwol(packet);
                 mfex_tcp_set_hwol(packet);
             } break;
 
@@ -1009,7 +1000,6 @@ mfex_avx512_process(struct dp_packet_batch *packets,
                 }
                 mfex_handle_tcp_flags(tcp, &blocks[10]);
                 dp_packet_update_rss_hash_ipv6_tcp_udp(packet);
-                mfex_ipv6_set_hwol(packet);
                 mfex_tcp_set_hwol(packet);
             } break;
 
@@ -1032,7 +1022,6 @@ mfex_avx512_process(struct dp_packet_batch *packets,
                 /* Process UDP header. */
                 mfex_handle_ipv6_l4((void *)&pkt[58], &blocks[10]);
                 dp_packet_update_rss_hash_ipv6_tcp_udp(packet);
-                mfex_ipv6_set_hwol(packet);
                 mfex_udp_set_hwol(packet);
             } break;
 
diff --git a/lib/flow.c b/lib/flow.c
index 80b76d8f87..66a7241305 100644
--- a/lib/flow.c
+++ b/lib/flow.c
@@ -950,12 +950,10 @@ miniflow_extract(struct dp_packet *packet, struct 
miniflow *dst)
         nw_frag = ipv4_get_nw_frag(nh);
         data_pull(&data, &size, ip_len);
         if (tunneling) {
-            dp_packet_hwol_set_tx_outer_ipv4(packet);
             if (dp_packet_ip_checksum_good(packet)) {
                 dp_packet_hwol_set_tx_outer_ipv4_csum(packet);
             }
         } else {
-            dp_packet_hwol_set_tx_ipv4(packet);
             if (dp_packet_ip_checksum_good(packet)) {
                 dp_packet_hwol_set_tx_ip_csum(packet);
             }
@@ -972,12 +970,6 @@ miniflow_extract(struct dp_packet *packet, struct miniflow 
*dst)
             goto out;
         }
         data_pull(&data, &size, sizeof *nh);
-
-        if (tunneling) {
-            dp_packet_hwol_set_tx_outer_ipv6(packet);
-        } else {
-            dp_packet_hwol_set_tx_ipv6(packet);
-        }
         plen = ntohs(nh->ip6_plen);
         dp_packet_set_l2_pad_size(packet, size - plen);
         size = plen;   /* Never pull padding. */
diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index 549887b313..1ef8abc723 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -2629,6 +2629,7 @@ static bool
 netdev_dpdk_prep_hwol_packet(struct netdev_dpdk *dev, struct rte_mbuf *mbuf)
 {
     struct dp_packet *pkt = CONTAINER_OF(mbuf, struct dp_packet, mbuf);
+    const struct ip_header *ip;
     void *l2;
     void *l3;
     void *l4;
@@ -2639,12 +2640,8 @@ netdev_dpdk_prep_hwol_packet(struct netdev_dpdk *dev, 
struct rte_mbuf *mbuf)
     const uint64_t all_outer_requests = (RTE_MBUF_F_TX_OUTER_IP_CKSUM |
                                          RTE_MBUF_F_TX_OUTER_UDP_CKSUM);
     const uint64_t all_requests = all_inner_requests | all_outer_requests;
-    const uint64_t all_inner_marks = (RTE_MBUF_F_TX_IPV4 |
-                                      RTE_MBUF_F_TX_IPV6);
-    const uint64_t all_outer_marks = (RTE_MBUF_F_TX_OUTER_IPV4 |
-                                      RTE_MBUF_F_TX_OUTER_IPV6 |
-                                      RTE_MBUF_F_TX_TUNNEL_MASK);
-    const uint64_t all_marks = all_inner_marks | all_outer_marks;
+    const uint64_t all_outer_marks = RTE_MBUF_F_TX_TUNNEL_MASK;
+    const uint64_t all_marks = all_outer_marks;
 
     if (!(mbuf->ol_flags & all_requests)) {
         /* No offloads requested, no marks should be set. */
@@ -2680,6 +2677,11 @@ netdev_dpdk_prep_hwol_packet(struct netdev_dpdk *dev, 
struct rte_mbuf *mbuf)
             mbuf->outer_l3_len = (char *) dp_packet_l4(pkt) -
                                  (char *) dp_packet_l3(pkt);
 
+            ip = dp_packet_l3(pkt);
+            mbuf->ol_flags |= IP_VER(ip->ip_ihl_ver) == 4
+                              ? RTE_MBUF_F_TX_OUTER_IPV4
+                              : RTE_MBUF_F_TX_OUTER_IPV6;
+
             /* Inner L2 length must account for the tunnel header length. */
             l2 = dp_packet_l4(pkt);
             l3 = dp_packet_inner_l3(pkt);
@@ -2699,17 +2701,13 @@ netdev_dpdk_prep_hwol_packet(struct netdev_dpdk *dev, 
struct rte_mbuf *mbuf)
         if (tunnel_type) {
             /* No inner offload is requested, fallback to non tunnel
              * checksum offloads. */
-            mbuf->ol_flags &= ~all_inner_marks;
             if (mbuf->ol_flags & RTE_MBUF_F_TX_OUTER_IP_CKSUM) {
                 mbuf->ol_flags |= RTE_MBUF_F_TX_IP_CKSUM;
-                mbuf->ol_flags |= RTE_MBUF_F_TX_IPV4;
             }
             if (mbuf->ol_flags & RTE_MBUF_F_TX_OUTER_UDP_CKSUM) {
                 mbuf->ol_flags |= RTE_MBUF_F_TX_UDP_CKSUM;
-                mbuf->ol_flags |= mbuf->ol_flags & RTE_MBUF_F_TX_OUTER_IPV4
-                                  ? RTE_MBUF_F_TX_IPV4 : RTE_MBUF_F_TX_IPV6;
             }
-            mbuf->ol_flags &= ~(all_outer_requests | all_outer_marks);
+            mbuf->ol_flags &= ~all_outer_requests;
         }
         mbuf->outer_l2_len = 0;
         mbuf->outer_l3_len = 0;
@@ -2721,6 +2719,10 @@ netdev_dpdk_prep_hwol_packet(struct netdev_dpdk *dev, 
struct rte_mbuf *mbuf)
 
     ovs_assert(l4);
 
+    ip = l3;
+    mbuf->ol_flags |= IP_VER(ip->ip_ihl_ver) == 4
+                      ? RTE_MBUF_F_TX_IPV4 : RTE_MBUF_F_TX_IPV6;
+
     mbuf->l2_len = (char *) l3 - (char *) l2;
     mbuf->l3_len = (char *) l4 - (char *) l3;
 
diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c
index 49ed25cbee..744c5210ea 100644
--- a/lib/netdev-linux.c
+++ b/lib/netdev-linux.c
@@ -7073,7 +7073,6 @@ netdev_linux_parse_packet(struct dp_packet *b, uint16_t 
*l2_len,
 
         *l3_len = IP_IHL(ip_hdr->ip_ihl_ver) * 4;
         *l4proto = ip_hdr->ip_proto;
-        dp_packet_hwol_set_tx_ipv4(b);
     } else if (eth_type == htons(ETH_TYPE_IPV6)) {
         struct ovs_16aligned_ip6_hdr *nh6;
         const void *data;
@@ -7095,7 +7094,6 @@ netdev_linux_parse_packet(struct dp_packet *b, uint16_t 
*l2_len,
         }
         *l3_len = (const char *) data - (const char *) nh6;
         *l4proto = nw_proto;
-        dp_packet_hwol_set_tx_ipv6(b);
     } else {
         *l3_len = *l4proto = 0;
     }
@@ -7213,10 +7211,14 @@ netdev_linux_prepend_vnet_hdr(struct dp_packet *b, int 
mtu)
 
     if (dp_packet_hwol_is_tso(b)) {
         uint16_t tso_segsz = dp_packet_get_tso_segsz(b);
-        struct tcp_header *tcp = dp_packet_l4(b);
-        struct tcp_header *inner_tcp = dp_packet_inner_l4(b);
-        if (inner_tcp) {
-            tcp = inner_tcp;
+        const struct tcp_header *tcp;
+        const struct ip_header *ip;
+        if (dp_packet_inner_l4(b)) {
+            tcp = dp_packet_inner_l4(b);
+            ip = dp_packet_inner_l3(b);
+        } else {
+            tcp = dp_packet_l4(b);
+            ip = dp_packet_l3(b);
         }
         int tcp_hdr_len = TCP_OFFSET(tcp->tcp_ctl) * 4;
         int hdr_len = ((char *) tcp - (char *) dp_packet_eth(b))
@@ -7232,9 +7234,9 @@ netdev_linux_prepend_vnet_hdr(struct dp_packet *b, int 
mtu)
 
         vnet->hdr_len = (OVS_FORCE __virtio16)hdr_len;
         vnet->gso_size = (OVS_FORCE __virtio16)(tso_segsz);
-        if (dp_packet_hwol_is_ipv4(b)) {
+        if (IP_VER(ip->ip_ihl_ver) == 4) {
             vnet->gso_type = VIRTIO_NET_HDR_GSO_TCPV4;
-        } else if (dp_packet_hwol_tx_ipv6(b)) {
+        } else if (IP_VER(ip->ip_ihl_ver) == 6) {
             vnet->gso_type = VIRTIO_NET_HDR_GSO_TCPV6;
         } else {
             VLOG_ERR_RL(&rl, "Unknown gso_type for TSO packet. "
@@ -7290,12 +7292,12 @@ netdev_linux_prepend_vnet_hdr(struct dp_packet *b, int 
mtu)
                 l4_off = dp_packet_l4(b);
             }
 
+            const struct ip_header *ip_hdr = l3_off;
             struct tcp_header *tcp_hdr = l4_off;
             ovs_be16 csum = 0;
-            if (dp_packet_hwol_is_ipv4(b)) {
-                const struct ip_header *ip_hdr = l3_off;
+            if (IP_VER(ip_hdr->ip_ihl_ver) == 4) {
                 csum = ~csum_finish(packet_csum_pseudoheader(ip_hdr));
-            } else if (dp_packet_hwol_tx_ipv6(b)) {
+            } else if (IP_VER(ip_hdr->ip_ihl_ver) == 6) {
                 const struct ovs_16aligned_ip6_hdr *ip6_hdr = l3_off;
                 csum = ~csum_finish(packet_csum_pseudoheader6(ip6_hdr));
             }
@@ -7315,14 +7317,13 @@ netdev_linux_prepend_vnet_hdr(struct dp_packet *b, int 
mtu)
                 l3_off = dp_packet_l3(b);
                 l4_off = dp_packet_l4(b);
             }
-            struct udp_header *udp_hdr = l4_off;
 
+            const struct ip_header *ip_hdr = l3_off;
+            struct udp_header *udp_hdr = l4_off;
             ovs_be16 csum = 0;
-
-            if (dp_packet_hwol_is_ipv4(b)) {
-                const struct ip_header *ip_hdr = l3_off;
+            if (IP_VER(ip_hdr->ip_ihl_ver) == 4) {
                 csum = ~csum_finish(packet_csum_pseudoheader(ip_hdr));
-            } else if (dp_packet_hwol_tx_ipv6(b)) {
+            } else if (IP_VER(ip_hdr->ip_ihl_ver) == 6) {
                 const struct ovs_16aligned_ip6_hdr *ip6_hdr = l3_off;
                 csum = ~csum_finish(packet_csum_pseudoheader6(ip6_hdr));
             }
diff --git a/lib/netdev-native-tnl.c b/lib/netdev-native-tnl.c
index d49597f380..1a4a75333c 100644
--- a/lib/netdev-native-tnl.c
+++ b/lib/netdev-native-tnl.c
@@ -204,12 +204,6 @@ netdev_tnl_push_ip_header(struct dp_packet *packet, const 
void *header,
         packet_set_ipv6_flow_label(&ip6->ip6_flow, ipv6_label);
         packet->l4_ofs = dp_packet_size(packet) - *ip_tot_size;
 
-        if (dp_packet_hwol_is_tunnel(packet)) {
-            dp_packet_hwol_set_tx_outer_ipv6(packet);
-        } else {
-            dp_packet_hwol_set_tx_ipv6(packet);
-        }
-
         dp_packet_ol_reset_ip_csum_good(packet);
         return ip6 + 1;
     } else {
@@ -217,10 +211,8 @@ netdev_tnl_push_ip_header(struct dp_packet *packet, const 
void *header,
         ip->ip_tot_len = htons(*ip_tot_size);
         /* Postpone checksum to when the packet is pushed to the port. */
         if (dp_packet_hwol_is_tunnel(packet)) {
-            dp_packet_hwol_set_tx_outer_ipv4(packet);
             dp_packet_hwol_set_tx_outer_ipv4_csum(packet);
         } else {
-            dp_packet_hwol_set_tx_ipv4(packet);
             dp_packet_hwol_set_tx_ip_csum(packet);
         }
 
@@ -290,10 +282,7 @@ dp_packet_tnl_ol_process(struct dp_packet *packet,
             data->tnl_type == OVS_VPORT_TYPE_IP6GRE) {
 
             if (IP_VER(ip->ip_ihl_ver) == 4) {
-                dp_packet_hwol_set_tx_ipv4(packet);
                 dp_packet_hwol_set_tx_ip_csum(packet);
-            } else if (IP_VER(ip->ip_ihl_ver) == 6) {
-                dp_packet_hwol_set_tx_ipv6(packet);
             }
         }
     }
diff --git a/lib/packets.c b/lib/packets.c
index 91c28daf02..05aa5c7664 100644
--- a/lib/packets.c
+++ b/lib/packets.c
@@ -1999,7 +1999,6 @@ packet_tcp_complete_csum(struct dp_packet *p, bool inner)
     struct tcp_header *tcp;
     size_t tcp_sz;
     void *ip_hdr;
-    bool is_v4;
 
     if (inner) {
         tcp = dp_packet_inner_l4(p);
@@ -2014,20 +2013,8 @@ packet_tcp_complete_csum(struct dp_packet *p, bool inner)
     ovs_assert(tcp);
     ovs_assert(ip_hdr);
 
-    if (!inner && dp_packet_hwol_is_outer_ipv6(p)) {
-        is_v4 = false;
-    } else if (!inner && dp_packet_hwol_is_outer_ipv4(p)) {
-        is_v4 = true;
-    } else if (dp_packet_hwol_is_ipv4(p)) {
-        is_v4 = true;
-    } else if (dp_packet_hwol_tx_ipv6(p)) {
-        is_v4 = false;
-    } else {
-        OVS_NOT_REACHED();
-    }
-
     tcp->tcp_csum = 0;
-    if (is_v4) {
+    if (IP_VER(((const struct ip_header *) ip_hdr)->ip_ihl_ver) == 4) {
         struct ip_header *ip = ip_hdr;
 
         tcp->tcp_csum = csum_finish(csum_continue(packet_csum_pseudoheader(ip),
@@ -2048,7 +2035,6 @@ packet_udp_complete_csum(struct dp_packet *p, bool inner)
     struct udp_header *udp;
     size_t udp_sz;
     void *ip_hdr;
-    bool is_v4;
 
     if (inner) {
         udp = dp_packet_inner_l4(p);
@@ -2068,20 +2054,8 @@ packet_udp_complete_csum(struct dp_packet *p, bool inner)
         return;
     }
 
-    if (!inner && dp_packet_hwol_is_outer_ipv6(p)) {
-        is_v4 = false;
-    } else if (!inner && dp_packet_hwol_is_outer_ipv4(p)) {
-        is_v4 = true;
-    } else if (dp_packet_hwol_is_ipv4(p)) {
-        is_v4 = true;
-    } else if (dp_packet_hwol_tx_ipv6(p)) {
-        is_v4 = false;
-    } else {
-        OVS_NOT_REACHED();
-    }
-
     udp->udp_csum = 0;
-    if (is_v4) {
+    if (IP_VER(((const struct ip_header *) ip_hdr)->ip_ihl_ver) == 4) {
         struct ip_header *ip = ip_hdr;
 
         udp->udp_csum = csum_finish(csum_continue(packet_csum_pseudoheader(ip),
-- 
2.48.1

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to