1 /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */ 2 /* Copyright (c) 2017-2018 Mellanox Technologies. All rights reserved */ 3 4 #ifndef _MLXSW_SPECTRUM_MCROUTER_H 5 #define _MLXSW_SPECTRUM_MCROUTER_H 6 7 #include <linux/mroute.h> 8 #include <linux/mroute6.h> 9 #include "spectrum_router.h" 10 #include "spectrum.h" 11 12 enum mlxsw_sp_mr_route_action { 13 MLXSW_SP_MR_ROUTE_ACTION_FORWARD, 14 MLXSW_SP_MR_ROUTE_ACTION_TRAP, 15 MLXSW_SP_MR_ROUTE_ACTION_TRAP_AND_FORWARD, 16 }; 17 18 struct mlxsw_sp_mr_route_key { 19 int vrid; 20 enum mlxsw_sp_l3proto proto; 21 union mlxsw_sp_l3addr group; 22 union mlxsw_sp_l3addr group_mask; 23 union mlxsw_sp_l3addr source; 24 union mlxsw_sp_l3addr source_mask; 25 }; 26 27 struct mlxsw_sp_mr_route_info { 28 enum mlxsw_sp_mr_route_action route_action; 29 u16 irif_index; 30 u16 *erif_indices; 31 size_t erif_num; 32 u16 min_mtu; 33 }; 34 35 struct mlxsw_sp_mr_route_params { 36 struct mlxsw_sp_mr_route_key key; 37 struct mlxsw_sp_mr_route_info value; 38 enum mlxsw_sp_mr_route_prio prio; 39 }; 40 41 struct mlxsw_sp_mr_ops { 42 int priv_size; 43 int route_priv_size; 44 int (*init)(struct mlxsw_sp *mlxsw_sp, void *priv); 45 int (*route_create)(struct mlxsw_sp *mlxsw_sp, void *priv, 46 void *route_priv, 47 struct mlxsw_sp_mr_route_params *route_params); 48 int (*route_update)(struct mlxsw_sp *mlxsw_sp, void *route_priv, 49 struct mlxsw_sp_mr_route_info *route_info); 50 int (*route_stats)(struct mlxsw_sp *mlxsw_sp, void *route_priv, 51 u64 *packets, u64 *bytes); 52 int (*route_action_update)(struct mlxsw_sp *mlxsw_sp, void *route_priv, 53 enum mlxsw_sp_mr_route_action route_action); 54 int (*route_min_mtu_update)(struct mlxsw_sp *mlxsw_sp, void *route_priv, 55 u16 min_mtu); 56 int (*route_irif_update)(struct mlxsw_sp *mlxsw_sp, void *route_priv, 57 u16 irif_index); 58 int (*route_erif_add)(struct mlxsw_sp *mlxsw_sp, void *route_priv, 59 u16 erif_index); 60 int (*route_erif_del)(struct mlxsw_sp *mlxsw_sp, void *route_priv, 61 u16 erif_index); 62 void (*route_destroy)(struct mlxsw_sp *mlxsw_sp, void *priv, 63 void *route_priv); 64 void (*fini)(struct mlxsw_sp *mlxsw_sp, void *priv); 65 }; 66 67 struct mlxsw_sp_mr; 68 struct mlxsw_sp_mr_table; 69 70 int mlxsw_sp_mr_init(struct mlxsw_sp *mlxsw_sp, 71 const struct mlxsw_sp_mr_ops *mr_ops); 72 void mlxsw_sp_mr_fini(struct mlxsw_sp *mlxsw_sp); 73 int mlxsw_sp_mr_route_add(struct mlxsw_sp_mr_table *mr_table, 74 struct mr_mfc *mfc, bool replace); 75 void mlxsw_sp_mr_route_del(struct mlxsw_sp_mr_table *mr_table, 76 struct mr_mfc *mfc); 77 int mlxsw_sp_mr_vif_add(struct mlxsw_sp_mr_table *mr_table, 78 struct net_device *dev, vifi_t vif_index, 79 unsigned long vif_flags, 80 const struct mlxsw_sp_rif *rif); 81 void mlxsw_sp_mr_vif_del(struct mlxsw_sp_mr_table *mr_table, vifi_t vif_index); 82 int mlxsw_sp_mr_rif_add(struct mlxsw_sp_mr_table *mr_table, 83 const struct mlxsw_sp_rif *rif); 84 void mlxsw_sp_mr_rif_del(struct mlxsw_sp_mr_table *mr_table, 85 const struct mlxsw_sp_rif *rif); 86 void mlxsw_sp_mr_rif_mtu_update(struct mlxsw_sp_mr_table *mr_table, 87 const struct mlxsw_sp_rif *rif, int mtu); 88 struct mlxsw_sp_mr_table *mlxsw_sp_mr_table_create(struct mlxsw_sp *mlxsw_sp, 89 u32 tb_id, 90 enum mlxsw_sp_l3proto proto); 91 void mlxsw_sp_mr_table_destroy(struct mlxsw_sp_mr_table *mr_table); 92 void mlxsw_sp_mr_table_flush(struct mlxsw_sp_mr_table *mr_table); 93 bool mlxsw_sp_mr_table_empty(const struct mlxsw_sp_mr_table *mr_table); 94 95 #endif 96