devlink: Add 'mirror' trap action
authorIdo Schimmel <idosch@mellanox.com>
Fri, 29 May 2020 18:36:39 +0000 (21:36 +0300)
committerDavid S. Miller <davem@davemloft.net>
Mon, 1 Jun 2020 18:49:23 +0000 (11:49 -0700)
The action is used by control traps such as IGMP query. The packet is
flooded by the device, but also trapped to the CPU in order for the
software bridge to mark the receiving port as a multicast router port.
Such packets are marked with 'skb->offload_fwd_mark = 1' in order to
prevent the software bridge from flooding them again.

Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Reviewed-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Documentation/networking/devlink/devlink-trap.rst
include/uapi/linux/devlink.h
net/core/devlink.c

index 4ca241e70064977e970cb1fcf5cc0385da53aa5e..5b97327caefc1f55df4e76694f2d87480080c414 100644 (file)
@@ -108,6 +108,8 @@ The ``devlink-trap`` mechanism supports the following packet trap actions:
   * ``trap``: The sole copy of the packet is sent to the CPU.
   * ``drop``: The packet is dropped by the underlying device and a copy is not
     sent to the CPU.
+  * ``mirror``: The packet is forwarded by the underlying device and a copy is
+    sent to the CPU.
 
 Generic Packet Traps
 ====================
index 1ae90e06c06d7f13018736bd60428d997b0c9218..16305932a9507f4ed9cbe6d4ed940513b3a5cb46 100644 (file)
@@ -233,10 +233,13 @@ enum {
  * @DEVLINK_TRAP_ACTION_DROP: Packet is dropped by the device and a copy is not
  *                            sent to the CPU.
  * @DEVLINK_TRAP_ACTION_TRAP: The sole copy of the packet is sent to the CPU.
+ * @DEVLINK_TRAP_ACTION_MIRROR: Packet is forwarded by the device and a copy is
+ *                              sent to the CPU.
  */
 enum devlink_trap_action {
        DEVLINK_TRAP_ACTION_DROP,
        DEVLINK_TRAP_ACTION_TRAP,
+       DEVLINK_TRAP_ACTION_MIRROR,
 };
 
 /**
index d9fff7083f0238c3099a6811410d48a88863645f..d6298917b0771560ece7cf43b25b36ccb65d8b1b 100644 (file)
@@ -5869,7 +5869,8 @@ devlink_trap_action_get_from_info(struct genl_info *info,
        val = nla_get_u8(info->attrs[DEVLINK_ATTR_TRAP_ACTION]);
        switch (val) {
        case DEVLINK_TRAP_ACTION_DROP: /* fall-through */
-       case DEVLINK_TRAP_ACTION_TRAP:
+       case DEVLINK_TRAP_ACTION_TRAP: /* fall-through */
+       case DEVLINK_TRAP_ACTION_MIRROR:
                *p_trap_action = val;
                break;
        default: