Currently, the reassembly code drops bad checksum (non fragmented)
packets before those reach the conntrack code.
This is not something one would expect from ipf_is_valid_v4_frag() /
ipf_extract_frags_from_batch() functions.

While at it, add coverage counters so that checksum validation impact
can be monitored.

Signed-off-by: David Marchand <david.march...@redhat.com>
---
 lib/ipf.c | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/lib/ipf.c b/lib/ipf.c
index b76181e793..0066aeb50b 100644
--- a/lib/ipf.c
+++ b/lib/ipf.c
@@ -36,6 +36,7 @@
 
 VLOG_DEFINE_THIS_MODULE(ipf);
 COVERAGE_DEFINE(ipf_stuck_frag_list_purged);
+COVERAGE_DEFINE(ipf_l3csum_checked);
 COVERAGE_DEFINE(ipf_l3csum_err);
 
 enum {
@@ -583,11 +584,6 @@ ipf_list_state_transition(struct ipf *ipf, struct ipf_list 
*ipf_list,
 static bool
 ipf_is_valid_v4_frag(struct ipf *ipf, struct dp_packet *pkt)
 {
-    if (OVS_UNLIKELY(dp_packet_ip_checksum_bad(pkt))) {
-        COVERAGE_INC(ipf_l3csum_err);
-        goto invalid_pkt;
-    }
-
     const struct eth_header *l2 = dp_packet_eth(pkt);
     const struct ip_header *l3 = dp_packet_l3(pkt);
 
@@ -617,8 +613,12 @@ ipf_is_valid_v4_frag(struct ipf *ipf, struct dp_packet 
*pkt)
         goto invalid_pkt;
     }
 
-    if (OVS_UNLIKELY(!dp_packet_ip_checksum_good(pkt)
-                     && csum(l3, ip_hdr_len) != 0)) {
+    bool bad_csum = dp_packet_ip_checksum_bad(pkt);
+    if (OVS_UNLIKELY(!bad_csum && !dp_packet_ip_checksum_good(pkt))) {
+        COVERAGE_INC(ipf_l3csum_checked);
+        bad_csum = csum(l3, ip_hdr_len);
+    }
+    if (OVS_UNLIKELY(bad_csum)) {
         COVERAGE_INC(ipf_l3csum_err);
         goto invalid_pkt;
     }
-- 
2.48.1

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

Reply via email to