]> git.proxmox.com Git - mirror_iproute2.git/blobdiff - bridge/link.c
dcb: Add a subtool for the DCB APP object
[mirror_iproute2.git] / bridge / link.c
index 04cfc1445833ee882c4338b2755465d34321af15..d88c469db78e4dbfe6a743c7c445872b305f4909 100644 (file)
@@ -78,14 +78,6 @@ static void print_portstate(__u8 state)
                             "state (%d) ", state);
 }
 
-static void print_onoff(FILE *fp, const char *flag, __u8 val)
-{
-       if (is_json_context())
-               print_bool(PRINT_JSON, flag, NULL, val);
-       else
-               fprintf(fp, "%s %s ", flag, val ? "on" : "off");
-}
-
 static void print_hwmode(__u16 mode)
 {
        if (mode >= ARRAY_SIZE(hw_mode))
@@ -123,38 +115,38 @@ static void print_protinfo(FILE *fp, struct rtattr *attr)
                        fprintf(fp, "%s    ", _SL_);
 
                if (prtb[IFLA_BRPORT_MODE])
-                       print_onoff(fp, "hairpin",
-                                   rta_getattr_u8(prtb[IFLA_BRPORT_MODE]));
+                       print_on_off(PRINT_ANY, "hairpin", "hairpin %s ",
+                                    rta_getattr_u8(prtb[IFLA_BRPORT_MODE]));
                if (prtb[IFLA_BRPORT_GUARD])
-                       print_onoff(fp, "guard",
-                                   rta_getattr_u8(prtb[IFLA_BRPORT_GUARD]));
+                       print_on_off(PRINT_ANY, "guard", "guard %s ",
+                                    rta_getattr_u8(prtb[IFLA_BRPORT_GUARD]));
                if (prtb[IFLA_BRPORT_PROTECT])
-                       print_onoff(fp, "root_block",
-                                   rta_getattr_u8(prtb[IFLA_BRPORT_PROTECT]));
+                       print_on_off(PRINT_ANY, "root_block", "root_block %s ",
+                                    rta_getattr_u8(prtb[IFLA_BRPORT_PROTECT]));
                if (prtb[IFLA_BRPORT_FAST_LEAVE])
-                       print_onoff(fp, "fastleave",
-                                   rta_getattr_u8(prtb[IFLA_BRPORT_FAST_LEAVE]));
+                       print_on_off(PRINT_ANY, "fastleave", "fastleave %s ",
+                                    rta_getattr_u8(prtb[IFLA_BRPORT_FAST_LEAVE]));
                if (prtb[IFLA_BRPORT_LEARNING])
-                       print_onoff(fp, "learning",
-                                   rta_getattr_u8(prtb[IFLA_BRPORT_LEARNING]));
+                       print_on_off(PRINT_ANY, "learning", "learning %s ",
+                                    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]));
+                       print_on_off(PRINT_ANY, "learning_sync", "learning_sync %s ",
+                                    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]));
+                       print_on_off(PRINT_ANY, "flood", "flood %s ",
+                                    rta_getattr_u8(prtb[IFLA_BRPORT_UNICAST_FLOOD]));
                if (prtb[IFLA_BRPORT_MCAST_FLOOD])
-                       print_onoff(fp, "mcast_flood",
-                                   rta_getattr_u8(prtb[IFLA_BRPORT_MCAST_FLOOD]));
+                       print_on_off(PRINT_ANY, "mcast_flood", "mcast_flood %s ",
+                                    rta_getattr_u8(prtb[IFLA_BRPORT_MCAST_FLOOD]));
                if (prtb[IFLA_BRPORT_MCAST_TO_UCAST])
-                       print_onoff(fp, "mcast_to_unicast",
-                                   rta_getattr_u8(prtb[IFLA_BRPORT_MCAST_TO_UCAST]));
+                       print_on_off(PRINT_ANY, "mcast_to_unicast", "mcast_to_unicast %s ",
+                                    rta_getattr_u8(prtb[IFLA_BRPORT_MCAST_TO_UCAST]));
                if (prtb[IFLA_BRPORT_NEIGH_SUPPRESS])
-                       print_onoff(fp, "neigh_suppress",
-                                   rta_getattr_u8(prtb[IFLA_BRPORT_NEIGH_SUPPRESS]));
+                       print_on_off(PRINT_ANY, "neigh_suppress", "neigh_suppress %s ",
+                                    rta_getattr_u8(prtb[IFLA_BRPORT_NEIGH_SUPPRESS]));
                if (prtb[IFLA_BRPORT_VLAN_TUNNEL])
-                       print_onoff(fp, "vlan_tunnel",
-                                   rta_getattr_u8(prtb[IFLA_BRPORT_VLAN_TUNNEL]));
+                       print_on_off(PRINT_ANY, "vlan_tunnel", "vlan_tunnel %s ",
+                                    rta_getattr_u8(prtb[IFLA_BRPORT_VLAN_TUNNEL]));
 
                if (prtb[IFLA_BRPORT_BACKUP_PORT]) {
                        int ifidx;
@@ -166,8 +158,8 @@ static void print_protinfo(FILE *fp, struct rtattr *attr)
                }
 
                if (prtb[IFLA_BRPORT_ISOLATED])
-                       print_onoff(fp, "isolated",
-                                   rta_getattr_u8(prtb[IFLA_BRPORT_ISOLATED]));
+                       print_on_off(PRINT_ANY, "isolated", "isolated %s ",
+                                    rta_getattr_u8(prtb[IFLA_BRPORT_ISOLATED]));
        } else
                print_portstate(rta_getattr_u8(attr));
 }
@@ -254,42 +246,27 @@ int print_linkinfo(struct nlmsghdr *n, void *arg)
 
 static void usage(void)
 {
-       fprintf(stderr, "Usage: bridge link set dev DEV [ cost COST ] [ priority PRIO ] [ state STATE ]\n");
-       fprintf(stderr, "                               [ guard {on | off} ]\n");
-       fprintf(stderr, "                               [ hairpin {on | off} ]\n");
-       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, "                               [ mcast_flood {on | off} ]\n");
-       fprintf(stderr, "                               [ mcast_to_unicast {on | off} ]\n");
-       fprintf(stderr, "                               [ neigh_suppress {on | off} ]\n");
-       fprintf(stderr, "                               [ vlan_tunnel {on | off} ]\n");
-       fprintf(stderr, "                               [ isolated {on | off} ]\n");
-       fprintf(stderr, "                               [ hwmode {vepa | veb} ]\n");
-       fprintf(stderr, "                               [ backup_port DEVICE ] [ nobackup_port ]\n");
-       fprintf(stderr, "                               [ self ] [ master ]\n");
-       fprintf(stderr, "       bridge link show [dev DEV]\n");
+       fprintf(stderr,
+               "Usage: bridge link set dev DEV [ cost COST ] [ priority PRIO ] [ state STATE ]\n"
+               "                               [ guard {on | off} ]\n"
+               "                               [ hairpin {on | off} ]\n"
+               "                               [ fastleave {on | off} ]\n"
+               "                               [ root_block {on | off} ]\n"
+               "                               [ learning {on | off} ]\n"
+               "                               [ learning_sync {on | off} ]\n"
+               "                               [ flood {on | off} ]\n"
+               "                               [ mcast_flood {on | off} ]\n"
+               "                               [ mcast_to_unicast {on | off} ]\n"
+               "                               [ neigh_suppress {on | off} ]\n"
+               "                               [ vlan_tunnel {on | off} ]\n"
+               "                               [ isolated {on | off} ]\n"
+               "                               [ hwmode {vepa | veb} ]\n"
+               "                               [ backup_port DEVICE ] [ nobackup_port ]\n"
+               "                               [ self ] [ master ]\n"
+               "       bridge link show [dev DEV]\n");
        exit(-1);
 }
 
-static bool on_off(char *arg, __s8 *attr, char *val)
-{
-       if (strcmp(val, "on") == 0)
-               *attr = 1;
-       else if (strcmp(val, "off") == 0)
-               *attr = 0;
-       else {
-               fprintf(stderr,
-                       "Error: argument of \"%s\" must be \"on\" or \"off\"\n",
-                       arg);
-               return false;
-       }
-
-       return true;
-}
-
 static int brlink_modify(int argc, char **argv)
 {
        struct {
@@ -322,6 +299,7 @@ static int brlink_modify(int argc, char **argv)
        __s16 mode = -1;
        __u16 flags = 0;
        struct rtattr *nest;
+       int ret;
 
        while (argc > 0) {
                if (strcmp(*argv, "dev") == 0) {
@@ -329,40 +307,49 @@ static int brlink_modify(int argc, char **argv)
                        d = *argv;
                } else if (strcmp(*argv, "guard") == 0) {
                        NEXT_ARG();
-                       if (!on_off("guard", &bpdu_guard, *argv))
-                               return -1;
+                       bpdu_guard = parse_on_off("guard", *argv, &ret);
+                       if (ret)
+                               return ret;
                } else if (strcmp(*argv, "hairpin") == 0) {
                        NEXT_ARG();
-                       if (!on_off("hairpin", &hairpin, *argv))
-                               return -1;
+                       hairpin = parse_on_off("hairpin", *argv, &ret);
+                       if (ret)
+                               return ret;
                } else if (strcmp(*argv, "fastleave") == 0) {
                        NEXT_ARG();
-                       if (!on_off("fastleave", &fast_leave, *argv))
-                               return -1;
+                       fast_leave = parse_on_off("fastleave", *argv, &ret);
+                       if (ret)
+                               return ret;
                } else if (strcmp(*argv, "root_block") == 0) {
                        NEXT_ARG();
-                       if (!on_off("root_block", &root_block, *argv))
-                               return -1;
+                       root_block = parse_on_off("root_block", *argv, &ret);
+                       if (ret)
+                               return ret;
                } else if (strcmp(*argv, "learning") == 0) {
                        NEXT_ARG();
-                       if (!on_off("learning", &learning, *argv))
-                               return -1;
+                       learning = parse_on_off("learning", *argv, &ret);
+                       if (ret)
+                               return ret;
                } else if (strcmp(*argv, "learning_sync") == 0) {
                        NEXT_ARG();
-                       if (!on_off("learning_sync", &learning_sync, *argv))
-                               return -1;
+                       learning_sync = parse_on_off("learning_sync", *argv, &ret);
+                       if (ret)
+                               return ret;
                } else if (strcmp(*argv, "flood") == 0) {
                        NEXT_ARG();
-                       if (!on_off("flood", &flood, *argv))
-                               return -1;
+                       flood = parse_on_off("flood", *argv, &ret);
+                       if (ret)
+                               return ret;
                } else if (strcmp(*argv, "mcast_flood") == 0) {
                        NEXT_ARG();
-                       if (!on_off("mcast_flood", &mcast_flood, *argv))
-                               return -1;
+                       mcast_flood = parse_on_off("mcast_flood", *argv, &ret);
+                       if (ret)
+                               return ret;
                } else if (strcmp(*argv, "mcast_to_unicast") == 0) {
                        NEXT_ARG();
-                       if (!on_off("mcast_to_unicast", &mcast_to_unicast, *argv))
-                               return -1;
+                       mcast_to_unicast = parse_on_off("mcast_to_unicast", *argv, &ret);
+                       if (ret)
+                               return ret;
                } else if (strcmp(*argv, "cost") == 0) {
                        NEXT_ARG();
                        cost = atoi(*argv);
@@ -377,7 +364,7 @@ static int brlink_modify(int argc, char **argv)
                        state = strtol(*argv, &endptr, 10);
                        if (!(**argv != '\0' && *endptr == '\0')) {
                                for (state = 0; state < nstates; state++)
-                                       if (strcmp(port_states[state], *argv) == 0)
+                                       if (strcasecmp(port_states[state], *argv) == 0)
                                                break;
                                if (state == nstates) {
                                        fprintf(stderr,
@@ -403,18 +390,19 @@ static int brlink_modify(int argc, char **argv)
                        flags |= BRIDGE_FLAGS_MASTER;
                } else if (strcmp(*argv, "neigh_suppress") == 0) {
                        NEXT_ARG();
-                       if (!on_off("neigh_suppress", &neigh_suppress,
-                                   *argv))
-                               return -1;
+                       neigh_suppress = parse_on_off("neigh_suppress", *argv, &ret);
+                       if (ret)
+                               return ret;
                } else if (strcmp(*argv, "vlan_tunnel") == 0) {
                        NEXT_ARG();
-                       if (!on_off("vlan_tunnel", &vlan_tunnel,
-                                   *argv))
-                               return -1;
+                       vlan_tunnel = parse_on_off("vlan_tunnel", *argv, &ret);
+                       if (ret)
+                               return ret;
                } else if (strcmp(*argv, "isolated") == 0) {
                        NEXT_ARG();
-                       if (!on_off("isolated", &isolated, *argv))
-                               return -1;
+                       isolated = parse_on_off("isolated", *argv, &ret);
+                       if (ret)
+                               return ret;
                } else if (strcmp(*argv, "backup_port") == 0) {
                        NEXT_ARG();
                        backup_port_idx = ll_name_to_index(*argv);