swconfig: add show command

Add a "show" command, which displays all attributes of the selected port,
VLAN, or of the whole switch.

Signed-off-by: Martin Mares <mj@ucw.cz>

SVN-Revision: 19640
This commit is contained in:
Felix Fietkau 2010-02-15 17:29:00 +00:00
parent cfb74b3b81
commit b7d662dce8

View file

@ -39,6 +39,7 @@ enum {
CMD_SET, CMD_SET,
CMD_LOAD, CMD_LOAD,
CMD_HELP, CMD_HELP,
CMD_SHOW,
}; };
static void static void
@ -81,10 +82,80 @@ list_attributes(struct switch_dev *dev)
print_attrs(dev->port_ops); print_attrs(dev->port_ops);
} }
static void
print_attr_val(const struct switch_attr *attr, const struct switch_val *val)
{
int i;
switch (attr->type) {
case SWITCH_TYPE_INT:
printf("%d", val->value.i);
break;
case SWITCH_TYPE_STRING:
printf("%s", val->value.s);
break;
case SWITCH_TYPE_PORTS:
for(i = 0; i < val->len; i++) {
printf("%d%s ",
val->value.ports[i].id,
(val->value.ports[i].flags &
SWLIB_PORT_FLAG_TAGGED) ? "t" : "");
}
break;
default:
printf("?unknown-type?");
}
}
static void
show_attrs(struct switch_dev *dev, struct switch_attr *attr, struct switch_val *val)
{
while (attr) {
if (attr->type != SWITCH_TYPE_NOVAL) {
printf("\t%s: ", attr->name);
if (swlib_get_attr(dev, attr, val) < 0)
printf("???");
else
print_attr_val(attr, val);
putchar('\n');
}
attr = attr->next;
}
}
static void
show_global(struct switch_dev *dev)
{
struct switch_val val;
printf("Global attributes:\n");
show_attrs(dev, dev->ops, &val);
}
static void
show_port(struct switch_dev *dev, int port)
{
struct switch_val val;
printf("Port %d:\n", port);
val.port_vlan = port;
show_attrs(dev, dev->port_ops, &val);
}
static void
show_vlan(struct switch_dev *dev, int vlan)
{
struct switch_val val;
printf("VLAN %d:\n", vlan);
val.port_vlan = vlan;
show_attrs(dev, dev->vlan_ops, &val);
}
static void static void
print_usage(void) print_usage(void)
{ {
printf("swconfig dev <dev> [port <port>|vlan <vlan>] (help|set <key> <value>|get <key>|load <config>)\n"); printf("swconfig dev <dev> [port <port>|vlan <vlan>] (help|set <key> <value>|get <key>|load <config>|show)\n");
exit(1); exit(1);
} }
@ -165,6 +236,8 @@ int main(int argc, char **argv)
print_usage(); print_usage();
cmd = CMD_LOAD; cmd = CMD_LOAD;
ckey = argv[++i]; ckey = argv[++i];
} else if (!strcmp(arg, "show")) {
cmd = CMD_SHOW;
} else { } else {
print_usage(); print_usage();
} }
@ -252,6 +325,20 @@ int main(int argc, char **argv)
case CMD_HELP: case CMD_HELP:
list_attributes(dev); list_attributes(dev);
break; break;
case CMD_SHOW:
if (cport >= 0 || cvlan >= 0) {
if (cport >= 0)
show_port(dev, cport);
else
show_vlan(dev, cvlan);
} else {
show_global(dev);
for (i=0; i < dev->ports; i++)
show_port(dev, i);
for (i=0; i < dev->vlans; i++)
show_vlan(dev, i);
}
break;
} }
out: out: