mlxsw: spectrum: Add traps needed for router implementation
authorJiri Pirko <jiri@mellanox.com>
Sat, 2 Jul 2016 09:00:20 +0000 (11:00 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sat, 2 Jul 2016 19:21:18 +0000 (15:21 -0400)
ip2me:
To instruct HW to send trapped ip2me traffic to kernel, we have to add
this trap. Selection ip2me traffic is introduced later on in this set.

ARPs:
We are going to stop flooding to CPU port when netdev isn't bridged and
only get packets destined to the netdev's IP address and certain control
packets.

Add traps for ARP request (broadcast) and response (unicast) in order to
get these to the CPU and resolve neighbours.

host miss:
If a packet is routed through a directly connected route and its
destination IP is not in the device's neighbour table, then we need to
trap it to CPU. This will cause the host to resolve the MAC of the
neighbour, which will be eventually programmed to the device's table.

router ingress:
In order to trap packets in router part.

Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/spectrum.c
drivers/net/ethernet/mellanox/mlxsw/trap.h

index de30763e1999e8d0c9bc5d2287c1cef01e452aeb..f0799898817d369963fa8a275340ec08a3b880fe 100644 (file)
@@ -2255,6 +2255,31 @@ static const struct mlxsw_rx_listener mlxsw_sp_rx_listener[] = {
                .local_port = MLXSW_PORT_DONT_CARE,
                .trap_id = MLXSW_TRAP_ID_IGMP_V3_REPORT,
        },
+       {
+               .func = mlxsw_sp_rx_listener_func,
+               .local_port = MLXSW_PORT_DONT_CARE,
+               .trap_id = MLXSW_TRAP_ID_ARPBC,
+       },
+       {
+               .func = mlxsw_sp_rx_listener_func,
+               .local_port = MLXSW_PORT_DONT_CARE,
+               .trap_id = MLXSW_TRAP_ID_ARPUC,
+       },
+       {
+               .func = mlxsw_sp_rx_listener_func,
+               .local_port = MLXSW_PORT_DONT_CARE,
+               .trap_id = MLXSW_TRAP_ID_IP2ME,
+       },
+       {
+               .func = mlxsw_sp_rx_listener_func,
+               .local_port = MLXSW_PORT_DONT_CARE,
+               .trap_id = MLXSW_TRAP_ID_RTR_INGRESS0,
+       },
+       {
+               .func = mlxsw_sp_rx_listener_func,
+               .local_port = MLXSW_PORT_DONT_CARE,
+               .trap_id = MLXSW_TRAP_ID_HOST_MISS_IPV4,
+       },
 };
 
 static int mlxsw_sp_traps_init(struct mlxsw_sp *mlxsw_sp)
index 53a9550be75e624cd9bcd322e702519cea05f38d..470d7696e9fede42f46ea74adcd6b764d8ca3748 100644 (file)
@@ -54,6 +54,11 @@ enum {
        MLXSW_TRAP_ID_IGMP_V2_REPORT = 0x32,
        MLXSW_TRAP_ID_IGMP_V2_LEAVE = 0x33,
        MLXSW_TRAP_ID_IGMP_V3_REPORT = 0x34,
+       MLXSW_TRAP_ID_ARPBC = 0x50,
+       MLXSW_TRAP_ID_ARPUC = 0x51,
+       MLXSW_TRAP_ID_IP2ME = 0x5F,
+       MLXSW_TRAP_ID_RTR_INGRESS0 = 0x70,
+       MLXSW_TRAP_ID_HOST_MISS_IPV4 = 0x90,
 
        MLXSW_TRAP_ID_MAX = 0x1FF
 };