Changeset 15315


Ignore:
Timestamp:
2009-04-21T03:35:30+02:00 (9 years ago)
Author:
nbd
Message:

swconfig: implement uci loading support

Location:
trunk/package/swconfig
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/swconfig/Makefile

    r15304 r15315  
    1818  SECTION:=base 
    1919  CATEGORY:=Base system 
    20   DEPENDS:=@LINUX_2_6_26||LINUX_2_6_27||LINUX_2_6_28||LINUX_2_6_29 
     20  DEPENDS:=@LINUX_2_6_26||LINUX_2_6_27||LINUX_2_6_28||LINUX_2_6_29 +libuci 
    2121  TITLE:=Switch configuration utility 
    2222endef 
     
    3535        $(MAKE) -C $(PKG_BUILD_DIR) \ 
    3636                $(TARGET_CONFIGURE_OPTS) \ 
    37                 LIBS="$(STAGING_DIR)/usr/lib/libnl.a -lm" 
     37                LIBS="-L$(STAGING_DIR)/usr/lib $(STAGING_DIR)/usr/lib/libnl.a -lm -luci" 
    3838endef 
    3939 
  • trunk/package/swconfig/src/Makefile

    r13009 r15315  
    99        $(CC) $(CFLAGS) -c -o $@ $^ 
    1010 
    11 swconfig: cli.o swlib.o 
     11swconfig: cli.o swlib.o uci.o 
    1212        $(CC) $(LDFLAGS) -o $@ $^ $(LIBS) 
  • trunk/package/swconfig/src/cli.c

    r13009 r15315  
    2323#include <sys/types.h> 
    2424#include <sys/socket.h> 
     25#include <uci.h> 
    2526 
    2627#include <linux/types.h> 
     
    3334#include "swlib.h" 
    3435 
    35 #define GET             1 
    36 #define SET             2 
    37  
    38 void print_attrs(struct switch_attr *attr) 
     36enum { 
     37        GET, 
     38        SET, 
     39        LOAD 
     40}; 
     41 
     42static void 
     43print_attrs(const struct switch_attr *attr) 
    3944{ 
    4045        int i = 0; 
     
    6368} 
    6469 
    65 void list_attributes(struct switch_dev *dev) 
     70static void 
     71list_attributes(struct switch_dev *dev) 
    6672{ 
    6773        printf("Switch %d: %s(%s), ports: %d, vlans: %d\n", dev->id, dev->dev_name, dev->name, dev->ports, dev->vlans); 
     
    7480} 
    7581 
    76 void print_usage(void) 
    77 { 
    78         printf("swconfig dev <dev> [port <port>|vlan <vlan>] (help|set <key> <value>|get <key>)\n"); 
    79         exit(0); 
     82static void 
     83print_usage(void) 
     84{ 
     85        printf("swconfig dev <dev> [port <port>|vlan <vlan>] (help|set <key> <value>|get <key>|load <config>)\n"); 
     86        exit(1); 
     87} 
     88 
     89static void 
     90swconfig_load_uci(struct switch_dev *dev, const char *name) 
     91{ 
     92        struct uci_context *ctx; 
     93        struct uci_package *p = NULL; 
     94        struct uci_element *e; 
     95        int ret = -1; 
     96 
     97        ctx = uci_alloc_context(); 
     98        if (!ctx) 
     99                return; 
     100 
     101        uci_load(ctx, name, &p); 
     102        if (!p) { 
     103                uci_perror(ctx, "Failed to load config file: "); 
     104                goto out; 
     105        } 
     106 
     107        ret = swlib_apply_from_uci(dev, p); 
     108        if (ret < 0) 
     109                fprintf(stderr, "Failed to apply configuration for switch '%s'\n", dev->dev_name); 
     110 
     111out: 
     112        uci_free_context(ctx); 
     113        exit(ret); 
    80114} 
    81115 
     
    110144        { 
    111145                int p; 
    112                 if(!strcmp(argv[i], "help")) 
    113                 { 
     146                if (!strcmp(argv[i], "help")) { 
    114147                        chelp = 1; 
    115148                        continue; 
    116149                } 
    117                 if(i + 1 >= argc) 
     150                if( i + 1 >= argc) 
    118151                        print_usage(); 
    119152                p = atoi(argv[i + 1]); 
    120                 if(!strcmp(argv[i], "port")) 
    121                 { 
     153                if (!strcmp(argv[i], "port")) { 
    122154                        cport = p; 
    123                 } else if(!strcmp(argv[i], "vlan")) 
    124                 { 
     155                } else if (!strcmp(argv[i], "vlan")) { 
    125156                        cvlan = p; 
    126                 } else if(!strcmp(argv[i], "set")) 
    127                 { 
     157                } else if (!strcmp(argv[i], "set")) { 
    128158                        if(argc <= i + 1) 
    129159                                print_usage(); 
     
    135165                                cvalue = NULL; 
    136166                        i++; 
    137                 } else if(!strcmp(argv[i], "get")) 
    138                 { 
     167                } else if (!strcmp(argv[i], "get")) { 
    139168                        cmd = GET; 
    140169                        ckey = argv[i + 1]; 
    141                 } else{ 
     170                } else if (!strcmp(argv[i], "load")) { 
     171                        if ((cport >= 0) || (cvlan >= 0)) 
     172                                print_usage(); 
     173 
     174                        ckey = argv[i + 1]; 
     175                        cmd = LOAD; 
     176                } else { 
    142177                        print_usage(); 
    143178                } 
     
    164199        } 
    165200 
    166         if(cport > -1) 
    167                 a = swlib_lookup_attr(dev, SWLIB_ATTR_GROUP_PORT, ckey); 
    168         else if(cvlan > -1) 
    169                 a = swlib_lookup_attr(dev, SWLIB_ATTR_GROUP_VLAN, ckey); 
    170         else 
    171                 a = swlib_lookup_attr(dev, SWLIB_ATTR_GROUP_GLOBAL, ckey); 
    172  
    173         if(!a) 
    174         { 
    175                 fprintf(stderr, "Unknown attribute \"%s\"\n", ckey); 
    176                 goto out; 
     201        if (cmd != LOAD) { 
     202                if(cport > -1) 
     203                        a = swlib_lookup_attr(dev, SWLIB_ATTR_GROUP_PORT, ckey); 
     204                else if(cvlan > -1) 
     205                        a = swlib_lookup_attr(dev, SWLIB_ATTR_GROUP_VLAN, ckey); 
     206                else 
     207                        a = swlib_lookup_attr(dev, SWLIB_ATTR_GROUP_GLOBAL, ckey); 
     208 
     209                if(!a) 
     210                { 
     211                        fprintf(stderr, "Unknown attribute \"%s\"\n", ckey); 
     212                        goto out; 
     213                } 
    177214        } 
    178215 
     
    184221                        print_usage(); 
    185222 
    186                 switch(a->type) { 
    187                 case SWITCH_TYPE_INT: 
    188                         val.value.i = atoi(cvalue); 
    189                         break; 
    190                 case SWITCH_TYPE_STRING: 
    191                         val.value.s = cvalue; 
    192                         break; 
    193                 case SWITCH_TYPE_PORTS: 
    194                         val.len = 0; 
    195                         while(cvalue && *cvalue) 
    196                         { 
    197                                 ports[val.len].flags = 0; 
    198                                 ports[val.len].id = strtol(cvalue, &cvalue, 10); 
    199                                 while(*cvalue && !isspace(*cvalue)) { 
    200                                         if (*cvalue == 't') 
    201                                                 ports[val.len].flags |= SWLIB_PORT_FLAG_TAGGED; 
    202                                         cvalue++; 
    203                                 } 
    204                                 if (*cvalue) 
    205                                         cvalue++; 
    206                                 val.len++; 
    207                         } 
    208                         val.value.ports = ports; 
    209                         break; 
    210                 default: 
    211                         break; 
    212                 } 
    213223                if(cvlan > -1) 
    214                         val.port_vlan = cvlan; 
    215                 if(cport > -1) 
    216                         val.port_vlan = cport; 
    217                 if(swlib_set_attr(dev, a, &val) < 0) 
     224                        cport = cvlan; 
     225 
     226                if(swlib_set_attr_string(dev, a, cport, cvalue) < 0) 
    218227                { 
    219228                        fprintf(stderr, "failed\n"); 
     
    246255                        break; 
    247256                } 
     257                break; 
     258        case LOAD: 
     259                swconfig_load_uci(dev, ckey); 
     260                break; 
    248261        } 
    249262 
  • trunk/package/swconfig/src/swlib.c

    r13009 r15315  
    344344} 
    345345 
     346int swlib_set_attr_string(struct switch_dev *dev, struct switch_attr *a, int port_vlan, const char *str) 
     347{ 
     348        struct switch_port *ports; 
     349        struct switch_val val; 
     350        char *ptr; 
     351 
     352        memset(&val, 0, sizeof(val)); 
     353        val.port_vlan = port_vlan; 
     354        switch(a->type) { 
     355        case SWITCH_TYPE_INT: 
     356                val.value.i = atoi(str); 
     357                break; 
     358        case SWITCH_TYPE_STRING: 
     359                val.value.s = str; 
     360                break; 
     361        case SWITCH_TYPE_PORTS: 
     362                ports = alloca(sizeof(struct switch_port) * dev->ports); 
     363                memset(ports, 0, sizeof(struct switch_port) * dev->ports); 
     364                val.len = 0; 
     365                ptr = (char *)str; 
     366                while(ptr && *ptr) 
     367                { 
     368                        ports[val.len].flags = 0; 
     369                        ports[val.len].id = strtoul(ptr, &ptr, 10); 
     370                        while(*ptr && !isspace(*ptr)) { 
     371                                if (*ptr == 't') 
     372                                        ports[val.len].flags |= SWLIB_PORT_FLAG_TAGGED; 
     373                                ptr++; 
     374                        } 
     375                        if (*ptr) 
     376                                ptr++; 
     377                        val.len++; 
     378                } 
     379                val.value.ports = ports; 
     380                break; 
     381        case SWITCH_TYPE_NOVAL: 
     382                break; 
     383        default: 
     384                return -1; 
     385        } 
     386        return swlib_set_attr(dev, a, &val); 
     387} 
     388 
    346389 
    347390struct attrlist_arg { 
  • trunk/package/swconfig/src/swlib.h

    r13009 r15315  
    22 * swlib.h: Switch configuration API (user space part) 
    33 * 
    4  * Copyright (C) 2008 Felix Fietkau <nbd@openwrt.org> 
     4 * Copyright (C) 2008-2009 Felix Fietkau <nbd@openwrt.org> 
    55 * 
    66 * This program is free software; you can redistribute it and/or 
     
    111111struct switch_port; 
    112112struct switch_val; 
     113struct uci_package; 
    113114 
    114115struct switch_dev { 
     
    201202 
    202203/** 
     204 * swlib_set_attr_string: set the value for an attribute with type conversion 
     205 * @dev: switch device struct 
     206 * @attr: switch attribute struct 
     207 * @port_vlan: port or vlan (if applicable) 
     208 * @str: string value 
     209 * returns 0 on success 
     210 */ 
     211int swlib_set_attr_string(struct switch_dev *dev, struct switch_attr *attr, 
     212                int port_vlan, const char *str); 
     213 
     214/** 
    203215 * swlib_get_attr: get the value for an attribute 
    204216 * @dev: switch device struct 
     
    211223                struct switch_val *val); 
    212224 
     225/** 
     226 * swlib_apply_from_uci: set up the switch from a uci configuration 
     227 * @dev: switch device struct 
     228 * @p: uci package which contains the desired global config 
     229 */ 
     230int swlib_apply_from_uci(struct switch_dev *dev, struct uci_package *p); 
     231 
    213232#endif 
Note: See TracChangeset for help on using the changeset viewer.