]> git.proxmox.com Git - mirror_iproute2.git/blobdiff - tc/q_hfsc.c
tc: B.W limits can now be specified in %.
[mirror_iproute2.git] / tc / q_hfsc.c
index dc9fed930fc03ac8afabf8480dfdb8b44ddddc01..597a659a779221081d91894510b8e2387a4af0c1 100644 (file)
@@ -23,7 +23,7 @@
 #include "utils.h"
 #include "tc_util.h"
 
-static int hfsc_get_sc(int *, char ***, struct tc_service_curve *);
+static int hfsc_get_sc(int *, char ***, struct tc_service_curve *, const char *);
 
 
 static void
@@ -70,7 +70,7 @@ explain1(char *arg)
 }
 
 static int
-hfsc_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n)
+hfsc_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev)
 {
        struct tc_hfsc_qopt qopt = {};
 
@@ -141,7 +141,7 @@ hfsc_print_xstats(struct qdisc_util *qu, FILE *f, struct rtattr *xstats)
 
 static int
 hfsc_parse_class_opt(struct qdisc_util *qu, int argc, char **argv,
-                    struct nlmsghdr *n)
+                    struct nlmsghdr *n, const char *dev)
 {
        struct tc_service_curve rsc = {}, fsc = {}, usc = {};
        int rsc_ok = 0, fsc_ok = 0, usc_ok = 0;
@@ -150,21 +150,21 @@ hfsc_parse_class_opt(struct qdisc_util *qu, int argc, char **argv,
        while (argc > 0) {
                if (matches(*argv, "rt") == 0) {
                        NEXT_ARG();
-                       if (hfsc_get_sc(&argc, &argv, &rsc) < 0) {
+                       if (hfsc_get_sc(&argc, &argv, &rsc, dev) < 0) {
                                explain1("rt");
                                return -1;
                        }
                        rsc_ok = 1;
                } else if (matches(*argv, "ls") == 0) {
                        NEXT_ARG();
-                       if (hfsc_get_sc(&argc, &argv, &fsc) < 0) {
+                       if (hfsc_get_sc(&argc, &argv, &fsc, dev) < 0) {
                                explain1("ls");
                                return -1;
                        }
                        fsc_ok = 1;
                } else if (matches(*argv, "sc") == 0) {
                        NEXT_ARG();
-                       if (hfsc_get_sc(&argc, &argv, &rsc) < 0) {
+                       if (hfsc_get_sc(&argc, &argv, &rsc, dev) < 0) {
                                explain1("sc");
                                return -1;
                        }
@@ -173,7 +173,7 @@ hfsc_parse_class_opt(struct qdisc_util *qu, int argc, char **argv,
                        fsc_ok = 1;
                } else if (matches(*argv, "ul") == 0) {
                        NEXT_ARG();
-                       if (hfsc_get_sc(&argc, &argv, &usc) < 0) {
+                       if (hfsc_get_sc(&argc, &argv, &usc, dev) < 0) {
                                explain1("ul");
                                return -1;
                        }
@@ -281,7 +281,7 @@ struct qdisc_util hfsc_qdisc_util = {
 };
 
 static int
-hfsc_get_sc1(int *argcp, char ***argvp, struct tc_service_curve *sc)
+hfsc_get_sc1(int *argcp, char ***argvp, struct tc_service_curve *sc, const char *dev)
 {
        char **argv = *argvp;
        int argc = *argcp;
@@ -289,7 +289,12 @@ hfsc_get_sc1(int *argcp, char ***argvp, struct tc_service_curve *sc)
 
        if (matches(*argv, "m1") == 0) {
                NEXT_ARG();
-               if (get_rate(&m1, *argv) < 0) {
+               if (strchr(*argv, '%')) {
+                       if (get_percent_rate(&m1, *argv, dev)) {
+                               explain1("m1");
+                               return -1;
+                       }
+               } else if (get_rate(&m1, *argv) < 0) {
                        explain1("m1");
                        return -1;
                }
@@ -307,7 +312,12 @@ hfsc_get_sc1(int *argcp, char ***argvp, struct tc_service_curve *sc)
 
        if (matches(*argv, "m2") == 0) {
                NEXT_ARG();
-               if (get_rate(&m2, *argv) < 0) {
+               if (strchr(*argv, '%')) {
+                       if (get_percent_rate(&m2, *argv, dev)) {
+                               explain1("m2");
+                               return -1;
+                       }
+               } else if (get_rate(&m2, *argv) < 0) {
                        explain1("m2");
                        return -1;
                }
@@ -324,7 +334,7 @@ hfsc_get_sc1(int *argcp, char ***argvp, struct tc_service_curve *sc)
 }
 
 static int
-hfsc_get_sc2(int *argcp, char ***argvp, struct tc_service_curve *sc)
+hfsc_get_sc2(int *argcp, char ***argvp, struct tc_service_curve *sc, const char *dev)
 {
        char **argv = *argvp;
        int argc = *argcp;
@@ -350,7 +360,12 @@ hfsc_get_sc2(int *argcp, char ***argvp, struct tc_service_curve *sc)
 
        if (matches(*argv, "rate") == 0) {
                NEXT_ARG();
-               if (get_rate(&rate, *argv) < 0) {
+               if (strchr(*argv, '%')) {
+                       if (get_percent_rate(&rate, *argv, dev)) {
+                               explain1("rate");
+                               return -1;
+                       }
+               } else if (get_rate(&rate, *argv) < 0) {
                        explain1("rate");
                        return -1;
                }
@@ -386,10 +401,10 @@ hfsc_get_sc2(int *argcp, char ***argvp, struct tc_service_curve *sc)
 }
 
 static int
-hfsc_get_sc(int *argcp, char ***argvp, struct tc_service_curve *sc)
+hfsc_get_sc(int *argcp, char ***argvp, struct tc_service_curve *sc, const char *dev)
 {
-       if (hfsc_get_sc1(argcp, argvp, sc) < 0 &&
-           hfsc_get_sc2(argcp, argvp, sc) < 0)
+       if (hfsc_get_sc1(argcp, argvp, sc, dev) < 0 &&
+           hfsc_get_sc2(argcp, argvp, sc, dev) < 0)
                return -1;
 
        if (sc->m1 == 0 && sc->m2 == 0) {