Changeset 36284


Ignore:
Timestamp:
2013-04-09T16:19:13+02:00 (5 years ago)
Author:
blogic
Message:

[swconfig] add portmap support to userland

Signed-off-by: John Crispin <blogic@…>

Location:
trunk/package/network/config/swconfig
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/network/config/swconfig/Makefile

    r34679 r36284  
    2727        -I$(STAGING_DIR)/usr/include/libnl-tiny \ 
    2828        -I$(PKG_BUILD_DIR) \ 
    29         $(TARGET_CPPFLAGS) 
     29        $(TARGET_CPPFLAGS) \ 
     30        -I$(LINUX_DIR)/user_headers/include 
    3031 
    3132define Build/Prepare 
  • trunk/package/network/config/swconfig/src/cli.c

    r36282 r36284  
    4242        CMD_HELP, 
    4343        CMD_SHOW, 
     44        CMD_PORTMAP, 
    4445}; 
    4546 
     
    215216        char *ckey = NULL; 
    216217        char *cvalue = NULL; 
     218        char *csegment = NULL; 
    217219 
    218220        if((argc == 2) && !strcmp(argv[1], "list")) { 
     
    253255                        cmd = CMD_LOAD; 
    254256                        ckey = argv[++i]; 
     257                } else if (!strcmp(arg, "portmap")) { 
     258                        if (i + 1 < argc) 
     259                                csegment = argv[++i]; 
     260                        cmd = CMD_PORTMAP; 
    255261                } else if (!strcmp(arg, "show")) { 
    256262                        cmd = CMD_SHOW; 
     
    324330        case CMD_HELP: 
    325331                list_attributes(dev); 
     332                break; 
     333        case CMD_PORTMAP: 
     334                swlib_print_portmap(dev, csegment); 
    326335                break; 
    327336        case CMD_SHOW: 
  • trunk/package/network/config/swconfig/src/swlib.c

    r36282 r36284  
    4242static int refcount = 0; 
    4343 
    44 static struct nla_policy port_policy[] = { 
     44static struct nla_policy port_policy[SWITCH_ATTR_MAX] = { 
    4545        [SWITCH_PORT_ID] = { .type = NLA_U32 }, 
    4646        [SWITCH_PORT_FLAG_TAGGED] = { .type = NLA_FLAG }, 
     47}; 
     48 
     49static struct nla_policy portmap_policy[SWITCH_PORTMAP_MAX] = { 
     50        [SWITCH_PORTMAP_SEGMENT] = { .type = NLA_STRING }, 
     51        [SWITCH_PORTMAP_VIRT] = { .type = NLA_U32 }, 
    4752}; 
    4853 
     
    573578        struct switch_dev *ptr; 
    574579}; 
     580 
     581static int 
     582add_port_map(struct switch_dev *dev, struct nlattr *nla) 
     583{ 
     584        struct nlattr *p; 
     585        int err = 0, idx = 0; 
     586        int remaining; 
     587 
     588        dev->maps = malloc(sizeof(struct switch_portmap) * dev->ports); 
     589        if (!dev->maps) 
     590                return -1; 
     591        memset(dev->maps, 0, sizeof(struct switch_portmap) * dev->ports); 
     592 
     593        nla_for_each_nested(p, nla, remaining) { 
     594                struct nlattr *tb[SWITCH_PORTMAP_MAX+1]; 
     595 
     596                if (idx >= dev->ports) 
     597                        continue; 
     598 
     599                err = nla_parse_nested(tb, SWITCH_PORTMAP_MAX, p, portmap_policy); 
     600                if (err < 0) 
     601                        continue; 
     602 
     603 
     604                if (tb[SWITCH_PORTMAP_SEGMENT] && tb[SWITCH_PORTMAP_VIRT]) { 
     605                        dev->maps[idx].segment = strdup(nla_get_string(tb[SWITCH_PORTMAP_SEGMENT])); 
     606                        dev->maps[idx].virt = nla_get_u32(tb[SWITCH_PORTMAP_VIRT]); 
     607                } 
     608                idx++; 
     609        } 
     610 
     611out: 
     612        return err; 
     613} 
     614 
    575615 
    576616static int 
     
    611651        if (tb[SWITCH_ATTR_CPU_PORT]) 
    612652                dev->cpu_port = nla_get_u32(tb[SWITCH_ATTR_CPU_PORT]); 
     653        if (tb[SWITCH_ATTR_PORTMAP]) 
     654                add_port_map(dev, tb[SWITCH_ATTR_PORTMAP]); 
    613655 
    614656        if (!sa->head) { 
     
    656698} 
    657699 
     700void 
     701swlib_print_portmap(struct switch_dev *dev, char *segment) 
     702{ 
     703        int i; 
     704 
     705        if (segment) { 
     706                if (!strcmp(segment, "cpu")) { 
     707                        printf("%d ", dev->cpu_port); 
     708                } else if (!strcmp(segment, "disabled")) { 
     709                        for (i = 0; i < dev->ports; i++) 
     710                                if (!dev->maps[i].segment) 
     711                                        printf("%d ", i); 
     712                } else for (i = 0; i < dev->ports; i++) { 
     713                        if (dev->maps[i].segment && !strcmp(dev->maps[i].segment, segment)) 
     714                                printf("%d ", i); 
     715                } 
     716        } else { 
     717                printf("%s - %s\n", dev->dev_name, dev->name); 
     718                for (i = 0; i < dev->ports; i++) 
     719                        if (i == dev->cpu_port) 
     720                                printf("port%d:\tcpu\n", i); 
     721                        else if (dev->maps[i].segment) 
     722                                printf("port%d:\t%s.%d\n", i, dev->maps[i].segment, dev->maps[i].virt); 
     723                        else 
     724                                printf("port%d:\tdisabled\n", i); 
     725        } 
     726} 
     727 
    658728struct switch_dev * 
    659729swlib_connect(const char *name) 
  • trunk/package/network/config/swconfig/src/swlib.h

    r36282 r36284  
    110110struct switch_attr; 
    111111struct switch_port; 
     112struct switch_port_map; 
    112113struct switch_val; 
    113114struct uci_package; 
     
    124125        struct switch_attr *port_ops; 
    125126        struct switch_attr *vlan_ops; 
     127        struct switch_portmap *maps; 
    126128        struct switch_dev *next; 
    127129        void *priv; 
     
    155157}; 
    156158 
     159struct switch_portmap { 
     160        unsigned int virt; 
     161        const char *segment; 
     162}; 
     163 
    157164/** 
    158165 * swlib_list: list all switches 
    159166 */ 
    160167void swlib_list(void); 
     168 
     169/** 
     170 * swlib_print_portmap: get portmap 
     171 * @dev: switch device struct 
     172 */ 
     173void swlib_print_portmap(struct switch_dev *dev, char *segment); 
    161174 
    162175/** 
Note: See TracChangeset for help on using the changeset viewer.