|
@@ -42,6 +42,7 @@
|
|
|
#include <linux/notifier.h>
|
|
|
#include <linux/inetdevice.h>
|
|
|
#include <linux/netdevice.h>
|
|
|
+#include <linux/if_bridge.h>
|
|
|
#include <net/netevent.h>
|
|
|
#include <net/neighbour.h>
|
|
|
#include <net/arp.h>
|
|
@@ -3109,7 +3110,9 @@ static int mlxsw_sp_vport_rif_sp_join(struct mlxsw_sp_port *mlxsw_sp_vport,
|
|
|
struct net_device *l3_dev)
|
|
|
{
|
|
|
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_vport->mlxsw_sp;
|
|
|
+ u16 vid = mlxsw_sp_vport_vid_get(mlxsw_sp_vport);
|
|
|
struct mlxsw_sp_rif *rif;
|
|
|
+ int err;
|
|
|
|
|
|
rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp, l3_dev);
|
|
|
if (!rif) {
|
|
@@ -3118,20 +3121,39 @@ static int mlxsw_sp_vport_rif_sp_join(struct mlxsw_sp_port *mlxsw_sp_vport,
|
|
|
return PTR_ERR(rif);
|
|
|
}
|
|
|
|
|
|
+ err = mlxsw_sp_port_vid_learning_set(mlxsw_sp_vport, vid, false);
|
|
|
+ if (err)
|
|
|
+ goto err_port_vid_learning_set;
|
|
|
+
|
|
|
+ err = mlxsw_sp_port_vid_stp_set(mlxsw_sp_vport, vid,
|
|
|
+ BR_STATE_FORWARDING);
|
|
|
+ if (err)
|
|
|
+ goto err_port_vid_stp_set;
|
|
|
+
|
|
|
mlxsw_sp_vport_fid_set(mlxsw_sp_vport, rif->f);
|
|
|
rif->f->ref_count++;
|
|
|
|
|
|
netdev_dbg(mlxsw_sp_vport->dev, "Joined FID=%d\n", rif->f->fid);
|
|
|
|
|
|
return 0;
|
|
|
+
|
|
|
+err_port_vid_stp_set:
|
|
|
+ mlxsw_sp_port_vid_learning_set(mlxsw_sp_vport, vid, true);
|
|
|
+err_port_vid_learning_set:
|
|
|
+ if (rif->f->ref_count == 0)
|
|
|
+ mlxsw_sp_vport_rif_sp_destroy(mlxsw_sp_vport, rif);
|
|
|
+ return err;
|
|
|
}
|
|
|
|
|
|
static void mlxsw_sp_vport_rif_sp_leave(struct mlxsw_sp_port *mlxsw_sp_vport)
|
|
|
{
|
|
|
struct mlxsw_sp_fid *f = mlxsw_sp_vport_fid_get(mlxsw_sp_vport);
|
|
|
+ u16 vid = mlxsw_sp_vport_vid_get(mlxsw_sp_vport);
|
|
|
|
|
|
netdev_dbg(mlxsw_sp_vport->dev, "Left FID=%d\n", f->fid);
|
|
|
|
|
|
+ mlxsw_sp_port_vid_stp_set(mlxsw_sp_vport, vid, BR_STATE_BLOCKING);
|
|
|
+ mlxsw_sp_port_vid_learning_set(mlxsw_sp_vport, vid, true);
|
|
|
mlxsw_sp_vport_fid_set(mlxsw_sp_vport, NULL);
|
|
|
if (--f->ref_count == 0)
|
|
|
mlxsw_sp_vport_rif_sp_destroy(mlxsw_sp_vport, f->rif);
|