From f63968d217f4d7aeabd3194781e0f4c7c6f18970 Mon Sep 17 00:00:00 2001 From: Shashank Balashankar Date: Fri, 31 May 2013 14:33:17 -0700 Subject: [PATCH 1/1] tc: Add flow control setting on PRIO qdisc Enable filter fw, qdiscs prio, and qdisc fifo. Add "flow enable|disable" clause for PRIO qdisc Now using sanitized kernel headers --- tc/Makefile | 2 +- tc/q_prio.c | 24 +++++++++++++++++++++--- tc/tc.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ tc/tc_qdisc.c | 4 +++- 4 files changed, 72 insertions(+), 5 deletions(-) mode change 100644 => 100755 tc/Makefile mode change 100644 => 100755 tc/q_prio.c mode change 100644 => 100755 tc/tc.c mode change 100644 => 100755 tc/tc_qdisc.c diff --git a/tc/Makefile b/tc/Makefile old mode 100644 new mode 100755 index 9cc1bf0..141cf9d --- a/tc/Makefile +++ b/tc/Makefile @@ -82,7 +82,7 @@ TCLIB += tc_cbq.o TCLIB += tc_estimator.o TCLIB += tc_stab.o -CFLAGS += -DCONFIG_GACT -DCONFIG_GACT_PROB +CFLAGS += -DCONFIG_GACT -DCONFIG_GACT_PROB -DANDROID -DFEATURE_PRIO ifneq ($(IPT_LIB_DIR),) CFLAGS += -DIPT_LIB_DIR=\"$(IPT_LIB_DIR)\" endif diff --git a/tc/q_prio.c b/tc/q_prio.c old mode 100644 new mode 100755 index 2f54d55..3bae52c --- a/tc/q_prio.c +++ b/tc/q_prio.c @@ -19,20 +19,21 @@ #include #include #include +#include #include "utils.h" #include "tc_util.h" static void explain(void) { - fprintf(stderr, "Usage: ... prio bands NUMBER priomap P1 P2...[multiqueue]\n"); + fprintf(stderr, "Usage: ... prio bands NUMBER priomap P1 P2...[multiqueue] [flow (enable|disable)]\n"); } static int prio_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n) { int pmap_mode = 0; int idx = 0; - struct tc_prio_qopt opt={3,{ 1, 2, 2, 2, 1, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 }}; + struct tc_prio_qopt opt={3,{ 1, 2, 2, 2, 1, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 },1}; struct rtattr *nest; unsigned char mq = 0; @@ -53,6 +54,21 @@ static int prio_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct n pmap_mode = 1; } else if (strcmp(*argv, "multiqueue") == 0) { mq = 1; + } else if (strcmp(*argv, "flow") == 0) { + NEXT_ARG(); + if (strcmp(*argv, "enable") == 0) + { + opt.enable_flow = 1; + } + else if (strcmp(*argv, "disable") == 0) + { + opt.enable_flow = 0; + } + else + { + explain(); + return -1; + } } else if (strcmp(*argv, "help") == 0) { explain(); return -1; @@ -114,6 +130,9 @@ int prio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) fprintf(f, " multiqueue: %s ", *(unsigned char *)RTA_DATA(tb[TCA_PRIO_MQ]) ? "on" : "off"); + if (qu && !strcmp(qu->id, "prio")) + fprintf(f, " flow %s", qopt->enable_flow ? "enabled" : "disabled"); + return 0; } @@ -122,4 +141,3 @@ struct qdisc_util prio_qdisc_util = { .parse_qopt = prio_parse_opt, .print_qopt = prio_print_opt, }; - diff --git a/tc/tc.c b/tc/tc.c old mode 100644 new mode 100755 index 8e362d2..bc58e3e --- a/tc/tc.c +++ b/tc/tc.c @@ -44,6 +44,19 @@ static void *BODY = NULL; /* cached handle dlopen(NULL) */ static struct qdisc_util * qdisc_list; static struct filter_util * filter_list; +#ifdef ANDROID +extern struct qdisc_util cbq_qdisc_util; +extern struct qdisc_util htb_qdisc_util; +extern struct qdisc_util ingress_qdisc_util; +extern struct filter_util u32_filter_util; +#ifdef FEATURE_PRIO +extern struct filter_util fw_filter_util; +extern struct qdisc_util prio_qdisc_util; +extern struct qdisc_util pfifo_fast_qdisc_util; +extern struct qdisc_util pfifo_qdisc_util; +#endif +#endif + static int print_noqopt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) { @@ -97,6 +110,27 @@ struct qdisc_util *get_qdisc_kind(const char *str) char buf[256]; struct qdisc_util *q; + +#ifdef ANDROID + if (!strcmp(str, "cbq")) + return &cbq_qdisc_util; + else if (!strcmp(str, "htb")) + return &htb_qdisc_util; + else if (!strcmp(str, "ingress")) + return &ingress_qdisc_util; +#ifdef FEATURE_PRIO + else if (!strcmp(str, "pfifo_fast")) + return &pfifo_fast_qdisc_util; + else if (!strcmp(str, "prio")) + return &prio_qdisc_util; + else if (!strcmp(str, "pfifo")) + return &pfifo_qdisc_util; +#endif + else { + fprintf(stderr, "Android does not support qdisc '%s'\n", str); + return NULL; + } +#endif for (q = qdisc_list; q; q = q->next) if (strcmp(q->id, str) == 0) return q; @@ -143,6 +177,19 @@ struct filter_util *get_filter_kind(const char *str) char buf[256]; struct filter_util *q; +#ifdef ANDROID + if (!strcmp(str, "u32")) + return &u32_filter_util; +#ifdef FEATURE_PRIO + else if (!strcmp(str, "fw")) + return &fw_filter_util; +#endif + else { + fprintf(stderr, "Android does not support filter '%s'\n", str); + return NULL; + } +#endif + for (q = filter_list; q; q = q->next) if (strcmp(q->id, str) == 0) return q; diff --git a/tc/tc_qdisc.c b/tc/tc_qdisc.c old mode 100644 new mode 100755 index 0822e63..6fdfab4 --- a/tc/tc_qdisc.c +++ b/tc/tc_qdisc.c @@ -241,11 +241,13 @@ int print_qdisc(const struct sockaddr_nl *who, if (t->tcm_info != 1) { fprintf(fp, "refcnt %d ", t->tcm_info); } - /* pfifo_fast is generic enough to warrant the hardcoding --JHS */ +#if 0 /* Suppressed to dinstinguish between prio & pfifo_fast */ + /* pfifo_fast is generic enough to warrant the hardcoding --JHS */ if (0 == strcmp("pfifo_fast", RTA_DATA(tb[TCA_KIND]))) q = get_qdisc_kind("prio"); else +#endif q = get_qdisc_kind(RTA_DATA(tb[TCA_KIND])); if (tb[TCA_OPTIONS]) { -- 1.7.8.3