|
|
|
@ -75,6 +75,7 @@ swconfig_get_vlan_ports(struct switch_dev *dev, const struct switch_attr *attr, |
|
|
|
|
static int |
|
|
|
|
swconfig_set_vlan_ports(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) |
|
|
|
|
{ |
|
|
|
|
struct switch_port *ports = val->value.ports; |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
if (val->port_vlan >= dev->vlans) |
|
|
|
@ -84,15 +85,42 @@ swconfig_set_vlan_ports(struct switch_dev *dev, const struct switch_attr *attr, |
|
|
|
|
if (val->len > dev->ports) |
|
|
|
|
return -EINVAL; |
|
|
|
|
|
|
|
|
|
if (!dev->set_vlan_ports) |
|
|
|
|
return -EOPNOTSUPP; |
|
|
|
|
|
|
|
|
|
for (i = 0; i < val->len; i++) { |
|
|
|
|
if (val->value.ports[i].id >= dev->ports) |
|
|
|
|
if (ports[i].id >= dev->ports) |
|
|
|
|
return -EINVAL; |
|
|
|
|
|
|
|
|
|
if (dev->set_port_pvid && !(ports[i].flags & SWITCH_PORT_FLAG_TAGGED)) |
|
|
|
|
dev->set_port_pvid(dev, ports[i].id, val->port_vlan); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!dev->set_vlan_ports) |
|
|
|
|
return dev->set_vlan_ports(dev, val); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int |
|
|
|
|
swconfig_set_pvid(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) |
|
|
|
|
{ |
|
|
|
|
if (val->port_vlan >= dev->ports) |
|
|
|
|
return -EINVAL; |
|
|
|
|
|
|
|
|
|
if (!dev->set_port_pvid) |
|
|
|
|
return -EOPNOTSUPP; |
|
|
|
|
|
|
|
|
|
return dev->set_vlan_ports(dev, val); |
|
|
|
|
return dev->set_port_pvid(dev, val->port_vlan, val->value.i); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int |
|
|
|
|
swconfig_get_pvid(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val) |
|
|
|
|
{ |
|
|
|
|
if (val->port_vlan >= dev->ports) |
|
|
|
|
return -EINVAL; |
|
|
|
|
|
|
|
|
|
if (!dev->get_port_pvid) |
|
|
|
|
return -EOPNOTSUPP; |
|
|
|
|
|
|
|
|
|
return dev->get_port_pvid(dev, val->port_vlan, &val->value.i); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int |
|
|
|
@ -115,7 +143,7 @@ enum vlan_defaults { |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
enum port_defaults { |
|
|
|
|
PORT_LINK, |
|
|
|
|
PORT_PVID, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static struct switch_attr default_global[] = { |
|
|
|
@ -128,10 +156,12 @@ static struct switch_attr default_global[] = { |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static struct switch_attr default_port[] = { |
|
|
|
|
[PORT_LINK] = { |
|
|
|
|
[PORT_PVID] = { |
|
|
|
|
.type = SWITCH_TYPE_INT, |
|
|
|
|
.name = "link", |
|
|
|
|
.description = "Current link speed", |
|
|
|
|
.name = "pvid", |
|
|
|
|
.description = "Primary VLAN ID", |
|
|
|
|
.set = swconfig_set_pvid, |
|
|
|
|
.get = swconfig_get_pvid, |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
@ -155,6 +185,9 @@ static void swconfig_defaults_init(struct switch_dev *dev) |
|
|
|
|
if (dev->get_vlan_ports || dev->set_vlan_ports) |
|
|
|
|
set_bit(VLAN_PORTS, &dev->def_vlan); |
|
|
|
|
|
|
|
|
|
if (dev->get_port_pvid || dev->set_port_pvid) |
|
|
|
|
set_bit(PORT_PVID, &dev->def_port); |
|
|
|
|
|
|
|
|
|
/* always present, can be no-op */ |
|
|
|
|
set_bit(GLOBAL_APPLY, &dev->def_global); |
|
|
|
|
} |
|
|
|
|