M7350/oe-core/meta-msm/recipes/iproute2/iproute2-3.2.0/0001-tc-Add-flow-control-setting-on-PRIO-qdisc.patch
2024-09-09 08:52:07 +00:00

200 lines
5.5 KiB
Diff

From f63968d217f4d7aeabd3194781e0f4c7c6f18970 Mon Sep 17 00:00:00 2001
From: Shashank Balashankar <sbalasha@qti.qualcomm.com>
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 <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
+#include <linux/pkt_sched.h>
#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