@@ -1131,11 +1131,23 @@ dp_packet_hwol_set_tcp_seg(struct dp_packet *b)
*dp_packet_ol_flags_ptr(b) |= DP_PACKET_OL_TX_TCP_SEG;
}
-/* Resets TCP Segmentation flag in packet 'p'. */
+/* Resets TCP Segmentation in packet 'p' and adjust flags to indicate
+ * L3 and L4 checksumming is now required. */
static inline void
dp_packet_hwol_reset_tcp_seg(struct dp_packet *p)
{
- *dp_packet_ol_flags_ptr(p) &= ~DP_PACKET_OL_TX_TCP_SEG;
+ uint64_t ol_flags = *dp_packet_ol_flags_ptr(p)
+ | DP_PACKET_OL_TX_TCP_CKSUM;
+
+ ol_flags = ol_flags & ~(DP_PACKET_OL_TX_TCP_SEG
+ | DP_PACKET_OL_RX_L4_CKSUM_MASK
+ | DP_PACKET_OL_RX_IP_CKSUM_GOOD);
+
+ if (ol_flags & DP_PACKET_OL_TX_IPV4) {
+ ol_flags |= DP_PACKET_OL_TX_IP_CKSUM;
+ }
+
+ *dp_packet_ol_flags_ptr(p) = ol_flags;
}
/* Returns 'true' if the IP header has good integrity and the
When OVS needs to fallback on the software TSO implementation to segment a packet, it currently doesn't guarantee that IP and TCP checksum offload flags are set. However, it is possible that these is required. This is true in the case of dp_netdev_upcall(), which clears these flags. This patch explicitly sets the appropriate flags when the segmentation flag is removed, to guarantee that packets always end up with correct checksums. Signed-off-by: Mike Pattrick <mkp@redhat.com> --- v3: Moved logic from ofproto-dpif-upcall to dp-packet --- lib/dp-packet.h | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)