Lines Matching refs:mlxsw_sp

64 	struct mlxsw_sp *mlxsw_sp;  member
126 int (*init)(struct mlxsw_sp *mlxsw_sp);
127 int (*ipips_init)(struct mlxsw_sp *mlxsw_sp);
131 mlxsw_sp_rif_find_by_dev(const struct mlxsw_sp *mlxsw_sp,
135 static void mlxsw_sp_lpm_tree_put(struct mlxsw_sp *mlxsw_sp,
137 static int mlxsw_sp_vr_lpm_tree_bind(struct mlxsw_sp *mlxsw_sp,
140 static int mlxsw_sp_vr_lpm_tree_unbind(struct mlxsw_sp *mlxsw_sp,
184 static int mlxsw_sp_rif_counter_edit(struct mlxsw_sp *mlxsw_sp, u16 rif_index, in mlxsw_sp_rif_counter_edit() argument
195 err = mlxsw_reg_query(mlxsw_sp->core, MLXSW_REG(ritr), ritr_pl); in mlxsw_sp_rif_counter_edit()
201 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ritr), ritr_pl); in mlxsw_sp_rif_counter_edit()
204 int mlxsw_sp_rif_counter_value_get(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_rif_counter_value_get() argument
222 err = mlxsw_reg_query(mlxsw_sp->core, MLXSW_REG(ricnt), ricnt_pl); in mlxsw_sp_rif_counter_value_get()
247 struct mlxsw_sp *mlxsw_sp = rif->mlxsw_sp; in mlxsw_sp_rif_counter_fetch_clear() local
261 err = mlxsw_reg_query(mlxsw_sp->core, MLXSW_REG(ricnt), ricnt_pl); in mlxsw_sp_rif_counter_fetch_clear()
287 static int mlxsw_sp_rif_counter_clear(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_rif_counter_clear() argument
294 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ricnt), ricnt_pl); in mlxsw_sp_rif_counter_clear()
300 struct mlxsw_sp *mlxsw_sp = rif->mlxsw_sp; in mlxsw_sp_rif_counter_alloc() local
311 err = mlxsw_sp_counter_alloc(mlxsw_sp, MLXSW_SP_COUNTER_SUB_POOL_RIF, in mlxsw_sp_rif_counter_alloc()
316 err = mlxsw_sp_rif_counter_clear(mlxsw_sp, *p_counter_index); in mlxsw_sp_rif_counter_alloc()
320 err = mlxsw_sp_rif_counter_edit(mlxsw_sp, rif->rif_index, in mlxsw_sp_rif_counter_alloc()
329 mlxsw_sp_counter_free(mlxsw_sp, MLXSW_SP_COUNTER_SUB_POOL_RIF, in mlxsw_sp_rif_counter_alloc()
337 struct mlxsw_sp *mlxsw_sp = rif->mlxsw_sp; in mlxsw_sp_rif_counter_free() local
346 mlxsw_sp_rif_counter_edit(mlxsw_sp, rif->rif_index, in mlxsw_sp_rif_counter_free()
348 mlxsw_sp_counter_free(mlxsw_sp, MLXSW_SP_COUNTER_SUB_POOL_RIF, in mlxsw_sp_rif_counter_free()
355 struct mlxsw_sp *mlxsw_sp = rif->mlxsw_sp; in mlxsw_sp_rif_counters_alloc() local
358 devlink = priv_to_devlink(mlxsw_sp->core); in mlxsw_sp_rif_counters_alloc()
502 static struct mlxsw_sp_fib *mlxsw_sp_fib_create(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib_create() argument
510 lpm_tree = mlxsw_sp->router->lpm.proto_trees[proto]; in mlxsw_sp_fib_create()
522 err = mlxsw_sp_vr_lpm_tree_bind(mlxsw_sp, fib, lpm_tree->id); in mlxsw_sp_fib_create()
528 mlxsw_sp_lpm_tree_put(mlxsw_sp, lpm_tree); in mlxsw_sp_fib_create()
534 static void mlxsw_sp_fib_destroy(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib_destroy() argument
537 mlxsw_sp_vr_lpm_tree_unbind(mlxsw_sp, fib); in mlxsw_sp_fib_destroy()
538 mlxsw_sp_lpm_tree_put(mlxsw_sp, fib->lpm_tree); in mlxsw_sp_fib_destroy()
545 mlxsw_sp_lpm_tree_find_unused(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_lpm_tree_find_unused() argument
550 for (i = 0; i < mlxsw_sp->router->lpm.tree_count; i++) { in mlxsw_sp_lpm_tree_find_unused()
551 lpm_tree = &mlxsw_sp->router->lpm.trees[i]; in mlxsw_sp_lpm_tree_find_unused()
558 static int mlxsw_sp_lpm_tree_alloc(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_lpm_tree_alloc() argument
566 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ralta), ralta_pl); in mlxsw_sp_lpm_tree_alloc()
569 static void mlxsw_sp_lpm_tree_free(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_lpm_tree_free() argument
577 mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ralta), ralta_pl); in mlxsw_sp_lpm_tree_free()
581 mlxsw_sp_lpm_tree_left_struct_set(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_lpm_tree_left_struct_set() argument
601 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ralst), ralst_pl); in mlxsw_sp_lpm_tree_left_struct_set()
605 mlxsw_sp_lpm_tree_create(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_lpm_tree_create() argument
612 lpm_tree = mlxsw_sp_lpm_tree_find_unused(mlxsw_sp); in mlxsw_sp_lpm_tree_create()
616 err = mlxsw_sp_lpm_tree_alloc(mlxsw_sp, lpm_tree); in mlxsw_sp_lpm_tree_create()
620 err = mlxsw_sp_lpm_tree_left_struct_set(mlxsw_sp, prefix_usage, in mlxsw_sp_lpm_tree_create()
632 mlxsw_sp_lpm_tree_free(mlxsw_sp, lpm_tree); in mlxsw_sp_lpm_tree_create()
636 static void mlxsw_sp_lpm_tree_destroy(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_lpm_tree_destroy() argument
639 mlxsw_sp_lpm_tree_free(mlxsw_sp, lpm_tree); in mlxsw_sp_lpm_tree_destroy()
643 mlxsw_sp_lpm_tree_get(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_lpm_tree_get() argument
650 for (i = 0; i < mlxsw_sp->router->lpm.tree_count; i++) { in mlxsw_sp_lpm_tree_get()
651 lpm_tree = &mlxsw_sp->router->lpm.trees[i]; in mlxsw_sp_lpm_tree_get()
660 return mlxsw_sp_lpm_tree_create(mlxsw_sp, prefix_usage, proto); in mlxsw_sp_lpm_tree_get()
668 static void mlxsw_sp_lpm_tree_put(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_lpm_tree_put() argument
672 mlxsw_sp_lpm_tree_destroy(mlxsw_sp, lpm_tree); in mlxsw_sp_lpm_tree_put()
677 static int mlxsw_sp_lpm_init(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_lpm_init() argument
684 if (!MLXSW_CORE_RES_VALID(mlxsw_sp->core, MAX_LPM_TREES)) in mlxsw_sp_lpm_init()
687 max_trees = MLXSW_CORE_RES_GET(mlxsw_sp->core, MAX_LPM_TREES); in mlxsw_sp_lpm_init()
688 mlxsw_sp->router->lpm.tree_count = max_trees - MLXSW_SP_LPM_TREE_MIN; in mlxsw_sp_lpm_init()
689 mlxsw_sp->router->lpm.trees = kcalloc(mlxsw_sp->router->lpm.tree_count, in mlxsw_sp_lpm_init()
692 if (!mlxsw_sp->router->lpm.trees) in mlxsw_sp_lpm_init()
695 for (i = 0; i < mlxsw_sp->router->lpm.tree_count; i++) { in mlxsw_sp_lpm_init()
696 lpm_tree = &mlxsw_sp->router->lpm.trees[i]; in mlxsw_sp_lpm_init()
700 lpm_tree = mlxsw_sp_lpm_tree_get(mlxsw_sp, &req_prefix_usage, in mlxsw_sp_lpm_init()
706 mlxsw_sp->router->lpm.proto_trees[MLXSW_SP_L3_PROTO_IPV4] = lpm_tree; in mlxsw_sp_lpm_init()
708 lpm_tree = mlxsw_sp_lpm_tree_get(mlxsw_sp, &req_prefix_usage, in mlxsw_sp_lpm_init()
714 mlxsw_sp->router->lpm.proto_trees[MLXSW_SP_L3_PROTO_IPV6] = lpm_tree; in mlxsw_sp_lpm_init()
719 lpm_tree = mlxsw_sp->router->lpm.proto_trees[MLXSW_SP_L3_PROTO_IPV4]; in mlxsw_sp_lpm_init()
720 mlxsw_sp_lpm_tree_put(mlxsw_sp, lpm_tree); in mlxsw_sp_lpm_init()
722 kfree(mlxsw_sp->router->lpm.trees); in mlxsw_sp_lpm_init()
726 static void mlxsw_sp_lpm_fini(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_lpm_fini() argument
730 lpm_tree = mlxsw_sp->router->lpm.proto_trees[MLXSW_SP_L3_PROTO_IPV6]; in mlxsw_sp_lpm_fini()
731 mlxsw_sp_lpm_tree_put(mlxsw_sp, lpm_tree); in mlxsw_sp_lpm_fini()
733 lpm_tree = mlxsw_sp->router->lpm.proto_trees[MLXSW_SP_L3_PROTO_IPV4]; in mlxsw_sp_lpm_fini()
734 mlxsw_sp_lpm_tree_put(mlxsw_sp, lpm_tree); in mlxsw_sp_lpm_fini()
736 kfree(mlxsw_sp->router->lpm.trees); in mlxsw_sp_lpm_fini()
746 static struct mlxsw_sp_vr *mlxsw_sp_vr_find_unused(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_vr_find_unused() argument
751 for (i = 0; i < MLXSW_CORE_RES_GET(mlxsw_sp->core, MAX_VRS); i++) { in mlxsw_sp_vr_find_unused()
752 vr = &mlxsw_sp->router->vrs[i]; in mlxsw_sp_vr_find_unused()
759 static int mlxsw_sp_vr_lpm_tree_bind(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_vr_lpm_tree_bind() argument
767 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(raltb), raltb_pl); in mlxsw_sp_vr_lpm_tree_bind()
770 static int mlxsw_sp_vr_lpm_tree_unbind(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_vr_lpm_tree_unbind() argument
778 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(raltb), raltb_pl); in mlxsw_sp_vr_lpm_tree_unbind()
789 static struct mlxsw_sp_vr *mlxsw_sp_vr_find(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_vr_find() argument
797 for (i = 0; i < MLXSW_CORE_RES_GET(mlxsw_sp->core, MAX_VRS); i++) { in mlxsw_sp_vr_find()
798 vr = &mlxsw_sp->router->vrs[i]; in mlxsw_sp_vr_find()
805 int mlxsw_sp_router_tb_id_vr_id(struct mlxsw_sp *mlxsw_sp, u32 tb_id, in mlxsw_sp_router_tb_id_vr_id() argument
811 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_router_tb_id_vr_id()
812 vr = mlxsw_sp_vr_find(mlxsw_sp, tb_id); in mlxsw_sp_router_tb_id_vr_id()
819 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_router_tb_id_vr_id()
835 static struct mlxsw_sp_vr *mlxsw_sp_vr_create(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_vr_create() argument
845 vr = mlxsw_sp_vr_find_unused(mlxsw_sp); in mlxsw_sp_vr_create()
850 fib4 = mlxsw_sp_fib_create(mlxsw_sp, vr, MLXSW_SP_L3_PROTO_IPV4); in mlxsw_sp_vr_create()
853 fib6 = mlxsw_sp_fib_create(mlxsw_sp, vr, MLXSW_SP_L3_PROTO_IPV6); in mlxsw_sp_vr_create()
858 mr4_table = mlxsw_sp_mr_table_create(mlxsw_sp, vr->id, in mlxsw_sp_vr_create()
864 mr6_table = mlxsw_sp_mr_table_create(mlxsw_sp, vr->id, in mlxsw_sp_vr_create()
881 mlxsw_sp_fib_destroy(mlxsw_sp, fib6); in mlxsw_sp_vr_create()
883 mlxsw_sp_fib_destroy(mlxsw_sp, fib4); in mlxsw_sp_vr_create()
887 static void mlxsw_sp_vr_destroy(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_vr_destroy() argument
894 mlxsw_sp_fib_destroy(mlxsw_sp, vr->fib6); in mlxsw_sp_vr_destroy()
896 mlxsw_sp_fib_destroy(mlxsw_sp, vr->fib4); in mlxsw_sp_vr_destroy()
900 static struct mlxsw_sp_vr *mlxsw_sp_vr_get(struct mlxsw_sp *mlxsw_sp, u32 tb_id, in mlxsw_sp_vr_get() argument
906 vr = mlxsw_sp_vr_find(mlxsw_sp, tb_id); in mlxsw_sp_vr_get()
908 vr = mlxsw_sp_vr_create(mlxsw_sp, tb_id, extack); in mlxsw_sp_vr_get()
912 static void mlxsw_sp_vr_put(struct mlxsw_sp *mlxsw_sp, struct mlxsw_sp_vr *vr) in mlxsw_sp_vr_put() argument
918 mlxsw_sp_vr_destroy(mlxsw_sp, vr); in mlxsw_sp_vr_put()
934 static int mlxsw_sp_vr_lpm_tree_replace(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_vr_lpm_tree_replace() argument
943 err = mlxsw_sp_vr_lpm_tree_bind(mlxsw_sp, fib, new_tree->id); in mlxsw_sp_vr_lpm_tree_replace()
946 mlxsw_sp_lpm_tree_put(mlxsw_sp, old_tree); in mlxsw_sp_vr_lpm_tree_replace()
950 mlxsw_sp_lpm_tree_put(mlxsw_sp, new_tree); in mlxsw_sp_vr_lpm_tree_replace()
955 static int mlxsw_sp_vrs_lpm_tree_replace(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_vrs_lpm_tree_replace() argument
965 old_tree = mlxsw_sp->router->lpm.proto_trees[proto]; in mlxsw_sp_vrs_lpm_tree_replace()
968 for (i = 0; i < MLXSW_CORE_RES_GET(mlxsw_sp->core, MAX_VRS); i++) { in mlxsw_sp_vrs_lpm_tree_replace()
969 vr = &mlxsw_sp->router->vrs[i]; in mlxsw_sp_vrs_lpm_tree_replace()
972 err = mlxsw_sp_vr_lpm_tree_replace(mlxsw_sp, in mlxsw_sp_vrs_lpm_tree_replace()
981 mlxsw_sp->router->lpm.proto_trees[proto] = new_tree; in mlxsw_sp_vrs_lpm_tree_replace()
982 mlxsw_sp_lpm_tree_put(mlxsw_sp, old_tree); in mlxsw_sp_vrs_lpm_tree_replace()
990 mlxsw_sp_vr_lpm_tree_replace(mlxsw_sp, in mlxsw_sp_vrs_lpm_tree_replace()
997 static int mlxsw_sp_vrs_init(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_vrs_init() argument
1003 if (!MLXSW_CORE_RES_VALID(mlxsw_sp->core, MAX_VRS)) in mlxsw_sp_vrs_init()
1006 max_vrs = MLXSW_CORE_RES_GET(mlxsw_sp->core, MAX_VRS); in mlxsw_sp_vrs_init()
1007 mlxsw_sp->router->vrs = kcalloc(max_vrs, sizeof(struct mlxsw_sp_vr), in mlxsw_sp_vrs_init()
1009 if (!mlxsw_sp->router->vrs) in mlxsw_sp_vrs_init()
1013 vr = &mlxsw_sp->router->vrs[i]; in mlxsw_sp_vrs_init()
1020 static void mlxsw_sp_router_fib_flush(struct mlxsw_sp *mlxsw_sp);
1022 static void mlxsw_sp_vrs_fini(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_vrs_fini() argument
1032 mlxsw_sp_router_fib_flush(mlxsw_sp); in mlxsw_sp_vrs_fini()
1033 kfree(mlxsw_sp->router->vrs); in mlxsw_sp_vrs_fini()
1053 mlxsw_sp_rif_create(struct mlxsw_sp *mlxsw_sp,
1058 mlxsw_sp_ipip_ol_ipip_lb_create(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_ipip_ol_ipip_lb_create() argument
1067 ipip_ops = mlxsw_sp->router->ipip_ops_arr[ipipt]; in mlxsw_sp_ipip_ol_ipip_lb_create()
1071 .lb_config = ipip_ops->ol_loopback_config(mlxsw_sp, ol_dev), in mlxsw_sp_ipip_ol_ipip_lb_create()
1074 rif = mlxsw_sp_rif_create(mlxsw_sp, &lb_params.common, extack); in mlxsw_sp_ipip_ol_ipip_lb_create()
1081 mlxsw_sp_ipip_entry_alloc(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_ipip_entry_alloc() argument
1090 ipip_ops = mlxsw_sp->router->ipip_ops_arr[ipipt]; in mlxsw_sp_ipip_entry_alloc()
1095 ipip_entry->ol_lb = mlxsw_sp_ipip_ol_ipip_lb_create(mlxsw_sp, ipipt, in mlxsw_sp_ipip_entry_alloc()
1106 err = ipip_ops->rem_ip_addr_set(mlxsw_sp, ipip_entry); in mlxsw_sp_ipip_entry_alloc()
1121 static void mlxsw_sp_ipip_entry_dealloc(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_ipip_entry_dealloc() argument
1125 mlxsw_sp->router->ipip_ops_arr[ipip_entry->ipipt]; in mlxsw_sp_ipip_entry_dealloc()
1127 ipip_ops->rem_ip_addr_unset(mlxsw_sp, ipip_entry); in mlxsw_sp_ipip_entry_dealloc()
1133 mlxsw_sp_ipip_entry_saddr_matches(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_ipip_entry_saddr_matches() argument
1143 if (mlxsw_sp->router->ipip_ops_arr[ipipt]->ul_proto != ul_proto) in mlxsw_sp_ipip_entry_saddr_matches()
1151 static int mlxsw_sp_ipip_decap_parsing_depth_inc(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_ipip_decap_parsing_depth_inc() argument
1156 ipip_ops = mlxsw_sp->router->ipip_ops_arr[ipipt]; in mlxsw_sp_ipip_decap_parsing_depth_inc()
1162 return mlxsw_sp_parsing_depth_inc(mlxsw_sp); in mlxsw_sp_ipip_decap_parsing_depth_inc()
1167 static void mlxsw_sp_ipip_decap_parsing_depth_dec(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_ipip_decap_parsing_depth_dec() argument
1171 mlxsw_sp->router->ipip_ops_arr[ipipt]; in mlxsw_sp_ipip_decap_parsing_depth_dec()
1174 mlxsw_sp_parsing_depth_dec(mlxsw_sp); in mlxsw_sp_ipip_decap_parsing_depth_dec()
1178 mlxsw_sp_fib_entry_decap_init(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib_entry_decap_init() argument
1185 err = mlxsw_sp_kvdl_alloc(mlxsw_sp, MLXSW_SP_KVDL_ENTRY_TYPE_ADJ, in mlxsw_sp_fib_entry_decap_init()
1190 err = mlxsw_sp_ipip_decap_parsing_depth_inc(mlxsw_sp, in mlxsw_sp_fib_entry_decap_init()
1202 mlxsw_sp_kvdl_free(mlxsw_sp, MLXSW_SP_KVDL_ENTRY_TYPE_ADJ, 1, in mlxsw_sp_fib_entry_decap_init()
1207 static void mlxsw_sp_fib_entry_decap_fini(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib_entry_decap_fini() argument
1215 mlxsw_sp_ipip_decap_parsing_depth_dec(mlxsw_sp, ipipt); in mlxsw_sp_fib_entry_decap_fini()
1216 mlxsw_sp_kvdl_free(mlxsw_sp, MLXSW_SP_KVDL_ENTRY_TYPE_ADJ, in mlxsw_sp_fib_entry_decap_fini()
1223 static int mlxsw_sp_fib_entry_update(struct mlxsw_sp *mlxsw_sp,
1227 mlxsw_sp_ipip_entry_demote_decap(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_ipip_entry_demote_decap() argument
1232 mlxsw_sp_fib_entry_decap_fini(mlxsw_sp, fib_entry); in mlxsw_sp_ipip_entry_demote_decap()
1235 mlxsw_sp_fib_entry_update(mlxsw_sp, fib_entry); in mlxsw_sp_ipip_entry_demote_decap()
1239 mlxsw_sp_ipip_entry_promote_decap(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_ipip_entry_promote_decap() argument
1243 if (mlxsw_sp_fib_entry_decap_init(mlxsw_sp, decap_fib_entry, in mlxsw_sp_ipip_entry_promote_decap()
1248 if (mlxsw_sp_fib_entry_update(mlxsw_sp, decap_fib_entry)) in mlxsw_sp_ipip_entry_promote_decap()
1249 mlxsw_sp_ipip_entry_demote_decap(mlxsw_sp, ipip_entry); in mlxsw_sp_ipip_entry_promote_decap()
1253 mlxsw_sp_router_ip2me_fib_entry_find(struct mlxsw_sp *mlxsw_sp, u32 tb_id, in mlxsw_sp_router_ip2me_fib_entry_find() argument
1266 vr = mlxsw_sp_vr_find(mlxsw_sp, tb_id); in mlxsw_sp_router_ip2me_fib_entry_find()
1298 mlxsw_sp_ipip_entry_find_decap(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_ipip_entry_find_decap() argument
1312 ipip_ops = mlxsw_sp->router->ipip_ops_arr[ipip_entry->ipipt]; in mlxsw_sp_ipip_entry_find_decap()
1315 ul_vr = mlxsw_sp_vr_find(mlxsw_sp, ul_tb_id); in mlxsw_sp_ipip_entry_find_decap()
1350 mlxsw_sp_ipip_entry_create(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_ipip_entry_create() argument
1356 ipip_entry = mlxsw_sp_ipip_entry_alloc(mlxsw_sp, ipipt, ol_dev); in mlxsw_sp_ipip_entry_create()
1361 &mlxsw_sp->router->ipip_list); in mlxsw_sp_ipip_entry_create()
1367 mlxsw_sp_ipip_entry_destroy(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_ipip_entry_destroy() argument
1371 mlxsw_sp_ipip_entry_dealloc(mlxsw_sp, ipip_entry); in mlxsw_sp_ipip_entry_destroy()
1375 mlxsw_sp_ipip_entry_matches_decap(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_ipip_entry_matches_decap() argument
1384 if (mlxsw_sp->router->ipip_ops_arr[ipipt]->ul_proto != ul_proto) in mlxsw_sp_ipip_entry_matches_decap()
1387 return mlxsw_sp_ipip_entry_saddr_matches(mlxsw_sp, ul_proto, ul_dip, in mlxsw_sp_ipip_entry_matches_decap()
1393 mlxsw_sp_ipip_entry_find_by_decap(struct mlxsw_sp *mlxsw_sp, int ul_dev_ifindex, in mlxsw_sp_ipip_entry_find_by_decap() argument
1402 ul_dev = dev_get_by_index_rcu(mlxsw_sp_net(mlxsw_sp), ul_dev_ifindex); in mlxsw_sp_ipip_entry_find_by_decap()
1406 list_for_each_entry(ipip_entry, &mlxsw_sp->router->ipip_list, in mlxsw_sp_ipip_entry_find_by_decap()
1408 if (mlxsw_sp_ipip_entry_matches_decap(mlxsw_sp, ul_dev, in mlxsw_sp_ipip_entry_find_by_decap()
1422 static bool mlxsw_sp_netdev_ipip_type(const struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_netdev_ipip_type() argument
1426 struct mlxsw_sp_router *router = mlxsw_sp->router; in mlxsw_sp_netdev_ipip_type()
1441 static bool mlxsw_sp_netdev_is_ipip_ol(const struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_netdev_is_ipip_ol() argument
1444 return mlxsw_sp_netdev_ipip_type(mlxsw_sp, dev, NULL); in mlxsw_sp_netdev_is_ipip_ol()
1448 mlxsw_sp_ipip_entry_find_by_ol_dev(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_ipip_entry_find_by_ol_dev() argument
1453 list_for_each_entry(ipip_entry, &mlxsw_sp->router->ipip_list, in mlxsw_sp_ipip_entry_find_by_ol_dev()
1462 mlxsw_sp_ipip_entry_find_by_ul_dev(const struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_ipip_entry_find_by_ul_dev() argument
1468 ipip_entry = list_prepare_entry(start, &mlxsw_sp->router->ipip_list, in mlxsw_sp_ipip_entry_find_by_ul_dev()
1470 list_for_each_entry_continue(ipip_entry, &mlxsw_sp->router->ipip_list, in mlxsw_sp_ipip_entry_find_by_ul_dev()
1486 static bool mlxsw_sp_netdev_is_ipip_ul(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_netdev_is_ipip_ul() argument
1489 return mlxsw_sp_ipip_entry_find_by_ul_dev(mlxsw_sp, dev, NULL); in mlxsw_sp_netdev_is_ipip_ul()
1492 static bool mlxsw_sp_netdevice_ipip_can_offload(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_netdevice_ipip_can_offload() argument
1497 = mlxsw_sp->router->ipip_ops_arr[ipipt]; in mlxsw_sp_netdevice_ipip_can_offload()
1499 return ops->can_offload(mlxsw_sp, ol_dev); in mlxsw_sp_netdevice_ipip_can_offload()
1502 static int mlxsw_sp_netdevice_ipip_ol_reg_event(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_netdevice_ipip_ol_reg_event() argument
1511 mlxsw_sp_netdev_ipip_type(mlxsw_sp, ol_dev, &ipipt); in mlxsw_sp_netdevice_ipip_ol_reg_event()
1512 if (mlxsw_sp_netdevice_ipip_can_offload(mlxsw_sp, ol_dev, ipipt)) { in mlxsw_sp_netdevice_ipip_ol_reg_event()
1514 ul_proto = mlxsw_sp->router->ipip_ops_arr[ipipt]->ul_proto; in mlxsw_sp_netdevice_ipip_ol_reg_event()
1516 if (!mlxsw_sp_ipip_demote_tunnel_by_saddr(mlxsw_sp, ul_proto, in mlxsw_sp_netdevice_ipip_ol_reg_event()
1519 ipip_entry = mlxsw_sp_ipip_entry_create(mlxsw_sp, ipipt, in mlxsw_sp_netdevice_ipip_ol_reg_event()
1529 static void mlxsw_sp_netdevice_ipip_ol_unreg_event(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_netdevice_ipip_ol_unreg_event() argument
1534 ipip_entry = mlxsw_sp_ipip_entry_find_by_ol_dev(mlxsw_sp, ol_dev); in mlxsw_sp_netdevice_ipip_ol_unreg_event()
1536 mlxsw_sp_ipip_entry_destroy(mlxsw_sp, ipip_entry); in mlxsw_sp_netdevice_ipip_ol_unreg_event()
1540 mlxsw_sp_ipip_entry_ol_up_event(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_ipip_entry_ol_up_event() argument
1545 decap_fib_entry = mlxsw_sp_ipip_entry_find_decap(mlxsw_sp, ipip_entry); in mlxsw_sp_ipip_entry_ol_up_event()
1547 mlxsw_sp_ipip_entry_promote_decap(mlxsw_sp, ipip_entry, in mlxsw_sp_ipip_entry_ol_up_event()
1558 struct mlxsw_sp *mlxsw_sp = rif->mlxsw_sp; in mlxsw_sp_rif_ipip_lb_op() local
1586 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ritr), ritr_pl); in mlxsw_sp_rif_ipip_lb_op()
1589 static int mlxsw_sp_netdevice_ipip_ol_update_mtu(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_netdevice_ipip_ol_update_mtu() argument
1596 ipip_entry = mlxsw_sp_ipip_entry_find_by_ol_dev(mlxsw_sp, ol_dev); in mlxsw_sp_netdevice_ipip_ol_update_mtu()
1610 static void mlxsw_sp_netdevice_ipip_ol_up_event(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_netdevice_ipip_ol_up_event() argument
1615 ipip_entry = mlxsw_sp_ipip_entry_find_by_ol_dev(mlxsw_sp, ol_dev); in mlxsw_sp_netdevice_ipip_ol_up_event()
1617 mlxsw_sp_ipip_entry_ol_up_event(mlxsw_sp, ipip_entry); in mlxsw_sp_netdevice_ipip_ol_up_event()
1621 mlxsw_sp_ipip_entry_ol_down_event(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_ipip_entry_ol_down_event() argument
1625 mlxsw_sp_ipip_entry_demote_decap(mlxsw_sp, ipip_entry); in mlxsw_sp_ipip_entry_ol_down_event()
1628 static void mlxsw_sp_netdevice_ipip_ol_down_event(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_netdevice_ipip_ol_down_event() argument
1633 ipip_entry = mlxsw_sp_ipip_entry_find_by_ol_dev(mlxsw_sp, ol_dev); in mlxsw_sp_netdevice_ipip_ol_down_event()
1635 mlxsw_sp_ipip_entry_ol_down_event(mlxsw_sp, ipip_entry); in mlxsw_sp_netdevice_ipip_ol_down_event()
1638 static void mlxsw_sp_nexthop_rif_migrate(struct mlxsw_sp *mlxsw_sp,
1642 mlxsw_sp_ipip_entry_ol_lb_update(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_ipip_entry_ol_lb_update() argument
1650 new_lb_rif = mlxsw_sp_ipip_ol_ipip_lb_create(mlxsw_sp, in mlxsw_sp_ipip_entry_ol_lb_update()
1659 mlxsw_sp_nexthop_rif_migrate(mlxsw_sp, &old_lb_rif->common, in mlxsw_sp_ipip_entry_ol_lb_update()
1667 static void mlxsw_sp_nexthop_rif_update(struct mlxsw_sp *mlxsw_sp,
1683 int __mlxsw_sp_ipip_entry_update_tunnel(struct mlxsw_sp *mlxsw_sp, in __mlxsw_sp_ipip_entry_update_tunnel() argument
1699 mlxsw_sp_ipip_entry_demote_decap(mlxsw_sp, ipip_entry); in __mlxsw_sp_ipip_entry_update_tunnel()
1702 err = mlxsw_sp_ipip_entry_ol_lb_update(mlxsw_sp, ipip_entry, in __mlxsw_sp_ipip_entry_update_tunnel()
1707 mlxsw_sp_nexthop_rif_update(mlxsw_sp, in __mlxsw_sp_ipip_entry_update_tunnel()
1712 mlxsw_sp_ipip_entry_ol_up_event(mlxsw_sp, ipip_entry); in __mlxsw_sp_ipip_entry_update_tunnel()
1717 static int mlxsw_sp_netdevice_ipip_ol_vrf_event(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_netdevice_ipip_ol_vrf_event() argument
1722 mlxsw_sp_ipip_entry_find_by_ol_dev(mlxsw_sp, ol_dev); in mlxsw_sp_netdevice_ipip_ol_vrf_event()
1727 return __mlxsw_sp_ipip_entry_update_tunnel(mlxsw_sp, ipip_entry, in mlxsw_sp_netdevice_ipip_ol_vrf_event()
1732 mlxsw_sp_netdevice_ipip_ul_vrf_event(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_netdevice_ipip_ul_vrf_event() argument
1745 ul_proto = mlxsw_sp->router->ipip_ops_arr[ipip_entry->ipipt]->ul_proto; in mlxsw_sp_netdevice_ipip_ul_vrf_event()
1747 if (mlxsw_sp_ipip_demote_tunnel_by_saddr(mlxsw_sp, ul_proto, in mlxsw_sp_netdevice_ipip_ul_vrf_event()
1754 return __mlxsw_sp_ipip_entry_update_tunnel(mlxsw_sp, ipip_entry, in mlxsw_sp_netdevice_ipip_ul_vrf_event()
1759 mlxsw_sp_netdevice_ipip_ul_up_event(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_netdevice_ipip_ul_up_event() argument
1763 return __mlxsw_sp_ipip_entry_update_tunnel(mlxsw_sp, ipip_entry, in mlxsw_sp_netdevice_ipip_ul_up_event()
1768 mlxsw_sp_netdevice_ipip_ul_down_event(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_netdevice_ipip_ul_down_event() argument
1776 return __mlxsw_sp_ipip_entry_update_tunnel(mlxsw_sp, ipip_entry, in mlxsw_sp_netdevice_ipip_ul_down_event()
1781 mlxsw_sp_netdevice_ipip_ol_change_event(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_netdevice_ipip_ol_change_event() argument
1789 ipip_entry = mlxsw_sp_ipip_entry_find_by_ol_dev(mlxsw_sp, ol_dev); in mlxsw_sp_netdevice_ipip_ol_change_event()
1798 if (!mlxsw_sp_netdevice_ipip_can_offload(mlxsw_sp, ol_dev, in mlxsw_sp_netdevice_ipip_ol_change_event()
1800 mlxsw_sp_ipip_entry_demote_tunnel(mlxsw_sp, ipip_entry); in mlxsw_sp_netdevice_ipip_ol_change_event()
1804 ipip_ops = mlxsw_sp->router->ipip_ops_arr[ipip_entry->ipipt]; in mlxsw_sp_netdevice_ipip_ol_change_event()
1805 err = ipip_ops->ol_netdev_change(mlxsw_sp, ipip_entry, extack); in mlxsw_sp_netdevice_ipip_ol_change_event()
1809 void mlxsw_sp_ipip_entry_demote_tunnel(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_ipip_entry_demote_tunnel() argument
1815 mlxsw_sp_ipip_entry_ol_down_event(mlxsw_sp, ipip_entry); in mlxsw_sp_ipip_entry_demote_tunnel()
1816 mlxsw_sp_ipip_entry_destroy(mlxsw_sp, ipip_entry); in mlxsw_sp_ipip_entry_demote_tunnel()
1826 mlxsw_sp_ipip_demote_tunnel_by_saddr(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_ipip_demote_tunnel_by_saddr() argument
1834 list_for_each_entry_safe(ipip_entry, tmp, &mlxsw_sp->router->ipip_list, in mlxsw_sp_ipip_demote_tunnel_by_saddr()
1837 mlxsw_sp_ipip_entry_saddr_matches(mlxsw_sp, ul_proto, saddr, in mlxsw_sp_ipip_demote_tunnel_by_saddr()
1839 mlxsw_sp_ipip_entry_demote_tunnel(mlxsw_sp, ipip_entry); in mlxsw_sp_ipip_demote_tunnel_by_saddr()
1847 static void mlxsw_sp_ipip_demote_tunnel_by_ul_netdev(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_ipip_demote_tunnel_by_ul_netdev() argument
1852 list_for_each_entry_safe(ipip_entry, tmp, &mlxsw_sp->router->ipip_list, in mlxsw_sp_ipip_demote_tunnel_by_ul_netdev()
1861 mlxsw_sp_ipip_entry_demote_tunnel(mlxsw_sp, ipip_entry); in mlxsw_sp_ipip_demote_tunnel_by_ul_netdev()
1865 static int mlxsw_sp_netdevice_ipip_ol_event(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_netdevice_ipip_ol_event() argument
1876 err = mlxsw_sp_netdevice_ipip_ol_reg_event(mlxsw_sp, ol_dev); in mlxsw_sp_netdevice_ipip_ol_event()
1879 mlxsw_sp_netdevice_ipip_ol_unreg_event(mlxsw_sp, ol_dev); in mlxsw_sp_netdevice_ipip_ol_event()
1882 mlxsw_sp_netdevice_ipip_ol_up_event(mlxsw_sp, ol_dev); in mlxsw_sp_netdevice_ipip_ol_event()
1885 mlxsw_sp_netdevice_ipip_ol_down_event(mlxsw_sp, ol_dev); in mlxsw_sp_netdevice_ipip_ol_event()
1891 err = mlxsw_sp_netdevice_ipip_ol_vrf_event(mlxsw_sp, in mlxsw_sp_netdevice_ipip_ol_event()
1897 err = mlxsw_sp_netdevice_ipip_ol_change_event(mlxsw_sp, in mlxsw_sp_netdevice_ipip_ol_event()
1901 err = mlxsw_sp_netdevice_ipip_ol_update_mtu(mlxsw_sp, ol_dev); in mlxsw_sp_netdevice_ipip_ol_event()
1908 __mlxsw_sp_netdevice_ipip_ul_event(struct mlxsw_sp *mlxsw_sp, in __mlxsw_sp_netdevice_ipip_ul_event() argument
1923 return mlxsw_sp_netdevice_ipip_ul_vrf_event(mlxsw_sp, in __mlxsw_sp_netdevice_ipip_ul_event()
1931 return mlxsw_sp_netdevice_ipip_ul_up_event(mlxsw_sp, ipip_entry, in __mlxsw_sp_netdevice_ipip_ul_event()
1934 return mlxsw_sp_netdevice_ipip_ul_down_event(mlxsw_sp, in __mlxsw_sp_netdevice_ipip_ul_event()
1942 mlxsw_sp_netdevice_ipip_ul_event(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_netdevice_ipip_ul_event() argument
1950 while ((ipip_entry = mlxsw_sp_ipip_entry_find_by_ul_dev(mlxsw_sp, in mlxsw_sp_netdevice_ipip_ul_event()
1956 err = __mlxsw_sp_netdevice_ipip_ul_event(mlxsw_sp, ipip_entry, in mlxsw_sp_netdevice_ipip_ul_event()
1960 mlxsw_sp_ipip_demote_tunnel_by_ul_netdev(mlxsw_sp, in mlxsw_sp_netdevice_ipip_ul_event()
1967 &mlxsw_sp->router->ipip_list)) in mlxsw_sp_netdevice_ipip_ul_event()
1975 mlxsw_sp_ipip_entry_demote_tunnel(mlxsw_sp, ipip_entry); in mlxsw_sp_netdevice_ipip_ul_event()
1983 int mlxsw_sp_router_nve_promote_decap(struct mlxsw_sp *mlxsw_sp, u32 ul_tb_id, in mlxsw_sp_router_nve_promote_decap() argument
1989 struct mlxsw_sp_router *router = mlxsw_sp->router; in mlxsw_sp_router_nve_promote_decap()
1993 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_router_nve_promote_decap()
2009 fib_entry = mlxsw_sp_router_ip2me_fib_entry_find(mlxsw_sp, ul_tb_id, in mlxsw_sp_router_nve_promote_decap()
2018 err = mlxsw_sp_fib_entry_update(mlxsw_sp, fib_entry); in mlxsw_sp_router_nve_promote_decap()
2026 mlxsw_sp_fib_entry_update(mlxsw_sp, fib_entry); in mlxsw_sp_router_nve_promote_decap()
2028 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_router_nve_promote_decap()
2032 void mlxsw_sp_router_nve_demote_decap(struct mlxsw_sp *mlxsw_sp, u32 ul_tb_id, in mlxsw_sp_router_nve_demote_decap() argument
2037 struct mlxsw_sp_router *router = mlxsw_sp->router; in mlxsw_sp_router_nve_demote_decap()
2040 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_router_nve_demote_decap()
2047 fib_entry = mlxsw_sp_router_ip2me_fib_entry_find(mlxsw_sp, ul_tb_id, in mlxsw_sp_router_nve_demote_decap()
2054 mlxsw_sp_fib_entry_update(mlxsw_sp, fib_entry); in mlxsw_sp_router_nve_demote_decap()
2056 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_router_nve_demote_decap()
2059 static bool mlxsw_sp_router_nve_is_decap(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_router_nve_is_decap() argument
2064 struct mlxsw_sp_router *router = mlxsw_sp->router; in mlxsw_sp_router_nve_is_decap()
2143 int mlxsw_sp_neigh_counter_get(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_neigh_counter_get() argument
2150 return mlxsw_sp_flow_counter_get(mlxsw_sp, neigh_entry->counter_index, in mlxsw_sp_neigh_counter_get()
2155 mlxsw_sp_neigh_entry_alloc(struct mlxsw_sp *mlxsw_sp, struct neighbour *n, in mlxsw_sp_neigh_entry_alloc() argument
2177 mlxsw_sp_neigh_entry_insert(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_neigh_entry_insert() argument
2180 return rhashtable_insert_fast(&mlxsw_sp->router->neigh_ht, in mlxsw_sp_neigh_entry_insert()
2186 mlxsw_sp_neigh_entry_remove(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_neigh_entry_remove() argument
2189 rhashtable_remove_fast(&mlxsw_sp->router->neigh_ht, in mlxsw_sp_neigh_entry_remove()
2195 mlxsw_sp_neigh_counter_should_alloc(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_neigh_counter_should_alloc() argument
2213 devlink = priv_to_devlink(mlxsw_sp->core); in mlxsw_sp_neigh_counter_should_alloc()
2218 mlxsw_sp_neigh_counter_alloc(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_neigh_counter_alloc() argument
2221 if (!mlxsw_sp_neigh_counter_should_alloc(mlxsw_sp, neigh_entry)) in mlxsw_sp_neigh_counter_alloc()
2224 if (mlxsw_sp_flow_counter_alloc(mlxsw_sp, &neigh_entry->counter_index)) in mlxsw_sp_neigh_counter_alloc()
2231 mlxsw_sp_neigh_counter_free(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_neigh_counter_free() argument
2236 mlxsw_sp_flow_counter_free(mlxsw_sp, in mlxsw_sp_neigh_counter_free()
2242 mlxsw_sp_neigh_entry_create(struct mlxsw_sp *mlxsw_sp, struct neighbour *n) in mlxsw_sp_neigh_entry_create() argument
2248 rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp, n->dev); in mlxsw_sp_neigh_entry_create()
2252 neigh_entry = mlxsw_sp_neigh_entry_alloc(mlxsw_sp, n, rif->rif_index); in mlxsw_sp_neigh_entry_create()
2256 err = mlxsw_sp_neigh_entry_insert(mlxsw_sp, neigh_entry); in mlxsw_sp_neigh_entry_create()
2260 mlxsw_sp_neigh_counter_alloc(mlxsw_sp, neigh_entry); in mlxsw_sp_neigh_entry_create()
2261 atomic_inc(&mlxsw_sp->router->neighs_update.neigh_count); in mlxsw_sp_neigh_entry_create()
2272 mlxsw_sp_neigh_entry_destroy(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_neigh_entry_destroy() argument
2276 atomic_dec(&mlxsw_sp->router->neighs_update.neigh_count); in mlxsw_sp_neigh_entry_destroy()
2277 mlxsw_sp_neigh_counter_free(mlxsw_sp, neigh_entry); in mlxsw_sp_neigh_entry_destroy()
2278 mlxsw_sp_neigh_entry_remove(mlxsw_sp, neigh_entry); in mlxsw_sp_neigh_entry_destroy()
2283 mlxsw_sp_neigh_entry_lookup(struct mlxsw_sp *mlxsw_sp, struct neighbour *n) in mlxsw_sp_neigh_entry_lookup() argument
2288 return rhashtable_lookup_fast(&mlxsw_sp->router->neigh_ht, in mlxsw_sp_neigh_entry_lookup()
2293 mlxsw_sp_router_neighs_update_interval_init(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_router_neighs_update_interval_init() argument
2304 mlxsw_sp->router->neighs_update.interval = jiffies_to_msecs(interval); in mlxsw_sp_router_neighs_update_interval_init()
2307 static void mlxsw_sp_router_neigh_ent_ipv4_process(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_router_neigh_ent_ipv4_process() argument
2311 u64 max_rifs = MLXSW_CORE_RES_GET(mlxsw_sp->core, MAX_RIFS); in mlxsw_sp_router_neigh_ent_ipv4_process()
2322 if (!mlxsw_sp->router->rifs[rif]) { in mlxsw_sp_router_neigh_ent_ipv4_process()
2323 dev_err_ratelimited(mlxsw_sp->bus_info->dev, "Incorrect RIF in neighbour entry\n"); in mlxsw_sp_router_neigh_ent_ipv4_process()
2328 dev = mlxsw_sp->router->rifs[rif]->dev; in mlxsw_sp_router_neigh_ent_ipv4_process()
2339 static void mlxsw_sp_router_neigh_ent_ipv6_process(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_router_neigh_ent_ipv6_process() argument
2351 if (!mlxsw_sp->router->rifs[rif]) { in mlxsw_sp_router_neigh_ent_ipv6_process()
2352 dev_err_ratelimited(mlxsw_sp->bus_info->dev, "Incorrect RIF in neighbour entry\n"); in mlxsw_sp_router_neigh_ent_ipv6_process()
2356 dev = mlxsw_sp->router->rifs[rif]->dev; in mlxsw_sp_router_neigh_ent_ipv6_process()
2366 static void mlxsw_sp_router_neigh_ent_ipv6_process(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_router_neigh_ent_ipv6_process() argument
2373 static void mlxsw_sp_router_neigh_rec_ipv4_process(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_router_neigh_rec_ipv4_process() argument
2390 mlxsw_sp_router_neigh_ent_ipv4_process(mlxsw_sp, rauhtd_pl, in mlxsw_sp_router_neigh_rec_ipv4_process()
2396 static void mlxsw_sp_router_neigh_rec_ipv6_process(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_router_neigh_rec_ipv6_process() argument
2401 mlxsw_sp_router_neigh_ent_ipv6_process(mlxsw_sp, rauhtd_pl, in mlxsw_sp_router_neigh_rec_ipv6_process()
2405 static void mlxsw_sp_router_neigh_rec_process(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_router_neigh_rec_process() argument
2410 mlxsw_sp_router_neigh_rec_ipv4_process(mlxsw_sp, rauhtd_pl, in mlxsw_sp_router_neigh_rec_process()
2414 mlxsw_sp_router_neigh_rec_ipv6_process(mlxsw_sp, rauhtd_pl, in mlxsw_sp_router_neigh_rec_process()
2441 __mlxsw_sp_router_neighs_update_rauhtd(struct mlxsw_sp *mlxsw_sp, in __mlxsw_sp_router_neighs_update_rauhtd() argument
2449 mutex_lock(&mlxsw_sp->router->lock); in __mlxsw_sp_router_neighs_update_rauhtd()
2452 err = mlxsw_reg_query(mlxsw_sp->core, MLXSW_REG(rauhtd), in __mlxsw_sp_router_neighs_update_rauhtd()
2455 dev_err_ratelimited(mlxsw_sp->bus_info->dev, "Failed to dump neighbour table\n"); in __mlxsw_sp_router_neighs_update_rauhtd()
2460 mlxsw_sp_router_neigh_rec_process(mlxsw_sp, rauhtd_pl, in __mlxsw_sp_router_neighs_update_rauhtd()
2463 mutex_unlock(&mlxsw_sp->router->lock); in __mlxsw_sp_router_neighs_update_rauhtd()
2468 static int mlxsw_sp_router_neighs_update_rauhtd(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_router_neighs_update_rauhtd() argument
2474 if (!atomic_read(&mlxsw_sp->router->neighs_update.neigh_count)) in mlxsw_sp_router_neighs_update_rauhtd()
2482 err = __mlxsw_sp_router_neighs_update_rauhtd(mlxsw_sp, rauhtd_pl, type); in mlxsw_sp_router_neighs_update_rauhtd()
2487 err = __mlxsw_sp_router_neighs_update_rauhtd(mlxsw_sp, rauhtd_pl, type); in mlxsw_sp_router_neighs_update_rauhtd()
2493 static void mlxsw_sp_router_neighs_update_nh(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_router_neighs_update_nh() argument
2497 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_router_neighs_update_nh()
2498 list_for_each_entry(neigh_entry, &mlxsw_sp->router->nexthop_neighs_list, in mlxsw_sp_router_neighs_update_nh()
2504 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_router_neighs_update_nh()
2508 mlxsw_sp_router_neighs_update_work_schedule(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_router_neighs_update_work_schedule() argument
2510 unsigned long interval = mlxsw_sp->router->neighs_update.interval; in mlxsw_sp_router_neighs_update_work_schedule()
2512 mlxsw_core_schedule_dw(&mlxsw_sp->router->neighs_update.dw, in mlxsw_sp_router_neighs_update_work_schedule()
2523 err = mlxsw_sp_router_neighs_update_rauhtd(router->mlxsw_sp); in mlxsw_sp_router_neighs_update_work()
2525 dev_err(router->mlxsw_sp->bus_info->dev, "Could not update kernel for neigh activity"); in mlxsw_sp_router_neighs_update_work()
2527 mlxsw_sp_router_neighs_update_nh(router->mlxsw_sp); in mlxsw_sp_router_neighs_update_work()
2529 mlxsw_sp_router_neighs_update_work_schedule(router->mlxsw_sp); in mlxsw_sp_router_neighs_update_work()
2557 mlxsw_sp_nexthop_neigh_update(struct mlxsw_sp *mlxsw_sp,
2568 mlxsw_sp_router_neigh_entry_op4(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_router_neigh_entry_op4() argument
2581 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(rauht), rauht_pl); in mlxsw_sp_router_neigh_entry_op4()
2585 mlxsw_sp_router_neigh_entry_op6(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_router_neigh_entry_op6() argument
2598 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(rauht), rauht_pl); in mlxsw_sp_router_neigh_entry_op6()
2616 mlxsw_sp_neigh_entry_update(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_neigh_entry_update() argument
2627 err = mlxsw_sp_router_neigh_entry_op4(mlxsw_sp, neigh_entry, in mlxsw_sp_neigh_entry_update()
2634 err = mlxsw_sp_router_neigh_entry_op6(mlxsw_sp, neigh_entry, in mlxsw_sp_neigh_entry_update()
2650 mlxsw_sp_neigh_entry_counter_update(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_neigh_entry_counter_update() argument
2655 mlxsw_sp_neigh_counter_alloc(mlxsw_sp, neigh_entry); in mlxsw_sp_neigh_entry_counter_update()
2657 mlxsw_sp_neigh_counter_free(mlxsw_sp, neigh_entry); in mlxsw_sp_neigh_entry_counter_update()
2658 mlxsw_sp_neigh_entry_update(mlxsw_sp, neigh_entry, true); in mlxsw_sp_neigh_entry_counter_update()
2663 struct mlxsw_sp *mlxsw_sp; member
2671 struct mlxsw_sp *mlxsw_sp = net_work->mlxsw_sp; in mlxsw_sp_router_neigh_event_work() local
2688 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_router_neigh_event_work()
2689 mlxsw_sp_span_respin(mlxsw_sp); in mlxsw_sp_router_neigh_event_work()
2692 neigh_entry = mlxsw_sp_neigh_entry_lookup(mlxsw_sp, n); in mlxsw_sp_router_neigh_event_work()
2696 neigh_entry = mlxsw_sp_neigh_entry_create(mlxsw_sp, n); in mlxsw_sp_router_neigh_event_work()
2706 mlxsw_sp_neigh_entry_update(mlxsw_sp, neigh_entry, entry_connected); in mlxsw_sp_router_neigh_event_work()
2707 mlxsw_sp_nexthop_neigh_update(mlxsw_sp, neigh_entry, !entry_connected, in mlxsw_sp_router_neigh_event_work()
2711 mlxsw_sp_neigh_entry_destroy(mlxsw_sp, neigh_entry); in mlxsw_sp_router_neigh_event_work()
2714 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_router_neigh_event_work()
2719 static int mlxsw_sp_mp_hash_init(struct mlxsw_sp *mlxsw_sp);
2725 struct mlxsw_sp *mlxsw_sp = net_work->mlxsw_sp; in mlxsw_sp_router_mp_hash_event_work() local
2727 mlxsw_sp_mp_hash_init(mlxsw_sp); in mlxsw_sp_router_mp_hash_event_work()
2731 static int __mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp);
2737 struct mlxsw_sp *mlxsw_sp = net_work->mlxsw_sp; in mlxsw_sp_router_update_priority_work() local
2739 __mlxsw_sp_router_init(mlxsw_sp); in mlxsw_sp_router_update_priority_work()
2751 if (!net_eq(net, mlxsw_sp_net(router->mlxsw_sp))) in mlxsw_sp_router_schedule_work()
2759 net_work->mlxsw_sp = router->mlxsw_sp; in mlxsw_sp_router_schedule_work()
2769 struct mlxsw_sp *mlxsw_sp; in mlxsw_sp_router_netevent_event() local
2790 mlxsw_sp = mlxsw_sp_port->mlxsw_sp; in mlxsw_sp_router_netevent_event()
2792 mlxsw_sp->router->neighs_update.interval = interval; in mlxsw_sp_router_netevent_event()
2813 net_work->mlxsw_sp = mlxsw_sp_port->mlxsw_sp; in mlxsw_sp_router_netevent_event()
2837 static int mlxsw_sp_neigh_init(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_neigh_init() argument
2841 err = rhashtable_init(&mlxsw_sp->router->neigh_ht, in mlxsw_sp_neigh_init()
2849 mlxsw_sp_router_neighs_update_interval_init(mlxsw_sp); in mlxsw_sp_neigh_init()
2852 INIT_DELAYED_WORK(&mlxsw_sp->router->neighs_update.dw, in mlxsw_sp_neigh_init()
2854 INIT_DELAYED_WORK(&mlxsw_sp->router->nexthop_probe_dw, in mlxsw_sp_neigh_init()
2856 atomic_set(&mlxsw_sp->router->neighs_update.neigh_count, 0); in mlxsw_sp_neigh_init()
2857 mlxsw_core_schedule_dw(&mlxsw_sp->router->neighs_update.dw, 0); in mlxsw_sp_neigh_init()
2858 mlxsw_core_schedule_dw(&mlxsw_sp->router->nexthop_probe_dw, 0); in mlxsw_sp_neigh_init()
2862 static void mlxsw_sp_neigh_fini(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_neigh_fini() argument
2864 cancel_delayed_work_sync(&mlxsw_sp->router->neighs_update.dw); in mlxsw_sp_neigh_fini()
2865 cancel_delayed_work_sync(&mlxsw_sp->router->nexthop_probe_dw); in mlxsw_sp_neigh_fini()
2866 rhashtable_destroy(&mlxsw_sp->router->neigh_ht); in mlxsw_sp_neigh_fini()
2869 static void mlxsw_sp_neigh_rif_gone_sync(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_neigh_rif_gone_sync() argument
2876 mlxsw_sp_neigh_entry_update(mlxsw_sp, neigh_entry, false); in mlxsw_sp_neigh_rif_gone_sync()
2877 mlxsw_sp_neigh_entry_destroy(mlxsw_sp, neigh_entry); in mlxsw_sp_neigh_rif_gone_sync()
2984 void mlxsw_sp_nexthop_counter_alloc(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_counter_alloc() argument
2989 devlink = priv_to_devlink(mlxsw_sp->core); in mlxsw_sp_nexthop_counter_alloc()
2994 if (mlxsw_sp_flow_counter_alloc(mlxsw_sp, &nh->counter_index)) in mlxsw_sp_nexthop_counter_alloc()
3000 void mlxsw_sp_nexthop_counter_free(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_counter_free() argument
3005 mlxsw_sp_flow_counter_free(mlxsw_sp, nh->counter_index); in mlxsw_sp_nexthop_counter_free()
3009 int mlxsw_sp_nexthop_counter_get(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_counter_get() argument
3015 return mlxsw_sp_flow_counter_get(mlxsw_sp, nh->counter_index, in mlxsw_sp_nexthop_counter_get()
3329 static int mlxsw_sp_nexthop_group_insert(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_group_insert() argument
3336 return rhashtable_insert_fast(&mlxsw_sp->router->nexthop_group_ht, in mlxsw_sp_nexthop_group_insert()
3341 static void mlxsw_sp_nexthop_group_remove(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_group_remove() argument
3348 rhashtable_remove_fast(&mlxsw_sp->router->nexthop_group_ht, in mlxsw_sp_nexthop_group_remove()
3354 mlxsw_sp_nexthop4_group_lookup(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop4_group_lookup() argument
3361 return rhashtable_lookup_fast(&mlxsw_sp->router->nexthop_group_ht, in mlxsw_sp_nexthop4_group_lookup()
3367 mlxsw_sp_nexthop6_group_lookup(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop6_group_lookup() argument
3374 return rhashtable_lookup_fast(&mlxsw_sp->router->nexthop_group_ht, in mlxsw_sp_nexthop6_group_lookup()
3385 static int mlxsw_sp_nexthop_insert(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_insert() argument
3388 return rhashtable_insert_fast(&mlxsw_sp->router->nexthop_ht, in mlxsw_sp_nexthop_insert()
3392 static void mlxsw_sp_nexthop_remove(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_remove() argument
3395 rhashtable_remove_fast(&mlxsw_sp->router->nexthop_ht, &nh->ht_node, in mlxsw_sp_nexthop_remove()
3400 mlxsw_sp_nexthop_lookup(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_lookup() argument
3403 return rhashtable_lookup_fast(&mlxsw_sp->router->nexthop_ht, &key, in mlxsw_sp_nexthop_lookup()
3407 static int mlxsw_sp_adj_index_mass_update_vr(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_adj_index_mass_update_vr() argument
3420 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(raleu), raleu_pl); in mlxsw_sp_adj_index_mass_update_vr()
3423 static int mlxsw_sp_adj_index_mass_update(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_adj_index_mass_update() argument
3432 err = mlxsw_sp_adj_index_mass_update_vr(mlxsw_sp, in mlxsw_sp_adj_index_mass_update()
3446 mlxsw_sp_adj_index_mass_update_vr(mlxsw_sp, vr_entry->key.proto, in mlxsw_sp_adj_index_mass_update()
3454 static int __mlxsw_sp_nexthop_eth_update(struct mlxsw_sp *mlxsw_sp, in __mlxsw_sp_nexthop_eth_update() argument
3464 mlxsw_sp->router->lb_rif_index; in __mlxsw_sp_nexthop_eth_update()
3491 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ratr), ratr_pl); in __mlxsw_sp_nexthop_eth_update()
3494 int mlxsw_sp_nexthop_eth_update(struct mlxsw_sp *mlxsw_sp, u32 adj_index, in mlxsw_sp_nexthop_eth_update() argument
3503 err = __mlxsw_sp_nexthop_eth_update(mlxsw_sp, adj_index + i, in mlxsw_sp_nexthop_eth_update()
3512 static int __mlxsw_sp_nexthop_ipip_update(struct mlxsw_sp *mlxsw_sp, in __mlxsw_sp_nexthop_ipip_update() argument
3519 ipip_ops = mlxsw_sp->router->ipip_ops_arr[nh->ipip_entry->ipipt]; in __mlxsw_sp_nexthop_ipip_update()
3520 return ipip_ops->nexthop_update(mlxsw_sp, adj_index, nh->ipip_entry, in __mlxsw_sp_nexthop_ipip_update()
3524 static int mlxsw_sp_nexthop_ipip_update(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_ipip_update() argument
3534 err = __mlxsw_sp_nexthop_ipip_update(mlxsw_sp, adj_index + i, in mlxsw_sp_nexthop_ipip_update()
3543 static int mlxsw_sp_nexthop_update(struct mlxsw_sp *mlxsw_sp, u32 adj_index, in mlxsw_sp_nexthop_update() argument
3553 return mlxsw_sp_nexthop_eth_update(mlxsw_sp, adj_index, nh, in mlxsw_sp_nexthop_update()
3556 return mlxsw_sp_nexthop_ipip_update(mlxsw_sp, adj_index, nh, in mlxsw_sp_nexthop_update()
3561 mlxsw_sp_nexthop_group_update(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_group_update() argument
3581 err = mlxsw_sp_nexthop_update(mlxsw_sp, adj_index, nh, in mlxsw_sp_nexthop_group_update()
3594 mlxsw_sp_nexthop_fib_entries_update(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_fib_entries_update() argument
3601 err = mlxsw_sp_fib_entry_update(mlxsw_sp, fib_entry); in mlxsw_sp_nexthop_fib_entries_update()
3634 static void mlxsw_sp_adj_grp_size_round_up(const struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_adj_grp_size_round_up() argument
3639 for (i = 0; i < mlxsw_sp->router->adj_grp_size_ranges_count; i++) { in mlxsw_sp_adj_grp_size_round_up()
3642 size_range = &mlxsw_sp->router->adj_grp_size_ranges[i]; in mlxsw_sp_adj_grp_size_round_up()
3655 static void mlxsw_sp_adj_grp_size_round_down(const struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_adj_grp_size_round_down() argument
3661 for (i = mlxsw_sp->router->adj_grp_size_ranges_count - 1; i >= 0; i--) { in mlxsw_sp_adj_grp_size_round_down()
3664 size_range = &mlxsw_sp->router->adj_grp_size_ranges[i]; in mlxsw_sp_adj_grp_size_round_down()
3673 static int mlxsw_sp_fix_adj_grp_size(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fix_adj_grp_size() argument
3682 mlxsw_sp_adj_grp_size_round_up(mlxsw_sp, p_adj_grp_size); in mlxsw_sp_fix_adj_grp_size()
3683 err = mlxsw_sp_kvdl_alloc_count_query(mlxsw_sp, in mlxsw_sp_fix_adj_grp_size()
3692 mlxsw_sp_adj_grp_size_round_down(mlxsw_sp, p_adj_grp_size, alloc_size); in mlxsw_sp_fix_adj_grp_size()
3751 mlxsw_sp_nexthop4_group_offload_refresh(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop4_group_offload_refresh() argument
3785 mlxsw_sp_nexthop6_group_offload_refresh(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop6_group_offload_refresh() argument
3800 mlxsw_sp_nexthop_bucket_offload_refresh(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_bucket_offload_refresh() argument
3813 nexthop_bucket_set_hw_flags(mlxsw_sp_net(mlxsw_sp), nh_grp->obj.id, in mlxsw_sp_nexthop_bucket_offload_refresh()
3818 mlxsw_sp_nexthop_obj_group_offload_refresh(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_obj_group_offload_refresh() argument
3834 nexthop_set_hw_flags(mlxsw_sp_net(mlxsw_sp), nh_grp->obj.id, in mlxsw_sp_nexthop_obj_group_offload_refresh()
3846 mlxsw_sp_nexthop_bucket_offload_refresh(mlxsw_sp, nh, i); in mlxsw_sp_nexthop_obj_group_offload_refresh()
3851 mlxsw_sp_nexthop_group_offload_refresh(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_group_offload_refresh() argument
3856 mlxsw_sp_nexthop4_group_offload_refresh(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop_group_offload_refresh()
3859 mlxsw_sp_nexthop6_group_offload_refresh(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop_group_offload_refresh()
3862 mlxsw_sp_nexthop_obj_group_offload_refresh(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop_group_offload_refresh()
3868 mlxsw_sp_nexthop_group_refresh(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_group_refresh() argument
3881 return mlxsw_sp_nexthop_fib_entries_update(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop_group_refresh()
3896 err = mlxsw_sp_nexthop_group_update(mlxsw_sp, nhgi, false); in mlxsw_sp_nexthop_group_refresh()
3898 dev_warn(mlxsw_sp->bus_info->dev, "Failed to update neigh MAC in adjacency table.\n"); in mlxsw_sp_nexthop_group_refresh()
3904 mlxsw_sp_nexthop_group_offload_refresh(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop_group_refresh()
3917 err = mlxsw_sp_fix_adj_grp_size(mlxsw_sp, &ecmp_size); in mlxsw_sp_nexthop_group_refresh()
3922 err = mlxsw_sp_kvdl_alloc(mlxsw_sp, MLXSW_SP_KVDL_ENTRY_TYPE_ADJ, in mlxsw_sp_nexthop_group_refresh()
3928 dev_warn(mlxsw_sp->bus_info->dev, "Failed to allocate KVD linear area for nexthop group.\n"); in mlxsw_sp_nexthop_group_refresh()
3938 err = mlxsw_sp_nexthop_group_update(mlxsw_sp, nhgi, true); in mlxsw_sp_nexthop_group_refresh()
3940 dev_warn(mlxsw_sp->bus_info->dev, "Failed to update neigh MAC in adjacency table.\n"); in mlxsw_sp_nexthop_group_refresh()
3944 mlxsw_sp_nexthop_group_offload_refresh(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop_group_refresh()
3950 err = mlxsw_sp_nexthop_fib_entries_update(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop_group_refresh()
3952 dev_warn(mlxsw_sp->bus_info->dev, "Failed to add adjacency index to fib entries.\n"); in mlxsw_sp_nexthop_group_refresh()
3958 err = mlxsw_sp_adj_index_mass_update(mlxsw_sp, nh_grp, in mlxsw_sp_nexthop_group_refresh()
3960 mlxsw_sp_kvdl_free(mlxsw_sp, MLXSW_SP_KVDL_ENTRY_TYPE_ADJ, in mlxsw_sp_nexthop_group_refresh()
3963 dev_warn(mlxsw_sp->bus_info->dev, "Failed to mass-update adjacency index for nexthop group.\n"); in mlxsw_sp_nexthop_group_refresh()
3976 err2 = mlxsw_sp_nexthop_fib_entries_update(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop_group_refresh()
3978 dev_warn(mlxsw_sp->bus_info->dev, "Failed to set traps for fib entries.\n"); in mlxsw_sp_nexthop_group_refresh()
3979 mlxsw_sp_nexthop_group_offload_refresh(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop_group_refresh()
3981 mlxsw_sp_kvdl_free(mlxsw_sp, MLXSW_SP_KVDL_ENTRY_TYPE_ADJ, in mlxsw_sp_nexthop_group_refresh()
4002 mlxsw_sp_nexthop_dead_neigh_replace(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_dead_neigh_replace() argument
4022 mlxsw_sp_neigh_entry_remove(mlxsw_sp, neigh_entry); in mlxsw_sp_nexthop_dead_neigh_replace()
4024 err = mlxsw_sp_neigh_entry_insert(mlxsw_sp, neigh_entry); in mlxsw_sp_nexthop_dead_neigh_replace()
4039 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh->nhgi->nh_grp); in mlxsw_sp_nexthop_dead_neigh_replace()
4048 mlxsw_sp_neigh_entry_insert(mlxsw_sp, neigh_entry); in mlxsw_sp_nexthop_dead_neigh_replace()
4054 mlxsw_sp_nexthop_neigh_update(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_neigh_update() argument
4066 err = mlxsw_sp_nexthop_dead_neigh_replace(mlxsw_sp, in mlxsw_sp_nexthop_neigh_update()
4069 dev_err(mlxsw_sp->bus_info->dev, "Failed to replace dead neigh\n"); in mlxsw_sp_nexthop_neigh_update()
4076 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh->nhgi->nh_grp); in mlxsw_sp_nexthop_neigh_update()
4099 static int mlxsw_sp_nexthop_neigh_init(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_neigh_init() argument
4122 neigh_entry = mlxsw_sp_neigh_entry_lookup(mlxsw_sp, n); in mlxsw_sp_nexthop_neigh_init()
4124 neigh_entry = mlxsw_sp_neigh_entry_create(mlxsw_sp, n); in mlxsw_sp_nexthop_neigh_init()
4136 &mlxsw_sp->router->nexthop_neighs_list); in mlxsw_sp_nexthop_neigh_init()
4153 static void mlxsw_sp_nexthop_neigh_fini(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_neigh_fini() argument
4174 mlxsw_sp_neigh_entry_destroy(mlxsw_sp, neigh_entry); in mlxsw_sp_nexthop_neigh_fini()
4192 static void mlxsw_sp_nexthop_ipip_init(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_ipip_init() argument
4207 static void mlxsw_sp_nexthop_ipip_fini(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_ipip_fini() argument
4219 static bool mlxsw_sp_nexthop4_ipip_type(const struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop4_ipip_type() argument
4227 mlxsw_sp_netdev_ipip_type(mlxsw_sp, dev, p_ipipt); in mlxsw_sp_nexthop4_ipip_type()
4230 static int mlxsw_sp_nexthop_type_init(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_type_init() argument
4239 ipip_entry = mlxsw_sp_ipip_entry_find_by_ol_dev(mlxsw_sp, dev); in mlxsw_sp_nexthop_type_init()
4241 ipip_ops = mlxsw_sp->router->ipip_ops_arr[ipip_entry->ipipt]; in mlxsw_sp_nexthop_type_init()
4242 if (ipip_ops->can_offload(mlxsw_sp, dev)) { in mlxsw_sp_nexthop_type_init()
4244 mlxsw_sp_nexthop_ipip_init(mlxsw_sp, nh, ipip_entry); in mlxsw_sp_nexthop_type_init()
4250 rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp, dev); in mlxsw_sp_nexthop_type_init()
4255 err = mlxsw_sp_nexthop_neigh_init(mlxsw_sp, nh); in mlxsw_sp_nexthop_type_init()
4266 static void mlxsw_sp_nexthop_type_fini(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_type_fini() argument
4271 mlxsw_sp_nexthop_neigh_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop_type_fini()
4276 mlxsw_sp_nexthop_ipip_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop_type_fini()
4281 static int mlxsw_sp_nexthop4_init(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop4_init() argument
4299 err = mlxsw_sp_nexthop_insert(mlxsw_sp, nh); in mlxsw_sp_nexthop4_init()
4303 mlxsw_sp_nexthop_counter_alloc(mlxsw_sp, nh); in mlxsw_sp_nexthop4_init()
4304 list_add_tail(&nh->router_list_node, &mlxsw_sp->router->nexthop_list); in mlxsw_sp_nexthop4_init()
4319 err = mlxsw_sp_nexthop_type_init(mlxsw_sp, nh, dev); in mlxsw_sp_nexthop4_init()
4327 mlxsw_sp_nexthop_counter_free(mlxsw_sp, nh); in mlxsw_sp_nexthop4_init()
4328 mlxsw_sp_nexthop_remove(mlxsw_sp, nh); in mlxsw_sp_nexthop4_init()
4332 static void mlxsw_sp_nexthop4_fini(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop4_fini() argument
4335 mlxsw_sp_nexthop_type_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop4_fini()
4337 mlxsw_sp_nexthop_counter_free(mlxsw_sp, nh); in mlxsw_sp_nexthop4_fini()
4338 mlxsw_sp_nexthop_remove(mlxsw_sp, nh); in mlxsw_sp_nexthop4_fini()
4341 static void mlxsw_sp_nexthop4_event(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop4_event() argument
4348 nh = mlxsw_sp_nexthop_lookup(mlxsw_sp, key); in mlxsw_sp_nexthop4_event()
4354 mlxsw_sp_nexthop_type_init(mlxsw_sp, nh, fib_nh->fib_nh_dev); in mlxsw_sp_nexthop4_event()
4357 mlxsw_sp_nexthop_type_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop4_event()
4361 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh->nhgi->nh_grp); in mlxsw_sp_nexthop4_event()
4364 static void mlxsw_sp_nexthop_rif_update(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_rif_update() argument
4384 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh->nhgi->nh_grp); in mlxsw_sp_nexthop_rif_update()
4388 static void mlxsw_sp_nexthop_rif_migrate(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_rif_migrate() argument
4397 mlxsw_sp_nexthop_rif_update(mlxsw_sp, new_rif); in mlxsw_sp_nexthop_rif_migrate()
4400 static void mlxsw_sp_nexthop_rif_gone_sync(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_rif_gone_sync() argument
4406 mlxsw_sp_nexthop_type_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop_rif_gone_sync()
4407 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh->nhgi->nh_grp); in mlxsw_sp_nexthop_rif_gone_sync()
4411 static int mlxsw_sp_adj_trap_entry_init(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_adj_trap_entry_init() argument
4417 err = mlxsw_sp_kvdl_alloc(mlxsw_sp, MLXSW_SP_KVDL_ENTRY_TYPE_ADJ, 1, in mlxsw_sp_adj_trap_entry_init()
4418 &mlxsw_sp->router->adj_trap_index); in mlxsw_sp_adj_trap_entry_init()
4425 mlxsw_sp->router->adj_trap_index, in mlxsw_sp_adj_trap_entry_init()
4426 mlxsw_sp->router->lb_rif_index); in mlxsw_sp_adj_trap_entry_init()
4429 err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ratr), ratr_pl); in mlxsw_sp_adj_trap_entry_init()
4436 mlxsw_sp_kvdl_free(mlxsw_sp, MLXSW_SP_KVDL_ENTRY_TYPE_ADJ, 1, in mlxsw_sp_adj_trap_entry_init()
4437 mlxsw_sp->router->adj_trap_index); in mlxsw_sp_adj_trap_entry_init()
4441 static void mlxsw_sp_adj_trap_entry_fini(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_adj_trap_entry_fini() argument
4443 mlxsw_sp_kvdl_free(mlxsw_sp, MLXSW_SP_KVDL_ENTRY_TYPE_ADJ, 1, in mlxsw_sp_adj_trap_entry_fini()
4444 mlxsw_sp->router->adj_trap_index); in mlxsw_sp_adj_trap_entry_fini()
4447 static int mlxsw_sp_nexthop_group_inc(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_nexthop_group_inc() argument
4451 if (refcount_inc_not_zero(&mlxsw_sp->router->num_groups)) in mlxsw_sp_nexthop_group_inc()
4454 err = mlxsw_sp_adj_trap_entry_init(mlxsw_sp); in mlxsw_sp_nexthop_group_inc()
4458 refcount_set(&mlxsw_sp->router->num_groups, 1); in mlxsw_sp_nexthop_group_inc()
4463 static void mlxsw_sp_nexthop_group_dec(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_nexthop_group_dec() argument
4465 if (!refcount_dec_and_test(&mlxsw_sp->router->num_groups)) in mlxsw_sp_nexthop_group_dec()
4468 mlxsw_sp_adj_trap_entry_fini(mlxsw_sp); in mlxsw_sp_nexthop_group_dec()
4472 mlxsw_sp_nh_grp_activity_get(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nh_grp_activity_get() argument
4485 err = mlxsw_reg_query(mlxsw_sp->core, MLXSW_REG(ratrad), ratrad_pl); in mlxsw_sp_nh_grp_activity_get()
4502 mlxsw_sp_nh_grp_activity_update(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nh_grp_activity_update() argument
4511 mlxsw_sp_nh_grp_activity_get(mlxsw_sp, nh_grp, activity); in mlxsw_sp_nh_grp_activity_update()
4512 nexthop_res_grp_activity_update(mlxsw_sp_net(mlxsw_sp), nh_grp->obj.id, in mlxsw_sp_nh_grp_activity_update()
4519 mlxsw_sp_nh_grp_activity_work_schedule(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_nh_grp_activity_work_schedule() argument
4523 mlxsw_core_schedule_dw(&mlxsw_sp->router->nh_grp_activity_dw, in mlxsw_sp_nh_grp_activity_work_schedule()
4539 mlxsw_sp_nh_grp_activity_update(router->mlxsw_sp, nhgi->nh_grp); in mlxsw_sp_nh_grp_activity_work()
4547 mlxsw_sp_nh_grp_activity_work_schedule(router->mlxsw_sp); in mlxsw_sp_nh_grp_activity_work()
4551 mlxsw_sp_nexthop_obj_single_validate(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_obj_single_validate() argument
4568 mlxsw_sp_nexthop_obj_group_entry_validate(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_obj_group_entry_validate() argument
4574 err = mlxsw_sp_nexthop_obj_single_validate(mlxsw_sp, nh, extack); in mlxsw_sp_nexthop_obj_group_entry_validate()
4582 !mlxsw_sp_netdev_ipip_type(mlxsw_sp, nh->dev, NULL)) { in mlxsw_sp_nexthop_obj_group_entry_validate()
4591 mlxsw_sp_nexthop_obj_group_validate(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_obj_group_validate() argument
4607 err = mlxsw_sp_nexthop_obj_group_entry_validate(mlxsw_sp, nh, in mlxsw_sp_nexthop_obj_group_validate()
4617 mlxsw_sp_nexthop_obj_res_group_size_validate(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_obj_res_group_size_validate() argument
4630 for (i = 0; i < mlxsw_sp->router->adj_grp_size_ranges_count; i++) { in mlxsw_sp_nexthop_obj_res_group_size_validate()
4633 size_range = &mlxsw_sp->router->adj_grp_size_ranges[i]; in mlxsw_sp_nexthop_obj_res_group_size_validate()
4647 err = mlxsw_sp_kvdl_alloc_count_query(mlxsw_sp, in mlxsw_sp_nexthop_obj_res_group_size_validate()
4660 mlxsw_sp_nexthop_obj_res_group_validate(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_obj_res_group_validate() argument
4667 err = mlxsw_sp_nexthop_obj_res_group_size_validate(mlxsw_sp, in mlxsw_sp_nexthop_obj_res_group_validate()
4678 err = mlxsw_sp_nexthop_obj_group_entry_validate(mlxsw_sp, nh, in mlxsw_sp_nexthop_obj_res_group_validate()
4687 static int mlxsw_sp_nexthop_obj_validate(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_obj_validate() argument
4700 return mlxsw_sp_nexthop_obj_single_validate(mlxsw_sp, info->nh, in mlxsw_sp_nexthop_obj_validate()
4703 return mlxsw_sp_nexthop_obj_group_validate(mlxsw_sp, in mlxsw_sp_nexthop_obj_validate()
4707 return mlxsw_sp_nexthop_obj_res_group_validate(mlxsw_sp, in mlxsw_sp_nexthop_obj_validate()
4712 return mlxsw_sp_nexthop_obj_group_entry_validate(mlxsw_sp, nh, in mlxsw_sp_nexthop_obj_validate()
4720 static bool mlxsw_sp_nexthop_obj_is_gateway(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_obj_is_gateway() argument
4729 mlxsw_sp_netdev_ipip_type(mlxsw_sp, dev, NULL); in mlxsw_sp_nexthop_obj_is_gateway()
4739 static void mlxsw_sp_nexthop_obj_blackhole_init(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_obj_blackhole_init() argument
4742 u16 lb_rif_index = mlxsw_sp->router->lb_rif_index; in mlxsw_sp_nexthop_obj_blackhole_init()
4750 nh->rif = mlxsw_sp->router->rifs[lb_rif_index]; in mlxsw_sp_nexthop_obj_blackhole_init()
4753 static void mlxsw_sp_nexthop_obj_blackhole_fini(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_obj_blackhole_fini() argument
4761 mlxsw_sp_nexthop_obj_init(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_obj_init() argument
4785 mlxsw_sp_nexthop_counter_alloc(mlxsw_sp, nh); in mlxsw_sp_nexthop_obj_init()
4786 list_add_tail(&nh->router_list_node, &mlxsw_sp->router->nexthop_list); in mlxsw_sp_nexthop_obj_init()
4789 err = mlxsw_sp_nexthop_type_init(mlxsw_sp, nh, dev); in mlxsw_sp_nexthop_obj_init()
4794 mlxsw_sp_nexthop_obj_blackhole_init(mlxsw_sp, nh); in mlxsw_sp_nexthop_obj_init()
4809 mlxsw_sp_nexthop_counter_free(mlxsw_sp, nh); in mlxsw_sp_nexthop_obj_init()
4813 static void mlxsw_sp_nexthop_obj_fini(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_obj_fini() argument
4817 mlxsw_sp_nexthop_obj_blackhole_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop_obj_fini()
4818 mlxsw_sp_nexthop_type_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop_obj_fini()
4820 mlxsw_sp_nexthop_counter_free(mlxsw_sp, nh); in mlxsw_sp_nexthop_obj_fini()
4825 mlxsw_sp_nexthop_obj_group_info_init(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_obj_group_info_init() argument
4855 nhgi->gateway = mlxsw_sp_nexthop_obj_is_gateway(mlxsw_sp, info); in mlxsw_sp_nexthop_obj_group_info_init()
4880 err = mlxsw_sp_nexthop_obj_init(mlxsw_sp, nh_grp, nh, nh_obj, in mlxsw_sp_nexthop_obj_group_info_init()
4885 err = mlxsw_sp_nexthop_group_inc(mlxsw_sp); in mlxsw_sp_nexthop_obj_group_info_init()
4888 err = mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop_obj_group_info_init()
4898 if (list_empty(&mlxsw_sp->router->nh_res_grp_list)) in mlxsw_sp_nexthop_obj_group_info_init()
4899 mlxsw_sp_nh_grp_activity_work_schedule(mlxsw_sp); in mlxsw_sp_nexthop_obj_group_info_init()
4900 list_add(&nhgi->list, &mlxsw_sp->router->nh_res_grp_list); in mlxsw_sp_nexthop_obj_group_info_init()
4906 mlxsw_sp_nexthop_group_dec(mlxsw_sp); in mlxsw_sp_nexthop_obj_group_info_init()
4912 mlxsw_sp_nexthop_obj_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop_obj_group_info_init()
4919 mlxsw_sp_nexthop_obj_group_info_fini(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_obj_group_info_fini() argument
4923 struct mlxsw_sp_router *router = mlxsw_sp->router; in mlxsw_sp_nexthop_obj_group_info_fini()
4928 if (list_empty(&mlxsw_sp->router->nh_res_grp_list)) in mlxsw_sp_nexthop_obj_group_info_fini()
4932 mlxsw_sp_nexthop_group_dec(mlxsw_sp); in mlxsw_sp_nexthop_obj_group_info_fini()
4936 mlxsw_sp_nexthop_obj_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop_obj_group_info_fini()
4938 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop_obj_group_info_fini()
4944 mlxsw_sp_nexthop_obj_group_create(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_obj_group_create() argument
4962 err = mlxsw_sp_nexthop_obj_group_info_init(mlxsw_sp, nh_grp, info); in mlxsw_sp_nexthop_obj_group_create()
4978 mlxsw_sp_nexthop_obj_group_destroy(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_obj_group_destroy() argument
4983 mlxsw_sp_nexthop_obj_group_info_fini(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop_obj_group_destroy()
4991 mlxsw_sp_nexthop_obj_group_lookup(struct mlxsw_sp *mlxsw_sp, u32 id) in mlxsw_sp_nexthop_obj_group_lookup() argument
4997 return rhashtable_lookup_fast(&mlxsw_sp->router->nexthop_group_ht, in mlxsw_sp_nexthop_obj_group_lookup()
5002 static int mlxsw_sp_nexthop_obj_group_add(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_obj_group_add() argument
5005 return mlxsw_sp_nexthop_group_insert(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop_obj_group_add()
5009 mlxsw_sp_nexthop_obj_group_replace(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_obj_group_replace() argument
5028 err = mlxsw_sp_adj_index_mass_update(mlxsw_sp, old_nh_grp, in mlxsw_sp_nexthop_obj_group_replace()
5040 err = mlxsw_sp_nexthop_fib_entries_update(mlxsw_sp, old_nh_grp); in mlxsw_sp_nexthop_obj_group_replace()
5050 err = mlxsw_sp_nexthop_fib_entries_update(mlxsw_sp, old_nh_grp); in mlxsw_sp_nexthop_obj_group_replace()
5060 mlxsw_sp_nexthop_obj_group_offload_refresh(mlxsw_sp, old_nh_grp); in mlxsw_sp_nexthop_obj_group_replace()
5067 mlxsw_sp_nexthop_obj_group_destroy(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop_obj_group_replace()
5079 static int mlxsw_sp_nexthop_obj_new(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_obj_new() argument
5086 nh_grp = mlxsw_sp_nexthop_obj_group_create(mlxsw_sp, info); in mlxsw_sp_nexthop_obj_new()
5090 old_nh_grp = mlxsw_sp_nexthop_obj_group_lookup(mlxsw_sp, info->id); in mlxsw_sp_nexthop_obj_new()
5092 err = mlxsw_sp_nexthop_obj_group_add(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop_obj_new()
5094 err = mlxsw_sp_nexthop_obj_group_replace(mlxsw_sp, nh_grp, in mlxsw_sp_nexthop_obj_new()
5099 mlxsw_sp_nexthop_obj_group_destroy(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop_obj_new()
5105 static void mlxsw_sp_nexthop_obj_del(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_obj_del() argument
5110 nh_grp = mlxsw_sp_nexthop_obj_group_lookup(mlxsw_sp, info->id); in mlxsw_sp_nexthop_obj_del()
5115 mlxsw_sp_nexthop_group_remove(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop_obj_del()
5122 mlxsw_sp_nexthop_obj_group_destroy(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop_obj_del()
5125 static int mlxsw_sp_nexthop_obj_bucket_query(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_obj_bucket_query() argument
5133 return mlxsw_reg_query(mlxsw_sp->core, MLXSW_REG(ratr), ratr_pl); in mlxsw_sp_nexthop_obj_bucket_query()
5156 mlxsw_sp_nexthop_obj_bucket_adj_update(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_obj_bucket_adj_update() argument
5176 err = mlxsw_sp_nexthop_update(mlxsw_sp, adj_index, nh, force, ratr_pl); in mlxsw_sp_nexthop_obj_bucket_adj_update()
5183 err = mlxsw_sp_nexthop_obj_bucket_query(mlxsw_sp, adj_index, in mlxsw_sp_nexthop_obj_bucket_adj_update()
5199 mlxsw_sp_nexthop_bucket_offload_refresh(mlxsw_sp, nh, bucket_index); in mlxsw_sp_nexthop_obj_bucket_adj_update()
5204 static int mlxsw_sp_nexthop_obj_bucket_replace(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop_obj_bucket_replace() argument
5215 nh_grp = mlxsw_sp_nexthop_obj_group_lookup(mlxsw_sp, info->id); in mlxsw_sp_nexthop_obj_bucket_replace()
5229 mlxsw_sp_nexthop_obj_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop_obj_bucket_replace()
5232 err = mlxsw_sp_nexthop_obj_init(mlxsw_sp, nh_grp, nh, nh_obj, 1); in mlxsw_sp_nexthop_obj_bucket_replace()
5238 err = mlxsw_sp_nexthop_obj_bucket_adj_update(mlxsw_sp, nh, info); in mlxsw_sp_nexthop_obj_bucket_replace()
5245 mlxsw_sp_nexthop_obj_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop_obj_bucket_replace()
5248 mlxsw_sp_nexthop_obj_init(mlxsw_sp, nh_grp, nh, nh_obj, 1); in mlxsw_sp_nexthop_obj_bucket_replace()
5263 err = mlxsw_sp_nexthop_obj_validate(router->mlxsw_sp, event, info); in mlxsw_sp_nexthop_obj_event()
5271 err = mlxsw_sp_nexthop_obj_new(router->mlxsw_sp, info); in mlxsw_sp_nexthop_obj_event()
5274 mlxsw_sp_nexthop_obj_del(router->mlxsw_sp, info); in mlxsw_sp_nexthop_obj_event()
5277 err = mlxsw_sp_nexthop_obj_bucket_replace(router->mlxsw_sp, in mlxsw_sp_nexthop_obj_event()
5290 static bool mlxsw_sp_fi_is_gateway(const struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fi_is_gateway() argument
5296 mlxsw_sp_nexthop4_ipip_type(mlxsw_sp, nh, NULL); in mlxsw_sp_fi_is_gateway()
5300 mlxsw_sp_nexthop4_group_info_init(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop4_group_info_init() argument
5313 nhgi->gateway = mlxsw_sp_fi_is_gateway(mlxsw_sp, nh_grp->ipv4.fi); in mlxsw_sp_nexthop4_group_info_init()
5320 err = mlxsw_sp_nexthop4_init(mlxsw_sp, nh_grp, nh, fib_nh); in mlxsw_sp_nexthop4_group_info_init()
5324 err = mlxsw_sp_nexthop_group_inc(mlxsw_sp); in mlxsw_sp_nexthop4_group_info_init()
5327 err = mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop4_group_info_init()
5334 mlxsw_sp_nexthop_group_dec(mlxsw_sp); in mlxsw_sp_nexthop4_group_info_init()
5340 mlxsw_sp_nexthop4_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop4_group_info_init()
5347 mlxsw_sp_nexthop4_group_info_fini(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop4_group_info_fini() argument
5353 mlxsw_sp_nexthop_group_dec(mlxsw_sp); in mlxsw_sp_nexthop4_group_info_fini()
5357 mlxsw_sp_nexthop4_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop4_group_info_fini()
5359 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop4_group_info_fini()
5365 mlxsw_sp_nexthop4_group_create(struct mlxsw_sp *mlxsw_sp, struct fib_info *fi) in mlxsw_sp_nexthop4_group_create() argument
5383 err = mlxsw_sp_nexthop4_group_info_init(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop4_group_create()
5387 err = mlxsw_sp_nexthop_group_insert(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop4_group_create()
5396 mlxsw_sp_nexthop4_group_info_fini(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop4_group_create()
5406 mlxsw_sp_nexthop4_group_destroy(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop4_group_destroy() argument
5411 mlxsw_sp_nexthop_group_remove(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop4_group_destroy()
5412 mlxsw_sp_nexthop4_group_info_fini(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop4_group_destroy()
5419 static int mlxsw_sp_nexthop4_group_get(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop4_group_get() argument
5426 nh_grp = mlxsw_sp_nexthop_obj_group_lookup(mlxsw_sp, in mlxsw_sp_nexthop4_group_get()
5433 nh_grp = mlxsw_sp_nexthop4_group_lookup(mlxsw_sp, fi); in mlxsw_sp_nexthop4_group_get()
5435 nh_grp = mlxsw_sp_nexthop4_group_create(mlxsw_sp, fi); in mlxsw_sp_nexthop4_group_get()
5445 static void mlxsw_sp_nexthop4_group_put(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop4_group_put() argument
5455 mlxsw_sp_nexthop_obj_group_destroy(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop4_group_put()
5459 mlxsw_sp_nexthop4_group_destroy(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop4_group_put()
5520 mlxsw_sp_fib4_offload_failed_flag_set(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib4_offload_failed_flag_set() argument
5535 fib_alias_hw_flags_set(mlxsw_sp_net(mlxsw_sp), &fri); in mlxsw_sp_fib4_offload_failed_flag_set()
5539 mlxsw_sp_fib4_entry_hw_flags_set(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib4_entry_hw_flags_set() argument
5560 fib_alias_hw_flags_set(mlxsw_sp_net(mlxsw_sp), &fri); in mlxsw_sp_fib4_entry_hw_flags_set()
5564 mlxsw_sp_fib4_entry_hw_flags_clear(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib4_entry_hw_flags_clear() argument
5583 fib_alias_hw_flags_set(mlxsw_sp_net(mlxsw_sp), &fri); in mlxsw_sp_fib4_entry_hw_flags_clear()
5588 mlxsw_sp_fib6_offload_failed_flag_set(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib6_offload_failed_flag_set() argument
5598 fib6_info_hw_flags_set(mlxsw_sp_net(mlxsw_sp), rt_arr[i], in mlxsw_sp_fib6_offload_failed_flag_set()
5603 mlxsw_sp_fib6_offload_failed_flag_set(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib6_offload_failed_flag_set() argument
5612 mlxsw_sp_fib6_entry_hw_flags_set(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib6_entry_hw_flags_set() argument
5627 fib6_info_hw_flags_set(mlxsw_sp_net(mlxsw_sp), mlxsw_sp_rt6->rt, in mlxsw_sp_fib6_entry_hw_flags_set()
5632 mlxsw_sp_fib6_entry_hw_flags_set(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib6_entry_hw_flags_set() argument
5640 mlxsw_sp_fib6_entry_hw_flags_clear(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib6_entry_hw_flags_clear() argument
5649 fib6_info_hw_flags_set(mlxsw_sp_net(mlxsw_sp), mlxsw_sp_rt6->rt, in mlxsw_sp_fib6_entry_hw_flags_clear()
5654 mlxsw_sp_fib6_entry_hw_flags_clear(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib6_entry_hw_flags_clear() argument
5661 mlxsw_sp_fib_entry_hw_flags_set(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib_entry_hw_flags_set() argument
5666 mlxsw_sp_fib4_entry_hw_flags_set(mlxsw_sp, fib_entry); in mlxsw_sp_fib_entry_hw_flags_set()
5669 mlxsw_sp_fib6_entry_hw_flags_set(mlxsw_sp, fib_entry); in mlxsw_sp_fib_entry_hw_flags_set()
5675 mlxsw_sp_fib_entry_hw_flags_clear(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib_entry_hw_flags_clear() argument
5680 mlxsw_sp_fib4_entry_hw_flags_clear(mlxsw_sp, fib_entry); in mlxsw_sp_fib_entry_hw_flags_clear()
5683 mlxsw_sp_fib6_entry_hw_flags_clear(mlxsw_sp, fib_entry); in mlxsw_sp_fib_entry_hw_flags_clear()
5689 mlxsw_sp_fib_entry_hw_flags_refresh(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib_entry_hw_flags_refresh() argument
5695 mlxsw_sp_fib_entry_hw_flags_set(mlxsw_sp, fib_entry); in mlxsw_sp_fib_entry_hw_flags_refresh()
5698 mlxsw_sp_fib_entry_hw_flags_clear(mlxsw_sp, fib_entry); in mlxsw_sp_fib_entry_hw_flags_refresh()
5731 static int mlxsw_sp_fib_entry_op_remote(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib_entry_op_remote() argument
5753 adjacency_index = mlxsw_sp->router->adj_trap_index; in mlxsw_sp_fib_entry_op_remote()
5763 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ralue), ralue_pl); in mlxsw_sp_fib_entry_op_remote()
5766 static int mlxsw_sp_fib_entry_op_local(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib_entry_op_local() argument
5787 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ralue), ralue_pl); in mlxsw_sp_fib_entry_op_local()
5790 static int mlxsw_sp_fib_entry_op_trap(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib_entry_op_trap() argument
5798 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ralue), ralue_pl); in mlxsw_sp_fib_entry_op_trap()
5801 static int mlxsw_sp_fib_entry_op_blackhole(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib_entry_op_blackhole() argument
5811 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ralue), ralue_pl); in mlxsw_sp_fib_entry_op_blackhole()
5815 mlxsw_sp_fib_entry_op_unreachable(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib_entry_op_unreachable() argument
5828 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ralue), ralue_pl); in mlxsw_sp_fib_entry_op_unreachable()
5832 mlxsw_sp_fib_entry_op_ipip_decap(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib_entry_op_ipip_decap() argument
5844 ipip_ops = mlxsw_sp->router->ipip_ops_arr[ipip_entry->ipipt]; in mlxsw_sp_fib_entry_op_ipip_decap()
5845 err = ipip_ops->decap_config(mlxsw_sp, ipip_entry, in mlxsw_sp_fib_entry_op_ipip_decap()
5853 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ralue), ralue_pl); in mlxsw_sp_fib_entry_op_ipip_decap()
5856 static int mlxsw_sp_fib_entry_op_nve_decap(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib_entry_op_nve_decap() argument
5865 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ralue), ralue_pl); in mlxsw_sp_fib_entry_op_nve_decap()
5868 static int __mlxsw_sp_fib_entry_op(struct mlxsw_sp *mlxsw_sp, in __mlxsw_sp_fib_entry_op() argument
5874 return mlxsw_sp_fib_entry_op_remote(mlxsw_sp, fib_entry, op); in __mlxsw_sp_fib_entry_op()
5876 return mlxsw_sp_fib_entry_op_local(mlxsw_sp, fib_entry, op); in __mlxsw_sp_fib_entry_op()
5878 return mlxsw_sp_fib_entry_op_trap(mlxsw_sp, fib_entry, op); in __mlxsw_sp_fib_entry_op()
5880 return mlxsw_sp_fib_entry_op_blackhole(mlxsw_sp, fib_entry, op); in __mlxsw_sp_fib_entry_op()
5882 return mlxsw_sp_fib_entry_op_unreachable(mlxsw_sp, fib_entry, in __mlxsw_sp_fib_entry_op()
5885 return mlxsw_sp_fib_entry_op_ipip_decap(mlxsw_sp, in __mlxsw_sp_fib_entry_op()
5888 return mlxsw_sp_fib_entry_op_nve_decap(mlxsw_sp, fib_entry, op); in __mlxsw_sp_fib_entry_op()
5893 static int mlxsw_sp_fib_entry_op(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib_entry_op() argument
5897 int err = __mlxsw_sp_fib_entry_op(mlxsw_sp, fib_entry, op); in mlxsw_sp_fib_entry_op()
5902 mlxsw_sp_fib_entry_hw_flags_refresh(mlxsw_sp, fib_entry, op); in mlxsw_sp_fib_entry_op()
5907 static int mlxsw_sp_fib_entry_update(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib_entry_update() argument
5910 return mlxsw_sp_fib_entry_op(mlxsw_sp, fib_entry, in mlxsw_sp_fib_entry_update()
5914 static int mlxsw_sp_fib_entry_del(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib_entry_del() argument
5917 return mlxsw_sp_fib_entry_op(mlxsw_sp, fib_entry, in mlxsw_sp_fib_entry_del()
5922 mlxsw_sp_fib4_entry_type_set(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib4_entry_type_set() argument
5928 struct mlxsw_sp_router *router = mlxsw_sp->router; in mlxsw_sp_fib4_entry_type_set()
5935 ipip_entry = mlxsw_sp_ipip_entry_find_by_decap(mlxsw_sp, ifindex, in mlxsw_sp_fib4_entry_type_set()
5939 return mlxsw_sp_fib_entry_decap_init(mlxsw_sp, in mlxsw_sp_fib4_entry_type_set()
5943 if (mlxsw_sp_router_nve_is_decap(mlxsw_sp, tb_id, in mlxsw_sp_fib4_entry_type_set()
5980 mlxsw_sp_fib_entry_type_unset(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib_entry_type_unset() argument
5985 mlxsw_sp_fib_entry_decap_fini(mlxsw_sp, fib_entry); in mlxsw_sp_fib_entry_type_unset()
5993 mlxsw_sp_fib4_entry_type_unset(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib4_entry_type_unset() argument
5996 mlxsw_sp_fib_entry_type_unset(mlxsw_sp, &fib4_entry->common); in mlxsw_sp_fib4_entry_type_unset()
6000 mlxsw_sp_fib4_entry_create(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib4_entry_create() argument
6013 err = mlxsw_sp_nexthop4_group_get(mlxsw_sp, fib_entry, fen_info->fi); in mlxsw_sp_fib4_entry_create()
6022 err = mlxsw_sp_fib4_entry_type_set(mlxsw_sp, fen_info, fib_entry); in mlxsw_sp_fib4_entry_create()
6039 mlxsw_sp_nexthop4_group_put(mlxsw_sp, &fib4_entry->common); in mlxsw_sp_fib4_entry_create()
6045 static void mlxsw_sp_fib4_entry_destroy(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib4_entry_destroy() argument
6051 mlxsw_sp_fib4_entry_type_unset(mlxsw_sp, fib4_entry); in mlxsw_sp_fib4_entry_destroy()
6054 mlxsw_sp_nexthop4_group_put(mlxsw_sp, &fib4_entry->common); in mlxsw_sp_fib4_entry_destroy()
6059 mlxsw_sp_fib4_entry_lookup(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib4_entry_lookup() argument
6067 vr = mlxsw_sp_vr_find(mlxsw_sp, fen_info->tb_id); in mlxsw_sp_fib4_entry_lookup()
6145 static int mlxsw_sp_fib_lpm_tree_link(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib_lpm_tree_link() argument
6153 lpm_tree = mlxsw_sp->router->lpm.proto_trees[fib->proto]; in mlxsw_sp_fib_lpm_tree_link()
6159 lpm_tree = mlxsw_sp_lpm_tree_get(mlxsw_sp, &req_prefix_usage, in mlxsw_sp_fib_lpm_tree_link()
6164 err = mlxsw_sp_vrs_lpm_tree_replace(mlxsw_sp, fib, lpm_tree); in mlxsw_sp_fib_lpm_tree_link()
6173 mlxsw_sp_lpm_tree_put(mlxsw_sp, lpm_tree); in mlxsw_sp_fib_lpm_tree_link()
6177 static void mlxsw_sp_fib_lpm_tree_unlink(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib_lpm_tree_unlink() argument
6193 lpm_tree = mlxsw_sp_lpm_tree_get(mlxsw_sp, &req_prefix_usage, in mlxsw_sp_fib_lpm_tree_unlink()
6198 err = mlxsw_sp_vrs_lpm_tree_replace(mlxsw_sp, fib, lpm_tree); in mlxsw_sp_fib_lpm_tree_unlink()
6205 mlxsw_sp_lpm_tree_put(mlxsw_sp, lpm_tree); in mlxsw_sp_fib_lpm_tree_unlink()
6208 static int mlxsw_sp_fib_node_init(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib_node_init() argument
6219 err = mlxsw_sp_fib_lpm_tree_link(mlxsw_sp, fib_node); in mlxsw_sp_fib_node_init()
6231 static void mlxsw_sp_fib_node_fini(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib_node_fini() argument
6236 mlxsw_sp_fib_lpm_tree_unlink(mlxsw_sp, fib_node); in mlxsw_sp_fib_node_fini()
6242 mlxsw_sp_fib_node_get(struct mlxsw_sp *mlxsw_sp, u32 tb_id, const void *addr, in mlxsw_sp_fib_node_get() argument
6251 vr = mlxsw_sp_vr_get(mlxsw_sp, tb_id, NULL); in mlxsw_sp_fib_node_get()
6266 err = mlxsw_sp_fib_node_init(mlxsw_sp, fib_node, fib); in mlxsw_sp_fib_node_get()
6275 mlxsw_sp_vr_put(mlxsw_sp, vr); in mlxsw_sp_fib_node_get()
6279 static void mlxsw_sp_fib_node_put(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib_node_put() argument
6286 mlxsw_sp_fib_node_fini(mlxsw_sp, fib_node); in mlxsw_sp_fib_node_put()
6288 mlxsw_sp_vr_put(mlxsw_sp, vr); in mlxsw_sp_fib_node_put()
6291 static int mlxsw_sp_fib_node_entry_link(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib_node_entry_link() argument
6299 err = mlxsw_sp_fib_entry_update(mlxsw_sp, fib_entry); in mlxsw_sp_fib_node_entry_link()
6311 mlxsw_sp_fib_node_entry_unlink(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib_node_entry_unlink() argument
6316 mlxsw_sp_fib_entry_del(mlxsw_sp, fib_entry); in mlxsw_sp_fib_node_entry_unlink()
6338 mlxsw_sp_router_fib4_replace(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_router_fib4_replace() argument
6347 !mlxsw_sp_nexthop_obj_group_lookup(mlxsw_sp, fen_info->fi->nh->id)) in mlxsw_sp_router_fib4_replace()
6350 fib_node = mlxsw_sp_fib_node_get(mlxsw_sp, fen_info->tb_id, in mlxsw_sp_router_fib4_replace()
6355 dev_warn(mlxsw_sp->bus_info->dev, "Failed to get FIB node\n"); in mlxsw_sp_router_fib4_replace()
6359 fib4_entry = mlxsw_sp_fib4_entry_create(mlxsw_sp, fib_node, fen_info); in mlxsw_sp_router_fib4_replace()
6361 dev_warn(mlxsw_sp->bus_info->dev, "Failed to create FIB entry\n"); in mlxsw_sp_router_fib4_replace()
6367 mlxsw_sp_fib4_entry_destroy(mlxsw_sp, fib4_entry); in mlxsw_sp_router_fib4_replace()
6368 mlxsw_sp_fib_node_put(mlxsw_sp, fib_node); in mlxsw_sp_router_fib4_replace()
6373 err = mlxsw_sp_fib_node_entry_link(mlxsw_sp, &fib4_entry->common); in mlxsw_sp_router_fib4_replace()
6375 dev_warn(mlxsw_sp->bus_info->dev, "Failed to link FIB entry to node\n"); in mlxsw_sp_router_fib4_replace()
6383 mlxsw_sp_fib_entry_hw_flags_clear(mlxsw_sp, replaced); in mlxsw_sp_router_fib4_replace()
6386 mlxsw_sp_fib4_entry_destroy(mlxsw_sp, fib4_replaced); in mlxsw_sp_router_fib4_replace()
6392 mlxsw_sp_fib4_entry_destroy(mlxsw_sp, fib4_entry); in mlxsw_sp_router_fib4_replace()
6394 mlxsw_sp_fib_node_put(mlxsw_sp, fib_node); in mlxsw_sp_router_fib4_replace()
6398 static void mlxsw_sp_router_fib4_del(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_router_fib4_del() argument
6404 fib4_entry = mlxsw_sp_fib4_entry_lookup(mlxsw_sp, fen_info); in mlxsw_sp_router_fib4_del()
6409 mlxsw_sp_fib_node_entry_unlink(mlxsw_sp, &fib4_entry->common); in mlxsw_sp_router_fib4_del()
6410 mlxsw_sp_fib4_entry_destroy(mlxsw_sp, fib4_entry); in mlxsw_sp_router_fib4_del()
6411 mlxsw_sp_fib_node_put(mlxsw_sp, fib_node); in mlxsw_sp_router_fib4_del()
6489 static bool mlxsw_sp_nexthop6_ipip_type(const struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop6_ipip_type() argument
6494 mlxsw_sp_netdev_ipip_type(mlxsw_sp, rt->fib6_nh->fib_nh_dev, ret); in mlxsw_sp_nexthop6_ipip_type()
6497 static int mlxsw_sp_nexthop6_init(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop6_init() argument
6511 mlxsw_sp_nexthop_counter_alloc(mlxsw_sp, nh); in mlxsw_sp_nexthop6_init()
6513 list_add_tail(&nh->router_list_node, &mlxsw_sp->router->nexthop_list); in mlxsw_sp_nexthop6_init()
6519 err = mlxsw_sp_nexthop_type_init(mlxsw_sp, nh, dev); in mlxsw_sp_nexthop6_init()
6527 mlxsw_sp_nexthop_counter_free(mlxsw_sp, nh); in mlxsw_sp_nexthop6_init()
6531 static void mlxsw_sp_nexthop6_fini(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop6_fini() argument
6534 mlxsw_sp_nexthop_type_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop6_fini()
6536 mlxsw_sp_nexthop_counter_free(mlxsw_sp, nh); in mlxsw_sp_nexthop6_fini()
6539 static bool mlxsw_sp_rt6_is_gateway(const struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_rt6_is_gateway() argument
6543 mlxsw_sp_nexthop6_ipip_type(mlxsw_sp, rt, NULL); in mlxsw_sp_rt6_is_gateway()
6547 mlxsw_sp_nexthop6_group_info_init(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop6_group_info_init() argument
6564 nhgi->gateway = mlxsw_sp_rt6_is_gateway(mlxsw_sp, mlxsw_sp_rt6->rt); in mlxsw_sp_nexthop6_group_info_init()
6570 err = mlxsw_sp_nexthop6_init(mlxsw_sp, nh_grp, nh, rt); in mlxsw_sp_nexthop6_group_info_init()
6576 err = mlxsw_sp_nexthop_group_inc(mlxsw_sp); in mlxsw_sp_nexthop6_group_info_init()
6579 err = mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop6_group_info_init()
6586 mlxsw_sp_nexthop_group_dec(mlxsw_sp); in mlxsw_sp_nexthop6_group_info_init()
6592 mlxsw_sp_nexthop6_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop6_group_info_init()
6599 mlxsw_sp_nexthop6_group_info_fini(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop6_group_info_fini() argument
6605 mlxsw_sp_nexthop_group_dec(mlxsw_sp); in mlxsw_sp_nexthop6_group_info_fini()
6609 mlxsw_sp_nexthop6_fini(mlxsw_sp, nh); in mlxsw_sp_nexthop6_group_info_fini()
6611 mlxsw_sp_nexthop_group_refresh(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop6_group_info_fini()
6617 mlxsw_sp_nexthop6_group_create(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop6_group_create() argument
6634 err = mlxsw_sp_nexthop6_group_info_init(mlxsw_sp, nh_grp, fib6_entry); in mlxsw_sp_nexthop6_group_create()
6638 err = mlxsw_sp_nexthop_group_insert(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop6_group_create()
6647 mlxsw_sp_nexthop6_group_info_fini(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop6_group_create()
6656 mlxsw_sp_nexthop6_group_destroy(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop6_group_destroy() argument
6661 mlxsw_sp_nexthop_group_remove(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop6_group_destroy()
6662 mlxsw_sp_nexthop6_group_info_fini(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop6_group_destroy()
6668 static int mlxsw_sp_nexthop6_group_get(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop6_group_get() argument
6675 nh_grp = mlxsw_sp_nexthop_obj_group_lookup(mlxsw_sp, in mlxsw_sp_nexthop6_group_get()
6682 nh_grp = mlxsw_sp_nexthop6_group_lookup(mlxsw_sp, fib6_entry); in mlxsw_sp_nexthop6_group_get()
6684 nh_grp = mlxsw_sp_nexthop6_group_create(mlxsw_sp, fib6_entry); in mlxsw_sp_nexthop6_group_get()
6702 static void mlxsw_sp_nexthop6_group_put(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop6_group_put() argument
6712 mlxsw_sp_nexthop_obj_group_destroy(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop6_group_put()
6716 mlxsw_sp_nexthop6_group_destroy(mlxsw_sp, nh_grp); in mlxsw_sp_nexthop6_group_put()
6720 mlxsw_sp_nexthop6_group_update(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_nexthop6_group_update() argument
6731 err = mlxsw_sp_nexthop6_group_get(mlxsw_sp, fib6_entry); in mlxsw_sp_nexthop6_group_update()
6744 err = mlxsw_sp_fib_entry_update(mlxsw_sp, &fib6_entry->common); in mlxsw_sp_nexthop6_group_update()
6749 mlxsw_sp_nexthop6_group_destroy(mlxsw_sp, old_nh_grp); in mlxsw_sp_nexthop6_group_update()
6757 mlxsw_sp_nexthop6_group_put(mlxsw_sp, &fib6_entry->common); in mlxsw_sp_nexthop6_group_update()
6767 mlxsw_sp_fib6_entry_nexthop_add(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib6_entry_nexthop_add() argument
6785 err = mlxsw_sp_nexthop6_group_update(mlxsw_sp, fib6_entry); in mlxsw_sp_fib6_entry_nexthop_add()
6803 mlxsw_sp_fib6_entry_nexthop_del(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib6_entry_nexthop_del() argument
6821 mlxsw_sp_nexthop6_group_update(mlxsw_sp, fib6_entry); in mlxsw_sp_fib6_entry_nexthop_del()
6825 mlxsw_sp_fib6_entry_type_set_local(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib6_entry_type_set_local() argument
6832 struct mlxsw_sp_router *router = mlxsw_sp->router; in mlxsw_sp_fib6_entry_type_set_local()
6837 ipip_entry = mlxsw_sp_ipip_entry_find_by_decap(mlxsw_sp, ifindex, in mlxsw_sp_fib6_entry_type_set_local()
6843 return mlxsw_sp_fib_entry_decap_init(mlxsw_sp, fib_entry, in mlxsw_sp_fib6_entry_type_set_local()
6846 if (mlxsw_sp_router_nve_is_decap(mlxsw_sp, tb_id, in mlxsw_sp_fib6_entry_type_set_local()
6858 static int mlxsw_sp_fib6_entry_type_set(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib6_entry_type_set() argument
6863 return mlxsw_sp_fib6_entry_type_set_local(mlxsw_sp, fib_entry, in mlxsw_sp_fib6_entry_type_set()
6893 mlxsw_sp_fib6_entry_create(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib6_entry_create() argument
6919 err = mlxsw_sp_nexthop6_group_get(mlxsw_sp, fib6_entry); in mlxsw_sp_fib6_entry_create()
6928 err = mlxsw_sp_fib6_entry_type_set(mlxsw_sp, fib_entry, rt_arr[0]); in mlxsw_sp_fib6_entry_create()
6939 mlxsw_sp_nexthop6_group_put(mlxsw_sp, fib_entry); in mlxsw_sp_fib6_entry_create()
6953 mlxsw_sp_fib6_entry_type_unset(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib6_entry_type_unset() argument
6956 mlxsw_sp_fib_entry_type_unset(mlxsw_sp, &fib6_entry->common); in mlxsw_sp_fib6_entry_type_unset()
6959 static void mlxsw_sp_fib6_entry_destroy(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib6_entry_destroy() argument
6964 mlxsw_sp_fib6_entry_type_unset(mlxsw_sp, fib6_entry); in mlxsw_sp_fib6_entry_destroy()
6967 mlxsw_sp_nexthop6_group_put(mlxsw_sp, &fib6_entry->common); in mlxsw_sp_fib6_entry_destroy()
6974 mlxsw_sp_fib6_entry_lookup(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib6_entry_lookup() argument
6983 vr = mlxsw_sp_vr_find(mlxsw_sp, rt->fib6_table->tb6_id); in mlxsw_sp_fib6_entry_lookup()
7026 static int mlxsw_sp_router_fib6_replace(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_router_fib6_replace() argument
7042 if (rt->nh && !mlxsw_sp_nexthop_obj_group_lookup(mlxsw_sp, rt->nh->id)) in mlxsw_sp_router_fib6_replace()
7045 fib_node = mlxsw_sp_fib_node_get(mlxsw_sp, rt->fib6_table->tb6_id, in mlxsw_sp_router_fib6_replace()
7053 fib6_entry = mlxsw_sp_fib6_entry_create(mlxsw_sp, fib_node, rt_arr, in mlxsw_sp_router_fib6_replace()
7061 mlxsw_sp_fib6_entry_destroy(mlxsw_sp, fib6_entry); in mlxsw_sp_router_fib6_replace()
7062 mlxsw_sp_fib_node_put(mlxsw_sp, fib_node); in mlxsw_sp_router_fib6_replace()
7067 err = mlxsw_sp_fib_node_entry_link(mlxsw_sp, &fib6_entry->common); in mlxsw_sp_router_fib6_replace()
7075 mlxsw_sp_fib_entry_hw_flags_clear(mlxsw_sp, replaced); in mlxsw_sp_router_fib6_replace()
7078 mlxsw_sp_fib6_entry_destroy(mlxsw_sp, fib6_replaced); in mlxsw_sp_router_fib6_replace()
7084 mlxsw_sp_fib6_entry_destroy(mlxsw_sp, fib6_entry); in mlxsw_sp_router_fib6_replace()
7086 mlxsw_sp_fib_node_put(mlxsw_sp, fib_node); in mlxsw_sp_router_fib6_replace()
7090 static int mlxsw_sp_router_fib6_append(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_router_fib6_append() argument
7105 fib_node = mlxsw_sp_fib_node_get(mlxsw_sp, rt->fib6_table->tb6_id, in mlxsw_sp_router_fib6_append()
7114 mlxsw_sp_fib_node_put(mlxsw_sp, fib_node); in mlxsw_sp_router_fib6_append()
7120 err = mlxsw_sp_fib6_entry_nexthop_add(mlxsw_sp, fib6_entry, rt_arr, in mlxsw_sp_router_fib6_append()
7128 mlxsw_sp_fib_node_put(mlxsw_sp, fib_node); in mlxsw_sp_router_fib6_append()
7132 static void mlxsw_sp_router_fib6_del(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_router_fib6_del() argument
7148 fib6_entry = mlxsw_sp_fib6_entry_lookup(mlxsw_sp, rt); in mlxsw_sp_router_fib6_del()
7156 mlxsw_sp_fib6_entry_nexthop_del(mlxsw_sp, fib6_entry, rt_arr, in mlxsw_sp_router_fib6_del()
7163 mlxsw_sp_fib_node_entry_unlink(mlxsw_sp, &fib6_entry->common); in mlxsw_sp_router_fib6_del()
7164 mlxsw_sp_fib6_entry_destroy(mlxsw_sp, fib6_entry); in mlxsw_sp_router_fib6_del()
7165 mlxsw_sp_fib_node_put(mlxsw_sp, fib_node); in mlxsw_sp_router_fib6_del()
7177 static int mlxsw_sp_router_fibmr_add(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_router_fibmr_add() argument
7184 vr = mlxsw_sp_vr_get(mlxsw_sp, men_info->tb_id, NULL); in mlxsw_sp_router_fibmr_add()
7192 static void mlxsw_sp_router_fibmr_del(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_router_fibmr_del() argument
7198 vr = mlxsw_sp_vr_find(mlxsw_sp, men_info->tb_id); in mlxsw_sp_router_fibmr_del()
7204 mlxsw_sp_vr_put(mlxsw_sp, vr); in mlxsw_sp_router_fibmr_del()
7208 mlxsw_sp_router_fibmr_vif_add(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_router_fibmr_vif_add() argument
7215 vr = mlxsw_sp_vr_get(mlxsw_sp, ven_info->tb_id, NULL); in mlxsw_sp_router_fibmr_vif_add()
7220 rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp, ven_info->dev); in mlxsw_sp_router_fibmr_vif_add()
7227 mlxsw_sp_router_fibmr_vif_del(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_router_fibmr_vif_del() argument
7233 vr = mlxsw_sp_vr_find(mlxsw_sp, ven_info->tb_id); in mlxsw_sp_router_fibmr_vif_del()
7239 mlxsw_sp_vr_put(mlxsw_sp, vr); in mlxsw_sp_router_fibmr_vif_del()
7242 static void mlxsw_sp_fib4_node_flush(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib4_node_flush() argument
7249 mlxsw_sp_fib_node_entry_unlink(mlxsw_sp, fib_node->fib_entry); in mlxsw_sp_fib4_node_flush()
7250 mlxsw_sp_fib4_entry_destroy(mlxsw_sp, fib4_entry); in mlxsw_sp_fib4_node_flush()
7251 mlxsw_sp_fib_node_put(mlxsw_sp, fib_node); in mlxsw_sp_fib4_node_flush()
7254 static void mlxsw_sp_fib6_node_flush(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib6_node_flush() argument
7261 mlxsw_sp_fib_node_entry_unlink(mlxsw_sp, fib_node->fib_entry); in mlxsw_sp_fib6_node_flush()
7262 mlxsw_sp_fib6_entry_destroy(mlxsw_sp, fib6_entry); in mlxsw_sp_fib6_node_flush()
7263 mlxsw_sp_fib_node_put(mlxsw_sp, fib_node); in mlxsw_sp_fib6_node_flush()
7266 static void mlxsw_sp_fib_node_flush(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_fib_node_flush() argument
7271 mlxsw_sp_fib4_node_flush(mlxsw_sp, fib_node); in mlxsw_sp_fib_node_flush()
7274 mlxsw_sp_fib6_node_flush(mlxsw_sp, fib_node); in mlxsw_sp_fib_node_flush()
7279 static void mlxsw_sp_vr_fib_flush(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_vr_fib_flush() argument
7289 mlxsw_sp_fib_node_flush(mlxsw_sp, fib_node); in mlxsw_sp_vr_fib_flush()
7295 static void mlxsw_sp_router_fib_flush(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_router_fib_flush() argument
7299 for (i = 0; i < MLXSW_CORE_RES_GET(mlxsw_sp->core, MAX_VRS); i++) { in mlxsw_sp_router_fib_flush()
7300 struct mlxsw_sp_vr *vr = &mlxsw_sp->router->vrs[i]; in mlxsw_sp_router_fib_flush()
7307 mlxsw_sp_vr_fib_flush(mlxsw_sp, vr, MLXSW_SP_L3_PROTO_IPV4); in mlxsw_sp_router_fib_flush()
7314 mlxsw_sp_vr_fib_flush(mlxsw_sp, vr, MLXSW_SP_L3_PROTO_IPV6); in mlxsw_sp_router_fib_flush()
7333 struct mlxsw_sp *mlxsw_sp; member
7389 struct mlxsw_sp *mlxsw_sp = fib_work->mlxsw_sp; in mlxsw_sp_router_fib4_event_work() local
7392 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_router_fib4_event_work()
7393 mlxsw_sp_span_respin(mlxsw_sp); in mlxsw_sp_router_fib4_event_work()
7397 err = mlxsw_sp_router_fib4_replace(mlxsw_sp, in mlxsw_sp_router_fib4_event_work()
7400 dev_warn(mlxsw_sp->bus_info->dev, "FIB replace failed.\n"); in mlxsw_sp_router_fib4_event_work()
7401 mlxsw_sp_fib4_offload_failed_flag_set(mlxsw_sp, in mlxsw_sp_router_fib4_event_work()
7407 mlxsw_sp_router_fib4_del(mlxsw_sp, &fib_work->fen_info); in mlxsw_sp_router_fib4_event_work()
7412 mlxsw_sp_nexthop4_event(mlxsw_sp, fib_work->event, in mlxsw_sp_router_fib4_event_work()
7417 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_router_fib4_event_work()
7426 struct mlxsw_sp *mlxsw_sp = fib_work->mlxsw_sp; in mlxsw_sp_router_fib6_event_work() local
7429 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_router_fib6_event_work()
7430 mlxsw_sp_span_respin(mlxsw_sp); in mlxsw_sp_router_fib6_event_work()
7434 err = mlxsw_sp_router_fib6_replace(mlxsw_sp, in mlxsw_sp_router_fib6_event_work()
7438 dev_warn(mlxsw_sp->bus_info->dev, "FIB replace failed.\n"); in mlxsw_sp_router_fib6_event_work()
7439 mlxsw_sp_fib6_offload_failed_flag_set(mlxsw_sp, in mlxsw_sp_router_fib6_event_work()
7446 err = mlxsw_sp_router_fib6_append(mlxsw_sp, in mlxsw_sp_router_fib6_event_work()
7450 dev_warn(mlxsw_sp->bus_info->dev, "FIB append failed.\n"); in mlxsw_sp_router_fib6_event_work()
7451 mlxsw_sp_fib6_offload_failed_flag_set(mlxsw_sp, in mlxsw_sp_router_fib6_event_work()
7458 mlxsw_sp_router_fib6_del(mlxsw_sp, in mlxsw_sp_router_fib6_event_work()
7464 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_router_fib6_event_work()
7472 struct mlxsw_sp *mlxsw_sp = fib_work->mlxsw_sp; in mlxsw_sp_router_fibmr_event_work() local
7477 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_router_fibmr_event_work()
7483 err = mlxsw_sp_router_fibmr_add(mlxsw_sp, &fib_work->men_info, in mlxsw_sp_router_fibmr_event_work()
7486 dev_warn(mlxsw_sp->bus_info->dev, "MR entry add failed.\n"); in mlxsw_sp_router_fibmr_event_work()
7490 mlxsw_sp_router_fibmr_del(mlxsw_sp, &fib_work->men_info); in mlxsw_sp_router_fibmr_event_work()
7494 err = mlxsw_sp_router_fibmr_vif_add(mlxsw_sp, in mlxsw_sp_router_fibmr_event_work()
7497 dev_warn(mlxsw_sp->bus_info->dev, "MR VIF add failed.\n"); in mlxsw_sp_router_fibmr_event_work()
7501 mlxsw_sp_router_fibmr_vif_del(mlxsw_sp, in mlxsw_sp_router_fibmr_event_work()
7506 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_router_fibmr_event_work()
7581 struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_router_fib_rule_event() argument
7596 if (rule->iifindex == mlxsw_sp_net(mlxsw_sp)->loopback_dev->ifindex) in mlxsw_sp_router_fib_rule_event()
7644 router->mlxsw_sp); in mlxsw_sp_router_fib_event()
7664 fib_work->mlxsw_sp = router->mlxsw_sp; in mlxsw_sp_router_fib_event()
7695 mlxsw_sp_rif_find_by_dev(const struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_rif_find_by_dev() argument
7700 for (i = 0; i < MLXSW_CORE_RES_GET(mlxsw_sp->core, MAX_RIFS); i++) in mlxsw_sp_rif_find_by_dev()
7701 if (mlxsw_sp->router->rifs[i] && in mlxsw_sp_rif_find_by_dev()
7702 mlxsw_sp->router->rifs[i]->dev == dev) in mlxsw_sp_rif_find_by_dev()
7703 return mlxsw_sp->router->rifs[i]; in mlxsw_sp_rif_find_by_dev()
7708 bool mlxsw_sp_rif_exists(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_rif_exists() argument
7713 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_rif_exists()
7714 rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp, dev); in mlxsw_sp_rif_exists()
7715 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_rif_exists()
7720 u16 mlxsw_sp_rif_vid(struct mlxsw_sp *mlxsw_sp, const struct net_device *dev) in mlxsw_sp_rif_vid() argument
7725 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_rif_vid()
7726 rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp, dev); in mlxsw_sp_rif_vid()
7739 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_rif_vid()
7743 static int mlxsw_sp_router_rif_disable(struct mlxsw_sp *mlxsw_sp, u16 rif) in mlxsw_sp_router_rif_disable() argument
7749 err = mlxsw_reg_query(mlxsw_sp->core, MLXSW_REG(ritr), ritr_pl); in mlxsw_sp_router_rif_disable()
7754 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ritr), ritr_pl); in mlxsw_sp_router_rif_disable()
7757 static void mlxsw_sp_router_rif_gone_sync(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_router_rif_gone_sync() argument
7760 mlxsw_sp_router_rif_disable(mlxsw_sp, rif->rif_index); in mlxsw_sp_router_rif_gone_sync()
7761 mlxsw_sp_nexthop_rif_gone_sync(mlxsw_sp, rif); in mlxsw_sp_router_rif_gone_sync()
7762 mlxsw_sp_neigh_rif_gone_sync(mlxsw_sp, rif); in mlxsw_sp_router_rif_gone_sync()
7808 mlxsw_sp_dev_rif_type(const struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_dev_rif_type() argument
7813 if (mlxsw_sp_netdev_ipip_type(mlxsw_sp, dev, NULL)) in mlxsw_sp_dev_rif_type()
7826 return mlxsw_sp_fid_type_rif_type(mlxsw_sp, type); in mlxsw_sp_dev_rif_type()
7829 static int mlxsw_sp_rif_index_alloc(struct mlxsw_sp *mlxsw_sp, u16 *p_rif_index) in mlxsw_sp_rif_index_alloc() argument
7833 for (i = 0; i < MLXSW_CORE_RES_GET(mlxsw_sp->core, MAX_RIFS); i++) { in mlxsw_sp_rif_index_alloc()
7834 if (!mlxsw_sp->router->rifs[i]) { in mlxsw_sp_rif_index_alloc()
7866 struct mlxsw_sp_rif *mlxsw_sp_rif_by_index(const struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_rif_by_index() argument
7869 return mlxsw_sp->router->rifs[rif_index]; in mlxsw_sp_rif_by_index()
7887 ul_vr = mlxsw_sp_vr_get(lb_rif->common.mlxsw_sp, ul_tb_id, NULL); in mlxsw_sp_ipip_lb_ul_vr_id()
8080 mlxsw_sp_rif_create(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_rif_create() argument
8093 type = mlxsw_sp_dev_rif_type(mlxsw_sp, params->dev); in mlxsw_sp_rif_create()
8094 ops = mlxsw_sp->router->rif_ops_arr[type]; in mlxsw_sp_rif_create()
8096 vr = mlxsw_sp_vr_get(mlxsw_sp, tb_id ? : RT_TABLE_MAIN, extack); in mlxsw_sp_rif_create()
8101 err = mlxsw_sp_rif_index_alloc(mlxsw_sp, &rif_index); in mlxsw_sp_rif_create()
8113 mlxsw_sp->router->rifs[rif_index] = rif; in mlxsw_sp_rif_create()
8114 rif->mlxsw_sp = mlxsw_sp; in mlxsw_sp_rif_create()
8149 atomic_inc(&mlxsw_sp->router->rifs_count); in mlxsw_sp_rif_create()
8161 mlxsw_sp->router->rifs[rif_index] = NULL; in mlxsw_sp_rif_create()
8167 mlxsw_sp_vr_put(mlxsw_sp, vr); in mlxsw_sp_rif_create()
8174 struct mlxsw_sp *mlxsw_sp = rif->mlxsw_sp; in mlxsw_sp_rif_destroy() local
8179 atomic_dec(&mlxsw_sp->router->rifs_count); in mlxsw_sp_rif_destroy()
8180 mlxsw_sp_router_rif_gone_sync(mlxsw_sp, rif); in mlxsw_sp_rif_destroy()
8181 vr = &mlxsw_sp->router->vrs[rif->vr_id]; in mlxsw_sp_rif_destroy()
8198 mlxsw_sp->router->rifs[rif->rif_index] = NULL; in mlxsw_sp_rif_destroy()
8202 mlxsw_sp_vr_put(mlxsw_sp, vr); in mlxsw_sp_rif_destroy()
8205 void mlxsw_sp_rif_destroy_by_dev(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_rif_destroy_by_dev() argument
8210 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_rif_destroy_by_dev()
8211 rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp, dev); in mlxsw_sp_rif_destroy_by_dev()
8216 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_rif_destroy_by_dev()
8240 mlxsw_sp_rif_subport_get(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_rif_subport_get() argument
8247 rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp, params->dev); in mlxsw_sp_rif_subport_get()
8249 return mlxsw_sp_rif_create(mlxsw_sp, params, extack); in mlxsw_sp_rif_subport_get()
8267 static int mlxsw_sp_rif_mac_profile_index_alloc(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_rif_mac_profile_index_alloc() argument
8271 u8 max_rif_mac_profiles = mlxsw_sp->router->max_rif_mac_profile; in mlxsw_sp_rif_mac_profile_index_alloc()
8272 struct mlxsw_sp_router *router = mlxsw_sp->router; in mlxsw_sp_rif_mac_profile_index_alloc()
8291 mlxsw_sp_rif_mac_profile_index_free(struct mlxsw_sp *mlxsw_sp, u8 mac_profile) in mlxsw_sp_rif_mac_profile_index_free() argument
8295 profile = idr_remove(&mlxsw_sp->router->rif_mac_profiles_idr, in mlxsw_sp_rif_mac_profile_index_free()
8316 mlxsw_sp_rif_mac_profile_find(const struct mlxsw_sp *mlxsw_sp, const char *mac) in mlxsw_sp_rif_mac_profile_find() argument
8318 struct mlxsw_sp_router *router = mlxsw_sp->router; in mlxsw_sp_rif_mac_profile_find()
8324 mlxsw_sp->mac_mask)) in mlxsw_sp_rif_mac_profile_find()
8333 const struct mlxsw_sp *mlxsw_sp = priv; in mlxsw_sp_rif_mac_profiles_occ_get() local
8335 return atomic_read(&mlxsw_sp->router->rif_mac_profiles_count); in mlxsw_sp_rif_mac_profiles_occ_get()
8340 const struct mlxsw_sp *mlxsw_sp = priv; in mlxsw_sp_rifs_occ_get() local
8342 return atomic_read(&mlxsw_sp->router->rifs_count); in mlxsw_sp_rifs_occ_get()
8346 mlxsw_sp_rif_mac_profile_create(struct mlxsw_sp *mlxsw_sp, const char *mac, in mlxsw_sp_rif_mac_profile_create() argument
8356 err = mlxsw_sp_rif_mac_profile_index_alloc(mlxsw_sp, profile, extack); in mlxsw_sp_rif_mac_profile_create()
8360 atomic_inc(&mlxsw_sp->router->rif_mac_profiles_count); in mlxsw_sp_rif_mac_profile_create()
8368 static void mlxsw_sp_rif_mac_profile_destroy(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_rif_mac_profile_destroy() argument
8373 atomic_dec(&mlxsw_sp->router->rif_mac_profiles_count); in mlxsw_sp_rif_mac_profile_destroy()
8374 profile = mlxsw_sp_rif_mac_profile_index_free(mlxsw_sp, mac_profile); in mlxsw_sp_rif_mac_profile_destroy()
8378 static int mlxsw_sp_rif_mac_profile_get(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_rif_mac_profile_get() argument
8384 profile = mlxsw_sp_rif_mac_profile_find(mlxsw_sp, mac); in mlxsw_sp_rif_mac_profile_get()
8390 profile = mlxsw_sp_rif_mac_profile_create(mlxsw_sp, mac, extack); in mlxsw_sp_rif_mac_profile_get()
8399 static void mlxsw_sp_rif_mac_profile_put(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_rif_mac_profile_put() argument
8404 profile = idr_find(&mlxsw_sp->router->rif_mac_profiles_idr, in mlxsw_sp_rif_mac_profile_put()
8412 mlxsw_sp_rif_mac_profile_destroy(mlxsw_sp, mac_profile); in mlxsw_sp_rif_mac_profile_put()
8417 struct mlxsw_sp *mlxsw_sp = rif->mlxsw_sp; in mlxsw_sp_rif_mac_profile_is_shared() local
8420 profile = idr_find(&mlxsw_sp->router->rif_mac_profiles_idr, in mlxsw_sp_rif_mac_profile_is_shared()
8431 struct mlxsw_sp *mlxsw_sp = rif->mlxsw_sp; in mlxsw_sp_rif_mac_profile_edit() local
8434 profile = idr_find(&mlxsw_sp->router->rif_mac_profiles_idr, in mlxsw_sp_rif_mac_profile_edit()
8444 mlxsw_sp_rif_mac_profile_replace(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_rif_mac_profile_replace() argument
8453 !mlxsw_sp_rif_mac_profile_find(mlxsw_sp, new_mac)) in mlxsw_sp_rif_mac_profile_replace()
8456 err = mlxsw_sp_rif_mac_profile_get(mlxsw_sp, new_mac, in mlxsw_sp_rif_mac_profile_replace()
8461 mlxsw_sp_rif_mac_profile_put(mlxsw_sp, rif->mac_profile_id); in mlxsw_sp_rif_mac_profile_replace()
8472 struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp; in __mlxsw_sp_port_vlan_router_join() local
8482 rif = mlxsw_sp_rif_subport_get(mlxsw_sp, &params, extack); in __mlxsw_sp_port_vlan_router_join()
8539 struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port_vlan->mlxsw_sp_port->mlxsw_sp; in mlxsw_sp_port_vlan_router_join() local
8543 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_port_vlan_router_join()
8544 rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp, l3_dev); in mlxsw_sp_port_vlan_router_join()
8551 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_port_vlan_router_join()
8558 struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port_vlan->mlxsw_sp_port->mlxsw_sp; in mlxsw_sp_port_vlan_router_leave() local
8560 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_port_vlan_router_leave()
8562 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_port_vlan_router_leave()
8634 static int mlxsw_sp_inetaddr_bridge_event(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_inetaddr_bridge_event() argument
8655 rif = mlxsw_sp_rif_create(mlxsw_sp, &params, extack); in mlxsw_sp_inetaddr_bridge_event()
8660 rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp, l3_dev); in mlxsw_sp_inetaddr_bridge_event()
8668 static int mlxsw_sp_inetaddr_vlan_event(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_inetaddr_vlan_event() argument
8686 return mlxsw_sp_inetaddr_bridge_event(mlxsw_sp, vlan_dev, event, in mlxsw_sp_inetaddr_vlan_event()
8708 static int mlxsw_sp_rif_vrrp_op(struct mlxsw_sp *mlxsw_sp, u16 rif_index, in mlxsw_sp_rif_vrrp_op() argument
8720 err = mlxsw_reg_query(mlxsw_sp->core, MLXSW_REG(ritr), ritr_pl); in mlxsw_sp_rif_vrrp_op()
8729 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ritr), ritr_pl); in mlxsw_sp_rif_vrrp_op()
8732 static int mlxsw_sp_rif_macvlan_add(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_rif_macvlan_add() argument
8740 rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp, vlan->lowerdev); in mlxsw_sp_rif_macvlan_add()
8746 err = mlxsw_sp_rif_fdb_op(mlxsw_sp, macvlan_dev->dev_addr, in mlxsw_sp_rif_macvlan_add()
8751 err = mlxsw_sp_rif_vrrp_op(mlxsw_sp, rif->rif_index, in mlxsw_sp_rif_macvlan_add()
8765 mlxsw_sp_rif_fdb_op(mlxsw_sp, macvlan_dev->dev_addr, in mlxsw_sp_rif_macvlan_add()
8770 static void __mlxsw_sp_rif_macvlan_del(struct mlxsw_sp *mlxsw_sp, in __mlxsw_sp_rif_macvlan_del() argument
8776 rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp, vlan->lowerdev); in __mlxsw_sp_rif_macvlan_del()
8782 mlxsw_sp_rif_vrrp_op(mlxsw_sp, rif->rif_index, macvlan_dev->dev_addr, in __mlxsw_sp_rif_macvlan_del()
8784 mlxsw_sp_rif_fdb_op(mlxsw_sp, macvlan_dev->dev_addr, in __mlxsw_sp_rif_macvlan_del()
8788 void mlxsw_sp_rif_macvlan_del(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_rif_macvlan_del() argument
8791 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_rif_macvlan_del()
8792 __mlxsw_sp_rif_macvlan_del(mlxsw_sp, macvlan_dev); in mlxsw_sp_rif_macvlan_del()
8793 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_rif_macvlan_del()
8796 static int mlxsw_sp_inetaddr_macvlan_event(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_inetaddr_macvlan_event() argument
8803 return mlxsw_sp_rif_macvlan_add(mlxsw_sp, macvlan_dev, extack); in mlxsw_sp_inetaddr_macvlan_event()
8805 __mlxsw_sp_rif_macvlan_del(mlxsw_sp, macvlan_dev); in mlxsw_sp_inetaddr_macvlan_event()
8812 static int __mlxsw_sp_inetaddr_event(struct mlxsw_sp *mlxsw_sp, in __mlxsw_sp_inetaddr_event() argument
8822 return mlxsw_sp_inetaddr_bridge_event(mlxsw_sp, dev, event, in __mlxsw_sp_inetaddr_event()
8825 return mlxsw_sp_inetaddr_vlan_event(mlxsw_sp, dev, event, in __mlxsw_sp_inetaddr_event()
8828 return mlxsw_sp_inetaddr_macvlan_event(mlxsw_sp, dev, event, in __mlxsw_sp_inetaddr_event()
8849 rif = mlxsw_sp_rif_find_by_dev(router->mlxsw_sp, dev); in mlxsw_sp_inetaddr_event()
8853 err = __mlxsw_sp_inetaddr_event(router->mlxsw_sp, dev, event, NULL); in mlxsw_sp_inetaddr_event()
8864 struct mlxsw_sp *mlxsw_sp; in mlxsw_sp_inetaddr_valid_event() local
8868 mlxsw_sp = mlxsw_sp_lower_get(dev); in mlxsw_sp_inetaddr_valid_event()
8869 if (!mlxsw_sp) in mlxsw_sp_inetaddr_valid_event()
8872 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_inetaddr_valid_event()
8873 rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp, dev); in mlxsw_sp_inetaddr_valid_event()
8877 err = __mlxsw_sp_inetaddr_event(mlxsw_sp, dev, event, ivi->extack); in mlxsw_sp_inetaddr_valid_event()
8879 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_inetaddr_valid_event()
8885 struct mlxsw_sp *mlxsw_sp; member
8894 struct mlxsw_sp *mlxsw_sp = inet6addr_work->mlxsw_sp; in mlxsw_sp_inet6addr_event_work() local
8900 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_inet6addr_event_work()
8902 rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp, dev); in mlxsw_sp_inet6addr_event_work()
8906 __mlxsw_sp_inetaddr_event(mlxsw_sp, dev, event, NULL); in mlxsw_sp_inet6addr_event_work()
8908 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_inet6addr_event_work()
8933 inet6addr_work->mlxsw_sp = router->mlxsw_sp; in mlxsw_sp_inet6addr_event()
8947 struct mlxsw_sp *mlxsw_sp; in mlxsw_sp_inet6addr_valid_event() local
8951 mlxsw_sp = mlxsw_sp_lower_get(dev); in mlxsw_sp_inet6addr_valid_event()
8952 if (!mlxsw_sp) in mlxsw_sp_inet6addr_valid_event()
8955 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_inet6addr_valid_event()
8956 rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp, dev); in mlxsw_sp_inet6addr_valid_event()
8960 err = __mlxsw_sp_inetaddr_event(mlxsw_sp, dev, event, i6vi->extack); in mlxsw_sp_inet6addr_valid_event()
8962 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_inet6addr_valid_event()
8966 static int mlxsw_sp_rif_edit(struct mlxsw_sp *mlxsw_sp, u16 rif_index, in mlxsw_sp_rif_edit() argument
8973 err = mlxsw_reg_query(mlxsw_sp->core, MLXSW_REG(ritr), ritr_pl); in mlxsw_sp_rif_edit()
8981 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ritr), ritr_pl); in mlxsw_sp_rif_edit()
8985 mlxsw_sp_router_port_change_event(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_router_port_change_event() argument
8996 err = mlxsw_sp_rif_fdb_op(mlxsw_sp, rif->addr, fid_index, false); in mlxsw_sp_router_port_change_event()
9001 err = mlxsw_sp_rif_mac_profile_replace(mlxsw_sp, rif, dev->dev_addr, in mlxsw_sp_router_port_change_event()
9006 err = mlxsw_sp_rif_edit(mlxsw_sp, rif->rif_index, dev->dev_addr, in mlxsw_sp_router_port_change_event()
9011 err = mlxsw_sp_rif_fdb_op(mlxsw_sp, dev->dev_addr, fid_index, true); in mlxsw_sp_router_port_change_event()
9023 vr = &mlxsw_sp->router->vrs[rif->vr_id]; in mlxsw_sp_router_port_change_event()
9037 mlxsw_sp_rif_edit(mlxsw_sp, rif->rif_index, rif->addr, rif->mtu, in mlxsw_sp_router_port_change_event()
9040 mlxsw_sp_rif_mac_profile_replace(mlxsw_sp, rif, rif->addr, extack); in mlxsw_sp_router_port_change_event()
9042 mlxsw_sp_rif_fdb_op(mlxsw_sp, rif->addr, fid_index, true); in mlxsw_sp_router_port_change_event()
9049 struct mlxsw_sp *mlxsw_sp = rif->mlxsw_sp; in mlxsw_sp_router_port_pre_changeaddr_event() local
9057 profile = mlxsw_sp_rif_mac_profile_find(mlxsw_sp, info->dev_addr); in mlxsw_sp_router_port_pre_changeaddr_event()
9061 max_rif_mac_profiles = mlxsw_sp->router->max_rif_mac_profile; in mlxsw_sp_router_port_pre_changeaddr_event()
9062 occ = mlxsw_sp_rif_mac_profiles_occ_get(mlxsw_sp); in mlxsw_sp_router_port_pre_changeaddr_event()
9116 mlxsw_sp_netdevice_offload_xstats_cmd(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_netdevice_offload_xstats_cmd() argument
9123 rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp, dev); in mlxsw_sp_netdevice_offload_xstats_cmd()
9146 struct mlxsw_sp *mlxsw_sp; in mlxsw_sp_netdevice_router_port_event() local
9149 mlxsw_sp = mlxsw_sp_lower_get(dev); in mlxsw_sp_netdevice_router_port_event()
9150 if (!mlxsw_sp) in mlxsw_sp_netdevice_router_port_event()
9153 rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp, dev); in mlxsw_sp_netdevice_router_port_event()
9160 return mlxsw_sp_router_port_change_event(mlxsw_sp, rif, extack); in mlxsw_sp_netdevice_router_port_event()
9171 static int mlxsw_sp_port_vrf_join(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_port_vrf_join() argument
9180 rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp, l3_dev); in mlxsw_sp_port_vrf_join()
9182 __mlxsw_sp_inetaddr_event(mlxsw_sp, l3_dev, NETDEV_DOWN, in mlxsw_sp_port_vrf_join()
9185 return __mlxsw_sp_inetaddr_event(mlxsw_sp, l3_dev, NETDEV_UP, extack); in mlxsw_sp_port_vrf_join()
9188 static void mlxsw_sp_port_vrf_leave(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_port_vrf_leave() argument
9193 rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp, l3_dev); in mlxsw_sp_port_vrf_leave()
9196 __mlxsw_sp_inetaddr_event(mlxsw_sp, l3_dev, NETDEV_DOWN, NULL); in mlxsw_sp_port_vrf_leave()
9212 struct mlxsw_sp *mlxsw_sp = mlxsw_sp_lower_get(l3_dev); in mlxsw_sp_netdevice_vrf_event() local
9218 if (!mlxsw_sp || netif_is_macvlan(l3_dev)) in mlxsw_sp_netdevice_vrf_event()
9229 err = mlxsw_sp_port_vrf_join(mlxsw_sp, l3_dev, extack); in mlxsw_sp_netdevice_vrf_event()
9231 mlxsw_sp_port_vrf_leave(mlxsw_sp, l3_dev); in mlxsw_sp_netdevice_vrf_event()
9244 struct mlxsw_sp *mlxsw_sp; in mlxsw_sp_router_netdevice_event() local
9248 mlxsw_sp = router->mlxsw_sp; in mlxsw_sp_router_netdevice_event()
9250 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_router_netdevice_event()
9253 err = mlxsw_sp_netdevice_offload_xstats_cmd(mlxsw_sp, dev, in mlxsw_sp_router_netdevice_event()
9255 else if (mlxsw_sp_netdev_is_ipip_ol(mlxsw_sp, dev)) in mlxsw_sp_router_netdevice_event()
9256 err = mlxsw_sp_netdevice_ipip_ol_event(mlxsw_sp, dev, in mlxsw_sp_router_netdevice_event()
9258 else if (mlxsw_sp_netdev_is_ipip_ul(mlxsw_sp, dev)) in mlxsw_sp_router_netdevice_event()
9259 err = mlxsw_sp_netdevice_ipip_ul_event(mlxsw_sp, dev, in mlxsw_sp_router_netdevice_event()
9266 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_router_netdevice_event()
9279 return mlxsw_sp_rif_fdb_op(rif->mlxsw_sp, dev->dev_addr, in __mlxsw_sp_rif_macvlan_flush()
9314 struct mlxsw_sp *mlxsw_sp = rif->mlxsw_sp; in mlxsw_sp_rif_subport_op() local
9329 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ritr), ritr_pl); in mlxsw_sp_rif_subport_op()
9338 err = mlxsw_sp_rif_mac_profile_get(rif->mlxsw_sp, rif->addr, in mlxsw_sp_rif_subport_configure()
9348 err = mlxsw_sp_rif_fdb_op(rif->mlxsw_sp, rif->dev->dev_addr, in mlxsw_sp_rif_subport_configure()
9360 mlxsw_sp_rif_fdb_op(rif->mlxsw_sp, rif->dev->dev_addr, in mlxsw_sp_rif_subport_configure()
9365 mlxsw_sp_rif_mac_profile_put(rif->mlxsw_sp, mac_profile); in mlxsw_sp_rif_subport_configure()
9374 mlxsw_sp_rif_fdb_op(rif->mlxsw_sp, rif->dev->dev_addr, in mlxsw_sp_rif_subport_deconfigure()
9378 mlxsw_sp_rif_mac_profile_put(rif->mlxsw_sp, rif->mac_profile_id); in mlxsw_sp_rif_subport_deconfigure()
9385 return mlxsw_sp_fid_rfid_get(rif->mlxsw_sp, rif->rif_index); in mlxsw_sp_rif_subport_fid_get()
9400 struct mlxsw_sp *mlxsw_sp = rif->mlxsw_sp; in mlxsw_sp_rif_fid_op() local
9409 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ritr), ritr_pl); in mlxsw_sp_rif_fid_op()
9412 u16 mlxsw_sp_router_port(const struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_router_port() argument
9414 return mlxsw_core_max_ports(mlxsw_sp->core) + 1; in mlxsw_sp_router_port()
9420 struct mlxsw_sp *mlxsw_sp = rif->mlxsw_sp; in mlxsw_sp_rif_fid_configure() local
9425 err = mlxsw_sp_rif_mac_profile_get(mlxsw_sp, rif->addr, in mlxsw_sp_rif_fid_configure()
9436 mlxsw_sp_router_port(mlxsw_sp), true); in mlxsw_sp_rif_fid_configure()
9441 mlxsw_sp_router_port(mlxsw_sp), true); in mlxsw_sp_rif_fid_configure()
9445 err = mlxsw_sp_rif_fdb_op(rif->mlxsw_sp, rif->dev->dev_addr, in mlxsw_sp_rif_fid_configure()
9457 mlxsw_sp_rif_fdb_op(rif->mlxsw_sp, rif->dev->dev_addr, in mlxsw_sp_rif_fid_configure()
9461 mlxsw_sp_router_port(mlxsw_sp), false); in mlxsw_sp_rif_fid_configure()
9464 mlxsw_sp_router_port(mlxsw_sp), false); in mlxsw_sp_rif_fid_configure()
9468 mlxsw_sp_rif_mac_profile_put(mlxsw_sp, mac_profile); in mlxsw_sp_rif_fid_configure()
9475 struct mlxsw_sp *mlxsw_sp = rif->mlxsw_sp; in mlxsw_sp_rif_fid_deconfigure() local
9479 mlxsw_sp_rif_fdb_op(rif->mlxsw_sp, rif->dev->dev_addr, in mlxsw_sp_rif_fid_deconfigure()
9483 mlxsw_sp_router_port(mlxsw_sp), false); in mlxsw_sp_rif_fid_deconfigure()
9485 mlxsw_sp_router_port(mlxsw_sp), false); in mlxsw_sp_rif_fid_deconfigure()
9487 mlxsw_sp_rif_mac_profile_put(rif->mlxsw_sp, rif->mac_profile_id); in mlxsw_sp_rif_fid_deconfigure()
9494 return mlxsw_sp_fid_8021d_get(rif->mlxsw_sp, rif->dev->ifindex); in mlxsw_sp_rif_fid_fid_get()
9542 return mlxsw_sp_fid_8021q_get(rif->mlxsw_sp, vid); in mlxsw_sp_rif_vlan_fid_get()
9566 struct mlxsw_sp *mlxsw_sp = rif->mlxsw_sp; in mlxsw_sp_rif_vlan_op() local
9573 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ritr), ritr_pl); in mlxsw_sp_rif_vlan_op()
9580 struct mlxsw_sp *mlxsw_sp = rif->mlxsw_sp; in mlxsw_sp_rif_vlan_configure() local
9584 err = mlxsw_sp_rif_mac_profile_get(mlxsw_sp, rif->addr, in mlxsw_sp_rif_vlan_configure()
9595 mlxsw_sp_router_port(mlxsw_sp), true); in mlxsw_sp_rif_vlan_configure()
9600 mlxsw_sp_router_port(mlxsw_sp), true); in mlxsw_sp_rif_vlan_configure()
9604 err = mlxsw_sp_rif_fdb_op(rif->mlxsw_sp, rif->dev->dev_addr, in mlxsw_sp_rif_vlan_configure()
9616 mlxsw_sp_rif_fdb_op(rif->mlxsw_sp, rif->dev->dev_addr, in mlxsw_sp_rif_vlan_configure()
9620 mlxsw_sp_router_port(mlxsw_sp), false); in mlxsw_sp_rif_vlan_configure()
9623 mlxsw_sp_router_port(mlxsw_sp), false); in mlxsw_sp_rif_vlan_configure()
9627 mlxsw_sp_rif_mac_profile_put(mlxsw_sp, mac_profile); in mlxsw_sp_rif_vlan_configure()
9634 struct mlxsw_sp *mlxsw_sp = rif->mlxsw_sp; in mlxsw_sp_rif_vlan_deconfigure() local
9637 mlxsw_sp_rif_fdb_op(rif->mlxsw_sp, rif->dev->dev_addr, in mlxsw_sp_rif_vlan_deconfigure()
9641 mlxsw_sp_router_port(mlxsw_sp), false); in mlxsw_sp_rif_vlan_deconfigure()
9643 mlxsw_sp_router_port(mlxsw_sp), false); in mlxsw_sp_rif_vlan_deconfigure()
9645 mlxsw_sp_rif_mac_profile_put(rif->mlxsw_sp, rif->mac_profile_id); in mlxsw_sp_rif_vlan_deconfigure()
9705 struct mlxsw_sp *mlxsw_sp = rif->mlxsw_sp; in mlxsw_sp1_rif_ipip_lb_configure() local
9709 ul_vr = mlxsw_sp_vr_get(mlxsw_sp, ul_tb_id, NULL); in mlxsw_sp1_rif_ipip_lb_configure()
9723 mlxsw_sp_vr_put(mlxsw_sp, ul_vr); in mlxsw_sp1_rif_ipip_lb_configure()
9730 struct mlxsw_sp *mlxsw_sp = rif->mlxsw_sp; in mlxsw_sp1_rif_ipip_lb_deconfigure() local
9733 ul_vr = &mlxsw_sp->router->vrs[lb_rif->ul_vr_id]; in mlxsw_sp1_rif_ipip_lb_deconfigure()
9737 mlxsw_sp_vr_put(mlxsw_sp, ul_vr); in mlxsw_sp1_rif_ipip_lb_deconfigure()
9758 struct mlxsw_sp *mlxsw_sp = ul_rif->mlxsw_sp; in mlxsw_sp_rif_ipip_lb_ul_rif_op() local
9766 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ritr), ritr_pl); in mlxsw_sp_rif_ipip_lb_ul_rif_op()
9770 mlxsw_sp_ul_rif_create(struct mlxsw_sp *mlxsw_sp, struct mlxsw_sp_vr *vr, in mlxsw_sp_ul_rif_create() argument
9777 err = mlxsw_sp_rif_index_alloc(mlxsw_sp, &rif_index); in mlxsw_sp_ul_rif_create()
9787 mlxsw_sp->router->rifs[rif_index] = ul_rif; in mlxsw_sp_ul_rif_create()
9788 ul_rif->mlxsw_sp = mlxsw_sp; in mlxsw_sp_ul_rif_create()
9793 atomic_inc(&mlxsw_sp->router->rifs_count); in mlxsw_sp_ul_rif_create()
9797 mlxsw_sp->router->rifs[rif_index] = NULL; in mlxsw_sp_ul_rif_create()
9804 struct mlxsw_sp *mlxsw_sp = ul_rif->mlxsw_sp; in mlxsw_sp_ul_rif_destroy() local
9806 atomic_dec(&mlxsw_sp->router->rifs_count); in mlxsw_sp_ul_rif_destroy()
9808 mlxsw_sp->router->rifs[ul_rif->rif_index] = NULL; in mlxsw_sp_ul_rif_destroy()
9813 mlxsw_sp_ul_rif_get(struct mlxsw_sp *mlxsw_sp, u32 tb_id, in mlxsw_sp_ul_rif_get() argument
9819 vr = mlxsw_sp_vr_get(mlxsw_sp, tb_id, extack); in mlxsw_sp_ul_rif_get()
9826 vr->ul_rif = mlxsw_sp_ul_rif_create(mlxsw_sp, vr, extack); in mlxsw_sp_ul_rif_get()
9838 mlxsw_sp_vr_put(mlxsw_sp, vr); in mlxsw_sp_ul_rif_get()
9844 struct mlxsw_sp *mlxsw_sp = ul_rif->mlxsw_sp; in mlxsw_sp_ul_rif_put() local
9847 vr = &mlxsw_sp->router->vrs[ul_rif->vr_id]; in mlxsw_sp_ul_rif_put()
9854 mlxsw_sp_vr_put(mlxsw_sp, vr); in mlxsw_sp_ul_rif_put()
9857 int mlxsw_sp_router_ul_rif_get(struct mlxsw_sp *mlxsw_sp, u32 ul_tb_id, in mlxsw_sp_router_ul_rif_get() argument
9863 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_router_ul_rif_get()
9864 ul_rif = mlxsw_sp_ul_rif_get(mlxsw_sp, ul_tb_id, NULL); in mlxsw_sp_router_ul_rif_get()
9871 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_router_ul_rif_get()
9875 void mlxsw_sp_router_ul_rif_put(struct mlxsw_sp *mlxsw_sp, u16 ul_rif_index) in mlxsw_sp_router_ul_rif_put() argument
9879 mutex_lock(&mlxsw_sp->router->lock); in mlxsw_sp_router_ul_rif_put()
9880 ul_rif = mlxsw_sp->router->rifs[ul_rif_index]; in mlxsw_sp_router_ul_rif_put()
9886 mutex_unlock(&mlxsw_sp->router->lock); in mlxsw_sp_router_ul_rif_put()
9895 struct mlxsw_sp *mlxsw_sp = rif->mlxsw_sp; in mlxsw_sp2_rif_ipip_lb_configure() local
9899 ul_rif = mlxsw_sp_ul_rif_get(mlxsw_sp, ul_tb_id, NULL); in mlxsw_sp2_rif_ipip_lb_configure()
9920 struct mlxsw_sp *mlxsw_sp = rif->mlxsw_sp; in mlxsw_sp2_rif_ipip_lb_deconfigure() local
9923 ul_rif = mlxsw_sp_rif_by_index(mlxsw_sp, lb_rif->ul_rif_id); in mlxsw_sp2_rif_ipip_lb_deconfigure()
9943 static int mlxsw_sp_rifs_init(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_rifs_init() argument
9945 u64 max_rifs = MLXSW_CORE_RES_GET(mlxsw_sp->core, MAX_RIFS); in mlxsw_sp_rifs_init()
9946 struct devlink *devlink = priv_to_devlink(mlxsw_sp->core); in mlxsw_sp_rifs_init()
9947 struct mlxsw_core *core = mlxsw_sp->core; in mlxsw_sp_rifs_init()
9951 mlxsw_sp->router->max_rif_mac_profile = in mlxsw_sp_rifs_init()
9954 mlxsw_sp->router->rifs = kcalloc(max_rifs, in mlxsw_sp_rifs_init()
9957 if (!mlxsw_sp->router->rifs) in mlxsw_sp_rifs_init()
9960 idr_init(&mlxsw_sp->router->rif_mac_profiles_idr); in mlxsw_sp_rifs_init()
9961 atomic_set(&mlxsw_sp->router->rif_mac_profiles_count, 0); in mlxsw_sp_rifs_init()
9962 atomic_set(&mlxsw_sp->router->rifs_count, 0); in mlxsw_sp_rifs_init()
9966 mlxsw_sp); in mlxsw_sp_rifs_init()
9970 mlxsw_sp); in mlxsw_sp_rifs_init()
9975 static void mlxsw_sp_rifs_fini(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_rifs_fini() argument
9977 struct devlink *devlink = priv_to_devlink(mlxsw_sp->core); in mlxsw_sp_rifs_fini()
9980 WARN_ON_ONCE(atomic_read(&mlxsw_sp->router->rifs_count)); in mlxsw_sp_rifs_fini()
9981 for (i = 0; i < MLXSW_CORE_RES_GET(mlxsw_sp->core, MAX_RIFS); i++) in mlxsw_sp_rifs_fini()
9982 WARN_ON_ONCE(mlxsw_sp->router->rifs[i]); in mlxsw_sp_rifs_fini()
9987 WARN_ON(!idr_is_empty(&mlxsw_sp->router->rif_mac_profiles_idr)); in mlxsw_sp_rifs_fini()
9988 idr_destroy(&mlxsw_sp->router->rif_mac_profiles_idr); in mlxsw_sp_rifs_fini()
9989 kfree(mlxsw_sp->router->rifs); in mlxsw_sp_rifs_fini()
9993 mlxsw_sp_ipip_config_tigcr(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_ipip_config_tigcr() argument
9998 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(tigcr), tigcr_pl); in mlxsw_sp_ipip_config_tigcr()
10001 static int mlxsw_sp_ipips_init(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_ipips_init() argument
10005 INIT_LIST_HEAD(&mlxsw_sp->router->ipip_list); in mlxsw_sp_ipips_init()
10007 err = mlxsw_sp_ipip_ecn_encap_init(mlxsw_sp); in mlxsw_sp_ipips_init()
10010 err = mlxsw_sp_ipip_ecn_decap_init(mlxsw_sp); in mlxsw_sp_ipips_init()
10014 return mlxsw_sp_ipip_config_tigcr(mlxsw_sp); in mlxsw_sp_ipips_init()
10017 static int mlxsw_sp1_ipips_init(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp1_ipips_init() argument
10019 mlxsw_sp->router->ipip_ops_arr = mlxsw_sp1_ipip_ops_arr; in mlxsw_sp1_ipips_init()
10020 return mlxsw_sp_ipips_init(mlxsw_sp); in mlxsw_sp1_ipips_init()
10023 static int mlxsw_sp2_ipips_init(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp2_ipips_init() argument
10025 mlxsw_sp->router->ipip_ops_arr = mlxsw_sp2_ipip_ops_arr; in mlxsw_sp2_ipips_init()
10026 return mlxsw_sp_ipips_init(mlxsw_sp); in mlxsw_sp2_ipips_init()
10029 static void mlxsw_sp_ipips_fini(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_ipips_fini() argument
10031 WARN_ON(!list_empty(&mlxsw_sp->router->ipip_list)); in mlxsw_sp_ipips_fini()
10044 mlxsw_sp_router_fib_flush(router->mlxsw_sp); in mlxsw_sp_router_fib_dump_flush()
10137 static void mlxsw_sp_mp4_hash_init(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_mp4_hash_init() argument
10140 struct net *net = mlxsw_sp_net(mlxsw_sp); in mlxsw_sp_mp4_hash_init()
10197 static void mlxsw_sp_mp6_hash_init(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_mp6_hash_init() argument
10200 u32 hash_fields = ip6_multipath_hash_fields(mlxsw_sp_net(mlxsw_sp)); in mlxsw_sp_mp6_hash_init()
10204 switch (ip6_multipath_hash_policy(mlxsw_sp_net(mlxsw_sp))) { in mlxsw_sp_mp6_hash_init()
10255 static int mlxsw_sp_mp_hash_parsing_depth_adjust(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_mp_hash_parsing_depth_adjust() argument
10262 err = mlxsw_sp_parsing_depth_inc(mlxsw_sp); in mlxsw_sp_mp_hash_parsing_depth_adjust()
10265 mlxsw_sp->router->inc_parsing_depth = true; in mlxsw_sp_mp_hash_parsing_depth_adjust()
10267 mlxsw_sp_parsing_depth_dec(mlxsw_sp); in mlxsw_sp_mp_hash_parsing_depth_adjust()
10268 mlxsw_sp->router->inc_parsing_depth = false; in mlxsw_sp_mp_hash_parsing_depth_adjust()
10274 static int mlxsw_sp_mp_hash_init(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_mp_hash_init() argument
10283 seed = jhash(mlxsw_sp->base_mac, sizeof(mlxsw_sp->base_mac), 0); in mlxsw_sp_mp_hash_init()
10285 mlxsw_sp_mp4_hash_init(mlxsw_sp, &config); in mlxsw_sp_mp_hash_init()
10286 mlxsw_sp_mp6_hash_init(mlxsw_sp, &config); in mlxsw_sp_mp_hash_init()
10288 old_inc_parsing_depth = mlxsw_sp->router->inc_parsing_depth; in mlxsw_sp_mp_hash_init()
10290 err = mlxsw_sp_mp_hash_parsing_depth_adjust(mlxsw_sp, in mlxsw_sp_mp_hash_init()
10305 err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(recr2), recr2_pl); in mlxsw_sp_mp_hash_init()
10312 mlxsw_sp_mp_hash_parsing_depth_adjust(mlxsw_sp, new_inc_parsing_depth, in mlxsw_sp_mp_hash_init()
10317 static int mlxsw_sp_mp_hash_init(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_mp_hash_init() argument
10323 static int mlxsw_sp_dscp_init(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_dscp_init() argument
10338 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(rdpm), rdpm_pl); in mlxsw_sp_dscp_init()
10341 static int __mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp) in __mlxsw_sp_router_init() argument
10343 struct net *net = mlxsw_sp_net(mlxsw_sp); in __mlxsw_sp_router_init()
10348 if (!MLXSW_CORE_RES_VALID(mlxsw_sp->core, MAX_RIFS)) in __mlxsw_sp_router_init()
10350 max_rifs = MLXSW_CORE_RES_GET(mlxsw_sp->core, MAX_RIFS); in __mlxsw_sp_router_init()
10356 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(rgcr), rgcr_pl); in __mlxsw_sp_router_init()
10359 static void __mlxsw_sp_router_fini(struct mlxsw_sp *mlxsw_sp) in __mlxsw_sp_router_fini() argument
10364 mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(rgcr), rgcr_pl); in __mlxsw_sp_router_fini()
10367 static int mlxsw_sp_lb_rif_init(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_lb_rif_init() argument
10376 err = mlxsw_sp_router_ul_rif_get(mlxsw_sp, RT_TABLE_MAIN, in mlxsw_sp_lb_rif_init()
10381 mlxsw_sp->router->lb_rif_index = lb_rif_index; in mlxsw_sp_lb_rif_init()
10386 static void mlxsw_sp_lb_rif_fini(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_lb_rif_fini() argument
10388 mlxsw_sp_router_ul_rif_put(mlxsw_sp, mlxsw_sp->router->lb_rif_index); in mlxsw_sp_lb_rif_fini()
10391 static int mlxsw_sp1_router_init(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp1_router_init() argument
10395 mlxsw_sp->router->rif_ops_arr = mlxsw_sp1_rif_ops_arr; in mlxsw_sp1_router_init()
10396 mlxsw_sp->router->adj_grp_size_ranges = mlxsw_sp1_adj_grp_size_ranges; in mlxsw_sp1_router_init()
10397 mlxsw_sp->router->adj_grp_size_ranges_count = size_ranges_count; in mlxsw_sp1_router_init()
10407 static int mlxsw_sp2_router_init(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp2_router_init() argument
10411 mlxsw_sp->router->rif_ops_arr = mlxsw_sp2_rif_ops_arr; in mlxsw_sp2_router_init()
10412 mlxsw_sp->router->adj_grp_size_ranges = mlxsw_sp2_adj_grp_size_ranges; in mlxsw_sp2_router_init()
10413 mlxsw_sp->router->adj_grp_size_ranges_count = size_ranges_count; in mlxsw_sp2_router_init()
10423 int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp, in mlxsw_sp_router_init() argument
10429 router = kzalloc(sizeof(*mlxsw_sp->router), GFP_KERNEL); in mlxsw_sp_router_init()
10433 mlxsw_sp->router = router; in mlxsw_sp_router_init()
10434 router->mlxsw_sp = mlxsw_sp; in mlxsw_sp_router_init()
10436 err = mlxsw_sp->router_ops->init(mlxsw_sp); in mlxsw_sp_router_init()
10440 INIT_LIST_HEAD(&mlxsw_sp->router->nh_res_grp_list); in mlxsw_sp_router_init()
10441 INIT_DELAYED_WORK(&mlxsw_sp->router->nh_grp_activity_dw, in mlxsw_sp_router_init()
10443 INIT_LIST_HEAD(&mlxsw_sp->router->nexthop_neighs_list); in mlxsw_sp_router_init()
10444 err = __mlxsw_sp_router_init(mlxsw_sp); in mlxsw_sp_router_init()
10448 err = mlxsw_sp_rifs_init(mlxsw_sp); in mlxsw_sp_router_init()
10452 err = mlxsw_sp->router_ops->ipips_init(mlxsw_sp); in mlxsw_sp_router_init()
10456 err = rhashtable_init(&mlxsw_sp->router->nexthop_ht, in mlxsw_sp_router_init()
10461 err = rhashtable_init(&mlxsw_sp->router->nexthop_group_ht, in mlxsw_sp_router_init()
10466 INIT_LIST_HEAD(&mlxsw_sp->router->nexthop_list); in mlxsw_sp_router_init()
10467 err = mlxsw_sp_lpm_init(mlxsw_sp); in mlxsw_sp_router_init()
10471 err = mlxsw_sp_mr_init(mlxsw_sp, &mlxsw_sp_mr_tcam_ops); in mlxsw_sp_router_init()
10475 err = mlxsw_sp_vrs_init(mlxsw_sp); in mlxsw_sp_router_init()
10479 err = mlxsw_sp_lb_rif_init(mlxsw_sp); in mlxsw_sp_router_init()
10483 err = mlxsw_sp_neigh_init(mlxsw_sp); in mlxsw_sp_router_init()
10487 err = mlxsw_sp_mp_hash_init(mlxsw_sp); in mlxsw_sp_router_init()
10491 err = mlxsw_sp_dscp_init(mlxsw_sp); in mlxsw_sp_router_init()
10505 mlxsw_sp->router->netevent_nb.notifier_call = in mlxsw_sp_router_init()
10507 err = register_netevent_notifier(&mlxsw_sp->router->netevent_nb); in mlxsw_sp_router_init()
10511 mlxsw_sp->router->nexthop_nb.notifier_call = in mlxsw_sp_router_init()
10513 err = register_nexthop_notifier(mlxsw_sp_net(mlxsw_sp), in mlxsw_sp_router_init()
10514 &mlxsw_sp->router->nexthop_nb, in mlxsw_sp_router_init()
10519 mlxsw_sp->router->fib_nb.notifier_call = mlxsw_sp_router_fib_event; in mlxsw_sp_router_init()
10520 err = register_fib_notifier(mlxsw_sp_net(mlxsw_sp), in mlxsw_sp_router_init()
10521 &mlxsw_sp->router->fib_nb, in mlxsw_sp_router_init()
10526 mlxsw_sp->router->netdevice_nb.notifier_call = in mlxsw_sp_router_init()
10528 err = register_netdevice_notifier_net(mlxsw_sp_net(mlxsw_sp), in mlxsw_sp_router_init()
10529 &mlxsw_sp->router->netdevice_nb); in mlxsw_sp_router_init()
10536 unregister_fib_notifier(mlxsw_sp_net(mlxsw_sp), in mlxsw_sp_router_init()
10537 &mlxsw_sp->router->fib_nb); in mlxsw_sp_router_init()
10539 unregister_nexthop_notifier(mlxsw_sp_net(mlxsw_sp), in mlxsw_sp_router_init()
10540 &mlxsw_sp->router->nexthop_nb); in mlxsw_sp_router_init()
10542 unregister_netevent_notifier(&mlxsw_sp->router->netevent_nb); in mlxsw_sp_router_init()
10551 mlxsw_sp_neigh_fini(mlxsw_sp); in mlxsw_sp_router_init()
10553 mlxsw_sp_lb_rif_fini(mlxsw_sp); in mlxsw_sp_router_init()
10555 mlxsw_sp_vrs_fini(mlxsw_sp); in mlxsw_sp_router_init()
10557 mlxsw_sp_mr_fini(mlxsw_sp); in mlxsw_sp_router_init()
10559 mlxsw_sp_lpm_fini(mlxsw_sp); in mlxsw_sp_router_init()
10561 rhashtable_destroy(&mlxsw_sp->router->nexthop_group_ht); in mlxsw_sp_router_init()
10563 rhashtable_destroy(&mlxsw_sp->router->nexthop_ht); in mlxsw_sp_router_init()
10565 mlxsw_sp_ipips_fini(mlxsw_sp); in mlxsw_sp_router_init()
10567 mlxsw_sp_rifs_fini(mlxsw_sp); in mlxsw_sp_router_init()
10569 __mlxsw_sp_router_fini(mlxsw_sp); in mlxsw_sp_router_init()
10571 cancel_delayed_work_sync(&mlxsw_sp->router->nh_grp_activity_dw); in mlxsw_sp_router_init()
10573 mutex_destroy(&mlxsw_sp->router->lock); in mlxsw_sp_router_init()
10574 kfree(mlxsw_sp->router); in mlxsw_sp_router_init()
10578 void mlxsw_sp_router_fini(struct mlxsw_sp *mlxsw_sp) in mlxsw_sp_router_fini() argument
10580 unregister_netdevice_notifier_net(mlxsw_sp_net(mlxsw_sp), in mlxsw_sp_router_fini()
10581 &mlxsw_sp->router->netdevice_nb); in mlxsw_sp_router_fini()
10582 unregister_fib_notifier(mlxsw_sp_net(mlxsw_sp), in mlxsw_sp_router_fini()
10583 &mlxsw_sp->router->fib_nb); in mlxsw_sp_router_fini()
10584 unregister_nexthop_notifier(mlxsw_sp_net(mlxsw_sp), in mlxsw_sp_router_fini()
10585 &mlxsw_sp->router->nexthop_nb); in mlxsw_sp_router_fini()
10586 unregister_netevent_notifier(&mlxsw_sp->router->netevent_nb); in mlxsw_sp_router_fini()
10587 unregister_inet6addr_notifier(&mlxsw_sp->router->inet6addr_nb); in mlxsw_sp_router_fini()
10588 unregister_inetaddr_notifier(&mlxsw_sp->router->inetaddr_nb); in mlxsw_sp_router_fini()
10590 mlxsw_sp_neigh_fini(mlxsw_sp); in mlxsw_sp_router_fini()
10591 mlxsw_sp_lb_rif_fini(mlxsw_sp); in mlxsw_sp_router_fini()
10592 mlxsw_sp_vrs_fini(mlxsw_sp); in mlxsw_sp_router_fini()
10593 mlxsw_sp_mr_fini(mlxsw_sp); in mlxsw_sp_router_fini()
10594 mlxsw_sp_lpm_fini(mlxsw_sp); in mlxsw_sp_router_fini()
10595 rhashtable_destroy(&mlxsw_sp->router->nexthop_group_ht); in mlxsw_sp_router_fini()
10596 rhashtable_destroy(&mlxsw_sp->router->nexthop_ht); in mlxsw_sp_router_fini()
10597 mlxsw_sp_ipips_fini(mlxsw_sp); in mlxsw_sp_router_fini()
10598 mlxsw_sp_rifs_fini(mlxsw_sp); in mlxsw_sp_router_fini()
10599 __mlxsw_sp_router_fini(mlxsw_sp); in mlxsw_sp_router_fini()
10600 cancel_delayed_work_sync(&mlxsw_sp->router->nh_grp_activity_dw); in mlxsw_sp_router_fini()
10601 mutex_destroy(&mlxsw_sp->router->lock); in mlxsw_sp_router_fini()
10602 kfree(mlxsw_sp->router); in mlxsw_sp_router_fini()