flow_compose() can generate packets with bad IPv4 checksum, however the
associated Rx flags were not correctly set.
The usefulness of setting this metadata seems limited, yet fix this for
consistency.

Fixes: c62b4ac8f8da ("ovs-ofctl: Implement compose-packet --bare [--bad-csum].")
Signed-off-by: David Marchand <david.march...@redhat.com>
---
 lib/dp-packet.h | 8 +++++++-
 lib/flow.c      | 2 +-
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/lib/dp-packet.h b/lib/dp-packet.h
index 0f487a4283..c795d9f8da 100644
--- a/lib/dp-packet.h
+++ b/lib/dp-packet.h
@@ -1411,7 +1411,6 @@ dp_packet_ol_reset_ip_csum_good(struct dp_packet *p)
     *dp_packet_ol_flags_ptr(p) &= ~DP_PACKET_OL_RX_IP_CKSUM_GOOD;
 }
 
-/* Marks packet 'p' with bad IPv4 checksum. */
 static inline bool
 dp_packet_ip_checksum_bad(const struct dp_packet *p)
 {
@@ -1419,6 +1418,13 @@ dp_packet_ip_checksum_bad(const struct dp_packet *p)
             DP_PACKET_OL_RX_IP_CKSUM_BAD;
 }
 
+static inline void
+dp_packet_ol_set_ip_csum_bad(struct dp_packet *p)
+{
+    *dp_packet_ol_flags_ptr(p) &= ~DP_PACKET_OL_RX_IP_CKSUM_GOOD;
+    *dp_packet_ol_flags_ptr(p) |= DP_PACKET_OL_RX_IP_CKSUM_BAD;
+}
+
 /* Return 'true' is packet 'b' is not encapsulated and is marked for IPv4
  * checksum offload, or if 'b' is encapsulated and the outer layer is marked
  * for IPv4 checksum offload. IPv6 packets, non offloaded packets, and IPv4
diff --git a/lib/flow.c b/lib/flow.c
index f0fc41b40b..61e732aff8 100644
--- a/lib/flow.c
+++ b/lib/flow.c
@@ -3412,7 +3412,7 @@ flow_compose(struct dp_packet *p, const struct flow *flow,
              * bit.
              */
             ip->ip_csum ^= (OVS_FORCE ovs_be16) 0x1;
-            dp_packet_ip_checksum_bad(p);
+            dp_packet_ol_set_ip_csum_bad(p);
         } else {
             dp_packet_ol_set_ip_csum_good(p);
         }
-- 
2.48.1

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

Reply via email to