From: Xin Long <lucien.xin@gmail.com> Date: 2021-09-20 10:19:27
With the old ct and dst carried on these packets mirred or redirrected
to ingress, it may cause these packets to be dropped on rx path. This
issue could be easily triggered when using OVS HWOL on OVN-k8s. To fix
it this patchset is to drop ct and dst for these packets, just as it
does in internal_dev_recv() in OVS module.
Xin Long (2):
net: sched: drop ct for the packets toward ingress only in act_mirred
net: sched: also drop dst for the packets toward ingress in act_mirred
net/sched/act_mirred.c | 15 ++++++---------
1 file changed, 6 insertions(+), 9 deletions(-)
--
2.27.0
From: Xin Long <lucien.xin@gmail.com> Date: 2021-09-20 10:19:31
nf_reset_ct() called in tcf_mirred_act() is supposed to drop ct for
those packets that are mirred or redirected to only ingress, not
ingress and egress.
This patch is to move nf_reset_ct() to tcf_mirred_forward() and to
be called only when want_ingress is true.
Fixes: d09c548dbf3b ("net: sched: act_mirred: Reset ct info when mirror")
Signed-off-by: Xin Long <lucien.xin@gmail.com>
---
net/sched/act_mirred.c | 13 ++++---------
1 file changed, 4 insertions(+), 9 deletions(-)
From: Xin Long <lucien.xin@gmail.com> Date: 2021-09-20 10:19:33
Without dropping dst, the packets sent from local mirred/redirected
to ingress will may still use the old dst. ip_rcv() will drop it as
the old dst is for output and its .input is dst_discard.
This patch is to fix by also dropping dst for those packets that are
mirred or redirected to ingress in act_mirred.
Fixes: b57dc7c13ea9 ("net/sched: Introduce action ct")
Signed-off-by: Xin Long <lucien.xin@gmail.com>
---
net/sched/act_mirred.c | 2 ++
1 file changed, 2 insertions(+)
From: Cong Wang <hidden> Date: 2021-09-21 02:36:50
On Mon, Sep 20, 2021 at 7:12 AM Xin Long [off-list ref] wrote:
nf_reset_ct() called in tcf_mirred_act() is supposed to drop ct for
those packets that are mirred or redirected to only ingress, not
ingress and egress.
Any reason behind this? I think we at least need to reset it when
redirecting from ingress to egress as well? That is, when changing
directions?
Thanks.
From: Cong Wang <hidden> Date: 2021-09-21 02:36:59
On Mon, Sep 20, 2021 at 7:12 AM Xin Long [off-list ref] wrote:
Without dropping dst, the packets sent from local mirred/redirected
to ingress will may still use the old dst. ip_rcv() will drop it as
the old dst is for output and its .input is dst_discard.
This patch is to fix by also dropping dst for those packets that are
mirred or redirected to ingress in act_mirred.
Similar question: what about redirecting from ingress to egress?
BTW, please CC TC maintainers for TC patches.
Thanks.
From: Xin Long <lucien.xin@gmail.com> Date: 2021-09-21 07:02:06
On Tue, Sep 21, 2021 at 2:31 AM Cong Wang [off-list ref] wrote:
On Mon, Sep 20, 2021 at 7:12 AM Xin Long [off-list ref] wrote:
quoted
nf_reset_ct() called in tcf_mirred_act() is supposed to drop ct for
those packets that are mirred or redirected to only ingress, not
ingress and egress.
Any reason behind this? I think we at least need to reset it when
redirecting from ingress to egress as well? That is, when changing
directions?
For the reason why ct should be reset, it's said in
d09c548dbf3b ("net: sched: act_mirred: Reset ct info when mirror").
The user case is OVS HWOL using TC to do NAT and then redirecting
the NATed skb back to the ingress of one local dev, it's ingress only, this
patch is more like to minimize the side effect of d09c548dbf3b IF there is.
Not sure if it's too much to do for that from ingress to egress.
What I was thinking is this should happen on rx path(ingress), like it
does in internal_dev_recv() in the OVS kernel module. But IF there is
any user case needing doing this for ingress to egress, I would add it.
From: Xin Long <lucien.xin@gmail.com> Date: 2021-09-21 07:02:09
On Tue, Sep 21, 2021 at 2:34 AM Cong Wang [off-list ref] wrote:
On Mon, Sep 20, 2021 at 7:12 AM Xin Long [off-list ref] wrote:
quoted
Without dropping dst, the packets sent from local mirred/redirected
to ingress will may still use the old dst. ip_rcv() will drop it as
the old dst is for output and its .input is dst_discard.
This patch is to fix by also dropping dst for those packets that are
mirred or redirected to ingress in act_mirred.
Similar question: what about redirecting from ingress to egress?
We can do it IF there's any user case needing it.
But for now, The problem I've met occurred in ip_rcv() for the user case.
From: Cong Wang <hidden> Date: 2021-09-22 03:43:32
On Tue, Sep 21, 2021 at 12:02 AM Xin Long [off-list ref] wrote:
On Tue, Sep 21, 2021 at 2:31 AM Cong Wang [off-list ref] wrote:
quoted
On Mon, Sep 20, 2021 at 7:12 AM Xin Long [off-list ref] wrote:
quoted
nf_reset_ct() called in tcf_mirred_act() is supposed to drop ct for
those packets that are mirred or redirected to only ingress, not
ingress and egress.
Any reason behind this? I think we at least need to reset it when
redirecting from ingress to egress as well? That is, when changing
directions?
For the reason why ct should be reset, it's said in
d09c548dbf3b ("net: sched: act_mirred: Reset ct info when mirror").
The user case is OVS HWOL using TC to do NAT and then redirecting
the NATed skb back to the ingress of one local dev, it's ingress only, this
patch is more like to minimize the side effect of d09c548dbf3b IF there is.
What is the side effect here? Or what is wrong with resetting CT on
egress side?
Not sure if it's too much to do for that from ingress to egress.
What I was thinking is this should happen on rx path(ingress), like it
does in internal_dev_recv() in the OVS kernel module. But IF there is
any user case needing doing this for ingress to egress, I would add it.
If that is the case, then this patch is completely unnecessary. So
instead of going back and forth, please elaborate on why resetting
CT for egress is a problem here.
Thanks.
From: Cong Wang <hidden> Date: 2021-09-22 03:53:05
On Tue, Sep 21, 2021 at 12:02 AM Xin Long [off-list ref] wrote:
On Tue, Sep 21, 2021 at 2:34 AM Cong Wang [off-list ref] wrote:
quoted
On Mon, Sep 20, 2021 at 7:12 AM Xin Long [off-list ref] wrote:
quoted
Without dropping dst, the packets sent from local mirred/redirected
to ingress will may still use the old dst. ip_rcv() will drop it as
the old dst is for output and its .input is dst_discard.
This patch is to fix by also dropping dst for those packets that are
mirred or redirected to ingress in act_mirred.
Similar question: what about redirecting from ingress to egress?
We can do it IF there's any user case needing it.
But for now, The problem I've met occurred in ip_rcv() for the user case.
I think input route is different from output route, so essentially we need
a reset when changing the direction, but I don't see any bugs so far,
except this one.
Thanks.
From: Xin Long <lucien.xin@gmail.com> Date: 2021-09-22 05:17:19
On Wed, Sep 22, 2021 at 11:43 AM Cong Wang [off-list ref] wrote:
On Tue, Sep 21, 2021 at 12:02 AM Xin Long [off-list ref] wrote:
quoted
On Tue, Sep 21, 2021 at 2:31 AM Cong Wang [off-list ref] wrote:
quoted
On Mon, Sep 20, 2021 at 7:12 AM Xin Long [off-list ref] wrote:
quoted
nf_reset_ct() called in tcf_mirred_act() is supposed to drop ct for
those packets that are mirred or redirected to only ingress, not
ingress and egress.
Any reason behind this? I think we at least need to reset it when
redirecting from ingress to egress as well? That is, when changing
directions?
For the reason why ct should be reset, it's said in
d09c548dbf3b ("net: sched: act_mirred: Reset ct info when mirror").
The user case is OVS HWOL using TC to do NAT and then redirecting
the NATed skb back to the ingress of one local dev, it's ingress only, this
patch is more like to minimize the side effect of d09c548dbf3b IF there is.
What is the side effect here? Or what is wrong with resetting CT on
egress side?
quoted
Not sure if it's too much to do for that from ingress to egress.
What I was thinking is this should happen on rx path(ingress), like it
does in internal_dev_recv() in the OVS kernel module. But IF there is
any user case needing doing this for ingress to egress, I would add it.
If that is the case, then this patch is completely unnecessary. So
instead of going back and forth, please elaborate on why resetting
CT for egress is a problem here.
What I'm afraid is: after resetting CT for the packets redirected to egress,
the tc rules on the next dev egress that may need these CT will break.
I can't give a use case right now, and just don't want to introduce extra
change for which we don't see a use. If you think that's safe, I'm fine
to do these resets when the direction is changed.
From: Xin Long <lucien.xin@gmail.com> Date: 2021-09-22 05:29:55
On Wed, Sep 22, 2021 at 11:53 AM Cong Wang [off-list ref] wrote:
On Tue, Sep 21, 2021 at 12:02 AM Xin Long [off-list ref] wrote:
quoted
On Tue, Sep 21, 2021 at 2:34 AM Cong Wang [off-list ref] wrote:
quoted
On Mon, Sep 20, 2021 at 7:12 AM Xin Long [off-list ref] wrote:
quoted
Without dropping dst, the packets sent from local mirred/redirected
to ingress will may still use the old dst. ip_rcv() will drop it as
the old dst is for output and its .input is dst_discard.
This patch is to fix by also dropping dst for those packets that are
mirred or redirected to ingress in act_mirred.
Similar question: what about redirecting from ingress to egress?
We can do it IF there's any user case needing it.
But for now, The problem I've met occurred in ip_rcv() for the user case.
I think input route is different from output route, so essentially we need
a reset when changing the direction, but I don't see any bugs so far,
except this one.
Yes, this one seems more reasonable to do this reset when changing
the direction.
Maybe because in common env, it rarely redirects an egress pkt to ingress by TC.
OVS does flow control quite flexibly(complicatedly), when it offloads NAT to TC,
this problem starts showing up.
From: Jamal Hadi Salim <jhs@mojatatu.com> Date: 2021-09-23 16:06:42
+CC Shmulik.
Unfortunately we dont have good test cases in tdc to test different
scenarios of this setup (packets being redirected in both directions
once or several times).
cheers,
jamal
On 2021-09-21 11:52 p.m., Cong Wang wrote:
On Tue, Sep 21, 2021 at 12:02 AM Xin Long [off-list ref] wrote:
quoted
On Tue, Sep 21, 2021 at 2:34 AM Cong Wang [off-list ref] wrote:
quoted
On Mon, Sep 20, 2021 at 7:12 AM Xin Long [off-list ref] wrote:
quoted
Without dropping dst, the packets sent from local mirred/redirected
to ingress will may still use the old dst. ip_rcv() will drop it as
the old dst is for output and its .input is dst_discard.
This patch is to fix by also dropping dst for those packets that are
mirred or redirected to ingress in act_mirred.
Similar question: what about redirecting from ingress to egress?
We can do it IF there's any user case needing it.
But for now, The problem I've met occurred in ip_rcv() for the user case.
I think input route is different from output route, so essentially we need
a reset when changing the direction, but I don't see any bugs so far,
except this one.
Thanks.
On Wed, Sep 22, 2021 at 01:17:05PM +0800, Xin Long wrote:
On Wed, Sep 22, 2021 at 11:43 AM Cong Wang [off-list ref] wrote:
quoted
On Tue, Sep 21, 2021 at 12:02 AM Xin Long [off-list ref] wrote:
quoted
On Tue, Sep 21, 2021 at 2:31 AM Cong Wang [off-list ref] wrote:
quoted
On Mon, Sep 20, 2021 at 7:12 AM Xin Long [off-list ref] wrote:
quoted
nf_reset_ct() called in tcf_mirred_act() is supposed to drop ct for
those packets that are mirred or redirected to only ingress, not
ingress and egress.
Any reason behind this? I think we at least need to reset it when
redirecting from ingress to egress as well? That is, when changing
directions?
For the reason why ct should be reset, it's said in
d09c548dbf3b ("net: sched: act_mirred: Reset ct info when mirror").
The user case is OVS HWOL using TC to do NAT and then redirecting
the NATed skb back to the ingress of one local dev, it's ingress only, this
patch is more like to minimize the side effect of d09c548dbf3b IF there is.
What is the side effect here? Or what is wrong with resetting CT on
egress side?
quoted
Not sure if it's too much to do for that from ingress to egress.
What I was thinking is this should happen on rx path(ingress), like it
does in internal_dev_recv() in the OVS kernel module. But IF there is
any user case needing doing this for ingress to egress, I would add it.
If that is the case, then this patch is completely unnecessary. So
instead of going back and forth, please elaborate on why resetting
CT for egress is a problem here.
What I'm afraid is: after resetting CT for the packets redirected to egress,
the tc rules on the next dev egress that may need these CT will break.
This shouldn't happen. Well, it's not expected from OVS use case POV,
and that would probably be a nightmare to maintain (without something
like OVS), considering packets can be directed to egress from multiple
places and they would have different starting points then.
I can't give a use case right now, and just don't want to introduce extra
change for which we don't see a use. If you think that's safe, I'm fine
to do these resets when the direction is changed.