From: Jiri Pirko <jiri@resnulli.us>
To: Paolo Abeni <pabeni@redhat.com>
Cc: netdev@vger.kernel.org, Jamal Hadi Salim <jhs@mojatatu.com>,
Cong Wang <xiyou.wangcong@gmail.com>,
Daniel Borkmann <daniel@iogearbox.net>,
Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>,
Eyal Birger <eyal.birger@gmail.com>,
"David S. Miller" <davem@davemloft.net>
Subject: Re: [PATCH net-next v3 4/5] net/tc: introduce TC_ACT_REINJECT.
Date: Wed, 25 Jul 2018 14:57:38 +0200 [thread overview]
Message-ID: <20180725125738.GH2164@nanopsycho> (raw)
In-Reply-To: <3c20787be0fd5d64728ffed46ae0a7dff10d7e05.1532437050.git.pabeni@redhat.com>
Tue, Jul 24, 2018 at 10:06:42PM CEST, pabeni@redhat.com wrote:
>This is similar TC_ACT_REDIRECT, but with a slightly different
>semantic:
>- on ingress the mirred skbs are passed to the target device
>network stack without any additional check not scrubbing.
>- the rcu-protected stats provided via the tcf_result struct
> are updated on error conditions.
>
>This new tcfa_action value is not exposed to the user-space
>and can be used only internally by clsact.
>
>v1 -> v2: do not touch TC_ACT_REDIRECT code path, introduce
> a new action type instead
>
>v2 -> v3:
> - rename the new action value TC_ACT_REINJECT, update the
> helper accordingly
> - take care of uncloned reinjected packets in XDP generic
> hook
>
>Signed-off-by: Paolo Abeni <pabeni@redhat.com>
>---
> include/net/pkt_cls.h | 3 +++
> include/net/sch_generic.h | 19 +++++++++++++++++++
> net/core/dev.c | 6 +++++-
> 3 files changed, 27 insertions(+), 1 deletion(-)
>
>diff --git a/include/net/pkt_cls.h b/include/net/pkt_cls.h
>index 2081e4219f81..36ccfe2a303a 100644
>--- a/include/net/pkt_cls.h
>+++ b/include/net/pkt_cls.h
>@@ -7,6 +7,9 @@
> #include <net/sch_generic.h>
> #include <net/act_api.h>
>
>+/* TC action not accessible from user space */
>+#define TC_ACT_REINJECT (TC_ACT_VALUE_MAX + 1)
>+
> /* Basic packet classifier frontend definitions. */
>
> struct tcf_walker {
>diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h
>index 056dc1083aa3..95e81a70f549 100644
>--- a/include/net/sch_generic.h
>+++ b/include/net/sch_generic.h
>@@ -235,6 +235,12 @@ struct tcf_result {
> u32 classid;
> };
> const struct tcf_proto *goto_tp;
>+
>+ /* used by the TC_ACT_REINJECT action */
>+ struct {
>+ bool ingress;
>+ struct gnet_stats_queue *qstats;
>+ };
> };
> };
>
>@@ -1091,4 +1097,17 @@ void mini_qdisc_pair_swap(struct mini_Qdisc_pair *miniqp,
> void mini_qdisc_pair_init(struct mini_Qdisc_pair *miniqp, struct Qdisc *qdisc,
> struct mini_Qdisc __rcu **p_miniq);
>
>+static inline void skb_tc_reinject(struct sk_buff *skb, struct tcf_result *res)
>+{
>+ struct gnet_stats_queue *stats = res->qstats;
>+ int ret;
>+
>+ if (res->ingress)
>+ ret = netif_receive_skb(skb);
>+ else
>+ ret = dev_queue_xmit(skb);
Hmm. "reinject" by the name tells me that the packet should be injected
again. By "inject", I understand beginning of the rx path. However, this
does xmit as well :/ It is a bit misleading. Maybe "reinsert" would
sound better?
>+ if (ret && stats)
>+ qstats_overlimit_inc(res->qstats);
>+}
>+
> #endif
>diff --git a/net/core/dev.c b/net/core/dev.c
>index 14a748ee8cc9..826ec74fe1d9 100644
>--- a/net/core/dev.c
>+++ b/net/core/dev.c
>@@ -4252,7 +4252,7 @@ static u32 netif_receive_generic_xdp(struct sk_buff *skb,
> /* Reinjected packets coming from act_mirred or similar should
> * not get XDP generic processing.
> */
>- if (skb_cloned(skb))
>+ if (skb_cloned(skb) || skb->tc_redirected)
> return XDP_PASS;
>
> /* XDP packets must be linear and must have sufficient headroom
>@@ -4602,6 +4602,10 @@ sch_handle_ingress(struct sk_buff *skb, struct packet_type **pt_prev, int *ret,
> __skb_push(skb, skb->mac_len);
> skb_do_redirect(skb);
> return NULL;
>+ case TC_ACT_REINJECT:
>+ /* this does not scrub the packet, and updates stats on error */
>+ skb_tc_reinject(skb, &cl_res);
>+ return NULL;
> default:
> break;
> }
>--
>2.17.1
>
next prev parent reply other threads:[~2018-07-25 14:11 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-07-24 20:06 [PATCH net-next v3 0/5] TC: refactor act_mirred packets re-injection Paolo Abeni
2018-07-24 20:06 ` [PATCH net-next v3 1/5] tc/act: user space can't use TC_ACT_REDIRECT directly Paolo Abeni
2018-07-25 11:55 ` Jamal Hadi Salim
2018-07-25 11:56 ` Jiri Pirko
2018-07-25 12:54 ` Paolo Abeni
2018-07-25 13:03 ` Jiri Pirko
2018-07-25 15:48 ` Paolo Abeni
2018-07-25 16:29 ` Paolo Abeni
2018-07-25 16:29 ` Daniel Borkmann
2018-07-26 7:43 ` Jiri Pirko
2018-07-27 2:48 ` Daniel Borkmann
2018-07-24 20:06 ` [PATCH net-next v3 2/5] net/sched: user-space can't set unknown tcfa_action values Paolo Abeni
2018-07-25 12:26 ` Jiri Pirko
2018-07-24 20:06 ` [PATCH net-next v3 3/5] tc/act: remove unneeded RCU lock in action callback Paolo Abeni
2018-07-25 11:59 ` Jamal Hadi Salim
2018-07-25 18:24 ` Marcelo Ricardo Leitner
2018-07-25 12:32 ` Jiri Pirko
2018-07-24 20:06 ` [PATCH net-next v3 4/5] net/tc: introduce TC_ACT_REINJECT Paolo Abeni
2018-07-24 20:38 ` Cong Wang
2018-07-24 20:50 ` Cong Wang
2018-07-25 8:29 ` Paolo Abeni
2018-07-25 12:27 ` Jamal Hadi Salim
2018-07-25 14:24 ` Paolo Abeni
2018-07-25 15:26 ` Jamal Hadi Salim
2018-07-25 16:48 ` Cong Wang
2018-07-25 17:09 ` Marcelo Ricardo Leitner
2018-07-26 12:52 ` Jamal Hadi Salim
2018-07-26 23:25 ` Cong Wang
2018-07-25 12:16 ` Jamal Hadi Salim
2018-07-25 12:59 ` Jiri Pirko
2018-07-25 13:55 ` Paolo Abeni
2018-07-25 12:57 ` Jiri Pirko [this message]
2018-07-24 20:06 ` [PATCH net-next v3 5/5] act_mirred: use TC_ACT_REINJECT when possible Paolo Abeni
2018-07-24 21:15 ` Cong Wang
2018-07-25 10:14 ` Paolo Abeni
2018-07-25 13:30 ` Jiri Pirko
2018-07-25 11:50 ` Jamal Hadi Salim
2018-07-25 13:52 ` Jiri Pirko
2018-07-25 14:04 ` Paolo Abeni
2018-07-25 14:30 ` Jiri Pirko
2018-07-25 11:53 ` [PATCH net-next v3 0/5] TC: refactor act_mirred packets re-injection Jiri Pirko
2018-07-25 12:07 ` Paolo Abeni
2018-07-25 12:17 ` Jiri Pirko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180725125738.GH2164@nanopsycho \
--to=jiri@resnulli.us \
--cc=daniel@iogearbox.net \
--cc=davem@davemloft.net \
--cc=eyal.birger@gmail.com \
--cc=jhs@mojatatu.com \
--cc=marcelo.leitner@gmail.com \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=xiyou.wangcong@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.