mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-08 23:04:35 +08:00
rocker: install untagged VLAN (vid=0) support for each port
On port probe, install by default untagged VLAN support. This is equivalent to running the command: bridge vlan add vid 0 dev DEV self A user could, if they wanted, manaully removing untagged support from the port by running the command: bridge vlan del vid 0 dev DEV self But installing it by default on port initialization gives the normal expected behavior. Signed-off-by: Scott Feldman <sfeldma@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
cec04a60bc
commit
bcfd780144
@ -3136,6 +3136,8 @@ static int rocker_port_vlan_flood_group(struct rocker_port *rocker_port,
|
|||||||
|
|
||||||
for (i = 0; i < rocker->port_count; i++) {
|
for (i = 0; i < rocker->port_count; i++) {
|
||||||
p = rocker->ports[i];
|
p = rocker->ports[i];
|
||||||
|
if (!p)
|
||||||
|
continue;
|
||||||
if (!rocker_port_is_bridged(p))
|
if (!rocker_port_is_bridged(p))
|
||||||
continue;
|
continue;
|
||||||
if (test_bit(ntohs(vlan_id), p->vlan_bitmap)) {
|
if (test_bit(ntohs(vlan_id), p->vlan_bitmap)) {
|
||||||
@ -3195,7 +3197,7 @@ static int rocker_port_vlan_l2_groups(struct rocker_port *rocker_port,
|
|||||||
|
|
||||||
for (i = 0; i < rocker->port_count; i++) {
|
for (i = 0; i < rocker->port_count; i++) {
|
||||||
p = rocker->ports[i];
|
p = rocker->ports[i];
|
||||||
if (test_bit(ntohs(vlan_id), p->vlan_bitmap))
|
if (p && test_bit(ntohs(vlan_id), p->vlan_bitmap))
|
||||||
ref++;
|
ref++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4857,6 +4859,7 @@ static int rocker_probe_port(struct rocker *rocker, unsigned int port_number)
|
|||||||
const struct pci_dev *pdev = rocker->pdev;
|
const struct pci_dev *pdev = rocker->pdev;
|
||||||
struct rocker_port *rocker_port;
|
struct rocker_port *rocker_port;
|
||||||
struct net_device *dev;
|
struct net_device *dev;
|
||||||
|
u16 untagged_vid = 0;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
dev = alloc_etherdev(sizeof(struct rocker_port));
|
dev = alloc_etherdev(sizeof(struct rocker_port));
|
||||||
@ -4892,16 +4895,27 @@ static int rocker_probe_port(struct rocker *rocker, unsigned int port_number)
|
|||||||
|
|
||||||
rocker_port_set_learning(rocker_port, SWITCHDEV_TRANS_NONE);
|
rocker_port_set_learning(rocker_port, SWITCHDEV_TRANS_NONE);
|
||||||
|
|
||||||
rocker_port->internal_vlan_id =
|
|
||||||
rocker_port_internal_vlan_id_get(rocker_port, dev->ifindex);
|
|
||||||
err = rocker_port_ig_tbl(rocker_port, SWITCHDEV_TRANS_NONE, 0);
|
err = rocker_port_ig_tbl(rocker_port, SWITCHDEV_TRANS_NONE, 0);
|
||||||
if (err) {
|
if (err) {
|
||||||
dev_err(&pdev->dev, "install ig port table failed\n");
|
dev_err(&pdev->dev, "install ig port table failed\n");
|
||||||
goto err_port_ig_tbl;
|
goto err_port_ig_tbl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rocker_port->internal_vlan_id =
|
||||||
|
rocker_port_internal_vlan_id_get(rocker_port, dev->ifindex);
|
||||||
|
|
||||||
|
err = rocker_port_vlan_add(rocker_port, SWITCHDEV_TRANS_NONE,
|
||||||
|
untagged_vid, 0);
|
||||||
|
if (err) {
|
||||||
|
netdev_err(rocker_port->dev, "install untagged VLAN failed\n");
|
||||||
|
goto err_untagged_vlan;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
err_untagged_vlan:
|
||||||
|
rocker_port_ig_tbl(rocker_port, SWITCHDEV_TRANS_NONE,
|
||||||
|
ROCKER_OP_FLAG_REMOVE);
|
||||||
err_port_ig_tbl:
|
err_port_ig_tbl:
|
||||||
unregister_netdev(dev);
|
unregister_netdev(dev);
|
||||||
err_register_netdev:
|
err_register_netdev:
|
||||||
|
Loading…
Reference in New Issue
Block a user