]> git.proxmox.com Git - mirror_iproute2.git/blobdiff - bridge/link.c
bridge link: add support to specify master
[mirror_iproute2.git] / bridge / link.c
index 3f77aabe615f1933873bdec40eaf5a1774aff4d6..aa40692d28edac2afe9fb04182697614b3ded3c8 100644 (file)
@@ -188,6 +188,9 @@ int print_linkinfo(const struct sockaddr_nl *who,
                                if (prtb[IFLA_BRPORT_LEARNING])
                                        print_onoff(fp, "learning",
                                                    rta_getattr_u8(prtb[IFLA_BRPORT_LEARNING]));
+                               if (prtb[IFLA_BRPORT_LEARNING_SYNC])
+                                       print_onoff(fp, "learning_sync",
+                                                   rta_getattr_u8(prtb[IFLA_BRPORT_LEARNING_SYNC]));
                                if (prtb[IFLA_BRPORT_UNICAST_FLOOD])
                                        print_onoff(fp, "flood",
                                                    rta_getattr_u8(prtb[IFLA_BRPORT_UNICAST_FLOOD]));
@@ -221,8 +224,10 @@ static void usage(void)
        fprintf(stderr, "                               [ fastleave {on | off} ]\n");
        fprintf(stderr, "                               [ root_block {on | off} ]\n");
        fprintf(stderr, "                               [ learning {on | off} ]\n");
+       fprintf(stderr, "                               [ learning_sync {on | off} ]\n");
        fprintf(stderr, "                               [ flood {on | off} ]\n");
        fprintf(stderr, "                               [ hwmode {vepa | veb} ]\n");
+       fprintf(stderr, "                               [ self ] [ master ]\n");
        fprintf(stderr, "       bridge link show [dev DEV]\n");
        exit(-1);
 }
@@ -252,6 +257,7 @@ static int brlink_modify(int argc, char **argv)
        } req;
        char *d = NULL;
        __s8 learning = -1;
+       __s8 learning_sync = -1;
        __s8 flood = -1;
        __s8 hairpin = -1;
        __s8 bpdu_guard = -1;
@@ -295,6 +301,10 @@ static int brlink_modify(int argc, char **argv)
                        NEXT_ARG();
                        if (!on_off("learning", &learning, *argv))
                                exit(-1);
+               } else if (strcmp(*argv, "learning_sync") == 0) {
+                       NEXT_ARG();
+                       if (!on_off("learning_sync", &learning_sync, *argv))
+                               exit(-1);
                } else if (strcmp(*argv, "flood") == 0) {
                        NEXT_ARG();
                        if (!on_off("flood", &flood, *argv))
@@ -307,7 +317,19 @@ static int brlink_modify(int argc, char **argv)
                        priority = atoi(*argv);
                } else if (strcmp(*argv, "state") == 0) {
                        NEXT_ARG();
-                       state = atoi(*argv);
+                       char *endptr;
+                       size_t nstates = sizeof(port_states) / sizeof(*port_states);
+                       state = strtol(*argv, &endptr, 10);
+                       if (!(**argv != '\0' && *endptr == '\0')) {
+                               for (state = 0; state < nstates; state++)
+                                       if (strcmp(port_states[state], *argv) == 0)
+                                               break;
+                               if (state == nstates) {
+                                       fprintf(stderr,
+                                               "Error: invalid STP port state\n");
+                                       exit(-1);
+                               }
+                       }
                } else if (strcmp(*argv, "hwmode") == 0) {
                        NEXT_ARG();
                        flags = BRIDGE_FLAGS_SELF;
@@ -322,7 +344,9 @@ static int brlink_modify(int argc, char **argv)
                                exit(-1);
                        }
                } else if (strcmp(*argv, "self") == 0) {
-                       flags = BRIDGE_FLAGS_SELF;
+                       flags |= BRIDGE_FLAGS_SELF;
+               } else if (strcmp(*argv, "master") == 0) {
+                       flags |= BRIDGE_FLAGS_MASTER;
                } else {
                        usage();
                }
@@ -359,6 +383,9 @@ static int brlink_modify(int argc, char **argv)
                addattr8(&req.n, sizeof(req), IFLA_BRPORT_UNICAST_FLOOD, flood);
        if (learning >= 0)
                addattr8(&req.n, sizeof(req), IFLA_BRPORT_LEARNING, learning);
+       if (learning_sync >= 0)
+               addattr8(&req.n, sizeof(req), IFLA_BRPORT_LEARNING_SYNC,
+                        learning_sync);
 
        if (cost > 0)
                addattr32(&req.n, sizeof(req), IFLA_BRPORT_COST, cost);