0001
0002
0003
0004 #ifndef _MLXSW_ROUTER_H_
0005 #define _MLXSW_ROUTER_H_
0006
0007 #include "spectrum.h"
0008 #include "reg.h"
0009
0010 struct mlxsw_sp_router_nve_decap {
0011 u32 ul_tb_id;
0012 u32 tunnel_index;
0013 enum mlxsw_sp_l3proto ul_proto;
0014 union mlxsw_sp_l3addr ul_sip;
0015 u8 valid:1;
0016 };
0017
0018 struct mlxsw_sp_router {
0019 struct mlxsw_sp *mlxsw_sp;
0020 struct mlxsw_sp_rif **rifs;
0021 struct idr rif_mac_profiles_idr;
0022 atomic_t rif_mac_profiles_count;
0023 atomic_t rifs_count;
0024 u8 max_rif_mac_profile;
0025 struct mlxsw_sp_vr *vrs;
0026 struct rhashtable neigh_ht;
0027 struct rhashtable nexthop_group_ht;
0028 struct rhashtable nexthop_ht;
0029 struct list_head nexthop_list;
0030 struct {
0031
0032 struct mlxsw_sp_lpm_tree *proto_trees[2];
0033 struct mlxsw_sp_lpm_tree *trees;
0034 unsigned int tree_count;
0035 } lpm;
0036 struct {
0037 struct delayed_work dw;
0038 unsigned long interval;
0039 atomic_t neigh_count;
0040 } neighs_update;
0041 struct delayed_work nexthop_probe_dw;
0042 #define MLXSW_SP_UNRESOLVED_NH_PROBE_INTERVAL 5000
0043 struct list_head nexthop_neighs_list;
0044 struct list_head ipip_list;
0045 struct notifier_block nexthop_nb;
0046 struct notifier_block fib_nb;
0047 struct notifier_block netevent_nb;
0048 struct notifier_block inetaddr_nb;
0049 struct notifier_block inet6addr_nb;
0050 struct notifier_block netdevice_nb;
0051 const struct mlxsw_sp_rif_ops **rif_ops_arr;
0052 const struct mlxsw_sp_ipip_ops **ipip_ops_arr;
0053 struct mlxsw_sp_router_nve_decap nve_decap_config;
0054 struct mutex lock;
0055 struct mlxsw_sp_fib_entry_op_ctx *ll_op_ctx;
0056 u16 lb_rif_index;
0057 const struct mlxsw_sp_adj_grp_size_range *adj_grp_size_ranges;
0058 size_t adj_grp_size_ranges_count;
0059 struct delayed_work nh_grp_activity_dw;
0060 struct list_head nh_res_grp_list;
0061 bool inc_parsing_depth;
0062 refcount_t num_groups;
0063 u32 adj_trap_index;
0064 };
0065
0066 struct mlxsw_sp_rif_ipip_lb;
0067 struct mlxsw_sp_rif_ipip_lb_config {
0068 enum mlxsw_reg_ritr_loopback_ipip_type lb_ipipt;
0069 u32 okey;
0070 enum mlxsw_sp_l3proto ul_protocol;
0071 union mlxsw_sp_l3addr saddr;
0072 };
0073
0074 enum mlxsw_sp_rif_counter_dir {
0075 MLXSW_SP_RIF_COUNTER_INGRESS,
0076 MLXSW_SP_RIF_COUNTER_EGRESS,
0077 };
0078
0079 struct mlxsw_sp_neigh_entry;
0080 struct mlxsw_sp_nexthop;
0081 struct mlxsw_sp_ipip_entry;
0082
0083 struct mlxsw_sp_rif *mlxsw_sp_rif_by_index(const struct mlxsw_sp *mlxsw_sp,
0084 u16 rif_index);
0085 u16 mlxsw_sp_ipip_lb_rif_index(const struct mlxsw_sp_rif_ipip_lb *rif);
0086 u16 mlxsw_sp_ipip_lb_ul_vr_id(const struct mlxsw_sp_rif_ipip_lb *rif);
0087 u16 mlxsw_sp_ipip_lb_ul_rif_id(const struct mlxsw_sp_rif_ipip_lb *lb_rif);
0088 u32 mlxsw_sp_ipip_dev_ul_tb_id(const struct net_device *ol_dev);
0089 int mlxsw_sp_rif_dev_ifindex(const struct mlxsw_sp_rif *rif);
0090 const struct net_device *mlxsw_sp_rif_dev(const struct mlxsw_sp_rif *rif);
0091 int mlxsw_sp_rif_counter_value_get(struct mlxsw_sp *mlxsw_sp,
0092 struct mlxsw_sp_rif *rif,
0093 enum mlxsw_sp_rif_counter_dir dir,
0094 u64 *cnt);
0095 void mlxsw_sp_rif_counter_free(struct mlxsw_sp_rif *rif,
0096 enum mlxsw_sp_rif_counter_dir dir);
0097 int mlxsw_sp_rif_counter_alloc(struct mlxsw_sp_rif *rif,
0098 enum mlxsw_sp_rif_counter_dir dir);
0099 struct mlxsw_sp_neigh_entry *
0100 mlxsw_sp_rif_neigh_next(struct mlxsw_sp_rif *rif,
0101 struct mlxsw_sp_neigh_entry *neigh_entry);
0102 int mlxsw_sp_neigh_entry_type(struct mlxsw_sp_neigh_entry *neigh_entry);
0103 unsigned char *
0104 mlxsw_sp_neigh_entry_ha(struct mlxsw_sp_neigh_entry *neigh_entry);
0105 u32 mlxsw_sp_neigh4_entry_dip(struct mlxsw_sp_neigh_entry *neigh_entry);
0106 struct in6_addr *
0107 mlxsw_sp_neigh6_entry_dip(struct mlxsw_sp_neigh_entry *neigh_entry);
0108
0109 #define mlxsw_sp_rif_neigh_for_each(neigh_entry, rif) \
0110 for (neigh_entry = mlxsw_sp_rif_neigh_next(rif, NULL); neigh_entry; \
0111 neigh_entry = mlxsw_sp_rif_neigh_next(rif, neigh_entry))
0112 int mlxsw_sp_neigh_counter_get(struct mlxsw_sp *mlxsw_sp,
0113 struct mlxsw_sp_neigh_entry *neigh_entry,
0114 u64 *p_counter);
0115 void
0116 mlxsw_sp_neigh_entry_counter_update(struct mlxsw_sp *mlxsw_sp,
0117 struct mlxsw_sp_neigh_entry *neigh_entry,
0118 bool adding);
0119 bool mlxsw_sp_neigh_ipv6_ignore(struct mlxsw_sp_neigh_entry *neigh_entry);
0120 int __mlxsw_sp_ipip_entry_update_tunnel(struct mlxsw_sp *mlxsw_sp,
0121 struct mlxsw_sp_ipip_entry *ipip_entry,
0122 bool recreate_loopback,
0123 bool keep_encap,
0124 bool update_nexthops,
0125 struct netlink_ext_ack *extack);
0126 void mlxsw_sp_ipip_entry_demote_tunnel(struct mlxsw_sp *mlxsw_sp,
0127 struct mlxsw_sp_ipip_entry *ipip_entry);
0128 bool
0129 mlxsw_sp_ipip_demote_tunnel_by_saddr(struct mlxsw_sp *mlxsw_sp,
0130 enum mlxsw_sp_l3proto ul_proto,
0131 union mlxsw_sp_l3addr saddr,
0132 u32 ul_tb_id,
0133 const struct mlxsw_sp_ipip_entry *except);
0134 struct mlxsw_sp_nexthop *mlxsw_sp_nexthop_next(struct mlxsw_sp_router *router,
0135 struct mlxsw_sp_nexthop *nh);
0136 bool mlxsw_sp_nexthop_is_forward(const struct mlxsw_sp_nexthop *nh);
0137 unsigned char *mlxsw_sp_nexthop_ha(struct mlxsw_sp_nexthop *nh);
0138 int mlxsw_sp_nexthop_indexes(struct mlxsw_sp_nexthop *nh, u32 *p_adj_index,
0139 u32 *p_adj_size, u32 *p_adj_hash_index);
0140 struct mlxsw_sp_rif *mlxsw_sp_nexthop_rif(struct mlxsw_sp_nexthop *nh);
0141 bool mlxsw_sp_nexthop_group_has_ipip(struct mlxsw_sp_nexthop *nh);
0142 #define mlxsw_sp_nexthop_for_each(nh, router) \
0143 for (nh = mlxsw_sp_nexthop_next(router, NULL); nh; \
0144 nh = mlxsw_sp_nexthop_next(router, nh))
0145 int mlxsw_sp_nexthop_counter_get(struct mlxsw_sp *mlxsw_sp,
0146 struct mlxsw_sp_nexthop *nh, u64 *p_counter);
0147 int mlxsw_sp_nexthop_eth_update(struct mlxsw_sp *mlxsw_sp, u32 adj_index,
0148 struct mlxsw_sp_nexthop *nh, bool force,
0149 char *ratr_pl);
0150 void mlxsw_sp_nexthop_counter_alloc(struct mlxsw_sp *mlxsw_sp,
0151 struct mlxsw_sp_nexthop *nh);
0152 void mlxsw_sp_nexthop_counter_free(struct mlxsw_sp *mlxsw_sp,
0153 struct mlxsw_sp_nexthop *nh);
0154
0155 static inline bool mlxsw_sp_l3addr_eq(const union mlxsw_sp_l3addr *addr1,
0156 const union mlxsw_sp_l3addr *addr2)
0157 {
0158 return !memcmp(addr1, addr2, sizeof(*addr1));
0159 }
0160
0161 int mlxsw_sp_ipip_ecn_encap_init(struct mlxsw_sp *mlxsw_sp);
0162 int mlxsw_sp_ipip_ecn_decap_init(struct mlxsw_sp *mlxsw_sp);
0163 struct net_device *
0164 mlxsw_sp_ipip_netdev_ul_dev_get(const struct net_device *ol_dev);
0165
0166 #endif