From 73ef239cd8439b33273cd95d08cffaf8022b01a8 Mon Sep 17 00:00:00 2001 From: Oleksandr Mazur Date: Mon, 22 Aug 2022 21:03:15 +0300 Subject: net: marvell: prestera: implement br_port_locked flag offloading Both br_port_locked and interfaces's flag offloading is supported. No new ABI is being added, rather existing (port_param_set) API call gets extended. Signed-off-by: Oleksandr Mazur V2: add missing receipents (linux-kernel, netdev) Signed-off-by: David S. Miller --- drivers/net/ethernet/marvell/prestera/prestera.h | 2 ++ 1 file changed, 2 insertions(+) (limited to 'drivers/net/ethernet/marvell/prestera/prestera.h') diff --git a/drivers/net/ethernet/marvell/prestera/prestera.h b/drivers/net/ethernet/marvell/prestera/prestera.h index 2f84d0fb4094..e5a4381a88b3 100644 --- a/drivers/net/ethernet/marvell/prestera/prestera.h +++ b/drivers/net/ethernet/marvell/prestera/prestera.h @@ -367,6 +367,8 @@ int prestera_port_learning_set(struct prestera_port *port, bool learn_enable); int prestera_port_uc_flood_set(struct prestera_port *port, bool flood); int prestera_port_mc_flood_set(struct prestera_port *port, bool flood); +int prestera_port_br_locked_set(struct prestera_port *port, bool br_locked); + int prestera_port_pvid_set(struct prestera_port *port, u16 vid); bool prestera_netdev_check(const struct net_device *dev); -- cgit From 0a23ae23717156f1cebb8dbc3ad68765765d7bd7 Mon Sep 17 00:00:00 2001 From: Yevhen Orlov Date: Sat, 1 Oct 2022 12:34:09 +0300 Subject: net: marvell: prestera: Add router nexthops ABI - Add functions to allocate/delete/set nexthop group - NOTE: non-ECMP nexthop is nexthop group with allocated size = 1 - Add function to read state of HW nh (if packets going through it) Co-developed-by: Taras Chornyi Signed-off-by: Taras Chornyi Co-developed-by: Oleksandr Mazur Signed-off-by: Oleksandr Mazur Signed-off-by: Yevhen Orlov Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/marvell/prestera/prestera.h | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'drivers/net/ethernet/marvell/prestera/prestera.h') diff --git a/drivers/net/ethernet/marvell/prestera/prestera.h b/drivers/net/ethernet/marvell/prestera/prestera.h index e5a4381a88b3..903e2e13e687 100644 --- a/drivers/net/ethernet/marvell/prestera/prestera.h +++ b/drivers/net/ethernet/marvell/prestera/prestera.h @@ -306,17 +306,22 @@ struct prestera_switch { struct prestera_counter *counter; u8 lag_member_max; u8 lag_max; + u32 size_tbl_router_nexthop; }; struct prestera_router { struct prestera_switch *sw; struct list_head vr_list; struct list_head rif_entry_list; + struct rhashtable nh_neigh_ht; + struct rhashtable nexthop_group_ht; struct rhashtable fib_ht; struct rhashtable kern_fib_cache_ht; struct notifier_block inetaddr_nb; struct notifier_block inetaddr_valid_nb; struct notifier_block fib_nb; + u8 *nhgrp_hw_state_cache; /* Bitmap cached hw state of nhs */ + unsigned long nhgrp_hw_cache_kick; /* jiffies */ }; struct prestera_rxtx_params { -- cgit From 90b6f9c098512b72b77028893e42f60316409fb1 Mon Sep 17 00:00:00 2001 From: Yevhen Orlov Date: Sat, 1 Oct 2022 12:34:12 +0300 Subject: net: marvell: prestera: add delayed wq and flush wq on deinit Flushing workqueues ensures, that no more pending works, related to just unregistered or deinitialized notifiers. After that we can free memory. Delayed wq will be used for neighbours in next patches. Co-developed-by: Taras Chornyi Signed-off-by: Taras Chornyi Co-developed-by: Oleksandr Mazur Signed-off-by: Oleksandr Mazur Signed-off-by: Yevhen Orlov Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/marvell/prestera/prestera.h | 2 ++ 1 file changed, 2 insertions(+) (limited to 'drivers/net/ethernet/marvell/prestera/prestera.h') diff --git a/drivers/net/ethernet/marvell/prestera/prestera.h b/drivers/net/ethernet/marvell/prestera/prestera.h index 903e2e13e687..fe0d6001a6b6 100644 --- a/drivers/net/ethernet/marvell/prestera/prestera.h +++ b/drivers/net/ethernet/marvell/prestera/prestera.h @@ -367,6 +367,8 @@ int prestera_port_cfg_mac_write(struct prestera_port *port, struct prestera_port *prestera_port_dev_lower_find(struct net_device *dev); void prestera_queue_work(struct work_struct *work); +void prestera_queue_delayed_work(struct delayed_work *work, unsigned long delay); +void prestera_queue_drain(void); int prestera_port_learning_set(struct prestera_port *port, bool learn_enable); int prestera_port_uc_flood_set(struct prestera_port *port, bool flood); -- cgit From 8b1ef4911a41c18df730eb913129f4259a98dab9 Mon Sep 17 00:00:00 2001 From: Yevhen Orlov Date: Sat, 1 Oct 2022 12:34:15 +0300 Subject: net: marvell: prestera: add stub handler neighbour events Actual handler will be added in next patches Co-developed-by: Taras Chornyi Signed-off-by: Taras Chornyi Co-developed-by: Oleksandr Mazur Signed-off-by: Oleksandr Mazur Signed-off-by: Yevhen Orlov Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/marvell/prestera/prestera.h | 1 + 1 file changed, 1 insertion(+) (limited to 'drivers/net/ethernet/marvell/prestera/prestera.h') diff --git a/drivers/net/ethernet/marvell/prestera/prestera.h b/drivers/net/ethernet/marvell/prestera/prestera.h index fe0d6001a6b6..2f2f80e7e358 100644 --- a/drivers/net/ethernet/marvell/prestera/prestera.h +++ b/drivers/net/ethernet/marvell/prestera/prestera.h @@ -320,6 +320,7 @@ struct prestera_router { struct notifier_block inetaddr_nb; struct notifier_block inetaddr_valid_nb; struct notifier_block fib_nb; + struct notifier_block netevent_nb; u8 *nhgrp_hw_state_cache; /* Bitmap cached hw state of nhs */ unsigned long nhgrp_hw_cache_kick; /* jiffies */ }; -- cgit From 396b80cb5cc8006a488ea25ef84fae245dc1b43c Mon Sep 17 00:00:00 2001 From: Yevhen Orlov Date: Sat, 1 Oct 2022 12:34:16 +0300 Subject: net: marvell: prestera: Add neighbour cache accounting Move forward and use new PRESTERA_FIB_TYPE_UC_NH to provide basic nexthop routes support. Provide deinitialization sequence for all created router objects. Limitations: - Only "local" and "main" tables supported - Only generic interfaces supported for router (no bridges or vlans) Co-developed-by: Taras Chornyi Signed-off-by: Taras Chornyi Co-developed-by: Oleksandr Mazur Signed-off-by: Oleksandr Mazur Signed-off-by: Yevhen Orlov Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/marvell/prestera/prestera.h | 1 + 1 file changed, 1 insertion(+) (limited to 'drivers/net/ethernet/marvell/prestera/prestera.h') diff --git a/drivers/net/ethernet/marvell/prestera/prestera.h b/drivers/net/ethernet/marvell/prestera/prestera.h index 2f2f80e7e358..540a36069b79 100644 --- a/drivers/net/ethernet/marvell/prestera/prestera.h +++ b/drivers/net/ethernet/marvell/prestera/prestera.h @@ -316,6 +316,7 @@ struct prestera_router { struct rhashtable nh_neigh_ht; struct rhashtable nexthop_group_ht; struct rhashtable fib_ht; + struct rhashtable kern_neigh_cache_ht; struct rhashtable kern_fib_cache_ht; struct notifier_block inetaddr_nb; struct notifier_block inetaddr_valid_nb; -- cgit From ae15ed6e40c9623e3a295a76cb164b4d3564a20b Mon Sep 17 00:00:00 2001 From: Yevhen Orlov Date: Sat, 1 Oct 2022 12:34:17 +0300 Subject: net: marvell: prestera: Propagate nh state from hw to kernel We poll nexthops in HW and call for each active nexthop appropriate neighbour. Also we provide implicity neighbour resolving. For example, user have added nexthop route: # ip route add 5.5.5.5 via 1.1.1.2 But neighbour 1.1.1.2 doesn't exist. In this case we will try to call neigh_event_send, even if there is no traffic. This is useful, when you have add route, which will be used after some time but with a lot of traffic (burst). So, we has prepared, offloaded route in advance. Co-developed-by: Taras Chornyi Signed-off-by: Taras Chornyi Co-developed-by: Oleksandr Mazur Signed-off-by: Oleksandr Mazur Signed-off-by: Yevhen Orlov Signed-off-by: Jakub Kicinski --- drivers/net/ethernet/marvell/prestera/prestera.h | 3 +++ 1 file changed, 3 insertions(+) (limited to 'drivers/net/ethernet/marvell/prestera/prestera.h') diff --git a/drivers/net/ethernet/marvell/prestera/prestera.h b/drivers/net/ethernet/marvell/prestera/prestera.h index 540a36069b79..35554ee805cd 100644 --- a/drivers/net/ethernet/marvell/prestera/prestera.h +++ b/drivers/net/ethernet/marvell/prestera/prestera.h @@ -324,6 +324,9 @@ struct prestera_router { struct notifier_block netevent_nb; u8 *nhgrp_hw_state_cache; /* Bitmap cached hw state of nhs */ unsigned long nhgrp_hw_cache_kick; /* jiffies */ + struct { + struct delayed_work dw; + } neighs_update; }; struct prestera_rxtx_params { -- cgit