diff mbox series

[ovs-dev] lib/tc: Remove unnecessary icmp recalculation

Message ID 20180425080908.8706-1-jianbol@mellanox.com
State Accepted
Headers show
Series [ovs-dev] lib/tc: Remove unnecessary icmp recalculation | expand

Commit Message

Jianbo Liu April 25, 2018, 8:09 a.m. UTC
ICMP checksum is calculated from ICMP headers and data, so hardware doesn't
need to calculate it again because we only rewrite IP headers.

Signed-off-by: Jianbo Liu <jianbol@mellanox.com>
Reviewed-by: Paul Blakey <paulb@mellanox.com>
Reviewed-by: Roi Dayan <roid@mellanox.com>
---
 lib/tc.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

Comments

Simon Horman April 25, 2018, 9:34 a.m. UTC | #1
On 25 April 2018 at 10:09, Jianbo Liu <jianbol@mellanox.com> wrote:

> ICMP checksum is calculated from ICMP headers and data, so hardware doesn't
> need to calculate it again because we only rewrite IP headers.
>
> Signed-off-by: Jianbo Liu <jianbol@mellanox.com>
> Reviewed-by: Paul Blakey <paulb@mellanox.com>
> Reviewed-by: Roi Dayan <roid@mellanox.com>


Thanks, applied to master and branch-2.9.
diff mbox series

Patch

diff --git a/lib/tc.c b/lib/tc.c
index 0784d90..8e7d103 100644
--- a/lib/tc.c
+++ b/lib/tc.c
@@ -1275,7 +1275,7 @@  csum_update_flag(struct tc_flower *flower,
      * eth(dst=<mac>),eth_type(0x0800) actions=set(ipv4(src=<new_ip>))
      * we need to force a more specific flow as this can, for example,
      * need a recalculation of icmp checksum if the packet that passes
-     * is icmp and tcp checksum if its tcp. */
+     * is ICMPv6 and tcp checksum if its tcp. */
 
     switch (htype) {
     case TCA_PEDIT_KEY_EX_HDR_TYPE_IP4:
@@ -1290,8 +1290,9 @@  csum_update_flag(struct tc_flower *flower,
         } else if (flower->key.ip_proto == IPPROTO_UDP) {
             flower->needs_full_ip_proto_mask = true;
             flower->csum_update_flags |= TCA_CSUM_UPDATE_FLAG_UDP;
-        } else if (flower->key.ip_proto == IPPROTO_ICMP
-                   || flower->key.ip_proto == IPPROTO_ICMPV6) {
+        } else if (flower->key.ip_proto == IPPROTO_ICMP) {
+            flower->needs_full_ip_proto_mask = true;
+        } else if (flower->key.ip_proto == IPPROTO_ICMPV6) {
             flower->needs_full_ip_proto_mask = true;
             flower->csum_update_flags |= TCA_CSUM_UPDATE_FLAG_ICMP;
         } else {