iproute2: upgrade to 3.9.0
authorLuka Perkov <luka@openwrt.org>
Tue, 14 May 2013 23:49:34 +0000 (23:49 +0000)
committerLuka Perkov <luka@openwrt.org>
Tue, 14 May 2013 23:49:34 +0000 (23:49 +0000)
SVN-Revision: 36638

15 files changed:
package/network/utils/iproute2/Makefile
package/network/utils/iproute2/patches/000-sync_pkt_sched_h.patch [deleted file]
package/network/utils/iproute2/patches/001-config.patch [new file with mode: 0644]
package/network/utils/iproute2/patches/001-iproute2-2.6.11_Config.patch [deleted file]
package/network/utils/iproute2/patches/002-iproute2-ipxfrm_no_sctp.patch [deleted file]
package/network/utils/iproute2/patches/006-iproute2-tc_esfq.patch [deleted file]
package/network/utils/iproute2/patches/006-no_sctp.patch [new file with mode: 0644]
package/network/utils/iproute2/patches/008-no_netem.patch
package/network/utils/iproute2/patches/100-allow_pfifo_fast.patch
package/network/utils/iproute2/patches/110-extra-ccopts.patch
package/network/utils/iproute2/patches/120-libnetlink-pic.patch
package/network/utils/iproute2/patches/200-act_connmark.patch [deleted file]
package/network/utils/iproute2/patches/200-add-tc_esfq.patch [new file with mode: 0644]
package/network/utils/iproute2/patches/210-add-act_connmark.patch [new file with mode: 0644]
package/network/utils/iproute2/patches/210-build-unbreak-linkage-of-m_xt.so.patch [deleted file]

index a875ffc76b9d5e9079a8294fee4ef51ded5052e5..8e25f867b269798cf9b64c4d0f1858ce4047f5c3 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2006-2010 OpenWrt.org
+# Copyright (C) 2006-2013 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=iproute2
-PKG_VERSION:=3.7.0
-PKG_RELEASE:=2
+PKG_VERSION:=3.9.0
+PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
 PKG_SOURCE_URL:=http://kernel.org/pub/linux/utils/net/iproute2/
-PKG_MD5SUM:=47040899f8fa30c8721fc5aec6509b44
+PKG_MD5SUM:=b53376db94c8d66f9d540c69ed84f13b
 PKG_BUILD_PARALLEL:=1
 
 PKG_BUILD_DIR:=$(BUILD_DIR)/iproute2-$(PKG_VERSION)
diff --git a/package/network/utils/iproute2/patches/000-sync_pkt_sched_h.patch b/package/network/utils/iproute2/patches/000-sync_pkt_sched_h.patch
deleted file mode 100644 (file)
index b06bc70..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
---- a/include/linux/pkt_sched.h
-+++ b/include/linux/pkt_sched.h
-@@ -214,6 +214,33 @@ struct tc_sfq_xstats {
-       __s32           allot;
- };
-+/* ESFQ section */
-+
-+enum
-+{
-+        /* traditional */
-+      TCA_SFQ_HASH_CLASSIC,
-+      TCA_SFQ_HASH_DST,
-+      TCA_SFQ_HASH_SRC,
-+      TCA_SFQ_HASH_FWMARK,
-+      /* conntrack */
-+      TCA_SFQ_HASH_CTORIGDST,
-+      TCA_SFQ_HASH_CTORIGSRC,
-+      TCA_SFQ_HASH_CTREPLDST,
-+      TCA_SFQ_HASH_CTREPLSRC,
-+      TCA_SFQ_HASH_CTNATCHG,
-+};
-+
-+struct tc_esfq_qopt
-+{
-+      unsigned        quantum;        /* Bytes per round allocated to flow */
-+      int             perturb_period; /* Period of hash perturbation */
-+      __u32           limit;          /* Maximal packets in queue */
-+      unsigned        divisor;        /* Hash divisor  */
-+      unsigned        flows;          /* Maximal number of flows  */
-+      unsigned        hash_kind;      /* Hash function to use for flow identification */
-+};
-+
- /* RED section */
- enum {
diff --git a/package/network/utils/iproute2/patches/001-config.patch b/package/network/utils/iproute2/patches/001-config.patch
new file mode 100644 (file)
index 0000000..ece8652
--- /dev/null
@@ -0,0 +1,7 @@
+--- /dev/null
++++ b/Config
+@@ -0,0 +1,4 @@
++# Fixed config to disable ATM support even if present on host system
++TC_CONFIG_ATM:=n
++TC_CONFIG_ACTION_GACT=y
++TC_CONFIG_ACTION_PROB=y
diff --git a/package/network/utils/iproute2/patches/001-iproute2-2.6.11_Config.patch b/package/network/utils/iproute2/patches/001-iproute2-2.6.11_Config.patch
deleted file mode 100644 (file)
index ece8652..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
---- /dev/null
-+++ b/Config
-@@ -0,0 +1,4 @@
-+# Fixed config to disable ATM support even if present on host system
-+TC_CONFIG_ATM:=n
-+TC_CONFIG_ACTION_GACT=y
-+TC_CONFIG_ACTION_PROB=y
diff --git a/package/network/utils/iproute2/patches/002-iproute2-ipxfrm_no_sctp.patch b/package/network/utils/iproute2/patches/002-iproute2-ipxfrm_no_sctp.patch
deleted file mode 100644 (file)
index 3b1f4d6..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
----
- ip/ipxfrm.c |    2 --
- 1 file changed, 2 deletions(-)
-
---- a/ip/ipxfrm.c
-+++ b/ip/ipxfrm.c
-@@ -468,7 +468,6 @@ void xfrm_selector_print(struct xfrm_sel
-       switch (sel->proto) {
-       case IPPROTO_TCP:
-       case IPPROTO_UDP:
--      case IPPROTO_SCTP:
-       case IPPROTO_DCCP:
-       default: /* XXX */
-               if (sel->sport_mask)
-@@ -1263,7 +1262,6 @@ static int xfrm_selector_upspec_parse(st
-               switch (sel->proto) {
-               case IPPROTO_TCP:
-               case IPPROTO_UDP:
--              case IPPROTO_SCTP:
-               case IPPROTO_DCCP:
-                       break;
-               default:
diff --git a/package/network/utils/iproute2/patches/006-iproute2-tc_esfq.patch b/package/network/utils/iproute2/patches/006-iproute2-tc_esfq.patch
deleted file mode 100644 (file)
index 8016dbb..0000000
+++ /dev/null
@@ -1,219 +0,0 @@
----
- include/linux/pkt_sched.h |   59 +++++++++++++
- tc/Makefile               |    1 
- tc/q_esfq.c               |  200 ++++++++++++++++++++++++++++++++++++++++++++++
- 3 files changed, 260 insertions(+)
-
---- a/tc/Makefile
-+++ b/tc/Makefile
-@@ -8,6 +8,7 @@ SHARED_LIBS ?= y
- TCMODULES :=
- TCMODULES += q_fifo.o
- TCMODULES += q_sfq.o
-+TCMODULES += q_esfq.o
- TCMODULES += q_red.o
- TCMODULES += q_prio.o
- TCMODULES += q_tbf.o
---- /dev/null
-+++ b/tc/q_esfq.c
-@@ -0,0 +1,200 @@
-+/*
-+ * q_esfq.c           ESFQ.
-+ *
-+ *            This program is free software; you can redistribute it and/or
-+ *            modify it under the terms of the GNU General Public License
-+ *            as published by the Free Software Foundation; either version
-+ *            2 of the License, or (at your option) any later version.
-+ *
-+ * Authors:   Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
-+ *
-+ * Changes:   Alexander Atanasov, <alex@ssi.bg>
-+ *            Alexander Clouter, <alex@digriz.org.uk>
-+ *            Corey Hickey, <bugfood-c@fatooh.org>
-+ *
-+ */
-+
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <unistd.h>
-+#include <syslog.h>
-+#include <fcntl.h>
-+#include <math.h>
-+#include <sys/socket.h>
-+#include <netinet/in.h>
-+#include <arpa/inet.h>
-+#include <string.h>
-+
-+#include "utils.h"
-+#include "tc_util.h"
-+
-+static void explain(void)
-+{
-+      fprintf(stderr, "Usage: ... esfq [ perturb SECS ] [ quantum BYTES ] [ depth FLOWS ]\n\t[ divisor HASHBITS ] [ limit PKTS ] [ hash HASHTYPE]\n");
-+      fprintf(stderr,"Where: \n");
-+      fprintf(stderr,"HASHTYPE := { classic | src | dst | ctorigdst | ctorigsrc | ctrepldst | ctreplsrc | ctnatchg }\n");
-+}
-+
-+#define usage() return(-1)
-+
-+static int esfq_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n)
-+{
-+      int ok=0;
-+      struct tc_esfq_qopt opt;
-+
-+      memset(&opt, 0, sizeof(opt));
-+
-+      opt.hash_kind= TCA_SFQ_HASH_CLASSIC;
-+
-+      while (argc > 0) {
-+              if (strcmp(*argv, "quantum") == 0) {
-+                      NEXT_ARG();
-+                      if (get_size(&opt.quantum, *argv)) {
-+                              fprintf(stderr, "Illegal \"quantum\"\n");
-+                              return -1;
-+                      }
-+                      ok++;
-+              } else if (strcmp(*argv, "perturb") == 0) {
-+                      NEXT_ARG();
-+                      if (get_integer(&opt.perturb_period, *argv, 0)) {
-+                              fprintf(stderr, "Illegal \"perturb\"\n");
-+                              return -1;
-+                      }
-+                      ok++;
-+              } else if (strcmp(*argv, "depth") == 0) {
-+                      NEXT_ARG();
-+                      if (get_integer((int *) &opt.flows, *argv, 0)) {
-+                              fprintf(stderr, "Illegal \"depth\"\n");
-+                              return -1;
-+                      }
-+                      ok++;
-+              } else if (strcmp(*argv, "divisor") == 0) {
-+                      NEXT_ARG();
-+                      if (get_integer((int *) &opt.divisor, *argv, 0)) {
-+                              fprintf(stderr, "Illegal \"divisor\"\n");
-+                              return -1;
-+                      }
-+                      if(opt.divisor >= 14) {
-+                              fprintf(stderr, "Illegal \"divisor\": must be < 14\n");
-+                              return -1;
-+                      }
-+                      opt.divisor=pow(2,opt.divisor);
-+                      ok++;
-+              } else if (strcmp(*argv, "limit") == 0) {
-+                      NEXT_ARG();
-+                      if (get_integer((int *) &opt.limit, *argv, 0)) {
-+                              fprintf(stderr, "Illegal \"limit\"\n");
-+                              return -1;
-+                      }
-+                      ok++;
-+              } else if (strcmp(*argv, "hash") == 0) {
-+                      NEXT_ARG();
-+                      if(strcmp(*argv, "classic") == 0) {
-+                              opt.hash_kind= TCA_SFQ_HASH_CLASSIC;
-+                      } else
-+                      if(strcmp(*argv, "dst") == 0) {
-+                              opt.hash_kind= TCA_SFQ_HASH_DST;
-+                      } else
-+                      if(strcmp(*argv, "src") == 0) {
-+                              opt.hash_kind= TCA_SFQ_HASH_SRC;
-+                      } else
-+                      if(strcmp(*argv, "ctorigsrc") == 0) {
-+                              opt.hash_kind= TCA_SFQ_HASH_CTORIGSRC;
-+                      } else
-+                      if(strcmp(*argv, "ctorigdst") == 0) {
-+                              opt.hash_kind= TCA_SFQ_HASH_CTORIGDST;
-+                      } else
-+                      if(strcmp(*argv, "ctreplsrc") == 0) {
-+                              opt.hash_kind= TCA_SFQ_HASH_CTREPLSRC;
-+                      } else
-+                      if(strcmp(*argv, "ctrepldst") == 0) {
-+                              opt.hash_kind= TCA_SFQ_HASH_CTREPLDST;
-+                      } else
-+                      if(strcmp(*argv, "ctnatchg") == 0) {
-+                              opt.hash_kind= TCA_SFQ_HASH_CTNATCHG;
-+                      } else {
-+                              fprintf(stderr, "Illegal \"hash\"\n");
-+                              explain();
-+                              return -1;
-+                      }
-+                      ok++;
-+              } else if (strcmp(*argv, "help") == 0) {
-+                      explain();
-+                      return -1;
-+              } else {
-+                      fprintf(stderr, "What is \"%s\"?\n", *argv);
-+                      explain();
-+                      return -1;
-+              }
-+              argc--; argv++;
-+      }
-+
-+      if (ok)
-+              addattr_l(n, 1024, TCA_OPTIONS, &opt, sizeof(opt));
-+      return 0;
-+}
-+
-+static int esfq_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
-+{
-+      struct tc_esfq_qopt *qopt;
-+      SPRINT_BUF(b1);
-+
-+      if (opt == NULL)
-+              return 0;
-+
-+      if (RTA_PAYLOAD(opt)  < sizeof(*qopt))
-+              return -1;
-+      qopt = RTA_DATA(opt);
-+      fprintf(f, "quantum %s ", sprint_size(qopt->quantum, b1));
-+      if (show_details) {
-+              fprintf(f, "limit %up flows %u/%u ",
-+                      qopt->limit, qopt->flows, qopt->divisor);
-+      }
-+      if (qopt->perturb_period)
-+              fprintf(f, "perturb %dsec ", qopt->perturb_period);
-+
-+              fprintf(f,"hash: ");
-+      switch(qopt->hash_kind)
-+      {
-+      case TCA_SFQ_HASH_CLASSIC:
-+              fprintf(f,"classic");
-+              break;
-+      case TCA_SFQ_HASH_DST:
-+              fprintf(f,"dst");
-+              break;
-+      case TCA_SFQ_HASH_SRC:
-+              fprintf(f,"src");
-+              break;
-+      case TCA_SFQ_HASH_CTORIGSRC:
-+              fprintf(f,"ctorigsrc");
-+              break;
-+      case TCA_SFQ_HASH_CTORIGDST:
-+              fprintf(f,"ctorigdst");
-+              break;
-+      case TCA_SFQ_HASH_CTREPLSRC:
-+              fprintf(f,"ctreplsrc");
-+              break;
-+      case TCA_SFQ_HASH_CTREPLDST:
-+              fprintf(f,"ctrepldst");
-+              break;
-+      case TCA_SFQ_HASH_CTNATCHG:
-+              fprintf(f,"ctnatchg");
-+              break;
-+      default:
-+              fprintf(f,"Unknown");
-+      }
-+      return 0;
-+}
-+
-+static int esfq_print_xstats(struct qdisc_util *qu, FILE *f, struct rtattr *xstats)
-+{
-+      return 0;
-+}
-+
-+
-+struct qdisc_util esfq_qdisc_util = {
-+      .id = "esfq",
-+      .parse_qopt = esfq_parse_opt,
-+      .print_qopt = esfq_print_opt,
-+      .print_xstats = esfq_print_xstats,
-+};
diff --git a/package/network/utils/iproute2/patches/006-no_sctp.patch b/package/network/utils/iproute2/patches/006-no_sctp.patch
new file mode 100644 (file)
index 0000000..ef64222
--- /dev/null
@@ -0,0 +1,18 @@
+--- a/ip/ipxfrm.c
++++ b/ip/ipxfrm.c
+@@ -470,7 +470,6 @@ void xfrm_selector_print(struct xfrm_sel
+       switch (sel->proto) {
+       case IPPROTO_TCP:
+       case IPPROTO_UDP:
+-      case IPPROTO_SCTP:
+       case IPPROTO_DCCP:
+       default: /* XXX */
+               if (sel->sport_mask)
+@@ -1273,7 +1272,6 @@ static int xfrm_selector_upspec_parse(st
+               switch (sel->proto) {
+               case IPPROTO_TCP:
+               case IPPROTO_UDP:
+-              case IPPROTO_SCTP:
+               case IPPROTO_DCCP:
+                       break;
+               default:
index a6a74aa809a21b8bc7c1be9b5d97d98f645f4a7b..165ce0c9b9594f805372b13211bbfcc926db4cc5 100644 (file)
@@ -1,6 +1,6 @@
 --- a/Makefile
 +++ b/Makefile
-@@ -34,7 +34,7 @@ WFLAGS = -Wall -Wstrict-prototypes
+@@ -36,7 +36,7 @@ WFLAGS += -Wmissing-declarations -Wold-s
  CFLAGS = $(WFLAGS) $(CCOPTS) -I../include $(DEFINES)
  YACCFLAGS = -d -t -v
  
index b31d4b745f108a85d21dd55ccb972af9db14df2e..ce958a93459dac1002382915f9a571dda5569bc7 100644 (file)
@@ -1,7 +1,3 @@
----
- tc/q_fifo.c |    1 +
- 1 file changed, 1 insertion(+)
-
 --- a/tc/q_fifo.c
 +++ b/tc/q_fifo.c
 @@ -98,5 +98,6 @@ struct qdisc_util pfifo_head_drop_qdisc_
index f4ef8d76393baff935a84c8e49fdab5dba585457..af38fe19894d1a1831fd5e434659e6990c998b40 100644 (file)
@@ -6,6 +6,6 @@
  DEFINES += -D_GNU_SOURCE
 -CCOPTS = -O2
 +CCOPTS = -O2 $(EXTRA_CCOPTS)
- WFLAGS = -Wall -Wstrict-prototypes
- CFLAGS = $(WFLAGS) $(CCOPTS) -I../include $(DEFINES)
- YACCFLAGS = -d -t -v
+ WFLAGS := -Wall -Wstrict-prototypes -Werror -Wmissing-prototypes
+ WFLAGS += -Wmissing-declarations -Wold-style-definition
index c7b78d063946aa63717650b72ee0ac7f8a065145..3ea7d193b21b37ca1b4311e43801f8e2d20607b4 100644 (file)
@@ -1,8 +1,10 @@
 --- a/lib/Makefile
 +++ b/lib/Makefile
-@@ -1,4 +1,4 @@
+@@ -1,6 +1,6 @@
+ include ../Config
 -CFLAGS += -fPIC
-+CFLAGS+=$(FPIC)
++CFLAGS += $(FPIC)
  
  UTILOBJ=utils.o rt_names.o ll_types.o ll_proto.o ll_addr.o inet_proto.o
  
diff --git a/package/network/utils/iproute2/patches/200-act_connmark.patch b/package/network/utils/iproute2/patches/200-act_connmark.patch
deleted file mode 100644 (file)
index ac6ba33..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
---- a/tc/Makefile
-+++ b/tc/Makefile
-@@ -38,6 +38,7 @@ TCMODULES += m_mirred.o
- TCMODULES += m_nat.o
- TCMODULES += m_pedit.o
- TCMODULES += m_skbedit.o
-+TCMODULES += m_connmark.o
- TCMODULES += m_csum.o
- TCMODULES += p_ip.o
- TCMODULES += p_icmp.o
---- /dev/null
-+++ b/tc/m_connmark.c
-@@ -0,0 +1,74 @@
-+/*
-+ * m_connmark.c               Connection tracking marking import
-+ *
-+ * Copyright (c) 2011 Felix Fietkau <nbd@openwrt.org>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms and conditions of the GNU General Public License,
-+ * version 2, as published by the Free Software Foundation.
-+ *
-+ * This program is distributed in the hope it will be useful, but WITHOUT
-+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
-+ * more details.
-+ *
-+ * You should have received a copy of the GNU General Public License along with
-+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
-+ * Place - Suite 330, Boston, MA 02111-1307 USA.
-+ */
-+
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <unistd.h>
-+#include <string.h>
-+#include "utils.h"
-+#include "tc_util.h"
-+
-+static void
-+explain(void)
-+{
-+      fprintf(stderr, "Usage: ... connmark\n");
-+}
-+
-+static void
-+usage(void)
-+{
-+      explain();
-+      exit(-1);
-+}
-+
-+static int
-+parse_connmark(struct action_util *a, int *argc_p, char ***argv_p, int tca_id,
-+            struct nlmsghdr *n)
-+{
-+      int argc = *argc_p;
-+      char **argv = *argv_p;
-+
-+      if (matches(*argv, "connmark") != 0)
-+              return -1;
-+
-+      NEXT_ARG();
-+
-+      if (matches(*argv, "help") == 0)
-+              usage();
-+
-+      *argc_p = argc;
-+      *argv_p = argv;
-+      return 0;
-+}
-+
-+static int print_connmark(struct action_util *au, FILE *f, struct rtattr *arg)
-+{
-+      if (arg == NULL)
-+              return -1;
-+
-+      fprintf(f, " connmark");
-+
-+      return 0;
-+}
-+
-+struct action_util connmark_action_util = {
-+      .id = "connmark",
-+      .parse_aopt = parse_connmark,
-+      .print_aopt = print_connmark,
-+};
diff --git a/package/network/utils/iproute2/patches/200-add-tc_esfq.patch b/package/network/utils/iproute2/patches/200-add-tc_esfq.patch
new file mode 100644 (file)
index 0000000..df5dc01
--- /dev/null
@@ -0,0 +1,249 @@
+--- a/tc/Makefile
++++ b/tc/Makefile
+@@ -8,6 +8,7 @@ SHARED_LIBS ?= y
+ TCMODULES :=
+ TCMODULES += q_fifo.o
+ TCMODULES += q_sfq.o
++TCMODULES += q_esfq.o
+ TCMODULES += q_red.o
+ TCMODULES += q_prio.o
+ TCMODULES += q_tbf.o
+--- a/include/linux/pkt_sched.h
++++ b/include/linux/pkt_sched.h
+@@ -214,6 +214,33 @@ struct tc_sfq_xstats {
+       __s32           allot;
+ };
++/* ESFQ section */
++
++enum
++{
++        /* traditional */
++      TCA_SFQ_HASH_CLASSIC,
++      TCA_SFQ_HASH_DST,
++      TCA_SFQ_HASH_SRC,
++      TCA_SFQ_HASH_FWMARK,
++      /* conntrack */
++      TCA_SFQ_HASH_CTORIGDST,
++      TCA_SFQ_HASH_CTORIGSRC,
++      TCA_SFQ_HASH_CTREPLDST,
++      TCA_SFQ_HASH_CTREPLSRC,
++      TCA_SFQ_HASH_CTNATCHG,
++};
++
++struct tc_esfq_qopt
++{
++      unsigned        quantum;        /* Bytes per round allocated to flow */
++      int             perturb_period; /* Period of hash perturbation */
++      __u32           limit;          /* Maximal packets in queue */
++      unsigned        divisor;        /* Hash divisor  */
++      unsigned        flows;          /* Maximal number of flows  */
++      unsigned        hash_kind;      /* Hash function to use for flow identification */
++};
++
+ /* RED section */
+ enum {
+--- /dev/null
++++ b/tc/q_esfq.c
+@@ -0,0 +1,200 @@
++/*
++ * q_esfq.c           ESFQ.
++ *
++ *            This program is free software; you can redistribute it and/or
++ *            modify it under the terms of the GNU General Public License
++ *            as published by the Free Software Foundation; either version
++ *            2 of the License, or (at your option) any later version.
++ *
++ * Authors:   Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
++ *
++ * Changes:   Alexander Atanasov, <alex@ssi.bg>
++ *            Alexander Clouter, <alex@digriz.org.uk>
++ *            Corey Hickey, <bugfood-c@fatooh.org>
++ *
++ */
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <unistd.h>
++#include <syslog.h>
++#include <fcntl.h>
++#include <math.h>
++#include <sys/socket.h>
++#include <netinet/in.h>
++#include <arpa/inet.h>
++#include <string.h>
++
++#include "utils.h"
++#include "tc_util.h"
++
++static void explain(void)
++{
++      fprintf(stderr, "Usage: ... esfq [ perturb SECS ] [ quantum BYTES ] [ depth FLOWS ]\n\t[ divisor HASHBITS ] [ limit PKTS ] [ hash HASHTYPE]\n");
++      fprintf(stderr,"Where: \n");
++      fprintf(stderr,"HASHTYPE := { classic | src | dst | ctorigdst | ctorigsrc | ctrepldst | ctreplsrc | ctnatchg }\n");
++}
++
++#define usage() return(-1)
++
++static int esfq_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n)
++{
++      int ok=0;
++      struct tc_esfq_qopt opt;
++
++      memset(&opt, 0, sizeof(opt));
++
++      opt.hash_kind= TCA_SFQ_HASH_CLASSIC;
++
++      while (argc > 0) {
++              if (strcmp(*argv, "quantum") == 0) {
++                      NEXT_ARG();
++                      if (get_size(&opt.quantum, *argv)) {
++                              fprintf(stderr, "Illegal \"quantum\"\n");
++                              return -1;
++                      }
++                      ok++;
++              } else if (strcmp(*argv, "perturb") == 0) {
++                      NEXT_ARG();
++                      if (get_integer(&opt.perturb_period, *argv, 0)) {
++                              fprintf(stderr, "Illegal \"perturb\"\n");
++                              return -1;
++                      }
++                      ok++;
++              } else if (strcmp(*argv, "depth") == 0) {
++                      NEXT_ARG();
++                      if (get_integer((int *) &opt.flows, *argv, 0)) {
++                              fprintf(stderr, "Illegal \"depth\"\n");
++                              return -1;
++                      }
++                      ok++;
++              } else if (strcmp(*argv, "divisor") == 0) {
++                      NEXT_ARG();
++                      if (get_integer((int *) &opt.divisor, *argv, 0)) {
++                              fprintf(stderr, "Illegal \"divisor\"\n");
++                              return -1;
++                      }
++                      if(opt.divisor >= 14) {
++                              fprintf(stderr, "Illegal \"divisor\": must be < 14\n");
++                              return -1;
++                      }
++                      opt.divisor=pow(2,opt.divisor);
++                      ok++;
++              } else if (strcmp(*argv, "limit") == 0) {
++                      NEXT_ARG();
++                      if (get_integer((int *) &opt.limit, *argv, 0)) {
++                              fprintf(stderr, "Illegal \"limit\"\n");
++                              return -1;
++                      }
++                      ok++;
++              } else if (strcmp(*argv, "hash") == 0) {
++                      NEXT_ARG();
++                      if(strcmp(*argv, "classic") == 0) {
++                              opt.hash_kind= TCA_SFQ_HASH_CLASSIC;
++                      } else
++                      if(strcmp(*argv, "dst") == 0) {
++                              opt.hash_kind= TCA_SFQ_HASH_DST;
++                      } else
++                      if(strcmp(*argv, "src") == 0) {
++                              opt.hash_kind= TCA_SFQ_HASH_SRC;
++                      } else
++                      if(strcmp(*argv, "ctorigsrc") == 0) {
++                              opt.hash_kind= TCA_SFQ_HASH_CTORIGSRC;
++                      } else
++                      if(strcmp(*argv, "ctorigdst") == 0) {
++                              opt.hash_kind= TCA_SFQ_HASH_CTORIGDST;
++                      } else
++                      if(strcmp(*argv, "ctreplsrc") == 0) {
++                              opt.hash_kind= TCA_SFQ_HASH_CTREPLSRC;
++                      } else
++                      if(strcmp(*argv, "ctrepldst") == 0) {
++                              opt.hash_kind= TCA_SFQ_HASH_CTREPLDST;
++                      } else
++                      if(strcmp(*argv, "ctnatchg") == 0) {
++                              opt.hash_kind= TCA_SFQ_HASH_CTNATCHG;
++                      } else {
++                              fprintf(stderr, "Illegal \"hash\"\n");
++                              explain();
++                              return -1;
++                      }
++                      ok++;
++              } else if (strcmp(*argv, "help") == 0) {
++                      explain();
++                      return -1;
++              } else {
++                      fprintf(stderr, "What is \"%s\"?\n", *argv);
++                      explain();
++                      return -1;
++              }
++              argc--; argv++;
++      }
++
++      if (ok)
++              addattr_l(n, 1024, TCA_OPTIONS, &opt, sizeof(opt));
++      return 0;
++}
++
++static int esfq_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
++{
++      struct tc_esfq_qopt *qopt;
++      SPRINT_BUF(b1);
++
++      if (opt == NULL)
++              return 0;
++
++      if (RTA_PAYLOAD(opt)  < sizeof(*qopt))
++              return -1;
++      qopt = RTA_DATA(opt);
++      fprintf(f, "quantum %s ", sprint_size(qopt->quantum, b1));
++      if (show_details) {
++              fprintf(f, "limit %up flows %u/%u ",
++                      qopt->limit, qopt->flows, qopt->divisor);
++      }
++      if (qopt->perturb_period)
++              fprintf(f, "perturb %dsec ", qopt->perturb_period);
++
++              fprintf(f,"hash: ");
++      switch(qopt->hash_kind)
++      {
++      case TCA_SFQ_HASH_CLASSIC:
++              fprintf(f,"classic");
++              break;
++      case TCA_SFQ_HASH_DST:
++              fprintf(f,"dst");
++              break;
++      case TCA_SFQ_HASH_SRC:
++              fprintf(f,"src");
++              break;
++      case TCA_SFQ_HASH_CTORIGSRC:
++              fprintf(f,"ctorigsrc");
++              break;
++      case TCA_SFQ_HASH_CTORIGDST:
++              fprintf(f,"ctorigdst");
++              break;
++      case TCA_SFQ_HASH_CTREPLSRC:
++              fprintf(f,"ctreplsrc");
++              break;
++      case TCA_SFQ_HASH_CTREPLDST:
++              fprintf(f,"ctrepldst");
++              break;
++      case TCA_SFQ_HASH_CTNATCHG:
++              fprintf(f,"ctnatchg");
++              break;
++      default:
++              fprintf(f,"Unknown");
++      }
++      return 0;
++}
++
++static int esfq_print_xstats(struct qdisc_util *qu, FILE *f, struct rtattr *xstats)
++{
++      return 0;
++}
++
++
++struct qdisc_util esfq_qdisc_util = {
++      .id = "esfq",
++      .parse_qopt = esfq_parse_opt,
++      .print_qopt = esfq_print_opt,
++      .print_xstats = esfq_print_xstats,
++};
diff --git a/package/network/utils/iproute2/patches/210-add-act_connmark.patch b/package/network/utils/iproute2/patches/210-add-act_connmark.patch
new file mode 100644 (file)
index 0000000..ac6ba33
--- /dev/null
@@ -0,0 +1,87 @@
+--- a/tc/Makefile
++++ b/tc/Makefile
+@@ -38,6 +38,7 @@ TCMODULES += m_mirred.o
+ TCMODULES += m_nat.o
+ TCMODULES += m_pedit.o
+ TCMODULES += m_skbedit.o
++TCMODULES += m_connmark.o
+ TCMODULES += m_csum.o
+ TCMODULES += p_ip.o
+ TCMODULES += p_icmp.o
+--- /dev/null
++++ b/tc/m_connmark.c
+@@ -0,0 +1,74 @@
++/*
++ * m_connmark.c               Connection tracking marking import
++ *
++ * Copyright (c) 2011 Felix Fietkau <nbd@openwrt.org>
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU General Public License,
++ * version 2, as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
++ * more details.
++ *
++ * You should have received a copy of the GNU General Public License along with
++ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
++ * Place - Suite 330, Boston, MA 02111-1307 USA.
++ */
++
++#include <stdio.h>
++#include <stdlib.h>
++#include <unistd.h>
++#include <string.h>
++#include "utils.h"
++#include "tc_util.h"
++
++static void
++explain(void)
++{
++      fprintf(stderr, "Usage: ... connmark\n");
++}
++
++static void
++usage(void)
++{
++      explain();
++      exit(-1);
++}
++
++static int
++parse_connmark(struct action_util *a, int *argc_p, char ***argv_p, int tca_id,
++            struct nlmsghdr *n)
++{
++      int argc = *argc_p;
++      char **argv = *argv_p;
++
++      if (matches(*argv, "connmark") != 0)
++              return -1;
++
++      NEXT_ARG();
++
++      if (matches(*argv, "help") == 0)
++              usage();
++
++      *argc_p = argc;
++      *argv_p = argv;
++      return 0;
++}
++
++static int print_connmark(struct action_util *au, FILE *f, struct rtattr *arg)
++{
++      if (arg == NULL)
++              return -1;
++
++      fprintf(f, " connmark");
++
++      return 0;
++}
++
++struct action_util connmark_action_util = {
++      .id = "connmark",
++      .parse_aopt = parse_connmark,
++      .print_aopt = print_connmark,
++};
diff --git a/package/network/utils/iproute2/patches/210-build-unbreak-linkage-of-m_xt.so.patch b/package/network/utils/iproute2/patches/210-build-unbreak-linkage-of-m_xt.so.patch
deleted file mode 100644 (file)
index 7fb2c11..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-From 11e8a1034656eba6571401286b99dabbd9842dac Mon Sep 17 00:00:00 2001
-From: Jan Engelhardt <jengelh@inai.de>
-Date: Tue, 18 Dec 2012 09:18:45 -0800
-Subject: [PATCH] build: unbreak linakge of m_xt.so
-
-Commit v3.7.0~10 caused the variable new PKG_CONFIG variable never
-to be present at the time of calling make, leading to tc/m_xt.so
-not linked with -lxtables (result from pkg-config xtables --libs),
-that in turn leading to
-
-tc: symbol lookup error: /usr/lib64/tc//m_xt.so: undefined symbol:
-xtables_init_all
-
-Fixing that.
-
-Signed-off-by: Jan Engelhardt <jengelh@inai.de>
-
-Conflicts:
-       configure
----
- configure | 14 +++++++++++---
- 1 file changed, 11 insertions(+), 3 deletions(-)
-
---- a/configure
-+++ b/configure
-@@ -2,14 +2,20 @@
- # This is not an autconf generated configure
- #
- INCLUDE=${1:-"$PWD/include"}
--: ${PKG_CONFIG:=pkg-config}
--: ${CC=gcc}
--echo "PKG_CONFIG:=${PKG_CONFIG}" >>Config
- # Make a temp directory in build tree.
- TMPDIR=$(mktemp -d config.XXXXXX)
- trap 'status=$?; rm -rf $TMPDIR; exit $status' EXIT HUP INT QUIT TERM
-+check_toolchain()
-+{
-+: ${PKG_CONFIG:=pkg-config}
-+: ${AR=ar}
-+: ${CC=gcc}
-+echo "AR:=${AR}" >>Config
-+echo "CC:=${CC}" >>Config
-+}
-+
- check_atm()
- {
- cat >$TMPDIR/atmtest.c <<EOF
-@@ -224,6 +230,8 @@ rm -f $TMPDIR/ipsettest.c $TMPDIR/ipsett
- }
- echo "# Generated config based on" $INCLUDE >Config
-+echo "PKG_CONFIG:=${PKG_CONFIG}" >>Config
-+check_toolchain
- echo "TC schedulers"