swconfig: parse "switch_vlan" before "switch_port"
[openwrt/staging/noltari.git] / package / network / config / swconfig / src / uci.c
index f99583b483a7842e003323bf0f949a43d8178cf9..200069f94f3eea5fd6fbf922de201cf5506893c5 100644 (file)
@@ -164,32 +164,7 @@ found:
                struct uci_element *os;
                s = uci_to_section(e);
 
-               if (!strcmp(s->type, "switch_port")) {
-                       char *devn = NULL, *port = NULL, *port_err = NULL;
-                       int port_n;
-
-                       uci_foreach_element(&s->options, os) {
-                               o = uci_to_option(os);
-                               if (o->type != UCI_TYPE_STRING)
-                                       continue;
-
-                               if (!strcmp(os->name, "device")) {
-                                       devn = o->v.string;
-                                       if (!swlib_match_name(dev, devn))
-                                               devn = NULL;
-                               } else if (!strcmp(os->name, "port")) {
-                                       port = o->v.string;
-                               }
-                       }
-                       if (!devn || !port || !port[0])
-                               continue;
-
-                       port_n = strtoul(port, &port_err, 0);
-                       if (port_err && port_err[0])
-                               continue;
-
-                       swlib_map_settings(dev, SWLIB_ATTR_GROUP_PORT, port_n, s);
-               } else if (!strcmp(s->type, "switch_vlan")) {
+               if (!strcmp(s->type, "switch_vlan")) {
                        char *devn = NULL, *vlan = NULL, *vlan_err = NULL;
                        int vlan_n;
 
@@ -216,6 +191,38 @@ found:
                        swlib_map_settings(dev, SWLIB_ATTR_GROUP_VLAN, vlan_n, s);
                }
        }
+       uci_foreach_element(&p->sections, e) {
+               struct uci_element *os;
+               char *devn = NULL, *port = NULL, *port_err = NULL;
+               int port_n;
+
+               s = uci_to_section(e);
+
+               if (strcmp(s->type, "switch_port"))
+                       continue;
+
+               uci_foreach_element(&s->options, os) {
+                       o = uci_to_option(os);
+                       if (o->type != UCI_TYPE_STRING)
+                               continue;
+
+                       if (!strcmp(os->name, "device")) {
+                               devn = o->v.string;
+                               if (!swlib_match_name(dev, devn))
+                                       devn = NULL;
+                       } else if (!strcmp(os->name, "port")) {
+                               port = o->v.string;
+                       }
+               }
+               if (!devn || !port || !port[0])
+                       continue;
+
+               port_n = strtoul(port, &port_err, 0);
+               if (port_err && port_err[0])
+                       continue;
+
+               swlib_map_settings(dev, SWLIB_ATTR_GROUP_PORT, port_n, s);
+       }
 
        for (i = 0; i < ARRAY_SIZE(early_settings); i++) {
                struct swlib_setting *st = &early_settings[i];