diff options
-rw-r--r-- | drivers/net/ethernet/netronome/nfp/flower/action.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/drivers/net/ethernet/netronome/nfp/flower/action.c b/drivers/net/ethernet/netronome/nfp/flower/action.c index c39d7fdf73e6..7a1e9cd9cc62 100644 --- a/drivers/net/ethernet/netronome/nfp/flower/action.c +++ b/drivers/net/ethernet/netronome/nfp/flower/action.c | |||
@@ -450,12 +450,12 @@ nfp_fl_set_ip4(const struct tc_action *action, int idx, u32 off, | |||
450 | } | 450 | } |
451 | 451 | ||
452 | static void | 452 | static void |
453 | nfp_fl_set_ip6_helper(int opcode_tag, int idx, __be32 exact, __be32 mask, | 453 | nfp_fl_set_ip6_helper(int opcode_tag, u8 word, __be32 exact, __be32 mask, |
454 | struct nfp_fl_set_ipv6_addr *ip6) | 454 | struct nfp_fl_set_ipv6_addr *ip6) |
455 | { | 455 | { |
456 | ip6->ipv6[idx % 4].mask |= mask; | 456 | ip6->ipv6[word].mask |= mask; |
457 | ip6->ipv6[idx % 4].exact &= ~mask; | 457 | ip6->ipv6[word].exact &= ~mask; |
458 | ip6->ipv6[idx % 4].exact |= exact & mask; | 458 | ip6->ipv6[word].exact |= exact & mask; |
459 | 459 | ||
460 | ip6->reserved = cpu_to_be16(0); | 460 | ip6->reserved = cpu_to_be16(0); |
461 | ip6->head.jump_id = opcode_tag; | 461 | ip6->head.jump_id = opcode_tag; |
@@ -468,6 +468,7 @@ nfp_fl_set_ip6(const struct tc_action *action, int idx, u32 off, | |||
468 | struct nfp_fl_set_ipv6_addr *ip_src) | 468 | struct nfp_fl_set_ipv6_addr *ip_src) |
469 | { | 469 | { |
470 | __be32 exact, mask; | 470 | __be32 exact, mask; |
471 | u8 word; | ||
471 | 472 | ||
472 | /* We are expecting tcf_pedit to return a big endian value */ | 473 | /* We are expecting tcf_pedit to return a big endian value */ |
473 | mask = (__force __be32)~tcf_pedit_mask(action, idx); | 474 | mask = (__force __be32)~tcf_pedit_mask(action, idx); |
@@ -476,17 +477,20 @@ nfp_fl_set_ip6(const struct tc_action *action, int idx, u32 off, | |||
476 | if (exact & ~mask) | 477 | if (exact & ~mask) |
477 | return -EOPNOTSUPP; | 478 | return -EOPNOTSUPP; |
478 | 479 | ||
479 | if (off < offsetof(struct ipv6hdr, saddr)) | 480 | if (off < offsetof(struct ipv6hdr, saddr)) { |
480 | return -EOPNOTSUPP; | 481 | return -EOPNOTSUPP; |
481 | else if (off < offsetof(struct ipv6hdr, daddr)) | 482 | } else if (off < offsetof(struct ipv6hdr, daddr)) { |
482 | nfp_fl_set_ip6_helper(NFP_FL_ACTION_OPCODE_SET_IPV6_SRC, idx, | 483 | word = (off - offsetof(struct ipv6hdr, saddr)) / sizeof(exact); |
484 | nfp_fl_set_ip6_helper(NFP_FL_ACTION_OPCODE_SET_IPV6_SRC, word, | ||
483 | exact, mask, ip_src); | 485 | exact, mask, ip_src); |
484 | else if (off < offsetof(struct ipv6hdr, daddr) + | 486 | } else if (off < offsetof(struct ipv6hdr, daddr) + |
485 | sizeof(struct in6_addr)) | 487 | sizeof(struct in6_addr)) { |
486 | nfp_fl_set_ip6_helper(NFP_FL_ACTION_OPCODE_SET_IPV6_DST, idx, | 488 | word = (off - offsetof(struct ipv6hdr, daddr)) / sizeof(exact); |
489 | nfp_fl_set_ip6_helper(NFP_FL_ACTION_OPCODE_SET_IPV6_DST, word, | ||
487 | exact, mask, ip_dst); | 490 | exact, mask, ip_dst); |
488 | else | 491 | } else { |
489 | return -EOPNOTSUPP; | 492 | return -EOPNOTSUPP; |
493 | } | ||
490 | 494 | ||
491 | return 0; | 495 | return 0; |
492 | } | 496 | } |