[OpenWrt-Devel] [PATCH 19.07] generic: fix flow table hw offload
John Crispin
john at phrozen.org
Tue May 26 16:51:02 EDT 2020
On 26.05.20 22:01, Petr Štetiar wrote:
> From: John Crispin <john at phrozen.org>
>
> Make the driver work with recent upstream changes.
>
> Fixes: FS#2632
> Ref: https://github.com/openwrt/openwrt/pull/2815
> Signed-off-by: John Crispin <john at phrozen.org>
> (cherry picked from commit 6786dc26a205da55ec2d9771693cdfb99e756e59)
> ---
thanks, feel free to commit.
Acked-by: John Crispin <john at phrozen.org>
> ...w_table-support-hw-offload-through-v.patch | 33 ++++++++++---------
> 1 file changed, 18 insertions(+), 15 deletions(-)
>
> diff --git a/target/linux/generic/pending-4.14/641-netfilter-nf_flow_table-support-hw-offload-through-v.patch b/target/linux/generic/pending-4.14/641-netfilter-nf_flow_table-support-hw-offload-through-v.patch
> index 93117253466b..e1b13a1ad491 100644
> --- a/target/linux/generic/pending-4.14/641-netfilter-nf_flow_table-support-hw-offload-through-v.patch
> +++ b/target/linux/generic/pending-4.14/641-netfilter-nf_flow_table-support-hw-offload-through-v.patch
> @@ -79,7 +79,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
> struct nf_flow_route {
> --- a/net/netfilter/nf_flow_table_hw.c
> +++ b/net/netfilter/nf_flow_table_hw.c
> -@@ -19,48 +19,75 @@ struct flow_offload_hw {
> +@@ -19,48 +19,77 @@ struct flow_offload_hw {
> enum flow_offload_type type;
> struct flow_offload *flow;
> struct nf_conn *ct;
> @@ -92,6 +92,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
> -static int do_flow_offload_hw(struct net *net, struct flow_offload *flow,
> - int type)
> +static void flow_offload_check_ethernet(struct flow_offload_tuple *tuple,
> ++ struct dst_entry *dst,
> + struct flow_offload_hw_path *path)
> {
> - struct net_device *indev;
> @@ -112,7 +113,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
>
> - dev_put(indev);
> + memcpy(path->eth_src, path->dev->dev_addr, ETH_ALEN);
> -+ n = dst_neigh_lookup(tuple->dst_cache, &tuple->src_v4);
> ++ n = dst_neigh_lookup(dst, &tuple->src_v4);
> + if (!n)
> + return;
>
> @@ -125,6 +126,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
> -static void flow_offload_hw_work_add(struct flow_offload_hw *offload)
> +static int flow_offload_check_path(struct net *net,
> + struct flow_offload_tuple *tuple,
> ++ struct dst_entry *dst,
> + struct flow_offload_hw_path *path)
> {
> - struct net *net;
> @@ -138,7 +140,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
> + return -ENOENT;
> +
> + path->dev = dev;
> -+ flow_offload_check_ethernet(tuple, path);
> ++ flow_offload_check_ethernet(tuple, dst, path);
>
> - net = read_pnet(&offload->flow_hw_net);
> - ret = do_flow_offload_hw(net, offload->flow, FLOW_OFFLOAD_ADD);
> @@ -166,11 +168,11 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
> + /* restore devices in case the driver mangled them */
> + offload->src.dev = src_dev;
> + offload->dest.dev = dest_dev;
> -+
> -+ return ret;
> -+}
>
> - do_flow_offload_hw(net, offload->flow, FLOW_OFFLOAD_DEL);
> ++ return ret;
> ++}
> ++
> +static void flow_offload_hw_free(struct flow_offload_hw *offload)
> +{
> + dev_put(offload->src.dev);
> @@ -182,7 +184,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
> }
>
> static void flow_offload_hw_work(struct work_struct *work)
> -@@ -73,18 +100,22 @@ static void flow_offload_hw_work(struct
> +@@ -73,18 +102,22 @@ static void flow_offload_hw_work(struct
> spin_unlock_bh(&flow_offload_hw_pending_list_lock);
>
> list_for_each_entry_safe(offload, next, &hw_offload_pending, list) {
> @@ -211,7 +213,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
> }
> }
>
> -@@ -97,20 +128,55 @@ static void flow_offload_queue_work(stru
> +@@ -97,20 +130,56 @@ static void flow_offload_queue_work(stru
> schedule_work(&nf_flow_offload_hw_work);
> }
>
> @@ -220,17 +222,18 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
> +{
> + struct flow_offload_hw_path src = {};
> + struct flow_offload_hw_path dest = {};
> -+ struct flow_offload_tuple *tuple;
> ++ struct flow_offload_tuple *tuple_s, *tuple_d;
> + struct flow_offload_hw *offload = NULL;
> +
> + rcu_read_lock_bh();
> +
> -+ tuple = &flow->tuplehash[FLOW_OFFLOAD_DIR_ORIGINAL].tuple;
> -+ if (flow_offload_check_path(net, tuple, &src))
> ++ tuple_s = &flow->tuplehash[FLOW_OFFLOAD_DIR_ORIGINAL].tuple;
> ++ tuple_d = &flow->tuplehash[FLOW_OFFLOAD_DIR_REPLY].tuple;
> ++
> ++ if (flow_offload_check_path(net, tuple_s, tuple_d->dst_cache, &src))
> + goto out;
> +
> -+ tuple = &flow->tuplehash[FLOW_OFFLOAD_DIR_REPLY].tuple;
> -+ if (flow_offload_check_path(net, tuple, &dest))
> ++ if (flow_offload_check_path(net, tuple_d, tuple_s->dst_cache, &dest))
> + goto out;
> +
> + if (!src.dev->netdev_ops->ndo_flow_offload)
> @@ -270,7 +273,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
>
> flow_offload_queue_work(offload);
> }
> -@@ -119,14 +185,11 @@ static void flow_offload_hw_del(struct n
> +@@ -119,14 +188,11 @@ static void flow_offload_hw_del(struct n
> {
> struct flow_offload_hw *offload;
>
> @@ -286,7 +289,7 @@ Signed-off-by: Felix Fietkau <nbd at nbd.name>
>
> flow_offload_queue_work(offload);
> }
> -@@ -153,12 +216,8 @@ static void __exit nf_flow_table_hw_modu
> +@@ -153,12 +219,8 @@ static void __exit nf_flow_table_hw_modu
> nf_flow_table_hw_unregister(&flow_offload_hw);
> cancel_work_sync(&nf_flow_offload_hw_work);
>
>
_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel
More information about the openwrt-devel
mailing list