X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/17a8f7b655ab85979781db15290784fcd3c496f2..002c3c665289b52eb20fd899fd3561e7f9d9e073:/package/swconfig/src/cli.c diff --git a/package/swconfig/src/cli.c b/package/swconfig/src/cli.c index cf3a51948..9cd16abb5 100644 --- a/package/swconfig/src/cli.c +++ b/package/swconfig/src/cli.c @@ -2,6 +2,7 @@ * swconfig.c: Switch configuration utility * * Copyright (C) 2008 Felix Fietkau + * Copyright (C) 2010 Martin Mares * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -34,9 +35,12 @@ #include "swlib.h" enum { - GET, - SET, - LOAD + CMD_NONE, + CMD_GET, + CMD_SET, + CMD_LOAD, + CMD_HELP, + CMD_SHOW, }; static void @@ -70,7 +74,7 @@ print_attrs(const struct switch_attr *attr) static void list_attributes(struct switch_dev *dev) { - printf("Switch %d: %s(%s), ports: %d, vlans: %d\n", dev->id, dev->dev_name, dev->name, dev->ports, dev->vlans); + printf("%s: %s(%s), ports: %d (cpu @ %d), vlans: %d\n", dev->dev_name, dev->alias, dev->name, dev->ports, dev->cpu_port, dev->vlans); printf(" --switch\n"); print_attrs(dev->ops); printf(" --vlan\n"); @@ -79,10 +83,91 @@ list_attributes(struct switch_dev *dev) 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, bool all) +{ + struct switch_val val; + struct switch_attr *attr; + + val.port_vlan = vlan; + + if (all) { + attr = swlib_lookup_attr(dev, SWLIB_ATTR_GROUP_VLAN, "ports"); + if (swlib_get_attr(dev, attr, &val) < 0) + return; + + if (!val.len) + return; + } + + printf("VLAN %d:\n", vlan); + show_attrs(dev, dev->vlan_ops, &val); +} + static void print_usage(void) { - printf("swconfig dev [port |vlan ] (help|set |get |load )\n"); + printf("swconfig dev [port |vlan ] (help|set |get |load |show)\n"); exit(1); } @@ -122,15 +207,12 @@ int main(int argc, char **argv) int err; int i; - struct switch_port *ports; - - int cmd = 0; + int cmd = CMD_NONE; char *cdev = NULL; int cport = -1; int cvlan = -1; char *ckey = NULL; char *cvalue = NULL; - int chelp = 0; if(argc < 4) print_usage(); @@ -142,44 +224,38 @@ int main(int argc, char **argv) for(i = 3; i < argc; i++) { - int p; - if (!strcmp(argv[i], "help")) { - chelp = 1; - continue; - } - if( i + 1 >= argc) + char *arg = argv[i]; + if (cmd != CMD_NONE) { print_usage(); - p = atoi(argv[i + 1]); - if (!strcmp(argv[i], "port")) { - cport = p; - } else if (!strcmp(argv[i], "vlan")) { - cvlan = p; - } else if (!strcmp(argv[i], "set")) { - if(argc <= i + 1) - print_usage(); - cmd = SET; - ckey = argv[i + 1]; - if (argc > i + 2) - cvalue = argv[i + 2]; - else - cvalue = NULL; - i++; - } else if (!strcmp(argv[i], "get")) { - cmd = GET; - ckey = argv[i + 1]; - } else if (!strcmp(argv[i], "load")) { + } else if (!strcmp(arg, "port") && i+1 < argc) { + cport = atoi(argv[++i]); + } else if (!strcmp(arg, "vlan") && i+1 < argc) { + cvlan = atoi(argv[++i]); + } else if (!strcmp(arg, "help")) { + cmd = CMD_HELP; + } else if (!strcmp(arg, "set") && i+1 < argc) { + cmd = CMD_SET; + ckey = argv[++i]; + if (i+1 < argc) + cvalue = argv[++i]; + } else if (!strcmp(arg, "get") && i+1 < argc) { + cmd = CMD_GET; + ckey = argv[++i]; + } else if (!strcmp(arg, "load") && i+1 < argc) { if ((cport >= 0) || (cvlan >= 0)) print_usage(); - - ckey = argv[i + 1]; - cmd = LOAD; + cmd = CMD_LOAD; + ckey = argv[++i]; + } else if (!strcmp(arg, "show")) { + cmd = CMD_SHOW; } else { print_usage(); } - i++; } - if(cport > -1 && cvlan > -1) + if (cmd == CMD_NONE) + print_usage(); + if (cport > -1 && cvlan > -1) print_usage(); dev = swlib_connect(cdev); @@ -188,17 +264,9 @@ int main(int argc, char **argv) return 1; } - ports = malloc(sizeof(struct switch_port) * dev->ports); - memset(ports, 0, sizeof(struct switch_port) * dev->ports); swlib_scan(dev); - if(chelp) - { - list_attributes(dev); - goto out; - } - - if (cmd != LOAD) { + if (cmd == CMD_GET || cmd == CMD_SET) { if(cport > -1) a = swlib_lookup_attr(dev, SWLIB_ATTR_GROUP_PORT, ckey); else if(cvlan > -1) @@ -215,7 +283,7 @@ int main(int argc, char **argv) switch(cmd) { - case SET: + case CMD_SET: if ((a->type != SWITCH_TYPE_NOVAL) && (cvalue == NULL)) print_usage(); @@ -230,7 +298,7 @@ int main(int argc, char **argv) goto out; } break; - case GET: + case CMD_GET: if(cvlan > -1) val.port_vlan = cvlan; if(cport > -1) @@ -241,28 +309,32 @@ int main(int argc, char **argv) retval = -1; goto out; } - switch(a->type) { - case SWITCH_TYPE_INT: - printf("%d\n", val.value.i); - break; - case SWITCH_TYPE_STRING: - printf("%s\n", val.value.s); - break; - case SWITCH_TYPE_PORTS: - for(i = 0; i < val.len; i++) - printf("%d ", val.value.ports[i]); - printf("\n"); - break; - } + print_attr_val(a, &val); + putchar('\n'); break; - case LOAD: + case CMD_LOAD: swconfig_load_uci(dev, ckey); break; + case CMD_HELP: + list_attributes(dev); + break; + case CMD_SHOW: + if (cport >= 0 || cvlan >= 0) { + if (cport >= 0) + show_port(dev, cport); + else + show_vlan(dev, cvlan, false); + } 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, true); + } + break; } out: swlib_free_all(dev); - free(ports); - return 0; }