Lines Matching refs:mr_table

55 	bool (*is_route_valid)(const struct mlxsw_sp_mr_table *mr_table,
57 void (*key_create)(struct mlxsw_sp_mr_table *mr_table,
60 bool (*is_route_starg)(const struct mlxsw_sp_mr_table *mr_table,
86 const struct mlxsw_sp_mr_table *mr_table; member
143 if (mr_route->mr_table->ops->is_route_starg(mr_route->mr_table, in mlxsw_sp_mr_route_action()
165 return mr_route->mr_table->ops->is_route_starg(mr_route->mr_table, in mlxsw_sp_mr_route_prio()
207 mlxsw_sp_mr_route_info_create(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route_info_create() argument
248 static int mlxsw_sp_mr_route_write(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route_write() argument
252 struct mlxsw_sp *mlxsw_sp = mr_table->mlxsw_sp; in mlxsw_sp_mr_route_write()
257 err = mlxsw_sp_mr_route_info_create(mr_table, mr_route, &route_info); in mlxsw_sp_mr_route_write()
288 static void mlxsw_sp_mr_route_erase(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route_erase() argument
291 struct mlxsw_sp *mlxsw_sp = mr_table->mlxsw_sp; in mlxsw_sp_mr_route_erase()
299 mlxsw_sp_mr_route_create(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route_create() argument
317 mr_table->ops->key_create(mr_table, &mr_route->key, mr_route->mfc); in mlxsw_sp_mr_route_create()
319 mr_route->mr_table = mr_table; in mlxsw_sp_mr_route_create()
323 &mr_table->vifs[i]); in mlxsw_sp_mr_route_create()
326 if (mr_table->vifs[i].dev && in mlxsw_sp_mr_route_create()
327 mr_table->vifs[i].dev->mtu < mr_route->min_mtu) in mlxsw_sp_mr_route_create()
328 mr_route->min_mtu = mr_table->vifs[i].dev->mtu; in mlxsw_sp_mr_route_create()
332 &mr_table->vifs[mfc->mfc_parent]); in mlxsw_sp_mr_route_create()
344 static void mlxsw_sp_mr_route_destroy(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route_destroy() argument
373 static void __mlxsw_sp_mr_route_del(struct mlxsw_sp_mr_table *mr_table, in __mlxsw_sp_mr_route_del() argument
376 WARN_ON_ONCE(!mutex_is_locked(&mr_table->route_list_lock)); in __mlxsw_sp_mr_route_del()
379 rhashtable_remove_fast(&mr_table->route_ht, &mr_route->ht_node, in __mlxsw_sp_mr_route_del()
382 mlxsw_sp_mr_route_erase(mr_table, mr_route); in __mlxsw_sp_mr_route_del()
383 mlxsw_sp_mr_route_destroy(mr_table, mr_route); in __mlxsw_sp_mr_route_del()
386 int mlxsw_sp_mr_route_add(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route_add() argument
393 if (!mr_table->ops->is_route_valid(mr_table, mfc)) in mlxsw_sp_mr_route_add()
397 mr_route = mlxsw_sp_mr_route_create(mr_table, mfc); in mlxsw_sp_mr_route_add()
402 mr_orig_route = rhashtable_lookup_fast(&mr_table->route_ht, in mlxsw_sp_mr_route_add()
417 dev_warn(mr_table->mlxsw_sp->bus_info->dev, in mlxsw_sp_mr_route_add()
424 err = mlxsw_sp_mr_route_write(mr_table, mr_route, replace); in mlxsw_sp_mr_route_add()
429 mutex_lock(&mr_table->route_list_lock); in mlxsw_sp_mr_route_add()
430 list_add_tail(&mr_route->node, &mr_table->route_list); in mlxsw_sp_mr_route_add()
431 mutex_unlock(&mr_table->route_list_lock); in mlxsw_sp_mr_route_add()
432 err = rhashtable_insert_fast(&mr_table->route_ht, in mlxsw_sp_mr_route_add()
440 rhashtable_remove_fast(&mr_table->route_ht, in mlxsw_sp_mr_route_add()
444 mlxsw_sp_mr_route_destroy(mr_table, mr_orig_route); in mlxsw_sp_mr_route_add()
451 mutex_lock(&mr_table->route_list_lock); in mlxsw_sp_mr_route_add()
453 mutex_unlock(&mr_table->route_list_lock); in mlxsw_sp_mr_route_add()
454 mlxsw_sp_mr_route_erase(mr_table, mr_route); in mlxsw_sp_mr_route_add()
458 mlxsw_sp_mr_route_destroy(mr_table, mr_route); in mlxsw_sp_mr_route_add()
462 void mlxsw_sp_mr_route_del(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route_del() argument
468 mr_table->ops->key_create(mr_table, &key, mfc); in mlxsw_sp_mr_route_del()
469 mr_route = rhashtable_lookup_fast(&mr_table->route_ht, &key, in mlxsw_sp_mr_route_del()
472 mutex_lock(&mr_table->route_list_lock); in mlxsw_sp_mr_route_del()
473 __mlxsw_sp_mr_route_del(mr_table, mr_route); in mlxsw_sp_mr_route_del()
474 mutex_unlock(&mr_table->route_list_lock); in mlxsw_sp_mr_route_del()
480 mlxsw_sp_mr_route_ivif_resolve(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route_ivif_resolve() argument
483 struct mlxsw_sp *mlxsw_sp = mr_table->mlxsw_sp; in mlxsw_sp_mr_route_ivif_resolve()
515 mlxsw_sp_mr_route_ivif_unresolve(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route_ivif_unresolve() argument
518 struct mlxsw_sp *mlxsw_sp = mr_table->mlxsw_sp; in mlxsw_sp_mr_route_ivif_unresolve()
529 mlxsw_sp_mr_route_evif_resolve(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route_evif_resolve() argument
532 struct mlxsw_sp *mlxsw_sp = mr_table->mlxsw_sp; in mlxsw_sp_mr_route_evif_resolve()
588 mlxsw_sp_mr_route_evif_unresolve(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route_evif_unresolve() argument
591 struct mlxsw_sp *mlxsw_sp = mr_table->mlxsw_sp; in mlxsw_sp_mr_route_evif_unresolve()
621 static int mlxsw_sp_mr_vif_resolve(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_vif_resolve() argument
637 err = mlxsw_sp_mr_route_ivif_resolve(mr_table, irve); in mlxsw_sp_mr_vif_resolve()
644 err = mlxsw_sp_mr_route_evif_resolve(mr_table, erve); in mlxsw_sp_mr_vif_resolve()
653 mlxsw_sp_mr_route_evif_unresolve(mr_table, erve); in mlxsw_sp_mr_vif_resolve()
657 mlxsw_sp_mr_route_ivif_unresolve(mr_table, irve); in mlxsw_sp_mr_vif_resolve()
662 static void mlxsw_sp_mr_vif_unresolve(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_vif_unresolve() argument
670 mlxsw_sp_mr_route_evif_unresolve(mr_table, rve); in mlxsw_sp_mr_vif_unresolve()
674 mlxsw_sp_mr_route_ivif_unresolve(mr_table, rve); in mlxsw_sp_mr_vif_unresolve()
681 int mlxsw_sp_mr_vif_add(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_vif_add() argument
685 struct mlxsw_sp_mr_vif *mr_vif = &mr_table->vifs[vif_index]; in mlxsw_sp_mr_vif_add()
691 return mlxsw_sp_mr_vif_resolve(mr_table, dev, mr_vif, vif_flags, rif); in mlxsw_sp_mr_vif_add()
694 void mlxsw_sp_mr_vif_del(struct mlxsw_sp_mr_table *mr_table, vifi_t vif_index) in mlxsw_sp_mr_vif_del() argument
696 struct mlxsw_sp_mr_vif *mr_vif = &mr_table->vifs[vif_index]; in mlxsw_sp_mr_vif_del()
702 mlxsw_sp_mr_vif_unresolve(mr_table, NULL, mr_vif); in mlxsw_sp_mr_vif_del()
706 mlxsw_sp_mr_dev_vif_lookup(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_dev_vif_lookup() argument
712 if (mr_table->vifs[vif_index].dev == dev) in mlxsw_sp_mr_dev_vif_lookup()
713 return &mr_table->vifs[vif_index]; in mlxsw_sp_mr_dev_vif_lookup()
717 int mlxsw_sp_mr_rif_add(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_rif_add() argument
726 mr_vif = mlxsw_sp_mr_dev_vif_lookup(mr_table, rif_dev); in mlxsw_sp_mr_rif_add()
729 return mlxsw_sp_mr_vif_resolve(mr_table, mr_vif->dev, mr_vif, in mlxsw_sp_mr_rif_add()
733 void mlxsw_sp_mr_rif_del(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_rif_del() argument
742 mr_vif = mlxsw_sp_mr_dev_vif_lookup(mr_table, rif_dev); in mlxsw_sp_mr_rif_del()
745 mlxsw_sp_mr_vif_unresolve(mr_table, mr_vif->dev, mr_vif); in mlxsw_sp_mr_rif_del()
748 void mlxsw_sp_mr_rif_mtu_update(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_rif_mtu_update() argument
752 struct mlxsw_sp *mlxsw_sp = mr_table->mlxsw_sp; in mlxsw_sp_mr_rif_mtu_update()
761 mr_vif = mlxsw_sp_mr_dev_vif_lookup(mr_table, rif_dev); in mlxsw_sp_mr_rif_mtu_update()
778 mlxsw_sp_mr_route4_validate(const struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route4_validate() argument
788 dev_warn(mr_table->mlxsw_sp->bus_info->dev, in mlxsw_sp_mr_route4_validate()
795 static void mlxsw_sp_mr_route4_key(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route4_key() argument
805 key->vrid = mr_table->vr_id; in mlxsw_sp_mr_route4_key()
813 static bool mlxsw_sp_mr_route4_starg(const struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route4_starg() argument
825 mlxsw_sp_mr_route6_validate(const struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route6_validate() argument
835 dev_warn(mr_table->mlxsw_sp->bus_info->dev, in mlxsw_sp_mr_route6_validate()
842 static void mlxsw_sp_mr_route6_key(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route6_key() argument
849 key->vrid = mr_table->vr_id; in mlxsw_sp_mr_route6_key()
859 static bool mlxsw_sp_mr_route6_starg(const struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route6_starg() argument
910 struct mlxsw_sp_mr_table *mr_table; in mlxsw_sp_mr_table_create() local
914 mr_table = kzalloc(sizeof(*mr_table) + mr->mr_ops->route_priv_size, in mlxsw_sp_mr_table_create()
916 if (!mr_table) in mlxsw_sp_mr_table_create()
919 mr_table->vr_id = vr_id; in mlxsw_sp_mr_table_create()
920 mr_table->mlxsw_sp = mlxsw_sp; in mlxsw_sp_mr_table_create()
921 mr_table->proto = proto; in mlxsw_sp_mr_table_create()
922 mr_table->ops = &mlxsw_sp_mr_table_ops_arr[proto]; in mlxsw_sp_mr_table_create()
923 INIT_LIST_HEAD(&mr_table->route_list); in mlxsw_sp_mr_table_create()
924 mutex_init(&mr_table->route_list_lock); in mlxsw_sp_mr_table_create()
926 err = rhashtable_init(&mr_table->route_ht, in mlxsw_sp_mr_table_create()
932 INIT_LIST_HEAD(&mr_table->vifs[i].route_evif_list); in mlxsw_sp_mr_table_create()
933 INIT_LIST_HEAD(&mr_table->vifs[i].route_ivif_list); in mlxsw_sp_mr_table_create()
934 mr_table->vifs[i].ops = &mlxsw_sp_mr_vif_ops_arr[proto]; in mlxsw_sp_mr_table_create()
938 mr_table->catchall_route_priv, in mlxsw_sp_mr_table_create()
943 list_add_tail(&mr_table->node, &mr->table_list); in mlxsw_sp_mr_table_create()
945 return mr_table; in mlxsw_sp_mr_table_create()
948 rhashtable_destroy(&mr_table->route_ht); in mlxsw_sp_mr_table_create()
950 mutex_destroy(&mr_table->route_list_lock); in mlxsw_sp_mr_table_create()
951 kfree(mr_table); in mlxsw_sp_mr_table_create()
955 void mlxsw_sp_mr_table_destroy(struct mlxsw_sp_mr_table *mr_table) in mlxsw_sp_mr_table_destroy() argument
957 struct mlxsw_sp *mlxsw_sp = mr_table->mlxsw_sp; in mlxsw_sp_mr_table_destroy()
960 WARN_ON(!mlxsw_sp_mr_table_empty(mr_table)); in mlxsw_sp_mr_table_destroy()
962 list_del(&mr_table->node); in mlxsw_sp_mr_table_destroy()
965 &mr_table->catchall_route_priv); in mlxsw_sp_mr_table_destroy()
966 rhashtable_destroy(&mr_table->route_ht); in mlxsw_sp_mr_table_destroy()
967 mutex_destroy(&mr_table->route_list_lock); in mlxsw_sp_mr_table_destroy()
968 kfree(mr_table); in mlxsw_sp_mr_table_destroy()
971 void mlxsw_sp_mr_table_flush(struct mlxsw_sp_mr_table *mr_table) in mlxsw_sp_mr_table_flush() argument
976 mutex_lock(&mr_table->route_list_lock); in mlxsw_sp_mr_table_flush()
977 list_for_each_entry_safe(mr_route, tmp, &mr_table->route_list, node) in mlxsw_sp_mr_table_flush()
978 __mlxsw_sp_mr_route_del(mr_table, mr_route); in mlxsw_sp_mr_table_flush()
979 mutex_unlock(&mr_table->route_list_lock); in mlxsw_sp_mr_table_flush()
982 mr_table->vifs[i].dev = NULL; in mlxsw_sp_mr_table_flush()
983 mr_table->vifs[i].rif = NULL; in mlxsw_sp_mr_table_flush()
987 bool mlxsw_sp_mr_table_empty(const struct mlxsw_sp_mr_table *mr_table) in mlxsw_sp_mr_table_empty() argument
992 if (mr_table->vifs[i].dev) in mlxsw_sp_mr_table_empty()
994 return list_empty(&mr_table->route_list); in mlxsw_sp_mr_table_empty()
1019 struct mlxsw_sp_mr_table *mr_table; in mlxsw_sp_mr_stats_update() local
1024 list_for_each_entry(mr_table, &mr->table_list, node) { in mlxsw_sp_mr_stats_update()
1025 mutex_lock(&mr_table->route_list_lock); in mlxsw_sp_mr_stats_update()
1026 list_for_each_entry(mr_route, &mr_table->route_list, node) in mlxsw_sp_mr_stats_update()
1027 mlxsw_sp_mr_route_stats_update(mr_table->mlxsw_sp, in mlxsw_sp_mr_stats_update()
1029 mutex_unlock(&mr_table->route_list_lock); in mlxsw_sp_mr_stats_update()