* [net-next v3 0/7] openvswitch: add drop reasons
@ 2023-08-07 16:45 Adrian Moreno
2023-08-07 16:45 ` [net-next v3 1/7] net: openvswitch: add datapath flow drop reason Adrian Moreno
` (6 more replies)
0 siblings, 7 replies; 22+ messages in thread
From: Adrian Moreno @ 2023-08-07 16:45 UTC (permalink / raw)
To: netdev; +Cc: Adrian Moreno, aconole, i.maximets, eric, dev
There is currently a gap in drop visibility in the openvswitch module.
This series tries to improve this by adding a new drop reason subsystem
for OVS.
Apart from adding a new drop reasson subsystem and some common drop
reasons, this series takes Eric's preliminary work [1] on adding an
explicit drop action and integrates it into the same subsystem.
A limitation of this series is that it does not report upcall errors.
The reason is that there could be many sources of upcall drops and the
most common one, which is the netlink buffer overflow, cannot be
reported via kfree_skb() because the skb is freed in the netlink layer
(see [2]). Therefore, using a reason for the rare events and not the
common one would be even more misleading. I'd propose we add (in a
follow up patch) a tracepoint to better report upcall errors.
[1] https://lore.kernel.org/netdev/202306300609.tdRdZscy-lkp@intel.com/T/
[2] commit 1100248a5c5c ("openvswitch: Fix double reporting of drops in dropwatch")
---
rfc2 -> v3:
- Rebased on top of latest net-next
rfc1 -> rfc2:
- Fail when an explicit drop is not the last
- Added a drop reason for action errors
- Added braces around macros
- Dropped patch that added support for masks in ovs-dpctl.py as it's now
included in Aaron's series [2].
Adrian Moreno (6):
net: openvswitch: add datapath flow drop reason
net: openvswitch: add action error drop reason
net: openvswitch: add meter drop reason
net: openvswitch: add misc error drop reasons
selftests: openvswitch: add drop reason testcase
selftests: openvswitch: add explicit drop testcase
Eric Garver (1):
net: openvswitch: add explicit drop action
include/net/dropreason.h | 6 ++
include/uapi/linux/openvswitch.h | 2 +
net/openvswitch/actions.c | 42 ++++++---
net/openvswitch/conntrack.c | 3 +-
net/openvswitch/datapath.c | 16 ++++
net/openvswitch/drop.h | 34 +++++++
net/openvswitch/flow_netlink.c | 10 +-
.../selftests/net/openvswitch/openvswitch.sh | 92 ++++++++++++++++++-
.../selftests/net/openvswitch/ovs-dpctl.py | 22 ++++-
9 files changed, 209 insertions(+), 18 deletions(-)
create mode 100644 net/openvswitch/drop.h
--
2.41.0
^ permalink raw reply [flat|nested] 22+ messages in thread
* [net-next v3 1/7] net: openvswitch: add datapath flow drop reason
2023-08-07 16:45 [net-next v3 0/7] openvswitch: add drop reasons Adrian Moreno
@ 2023-08-07 16:45 ` Adrian Moreno
2023-08-08 14:36 ` Aaron Conole
2023-08-08 18:02 ` Ilya Maximets
2023-08-07 16:45 ` [net-next v3 2/7] net: openvswitch: add action error " Adrian Moreno
` (5 subsequent siblings)
6 siblings, 2 replies; 22+ messages in thread
From: Adrian Moreno @ 2023-08-07 16:45 UTC (permalink / raw)
To: netdev; +Cc: Adrian Moreno, aconole, i.maximets, eric, dev
Create a new drop reason subsystem for openvswitch and add the first
drop reason to represent flow drops.
A flow drop happens when a flow has an empty action-set or there is no
action that consumes the packet (output, userspace, recirc, etc).
Implementation-wise, most of these skb-consuming actions already call
"consume_skb" internally and return directly from within the
do_execute_actions() loop so with minimal changes we can assume that
any skb that exits the loop normally is a packet drop.
Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
---
include/net/dropreason.h | 6 ++++++
net/openvswitch/actions.c | 12 ++++++++++--
net/openvswitch/datapath.c | 16 ++++++++++++++++
net/openvswitch/drop.h | 24 ++++++++++++++++++++++++
4 files changed, 56 insertions(+), 2 deletions(-)
create mode 100644 net/openvswitch/drop.h
diff --git a/include/net/dropreason.h b/include/net/dropreason.h
index 685fb37df8e8..56cb7be92244 100644
--- a/include/net/dropreason.h
+++ b/include/net/dropreason.h
@@ -23,6 +23,12 @@ enum skb_drop_reason_subsys {
*/
SKB_DROP_REASON_SUBSYS_MAC80211_MONITOR,
+ /**
+ * @SKB_DROP_REASON_SUBSYS_OPENVSWITCH: openvswitch drop reasons,
+ * see net/openvswitch/drop.h
+ */
+ SKB_DROP_REASON_SUBSYS_OPENVSWITCH,
+
/** @SKB_DROP_REASON_SUBSYS_NUM: number of subsystems defined */
SKB_DROP_REASON_SUBSYS_NUM
};
diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c
index cab1e02b63e0..af676dcac2b4 100644
--- a/net/openvswitch/actions.c
+++ b/net/openvswitch/actions.c
@@ -27,6 +27,7 @@
#include <net/sctp/checksum.h>
#include "datapath.h"
+#include "drop.h"
#include "flow.h"
#include "conntrack.h"
#include "vport.h"
@@ -1036,7 +1037,7 @@ static int sample(struct datapath *dp, struct sk_buff *skb,
if ((arg->probability != U32_MAX) &&
(!arg->probability || get_random_u32() > arg->probability)) {
if (last)
- consume_skb(skb);
+ kfree_skb_reason(skb, OVS_DROP_FLOW);
return 0;
}
@@ -1297,6 +1298,9 @@ static int do_execute_actions(struct datapath *dp, struct sk_buff *skb,
if (trace_ovs_do_execute_action_enabled())
trace_ovs_do_execute_action(dp, skb, key, a, rem);
+ /* Actions that rightfully have to consume the skb should do it
+ * and return directly.
+ */
switch (nla_type(a)) {
case OVS_ACTION_ATTR_OUTPUT: {
int port = nla_get_u32(a);
@@ -1332,6 +1336,10 @@ static int do_execute_actions(struct datapath *dp, struct sk_buff *skb,
output_userspace(dp, skb, key, a, attr,
len, OVS_CB(skb)->cutlen);
OVS_CB(skb)->cutlen = 0;
+ if (nla_is_last(a, rem)) {
+ consume_skb(skb);
+ return 0;
+ }
break;
case OVS_ACTION_ATTR_HASH:
@@ -1485,7 +1493,7 @@ static int do_execute_actions(struct datapath *dp, struct sk_buff *skb,
}
}
- consume_skb(skb);
+ kfree_skb_reason(skb, OVS_DROP_FLOW);
return 0;
}
diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c
index a6d2a0b1aa21..d33cb739883f 100644
--- a/net/openvswitch/datapath.c
+++ b/net/openvswitch/datapath.c
@@ -41,6 +41,7 @@
#include <net/pkt_cls.h>
#include "datapath.h"
+#include "drop.h"
#include "flow.h"
#include "flow_table.h"
#include "flow_netlink.h"
@@ -2702,6 +2703,17 @@ static struct pernet_operations ovs_net_ops = {
.size = sizeof(struct ovs_net),
};
+static const char * const ovs_drop_reasons[] = {
+#define S(x) (#x),
+ OVS_DROP_REASONS(S)
+#undef S
+};
+
+static struct drop_reason_list drop_reason_list_ovs = {
+ .reasons = ovs_drop_reasons,
+ .n_reasons = ARRAY_SIZE(ovs_drop_reasons),
+};
+
static int __init dp_init(void)
{
int err;
@@ -2743,6 +2755,9 @@ static int __init dp_init(void)
if (err < 0)
goto error_unreg_netdev;
+ drop_reasons_register_subsys(SKB_DROP_REASON_SUBSYS_OPENVSWITCH,
+ &drop_reason_list_ovs);
+
return 0;
error_unreg_netdev:
@@ -2769,6 +2784,7 @@ static void dp_cleanup(void)
ovs_netdev_exit();
unregister_netdevice_notifier(&ovs_dp_device_notifier);
unregister_pernet_device(&ovs_net_ops);
+ drop_reasons_unregister_subsys(SKB_DROP_REASON_SUBSYS_OPENVSWITCH);
rcu_barrier();
ovs_vport_exit();
ovs_flow_exit();
diff --git a/net/openvswitch/drop.h b/net/openvswitch/drop.h
new file mode 100644
index 000000000000..cdd10629c6be
--- /dev/null
+++ b/net/openvswitch/drop.h
@@ -0,0 +1,24 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * OpenvSwitch drop reason list.
+ */
+
+#ifndef OPENVSWITCH_DROP_H
+#define OPENVSWITCH_DROP_H
+#include <net/dropreason.h>
+
+#define OVS_DROP_REASONS(R) \
+ R(OVS_DROP_FLOW) \
+ /* deliberate comment for trailing \ */
+
+enum ovs_drop_reason {
+ __OVS_DROP_REASON = SKB_DROP_REASON_SUBSYS_OPENVSWITCH <<
+ SKB_DROP_REASON_SUBSYS_SHIFT,
+#define ENUM(x) x,
+ OVS_DROP_REASONS(ENUM)
+#undef ENUM
+
+ OVS_DROP_MAX,
+};
+
+#endif /* OPENVSWITCH_DROP_H */
--
2.41.0
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [net-next v3 2/7] net: openvswitch: add action error drop reason
2023-08-07 16:45 [net-next v3 0/7] openvswitch: add drop reasons Adrian Moreno
2023-08-07 16:45 ` [net-next v3 1/7] net: openvswitch: add datapath flow drop reason Adrian Moreno
@ 2023-08-07 16:45 ` Adrian Moreno
2023-08-08 14:37 ` Aaron Conole
2023-08-07 16:45 ` [net-next v3 3/7] net: openvswitch: add explicit drop action Adrian Moreno
` (4 subsequent siblings)
6 siblings, 1 reply; 22+ messages in thread
From: Adrian Moreno @ 2023-08-07 16:45 UTC (permalink / raw)
To: netdev; +Cc: Adrian Moreno, aconole, i.maximets, eric, dev
Add a drop reason for packets that are dropped because an action
returns a non-zero error code.
Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
---
net/openvswitch/actions.c | 2 +-
net/openvswitch/drop.h | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c
index af676dcac2b4..9b66a3334aaa 100644
--- a/net/openvswitch/actions.c
+++ b/net/openvswitch/actions.c
@@ -1488,7 +1488,7 @@ static int do_execute_actions(struct datapath *dp, struct sk_buff *skb,
}
if (unlikely(err)) {
- kfree_skb(skb);
+ kfree_skb_reason(skb, OVS_DROP_ACTION_ERROR);
return err;
}
}
diff --git a/net/openvswitch/drop.h b/net/openvswitch/drop.h
index cdd10629c6be..3cd6489a5a2b 100644
--- a/net/openvswitch/drop.h
+++ b/net/openvswitch/drop.h
@@ -9,6 +9,7 @@
#define OVS_DROP_REASONS(R) \
R(OVS_DROP_FLOW) \
+ R(OVS_DROP_ACTION_ERROR) \
/* deliberate comment for trailing \ */
enum ovs_drop_reason {
--
2.41.0
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [net-next v3 3/7] net: openvswitch: add explicit drop action
2023-08-07 16:45 [net-next v3 0/7] openvswitch: add drop reasons Adrian Moreno
2023-08-07 16:45 ` [net-next v3 1/7] net: openvswitch: add datapath flow drop reason Adrian Moreno
2023-08-07 16:45 ` [net-next v3 2/7] net: openvswitch: add action error " Adrian Moreno
@ 2023-08-07 16:45 ` Adrian Moreno
2023-08-08 14:53 ` Aaron Conole
2023-08-08 18:10 ` Ilya Maximets
2023-08-07 16:45 ` [net-next v3 4/7] net: openvswitch: add meter drop reason Adrian Moreno
` (3 subsequent siblings)
6 siblings, 2 replies; 22+ messages in thread
From: Adrian Moreno @ 2023-08-07 16:45 UTC (permalink / raw)
To: netdev; +Cc: Eric Garver, aconole, i.maximets, dev, Adrian Moreno
From: Eric Garver <eric@garver.life>
From: Eric Garver <eric@garver.life>
This adds an explicit drop action. This is used by OVS to drop packets
for which it cannot determine what to do. An explicit action in the
kernel allows passing the reason _why_ the packet is being dropped or
zero to indicate no particular error happened (i.e: OVS intentionally
dropped the packet).
Since the error codes coming from userspace mean nothing for the kernel,
we squash all of them into only two drop reasons:
- OVS_DROP_EXPLICIT_ACTION_ERROR to indicate a non-zero value was passed
- OVS_DROP_EXPLICIT_ACTION to indicate a zero value was passed (no
error)
e.g. trace all OVS dropped skbs
# perf trace -e skb:kfree_skb --filter="reason >= 0x30000"
[..]
106.023 ping/2465 skb:kfree_skb(skbaddr: 0xffffa0e8765f2000, \
location:0xffffffffc0d9b462, protocol: 2048, reason: 196611)
reason: 196611 --> 0x30003 (OVS_DROP_EXPLICIT_ACTION)
Signed-off-by: Eric Garver <eric@garver.life>
Co-developed-by: Adrian Moreno <amorenoz@redhat.com>
Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
---
include/uapi/linux/openvswitch.h | 2 ++
net/openvswitch/actions.c | 9 +++++++++
net/openvswitch/drop.h | 2 ++
net/openvswitch/flow_netlink.c | 10 +++++++++-
tools/testing/selftests/net/openvswitch/ovs-dpctl.py | 3 +++
5 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/include/uapi/linux/openvswitch.h b/include/uapi/linux/openvswitch.h
index e94870e77ee9..efc82c318fa2 100644
--- a/include/uapi/linux/openvswitch.h
+++ b/include/uapi/linux/openvswitch.h
@@ -965,6 +965,7 @@ struct check_pkt_len_arg {
* start of the packet or at the start of the l3 header depending on the value
* of l3 tunnel flag in the tun_flags field of OVS_ACTION_ATTR_ADD_MPLS
* argument.
+ * @OVS_ACTION_ATTR_DROP: Explicit drop action.
*
* Only a single header can be set with a single %OVS_ACTION_ATTR_SET. Not all
* fields within a header are modifiable, e.g. the IPv4 protocol and fragment
@@ -1002,6 +1003,7 @@ enum ovs_action_attr {
OVS_ACTION_ATTR_CHECK_PKT_LEN, /* Nested OVS_CHECK_PKT_LEN_ATTR_*. */
OVS_ACTION_ATTR_ADD_MPLS, /* struct ovs_action_add_mpls. */
OVS_ACTION_ATTR_DEC_TTL, /* Nested OVS_DEC_TTL_ATTR_*. */
+ OVS_ACTION_ATTR_DROP, /* u32 error code. */
__OVS_ACTION_ATTR_MAX, /* Nothing past this will be accepted
* from userspace. */
diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c
index 9b66a3334aaa..285b1243b94f 100644
--- a/net/openvswitch/actions.c
+++ b/net/openvswitch/actions.c
@@ -1485,6 +1485,15 @@ static int do_execute_actions(struct datapath *dp, struct sk_buff *skb,
return dec_ttl_exception_handler(dp, skb,
key, a);
break;
+
+ case OVS_ACTION_ATTR_DROP: {
+ enum ovs_drop_reason reason = nla_get_u32(a)
+ ? OVS_DROP_EXPLICIT_ACTION_ERROR
+ : OVS_DROP_EXPLICIT_ACTION;
+
+ kfree_skb_reason(skb, reason);
+ return 0;
+ }
}
if (unlikely(err)) {
diff --git a/net/openvswitch/drop.h b/net/openvswitch/drop.h
index 3cd6489a5a2b..be51ff5039fb 100644
--- a/net/openvswitch/drop.h
+++ b/net/openvswitch/drop.h
@@ -10,6 +10,8 @@
#define OVS_DROP_REASONS(R) \
R(OVS_DROP_FLOW) \
R(OVS_DROP_ACTION_ERROR) \
+ R(OVS_DROP_EXPLICIT_ACTION) \
+ R(OVS_DROP_EXPLICIT_ACTION_ERROR) \
/* deliberate comment for trailing \ */
enum ovs_drop_reason {
diff --git a/net/openvswitch/flow_netlink.c b/net/openvswitch/flow_netlink.c
index 41116361433d..88965e2068ac 100644
--- a/net/openvswitch/flow_netlink.c
+++ b/net/openvswitch/flow_netlink.c
@@ -38,6 +38,7 @@
#include <net/tun_proto.h>
#include <net/erspan.h>
+#include "drop.h"
#include "flow_netlink.h"
struct ovs_len_tbl {
@@ -61,6 +62,7 @@ static bool actions_may_change_flow(const struct nlattr *actions)
case OVS_ACTION_ATTR_RECIRC:
case OVS_ACTION_ATTR_TRUNC:
case OVS_ACTION_ATTR_USERSPACE:
+ case OVS_ACTION_ATTR_DROP:
break;
case OVS_ACTION_ATTR_CT:
@@ -2394,7 +2396,7 @@ static void ovs_nla_free_nested_actions(const struct nlattr *actions, int len)
/* Whenever new actions are added, the need to update this
* function should be considered.
*/
- BUILD_BUG_ON(OVS_ACTION_ATTR_MAX != 23);
+ BUILD_BUG_ON(OVS_ACTION_ATTR_MAX != 24);
if (!actions)
return;
@@ -3182,6 +3184,7 @@ static int __ovs_nla_copy_actions(struct net *net, const struct nlattr *attr,
[OVS_ACTION_ATTR_CHECK_PKT_LEN] = (u32)-1,
[OVS_ACTION_ATTR_ADD_MPLS] = sizeof(struct ovs_action_add_mpls),
[OVS_ACTION_ATTR_DEC_TTL] = (u32)-1,
+ [OVS_ACTION_ATTR_DROP] = sizeof(u32),
};
const struct ovs_action_push_vlan *vlan;
int type = nla_type(a);
@@ -3453,6 +3456,11 @@ static int __ovs_nla_copy_actions(struct net *net, const struct nlattr *attr,
skip_copy = true;
break;
+ case OVS_ACTION_ATTR_DROP:
+ if (!nla_is_last(a, rem))
+ return -EINVAL;
+ break;
+
default:
OVS_NLERR(log, "Unknown Action type %d", type);
return -EINVAL;
diff --git a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py b/tools/testing/selftests/net/openvswitch/ovs-dpctl.py
index fbdac15e3134..5fee330050c2 100644
--- a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py
+++ b/tools/testing/selftests/net/openvswitch/ovs-dpctl.py
@@ -301,6 +301,7 @@ class ovsactions(nla):
("OVS_ACTION_ATTR_CHECK_PKT_LEN", "none"),
("OVS_ACTION_ATTR_ADD_MPLS", "none"),
("OVS_ACTION_ATTR_DEC_TTL", "none"),
+ ("OVS_ACTION_ATTR_DROP", "uint32"),
)
class ctact(nla):
@@ -447,6 +448,8 @@ class ovsactions(nla):
print_str += "recirc(0x%x)" % int(self.get_attr(field[0]))
elif field[0] == "OVS_ACTION_ATTR_TRUNC":
print_str += "trunc(%d)" % int(self.get_attr(field[0]))
+ elif field[0] == "OVS_ACTION_ATTR_DROP":
+ print_str += "drop"
elif field[1] == "flag":
if field[0] == "OVS_ACTION_ATTR_CT_CLEAR":
print_str += "ct_clear"
--
2.41.0
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [net-next v3 4/7] net: openvswitch: add meter drop reason
2023-08-07 16:45 [net-next v3 0/7] openvswitch: add drop reasons Adrian Moreno
` (2 preceding siblings ...)
2023-08-07 16:45 ` [net-next v3 3/7] net: openvswitch: add explicit drop action Adrian Moreno
@ 2023-08-07 16:45 ` Adrian Moreno
2023-08-08 14:53 ` Aaron Conole
2023-08-07 16:45 ` [net-next v3 5/7] net: openvswitch: add misc error drop reasons Adrian Moreno
` (2 subsequent siblings)
6 siblings, 1 reply; 22+ messages in thread
From: Adrian Moreno @ 2023-08-07 16:45 UTC (permalink / raw)
To: netdev; +Cc: Adrian Moreno, aconole, i.maximets, eric, dev
By using an independent drop reason it makes it easy to ditinguish
between QoS-triggered or flow-triggered drop.
Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
---
net/openvswitch/actions.c | 2 +-
net/openvswitch/drop.h | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c
index 285b1243b94f..e204c7eee8ef 100644
--- a/net/openvswitch/actions.c
+++ b/net/openvswitch/actions.c
@@ -1454,7 +1454,7 @@ static int do_execute_actions(struct datapath *dp, struct sk_buff *skb,
case OVS_ACTION_ATTR_METER:
if (ovs_meter_execute(dp, skb, key, nla_get_u32(a))) {
- consume_skb(skb);
+ kfree_skb_reason(skb, OVS_DROP_METER);
return 0;
}
break;
diff --git a/net/openvswitch/drop.h b/net/openvswitch/drop.h
index be51ff5039fb..1ba866c408e5 100644
--- a/net/openvswitch/drop.h
+++ b/net/openvswitch/drop.h
@@ -12,6 +12,7 @@
R(OVS_DROP_ACTION_ERROR) \
R(OVS_DROP_EXPLICIT_ACTION) \
R(OVS_DROP_EXPLICIT_ACTION_ERROR) \
+ R(OVS_DROP_METER) \
/* deliberate comment for trailing \ */
enum ovs_drop_reason {
--
2.41.0
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [net-next v3 5/7] net: openvswitch: add misc error drop reasons
2023-08-07 16:45 [net-next v3 0/7] openvswitch: add drop reasons Adrian Moreno
` (3 preceding siblings ...)
2023-08-07 16:45 ` [net-next v3 4/7] net: openvswitch: add meter drop reason Adrian Moreno
@ 2023-08-07 16:45 ` Adrian Moreno
2023-08-08 14:56 ` Aaron Conole
2023-08-07 16:45 ` [net-next v3 6/7] selftests: openvswitch: add drop reason testcase Adrian Moreno
2023-08-07 16:45 ` [net-next v3 7/7] selftests: openvswitch: add explicit drop testcase Adrian Moreno
6 siblings, 1 reply; 22+ messages in thread
From: Adrian Moreno @ 2023-08-07 16:45 UTC (permalink / raw)
To: netdev; +Cc: Adrian Moreno, aconole, i.maximets, eric, dev
Use drop reasons from include/net/dropreason-core.h when a reasonable
candidate exists.
Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
---
net/openvswitch/actions.c | 17 ++++++++++-------
net/openvswitch/conntrack.c | 3 ++-
net/openvswitch/drop.h | 6 ++++++
3 files changed, 18 insertions(+), 8 deletions(-)
diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c
index e204c7eee8ef..5d9c31f46693 100644
--- a/net/openvswitch/actions.c
+++ b/net/openvswitch/actions.c
@@ -782,7 +782,7 @@ static int ovs_vport_output(struct net *net, struct sock *sk,
struct vport *vport = data->vport;
if (skb_cow_head(skb, data->l2_len) < 0) {
- kfree_skb(skb);
+ kfree_skb_reason(skb, SKB_DROP_REASON_NOMEM);
return -ENOMEM;
}
@@ -853,6 +853,7 @@ static void ovs_fragment(struct net *net, struct vport *vport,
struct sk_buff *skb, u16 mru,
struct sw_flow_key *key)
{
+ enum ovs_drop_reason reason;
u16 orig_network_offset = 0;
if (eth_p_mpls(skb->protocol)) {
@@ -862,6 +863,7 @@ static void ovs_fragment(struct net *net, struct vport *vport,
if (skb_network_offset(skb) > MAX_L2_LEN) {
OVS_NLERR(1, "L2 header too long to fragment");
+ reason = OVS_DROP_FRAG_L2_TOO_LONG;
goto err;
}
@@ -902,12 +904,13 @@ static void ovs_fragment(struct net *net, struct vport *vport,
WARN_ONCE(1, "Failed fragment ->%s: eth=%04x, MRU=%d, MTU=%d.",
ovs_vport_name(vport), ntohs(key->eth.type), mru,
vport->dev->mtu);
+ reason = OVS_DROP_FRAG_INVALID_PROTO;
goto err;
}
return;
err:
- kfree_skb(skb);
+ kfree_skb_reason(skb, reason);
}
static void do_output(struct datapath *dp, struct sk_buff *skb, int out_port,
@@ -934,10 +937,10 @@ static void do_output(struct datapath *dp, struct sk_buff *skb, int out_port,
ovs_fragment(net, vport, skb, mru, key);
} else {
- kfree_skb(skb);
+ kfree_skb_reason(skb, SKB_DROP_REASON_PKT_TOO_BIG);
}
} else {
- kfree_skb(skb);
+ kfree_skb_reason(skb, SKB_DROP_REASON_DEV_READY);
}
}
@@ -1011,7 +1014,7 @@ static int dec_ttl_exception_handler(struct datapath *dp, struct sk_buff *skb,
return clone_execute(dp, skb, key, 0, nla_data(actions),
nla_len(actions), true, false);
- consume_skb(skb);
+ kfree_skb_reason(skb, OVS_DROP_IP_TTL);
return 0;
}
@@ -1564,7 +1567,7 @@ static int clone_execute(struct datapath *dp, struct sk_buff *skb,
/* Out of per CPU action FIFO space. Drop the 'skb' and
* log an error.
*/
- kfree_skb(skb);
+ kfree_skb_reason(skb, OVS_DROP_DEFERRED_LIMIT);
if (net_ratelimit()) {
if (actions) { /* Sample action */
@@ -1616,7 +1619,7 @@ int ovs_execute_actions(struct datapath *dp, struct sk_buff *skb,
if (unlikely(level > OVS_RECURSION_LIMIT)) {
net_crit_ratelimited("ovs: recursion limit reached on datapath %s, probable configuration error\n",
ovs_dp_name(dp));
- kfree_skb(skb);
+ kfree_skb_reason(skb, OVS_DROP_RECURSION_LIMIT);
err = -ENETDOWN;
goto out;
}
diff --git a/net/openvswitch/conntrack.c b/net/openvswitch/conntrack.c
index fa955e892210..b03ebd4a8fae 100644
--- a/net/openvswitch/conntrack.c
+++ b/net/openvswitch/conntrack.c
@@ -29,6 +29,7 @@
#include <net/netfilter/nf_conntrack_act_ct.h>
#include "datapath.h"
+#include "drop.h"
#include "conntrack.h"
#include "flow.h"
#include "flow_netlink.h"
@@ -1035,7 +1036,7 @@ int ovs_ct_execute(struct net *net, struct sk_buff *skb,
skb_push_rcsum(skb, nh_ofs);
if (err)
- kfree_skb(skb);
+ kfree_skb_reason(skb, OVS_DROP_CONNTRACK);
return err;
}
diff --git a/net/openvswitch/drop.h b/net/openvswitch/drop.h
index 1ba866c408e5..e5a03cdec4e1 100644
--- a/net/openvswitch/drop.h
+++ b/net/openvswitch/drop.h
@@ -13,6 +13,12 @@
R(OVS_DROP_EXPLICIT_ACTION) \
R(OVS_DROP_EXPLICIT_ACTION_ERROR) \
R(OVS_DROP_METER) \
+ R(OVS_DROP_RECURSION_LIMIT) \
+ R(OVS_DROP_DEFERRED_LIMIT) \
+ R(OVS_DROP_FRAG_L2_TOO_LONG) \
+ R(OVS_DROP_FRAG_INVALID_PROTO) \
+ R(OVS_DROP_CONNTRACK) \
+ R(OVS_DROP_IP_TTL) \
/* deliberate comment for trailing \ */
enum ovs_drop_reason {
--
2.41.0
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [net-next v3 6/7] selftests: openvswitch: add drop reason testcase
2023-08-07 16:45 [net-next v3 0/7] openvswitch: add drop reasons Adrian Moreno
` (4 preceding siblings ...)
2023-08-07 16:45 ` [net-next v3 5/7] net: openvswitch: add misc error drop reasons Adrian Moreno
@ 2023-08-07 16:45 ` Adrian Moreno
2023-08-08 15:04 ` Aaron Conole
2023-08-07 16:45 ` [net-next v3 7/7] selftests: openvswitch: add explicit drop testcase Adrian Moreno
6 siblings, 1 reply; 22+ messages in thread
From: Adrian Moreno @ 2023-08-07 16:45 UTC (permalink / raw)
To: netdev; +Cc: Adrian Moreno, aconole, i.maximets, eric, dev
Test if the correct drop reason is reported when OVS drops a packet due
to an explicit flow.
Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
---
.../selftests/net/openvswitch/openvswitch.sh | 67 ++++++++++++++++++-
1 file changed, 66 insertions(+), 1 deletion(-)
diff --git a/tools/testing/selftests/net/openvswitch/openvswitch.sh b/tools/testing/selftests/net/openvswitch/openvswitch.sh
index dced4f612a78..a10c345f40ef 100755
--- a/tools/testing/selftests/net/openvswitch/openvswitch.sh
+++ b/tools/testing/selftests/net/openvswitch/openvswitch.sh
@@ -16,7 +16,8 @@ tests="
connect_v4 ip4-xon: Basic ipv4 ping between two NS
nat_connect_v4 ip4-nat-xon: Basic ipv4 tcp connection via NAT
netlink_checks ovsnl: validate netlink attrs and settings
- upcall_interfaces ovs: test the upcall interfaces"
+ upcall_interfaces ovs: test the upcall interfaces
+ drop_reason drop: test drop reasons are emitted"
info() {
[ $VERBOSE = 0 ] || echo $*
@@ -141,6 +142,25 @@ ovs_add_flow () {
return 0
}
+ovs_drop_record_and_run () {
+ local sbx=$1
+ shift
+
+ perf record -a -q -e skb:kfree_skb -o ${ovs_dir}/perf.data $* \
+ >> ${ovs_dir}/stdout 2>> ${ovs_dir}/stderr
+ return $?
+}
+
+ovs_drop_reason_count()
+{
+ local reason=$1
+
+ local perf_output=`perf script -i ${ovs_dir}/perf.data -F trace:event,trace`
+ local pattern="skb:kfree_skb:.*reason: $reason"
+
+ return `echo "$perf_output" | grep "$pattern" | wc -l`
+}
+
usage() {
echo
echo "$0 [OPTIONS] [TEST]..."
@@ -155,6 +175,51 @@ usage() {
exit 1
}
+# drop_reason test
+# - drop packets and verify the right drop reason is reported
+test_drop_reason() {
+ which perf >/dev/null 2>&1 || return $ksft_skip
+
+ sbx_add "test_drop_reason" || return $?
+
+ ovs_add_dp "test_drop_reason" dropreason || return 1
+
+ info "create namespaces"
+ for ns in client server; do
+ ovs_add_netns_and_veths "test_drop_reason" "dropreason" "$ns" \
+ "${ns:0:1}0" "${ns:0:1}1" || return 1
+ done
+
+ # Setup client namespace
+ ip netns exec client ip addr add 172.31.110.10/24 dev c1
+ ip netns exec client ip link set c1 up
+
+ # Setup server namespace
+ ip netns exec server ip addr add 172.31.110.20/24 dev s1
+ ip netns exec server ip link set s1 up
+
+ # Allow ARP
+ ovs_add_flow "test_drop_reason" dropreason \
+ 'in_port(1),eth(),eth_type(0x0806),arp()' '2' || return 1
+ ovs_add_flow "test_drop_reason" dropreason \
+ 'in_port(2),eth(),eth_type(0x0806),arp()' '1' || return 1
+
+ # Allow client ICMP traffic but drop return path
+ ovs_add_flow "test_drop_reason" dropreason \
+ "in_port(1),eth(),eth_type(0x0800),ipv4(src=172.31.110.10,proto=1),icmp()" '2'
+ ovs_add_flow "test_drop_reason" dropreason \
+ "in_port(2),eth(),eth_type(0x0800),ipv4(src=172.31.110.20,proto=1),icmp()" 'drop'
+
+ ovs_drop_record_and_run "test_drop_reason" ip netns exec client ping -c 2 172.31.110.20
+ ovs_drop_reason_count 0x30001 # OVS_DROP_FLOW_ACTION
+ if [[ "$?" -ne "2" ]]; then
+ info "Did not detect expected drops: $?"
+ return 1
+ fi
+
+ return 0
+}
+
# arp_ping test
# - client has 1500 byte MTU
# - server has 1500 byte MTU
--
2.41.0
^ permalink raw reply related [flat|nested] 22+ messages in thread
* [net-next v3 7/7] selftests: openvswitch: add explicit drop testcase
2023-08-07 16:45 [net-next v3 0/7] openvswitch: add drop reasons Adrian Moreno
` (5 preceding siblings ...)
2023-08-07 16:45 ` [net-next v3 6/7] selftests: openvswitch: add drop reason testcase Adrian Moreno
@ 2023-08-07 16:45 ` Adrian Moreno
2023-08-08 15:02 ` Aaron Conole
6 siblings, 1 reply; 22+ messages in thread
From: Adrian Moreno @ 2023-08-07 16:45 UTC (permalink / raw)
To: netdev; +Cc: Adrian Moreno, aconole, i.maximets, eric, dev
Make ovs-dpctl.py support explicit drops as:
"drop" -> implicit empty-action drop
"drop(0)" -> explicit non-error action drop
"drop(42)" -> explicit error action drop
Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
---
.../selftests/net/openvswitch/openvswitch.sh | 25 +++++++++++++++++++
.../selftests/net/openvswitch/ovs-dpctl.py | 21 ++++++++++++----
2 files changed, 41 insertions(+), 5 deletions(-)
diff --git a/tools/testing/selftests/net/openvswitch/openvswitch.sh b/tools/testing/selftests/net/openvswitch/openvswitch.sh
index a10c345f40ef..c568ba1b7900 100755
--- a/tools/testing/selftests/net/openvswitch/openvswitch.sh
+++ b/tools/testing/selftests/net/openvswitch/openvswitch.sh
@@ -217,6 +217,31 @@ test_drop_reason() {
return 1
fi
+ # Drop UDP 6000 traffic with an explicit action and an error code.
+ ovs_add_flow "test_drop_reason" dropreason \
+ "in_port(1),eth(),eth_type(0x0800),ipv4(src=172.31.110.10,proto=17),udp(dst=6000)" \
+ 'drop(42)'
+ # Drop UDP 7000 traffic with an explicit action with no error code.
+ ovs_add_flow "test_drop_reason" dropreason \
+ "in_port(1),eth(),eth_type(0x0800),ipv4(src=172.31.110.10,proto=17),udp(dst=7000)" \
+ 'drop(0)'
+
+ ovs_drop_record_and_run \
+ "test_drop_reason" ip netns exec client nc -i 1 -zuv 172.31.110.20 6000
+ ovs_drop_reason_count 0x30004 # OVS_DROP_EXPLICIT_ACTION_ERROR
+ if [[ "$?" -ne "1" ]]; then
+ info "Did not detect expected explicit error drops: $?"
+ return 1
+ fi
+
+ ovs_drop_record_and_run \
+ "test_drop_reason" ip netns exec client nc -i 1 -zuv 172.31.110.20 7000
+ ovs_drop_reason_count 0x30003 # OVS_DROP_EXPLICIT_ACTION
+ if [[ "$?" -ne "1" ]]; then
+ info "Did not detect expected explicit drops: $?"
+ return 1
+ fi
+
return 0
}
diff --git a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py b/tools/testing/selftests/net/openvswitch/ovs-dpctl.py
index 5fee330050c2..912dc8c49085 100644
--- a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py
+++ b/tools/testing/selftests/net/openvswitch/ovs-dpctl.py
@@ -449,7 +449,7 @@ class ovsactions(nla):
elif field[0] == "OVS_ACTION_ATTR_TRUNC":
print_str += "trunc(%d)" % int(self.get_attr(field[0]))
elif field[0] == "OVS_ACTION_ATTR_DROP":
- print_str += "drop"
+ print_str += "drop(%d)" % int(self.get_attr(field[0]))
elif field[1] == "flag":
if field[0] == "OVS_ACTION_ATTR_CT_CLEAR":
print_str += "ct_clear"
@@ -471,10 +471,21 @@ class ovsactions(nla):
while len(actstr) != 0:
parsed = False
if actstr.startswith("drop"):
- # for now, drops have no explicit action, so we
- # don't need to set any attributes. The final
- # act of the processing chain will just drop the packet
- return
+ # If no reason is provided, the implicit drop is used (i.e no
+ # action). If some reason is given, an explicit action is used.
+ actstr, reason = parse_extract_field(
+ actstr,
+ "drop(",
+ "([0-9]+)",
+ lambda x: int(x, 0),
+ False,
+ None,
+ )
+ if reason is not None:
+ self["attrs"].append(["OVS_ACTION_ATTR_DROP", reason])
+ parsed = True
+ else:
+ return
elif parse_starts_block(actstr, "^(\d+)", False, True):
actstr, output = parse_extract_field(
--
2.41.0
^ permalink raw reply related [flat|nested] 22+ messages in thread
* Re: [net-next v3 1/7] net: openvswitch: add datapath flow drop reason
2023-08-07 16:45 ` [net-next v3 1/7] net: openvswitch: add datapath flow drop reason Adrian Moreno
@ 2023-08-08 14:36 ` Aaron Conole
2023-08-08 18:02 ` Ilya Maximets
1 sibling, 0 replies; 22+ messages in thread
From: Aaron Conole @ 2023-08-08 14:36 UTC (permalink / raw)
To: Adrian Moreno; +Cc: netdev, i.maximets, eric, dev
Adrian Moreno <amorenoz@redhat.com> writes:
> Create a new drop reason subsystem for openvswitch and add the first
> drop reason to represent flow drops.
>
> A flow drop happens when a flow has an empty action-set or there is no
> action that consumes the packet (output, userspace, recirc, etc).
>
> Implementation-wise, most of these skb-consuming actions already call
> "consume_skb" internally and return directly from within the
> do_execute_actions() loop so with minimal changes we can assume that
> any skb that exits the loop normally is a packet drop.
>
> Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
> ---
Acked-by: Aaron Conole <aconole@redhat.com>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [net-next v3 2/7] net: openvswitch: add action error drop reason
2023-08-07 16:45 ` [net-next v3 2/7] net: openvswitch: add action error " Adrian Moreno
@ 2023-08-08 14:37 ` Aaron Conole
0 siblings, 0 replies; 22+ messages in thread
From: Aaron Conole @ 2023-08-08 14:37 UTC (permalink / raw)
To: Adrian Moreno; +Cc: netdev, i.maximets, eric, dev
Adrian Moreno <amorenoz@redhat.com> writes:
> Add a drop reason for packets that are dropped because an action
> returns a non-zero error code.
>
> Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
> ---
Acked-by: Aaron Conole <aconole@redhat.com>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [net-next v3 3/7] net: openvswitch: add explicit drop action
2023-08-07 16:45 ` [net-next v3 3/7] net: openvswitch: add explicit drop action Adrian Moreno
@ 2023-08-08 14:53 ` Aaron Conole
2023-08-09 6:49 ` Adrian Moreno
2023-08-08 18:10 ` Ilya Maximets
1 sibling, 1 reply; 22+ messages in thread
From: Aaron Conole @ 2023-08-08 14:53 UTC (permalink / raw)
To: Adrian Moreno; +Cc: netdev, Eric Garver, i.maximets, dev
Adrian Moreno <amorenoz@redhat.com> writes:
> From: Eric Garver <eric@garver.life>
>
> From: Eric Garver <eric@garver.life>
>
> This adds an explicit drop action. This is used by OVS to drop packets
> for which it cannot determine what to do. An explicit action in the
> kernel allows passing the reason _why_ the packet is being dropped or
> zero to indicate no particular error happened (i.e: OVS intentionally
> dropped the packet).
>
> Since the error codes coming from userspace mean nothing for the kernel,
> we squash all of them into only two drop reasons:
> - OVS_DROP_EXPLICIT_ACTION_ERROR to indicate a non-zero value was passed
> - OVS_DROP_EXPLICIT_ACTION to indicate a zero value was passed (no
> error)
>
> e.g. trace all OVS dropped skbs
>
> # perf trace -e skb:kfree_skb --filter="reason >= 0x30000"
> [..]
> 106.023 ping/2465 skb:kfree_skb(skbaddr: 0xffffa0e8765f2000, \
> location:0xffffffffc0d9b462, protocol: 2048, reason: 196611)
>
> reason: 196611 --> 0x30003 (OVS_DROP_EXPLICIT_ACTION)
>
> Signed-off-by: Eric Garver <eric@garver.life>
> Co-developed-by: Adrian Moreno <amorenoz@redhat.com>
> Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
> ---
> include/uapi/linux/openvswitch.h | 2 ++
> net/openvswitch/actions.c | 9 +++++++++
> net/openvswitch/drop.h | 2 ++
> net/openvswitch/flow_netlink.c | 10 +++++++++-
> tools/testing/selftests/net/openvswitch/ovs-dpctl.py | 3 +++
> 5 files changed, 25 insertions(+), 1 deletion(-)
>
> diff --git a/include/uapi/linux/openvswitch.h b/include/uapi/linux/openvswitch.h
> index e94870e77ee9..efc82c318fa2 100644
> --- a/include/uapi/linux/openvswitch.h
> +++ b/include/uapi/linux/openvswitch.h
> @@ -965,6 +965,7 @@ struct check_pkt_len_arg {
> * start of the packet or at the start of the l3 header depending on the value
> * of l3 tunnel flag in the tun_flags field of OVS_ACTION_ATTR_ADD_MPLS
> * argument.
> + * @OVS_ACTION_ATTR_DROP: Explicit drop action.
> *
> * Only a single header can be set with a single %OVS_ACTION_ATTR_SET. Not all
> * fields within a header are modifiable, e.g. the IPv4 protocol and fragment
> @@ -1002,6 +1003,7 @@ enum ovs_action_attr {
> OVS_ACTION_ATTR_CHECK_PKT_LEN, /* Nested OVS_CHECK_PKT_LEN_ATTR_*. */
> OVS_ACTION_ATTR_ADD_MPLS, /* struct ovs_action_add_mpls. */
> OVS_ACTION_ATTR_DEC_TTL, /* Nested OVS_DEC_TTL_ATTR_*. */
> + OVS_ACTION_ATTR_DROP, /* u32 error code. */
>
> __OVS_ACTION_ATTR_MAX, /* Nothing past this will be accepted
> * from userspace. */
> diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c
> index 9b66a3334aaa..285b1243b94f 100644
> --- a/net/openvswitch/actions.c
> +++ b/net/openvswitch/actions.c
> @@ -1485,6 +1485,15 @@ static int do_execute_actions(struct datapath *dp, struct sk_buff *skb,
> return dec_ttl_exception_handler(dp, skb,
> key, a);
> break;
> +
> + case OVS_ACTION_ATTR_DROP: {
> + enum ovs_drop_reason reason = nla_get_u32(a)
> + ? OVS_DROP_EXPLICIT_ACTION_ERROR
> + : OVS_DROP_EXPLICIT_ACTION;
> +
> + kfree_skb_reason(skb, reason);
> + return 0;
> + }
> }
>
> if (unlikely(err)) {
> diff --git a/net/openvswitch/drop.h b/net/openvswitch/drop.h
> index 3cd6489a5a2b..be51ff5039fb 100644
> --- a/net/openvswitch/drop.h
> +++ b/net/openvswitch/drop.h
> @@ -10,6 +10,8 @@
> #define OVS_DROP_REASONS(R) \
> R(OVS_DROP_FLOW) \
> R(OVS_DROP_ACTION_ERROR) \
> + R(OVS_DROP_EXPLICIT_ACTION) \
> + R(OVS_DROP_EXPLICIT_ACTION_ERROR) \
> /* deliberate comment for trailing \ */
>
> enum ovs_drop_reason {
> diff --git a/net/openvswitch/flow_netlink.c b/net/openvswitch/flow_netlink.c
> index 41116361433d..88965e2068ac 100644
> --- a/net/openvswitch/flow_netlink.c
> +++ b/net/openvswitch/flow_netlink.c
> @@ -38,6 +38,7 @@
> #include <net/tun_proto.h>
> #include <net/erspan.h>
>
> +#include "drop.h"
> #include "flow_netlink.h"
>
> struct ovs_len_tbl {
> @@ -61,6 +62,7 @@ static bool actions_may_change_flow(const struct nlattr *actions)
> case OVS_ACTION_ATTR_RECIRC:
> case OVS_ACTION_ATTR_TRUNC:
> case OVS_ACTION_ATTR_USERSPACE:
> + case OVS_ACTION_ATTR_DROP:
> break;
>
> case OVS_ACTION_ATTR_CT:
> @@ -2394,7 +2396,7 @@ static void ovs_nla_free_nested_actions(const struct nlattr *actions, int len)
> /* Whenever new actions are added, the need to update this
> * function should be considered.
> */
> - BUILD_BUG_ON(OVS_ACTION_ATTR_MAX != 23);
> + BUILD_BUG_ON(OVS_ACTION_ATTR_MAX != 24);
>
> if (!actions)
> return;
> @@ -3182,6 +3184,7 @@ static int __ovs_nla_copy_actions(struct net *net, const struct nlattr *attr,
> [OVS_ACTION_ATTR_CHECK_PKT_LEN] = (u32)-1,
> [OVS_ACTION_ATTR_ADD_MPLS] = sizeof(struct ovs_action_add_mpls),
> [OVS_ACTION_ATTR_DEC_TTL] = (u32)-1,
> + [OVS_ACTION_ATTR_DROP] = sizeof(u32),
> };
> const struct ovs_action_push_vlan *vlan;
> int type = nla_type(a);
> @@ -3453,6 +3456,11 @@ static int __ovs_nla_copy_actions(struct net *net, const struct nlattr *attr,
> skip_copy = true;
> break;
>
> + case OVS_ACTION_ATTR_DROP:
> + if (!nla_is_last(a, rem))
> + return -EINVAL;
> + break;
> +
> default:
> OVS_NLERR(log, "Unknown Action type %d", type);
> return -EINVAL;
> diff --git a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py b/tools/testing/selftests/net/openvswitch/ovs-dpctl.py
> index fbdac15e3134..5fee330050c2 100644
> --- a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py
> +++ b/tools/testing/selftests/net/openvswitch/ovs-dpctl.py
> @@ -301,6 +301,7 @@ class ovsactions(nla):
> ("OVS_ACTION_ATTR_CHECK_PKT_LEN", "none"),
> ("OVS_ACTION_ATTR_ADD_MPLS", "none"),
> ("OVS_ACTION_ATTR_DEC_TTL", "none"),
> + ("OVS_ACTION_ATTR_DROP", "uint32"),
> )
>
> class ctact(nla):
> @@ -447,6 +448,8 @@ class ovsactions(nla):
> print_str += "recirc(0x%x)" % int(self.get_attr(field[0]))
> elif field[0] == "OVS_ACTION_ATTR_TRUNC":
> print_str += "trunc(%d)" % int(self.get_attr(field[0]))
> + elif field[0] == "OVS_ACTION_ATTR_DROP":
> + print_str += "drop"
Any reason that you don't include the int(self.get_attr(field[0])) here
and add it only to 7/7?
> elif field[1] == "flag":
> if field[0] == "OVS_ACTION_ATTR_CT_CLEAR":
> print_str += "ct_clear"
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [net-next v3 4/7] net: openvswitch: add meter drop reason
2023-08-07 16:45 ` [net-next v3 4/7] net: openvswitch: add meter drop reason Adrian Moreno
@ 2023-08-08 14:53 ` Aaron Conole
0 siblings, 0 replies; 22+ messages in thread
From: Aaron Conole @ 2023-08-08 14:53 UTC (permalink / raw)
To: Adrian Moreno; +Cc: netdev, i.maximets, eric, dev
Adrian Moreno <amorenoz@redhat.com> writes:
> By using an independent drop reason it makes it easy to ditinguish
nit: distinguish
> between QoS-triggered or flow-triggered drop.
>
> Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
> ---
Acked-by: Aaron Conole <aconole@redhat.com>
> net/openvswitch/actions.c | 2 +-
> net/openvswitch/drop.h | 1 +
> 2 files changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c
> index 285b1243b94f..e204c7eee8ef 100644
> --- a/net/openvswitch/actions.c
> +++ b/net/openvswitch/actions.c
> @@ -1454,7 +1454,7 @@ static int do_execute_actions(struct datapath *dp, struct sk_buff *skb,
>
> case OVS_ACTION_ATTR_METER:
> if (ovs_meter_execute(dp, skb, key, nla_get_u32(a))) {
> - consume_skb(skb);
> + kfree_skb_reason(skb, OVS_DROP_METER);
> return 0;
> }
> break;
> diff --git a/net/openvswitch/drop.h b/net/openvswitch/drop.h
> index be51ff5039fb..1ba866c408e5 100644
> --- a/net/openvswitch/drop.h
> +++ b/net/openvswitch/drop.h
> @@ -12,6 +12,7 @@
> R(OVS_DROP_ACTION_ERROR) \
> R(OVS_DROP_EXPLICIT_ACTION) \
> R(OVS_DROP_EXPLICIT_ACTION_ERROR) \
> + R(OVS_DROP_METER) \
> /* deliberate comment for trailing \ */
>
> enum ovs_drop_reason {
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [net-next v3 5/7] net: openvswitch: add misc error drop reasons
2023-08-07 16:45 ` [net-next v3 5/7] net: openvswitch: add misc error drop reasons Adrian Moreno
@ 2023-08-08 14:56 ` Aaron Conole
0 siblings, 0 replies; 22+ messages in thread
From: Aaron Conole @ 2023-08-08 14:56 UTC (permalink / raw)
To: Adrian Moreno; +Cc: netdev, i.maximets, eric, dev
Adrian Moreno <amorenoz@redhat.com> writes:
> Use drop reasons from include/net/dropreason-core.h when a reasonable
> candidate exists.
>
> Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
> ---
Acked-by: Aaron Conole <aconole@redhat.com>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [net-next v3 7/7] selftests: openvswitch: add explicit drop testcase
2023-08-07 16:45 ` [net-next v3 7/7] selftests: openvswitch: add explicit drop testcase Adrian Moreno
@ 2023-08-08 15:02 ` Aaron Conole
2023-08-09 7:02 ` Adrian Moreno
0 siblings, 1 reply; 22+ messages in thread
From: Aaron Conole @ 2023-08-08 15:02 UTC (permalink / raw)
To: Adrian Moreno; +Cc: netdev, i.maximets, eric, dev
Adrian Moreno <amorenoz@redhat.com> writes:
> Make ovs-dpctl.py support explicit drops as:
> "drop" -> implicit empty-action drop
> "drop(0)" -> explicit non-error action drop
I also suggest a test in netlink_checks to make sure drop can't be
followed by additional actions. Something like:
3,drop(0),2
which should generate a NL message that has the drop attribute with
additional action data following it.
> "drop(42)" -> explicit error action drop
>
> Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
> ---
> .../selftests/net/openvswitch/openvswitch.sh | 25 +++++++++++++++++++
> .../selftests/net/openvswitch/ovs-dpctl.py | 21 ++++++++++++----
> 2 files changed, 41 insertions(+), 5 deletions(-)
>
> diff --git a/tools/testing/selftests/net/openvswitch/openvswitch.sh b/tools/testing/selftests/net/openvswitch/openvswitch.sh
> index a10c345f40ef..c568ba1b7900 100755
> --- a/tools/testing/selftests/net/openvswitch/openvswitch.sh
> +++ b/tools/testing/selftests/net/openvswitch/openvswitch.sh
> @@ -217,6 +217,31 @@ test_drop_reason() {
> return 1
> fi
>
> + # Drop UDP 6000 traffic with an explicit action and an error code.
> + ovs_add_flow "test_drop_reason" dropreason \
> + "in_port(1),eth(),eth_type(0x0800),ipv4(src=172.31.110.10,proto=17),udp(dst=6000)" \
> + 'drop(42)'
> + # Drop UDP 7000 traffic with an explicit action with no error code.
> + ovs_add_flow "test_drop_reason" dropreason \
> + "in_port(1),eth(),eth_type(0x0800),ipv4(src=172.31.110.10,proto=17),udp(dst=7000)" \
> + 'drop(0)'
> +
> + ovs_drop_record_and_run \
> + "test_drop_reason" ip netns exec client nc -i 1 -zuv 172.31.110.20 6000
> + ovs_drop_reason_count 0x30004 # OVS_DROP_EXPLICIT_ACTION_ERROR
> + if [[ "$?" -ne "1" ]]; then
> + info "Did not detect expected explicit error drops: $?"
> + return 1
> + fi
> +
> + ovs_drop_record_and_run \
> + "test_drop_reason" ip netns exec client nc -i 1 -zuv 172.31.110.20 7000
> + ovs_drop_reason_count 0x30003 # OVS_DROP_EXPLICIT_ACTION
> + if [[ "$?" -ne "1" ]]; then
> + info "Did not detect expected explicit drops: $?"
> + return 1
> + fi
> +
> return 0
> }
>
> diff --git a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py b/tools/testing/selftests/net/openvswitch/ovs-dpctl.py
> index 5fee330050c2..912dc8c49085 100644
> --- a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py
> +++ b/tools/testing/selftests/net/openvswitch/ovs-dpctl.py
> @@ -449,7 +449,7 @@ class ovsactions(nla):
> elif field[0] == "OVS_ACTION_ATTR_TRUNC":
> print_str += "trunc(%d)" % int(self.get_attr(field[0]))
> elif field[0] == "OVS_ACTION_ATTR_DROP":
> - print_str += "drop"
> + print_str += "drop(%d)" % int(self.get_attr(field[0]))
> elif field[1] == "flag":
> if field[0] == "OVS_ACTION_ATTR_CT_CLEAR":
> print_str += "ct_clear"
> @@ -471,10 +471,21 @@ class ovsactions(nla):
> while len(actstr) != 0:
> parsed = False
> if actstr.startswith("drop"):
> - # for now, drops have no explicit action, so we
> - # don't need to set any attributes. The final
> - # act of the processing chain will just drop the packet
> - return
> + # If no reason is provided, the implicit drop is used (i.e no
> + # action). If some reason is given, an explicit action is used.
> + actstr, reason = parse_extract_field(
> + actstr,
> + "drop(",
> + "([0-9]+)",
> + lambda x: int(x, 0),
> + False,
> + None,
> + )
> + if reason is not None:
> + self["attrs"].append(["OVS_ACTION_ATTR_DROP", reason])
> + parsed = True
> + else:
> + return
>
> elif parse_starts_block(actstr, "^(\d+)", False, True):
> actstr, output = parse_extract_field(
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [net-next v3 6/7] selftests: openvswitch: add drop reason testcase
2023-08-07 16:45 ` [net-next v3 6/7] selftests: openvswitch: add drop reason testcase Adrian Moreno
@ 2023-08-08 15:04 ` Aaron Conole
0 siblings, 0 replies; 22+ messages in thread
From: Aaron Conole @ 2023-08-08 15:04 UTC (permalink / raw)
To: Adrian Moreno; +Cc: netdev, i.maximets, eric, dev
Adrian Moreno <amorenoz@redhat.com> writes:
> Test if the correct drop reason is reported when OVS drops a packet due
> to an explicit flow.
>
> Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
> ---
Acked-by: Aaron Conole <aconole@redhat.com>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [net-next v3 1/7] net: openvswitch: add datapath flow drop reason
2023-08-07 16:45 ` [net-next v3 1/7] net: openvswitch: add datapath flow drop reason Adrian Moreno
2023-08-08 14:36 ` Aaron Conole
@ 2023-08-08 18:02 ` Ilya Maximets
2023-08-09 6:47 ` Adrian Moreno
1 sibling, 1 reply; 22+ messages in thread
From: Ilya Maximets @ 2023-08-08 18:02 UTC (permalink / raw)
To: Adrian Moreno, netdev; +Cc: i.maximets, aconole, eric, dev
On 8/7/23 18:45, Adrian Moreno wrote:
> Create a new drop reason subsystem for openvswitch and add the first
> drop reason to represent flow drops.
>
> A flow drop happens when a flow has an empty action-set or there is no
> action that consumes the packet (output, userspace, recirc, etc).
>
> Implementation-wise, most of these skb-consuming actions already call
> "consume_skb" internally and return directly from within the
> do_execute_actions() loop so with minimal changes we can assume that
> any skb that exits the loop normally is a packet drop.
>
> Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
> ---
> include/net/dropreason.h | 6 ++++++
> net/openvswitch/actions.c | 12 ++++++++++--
> net/openvswitch/datapath.c | 16 ++++++++++++++++
> net/openvswitch/drop.h | 24 ++++++++++++++++++++++++
> 4 files changed, 56 insertions(+), 2 deletions(-)
> create mode 100644 net/openvswitch/drop.h
<snip>
> diff --git a/net/openvswitch/drop.h b/net/openvswitch/drop.h
> new file mode 100644
> index 000000000000..cdd10629c6be
> --- /dev/null
> +++ b/net/openvswitch/drop.h
> @@ -0,0 +1,24 @@
> +/* SPDX-License-Identifier: GPL-2.0-only */
> +/*
> + * OpenvSwitch drop reason list.
> + */
> +
> +#ifndef OPENVSWITCH_DROP_H
> +#define OPENVSWITCH_DROP_H
> +#include <net/dropreason.h>
> +
> +#define OVS_DROP_REASONS(R) \
> + R(OVS_DROP_FLOW) \
Hi, Adrian. Not a full review, just complaining about names. :)
The OVS_DROP_FLOW seems a bit confusing and unclear. A "flow drop"
is also a strange term to use. Maybe we can somehow express in the
name that this drop reason is used when there are no actions left
to execute? e.g. OVS_DROP_NO_MORE_ACTIONS or OVS_DROP_LAST_ACTION
or OVS_DROP_END_OF_ACTION_LIST or something of that sort? These may
seem long, but they are not longer than some other names introduced
later in the set. What do yo think?
Best regards, Ilya Maximets.
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [net-next v3 3/7] net: openvswitch: add explicit drop action
2023-08-07 16:45 ` [net-next v3 3/7] net: openvswitch: add explicit drop action Adrian Moreno
2023-08-08 14:53 ` Aaron Conole
@ 2023-08-08 18:10 ` Ilya Maximets
2023-08-09 7:03 ` Adrian Moreno
1 sibling, 1 reply; 22+ messages in thread
From: Ilya Maximets @ 2023-08-08 18:10 UTC (permalink / raw)
To: Adrian Moreno, netdev; +Cc: i.maximets, Eric Garver, aconole, dev
On 8/7/23 18:45, Adrian Moreno wrote:
> From: Eric Garver <eric@garver.life>
>
> From: Eric Garver <eric@garver.life>
>
> This adds an explicit drop action. This is used by OVS to drop packets
> for which it cannot determine what to do. An explicit action in the
> kernel allows passing the reason _why_ the packet is being dropped or
> zero to indicate no particular error happened (i.e: OVS intentionally
> dropped the packet).
>
> Since the error codes coming from userspace mean nothing for the kernel,
> we squash all of them into only two drop reasons:
> - OVS_DROP_EXPLICIT_ACTION_ERROR to indicate a non-zero value was passed
> - OVS_DROP_EXPLICIT_ACTION to indicate a zero value was passed (no
> error)
>
> e.g. trace all OVS dropped skbs
>
> # perf trace -e skb:kfree_skb --filter="reason >= 0x30000"
> [..]
> 106.023 ping/2465 skb:kfree_skb(skbaddr: 0xffffa0e8765f2000, \
> location:0xffffffffc0d9b462, protocol: 2048, reason: 196611)
>
> reason: 196611 --> 0x30003 (OVS_DROP_EXPLICIT_ACTION)
>
> Signed-off-by: Eric Garver <eric@garver.life>
> Co-developed-by: Adrian Moreno <amorenoz@redhat.com>
> Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
> ---
> include/uapi/linux/openvswitch.h | 2 ++
> net/openvswitch/actions.c | 9 +++++++++
> net/openvswitch/drop.h | 2 ++
> net/openvswitch/flow_netlink.c | 10 +++++++++-
> tools/testing/selftests/net/openvswitch/ovs-dpctl.py | 3 +++
> 5 files changed, 25 insertions(+), 1 deletion(-)
<snip>
> diff --git a/net/openvswitch/drop.h b/net/openvswitch/drop.h
> index 3cd6489a5a2b..be51ff5039fb 100644
> --- a/net/openvswitch/drop.h
> +++ b/net/openvswitch/drop.h
> @@ -10,6 +10,8 @@
> #define OVS_DROP_REASONS(R) \
> R(OVS_DROP_FLOW) \
> R(OVS_DROP_ACTION_ERROR) \
> + R(OVS_DROP_EXPLICIT_ACTION) \
> + R(OVS_DROP_EXPLICIT_ACTION_ERROR) \
These drop reasons are a bit unclear as well. Especially since we
have OVS_DROP_ACTION_ERROR and OVS_DROP_EXPLICIT_ACTION_ERROR that
mean completely different things while having similar names.
Maybe remove the 'ACTION' part from these and add a word 'with'?
E.g. OVS_DROP_EXPLICIT and OVS_DROP_EXPLICIT_WITH_ERROR. I suppose,
'WITH' can also be shortened to 'W'. It's fairly obvious that
explicit drops are caused by the explicit drop action.
What do you think?
Best regards, Ilya Maximets.
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [net-next v3 1/7] net: openvswitch: add datapath flow drop reason
2023-08-08 18:02 ` Ilya Maximets
@ 2023-08-09 6:47 ` Adrian Moreno
0 siblings, 0 replies; 22+ messages in thread
From: Adrian Moreno @ 2023-08-09 6:47 UTC (permalink / raw)
To: Ilya Maximets, netdev; +Cc: aconole, eric, dev
On 8/8/23 20:02, Ilya Maximets wrote:
> On 8/7/23 18:45, Adrian Moreno wrote:
>> Create a new drop reason subsystem for openvswitch and add the first
>> drop reason to represent flow drops.
>>
>> A flow drop happens when a flow has an empty action-set or there is no
>> action that consumes the packet (output, userspace, recirc, etc).
>>
>> Implementation-wise, most of these skb-consuming actions already call
>> "consume_skb" internally and return directly from within the
>> do_execute_actions() loop so with minimal changes we can assume that
>> any skb that exits the loop normally is a packet drop.
>>
>> Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
>> ---
>> include/net/dropreason.h | 6 ++++++
>> net/openvswitch/actions.c | 12 ++++++++++--
>> net/openvswitch/datapath.c | 16 ++++++++++++++++
>> net/openvswitch/drop.h | 24 ++++++++++++++++++++++++
>> 4 files changed, 56 insertions(+), 2 deletions(-)
>> create mode 100644 net/openvswitch/drop.h
>
> <snip>
>
>> diff --git a/net/openvswitch/drop.h b/net/openvswitch/drop.h
>> new file mode 100644
>> index 000000000000..cdd10629c6be
>> --- /dev/null
>> +++ b/net/openvswitch/drop.h
>> @@ -0,0 +1,24 @@
>> +/* SPDX-License-Identifier: GPL-2.0-only */
>> +/*
>> + * OpenvSwitch drop reason list.
>> + */
>> +
>> +#ifndef OPENVSWITCH_DROP_H
>> +#define OPENVSWITCH_DROP_H
>> +#include <net/dropreason.h>
>> +
>> +#define OVS_DROP_REASONS(R) \
>> + R(OVS_DROP_FLOW) \
>
> Hi, Adrian. Not a full review, just complaining about names. :)
>
> The OVS_DROP_FLOW seems a bit confusing and unclear. A "flow drop"
> is also a strange term to use. Maybe we can somehow express in the
> name that this drop reason is used when there are no actions left
> to execute? e.g. OVS_DROP_NO_MORE_ACTIONS or OVS_DROP_LAST_ACTION
> or OVS_DROP_END_OF_ACTION_LIST or something of that sort? These may
> seem long, but they are not longer than some other names introduced
> later in the set. What do yo think?
>
Hi Ilya,
Thanks for the suggestion. It looks reasonable. I did consider something similar
but then it felt like having a bit of an "unexpected" or "involuntary"
connotation. Given that there are other drop reasons that are involutary I
wanted to somehow differentiate this one from the rest.
Semantically it'd mean something like: When a flow is deliberately installed
with an empty action list it means "it" (the flow?) _wants_ to drop the packet,
that's why I ended at that name.
OVS_DROP_LAST_ACTION seems to convey this intentionality as well. I'll can send
another version changing all names.
Thanks.
--
Adrián Moreno
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [net-next v3 3/7] net: openvswitch: add explicit drop action
2023-08-08 14:53 ` Aaron Conole
@ 2023-08-09 6:49 ` Adrian Moreno
0 siblings, 0 replies; 22+ messages in thread
From: Adrian Moreno @ 2023-08-09 6:49 UTC (permalink / raw)
To: Aaron Conole; +Cc: netdev, Eric Garver, i.maximets, dev
On 8/8/23 16:53, Aaron Conole wrote:
> Adrian Moreno <amorenoz@redhat.com> writes:
>
>> From: Eric Garver <eric@garver.life>
>>
>> From: Eric Garver <eric@garver.life>
>>
>> This adds an explicit drop action. This is used by OVS to drop packets
>> for which it cannot determine what to do. An explicit action in the
>> kernel allows passing the reason _why_ the packet is being dropped or
>> zero to indicate no particular error happened (i.e: OVS intentionally
>> dropped the packet).
>>
>> Since the error codes coming from userspace mean nothing for the kernel,
>> we squash all of them into only two drop reasons:
>> - OVS_DROP_EXPLICIT_ACTION_ERROR to indicate a non-zero value was passed
>> - OVS_DROP_EXPLICIT_ACTION to indicate a zero value was passed (no
>> error)
>>
>> e.g. trace all OVS dropped skbs
>>
>> # perf trace -e skb:kfree_skb --filter="reason >= 0x30000"
>> [..]
>> 106.023 ping/2465 skb:kfree_skb(skbaddr: 0xffffa0e8765f2000, \
>> location:0xffffffffc0d9b462, protocol: 2048, reason: 196611)
>>
>> reason: 196611 --> 0x30003 (OVS_DROP_EXPLICIT_ACTION)
>>
>> Signed-off-by: Eric Garver <eric@garver.life>
>> Co-developed-by: Adrian Moreno <amorenoz@redhat.com>
>> Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
>> ---
>> include/uapi/linux/openvswitch.h | 2 ++
>> net/openvswitch/actions.c | 9 +++++++++
>> net/openvswitch/drop.h | 2 ++
>> net/openvswitch/flow_netlink.c | 10 +++++++++-
>> tools/testing/selftests/net/openvswitch/ovs-dpctl.py | 3 +++
>> 5 files changed, 25 insertions(+), 1 deletion(-)
>>
>> diff --git a/include/uapi/linux/openvswitch.h b/include/uapi/linux/openvswitch.h
>> index e94870e77ee9..efc82c318fa2 100644
>> --- a/include/uapi/linux/openvswitch.h
>> +++ b/include/uapi/linux/openvswitch.h
>> @@ -965,6 +965,7 @@ struct check_pkt_len_arg {
>> * start of the packet or at the start of the l3 header depending on the value
>> * of l3 tunnel flag in the tun_flags field of OVS_ACTION_ATTR_ADD_MPLS
>> * argument.
>> + * @OVS_ACTION_ATTR_DROP: Explicit drop action.
>> *
>> * Only a single header can be set with a single %OVS_ACTION_ATTR_SET. Not all
>> * fields within a header are modifiable, e.g. the IPv4 protocol and fragment
>> @@ -1002,6 +1003,7 @@ enum ovs_action_attr {
>> OVS_ACTION_ATTR_CHECK_PKT_LEN, /* Nested OVS_CHECK_PKT_LEN_ATTR_*. */
>> OVS_ACTION_ATTR_ADD_MPLS, /* struct ovs_action_add_mpls. */
>> OVS_ACTION_ATTR_DEC_TTL, /* Nested OVS_DEC_TTL_ATTR_*. */
>> + OVS_ACTION_ATTR_DROP, /* u32 error code. */
>>
>> __OVS_ACTION_ATTR_MAX, /* Nothing past this will be accepted
>> * from userspace. */
>> diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c
>> index 9b66a3334aaa..285b1243b94f 100644
>> --- a/net/openvswitch/actions.c
>> +++ b/net/openvswitch/actions.c
>> @@ -1485,6 +1485,15 @@ static int do_execute_actions(struct datapath *dp, struct sk_buff *skb,
>> return dec_ttl_exception_handler(dp, skb,
>> key, a);
>> break;
>> +
>> + case OVS_ACTION_ATTR_DROP: {
>> + enum ovs_drop_reason reason = nla_get_u32(a)
>> + ? OVS_DROP_EXPLICIT_ACTION_ERROR
>> + : OVS_DROP_EXPLICIT_ACTION;
>> +
>> + kfree_skb_reason(skb, reason);
>> + return 0;
>> + }
>> }
>>
>> if (unlikely(err)) {
>> diff --git a/net/openvswitch/drop.h b/net/openvswitch/drop.h
>> index 3cd6489a5a2b..be51ff5039fb 100644
>> --- a/net/openvswitch/drop.h
>> +++ b/net/openvswitch/drop.h
>> @@ -10,6 +10,8 @@
>> #define OVS_DROP_REASONS(R) \
>> R(OVS_DROP_FLOW) \
>> R(OVS_DROP_ACTION_ERROR) \
>> + R(OVS_DROP_EXPLICIT_ACTION) \
>> + R(OVS_DROP_EXPLICIT_ACTION_ERROR) \
>> /* deliberate comment for trailing \ */
>>
>> enum ovs_drop_reason {
>> diff --git a/net/openvswitch/flow_netlink.c b/net/openvswitch/flow_netlink.c
>> index 41116361433d..88965e2068ac 100644
>> --- a/net/openvswitch/flow_netlink.c
>> +++ b/net/openvswitch/flow_netlink.c
>> @@ -38,6 +38,7 @@
>> #include <net/tun_proto.h>
>> #include <net/erspan.h>
>>
>> +#include "drop.h"
>> #include "flow_netlink.h"
>>
>> struct ovs_len_tbl {
>> @@ -61,6 +62,7 @@ static bool actions_may_change_flow(const struct nlattr *actions)
>> case OVS_ACTION_ATTR_RECIRC:
>> case OVS_ACTION_ATTR_TRUNC:
>> case OVS_ACTION_ATTR_USERSPACE:
>> + case OVS_ACTION_ATTR_DROP:
>> break;
>>
>> case OVS_ACTION_ATTR_CT:
>> @@ -2394,7 +2396,7 @@ static void ovs_nla_free_nested_actions(const struct nlattr *actions, int len)
>> /* Whenever new actions are added, the need to update this
>> * function should be considered.
>> */
>> - BUILD_BUG_ON(OVS_ACTION_ATTR_MAX != 23);
>> + BUILD_BUG_ON(OVS_ACTION_ATTR_MAX != 24);
>>
>> if (!actions)
>> return;
>> @@ -3182,6 +3184,7 @@ static int __ovs_nla_copy_actions(struct net *net, const struct nlattr *attr,
>> [OVS_ACTION_ATTR_CHECK_PKT_LEN] = (u32)-1,
>> [OVS_ACTION_ATTR_ADD_MPLS] = sizeof(struct ovs_action_add_mpls),
>> [OVS_ACTION_ATTR_DEC_TTL] = (u32)-1,
>> + [OVS_ACTION_ATTR_DROP] = sizeof(u32),
>> };
>> const struct ovs_action_push_vlan *vlan;
>> int type = nla_type(a);
>> @@ -3453,6 +3456,11 @@ static int __ovs_nla_copy_actions(struct net *net, const struct nlattr *attr,
>> skip_copy = true;
>> break;
>>
>> + case OVS_ACTION_ATTR_DROP:
>> + if (!nla_is_last(a, rem))
>> + return -EINVAL;
>> + break;
>> +
>> default:
>> OVS_NLERR(log, "Unknown Action type %d", type);
>> return -EINVAL;
>> diff --git a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py b/tools/testing/selftests/net/openvswitch/ovs-dpctl.py
>> index fbdac15e3134..5fee330050c2 100644
>> --- a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py
>> +++ b/tools/testing/selftests/net/openvswitch/ovs-dpctl.py
>> @@ -301,6 +301,7 @@ class ovsactions(nla):
>> ("OVS_ACTION_ATTR_CHECK_PKT_LEN", "none"),
>> ("OVS_ACTION_ATTR_ADD_MPLS", "none"),
>> ("OVS_ACTION_ATTR_DEC_TTL", "none"),
>> + ("OVS_ACTION_ATTR_DROP", "uint32"),
>> )
>>
>> class ctact(nla):
>> @@ -447,6 +448,8 @@ class ovsactions(nla):
>> print_str += "recirc(0x%x)" % int(self.get_attr(field[0]))
>> elif field[0] == "OVS_ACTION_ATTR_TRUNC":
>> print_str += "trunc(%d)" % int(self.get_attr(field[0]))
>> + elif field[0] == "OVS_ACTION_ATTR_DROP":
>> + print_str += "drop"
>
> Any reason that you don't include the int(self.get_attr(field[0])) here
> and add it only to 7/7?
>
This was included in Eric's original patch so I kept it and enhanced it later.
But you're right it doesn't really make any sense. I'll move the chunk from
patch 7 to this one.
>> elif field[1] == "flag":
>> if field[0] == "OVS_ACTION_ATTR_CT_CLEAR":
>> print_str += "ct_clear"
>
Thanks.
--
Adrián Moreno
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [net-next v3 7/7] selftests: openvswitch: add explicit drop testcase
2023-08-08 15:02 ` Aaron Conole
@ 2023-08-09 7:02 ` Adrian Moreno
2023-08-09 15:18 ` Aaron Conole
0 siblings, 1 reply; 22+ messages in thread
From: Adrian Moreno @ 2023-08-09 7:02 UTC (permalink / raw)
To: Aaron Conole; +Cc: netdev, i.maximets, eric, dev
On 8/8/23 17:02, Aaron Conole wrote:
> Adrian Moreno <amorenoz@redhat.com> writes:
>
>> Make ovs-dpctl.py support explicit drops as:
>> "drop" -> implicit empty-action drop
>> "drop(0)" -> explicit non-error action drop
>
> I also suggest a test in netlink_checks to make sure drop can't be
> followed by additional actions. Something like:
>
> 3,drop(0),2
>
> which should generate a NL message that has the drop attribute with
> additional action data following it.
Ack, will do.
The check I've added in flow_netlink.c does not include any custom message. Just
returning -EINVAL in __ovs_nla_copy_actions() ends up printing "Flow actions may
not be safe on all matching packets" to dmesg. Maybe it's too generic or even
misleading in some cases but I saw other action verifications do the same so I
thought it might be kind of expected at this point.
Do you think a custom message (in addition to the generic one) is needed?
Thanks.
--
Adrián
>
>> "drop(42)" -> explicit error action drop
>>
>> Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
>> ---
>> .../selftests/net/openvswitch/openvswitch.sh | 25 +++++++++++++++++++
>> .../selftests/net/openvswitch/ovs-dpctl.py | 21 ++++++++++++----
>> 2 files changed, 41 insertions(+), 5 deletions(-)
>>
>> diff --git a/tools/testing/selftests/net/openvswitch/openvswitch.sh b/tools/testing/selftests/net/openvswitch/openvswitch.sh
>> index a10c345f40ef..c568ba1b7900 100755
>> --- a/tools/testing/selftests/net/openvswitch/openvswitch.sh
>> +++ b/tools/testing/selftests/net/openvswitch/openvswitch.sh
>> @@ -217,6 +217,31 @@ test_drop_reason() {
>> return 1
>> fi
>>
>> + # Drop UDP 6000 traffic with an explicit action and an error code.
>> + ovs_add_flow "test_drop_reason" dropreason \
>> + "in_port(1),eth(),eth_type(0x0800),ipv4(src=172.31.110.10,proto=17),udp(dst=6000)" \
>> + 'drop(42)'
>> + # Drop UDP 7000 traffic with an explicit action with no error code.
>> + ovs_add_flow "test_drop_reason" dropreason \
>> + "in_port(1),eth(),eth_type(0x0800),ipv4(src=172.31.110.10,proto=17),udp(dst=7000)" \
>> + 'drop(0)'
>> +
>> + ovs_drop_record_and_run \
>> + "test_drop_reason" ip netns exec client nc -i 1 -zuv 172.31.110.20 6000
>> + ovs_drop_reason_count 0x30004 # OVS_DROP_EXPLICIT_ACTION_ERROR
>> + if [[ "$?" -ne "1" ]]; then
>> + info "Did not detect expected explicit error drops: $?"
>> + return 1
>> + fi
>> +
>> + ovs_drop_record_and_run \
>> + "test_drop_reason" ip netns exec client nc -i 1 -zuv 172.31.110.20 7000
>> + ovs_drop_reason_count 0x30003 # OVS_DROP_EXPLICIT_ACTION
>> + if [[ "$?" -ne "1" ]]; then
>> + info "Did not detect expected explicit drops: $?"
>> + return 1
>> + fi
>> +
>> return 0
>> }
>>
>> diff --git a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py b/tools/testing/selftests/net/openvswitch/ovs-dpctl.py
>> index 5fee330050c2..912dc8c49085 100644
>> --- a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py
>> +++ b/tools/testing/selftests/net/openvswitch/ovs-dpctl.py
>> @@ -449,7 +449,7 @@ class ovsactions(nla):
>> elif field[0] == "OVS_ACTION_ATTR_TRUNC":
>> print_str += "trunc(%d)" % int(self.get_attr(field[0]))
>> elif field[0] == "OVS_ACTION_ATTR_DROP":
>> - print_str += "drop"
>> + print_str += "drop(%d)" % int(self.get_attr(field[0]))
>> elif field[1] == "flag":
>> if field[0] == "OVS_ACTION_ATTR_CT_CLEAR":
>> print_str += "ct_clear"
>> @@ -471,10 +471,21 @@ class ovsactions(nla):
>> while len(actstr) != 0:
>> parsed = False
>> if actstr.startswith("drop"):
>> - # for now, drops have no explicit action, so we
>> - # don't need to set any attributes. The final
>> - # act of the processing chain will just drop the packet
>> - return
>> + # If no reason is provided, the implicit drop is used (i.e no
>> + # action). If some reason is given, an explicit action is used.
>> + actstr, reason = parse_extract_field(
>> + actstr,
>> + "drop(",
>> + "([0-9]+)",
>> + lambda x: int(x, 0),
>> + False,
>> + None,
>> + )
>> + if reason is not None:
>> + self["attrs"].append(["OVS_ACTION_ATTR_DROP", reason])
>> + parsed = True
>> + else:
>> + return
>>
>> elif parse_starts_block(actstr, "^(\d+)", False, True):
>> actstr, output = parse_extract_field(
>
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [net-next v3 3/7] net: openvswitch: add explicit drop action
2023-08-08 18:10 ` Ilya Maximets
@ 2023-08-09 7:03 ` Adrian Moreno
0 siblings, 0 replies; 22+ messages in thread
From: Adrian Moreno @ 2023-08-09 7:03 UTC (permalink / raw)
To: Ilya Maximets, netdev; +Cc: Eric Garver, aconole, dev
On 8/8/23 20:10, Ilya Maximets wrote:
> On 8/7/23 18:45, Adrian Moreno wrote:
>> From: Eric Garver <eric@garver.life>
>>
>> From: Eric Garver <eric@garver.life>
>>
>> This adds an explicit drop action. This is used by OVS to drop packets
>> for which it cannot determine what to do. An explicit action in the
>> kernel allows passing the reason _why_ the packet is being dropped or
>> zero to indicate no particular error happened (i.e: OVS intentionally
>> dropped the packet).
>>
>> Since the error codes coming from userspace mean nothing for the kernel,
>> we squash all of them into only two drop reasons:
>> - OVS_DROP_EXPLICIT_ACTION_ERROR to indicate a non-zero value was passed
>> - OVS_DROP_EXPLICIT_ACTION to indicate a zero value was passed (no
>> error)
>>
>> e.g. trace all OVS dropped skbs
>>
>> # perf trace -e skb:kfree_skb --filter="reason >= 0x30000"
>> [..]
>> 106.023 ping/2465 skb:kfree_skb(skbaddr: 0xffffa0e8765f2000, \
>> location:0xffffffffc0d9b462, protocol: 2048, reason: 196611)
>>
>> reason: 196611 --> 0x30003 (OVS_DROP_EXPLICIT_ACTION)
>>
>> Signed-off-by: Eric Garver <eric@garver.life>
>> Co-developed-by: Adrian Moreno <amorenoz@redhat.com>
>> Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
>> ---
>> include/uapi/linux/openvswitch.h | 2 ++
>> net/openvswitch/actions.c | 9 +++++++++
>> net/openvswitch/drop.h | 2 ++
>> net/openvswitch/flow_netlink.c | 10 +++++++++-
>> tools/testing/selftests/net/openvswitch/ovs-dpctl.py | 3 +++
>> 5 files changed, 25 insertions(+), 1 deletion(-)
>
> <snip>
>
>> diff --git a/net/openvswitch/drop.h b/net/openvswitch/drop.h
>> index 3cd6489a5a2b..be51ff5039fb 100644
>> --- a/net/openvswitch/drop.h
>> +++ b/net/openvswitch/drop.h
>> @@ -10,6 +10,8 @@
>> #define OVS_DROP_REASONS(R) \
>> R(OVS_DROP_FLOW) \
>> R(OVS_DROP_ACTION_ERROR) \
>> + R(OVS_DROP_EXPLICIT_ACTION) \
>> + R(OVS_DROP_EXPLICIT_ACTION_ERROR) \
>
> These drop reasons are a bit unclear as well. Especially since we
> have OVS_DROP_ACTION_ERROR and OVS_DROP_EXPLICIT_ACTION_ERROR that
> mean completely different things while having similar names.
>
> Maybe remove the 'ACTION' part from these and add a word 'with'?
> E.g. OVS_DROP_EXPLICIT and OVS_DROP_EXPLICIT_WITH_ERROR. I suppose,
> 'WITH' can also be shortened to 'W'. It's fairly obvious that
> explicit drops are caused by the explicit drop action.
>
> What do you think?
Agree: OVS_DROP_EXPLICIT{,_WITH_ERROR} are better names. Thanks!
>
> Best regards, Ilya Maximets.
>
--
Adrián Moreno
^ permalink raw reply [flat|nested] 22+ messages in thread
* Re: [net-next v3 7/7] selftests: openvswitch: add explicit drop testcase
2023-08-09 7:02 ` Adrian Moreno
@ 2023-08-09 15:18 ` Aaron Conole
0 siblings, 0 replies; 22+ messages in thread
From: Aaron Conole @ 2023-08-09 15:18 UTC (permalink / raw)
To: Adrian Moreno; +Cc: netdev, i.maximets, eric, dev
Adrian Moreno <amorenoz@redhat.com> writes:
> On 8/8/23 17:02, Aaron Conole wrote:
>> Adrian Moreno <amorenoz@redhat.com> writes:
>>
>>> Make ovs-dpctl.py support explicit drops as:
>>> "drop" -> implicit empty-action drop
>>> "drop(0)" -> explicit non-error action drop
>> I also suggest a test in netlink_checks to make sure drop can't be
>> followed by additional actions. Something like:
>> 3,drop(0),2
>> which should generate a NL message that has the drop attribute with
>> additional action data following it.
>
> Ack, will do.
>
> The check I've added in flow_netlink.c does not include any custom
> message. Just returning -EINVAL in __ovs_nla_copy_actions() ends up
> printing "Flow actions may not be safe on all matching packets" to
> dmesg. Maybe it's too generic or even misleading in some cases but I
> saw other action verifications do the same so I thought it might be
> kind of expected at this point.
>
> Do you think a custom message (in addition to the generic one) is needed?
I think the message is fine. There could be a bigger effort at some
point to try and do per-attribute rejection messages.
> Thanks.
> --
> Adrián
>
>>
>>> "drop(42)" -> explicit error action drop
>>>
>>> Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
>>> ---
>>> .../selftests/net/openvswitch/openvswitch.sh | 25 +++++++++++++++++++
>>> .../selftests/net/openvswitch/ovs-dpctl.py | 21 ++++++++++++----
>>> 2 files changed, 41 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/tools/testing/selftests/net/openvswitch/openvswitch.sh b/tools/testing/selftests/net/openvswitch/openvswitch.sh
>>> index a10c345f40ef..c568ba1b7900 100755
>>> --- a/tools/testing/selftests/net/openvswitch/openvswitch.sh
>>> +++ b/tools/testing/selftests/net/openvswitch/openvswitch.sh
>>> @@ -217,6 +217,31 @@ test_drop_reason() {
>>> return 1
>>> fi
>>> + # Drop UDP 6000 traffic with an explicit action and an error
>>> code.
>>> + ovs_add_flow "test_drop_reason" dropreason \
>>> + "in_port(1),eth(),eth_type(0x0800),ipv4(src=172.31.110.10,proto=17),udp(dst=6000)" \
>>> + 'drop(42)'
>>> + # Drop UDP 7000 traffic with an explicit action with no error code.
>>> + ovs_add_flow "test_drop_reason" dropreason \
>>> + "in_port(1),eth(),eth_type(0x0800),ipv4(src=172.31.110.10,proto=17),udp(dst=7000)" \
>>> + 'drop(0)'
>>> +
>>> + ovs_drop_record_and_run \
>>> + "test_drop_reason" ip netns exec client nc -i 1 -zuv 172.31.110.20 6000
>>> + ovs_drop_reason_count 0x30004 # OVS_DROP_EXPLICIT_ACTION_ERROR
>>> + if [[ "$?" -ne "1" ]]; then
>>> + info "Did not detect expected explicit error drops: $?"
>>> + return 1
>>> + fi
>>> +
>>> + ovs_drop_record_and_run \
>>> + "test_drop_reason" ip netns exec client nc -i 1 -zuv 172.31.110.20 7000
>>> + ovs_drop_reason_count 0x30003 # OVS_DROP_EXPLICIT_ACTION
>>> + if [[ "$?" -ne "1" ]]; then
>>> + info "Did not detect expected explicit drops: $?"
>>> + return 1
>>> + fi
>>> +
>>> return 0
>>> }
>>> diff --git a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py
>>> b/tools/testing/selftests/net/openvswitch/ovs-dpctl.py
>>> index 5fee330050c2..912dc8c49085 100644
>>> --- a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py
>>> +++ b/tools/testing/selftests/net/openvswitch/ovs-dpctl.py
>>> @@ -449,7 +449,7 @@ class ovsactions(nla):
>>> elif field[0] == "OVS_ACTION_ATTR_TRUNC":
>>> print_str += "trunc(%d)" % int(self.get_attr(field[0]))
>>> elif field[0] == "OVS_ACTION_ATTR_DROP":
>>> - print_str += "drop"
>>> + print_str += "drop(%d)" % int(self.get_attr(field[0]))
>>> elif field[1] == "flag":
>>> if field[0] == "OVS_ACTION_ATTR_CT_CLEAR":
>>> print_str += "ct_clear"
>>> @@ -471,10 +471,21 @@ class ovsactions(nla):
>>> while len(actstr) != 0:
>>> parsed = False
>>> if actstr.startswith("drop"):
>>> - # for now, drops have no explicit action, so we
>>> - # don't need to set any attributes. The final
>>> - # act of the processing chain will just drop the packet
>>> - return
>>> + # If no reason is provided, the implicit drop is used (i.e no
>>> + # action). If some reason is given, an explicit action is used.
>>> + actstr, reason = parse_extract_field(
>>> + actstr,
>>> + "drop(",
>>> + "([0-9]+)",
>>> + lambda x: int(x, 0),
>>> + False,
>>> + None,
>>> + )
>>> + if reason is not None:
>>> + self["attrs"].append(["OVS_ACTION_ATTR_DROP", reason])
>>> + parsed = True
>>> + else:
>>> + return
>>> elif parse_starts_block(actstr, "^(\d+)", False,
>>> True):
>>> actstr, output = parse_extract_field(
>>
^ permalink raw reply [flat|nested] 22+ messages in thread
end of thread, other threads:[~2023-08-09 15:18 UTC | newest]
Thread overview: 22+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-08-07 16:45 [net-next v3 0/7] openvswitch: add drop reasons Adrian Moreno
2023-08-07 16:45 ` [net-next v3 1/7] net: openvswitch: add datapath flow drop reason Adrian Moreno
2023-08-08 14:36 ` Aaron Conole
2023-08-08 18:02 ` Ilya Maximets
2023-08-09 6:47 ` Adrian Moreno
2023-08-07 16:45 ` [net-next v3 2/7] net: openvswitch: add action error " Adrian Moreno
2023-08-08 14:37 ` Aaron Conole
2023-08-07 16:45 ` [net-next v3 3/7] net: openvswitch: add explicit drop action Adrian Moreno
2023-08-08 14:53 ` Aaron Conole
2023-08-09 6:49 ` Adrian Moreno
2023-08-08 18:10 ` Ilya Maximets
2023-08-09 7:03 ` Adrian Moreno
2023-08-07 16:45 ` [net-next v3 4/7] net: openvswitch: add meter drop reason Adrian Moreno
2023-08-08 14:53 ` Aaron Conole
2023-08-07 16:45 ` [net-next v3 5/7] net: openvswitch: add misc error drop reasons Adrian Moreno
2023-08-08 14:56 ` Aaron Conole
2023-08-07 16:45 ` [net-next v3 6/7] selftests: openvswitch: add drop reason testcase Adrian Moreno
2023-08-08 15:04 ` Aaron Conole
2023-08-07 16:45 ` [net-next v3 7/7] selftests: openvswitch: add explicit drop testcase Adrian Moreno
2023-08-08 15:02 ` Aaron Conole
2023-08-09 7:02 ` Adrian Moreno
2023-08-09 15:18 ` Aaron Conole
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).