Changeset 18078


Ignore:
Timestamp:
01/05/12 16:18:16 (17 months ago)
Author:
chris
Message:

swconfig update / remove static libnltiny (space) / use kernel switch.h include / needs testing with older kernels

Location:
src/router
Files:
14 deleted
6 edited

Legend:

Unmodified
Added
Removed
  • src/router/rules/all.mk

    r17490 r18078  
    235235include rules/pcre.mk 
    236236include rules/snort.mk 
     237include rules/swconfig.mk 
    237238# 
    238239# Generic rules 
  • src/router/rules/configs.mk

    r17939 r18078  
    198198obj-$(CONFIG_POUND) += pound 
    199199obj-$(CONFIG_VNCREPEATER) += vncrepeater 
    200 obj-$(CONFIG_SWCONFIG) += swconfig 
     200obj-$(CONFIG_SWCONFIG) += libnltiny swconfig 
    201201obj-$(CONFIG_NPROBE) += nprobe 
    202202obj-$(CONFIG_MTR) += mtr 
  • src/router/swconfig/Makefile

    r12084 r18078  
    1 CFLAGS = $(COPTS) -Os -Iinclude -I. -DNEED_PRINTF 
    2  
    31all: swconfig 
    42 
     
    64        $(CC) $(CFLAGS) -c -o $@ $^ 
    75 
    8 LIBNL_OBJ=nl.o handlers.o msg.o attr.o cache.o cache_mngt.o object.o socket.o error.o 
    9 GENL_OBJ=genl.o genl_family.o genl_ctrl.o genl_mngt.o 
    10  
    11 swconfig: $(LIBNL_OBJ) $(GENL_OBJ) cli.o swlib.o 
     6swconfig: cli.o swlib.o #uci.o 
    127        $(CC) $(LDFLAGS) -o $@ $^ $(LIBS) 
    138 
    149clean: 
    1510        rm -f swconfig *.o 
    16  
    17 install:  
    18         install -D swconfig $(INSTALLDIR)/usr/sbin/swconfig 
  • src/router/swconfig/cli.c

    r12079 r18078  
    33 * 
    44 * Copyright (C) 2008 Felix Fietkau <nbd@openwrt.org> 
     5 * Copyright (C) 2010 Martin Mares <mj@ucw.cz> 
    56 * 
    67 * This program is free software; you can redistribute it and/or 
     
    2324#include <sys/types.h> 
    2425#include <sys/socket.h> 
     26#include <stdbool.h> 
     27// #include <uci.h> 
    2528 
    2629#include <linux/types.h> 
     
    3437 
    3538enum { 
    36         GET, 
    37         SET, 
    38         LOAD 
     39        CMD_NONE, 
     40        CMD_GET, 
     41        CMD_SET, 
     42        CMD_LOAD, 
     43        CMD_HELP, 
     44        CMD_SHOW, 
    3945}; 
    4046 
     
    7076list_attributes(struct switch_dev *dev) 
    7177{ 
    72         printf("Switch %d: %s(%s), ports: %d, vlans: %d\n", dev->id, dev->dev_name, dev->name, dev->ports, dev->vlans); 
     78        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); 
    7379        printf("     --switch\n"); 
    7480        print_attrs(dev->ops); 
     
    8086 
    8187static void 
     88print_attr_val(const struct switch_attr *attr, const struct switch_val *val) 
     89{ 
     90        int i; 
     91 
     92        switch (attr->type) { 
     93        case SWITCH_TYPE_INT: 
     94                printf("%d", val->value.i); 
     95                break; 
     96        case SWITCH_TYPE_STRING: 
     97                printf("%s", val->value.s); 
     98                break; 
     99        case SWITCH_TYPE_PORTS: 
     100                for(i = 0; i < val->len; i++) { 
     101                        printf("%d%s ", 
     102                                val->value.ports[i].id, 
     103                                (val->value.ports[i].flags & 
     104                                 SWLIB_PORT_FLAG_TAGGED) ? "t" : ""); 
     105                } 
     106                break; 
     107        default: 
     108                printf("?unknown-type?"); 
     109        } 
     110} 
     111 
     112static void 
     113show_attrs(struct switch_dev *dev, struct switch_attr *attr, struct switch_val *val) 
     114{ 
     115        while (attr) { 
     116                if (attr->type != SWITCH_TYPE_NOVAL) { 
     117                        printf("\t%s: ", attr->name); 
     118                        if (swlib_get_attr(dev, attr, val) < 0) 
     119                                printf("???"); 
     120                        else 
     121                                print_attr_val(attr, val); 
     122                        putchar('\n'); 
     123                } 
     124                attr = attr->next; 
     125        } 
     126} 
     127 
     128static void 
     129show_global(struct switch_dev *dev) 
     130{ 
     131        struct switch_val val; 
     132 
     133        printf("Global attributes:\n"); 
     134        show_attrs(dev, dev->ops, &val); 
     135} 
     136 
     137static void 
     138show_port(struct switch_dev *dev, int port) 
     139{ 
     140        struct switch_val val; 
     141 
     142        printf("Port %d:\n", port); 
     143        val.port_vlan = port; 
     144        show_attrs(dev, dev->port_ops, &val); 
     145} 
     146 
     147static void 
     148show_vlan(struct switch_dev *dev, int vlan, bool all) 
     149{ 
     150        struct switch_val val; 
     151        struct switch_attr *attr; 
     152 
     153        val.port_vlan = vlan; 
     154 
     155        if (all) { 
     156                attr = swlib_lookup_attr(dev, SWLIB_ATTR_GROUP_VLAN, "ports"); 
     157                if (swlib_get_attr(dev, attr, &val) < 0) 
     158                        return; 
     159 
     160                if (!val.len) 
     161                        return; 
     162        } 
     163 
     164        printf("VLAN %d:\n", vlan); 
     165        show_attrs(dev, dev->vlan_ops, &val); 
     166} 
     167 
     168static void 
    82169print_usage(void) 
    83170{ 
    84         printf("swconfig dev <dev> [port <port>|vlan <vlan>] (help|set <key> <value>|get <key>)\n"); 
     171        printf("swconfig dev <dev> [port <port>|vlan <vlan>] (help|set <key> <value>|get <key>|load <config>|show)\n"); 
    85172        exit(1); 
    86173} 
    87  
     174/* 
     175static void 
     176swconfig_load_uci(struct switch_dev *dev, const char *name) 
     177{ 
     178        struct uci_context *ctx; 
     179        struct uci_package *p = NULL; 
     180        struct uci_element *e; 
     181        int ret = -1; 
     182 
     183        ctx = uci_alloc_context(); 
     184        if (!ctx) 
     185                return; 
     186 
     187        uci_load(ctx, name, &p); 
     188        if (!p) { 
     189                uci_perror(ctx, "Failed to load config file: "); 
     190                goto out; 
     191        } 
     192 
     193        ret = swlib_apply_from_uci(dev, p); 
     194        if (ret < 0) 
     195                fprintf(stderr, "Failed to apply configuration for switch '%s'\n", dev->dev_name); 
     196 
     197out: 
     198        uci_free_context(ctx); 
     199        exit(ret); 
     200} 
     201*/ 
    88202 
    89203int main(int argc, char **argv) 
     
    96210        int i; 
    97211 
    98         struct switch_port *ports; 
    99  
    100         int cmd = 0; 
     212        int cmd = CMD_NONE; 
    101213        char *cdev = NULL; 
    102214        int cport = -1; 
     
    104216        char *ckey = NULL; 
    105217        char *cvalue = NULL; 
    106         int chelp = 0; 
    107218 
    108219        if(argc < 4) 
     
    116227        for(i = 3; i < argc; i++) 
    117228        { 
    118                 int p; 
    119                 if (!strcmp(argv[i], "help")) { 
    120                         chelp = 1; 
    121                         continue; 
    122                 } 
    123                 if( i + 1 >= argc) 
     229                char *arg = argv[i]; 
     230                if (cmd != CMD_NONE) { 
    124231                        print_usage(); 
    125                 p = atoi(argv[i + 1]); 
    126                 if (!strcmp(argv[i], "port")) { 
    127                         cport = p; 
    128                 } else if (!strcmp(argv[i], "vlan")) { 
    129                         cvlan = p; 
    130                 } else if (!strcmp(argv[i], "set")) { 
    131                         if(argc <= i + 1) 
     232                } else if (!strcmp(arg, "port") && i+1 < argc) { 
     233                        cport = atoi(argv[++i]); 
     234                } else if (!strcmp(arg, "vlan") && i+1 < argc) { 
     235                        cvlan = atoi(argv[++i]); 
     236                } else if (!strcmp(arg, "help")) { 
     237                        cmd = CMD_HELP; 
     238                } else if (!strcmp(arg, "set") && i+1 < argc) { 
     239                        cmd = CMD_SET; 
     240                        ckey = argv[++i]; 
     241                        if (i+1 < argc) 
     242                                cvalue = argv[++i]; 
     243                } else if (!strcmp(arg, "get") && i+1 < argc) { 
     244                        cmd = CMD_GET; 
     245                        ckey = argv[++i]; 
     246                } else if (!strcmp(arg, "load") && i+1 < argc) { 
     247                        if ((cport >= 0) || (cvlan >= 0)) 
    132248                                print_usage(); 
    133                         cmd = SET; 
    134                         ckey = argv[i + 1]; 
    135                         if (argc > i + 2) 
    136                                 cvalue = argv[i + 2]; 
    137                         else 
    138                                 cvalue = NULL; 
    139                         i++; 
    140                 } else if (!strcmp(argv[i], "get")) { 
    141                         cmd = GET; 
    142                         ckey = argv[i + 1]; 
     249                        cmd = CMD_LOAD; 
     250                        ckey = argv[++i]; 
     251                } else if (!strcmp(arg, "show")) { 
     252                        cmd = CMD_SHOW; 
    143253                } else { 
    144254                        print_usage(); 
    145255                } 
    146                 i++; 
    147         } 
    148  
    149         if(cport > -1 && cvlan > -1) 
     256        } 
     257 
     258        if (cmd == CMD_NONE) 
     259                print_usage(); 
     260        if (cport > -1 && cvlan > -1) 
    150261                print_usage(); 
    151262 
     
    156267        } 
    157268 
    158         ports = malloc(sizeof(struct switch_port) * dev->ports); 
    159         memset(ports, 0, sizeof(struct switch_port) * dev->ports); 
    160269        swlib_scan(dev); 
    161270 
    162         if(chelp) 
    163         { 
    164                 list_attributes(dev); 
    165                 goto out; 
    166         } 
    167  
    168         if (cmd != LOAD) { 
     271        if (cmd == CMD_GET || cmd == CMD_SET) { 
    169272                if(cport > -1) 
    170273                        a = swlib_lookup_attr(dev, SWLIB_ATTR_GROUP_PORT, ckey); 
     
    183286        switch(cmd) 
    184287        { 
    185         case SET: 
     288        case CMD_SET: 
    186289                if ((a->type != SWITCH_TYPE_NOVAL) && 
    187290                                (cvalue == NULL)) 
     
    198301                } 
    199302                break; 
    200         case GET: 
     303        case CMD_GET: 
    201304                if(cvlan > -1) 
    202305                        val.port_vlan = cvlan; 
     
    209312                        goto out; 
    210313                } 
    211                 switch(a->type) { 
    212                 case SWITCH_TYPE_INT: 
    213                         printf("%d\n", val.value.i); 
    214                         break; 
    215                 case SWITCH_TYPE_STRING: 
    216                         printf("%s\n", val.value.s); 
    217                         break; 
    218                 case SWITCH_TYPE_PORTS: 
    219                         for(i = 0; i < val.len; i++) 
    220                                 printf("%d ", val.value.ports[i]); 
    221                         printf("\n"); 
    222                         break; 
     314                print_attr_val(a, &val); 
     315                putchar('\n'); 
     316                break; 
     317/*      case CMD_LOAD: 
     318                swconfig_load_uci(dev, ckey); 
     319                break; */ 
     320        case CMD_HELP: 
     321                list_attributes(dev); 
     322                break; 
     323        case CMD_SHOW: 
     324                if (cport >= 0 || cvlan >= 0) { 
     325                        if (cport >= 0) 
     326                                show_port(dev, cport); 
     327                        else 
     328                                show_vlan(dev, cvlan, false); 
     329                } else { 
     330                        show_global(dev); 
     331                        for (i=0; i < dev->ports; i++) 
     332                                show_port(dev, i); 
     333                        for (i=0; i < dev->vlans; i++) 
     334                                show_vlan(dev, i, true); 
    223335                } 
    224336                break; 
     
    227339out: 
    228340        swlib_free_all(dev); 
    229         free(ports); 
    230  
    231341        return 0; 
    232342} 
  • src/router/swconfig/swlib.c

    r12079 r18078  
    369369                while(ptr && *ptr) 
    370370                { 
     371                        while(*ptr && isspace(*ptr)) 
     372                                ptr++; 
     373 
     374                        if (!*ptr) 
     375                                break; 
     376 
     377                        if (!isdigit(*ptr)) 
     378                                return -1; 
     379 
     380                        if (val.len >= dev->ports) 
     381                                return -1; 
     382 
    371383                        ports[val.len].flags = 0; 
    372384                        ports[val.len].id = strtoul(ptr, &ptr, 10); 
     
    374386                                if (*ptr == 't') 
    375387                                        ports[val.len].flags |= SWLIB_PORT_FLAG_TAGGED; 
     388                                else 
     389                                        return -1; 
     390 
    376391                                ptr++; 
    377392                        } 
     
    383398                break; 
    384399        case SWITCH_TYPE_NOVAL: 
     400                if (str && !strcmp(str, "0")) 
     401                        return 0; 
     402 
    385403                break; 
    386404        default: 
     
    563581        struct switch_dev *dev; 
    564582        const char *name; 
     583        // const char *alias; 
    565584 
    566585        if (nla_parse(tb, SWITCH_ATTR_MAX, genlmsg_attrdata(gnlh, 0), genlmsg_attrlen(gnlh, 0), NULL) < 0) 
     
    571590 
    572591        name = nla_get_string(tb[SWITCH_ATTR_DEV_NAME]); 
    573         if (sa->name && (strcmp(name, sa->name) != 0)) 
    574                 goto done; 
     592        // alias = nla_get_string(tb[SWITCH_ATTR_ALIAS]); 
     593 
     594        // if (sa->name && (strcmp(name, sa->name) != 0) && (strcmp(alias, sa->name) != 0)) 
     595        if (sa->name && (strcmp(name, sa->name) != 0) ) 
     596                goto done; 
    575597 
    576598        dev = swlib_alloc(sizeof(struct switch_dev)); 
     
    578600                goto done; 
    579601 
    580         dev->dev_name = strdup(name); 
     602        strncpy(dev->dev_name, name, IFNAMSIZ - 1); 
     603        // dev->alias = strdup(alias); 
     604        dev->alias = strdup(""); 
     605 
    581606        if (tb[SWITCH_ATTR_ID]) 
    582607                dev->id = nla_get_u32(tb[SWITCH_ATTR_ID]); 
    583608        if (tb[SWITCH_ATTR_NAME]) 
    584                 dev->name = strdup(nla_get_string(tb[SWITCH_ATTR_DEV_NAME])); 
     609                dev->name = strdup(nla_get_string(tb[SWITCH_ATTR_NAME])); 
    585610        if (tb[SWITCH_ATTR_PORTS]) 
    586611                dev->ports = nla_get_u32(tb[SWITCH_ATTR_PORTS]); 
    587612        if (tb[SWITCH_ATTR_VLANS]) 
    588613                dev->vlans = nla_get_u32(tb[SWITCH_ATTR_VLANS]); 
     614        if (tb[SWITCH_ATTR_CPU_PORT]) 
     615                dev->cpu_port = nla_get_u32(tb[SWITCH_ATTR_CPU_PORT]); 
    589616 
    590617        if (!sa->head) { 
  • src/router/swconfig/swlib.h

    r12079 r18078  
    115115struct switch_dev { 
    116116        int id; 
     117        char dev_name[IFNAMSIZ]; 
    117118        const char *name; 
    118         const char *dev_name; 
     119        const char *alias; 
    119120        int ports; 
    120121        int vlans; 
     122        int cpu_port; 
    121123        struct switch_attr *ops; 
    122124        struct switch_attr *port_ops; 
Note: See TracChangeset for help on using the changeset viewer.