mlxsw: spectrum_router: Pass payload pointer to nexthop update function
Have the caller pass a pointer to the payload of the RATR register to the function updating a single nexthop / adjacency entry. In a subsequent patch, this will allow the caller to make sure replacement was successful by querying the state of the adjacency entry after replacement and comparing with the initial request. Signed-off-by: Ido Schimmel <idosch@nvidia.com> Reviewed-by: Petr Machata <petrm@nvidia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
62b67ff33b
commit
197fdfd107
@ -1178,6 +1178,7 @@ out:
|
||||
|
||||
static int mlxsw_sp_dpipe_table_adj_counters_update(void *priv, bool enable)
|
||||
{
|
||||
char ratr_pl[MLXSW_REG_RATR_LEN];
|
||||
struct mlxsw_sp *mlxsw_sp = priv;
|
||||
struct mlxsw_sp_nexthop *nh;
|
||||
u32 adj_hash_index = 0;
|
||||
@ -1197,7 +1198,7 @@ static int mlxsw_sp_dpipe_table_adj_counters_update(void *priv, bool enable)
|
||||
mlxsw_sp_nexthop_counter_free(mlxsw_sp, nh);
|
||||
mlxsw_sp_nexthop_eth_update(mlxsw_sp,
|
||||
adj_index + adj_hash_index, nh,
|
||||
true);
|
||||
true, ratr_pl);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -128,11 +128,10 @@ bool mlxsw_sp_l3addr_is_zero(union mlxsw_sp_l3addr addr)
|
||||
static int
|
||||
mlxsw_sp_ipip_nexthop_update_gre4(struct mlxsw_sp *mlxsw_sp, u32 adj_index,
|
||||
struct mlxsw_sp_ipip_entry *ipip_entry,
|
||||
bool force)
|
||||
bool force, char *ratr_pl)
|
||||
{
|
||||
u16 rif_index = mlxsw_sp_ipip_lb_rif_index(ipip_entry->ol_lb);
|
||||
__be32 daddr4 = mlxsw_sp_ipip_netdev_daddr4(ipip_entry->ol_dev);
|
||||
char ratr_pl[MLXSW_REG_RATR_LEN];
|
||||
enum mlxsw_reg_ratr_op op;
|
||||
|
||||
op = force ? MLXSW_REG_RATR_OP_WRITE_WRITE_ENTRY :
|
||||
|
@ -41,7 +41,7 @@ struct mlxsw_sp_ipip_ops {
|
||||
|
||||
int (*nexthop_update)(struct mlxsw_sp *mlxsw_sp, u32 adj_index,
|
||||
struct mlxsw_sp_ipip_entry *ipip_entry,
|
||||
bool force);
|
||||
bool force, char *ratr_pl);
|
||||
|
||||
bool (*can_offload)(const struct mlxsw_sp *mlxsw_sp,
|
||||
const struct net_device *ol_dev);
|
||||
|
@ -3420,10 +3420,9 @@ err_mass_update_vr:
|
||||
static int __mlxsw_sp_nexthop_eth_update(struct mlxsw_sp *mlxsw_sp,
|
||||
u32 adj_index,
|
||||
struct mlxsw_sp_nexthop *nh,
|
||||
bool force)
|
||||
bool force, char *ratr_pl)
|
||||
{
|
||||
struct mlxsw_sp_neigh_entry *neigh_entry = nh->neigh_entry;
|
||||
char ratr_pl[MLXSW_REG_RATR_LEN];
|
||||
enum mlxsw_reg_ratr_op op;
|
||||
u16 rif_index;
|
||||
|
||||
@ -3459,7 +3458,8 @@ static int __mlxsw_sp_nexthop_eth_update(struct mlxsw_sp *mlxsw_sp,
|
||||
}
|
||||
|
||||
int mlxsw_sp_nexthop_eth_update(struct mlxsw_sp *mlxsw_sp, u32 adj_index,
|
||||
struct mlxsw_sp_nexthop *nh, bool force)
|
||||
struct mlxsw_sp_nexthop *nh, bool force,
|
||||
char *ratr_pl)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -3467,7 +3467,7 @@ int mlxsw_sp_nexthop_eth_update(struct mlxsw_sp *mlxsw_sp, u32 adj_index,
|
||||
int err;
|
||||
|
||||
err = __mlxsw_sp_nexthop_eth_update(mlxsw_sp, adj_index + i,
|
||||
nh, force);
|
||||
nh, force, ratr_pl);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
@ -3478,18 +3478,19 @@ int mlxsw_sp_nexthop_eth_update(struct mlxsw_sp *mlxsw_sp, u32 adj_index,
|
||||
static int __mlxsw_sp_nexthop_ipip_update(struct mlxsw_sp *mlxsw_sp,
|
||||
u32 adj_index,
|
||||
struct mlxsw_sp_nexthop *nh,
|
||||
bool force)
|
||||
bool force, char *ratr_pl)
|
||||
{
|
||||
const struct mlxsw_sp_ipip_ops *ipip_ops;
|
||||
|
||||
ipip_ops = mlxsw_sp->router->ipip_ops_arr[nh->ipip_entry->ipipt];
|
||||
return ipip_ops->nexthop_update(mlxsw_sp, adj_index, nh->ipip_entry,
|
||||
force);
|
||||
force, ratr_pl);
|
||||
}
|
||||
|
||||
static int mlxsw_sp_nexthop_ipip_update(struct mlxsw_sp *mlxsw_sp,
|
||||
u32 adj_index,
|
||||
struct mlxsw_sp_nexthop *nh, bool force)
|
||||
struct mlxsw_sp_nexthop *nh, bool force,
|
||||
char *ratr_pl)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -3497,7 +3498,7 @@ static int mlxsw_sp_nexthop_ipip_update(struct mlxsw_sp *mlxsw_sp,
|
||||
int err;
|
||||
|
||||
err = __mlxsw_sp_nexthop_ipip_update(mlxsw_sp, adj_index + i,
|
||||
nh, force);
|
||||
nh, force, ratr_pl);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
@ -3506,7 +3507,8 @@ static int mlxsw_sp_nexthop_ipip_update(struct mlxsw_sp *mlxsw_sp,
|
||||
}
|
||||
|
||||
static int mlxsw_sp_nexthop_update(struct mlxsw_sp *mlxsw_sp, u32 adj_index,
|
||||
struct mlxsw_sp_nexthop *nh, bool force)
|
||||
struct mlxsw_sp_nexthop *nh, bool force,
|
||||
char *ratr_pl)
|
||||
{
|
||||
/* When action is discard or trap, the nexthop must be
|
||||
* programmed as an Ethernet nexthop.
|
||||
@ -3515,10 +3517,10 @@ static int mlxsw_sp_nexthop_update(struct mlxsw_sp *mlxsw_sp, u32 adj_index,
|
||||
nh->action == MLXSW_SP_NEXTHOP_ACTION_DISCARD ||
|
||||
nh->action == MLXSW_SP_NEXTHOP_ACTION_TRAP)
|
||||
return mlxsw_sp_nexthop_eth_update(mlxsw_sp, adj_index, nh,
|
||||
force);
|
||||
force, ratr_pl);
|
||||
else
|
||||
return mlxsw_sp_nexthop_ipip_update(mlxsw_sp, adj_index, nh,
|
||||
force);
|
||||
force, ratr_pl);
|
||||
}
|
||||
|
||||
static int
|
||||
@ -3526,6 +3528,7 @@ mlxsw_sp_nexthop_group_update(struct mlxsw_sp *mlxsw_sp,
|
||||
struct mlxsw_sp_nexthop_group_info *nhgi,
|
||||
bool reallocate)
|
||||
{
|
||||
char ratr_pl[MLXSW_REG_RATR_LEN];
|
||||
u32 adj_index = nhgi->adj_index; /* base */
|
||||
struct mlxsw_sp_nexthop *nh;
|
||||
int i;
|
||||
@ -3542,7 +3545,7 @@ mlxsw_sp_nexthop_group_update(struct mlxsw_sp *mlxsw_sp,
|
||||
int err = 0;
|
||||
|
||||
err = mlxsw_sp_nexthop_update(mlxsw_sp, adj_index, nh,
|
||||
true);
|
||||
true, ratr_pl);
|
||||
if (err)
|
||||
return err;
|
||||
nh->update = 0;
|
||||
|
@ -209,7 +209,8 @@ bool mlxsw_sp_nexthop_group_has_ipip(struct mlxsw_sp_nexthop *nh);
|
||||
int mlxsw_sp_nexthop_counter_get(struct mlxsw_sp *mlxsw_sp,
|
||||
struct mlxsw_sp_nexthop *nh, u64 *p_counter);
|
||||
int mlxsw_sp_nexthop_eth_update(struct mlxsw_sp *mlxsw_sp, u32 adj_index,
|
||||
struct mlxsw_sp_nexthop *nh, bool force);
|
||||
struct mlxsw_sp_nexthop *nh, bool force,
|
||||
char *ratr_pl);
|
||||
void mlxsw_sp_nexthop_counter_alloc(struct mlxsw_sp *mlxsw_sp,
|
||||
struct mlxsw_sp_nexthop *nh);
|
||||
void mlxsw_sp_nexthop_counter_free(struct mlxsw_sp *mlxsw_sp,
|
||||
|
Loading…
Reference in New Issue
Block a user