Commit 004f85ea authored by Ido Schimmel's avatar Ido Schimmel Committed by David S. Miller

mlxsw: spectrum: Don't report VLAN for 802.1D FDB entries

When dumping the hardware FDB we should report entries pointing to VLAN
devices with VLAN 0, as packets coming into the bridge are untagged.
Likewise, pass FDB_{ADD,DEL} notifications with VLAN 0 for these
devices.

Fixes: 54a73201 ("mlxsw: spectrum: Adjust switchdev ops for VLAN devices")
Signed-off-by: default avatarIdo Schimmel <idosch@mellanox.com>
Signed-off-by: default avatarJiri Pirko <jiri@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 45827d78
...@@ -1051,7 +1051,7 @@ static int mlxsw_sp_port_fdb_dump(struct mlxsw_sp_port *mlxsw_sp_port, ...@@ -1051,7 +1051,7 @@ static int mlxsw_sp_port_fdb_dump(struct mlxsw_sp_port *mlxsw_sp_port,
switchdev_obj_dump_cb_t *cb) switchdev_obj_dump_cb_t *cb)
{ {
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp; struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
u16 vport_vid = 0, vport_fid = 0; u16 vport_fid = 0;
char *sfd_pl; char *sfd_pl;
char mac[ETH_ALEN]; char mac[ETH_ALEN];
u16 fid; u16 fid;
...@@ -1072,7 +1072,6 @@ static int mlxsw_sp_port_fdb_dump(struct mlxsw_sp_port *mlxsw_sp_port, ...@@ -1072,7 +1072,6 @@ static int mlxsw_sp_port_fdb_dump(struct mlxsw_sp_port *mlxsw_sp_port,
tmp = mlxsw_sp_vport_vfid_get(mlxsw_sp_port); tmp = mlxsw_sp_vport_vfid_get(mlxsw_sp_port);
vport_fid = mlxsw_sp_vfid_to_fid(tmp); vport_fid = mlxsw_sp_vfid_to_fid(tmp);
vport_vid = mlxsw_sp_vport_vid_get(mlxsw_sp_port);
} }
mlxsw_reg_sfd_pack(sfd_pl, MLXSW_REG_SFD_OP_QUERY_DUMP, 0); mlxsw_reg_sfd_pack(sfd_pl, MLXSW_REG_SFD_OP_QUERY_DUMP, 0);
...@@ -1096,12 +1095,13 @@ static int mlxsw_sp_port_fdb_dump(struct mlxsw_sp_port *mlxsw_sp_port, ...@@ -1096,12 +1095,13 @@ static int mlxsw_sp_port_fdb_dump(struct mlxsw_sp_port *mlxsw_sp_port,
mlxsw_reg_sfd_uc_unpack(sfd_pl, i, mac, &fid, mlxsw_reg_sfd_uc_unpack(sfd_pl, i, mac, &fid,
&local_port); &local_port);
if (local_port == mlxsw_sp_port->local_port) { if (local_port == mlxsw_sp_port->local_port) {
if (vport_fid && vport_fid != fid) if (vport_fid && vport_fid == fid)
continue; fdb->vid = 0;
else if (vport_fid) else if (!vport_fid &&
fdb->vid = vport_vid; !mlxsw_sp_fid_is_vfid(fid))
else
fdb->vid = fid; fdb->vid = fid;
else
continue;
ether_addr_copy(fdb->addr, mac); ether_addr_copy(fdb->addr, mac);
fdb->ndm_state = NUD_REACHABLE; fdb->ndm_state = NUD_REACHABLE;
err = cb(&fdb->obj); err = cb(&fdb->obj);
...@@ -1114,12 +1114,13 @@ static int mlxsw_sp_port_fdb_dump(struct mlxsw_sp_port *mlxsw_sp_port, ...@@ -1114,12 +1114,13 @@ static int mlxsw_sp_port_fdb_dump(struct mlxsw_sp_port *mlxsw_sp_port,
mac, &fid, &lag_id); mac, &fid, &lag_id);
if (mlxsw_sp_port == if (mlxsw_sp_port ==
mlxsw_sp_lag_rep_port(mlxsw_sp, lag_id)) { mlxsw_sp_lag_rep_port(mlxsw_sp, lag_id)) {
if (vport_fid && vport_fid != fid) if (vport_fid && vport_fid == fid)
continue; fdb->vid = 0;
else if (vport_fid) else if (!vport_fid &&
fdb->vid = vport_vid; !mlxsw_sp_fid_is_vfid(fid))
else
fdb->vid = fid; fdb->vid = fid;
else
continue;
ether_addr_copy(fdb->addr, mac); ether_addr_copy(fdb->addr, mac);
fdb->ndm_state = NUD_REACHABLE; fdb->ndm_state = NUD_REACHABLE;
err = cb(&fdb->obj); err = cb(&fdb->obj);
...@@ -1245,7 +1246,7 @@ static void mlxsw_sp_fdb_notify_mac_process(struct mlxsw_sp *mlxsw_sp, ...@@ -1245,7 +1246,7 @@ static void mlxsw_sp_fdb_notify_mac_process(struct mlxsw_sp *mlxsw_sp,
netdev_err(mlxsw_sp_port->dev, "Failed to find a matching vPort following FDB notification\n"); netdev_err(mlxsw_sp_port->dev, "Failed to find a matching vPort following FDB notification\n");
goto just_remove; goto just_remove;
} }
vid = mlxsw_sp_vport_vid_get(mlxsw_sp_vport); vid = 0;
/* Override the physical port with the vPort. */ /* Override the physical port with the vPort. */
mlxsw_sp_port = mlxsw_sp_vport; mlxsw_sp_port = mlxsw_sp_vport;
} else { } else {
...@@ -1305,8 +1306,8 @@ static void mlxsw_sp_fdb_notify_mac_lag_process(struct mlxsw_sp *mlxsw_sp, ...@@ -1305,8 +1306,8 @@ static void mlxsw_sp_fdb_notify_mac_lag_process(struct mlxsw_sp *mlxsw_sp,
goto just_remove; goto just_remove;
} }
vid = mlxsw_sp_vport_vid_get(mlxsw_sp_vport); lag_vid = mlxsw_sp_vport_vid_get(mlxsw_sp_vport);
lag_vid = vid; vid = 0;
/* Override the physical port with the vPort. */ /* Override the physical port with the vPort. */
mlxsw_sp_port = mlxsw_sp_vport; mlxsw_sp_port = mlxsw_sp_vport;
} else { } else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment