swconfig: support setting SWITCH_TYPE_LINK attributes
Supported syntax is inspired by ethtool. Example usages: swconfig dev switch0 port 2 set link "duplex half speed 100" swconfig dev switch0 port 2 set link "autoneg on" Signed-off-by: Rafał Miłecki <zajec5@gmail.com> SVN-Revision: 48624
This commit is contained in:
parent
6831bac31f
commit
6219b3deae
1 changed files with 51 additions and 0 deletions
|
@ -420,11 +420,20 @@ swlib_set_attr(struct switch_dev *dev, struct switch_attr *attr, struct switch_v
|
||||||
return swlib_call(cmd, NULL, send_attr_val, val);
|
return swlib_call(cmd, NULL, send_attr_val, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum {
|
||||||
|
CMD_NONE,
|
||||||
|
CMD_DUPLEX,
|
||||||
|
CMD_ANEG,
|
||||||
|
CMD_SPEED,
|
||||||
|
};
|
||||||
|
|
||||||
int swlib_set_attr_string(struct switch_dev *dev, struct switch_attr *a, int port_vlan, const char *str)
|
int swlib_set_attr_string(struct switch_dev *dev, struct switch_attr *a, int port_vlan, const char *str)
|
||||||
{
|
{
|
||||||
struct switch_port *ports;
|
struct switch_port *ports;
|
||||||
|
struct switch_port_link *link;
|
||||||
struct switch_val val;
|
struct switch_val val;
|
||||||
char *ptr;
|
char *ptr;
|
||||||
|
int cmd = CMD_NONE;
|
||||||
|
|
||||||
memset(&val, 0, sizeof(val));
|
memset(&val, 0, sizeof(val));
|
||||||
val.port_vlan = port_vlan;
|
val.port_vlan = port_vlan;
|
||||||
|
@ -470,6 +479,48 @@ int swlib_set_attr_string(struct switch_dev *dev, struct switch_attr *a, int por
|
||||||
}
|
}
|
||||||
val.value.ports = ports;
|
val.value.ports = ports;
|
||||||
break;
|
break;
|
||||||
|
case SWITCH_TYPE_LINK:
|
||||||
|
link = malloc(sizeof(struct switch_port_link));
|
||||||
|
memset(link, 0, sizeof(struct switch_port_link));
|
||||||
|
ptr = (char *)str;
|
||||||
|
for (ptr = strtok(ptr," "); ptr; ptr = strtok(NULL, " ")) {
|
||||||
|
switch (cmd) {
|
||||||
|
case CMD_NONE:
|
||||||
|
if (!strcmp(ptr, "duplex"))
|
||||||
|
cmd = CMD_DUPLEX;
|
||||||
|
else if (!strcmp(ptr, "autoneg"))
|
||||||
|
cmd = CMD_ANEG;
|
||||||
|
else if (!strcmp(ptr, "speed"))
|
||||||
|
cmd = CMD_SPEED;
|
||||||
|
else
|
||||||
|
fprintf(stderr, "Unsupported option %s\n", ptr);
|
||||||
|
break;
|
||||||
|
case CMD_DUPLEX:
|
||||||
|
if (!strcmp(ptr, "half"))
|
||||||
|
link->duplex = 0;
|
||||||
|
else if (!strcmp(ptr, "full"))
|
||||||
|
link->duplex = 1;
|
||||||
|
else
|
||||||
|
fprintf(stderr, "Unsupported value %s\n", ptr);
|
||||||
|
cmd = CMD_NONE;
|
||||||
|
break;
|
||||||
|
case CMD_ANEG:
|
||||||
|
if (!strcmp(ptr, "on"))
|
||||||
|
link->aneg = 1;
|
||||||
|
else if (!strcmp(ptr, "off"))
|
||||||
|
link->aneg = 0;
|
||||||
|
else
|
||||||
|
fprintf(stderr, "Unsupported value %s\n", ptr);
|
||||||
|
cmd = CMD_NONE;
|
||||||
|
break;
|
||||||
|
case CMD_SPEED:
|
||||||
|
link->speed = atoi(ptr);
|
||||||
|
cmd = CMD_NONE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val.value.link = link;
|
||||||
|
break;
|
||||||
case SWITCH_TYPE_NOVAL:
|
case SWITCH_TYPE_NOVAL:
|
||||||
if (str && !strcmp(str, "0"))
|
if (str && !strcmp(str, "0"))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in a new issue