701-05-net-ethernet-mtk_eth_soc-add-ipv6-flow-offload-suppo.patch 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. From: David Bentham <[email protected]>
  2. Date: Mon, 21 Feb 2022 15:36:16 +0100
  3. Subject: [PATCH] net: ethernet: mtk_eth_soc: add ipv6 flow offload
  4. support
  5. Add the missing IPv6 flow offloading support for routing only.
  6. Hardware flow offloading is done by the packet processing engine (PPE)
  7. of the Ethernet MAC and as it doesn't support mangling of IPv6 packets,
  8. IPv6 NAT cannot be supported.
  9. Signed-off-by: David Bentham <[email protected]>
  10. Signed-off-by: Felix Fietkau <[email protected]>
  11. ---
  12. --- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
  13. +++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c
  14. @@ -6,6 +6,7 @@
  15. #include <linux/if_ether.h>
  16. #include <linux/rhashtable.h>
  17. #include <linux/ip.h>
  18. +#include <linux/ipv6.h>
  19. #include <net/flow_offload.h>
  20. #include <net/pkt_cls.h>
  21. #include <net/dsa.h>
  22. @@ -20,6 +21,11 @@ struct mtk_flow_data {
  23. __be32 src_addr;
  24. __be32 dst_addr;
  25. } v4;
  26. +
  27. + struct {
  28. + struct in6_addr src_addr;
  29. + struct in6_addr dst_addr;
  30. + } v6;
  31. };
  32. __be16 src_port;
  33. @@ -65,6 +71,14 @@ mtk_flow_set_ipv4_addr(struct mtk_foe_en
  34. data->v4.dst_addr, data->dst_port);
  35. }
  36. +static int
  37. +mtk_flow_set_ipv6_addr(struct mtk_foe_entry *foe, struct mtk_flow_data *data)
  38. +{
  39. + return mtk_foe_entry_set_ipv6_tuple(foe,
  40. + data->v6.src_addr.s6_addr32, data->src_port,
  41. + data->v6.dst_addr.s6_addr32, data->dst_port);
  42. +}
  43. +
  44. static void
  45. mtk_flow_offload_mangle_eth(const struct flow_action_entry *act, void *eth)
  46. {
  47. @@ -296,6 +310,9 @@ mtk_flow_offload_replace(struct mtk_eth
  48. case FLOW_DISSECTOR_KEY_IPV4_ADDRS:
  49. offload_type = MTK_PPE_PKT_TYPE_IPV4_HNAPT;
  50. break;
  51. + case FLOW_DISSECTOR_KEY_IPV6_ADDRS:
  52. + offload_type = MTK_PPE_PKT_TYPE_IPV6_ROUTE_5T;
  53. + break;
  54. default:
  55. return -EOPNOTSUPP;
  56. }
  57. @@ -331,6 +348,17 @@ mtk_flow_offload_replace(struct mtk_eth
  58. mtk_flow_set_ipv4_addr(&foe, &data, false);
  59. }
  60. + if (addr_type == FLOW_DISSECTOR_KEY_IPV6_ADDRS) {
  61. + struct flow_match_ipv6_addrs addrs;
  62. +
  63. + flow_rule_match_ipv6_addrs(rule, &addrs);
  64. +
  65. + data.v6.src_addr = addrs.key->src;
  66. + data.v6.dst_addr = addrs.key->dst;
  67. +
  68. + mtk_flow_set_ipv6_addr(&foe, &data);
  69. + }
  70. +
  71. flow_action_for_each(i, act, &rule->action) {
  72. if (act->id != FLOW_ACTION_MANGLE)
  73. continue;