Lines Matching refs:mr_table

53 	bool (*is_route_valid)(const struct mlxsw_sp_mr_table *mr_table,
55 void (*key_create)(struct mlxsw_sp_mr_table *mr_table,
58 bool (*is_route_starg)(const struct mlxsw_sp_mr_table *mr_table,
83 const struct mlxsw_sp_mr_table *mr_table; member
140 if (mr_route->mr_table->ops->is_route_starg(mr_route->mr_table, in mlxsw_sp_mr_route_action()
162 return mr_route->mr_table->ops->is_route_starg(mr_route->mr_table, in mlxsw_sp_mr_route_prio()
204 mlxsw_sp_mr_route_info_create(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route_info_create() argument
245 static int mlxsw_sp_mr_route_write(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route_write() argument
249 struct mlxsw_sp *mlxsw_sp = mr_table->mlxsw_sp; in mlxsw_sp_mr_route_write()
254 err = mlxsw_sp_mr_route_info_create(mr_table, mr_route, &route_info); in mlxsw_sp_mr_route_write()
285 static void mlxsw_sp_mr_route_erase(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route_erase() argument
288 struct mlxsw_sp *mlxsw_sp = mr_table->mlxsw_sp; in mlxsw_sp_mr_route_erase()
296 mlxsw_sp_mr_route_create(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route_create() argument
314 mr_table->ops->key_create(mr_table, &mr_route->key, mr_route->mfc); in mlxsw_sp_mr_route_create()
316 mr_route->mr_table = mr_table; in mlxsw_sp_mr_route_create()
320 &mr_table->vifs[i]); in mlxsw_sp_mr_route_create()
323 if (mr_table->vifs[i].dev && in mlxsw_sp_mr_route_create()
324 mr_table->vifs[i].dev->mtu < mr_route->min_mtu) in mlxsw_sp_mr_route_create()
325 mr_route->min_mtu = mr_table->vifs[i].dev->mtu; in mlxsw_sp_mr_route_create()
329 &mr_table->vifs[mfc->mfc_parent]); in mlxsw_sp_mr_route_create()
341 static void mlxsw_sp_mr_route_destroy(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route_destroy() argument
370 static void __mlxsw_sp_mr_route_del(struct mlxsw_sp_mr_table *mr_table, in __mlxsw_sp_mr_route_del() argument
374 mlxsw_sp_mr_route_erase(mr_table, mr_route); in __mlxsw_sp_mr_route_del()
375 rhashtable_remove_fast(&mr_table->route_ht, &mr_route->ht_node, in __mlxsw_sp_mr_route_del()
378 mlxsw_sp_mr_route_destroy(mr_table, mr_route); in __mlxsw_sp_mr_route_del()
381 int mlxsw_sp_mr_route_add(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route_add() argument
388 if (!mr_table->ops->is_route_valid(mr_table, mfc)) in mlxsw_sp_mr_route_add()
392 mr_route = mlxsw_sp_mr_route_create(mr_table, mfc); in mlxsw_sp_mr_route_add()
397 mr_orig_route = rhashtable_lookup_fast(&mr_table->route_ht, in mlxsw_sp_mr_route_add()
412 dev_warn(mr_table->mlxsw_sp->bus_info->dev, in mlxsw_sp_mr_route_add()
419 list_add_tail(&mr_route->node, &mr_table->route_list); in mlxsw_sp_mr_route_add()
420 err = rhashtable_insert_fast(&mr_table->route_ht, in mlxsw_sp_mr_route_add()
427 err = mlxsw_sp_mr_route_write(mr_table, mr_route, replace); in mlxsw_sp_mr_route_add()
433 rhashtable_remove_fast(&mr_table->route_ht, in mlxsw_sp_mr_route_add()
437 mlxsw_sp_mr_route_destroy(mr_table, mr_orig_route); in mlxsw_sp_mr_route_add()
444 rhashtable_remove_fast(&mr_table->route_ht, &mr_route->ht_node, in mlxsw_sp_mr_route_add()
450 mlxsw_sp_mr_route_destroy(mr_table, mr_route); in mlxsw_sp_mr_route_add()
454 void mlxsw_sp_mr_route_del(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route_del() argument
460 mr_table->ops->key_create(mr_table, &key, mfc); in mlxsw_sp_mr_route_del()
461 mr_route = rhashtable_lookup_fast(&mr_table->route_ht, &key, in mlxsw_sp_mr_route_del()
464 __mlxsw_sp_mr_route_del(mr_table, mr_route); in mlxsw_sp_mr_route_del()
469 mlxsw_sp_mr_route_ivif_resolve(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route_ivif_resolve() argument
472 struct mlxsw_sp *mlxsw_sp = mr_table->mlxsw_sp; in mlxsw_sp_mr_route_ivif_resolve()
504 mlxsw_sp_mr_route_ivif_unresolve(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route_ivif_unresolve() argument
507 struct mlxsw_sp *mlxsw_sp = mr_table->mlxsw_sp; in mlxsw_sp_mr_route_ivif_unresolve()
518 mlxsw_sp_mr_route_evif_resolve(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route_evif_resolve() argument
521 struct mlxsw_sp *mlxsw_sp = mr_table->mlxsw_sp; in mlxsw_sp_mr_route_evif_resolve()
577 mlxsw_sp_mr_route_evif_unresolve(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route_evif_unresolve() argument
580 struct mlxsw_sp *mlxsw_sp = mr_table->mlxsw_sp; in mlxsw_sp_mr_route_evif_unresolve()
610 static int mlxsw_sp_mr_vif_resolve(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_vif_resolve() argument
626 err = mlxsw_sp_mr_route_ivif_resolve(mr_table, irve); in mlxsw_sp_mr_vif_resolve()
633 err = mlxsw_sp_mr_route_evif_resolve(mr_table, erve); in mlxsw_sp_mr_vif_resolve()
642 mlxsw_sp_mr_route_evif_unresolve(mr_table, erve); in mlxsw_sp_mr_vif_resolve()
646 mlxsw_sp_mr_route_ivif_unresolve(mr_table, irve); in mlxsw_sp_mr_vif_resolve()
651 static void mlxsw_sp_mr_vif_unresolve(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_vif_unresolve() argument
659 mlxsw_sp_mr_route_evif_unresolve(mr_table, rve); in mlxsw_sp_mr_vif_unresolve()
663 mlxsw_sp_mr_route_ivif_unresolve(mr_table, rve); in mlxsw_sp_mr_vif_unresolve()
670 int mlxsw_sp_mr_vif_add(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_vif_add() argument
674 struct mlxsw_sp_mr_vif *mr_vif = &mr_table->vifs[vif_index]; in mlxsw_sp_mr_vif_add()
680 return mlxsw_sp_mr_vif_resolve(mr_table, dev, mr_vif, vif_flags, rif); in mlxsw_sp_mr_vif_add()
683 void mlxsw_sp_mr_vif_del(struct mlxsw_sp_mr_table *mr_table, vifi_t vif_index) in mlxsw_sp_mr_vif_del() argument
685 struct mlxsw_sp_mr_vif *mr_vif = &mr_table->vifs[vif_index]; in mlxsw_sp_mr_vif_del()
691 mlxsw_sp_mr_vif_unresolve(mr_table, NULL, mr_vif); in mlxsw_sp_mr_vif_del()
695 mlxsw_sp_mr_dev_vif_lookup(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_dev_vif_lookup() argument
701 if (mr_table->vifs[vif_index].dev == dev) in mlxsw_sp_mr_dev_vif_lookup()
702 return &mr_table->vifs[vif_index]; in mlxsw_sp_mr_dev_vif_lookup()
706 int mlxsw_sp_mr_rif_add(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_rif_add() argument
715 mr_vif = mlxsw_sp_mr_dev_vif_lookup(mr_table, rif_dev); in mlxsw_sp_mr_rif_add()
718 return mlxsw_sp_mr_vif_resolve(mr_table, mr_vif->dev, mr_vif, in mlxsw_sp_mr_rif_add()
722 void mlxsw_sp_mr_rif_del(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_rif_del() argument
731 mr_vif = mlxsw_sp_mr_dev_vif_lookup(mr_table, rif_dev); in mlxsw_sp_mr_rif_del()
734 mlxsw_sp_mr_vif_unresolve(mr_table, mr_vif->dev, mr_vif); in mlxsw_sp_mr_rif_del()
737 void mlxsw_sp_mr_rif_mtu_update(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_rif_mtu_update() argument
741 struct mlxsw_sp *mlxsw_sp = mr_table->mlxsw_sp; in mlxsw_sp_mr_rif_mtu_update()
750 mr_vif = mlxsw_sp_mr_dev_vif_lookup(mr_table, rif_dev); in mlxsw_sp_mr_rif_mtu_update()
767 mlxsw_sp_mr_route4_validate(const struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route4_validate() argument
777 dev_warn(mr_table->mlxsw_sp->bus_info->dev, in mlxsw_sp_mr_route4_validate()
784 static void mlxsw_sp_mr_route4_key(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route4_key() argument
794 key->vrid = mr_table->vr_id; in mlxsw_sp_mr_route4_key()
802 static bool mlxsw_sp_mr_route4_starg(const struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route4_starg() argument
814 mlxsw_sp_mr_route6_validate(const struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route6_validate() argument
824 dev_warn(mr_table->mlxsw_sp->bus_info->dev, in mlxsw_sp_mr_route6_validate()
831 static void mlxsw_sp_mr_route6_key(struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route6_key() argument
838 key->vrid = mr_table->vr_id; in mlxsw_sp_mr_route6_key()
848 static bool mlxsw_sp_mr_route6_starg(const struct mlxsw_sp_mr_table *mr_table, in mlxsw_sp_mr_route6_starg() argument
899 struct mlxsw_sp_mr_table *mr_table; in mlxsw_sp_mr_table_create() local
903 mr_table = kzalloc(sizeof(*mr_table) + mr->mr_ops->route_priv_size, in mlxsw_sp_mr_table_create()
905 if (!mr_table) in mlxsw_sp_mr_table_create()
908 mr_table->vr_id = vr_id; in mlxsw_sp_mr_table_create()
909 mr_table->mlxsw_sp = mlxsw_sp; in mlxsw_sp_mr_table_create()
910 mr_table->proto = proto; in mlxsw_sp_mr_table_create()
911 mr_table->ops = &mlxsw_sp_mr_table_ops_arr[proto]; in mlxsw_sp_mr_table_create()
912 INIT_LIST_HEAD(&mr_table->route_list); in mlxsw_sp_mr_table_create()
914 err = rhashtable_init(&mr_table->route_ht, in mlxsw_sp_mr_table_create()
920 INIT_LIST_HEAD(&mr_table->vifs[i].route_evif_list); in mlxsw_sp_mr_table_create()
921 INIT_LIST_HEAD(&mr_table->vifs[i].route_ivif_list); in mlxsw_sp_mr_table_create()
922 mr_table->vifs[i].ops = &mlxsw_sp_mr_vif_ops_arr[proto]; in mlxsw_sp_mr_table_create()
926 mr_table->catchall_route_priv, in mlxsw_sp_mr_table_create()
930 list_add_tail(&mr_table->node, &mr->table_list); in mlxsw_sp_mr_table_create()
931 return mr_table; in mlxsw_sp_mr_table_create()
934 rhashtable_destroy(&mr_table->route_ht); in mlxsw_sp_mr_table_create()
936 kfree(mr_table); in mlxsw_sp_mr_table_create()
940 void mlxsw_sp_mr_table_destroy(struct mlxsw_sp_mr_table *mr_table) in mlxsw_sp_mr_table_destroy() argument
942 struct mlxsw_sp *mlxsw_sp = mr_table->mlxsw_sp; in mlxsw_sp_mr_table_destroy()
945 WARN_ON(!mlxsw_sp_mr_table_empty(mr_table)); in mlxsw_sp_mr_table_destroy()
946 list_del(&mr_table->node); in mlxsw_sp_mr_table_destroy()
948 &mr_table->catchall_route_priv); in mlxsw_sp_mr_table_destroy()
949 rhashtable_destroy(&mr_table->route_ht); in mlxsw_sp_mr_table_destroy()
950 kfree(mr_table); in mlxsw_sp_mr_table_destroy()
953 void mlxsw_sp_mr_table_flush(struct mlxsw_sp_mr_table *mr_table) in mlxsw_sp_mr_table_flush() argument
958 list_for_each_entry_safe(mr_route, tmp, &mr_table->route_list, node) in mlxsw_sp_mr_table_flush()
959 __mlxsw_sp_mr_route_del(mr_table, mr_route); in mlxsw_sp_mr_table_flush()
962 mr_table->vifs[i].dev = NULL; in mlxsw_sp_mr_table_flush()
963 mr_table->vifs[i].rif = NULL; in mlxsw_sp_mr_table_flush()
967 bool mlxsw_sp_mr_table_empty(const struct mlxsw_sp_mr_table *mr_table) in mlxsw_sp_mr_table_empty() argument
972 if (mr_table->vifs[i].dev) in mlxsw_sp_mr_table_empty()
974 return list_empty(&mr_table->route_list); in mlxsw_sp_mr_table_empty()
999 struct mlxsw_sp_mr_table *mr_table; in mlxsw_sp_mr_stats_update() local
1004 list_for_each_entry(mr_table, &mr->table_list, node) in mlxsw_sp_mr_stats_update()
1005 list_for_each_entry(mr_route, &mr_table->route_list, node) in mlxsw_sp_mr_stats_update()
1006 mlxsw_sp_mr_route_stats_update(mr_table->mlxsw_sp, in mlxsw_sp_mr_stats_update()