mlxsw: spectrum_router: Extract __mlxsw_sp_ipip_entry_update_tunnel()
The work that's done by mlxsw_sp_netdevice_ipip_ol_vrf_event() is a good basis for a more versatile function that would take care of all sorts of tunnel updates requests: __mlxsw_sp_ipip_entry_update_tunnel(). Extract that function. Factor out a helper mlxsw_sp_ipip_entry_ol_lb_update() as well. Signed-off-by: Petr Machata <petrm@mellanox.com> Reviewed-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
7e75af6366
commit
65a6121b30
|
@ -1355,46 +1355,64 @@ static void mlxsw_sp_netdevice_ipip_ol_down_event(struct mlxsw_sp *mlxsw_sp,
|
||||||
mlxsw_sp_ipip_entry_ol_down_event(mlxsw_sp, ipip_entry);
|
mlxsw_sp_ipip_entry_ol_down_event(mlxsw_sp, ipip_entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mlxsw_sp_netdevice_ipip_ol_vrf_event(struct mlxsw_sp *mlxsw_sp,
|
static int
|
||||||
struct net_device *ol_dev,
|
mlxsw_sp_ipip_entry_ol_lb_update(struct mlxsw_sp *mlxsw_sp,
|
||||||
struct netlink_ext_ack *extack)
|
struct mlxsw_sp_ipip_entry *ipip_entry,
|
||||||
|
struct netlink_ext_ack *extack)
|
||||||
{
|
{
|
||||||
struct mlxsw_sp_fib_entry *decap_fib_entry;
|
struct mlxsw_sp_rif_ipip_lb *old_lb_rif = ipip_entry->ol_lb;
|
||||||
struct mlxsw_sp_ipip_entry *ipip_entry;
|
struct mlxsw_sp_rif_ipip_lb *new_lb_rif;
|
||||||
struct mlxsw_sp_rif_ipip_lb *lb_rif;
|
|
||||||
|
|
||||||
ipip_entry = mlxsw_sp_ipip_entry_find_by_ol_dev(mlxsw_sp, ol_dev);
|
new_lb_rif = mlxsw_sp_ipip_ol_ipip_lb_create(mlxsw_sp,
|
||||||
if (!ipip_entry)
|
ipip_entry->ipipt,
|
||||||
return 0;
|
ipip_entry->ol_dev,
|
||||||
|
extack);
|
||||||
|
if (IS_ERR(new_lb_rif))
|
||||||
|
return PTR_ERR(new_lb_rif);
|
||||||
|
ipip_entry->ol_lb = new_lb_rif;
|
||||||
|
mlxsw_sp_rif_destroy(&old_lb_rif->common);
|
||||||
|
|
||||||
/* When a tunneling device is moved to a different VRF, we need to
|
return 0;
|
||||||
* update the backing loopback. Since RIFs can't be edited, we need to
|
}
|
||||||
* destroy and recreate it. That might create a window of opportunity
|
|
||||||
* where RALUE and RATR registers end up referencing a RIF that's
|
int __mlxsw_sp_ipip_entry_update_tunnel(struct mlxsw_sp *mlxsw_sp,
|
||||||
* already gone. RATRs are handled by the RIF destroy, and to take care
|
struct mlxsw_sp_ipip_entry *ipip_entry,
|
||||||
|
struct netlink_ext_ack *extack)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
|
/* RIFs can't be edited, so to update loopback, we need to destroy and
|
||||||
|
* recreate it. That creates a window of opportunity where RALUE and
|
||||||
|
* RATR registers end up referencing a RIF that's already gone. RATRs
|
||||||
|
* are handled in mlxsw_sp_ipip_entry_ol_lb_update(), and to take care
|
||||||
* of RALUE, demote the decap route back.
|
* of RALUE, demote the decap route back.
|
||||||
*/
|
*/
|
||||||
if (ipip_entry->decap_fib_entry)
|
if (ipip_entry->decap_fib_entry)
|
||||||
mlxsw_sp_ipip_entry_demote_decap(mlxsw_sp, ipip_entry);
|
mlxsw_sp_ipip_entry_demote_decap(mlxsw_sp, ipip_entry);
|
||||||
|
|
||||||
lb_rif = mlxsw_sp_ipip_ol_ipip_lb_create(mlxsw_sp, ipip_entry->ipipt,
|
err = mlxsw_sp_ipip_entry_ol_lb_update(mlxsw_sp, ipip_entry, extack);
|
||||||
ol_dev, extack);
|
if (err)
|
||||||
if (IS_ERR(lb_rif))
|
return err;
|
||||||
return PTR_ERR(lb_rif);
|
|
||||||
mlxsw_sp_rif_destroy(&ipip_entry->ol_lb->common);
|
|
||||||
ipip_entry->ol_lb = lb_rif;
|
|
||||||
|
|
||||||
if (ol_dev->flags & IFF_UP) {
|
if (ipip_entry->ol_dev->flags & IFF_UP)
|
||||||
decap_fib_entry = mlxsw_sp_ipip_entry_find_decap(mlxsw_sp,
|
mlxsw_sp_ipip_entry_ol_up_event(mlxsw_sp, ipip_entry);
|
||||||
ipip_entry);
|
|
||||||
if (decap_fib_entry)
|
|
||||||
mlxsw_sp_ipip_entry_promote_decap(mlxsw_sp, ipip_entry,
|
|
||||||
decap_fib_entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int mlxsw_sp_netdevice_ipip_ol_vrf_event(struct mlxsw_sp *mlxsw_sp,
|
||||||
|
struct net_device *ol_dev,
|
||||||
|
struct netlink_ext_ack *extack)
|
||||||
|
{
|
||||||
|
struct mlxsw_sp_ipip_entry *ipip_entry =
|
||||||
|
mlxsw_sp_ipip_entry_find_by_ol_dev(mlxsw_sp, ol_dev);
|
||||||
|
|
||||||
|
if (!ipip_entry)
|
||||||
|
return 0;
|
||||||
|
return __mlxsw_sp_ipip_entry_update_tunnel(mlxsw_sp, ipip_entry,
|
||||||
|
extack);
|
||||||
|
}
|
||||||
|
|
||||||
int mlxsw_sp_netdevice_ipip_ol_event(struct mlxsw_sp *mlxsw_sp,
|
int mlxsw_sp_netdevice_ipip_ol_event(struct mlxsw_sp *mlxsw_sp,
|
||||||
struct net_device *ol_dev,
|
struct net_device *ol_dev,
|
||||||
unsigned long event,
|
unsigned long event,
|
||||||
|
|
Loading…
Reference in New Issue