Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
0002 /* Copyright (c) 2017-2018 Mellanox Technologies. All rights reserved */
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         /* One tree for each protocol: IPv4 and IPv6 */
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; /* ms */
0039         atomic_t neigh_count;
0040     } neighs_update;
0041     struct delayed_work nexthop_probe_dw;
0042 #define MLXSW_SP_UNRESOLVED_NH_PROBE_INTERVAL 5000 /* ms */
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; /* Protects shared router resources */
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; /* Underlay. */
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 /* _MLXSW_ROUTER_H_*/