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 | |