summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJianbo Liu <jianbol@mellanox.com>2018-04-25 08:09:08 +0000
committerSimon Horman <simon.horman@netronome.com>2018-04-25 10:36:45 +0200
commitd5ac645826464cc402b83193f61fdb08cad28412 (patch)
tree383fc1e1b84d739f19731928289b8b3eda7e1ee0 /lib
parentdd69cd35007f23f87b55feacd8e054fcf98dc848 (diff)
downloadopenvswitch-d5ac645826464cc402b83193f61fdb08cad28412.tar.gz
lib/tc: Remove unnecessary icmp recalculation
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> Signed-off-by: Simon Horman <simon.horman@netronome.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/tc.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/lib/tc.c b/lib/tc.c
index 0784d901e..8e7d10341 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 {