From 81d098ca6aa62a2e163c5592132362e3144e7fa6 Mon Sep 17 00:00:00 2001 From: Frank Wunderlich Date: Sat, 27 Mar 2021 15:56:30 +0100 Subject: [PATCH 1/4] Revert "again changes" This reverts commit f72d6c8d495f1da86fe27fd5cba6e3f7615d01c4. --- .../net/ethernet/mediatek/mtk_ppe_offload.c | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c index f566fbef5ff70..5baedefb7a627 100644 --- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c +++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c @@ -145,18 +145,23 @@ static int mtk_flow_mangle_ipv6(const struct flow_action_entry *act, struct mtk_flow_data *data) { - struct in6_addr *dest; + size_t offset_of_ip6_daddr = offsetof(struct ipv6hdr, daddr); + size_t offset_of_ip6_saddr = offsetof(struct ipv6hdr, saddr); + __be32 *dest; + u32 idx; switch (act->mangle.offset) { - case offsetof(struct ipv6hdr, saddr): - dest = &data->v6.src_addr; - break; - case offsetof(struct ipv6hdr, daddr): - dest = &data->v6.dst_addr; - break; - } - - memcpy(dest, &act->mangle.val, sizeof(struct in6_addr)); + case offsetof(struct ipv6hdr, saddr): + idx = (act->mangle.offset - offset_of_ip6_saddr) / 4; + dest = &data->v6.src_addr.s6_addr32[idx]; + break; + case offsetof(struct ipv6hdr, daddr): + idx = (act->mangle.offset - offset_of_ip6_daddr) / 4; + dest = &data->v6.dst_addr.s6_addr32[idx]; + break; + } + + memcpy(dest, &act->mangle.val, sizeof(u32)); return 0; } From fa51d198c2ceff9692a0fe40ba5ef1424850bbc4 Mon Sep 17 00:00:00 2001 From: Frank Wunderlich Date: Sat, 27 Mar 2021 15:56:31 +0100 Subject: [PATCH 2/4] Revert "some fixes in layout" This reverts commit 5d578ee6f15ddee8c9577c874778453be6cdb9d8. --- .../net/ethernet/mediatek/mtk_ppe_offload.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c index 5baedefb7a627..29cf0eb25a221 100644 --- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c +++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c @@ -145,20 +145,18 @@ static int mtk_flow_mangle_ipv6(const struct flow_action_entry *act, struct mtk_flow_data *data) { + __be32 *dest; size_t offset_of_ip6_daddr = offsetof(struct ipv6hdr, daddr); size_t offset_of_ip6_saddr = offsetof(struct ipv6hdr, saddr); - __be32 *dest; u32 idx; - switch (act->mangle.offset) { - case offsetof(struct ipv6hdr, saddr): - idx = (act->mangle.offset - offset_of_ip6_saddr) / 4; - dest = &data->v6.src_addr.s6_addr32[idx]; - break; - case offsetof(struct ipv6hdr, daddr): - idx = (act->mangle.offset - offset_of_ip6_daddr) / 4; - dest = &data->v6.dst_addr.s6_addr32[idx]; - break; + if (act->mangle.offset >= offset_of_ip6_daddr && act->mangle.offset < offset_of_ip6_daddr) { + idx = (act->mangle.offset - offset_of_ip6_saddr) / 4; + dest = &data->v6.src_addr.s6_addr32[idx]; + } else if (act->mangle.offset >= offset_of_ip6_daddr && + act->mangle.offset < offset_of_ip6_daddr + 16) { + idx = (act->mangle.offset - offset_of_ip6_daddr) / 4; + dest = &data->v6.dst_addr.s6_addr32[idx]; } memcpy(dest, &act->mangle.val, sizeof(u32)); From d60ed77c6c2f36b45e7c838ba9af3a9c935b6647 Mon Sep 17 00:00:00 2001 From: Frank Wunderlich Date: Sun, 28 Mar 2021 19:24:08 +0200 Subject: [PATCH 3/4] fix crash and flowtable binding but still connection broken if flow offload is active --- drivers/net/ethernet/mediatek/mtk_ppe_offload.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c index 29cf0eb25a221..fbb52cc54fcf5 100644 --- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c +++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c @@ -145,12 +145,12 @@ static int mtk_flow_mangle_ipv6(const struct flow_action_entry *act, struct mtk_flow_data *data) { - __be32 *dest; + __be32 *dest = 0; size_t offset_of_ip6_daddr = offsetof(struct ipv6hdr, daddr); size_t offset_of_ip6_saddr = offsetof(struct ipv6hdr, saddr); u32 idx; - if (act->mangle.offset >= offset_of_ip6_daddr && act->mangle.offset < offset_of_ip6_daddr) { + if (act->mangle.offset >= offset_of_ip6_saddr && act->mangle.offset < offset_of_ip6_daddr) { idx = (act->mangle.offset - offset_of_ip6_saddr) / 4; dest = &data->v6.src_addr.s6_addr32[idx]; } else if (act->mangle.offset >= offset_of_ip6_daddr && @@ -158,8 +158,8 @@ mtk_flow_mangle_ipv6(const struct flow_action_entry *act, idx = (act->mangle.offset - offset_of_ip6_daddr) / 4; dest = &data->v6.dst_addr.s6_addr32[idx]; } - - memcpy(dest, &act->mangle.val, sizeof(u32)); + if (dest) + memcpy(dest, &act->mangle.val, sizeof(u32)); return 0; } From 3a5215c33c887462877e1a55f3848232d174c833 Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Mon, 29 Mar 2021 12:14:30 +0200 Subject: [PATCH 4/4] net: nftables: fix hang in flowtable --- .../net/ethernet/mediatek/mtk_ppe_offload.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c index fbb52cc54fcf5..b987ca2f35261 100644 --- a/drivers/net/ethernet/mediatek/mtk_ppe_offload.c +++ b/drivers/net/ethernet/mediatek/mtk_ppe_offload.c @@ -447,6 +447,8 @@ mtk_flow_offload_stats(struct mtk_eth *eth, struct flow_cls_offload *f) return 0; } +static DEFINE_MUTEX(mtk_flow_offload_mutex); + static int mtk_eth_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_priv) { @@ -454,6 +456,7 @@ mtk_eth_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_pri struct net_device *dev = cb_priv; struct mtk_mac *mac = netdev_priv(dev); struct mtk_eth *eth = mac->hw; + int err; if (!tc_can_offload(dev)) return -EOPNOTSUPP; @@ -461,18 +464,24 @@ mtk_eth_setup_tc_block_cb(enum tc_setup_type type, void *type_data, void *cb_pri if (type != TC_SETUP_CLSFLOWER) return -EOPNOTSUPP; + mutex_down(&mtk_flow_offload_mutex); switch (cls->command) { case FLOW_CLS_REPLACE: - return mtk_flow_offload_replace(eth, cls); + err = mtk_flow_offload_replace(eth, cls); + break; case FLOW_CLS_DESTROY: - return mtk_flow_offload_destroy(eth, cls); + err = mtk_flow_offload_destroy(eth, cls); + break; case FLOW_CLS_STATS: - return mtk_flow_offload_stats(eth, cls); + err = mtk_flow_offload_stats(eth, cls); + break; default: - return -EOPNOTSUPP; + err = -EOPNOTSUPP; + break; } + mutex_up(&mtk_flow_offload_mutex); - return 0; + return err; } static int