Lines Matching full:router

474 	u16 id; /* virtual router ID */
514 const struct mlxsw_sp_router_ll_ops *ll_ops = mlxsw_sp->router->proto_ll_ops[proto]; in mlxsw_sp_fib_create()
523 lpm_tree = mlxsw_sp->router->lpm.proto_trees[proto]; in mlxsw_sp_fib_create()
564 for (i = 0; i < mlxsw_sp->router->lpm.tree_count; i++) { in mlxsw_sp_lpm_tree_find_unused()
565 lpm_tree = &mlxsw_sp->router->lpm.trees[i]; in mlxsw_sp_lpm_tree_find_unused()
665 const struct mlxsw_sp_router_ll_ops *ll_ops = mlxsw_sp->router->proto_ll_ops[proto]; in mlxsw_sp_lpm_tree_get()
669 for (i = 0; i < mlxsw_sp->router->lpm.tree_count; i++) { in mlxsw_sp_lpm_tree_get()
670 lpm_tree = &mlxsw_sp->router->lpm.trees[i]; in mlxsw_sp_lpm_tree_get()
691 mlxsw_sp->router->proto_ll_ops[lpm_tree->proto]; in mlxsw_sp_lpm_tree_put()
710 mlxsw_sp->router->lpm.tree_count = max_trees - MLXSW_SP_LPM_TREE_MIN; in mlxsw_sp_lpm_init()
711 mlxsw_sp->router->lpm.trees = kcalloc(mlxsw_sp->router->lpm.tree_count, in mlxsw_sp_lpm_init()
714 if (!mlxsw_sp->router->lpm.trees) in mlxsw_sp_lpm_init()
717 for (i = 0; i < mlxsw_sp->router->lpm.tree_count; i++) { in mlxsw_sp_lpm_init()
718 lpm_tree = &mlxsw_sp->router->lpm.trees[i]; in mlxsw_sp_lpm_init()
728 mlxsw_sp->router->lpm.proto_trees[MLXSW_SP_L3_PROTO_IPV4] = lpm_tree; in mlxsw_sp_lpm_init()
736 mlxsw_sp->router->lpm.proto_trees[MLXSW_SP_L3_PROTO_IPV6] = lpm_tree; in mlxsw_sp_lpm_init()
741 lpm_tree = mlxsw_sp->router->lpm.proto_trees[MLXSW_SP_L3_PROTO_IPV4]; in mlxsw_sp_lpm_init()
744 kfree(mlxsw_sp->router->lpm.trees); in mlxsw_sp_lpm_init()
752 lpm_tree = mlxsw_sp->router->lpm.proto_trees[MLXSW_SP_L3_PROTO_IPV6]; in mlxsw_sp_lpm_fini()
755 lpm_tree = mlxsw_sp->router->lpm.proto_trees[MLXSW_SP_L3_PROTO_IPV4]; in mlxsw_sp_lpm_fini()
758 kfree(mlxsw_sp->router->lpm.trees); in mlxsw_sp_lpm_fini()
774 vr = &mlxsw_sp->router->vrs[i]; in mlxsw_sp_vr_find_unused()
820 vr = &mlxsw_sp->router->vrs[i]; in mlxsw_sp_vr_find()
833 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_router_tb_id_vr_id()
841 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_router_tb_id_vr_id()
987 old_tree = mlxsw_sp->router->lpm.proto_trees[proto]; in mlxsw_sp_vrs_lpm_tree_replace()
991 vr = &mlxsw_sp->router->vrs[i]; in mlxsw_sp_vrs_lpm_tree_replace()
1003 mlxsw_sp->router->lpm.proto_trees[proto] = new_tree; in mlxsw_sp_vrs_lpm_tree_replace()
1029 mlxsw_sp->router->vrs = kcalloc(max_vrs, sizeof(struct mlxsw_sp_vr), in mlxsw_sp_vrs_init()
1031 if (!mlxsw_sp->router->vrs) in mlxsw_sp_vrs_init()
1035 vr = &mlxsw_sp->router->vrs[i]; in mlxsw_sp_vrs_init()
1055 kfree(mlxsw_sp->router->vrs); in mlxsw_sp_vrs_fini()
1098 ipip_ops = mlxsw_sp->router->ipip_ops_arr[ipipt]; in mlxsw_sp_ipip_ol_ipip_lb_create()
1120 ipip_ops = mlxsw_sp->router->ipip_ops_arr[ipipt]; in mlxsw_sp_ipip_entry_alloc()
1169 if (mlxsw_sp->router->ipip_ops_arr[ipipt]->ul_proto != ul_proto) in mlxsw_sp_ipip_entry_saddr_matches()
1294 ipip_ops = mlxsw_sp->router->ipip_ops_arr[ipip_entry->ipipt]; in mlxsw_sp_ipip_entry_find_decap()
1338 &mlxsw_sp->router->ipip_list); in mlxsw_sp_ipip_entry_create()
1361 if (mlxsw_sp->router->ipip_ops_arr[ipipt]->ul_proto != ul_proto) in mlxsw_sp_ipip_entry_matches_decap()
1383 list_for_each_entry(ipip_entry, &mlxsw_sp->router->ipip_list, in mlxsw_sp_ipip_entry_find_by_decap()
1403 struct mlxsw_sp_router *router = mlxsw_sp->router; in mlxsw_sp_netdev_ipip_type() local
1408 ipip_ops = router->ipip_ops_arr[ipipt]; in mlxsw_sp_netdev_ipip_type()
1430 list_for_each_entry(ipip_entry, &mlxsw_sp->router->ipip_list, in mlxsw_sp_ipip_entry_find_by_ol_dev()
1445 ipip_entry = list_prepare_entry(start, &mlxsw_sp->router->ipip_list, in mlxsw_sp_ipip_entry_find_by_ul_dev()
1447 list_for_each_entry_continue(ipip_entry, &mlxsw_sp->router->ipip_list, in mlxsw_sp_ipip_entry_find_by_ul_dev()
1468 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_netdev_is_ipip_ul()
1470 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_netdev_is_ipip_ul()
1480 = mlxsw_sp->router->ipip_ops_arr[ipipt]; in mlxsw_sp_netdevice_ipip_can_offload()
1497 ul_proto = mlxsw_sp->router->ipip_ops_arr[ipipt]->ul_proto; in mlxsw_sp_netdevice_ipip_ol_reg_event()
1717 ul_proto = mlxsw_sp->router->ipip_ops_arr[ipip_entry->ipipt]->ul_proto; in mlxsw_sp_netdevice_ipip_ul_vrf_event()
1776 ipip_ops = mlxsw_sp->router->ipip_ops_arr[ipip_entry->ipipt]; in mlxsw_sp_netdevice_ipip_ol_change_event()
1806 list_for_each_entry_safe(ipip_entry, tmp, &mlxsw_sp->router->ipip_list, in mlxsw_sp_ipip_demote_tunnel_by_saddr()
1824 list_for_each_entry_safe(ipip_entry, tmp, &mlxsw_sp->router->ipip_list, in mlxsw_sp_ipip_demote_tunnel_by_ul_netdev()
1846 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_netdevice_ipip_ol_event()
1877 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_netdevice_ipip_ol_event()
1924 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_netdevice_ipip_ul_event()
1942 &mlxsw_sp->router->ipip_list)) in mlxsw_sp_netdevice_ipip_ul_event()
1954 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_netdevice_ipip_ul_event()
1965 struct mlxsw_sp_router *router = mlxsw_sp->router; in mlxsw_sp_router_nve_promote_decap() local
1969 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_router_nve_promote_decap()
1971 if (WARN_ON_ONCE(router->nve_decap_config.valid)) { in mlxsw_sp_router_nve_promote_decap()
1976 router->nve_decap_config.ul_tb_id = ul_tb_id; in mlxsw_sp_router_nve_promote_decap()
1977 router->nve_decap_config.tunnel_index = tunnel_index; in mlxsw_sp_router_nve_promote_decap()
1978 router->nve_decap_config.ul_proto = ul_proto; in mlxsw_sp_router_nve_promote_decap()
1979 router->nve_decap_config.ul_sip = *ul_sip; in mlxsw_sp_router_nve_promote_decap()
1980 router->nve_decap_config.valid = true; in mlxsw_sp_router_nve_promote_decap()
2004 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_router_nve_promote_decap()
2013 struct mlxsw_sp_router *router = mlxsw_sp->router; in mlxsw_sp_router_nve_demote_decap() local
2016 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_router_nve_demote_decap()
2018 if (WARN_ON_ONCE(!router->nve_decap_config.valid)) in mlxsw_sp_router_nve_demote_decap()
2021 router->nve_decap_config.valid = false; in mlxsw_sp_router_nve_demote_decap()
2032 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_router_nve_demote_decap()
2040 struct mlxsw_sp_router *router = mlxsw_sp->router; in mlxsw_sp_router_nve_is_decap() local
2042 return router->nve_decap_config.valid && in mlxsw_sp_router_nve_is_decap()
2043 router->nve_decap_config.ul_tb_id == ul_tb_id && in mlxsw_sp_router_nve_is_decap()
2044 router->nve_decap_config.ul_proto == ul_proto && in mlxsw_sp_router_nve_is_decap()
2045 !memcmp(&router->nve_decap_config.ul_sip, ul_sip, in mlxsw_sp_router_nve_is_decap()
2156 return rhashtable_insert_fast(&mlxsw_sp->router->neigh_ht, in mlxsw_sp_neigh_entry_insert()
2165 rhashtable_remove_fast(&mlxsw_sp->router->neigh_ht, in mlxsw_sp_neigh_entry_remove()
2262 return rhashtable_lookup_fast(&mlxsw_sp->router->neigh_ht, in mlxsw_sp_neigh_entry_lookup()
2278 mlxsw_sp->router->neighs_update.interval = jiffies_to_msecs(interval); in mlxsw_sp_router_neighs_update_interval_init()
2296 if (!mlxsw_sp->router->rifs[rif]) { in mlxsw_sp_router_neigh_ent_ipv4_process()
2302 dev = mlxsw_sp->router->rifs[rif]->dev; in mlxsw_sp_router_neigh_ent_ipv4_process()
2325 if (!mlxsw_sp->router->rifs[rif]) { in mlxsw_sp_router_neigh_ent_ipv6_process()
2330 dev = mlxsw_sp->router->rifs[rif]->dev; in mlxsw_sp_router_neigh_ent_ipv6_process()
2423 mutex_lock(&mlxsw_sp->router->lock); in __mlxsw_sp_router_neighs_update_rauhtd()
2437 mutex_unlock(&mlxsw_sp->router->lock); in __mlxsw_sp_router_neighs_update_rauhtd()
2468 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_router_neighs_update_nh()
2469 list_for_each_entry(neigh_entry, &mlxsw_sp->router->nexthop_neighs_list, in mlxsw_sp_router_neighs_update_nh()
2475 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_router_neighs_update_nh()
2481 unsigned long interval = mlxsw_sp->router->neighs_update.interval; in mlxsw_sp_router_neighs_update_work_schedule()
2483 mlxsw_core_schedule_dw(&mlxsw_sp->router->neighs_update.dw, in mlxsw_sp_router_neighs_update_work_schedule()
2489 struct mlxsw_sp_router *router; in mlxsw_sp_router_neighs_update_work() local
2492 router = container_of(work, struct mlxsw_sp_router, in mlxsw_sp_router_neighs_update_work()
2494 err = mlxsw_sp_router_neighs_update_rauhtd(router->mlxsw_sp); in mlxsw_sp_router_neighs_update_work()
2496 dev_err(router->mlxsw_sp->bus_info->dev, "Could not update kernel for neigh activity"); in mlxsw_sp_router_neighs_update_work()
2498 mlxsw_sp_router_neighs_update_nh(router->mlxsw_sp); in mlxsw_sp_router_neighs_update_work()
2500 mlxsw_sp_router_neighs_update_work_schedule(router->mlxsw_sp); in mlxsw_sp_router_neighs_update_work()
2506 struct mlxsw_sp_router *router; in mlxsw_sp_router_probe_unresolved_nexthops() local
2508 router = container_of(work, struct mlxsw_sp_router, in mlxsw_sp_router_probe_unresolved_nexthops()
2516 mutex_lock(&router->lock); in mlxsw_sp_router_probe_unresolved_nexthops()
2517 list_for_each_entry(neigh_entry, &router->nexthop_neighs_list, in mlxsw_sp_router_probe_unresolved_nexthops()
2521 mutex_unlock(&router->lock); in mlxsw_sp_router_probe_unresolved_nexthops()
2523 mlxsw_core_schedule_dw(&router->nexthop_probe_dw, in mlxsw_sp_router_probe_unresolved_nexthops()
2659 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_router_neigh_event_work()
2685 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_router_neigh_event_work()
2719 struct mlxsw_sp_router *router; in mlxsw_sp_router_schedule_work() local
2721 router = container_of(nb, struct mlxsw_sp_router, netevent_nb); in mlxsw_sp_router_schedule_work()
2722 if (!net_eq(net, mlxsw_sp_net(router->mlxsw_sp))) in mlxsw_sp_router_schedule_work()
2730 net_work->mlxsw_sp = router->mlxsw_sp; in mlxsw_sp_router_schedule_work()
2763 mlxsw_sp->router->neighs_update.interval = interval; in mlxsw_sp_router_netevent_event()
2812 err = rhashtable_init(&mlxsw_sp->router->neigh_ht, in mlxsw_sp_neigh_init()
2823 INIT_DELAYED_WORK(&mlxsw_sp->router->neighs_update.dw, in mlxsw_sp_neigh_init()
2825 INIT_DELAYED_WORK(&mlxsw_sp->router->nexthop_probe_dw, in mlxsw_sp_neigh_init()
2827 mlxsw_core_schedule_dw(&mlxsw_sp->router->neighs_update.dw, 0); in mlxsw_sp_neigh_init()
2828 mlxsw_core_schedule_dw(&mlxsw_sp->router->nexthop_probe_dw, 0); in mlxsw_sp_neigh_init()
2834 cancel_delayed_work_sync(&mlxsw_sp->router->neighs_update.dw); in mlxsw_sp_neigh_fini()
2835 cancel_delayed_work_sync(&mlxsw_sp->router->nexthop_probe_dw); in mlxsw_sp_neigh_fini()
2836 rhashtable_destroy(&mlxsw_sp->router->neigh_ht); in mlxsw_sp_neigh_fini()
2989 struct mlxsw_sp_nexthop *mlxsw_sp_nexthop_next(struct mlxsw_sp_router *router, in mlxsw_sp_nexthop_next() argument
2993 if (list_empty(&router->nexthop_list)) in mlxsw_sp_nexthop_next()
2996 return list_first_entry(&router->nexthop_list, in mlxsw_sp_nexthop_next()
2999 if (list_is_last(&nh->router_list_node, &router->nexthop_list)) in mlxsw_sp_nexthop_next()
3306 return rhashtable_insert_fast(&mlxsw_sp->router->nexthop_group_ht, in mlxsw_sp_nexthop_group_insert()
3318 rhashtable_remove_fast(&mlxsw_sp->router->nexthop_group_ht, in mlxsw_sp_nexthop_group_remove()
3331 return rhashtable_lookup_fast(&mlxsw_sp->router->nexthop_group_ht, in mlxsw_sp_nexthop4_group_lookup()
3344 return rhashtable_lookup_fast(&mlxsw_sp->router->nexthop_group_ht, in mlxsw_sp_nexthop6_group_lookup()
3358 return rhashtable_insert_fast(&mlxsw_sp->router->nexthop_ht, in mlxsw_sp_nexthop_insert()
3365 rhashtable_remove_fast(&mlxsw_sp->router->nexthop_ht, &nh->ht_node, in mlxsw_sp_nexthop_remove()
3373 return rhashtable_lookup_fast(&mlxsw_sp->router->nexthop_ht, &key, in mlxsw_sp_nexthop_lookup()
3434 mlxsw_sp->router->lb_rif_index; in __mlxsw_sp_nexthop_eth_update()
3489 ipip_ops = mlxsw_sp->router->ipip_ops_arr[nh->ipip_entry->ipipt]; in __mlxsw_sp_nexthop_ipip_update()
3609 for (i = 0; i < mlxsw_sp->router->adj_grp_size_ranges_count; i++) { in mlxsw_sp_adj_grp_size_round_up()
3612 size_range = &mlxsw_sp->router->adj_grp_size_ranges[i]; in mlxsw_sp_adj_grp_size_round_up()
3631 for (i = mlxsw_sp->router->adj_grp_size_ranges_count - 1; i >= 0; i--) { in mlxsw_sp_adj_grp_size_round_down()
3634 size_range = &mlxsw_sp->router->adj_grp_size_ranges[i]; in mlxsw_sp_adj_grp_size_round_down()
4106 &mlxsw_sp->router->nexthop_neighs_list); in mlxsw_sp_nexthop_neigh_init()
4211 ipip_ops = mlxsw_sp->router->ipip_ops_arr[ipip_entry->ipipt]; in mlxsw_sp_nexthop_type_init()
4274 list_add_tail(&nh->router_list_node, &mlxsw_sp->router->nexthop_list); in mlxsw_sp_nexthop4_init()
4431 mlxsw_core_schedule_dw(&mlxsw_sp->router->nh_grp_activity_dw, in mlxsw_sp_nh_grp_activity_work_schedule()
4438 struct mlxsw_sp_router *router; in mlxsw_sp_nh_grp_activity_work() local
4441 router = container_of(work, struct mlxsw_sp_router, in mlxsw_sp_nh_grp_activity_work()
4444 mutex_lock(&router->lock); in mlxsw_sp_nh_grp_activity_work()
4446 list_for_each_entry(nhgi, &router->nh_res_grp_list, list) { in mlxsw_sp_nh_grp_activity_work()
4447 mlxsw_sp_nh_grp_activity_update(router->mlxsw_sp, nhgi->nh_grp); in mlxsw_sp_nh_grp_activity_work()
4451 mutex_unlock(&router->lock); in mlxsw_sp_nh_grp_activity_work()
4455 mlxsw_sp_nh_grp_activity_work_schedule(router->mlxsw_sp); in mlxsw_sp_nh_grp_activity_work()
4538 for (i = 0; i < mlxsw_sp->router->adj_grp_size_ranges_count; i++) { in mlxsw_sp_nexthop_obj_res_group_size_validate()
4541 size_range = &mlxsw_sp->router->adj_grp_size_ranges[i]; in mlxsw_sp_nexthop_obj_res_group_size_validate()
4650 u16 lb_rif_index = mlxsw_sp->router->lb_rif_index; in mlxsw_sp_nexthop_obj_blackhole_init()
4658 nh->rif = mlxsw_sp->router->rifs[lb_rif_index]; in mlxsw_sp_nexthop_obj_blackhole_init()
4694 list_add_tail(&nh->router_list_node, &mlxsw_sp->router->nexthop_list); in mlxsw_sp_nexthop_obj_init()
4803 if (list_empty(&mlxsw_sp->router->nh_res_grp_list)) in mlxsw_sp_nexthop_obj_group_info_init()
4805 list_add(&nhgi->list, &mlxsw_sp->router->nh_res_grp_list); in mlxsw_sp_nexthop_obj_group_info_init()
4826 struct mlxsw_sp_router *router = mlxsw_sp->router; in mlxsw_sp_nexthop_obj_group_info_fini() local
4831 if (list_empty(&mlxsw_sp->router->nh_res_grp_list)) in mlxsw_sp_nexthop_obj_group_info_fini()
4832 cancel_delayed_work(&router->nh_grp_activity_dw); in mlxsw_sp_nexthop_obj_group_info_fini()
4899 return rhashtable_lookup_fast(&mlxsw_sp->router->nexthop_group_ht, in mlxsw_sp_nexthop_obj_group_lookup()
5161 struct mlxsw_sp_router *router; in mlxsw_sp_nexthop_obj_event() local
5164 router = container_of(nb, struct mlxsw_sp_router, nexthop_nb); in mlxsw_sp_nexthop_obj_event()
5165 err = mlxsw_sp_nexthop_obj_validate(router->mlxsw_sp, event, info); in mlxsw_sp_nexthop_obj_event()
5169 mutex_lock(&router->lock); in mlxsw_sp_nexthop_obj_event()
5173 err = mlxsw_sp_nexthop_obj_new(router->mlxsw_sp, info); in mlxsw_sp_nexthop_obj_event()
5176 mlxsw_sp_nexthop_obj_del(router->mlxsw_sp, info); in mlxsw_sp_nexthop_obj_event()
5179 err = mlxsw_sp_nexthop_obj_bucket_replace(router->mlxsw_sp, in mlxsw_sp_nexthop_obj_event()
5186 mutex_unlock(&router->lock); in mlxsw_sp_nexthop_obj_event()
5734 if (mlxsw_sp->router->adj_discard_index_valid) in mlxsw_sp_adj_discard_write()
5738 &mlxsw_sp->router->adj_discard_index); in mlxsw_sp_adj_discard_write()
5745 mlxsw_sp->router->adj_discard_index, in mlxsw_sp_adj_discard_write()
5746 mlxsw_sp->router->lb_rif_index); in mlxsw_sp_adj_discard_write()
5753 mlxsw_sp->router->adj_discard_index_valid = true; in mlxsw_sp_adj_discard_write()
5759 mlxsw_sp->router->adj_discard_index); in mlxsw_sp_adj_discard_write()
5790 adjacency_index = mlxsw_sp->router->adj_discard_index; in mlxsw_sp_fib_entry_op_remote()
5885 ipip_ops = mlxsw_sp->router->ipip_ops_arr[ipip_entry->ipipt]; in mlxsw_sp_fib_entry_op_ipip_decap()
5962 struct mlxsw_sp_fib_entry_op_ctx *op_ctx = mlxsw_sp->router->ll_op_ctx; in mlxsw_sp_fib_entry_update()
5987 struct mlxsw_sp_router *router = mlxsw_sp->router; in mlxsw_sp_fib4_entry_type_set() local
6007 tunnel_index = router->nve_decap_config.tunnel_index; in mlxsw_sp_fib4_entry_type_set()
6214 lpm_tree = mlxsw_sp->router->lpm.proto_trees[fib->proto]; in mlxsw_sp_fib_lpm_tree_link()
6388 struct mlxsw_sp_fib_entry_op_ctx *op_ctx = mlxsw_sp->router->ll_op_ctx; in mlxsw_sp_fib_node_entry_unlink()
6590 list_add_tail(&nh->router_list_node, &mlxsw_sp->router->nexthop_list); in mlxsw_sp_nexthop6_init()
7327 struct mlxsw_sp_vr *vr = &mlxsw_sp->router->vrs[i]; in mlxsw_sp_router_fib_flush()
7336 /* If virtual router was only used for IPv4, then it's no in mlxsw_sp_router_fib_flush()
7348 if (!mlxsw_sp->router->adj_discard_index_valid) in mlxsw_sp_router_fib_flush()
7351 mlxsw_sp->router->adj_discard_index); in mlxsw_sp_router_fib_flush()
7352 mlxsw_sp->router->adj_discard_index_valid = false; in mlxsw_sp_router_fib_flush()
7507 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_router_fibmr_event_process()
7534 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_router_fibmr_event_process()
7540 struct mlxsw_sp_router *router = container_of(work, struct mlxsw_sp_router, fib_event_work); in mlxsw_sp_router_fib_event_work() local
7541 struct mlxsw_sp_fib_entry_op_ctx *op_ctx = router->ll_op_ctx; in mlxsw_sp_router_fib_event_work()
7542 struct mlxsw_sp *mlxsw_sp = router->mlxsw_sp; in mlxsw_sp_router_fib_event_work()
7548 spin_lock_bh(&router->fib_event_queue_lock); in mlxsw_sp_router_fib_event_work()
7549 list_splice_init(&router->fib_event_queue, &fib_event_queue); in mlxsw_sp_router_fib_event_work()
7550 spin_unlock_bh(&router->fib_event_queue_lock); in mlxsw_sp_router_fib_event_work()
7552 /* Router lock is held here to make sure per-instance in mlxsw_sp_router_fib_event_work()
7556 mutex_lock(&router->lock); in mlxsw_sp_router_fib_event_work()
7593 mutex_unlock(&router->lock); in mlxsw_sp_router_fib_event_work()
7596 mutex_lock(&router->lock); in mlxsw_sp_router_fib_event_work()
7605 WARN_ON_ONCE(!list_empty(&router->ll_op_ctx->fib_entry_priv_list)); in mlxsw_sp_router_fib_event_work()
7606 mutex_unlock(&router->lock); in mlxsw_sp_router_fib_event_work()
7728 struct mlxsw_sp_router *router; in mlxsw_sp_router_fib_event() local
7736 router = container_of(nb, struct mlxsw_sp_router, fib_nb); in mlxsw_sp_router_fib_event()
7742 router->mlxsw_sp); in mlxsw_sp_router_fib_event()
7762 fib_event->mlxsw_sp = router->mlxsw_sp; in mlxsw_sp_router_fib_event()
7782 spin_lock_bh(&router->fib_event_queue_lock); in mlxsw_sp_router_fib_event()
7783 list_add_tail(&fib_event->list, &router->fib_event_queue); in mlxsw_sp_router_fib_event()
7784 spin_unlock_bh(&router->fib_event_queue_lock); in mlxsw_sp_router_fib_event()
7785 mlxsw_core_schedule_work(&router->fib_event_work); in mlxsw_sp_router_fib_event()
7801 if (mlxsw_sp->router->rifs[i] && in mlxsw_sp_rif_find_by_dev()
7802 mlxsw_sp->router->rifs[i]->dev == dev) in mlxsw_sp_rif_find_by_dev()
7803 return mlxsw_sp->router->rifs[i]; in mlxsw_sp_rif_find_by_dev()
7813 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_rif_exists()
7815 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_rif_exists()
7825 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_rif_vid()
7839 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_rif_vid()
7934 if (!mlxsw_sp->router->rifs[i]) { in mlxsw_sp_rif_index_alloc()
7969 return mlxsw_sp->router->rifs[rif_index]; in mlxsw_sp_rif_by_index()
8024 ops = mlxsw_sp->router->rif_ops_arr[type]; in mlxsw_sp_rif_create()
8033 NL_SET_ERR_MSG_MOD(extack, "Exceeded number of supported router interfaces"); in mlxsw_sp_rif_create()
8043 mlxsw_sp->router->rifs[rif_index] = rif; in mlxsw_sp_rif_create()
8081 mlxsw_sp->router->rifs[rif_index] = NULL; in mlxsw_sp_rif_create()
8100 vr = &mlxsw_sp->router->vrs[rif->vr_id]; in mlxsw_sp_rif_destroy()
8109 mlxsw_sp->router->rifs[rif->rif_index] = NULL; in mlxsw_sp_rif_destroy()
8121 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_rif_destroy_by_dev()
8127 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_rif_destroy_by_dev()
8255 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_port_vlan_router_join()
8263 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_port_vlan_router_join()
8272 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_port_vlan_router_leave()
8274 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_port_vlan_router_leave()
8456 NL_SET_ERR_MSG_MOD(extack, "macvlan is only supported on top of router interfaces"); in mlxsw_sp_rif_macvlan_add()
8505 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_rif_macvlan_del()
8507 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_rif_macvlan_del()
8541 rif = mlxsw_sp->router->rifs[i]; in mlxsw_sp_router_port_check_rif_addr()
8548 NL_SET_ERR_MSG_MOD(extack, "All router interface MAC addresses must have the same prefix"); in mlxsw_sp_router_port_check_rif_addr()
8583 struct mlxsw_sp_router *router; in mlxsw_sp_inetaddr_event() local
8591 router = container_of(nb, struct mlxsw_sp_router, inetaddr_nb); in mlxsw_sp_inetaddr_event()
8592 mutex_lock(&router->lock); in mlxsw_sp_inetaddr_event()
8593 rif = mlxsw_sp_rif_find_by_dev(router->mlxsw_sp, dev); in mlxsw_sp_inetaddr_event()
8597 err = __mlxsw_sp_inetaddr_event(router->mlxsw_sp, dev, event, NULL); in mlxsw_sp_inetaddr_event()
8599 mutex_unlock(&router->lock); in mlxsw_sp_inetaddr_event()
8616 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_inetaddr_valid_event()
8628 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_inetaddr_valid_event()
8649 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_inet6addr_event_work()
8657 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_inet6addr_event_work()
8670 struct mlxsw_sp_router *router; in mlxsw_sp_inet6addr_event() local
8680 router = container_of(nb, struct mlxsw_sp_router, inet6addr_nb); in mlxsw_sp_inet6addr_event()
8682 inet6addr_work->mlxsw_sp = router->mlxsw_sp; in mlxsw_sp_inet6addr_event()
8704 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_inet6addr_valid_event()
8716 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_inet6addr_valid_event()
8768 vr = &mlxsw_sp->router->vrs[rif->vr_id]; in mlxsw_sp_router_port_change_event()
8809 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_netdevice_router_port_event()
8825 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_netdevice_router_port_event()
8836 * destroy it and create a new one with the new virtual router ID. in mlxsw_sp_port_vrf_join()
8864 * direct more MAC addresses to the router. in mlxsw_sp_netdevice_vrf_event()
8869 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_netdevice_vrf_event()
8884 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_netdevice_vrf_event()
8910 netdev_warn(rif->dev, "Router interface is deleted. Upper macvlans will not work\n"); in mlxsw_sp_rif_macvlan_flush()
9207 ul_vr = &mlxsw_sp->router->vrs[lb_rif->ul_vr_id]; in mlxsw_sp1_rif_ipip_lb_deconfigure()
9253 NL_SET_ERR_MSG_MOD(extack, "Exceeded number of supported router interfaces"); in mlxsw_sp_ul_rif_create()
9261 mlxsw_sp->router->rifs[rif_index] = ul_rif; in mlxsw_sp_ul_rif_create()
9270 mlxsw_sp->router->rifs[rif_index] = NULL; in mlxsw_sp_ul_rif_create()
9280 mlxsw_sp->router->rifs[ul_rif->rif_index] = NULL; in mlxsw_sp_ul_rif_destroy()
9319 vr = &mlxsw_sp->router->vrs[ul_rif->vr_id]; in mlxsw_sp_ul_rif_put()
9335 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_router_ul_rif_get()
9343 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_router_ul_rif_get()
9351 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_router_ul_rif_put()
9352 ul_rif = mlxsw_sp->router->rifs[ul_rif_index]; in mlxsw_sp_router_ul_rif_put()
9358 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_router_ul_rif_put()
9418 mlxsw_sp->router->rifs = kcalloc(max_rifs, in mlxsw_sp_rifs_init()
9421 if (!mlxsw_sp->router->rifs) in mlxsw_sp_rifs_init()
9432 WARN_ON_ONCE(mlxsw_sp->router->rifs[i]); in mlxsw_sp_rifs_fini()
9434 kfree(mlxsw_sp->router->rifs); in mlxsw_sp_rifs_fini()
9450 mlxsw_sp->router->ipip_ops_arr = mlxsw_sp_ipip_ops_arr; in mlxsw_sp_ipips_init()
9451 INIT_LIST_HEAD(&mlxsw_sp->router->ipip_list); in mlxsw_sp_ipips_init()
9465 WARN_ON(!list_empty(&mlxsw_sp->router->ipip_list)); in mlxsw_sp_ipips_fini()
9470 struct mlxsw_sp_router *router; in mlxsw_sp_router_fib_dump_flush() local
9477 router = container_of(nb, struct mlxsw_sp_router, fib_nb); in mlxsw_sp_router_fib_dump_flush()
9478 mlxsw_sp_router_fib_flush(router->mlxsw_sp); in mlxsw_sp_router_fib_dump_flush()
9699 mlxsw_sp->router->inc_parsing_depth = true; in mlxsw_sp_mp_hash_parsing_depth_adjust()
9702 mlxsw_sp->router->inc_parsing_depth = false; in mlxsw_sp_mp_hash_parsing_depth_adjust()
9722 old_inc_parsing_depth = mlxsw_sp->router->inc_parsing_depth; in mlxsw_sp_mp_hash_init()
9815 static int mlxsw_sp_router_ll_op_ctx_init(struct mlxsw_sp_router *router) in mlxsw_sp_router_ll_op_ctx_init() argument
9821 size_t size = router->proto_ll_ops[i]->fib_entry_op_ctx_size; in mlxsw_sp_router_ll_op_ctx_init()
9826 router->ll_op_ctx = kzalloc(sizeof(*router->ll_op_ctx) + max_size, in mlxsw_sp_router_ll_op_ctx_init()
9828 if (!router->ll_op_ctx) in mlxsw_sp_router_ll_op_ctx_init()
9830 INIT_LIST_HEAD(&router->ll_op_ctx->fib_entry_priv_list); in mlxsw_sp_router_ll_op_ctx_init()
9834 static void mlxsw_sp_router_ll_op_ctx_fini(struct mlxsw_sp_router *router) in mlxsw_sp_router_ll_op_ctx_fini() argument
9836 WARN_ON(!list_empty(&router->ll_op_ctx->fib_entry_priv_list)); in mlxsw_sp_router_ll_op_ctx_fini()
9837 kfree(router->ll_op_ctx); in mlxsw_sp_router_ll_op_ctx_fini()
9854 mlxsw_sp->router->lb_rif_index = lb_rif_index; in mlxsw_sp_lb_rif_init()
9861 mlxsw_sp_router_ul_rif_put(mlxsw_sp, mlxsw_sp->router->lb_rif_index); in mlxsw_sp_lb_rif_fini()
9868 mlxsw_sp->router->rif_ops_arr = mlxsw_sp1_rif_ops_arr; in mlxsw_sp1_router_init()
9869 mlxsw_sp->router->adj_grp_size_ranges = mlxsw_sp1_adj_grp_size_ranges; in mlxsw_sp1_router_init()
9870 mlxsw_sp->router->adj_grp_size_ranges_count = size_ranges_count; in mlxsw_sp1_router_init()
9883 mlxsw_sp->router->rif_ops_arr = mlxsw_sp2_rif_ops_arr; in mlxsw_sp2_router_init()
9884 mlxsw_sp->router->adj_grp_size_ranges = mlxsw_sp2_adj_grp_size_ranges; in mlxsw_sp2_router_init()
9885 mlxsw_sp->router->adj_grp_size_ranges_count = size_ranges_count; in mlxsw_sp2_router_init()
9897 struct mlxsw_sp_router *router; in mlxsw_sp_router_init() local
9900 router = kzalloc(sizeof(*mlxsw_sp->router), GFP_KERNEL); in mlxsw_sp_router_init()
9901 if (!router) in mlxsw_sp_router_init()
9903 mutex_init(&router->lock); in mlxsw_sp_router_init()
9904 mlxsw_sp->router = router; in mlxsw_sp_router_init()
9905 router->mlxsw_sp = mlxsw_sp; in mlxsw_sp_router_init()
9915 router->proto_ll_ops[MLXSW_SP_L3_PROTO_IPV4] = mlxsw_sp_router_xm_ipv4_is_supported(mlxsw_sp) ? in mlxsw_sp_router_init()
9918 router->proto_ll_ops[MLXSW_SP_L3_PROTO_IPV6] = &mlxsw_sp_router_ll_basic_ops; in mlxsw_sp_router_init()
9920 err = mlxsw_sp_router_ll_op_ctx_init(router); in mlxsw_sp_router_init()
9924 INIT_LIST_HEAD(&mlxsw_sp->router->nh_res_grp_list); in mlxsw_sp_router_init()
9925 INIT_DELAYED_WORK(&mlxsw_sp->router->nh_grp_activity_dw, in mlxsw_sp_router_init()
9928 INIT_LIST_HEAD(&mlxsw_sp->router->nexthop_neighs_list); in mlxsw_sp_router_init()
9941 err = rhashtable_init(&mlxsw_sp->router->nexthop_ht, in mlxsw_sp_router_init()
9946 err = rhashtable_init(&mlxsw_sp->router->nexthop_group_ht, in mlxsw_sp_router_init()
9951 INIT_LIST_HEAD(&mlxsw_sp->router->nexthop_list); in mlxsw_sp_router_init()
9980 INIT_WORK(&router->fib_event_work, mlxsw_sp_router_fib_event_work); in mlxsw_sp_router_init()
9981 INIT_LIST_HEAD(&router->fib_event_queue); in mlxsw_sp_router_init()
9982 spin_lock_init(&router->fib_event_queue_lock); in mlxsw_sp_router_init()
9984 router->inetaddr_nb.notifier_call = mlxsw_sp_inetaddr_event; in mlxsw_sp_router_init()
9985 err = register_inetaddr_notifier(&router->inetaddr_nb); in mlxsw_sp_router_init()
9989 router->inet6addr_nb.notifier_call = mlxsw_sp_inet6addr_event; in mlxsw_sp_router_init()
9990 err = register_inet6addr_notifier(&router->inet6addr_nb); in mlxsw_sp_router_init()
9994 mlxsw_sp->router->netevent_nb.notifier_call = in mlxsw_sp_router_init()
9996 err = register_netevent_notifier(&mlxsw_sp->router->netevent_nb); in mlxsw_sp_router_init()
10000 mlxsw_sp->router->nexthop_nb.notifier_call = in mlxsw_sp_router_init()
10003 &mlxsw_sp->router->nexthop_nb, in mlxsw_sp_router_init()
10008 mlxsw_sp->router->fib_nb.notifier_call = mlxsw_sp_router_fib_event; in mlxsw_sp_router_init()
10010 &mlxsw_sp->router->fib_nb, in mlxsw_sp_router_init()
10019 &mlxsw_sp->router->nexthop_nb); in mlxsw_sp_router_init()
10021 unregister_netevent_notifier(&mlxsw_sp->router->netevent_nb); in mlxsw_sp_router_init()
10023 unregister_inet6addr_notifier(&router->inet6addr_nb); in mlxsw_sp_router_init()
10025 unregister_inetaddr_notifier(&router->inetaddr_nb); in mlxsw_sp_router_init()
10028 WARN_ON(!list_empty(&router->fib_event_queue)); in mlxsw_sp_router_init()
10041 rhashtable_destroy(&mlxsw_sp->router->nexthop_group_ht); in mlxsw_sp_router_init()
10043 rhashtable_destroy(&mlxsw_sp->router->nexthop_ht); in mlxsw_sp_router_init()
10051 cancel_delayed_work_sync(&mlxsw_sp->router->nh_grp_activity_dw); in mlxsw_sp_router_init()
10052 mlxsw_sp_router_ll_op_ctx_fini(router); in mlxsw_sp_router_init()
10057 mutex_destroy(&mlxsw_sp->router->lock); in mlxsw_sp_router_init()
10058 kfree(mlxsw_sp->router); in mlxsw_sp_router_init()
10065 &mlxsw_sp->router->fib_nb); in mlxsw_sp_router_fini()
10067 &mlxsw_sp->router->nexthop_nb); in mlxsw_sp_router_fini()
10068 unregister_netevent_notifier(&mlxsw_sp->router->netevent_nb); in mlxsw_sp_router_fini()
10069 unregister_inet6addr_notifier(&mlxsw_sp->router->inet6addr_nb); in mlxsw_sp_router_fini()
10070 unregister_inetaddr_notifier(&mlxsw_sp->router->inetaddr_nb); in mlxsw_sp_router_fini()
10072 WARN_ON(!list_empty(&mlxsw_sp->router->fib_event_queue)); in mlxsw_sp_router_fini()
10078 rhashtable_destroy(&mlxsw_sp->router->nexthop_group_ht); in mlxsw_sp_router_fini()
10079 rhashtable_destroy(&mlxsw_sp->router->nexthop_ht); in mlxsw_sp_router_fini()
10083 cancel_delayed_work_sync(&mlxsw_sp->router->nh_grp_activity_dw); in mlxsw_sp_router_fini()
10084 mlxsw_sp_router_ll_op_ctx_fini(mlxsw_sp->router); in mlxsw_sp_router_fini()
10086 mutex_destroy(&mlxsw_sp->router->lock); in mlxsw_sp_router_fini()
10087 kfree(mlxsw_sp->router); in mlxsw_sp_router_fini()