Patches being added should have: Upstream-Status: Backport
-- Denys On Mon, Oct 28, 2019 at 03:13:50PM -0400, Jacob Stiffler wrote: > Signed-off-by: Jacob Stiffler <j-stiff...@ti.com> > --- > .../iproute2/0001-utils-Implement-get_s64.patch | 64 +++ > ...-helper-to-retrieve-a-__s64-from-a-netlin.patch | 39 ++ > ...Add-helper-for-getting-a-__s32-from-netli.patch | 36 ++ > ...port-for-configuring-the-taprio-scheduler.patch | 488 > +++++++++++++++++++++ > .../0005-taprio-Add-manpage-for-tc-taprio-8.patch | 168 +++++++ > ...taprio-Add-support-for-changing-schedules.patch | 150 +++++++ > ...support-for-cycle_time-and-cycle_time_ext.patch | 147 +++++++ > .../iproute2/0008-utils-Fix-get_s64-function.patch | 34 ++ > ...0009-taprio-Add-support-for-setting-flags.patch | 77 ++++ > ...prio-add-support-for-setting-txtime_delay.patch | 96 ++++ > .../0011-tc-taprio-Update-documentation.patch | 80 ++++ > ...sync-pkt_sched-header-with-kernel-version.patch | 128 ++++++ > .../iproute2/iproute2_4.19.0.bbappend | 14 +- > 13 files changed, 1520 insertions(+), 1 deletion(-) > create mode 100644 > meta-arago-distro/recipes-connectivity/iproute2/iproute2/0001-utils-Implement-get_s64.patch > create mode 100644 > meta-arago-distro/recipes-connectivity/iproute2/iproute2/0002-include-Add-helper-to-retrieve-a-__s64-from-a-netlin.patch > create mode 100644 > meta-arago-distro/recipes-connectivity/iproute2/iproute2/0003-libnetlink-Add-helper-for-getting-a-__s32-from-netli.patch > create mode 100644 > meta-arago-distro/recipes-connectivity/iproute2/iproute2/0004-tc-Add-support-for-configuring-the-taprio-scheduler.patch > create mode 100644 > meta-arago-distro/recipes-connectivity/iproute2/iproute2/0005-taprio-Add-manpage-for-tc-taprio-8.patch > create mode 100644 > meta-arago-distro/recipes-connectivity/iproute2/iproute2/0006-taprio-Add-support-for-changing-schedules.patch > create mode 100644 > meta-arago-distro/recipes-connectivity/iproute2/iproute2/0007-taprio-Add-support-for-cycle_time-and-cycle_time_ext.patch > create mode 100644 > meta-arago-distro/recipes-connectivity/iproute2/iproute2/0008-utils-Fix-get_s64-function.patch > create mode 100644 > meta-arago-distro/recipes-connectivity/iproute2/iproute2/0009-taprio-Add-support-for-setting-flags.patch > create mode 100644 > meta-arago-distro/recipes-connectivity/iproute2/iproute2/0010-taprio-add-support-for-setting-txtime_delay.patch > create mode 100644 > meta-arago-distro/recipes-connectivity/iproute2/iproute2/0011-tc-taprio-Update-documentation.patch > create mode 100644 > meta-arago-distro/recipes-connectivity/iproute2/iproute2/0012-sync-pkt_sched-header-with-kernel-version.patch > > diff --git > a/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0001-utils-Implement-get_s64.patch > > b/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0001-utils-Implement-get_s64.patch > new file mode 100644 > index 0000000..a0d5a12 > --- /dev/null > +++ > b/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0001-utils-Implement-get_s64.patch > @@ -0,0 +1,64 @@ > +From 7e4397dff47438be65fdf90dc4e51b763797d201 Mon Sep 17 00:00:00 2001 > +From: Vinicius Costa Gomes <vinicius.go...@intel.com> > +Date: Fri, 5 Oct 2018 16:25:17 -0700 > +Subject: [PATCH 01/12] utils: Implement get_s64() > + > +commit a066bac8a2775bc43d54ae7173057f75f543c44b upstream. > + > +Add this helper to read signed 64-bit integers from a string. > + > +Signed-off-by: Vinicius Costa Gomes <vinicius.go...@intel.com> > +Signed-off-by: David Ahern <dsah...@gmail.com> > +Signed-off-by: Murali Karicheri <m-kariche...@ti.com> > +--- > + include/utils.h | 1 + > + lib/utils.c | 21 +++++++++++++++++++++ > + 2 files changed, 22 insertions(+) > + > +diff --git a/include/utils.h b/include/utils.h > +index 8cb4349e..58574a05 100644 > +--- a/include/utils.h > ++++ b/include/utils.h > +@@ -139,6 +139,7 @@ int get_time_rtt(unsigned *val, const char *arg, int > *raw); > + #define get_byte get_u8 > + #define get_ushort get_u16 > + #define get_short get_s16 > ++int get_s64(__s64 *val, const char *arg, int base); > + int get_u64(__u64 *val, const char *arg, int base); > + int get_u32(__u32 *val, const char *arg, int base); > + int get_s32(__s32 *val, const char *arg, int base); > +diff --git a/lib/utils.c b/lib/utils.c > +index ad27f78c..be29530f 100644 > +--- a/lib/utils.c > ++++ b/lib/utils.c > +@@ -384,6 +384,27 @@ int get_u8(__u8 *val, const char *arg, int base) > + return 0; > + } > + > ++int get_s64(__s64 *val, const char *arg, int base) > ++{ > ++ long res; > ++ char *ptr; > ++ > ++ errno = 0; > ++ > ++ if (!arg || !*arg) > ++ return -1; > ++ res = strtoll(arg, &ptr, base); > ++ if (!ptr || ptr == arg || *ptr) > ++ return -1; > ++ if ((res == LLONG_MIN || res == LLONG_MAX) && errno == ERANGE) > ++ return -1; > ++ if (res > INT64_MAX || res < INT64_MIN) > ++ return -1; > ++ > ++ *val = res; > ++ return 0; > ++} > ++ > + int get_s32(__s32 *val, const char *arg, int base) > + { > + long res; > +-- > +2.18.1 > + > diff --git > a/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0002-include-Add-helper-to-retrieve-a-__s64-from-a-netlin.patch > > b/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0002-include-Add-helper-to-retrieve-a-__s64-from-a-netlin.patch > new file mode 100644 > index 0000000..b01e11d > --- /dev/null > +++ > b/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0002-include-Add-helper-to-retrieve-a-__s64-from-a-netlin.patch > @@ -0,0 +1,39 @@ > +From 6d0bcdd9d0283768798227f4046414ed7da42047 Mon Sep 17 00:00:00 2001 > +From: Vinicius Costa Gomes <vinicius.go...@intel.com> > +Date: Fri, 5 Oct 2018 16:25:18 -0700 > +Subject: [PATCH 02/12] include: Add helper to retrieve a __s64 from a netlink > + msg > + > +commit de63cd90444ac9fdf238f950c16cafe351846691 upstream. > + > +This allows signed 64-bit integers to be retrieved from a netlink > +message. > + > +Signed-off-by: Vinicius Costa Gomes <vinicius.go...@intel.com> > +Signed-off-by: David Ahern <dsah...@gmail.com> > +Signed-off-by: Murali Karicheri <m-kariche...@ti.com> > +--- > + include/libnetlink.h | 7 +++++++ > + 1 file changed, 7 insertions(+) > + > +diff --git a/include/libnetlink.h b/include/libnetlink.h > +index 9d9249e6..ffc49e56 100644 > +--- a/include/libnetlink.h > ++++ b/include/libnetlink.h > +@@ -185,6 +185,13 @@ static inline __u64 rta_getattr_u64(const struct rtattr > *rta) > + memcpy(&tmp, RTA_DATA(rta), sizeof(__u64)); > + return tmp; > + } > ++static inline __s64 rta_getattr_s64(const struct rtattr *rta) > ++{ > ++ __s64 tmp; > ++ > ++ memcpy(&tmp, RTA_DATA(rta), sizeof(tmp)); > ++ return tmp; > ++} > + static inline const char *rta_getattr_str(const struct rtattr *rta) > + { > + return (const char *)RTA_DATA(rta); > +-- > +2.18.1 > + > diff --git > a/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0003-libnetlink-Add-helper-for-getting-a-__s32-from-netli.patch > > b/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0003-libnetlink-Add-helper-for-getting-a-__s32-from-netli.patch > new file mode 100644 > index 0000000..1718c23 > --- /dev/null > +++ > b/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0003-libnetlink-Add-helper-for-getting-a-__s32-from-netli.patch > @@ -0,0 +1,36 @@ > +From ca37dce0e9c50645a3473dc942a33478eb79378d Mon Sep 17 00:00:00 2001 > +From: Jesus Sanchez-Palencia <jesus.sanchez-palen...@intel.com> > +Date: Fri, 5 Oct 2018 16:25:19 -0700 > +Subject: [PATCH 03/12] libnetlink: Add helper for getting a __s32 from > netlink > + msgs > + > +commit d791f3ad869659da4b151eded060840a88d9656a upstream. > + > +This function retrieves a signed 32-bit integer from a netlink message > +and returns it. > + > +Signed-off-by: Jesus Sanchez-Palencia <jesus.sanchez-palen...@intel.com> > +Signed-off-by: David Ahern <dsah...@gmail.com> > +Signed-off-by: Murali Karicheri <m-kariche...@ti.com> > +--- > + include/libnetlink.h | 4 ++++ > + 1 file changed, 4 insertions(+) > + > +diff --git a/include/libnetlink.h b/include/libnetlink.h > +index ffc49e56..c44c3c72 100644 > +--- a/include/libnetlink.h > ++++ b/include/libnetlink.h > +@@ -185,6 +185,10 @@ static inline __u64 rta_getattr_u64(const struct rtattr > *rta) > + memcpy(&tmp, RTA_DATA(rta), sizeof(__u64)); > + return tmp; > + } > ++static inline __s32 rta_getattr_s32(const struct rtattr *rta) > ++{ > ++ return *(__s32 *)RTA_DATA(rta); > ++} > + static inline __s64 rta_getattr_s64(const struct rtattr *rta) > + { > + __s64 tmp; > +-- > +2.18.1 > + > diff --git > a/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0004-tc-Add-support-for-configuring-the-taprio-scheduler.patch > > b/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0004-tc-Add-support-for-configuring-the-taprio-scheduler.patch > new file mode 100644 > index 0000000..7cbf027 > --- /dev/null > +++ > b/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0004-tc-Add-support-for-configuring-the-taprio-scheduler.patch > @@ -0,0 +1,488 @@ > +From b53ed00cc819a9d57983f48a9fe8d02ec3b50fca Mon Sep 17 00:00:00 2001 > +From: Vinicius Costa Gomes <vinicius.go...@intel.com> > +Date: Fri, 5 Oct 2018 16:25:21 -0700 > +Subject: [PATCH 04/12] tc: Add support for configuring the taprio scheduler > + > +commit 0dd16449356f7ba88e5374392b577f0504b3f025 upstream. > + > +This traffic scheduler allows traffic classes states (transmission > +allowed/not allowed, in the simplest case) to be scheduled, according > +to a pre-generated time sequence. This is the basis of the IEEE > +802.1Qbv specification. > + > +Example configuration: > + > +tc qdisc replace dev enp3s0 parent root handle 100 taprio \ > + num_tc 3 \ > + map 2 2 1 0 2 2 2 2 2 2 2 2 2 2 2 2 \ > + queues 1@0 1@1 2@2 \ > + base-time 1528743495910289987 \ > + sched-entry S 01 300000 \ > + sched-entry S 02 300000 \ > + sched-entry S 04 300000 \ > + clockid CLOCK_TAI > + > +The configuration format is similar to mqprio. The main difference is > +the presence of a schedule, built by multiple "sched-entry" > +definitions, each entry has the following format: > + > + sched-entry <CMD> <GATE MASK> <INTERVAL> > + > +The only supported <CMD> is "S", which means "SetGateStates", > +following the IEEE 802.1Qbv-2015 definition (Table 8-6). <GATE MASK> > +is a bitmask where each bit is a associated with a traffic class, so > +bit 0 (the least significant bit) being "on" means that traffic class > +0 is "active" for that schedule entry. <INTERVAL> is a time duration > +in nanoseconds that specifies for how long that state defined by <CMD> > +and <GATE MASK> should be held before moving to the next entry. > + > +This schedule is circular, that is, after the last entry is executed > +it starts from the first one, indefinitely. > + > +The other parameters can be defined as follows: > + > + - base-time: specifies the instant when the schedule starts, if > + 'base-time' is a time in the past, the schedule will start at > + > + base-time + (N * cycle-time) > + > + where N is the smallest integer so the resulting time is greater > + than "now", and "cycle-time" is the sum of all the intervals of the > + entries in the schedule; > + > + - clockid: specifies the reference clock to be used; > + > +The parameters should be similar to what the IEEE 802.1Q family of > +specification defines. > + > +Signed-off-by: Vinicius Costa Gomes <vinicius.go...@intel.com> > +Signed-off-by: Jesus Sanchez-Palencia <jesus.sanchez-palen...@intel.com> > +Signed-off-by: David Ahern <dsah...@gmail.com> > +Signed-off-by: Murali Karicheri <m-kariche...@ti.com> > +--- > + tc/Makefile | 1 + > + tc/q_taprio.c | 400 ++++++++++++++++++++++++++++++++++++++++++++++++++ > + 2 files changed, 401 insertions(+) > + create mode 100644 tc/q_taprio.c > + > +diff --git a/tc/Makefile b/tc/Makefile > +index 5a1a7ff9..25a28284 100644 > +--- a/tc/Makefile > ++++ b/tc/Makefile > +@@ -74,6 +74,7 @@ TCMODULES += e_bpf.o > + TCMODULES += f_matchall.o > + TCMODULES += q_cbs.o > + TCMODULES += q_etf.o > ++TCMODULES += q_taprio.o > + > + TCSO := > + ifeq ($(TC_CONFIG_ATM),y) > +diff --git a/tc/q_taprio.c b/tc/q_taprio.c > +new file mode 100644 > +index 00000000..562dacb8 > +--- /dev/null > ++++ b/tc/q_taprio.c > +@@ -0,0 +1,400 @@ > ++/* > ++ * q_taprio.c Time Aware Priority Scheduler > ++ * > ++ * 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: Vinicius Costa Gomes <vinicius.go...@intel.com> > ++ * Jesus Sanchez-Palencia <jesus.sanchez-palen...@intel.com> > ++ */ > ++ > ++#include <stdio.h> > ++#include <stdlib.h> > ++#include <unistd.h> > ++#include <syslog.h> > ++#include <fcntl.h> > ++#include <inttypes.h> > ++#include <sys/socket.h> > ++#include <netinet/in.h> > ++#include <arpa/inet.h> > ++#include <string.h> > ++ > ++#include "utils.h" > ++#include "tc_util.h" > ++#include "list.h" > ++ > ++struct sched_entry { > ++ struct list_head list; > ++ uint32_t index; > ++ uint32_t interval; > ++ uint32_t gatemask; > ++ uint8_t cmd; > ++}; > ++ > ++#define CLOCKID_INVALID (-1) > ++static const struct static_clockid { > ++ const char *name; > ++ clockid_t clockid; > ++} clockids_sysv[] = { > ++ { "REALTIME", CLOCK_REALTIME }, > ++ { "TAI", CLOCK_TAI }, > ++ { "BOOTTIME", CLOCK_BOOTTIME }, > ++ { "MONOTONIC", CLOCK_MONOTONIC }, > ++ { NULL } > ++}; > ++ > ++static void explain(void) > ++{ > ++ fprintf(stderr, "Usage: ... taprio clockid CLOCKID\n"); > ++ fprintf(stderr, " [num_tc NUMBER] [map P0 P1 ...] "); > ++ fprintf(stderr, " [queues COUNT@OFFSET COUNT@OFFSET > COUNT@OFFSET ...] "); > ++ fprintf(stderr, " [ [sched-entry index cmd gate-mask > interval] ... ] "); > ++ fprintf(stderr, " [base-time time] "); > ++ fprintf(stderr, "\nCLOCKID must be a valid SYS-V id (i.e. CLOCK_TAI)"); > ++ fprintf(stderr, "\n"); > ++} > ++ > ++static void explain_clockid(const char *val) > ++{ > ++ fprintf(stderr, "taprio: illegal value for \"clockid\": \"%s\".\n", > val); > ++ fprintf(stderr, "It must be a valid SYS-V id (i.e. CLOCK_TAI)\n"); > ++} > ++ > ++static int get_clockid(__s32 *val, const char *arg) > ++{ > ++ const struct static_clockid *c; > ++ > ++ /* Drop the CLOCK_ prefix if that is being used. */ > ++ if (strcasestr(arg, "CLOCK_") != NULL) > ++ arg += sizeof("CLOCK_") - 1; > ++ > ++ for (c = clockids_sysv; c->name; c++) { > ++ if (strcasecmp(c->name, arg) == 0) { > ++ *val = c->clockid; > ++ > ++ return 0; > ++ } > ++ } > ++ > ++ return -1; > ++} > ++ > ++static const char* get_clock_name(clockid_t clockid) > ++{ > ++ const struct static_clockid *c; > ++ > ++ for (c = clockids_sysv; c->name; c++) { > ++ if (clockid == c->clockid) > ++ return c->name; > ++ } > ++ > ++ return "invalid"; > ++} > ++ > ++static const char *entry_cmd_to_str(__u8 cmd) > ++{ > ++ switch (cmd) { > ++ case TC_TAPRIO_CMD_SET_GATES: > ++ return "S"; > ++ default: > ++ return "Invalid"; > ++ } > ++} > ++ > ++static int str_to_entry_cmd(const char *str) > ++{ > ++ if (strcmp(str, "S") == 0) > ++ return TC_TAPRIO_CMD_SET_GATES; > ++ > ++ return -1; > ++} > ++ > ++static int add_sched_list(struct list_head *sched_entries, struct nlmsghdr > *n) > ++{ > ++ struct sched_entry *e; > ++ > ++ list_for_each_entry(e, sched_entries, list) { > ++ struct rtattr *a; > ++ > ++ a = addattr_nest(n, 1024, TCA_TAPRIO_SCHED_ENTRY); > ++ > ++ addattr_l(n, 1024, TCA_TAPRIO_SCHED_ENTRY_CMD, &e->cmd, > sizeof(e->cmd)); > ++ addattr_l(n, 1024, TCA_TAPRIO_SCHED_ENTRY_GATE_MASK, > &e->gatemask, sizeof(e->gatemask)); > ++ addattr_l(n, 1024, TCA_TAPRIO_SCHED_ENTRY_INTERVAL, > &e->interval, sizeof(e->interval)); > ++ > ++ addattr_nest_end(n, a); > ++ } > ++ > ++ return 0; > ++} > ++ > ++static void explain_sched_entry(void) > ++{ > ++ fprintf(stderr, "Usage: ... taprio ... sched-entry <cmd> <gate mask> > <interval>\n"); > ++} > ++ > ++static struct sched_entry *create_entry(uint32_t gatemask, uint32_t > interval, uint8_t cmd) > ++{ > ++ struct sched_entry *e; > ++ > ++ e = calloc(1, sizeof(*e)); > ++ if (!e) > ++ return NULL; > ++ > ++ e->gatemask = gatemask; > ++ e->interval = interval; > ++ e->cmd = cmd; > ++ > ++ return e; > ++} > ++ > ++static int taprio_parse_opt(struct qdisc_util *qu, int argc, > ++ char **argv, struct nlmsghdr *n, const char *dev) > ++{ > ++ __s32 clockid = CLOCKID_INVALID; > ++ struct tc_mqprio_qopt opt = { }; > ++ struct list_head sched_entries; > ++ struct rtattr *tail; > ++ __s64 base_time = 0; > ++ int err, idx; > ++ > ++ INIT_LIST_HEAD(&sched_entries); > ++ > ++ while (argc > 0) { > ++ idx = 0; > ++ if (strcmp(*argv, "num_tc") == 0) { > ++ NEXT_ARG(); > ++ if (get_u8(&opt.num_tc, *argv, 10)) { > ++ fprintf(stderr, "Illegal \"num_tc\"\n"); > ++ return -1; > ++ } > ++ } else if (strcmp(*argv, "map") == 0) { > ++ while (idx < TC_QOPT_MAX_QUEUE && NEXT_ARG_OK()) { > ++ NEXT_ARG(); > ++ if (get_u8(&opt.prio_tc_map[idx], *argv, 10)) { > ++ PREV_ARG(); > ++ break; > ++ } > ++ idx++; > ++ } > ++ for ( ; idx < TC_QOPT_MAX_QUEUE; idx++) > ++ opt.prio_tc_map[idx] = 0; > ++ } else if (strcmp(*argv, "queues") == 0) { > ++ char *tmp, *tok; > ++ > ++ while (idx < TC_QOPT_MAX_QUEUE && NEXT_ARG_OK()) { > ++ NEXT_ARG(); > ++ > ++ tmp = strdup(*argv); > ++ if (!tmp) > ++ break; > ++ > ++ tok = strtok(tmp, "@"); > ++ if (get_u16(&opt.count[idx], tok, 10)) { > ++ free(tmp); > ++ PREV_ARG(); > ++ break; > ++ } > ++ tok = strtok(NULL, "@"); > ++ if (get_u16(&opt.offset[idx], tok, 10)) { > ++ free(tmp); > ++ PREV_ARG(); > ++ break; > ++ } > ++ free(tmp); > ++ idx++; > ++ } > ++ } else if (strcmp(*argv, "sched-entry") == 0) { > ++ uint32_t mask, interval; > ++ struct sched_entry *e; > ++ uint8_t cmd; > ++ > ++ NEXT_ARG(); > ++ err = str_to_entry_cmd(*argv); > ++ if (err < 0) { > ++ explain_sched_entry(); > ++ return -1; > ++ } > ++ cmd = err; > ++ > ++ NEXT_ARG(); > ++ if (get_u32(&mask, *argv, 16)) { > ++ explain_sched_entry(); > ++ return -1; > ++ } > ++ > ++ NEXT_ARG(); > ++ if (get_u32(&interval, *argv, 0)) { > ++ explain_sched_entry(); > ++ return -1; > ++ } > ++ > ++ e = create_entry(mask, interval, cmd); > ++ if (!e) { > ++ fprintf(stderr, "taprio: not enough memory for > new schedule entry\n"); > ++ return -1; > ++ } > ++ > ++ list_add_tail(&e->list, &sched_entries); > ++ > ++ } else if (strcmp(*argv, "base-time") == 0) { > ++ NEXT_ARG(); > ++ if (get_s64(&base_time, *argv, 10)) { > ++ PREV_ARG(); > ++ break; > ++ } > ++ } else if (strcmp(*argv, "clockid") == 0) { > ++ NEXT_ARG(); > ++ if (clockid != CLOCKID_INVALID) { > ++ fprintf(stderr, "taprio: duplicate \"clockid\" > specification\n"); > ++ return -1; > ++ } > ++ if (get_clockid(&clockid, *argv)) { > ++ explain_clockid(*argv); > ++ return -1; > ++ } > ++ } else if (strcmp(*argv, "help") == 0) { > ++ explain(); > ++ return -1; > ++ } else { > ++ fprintf(stderr, "Unknown argument\n"); > ++ return -1; > ++ } > ++ argc--; argv++; > ++ } > ++ > ++ tail = NLMSG_TAIL(n); > ++ addattr_l(n, 1024, TCA_OPTIONS, NULL, 0); > ++ > ++ if (opt.num_tc > 0) > ++ addattr_l(n, 1024, TCA_TAPRIO_ATTR_PRIOMAP, &opt, sizeof(opt)); > ++ > ++ if (base_time) > ++ addattr_l(n, 1024, TCA_TAPRIO_ATTR_SCHED_BASE_TIME, &base_time, > sizeof(base_time)); > ++ > ++ addattr_l(n, 1024, TCA_TAPRIO_ATTR_SCHED_CLOCKID, &clockid, > sizeof(clockid)); > ++ > ++ if (!list_empty(&sched_entries)) { > ++ struct rtattr *entry_list; > ++ entry_list = addattr_nest(n, 1024, > TCA_TAPRIO_ATTR_SCHED_ENTRY_LIST | NLA_F_NESTED); > ++ > ++ err = add_sched_list(&sched_entries, n); > ++ if (err < 0) { > ++ fprintf(stderr, "Could not add schedule to netlink > message\n"); > ++ return -1; > ++ } > ++ > ++ addattr_nest_end(n, entry_list); > ++ } > ++ > ++ tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail; > ++ > ++ return 0; > ++} > ++ > ++static int print_sched_list(FILE *f, struct rtattr *list) > ++{ > ++ struct rtattr *item; > ++ int rem; > ++ > ++ if (list == NULL) > ++ return 0; > ++ > ++ rem = RTA_PAYLOAD(list); > ++ > ++ open_json_array(PRINT_JSON, "schedule"); > ++ > ++ for (item = RTA_DATA(list); RTA_OK(item, rem); item = RTA_NEXT(item, > rem)) { > ++ struct rtattr *tb[TCA_TAPRIO_SCHED_ENTRY_MAX + 1]; > ++ __u32 index = 0, gatemask = 0, interval = 0; > ++ __u8 command = 0; > ++ > ++ parse_rtattr_nested(tb, TCA_TAPRIO_SCHED_ENTRY_MAX, item); > ++ > ++ if (tb[TCA_TAPRIO_SCHED_ENTRY_INDEX]) > ++ index = > rta_getattr_u32(tb[TCA_TAPRIO_SCHED_ENTRY_INDEX]); > ++ > ++ if (tb[TCA_TAPRIO_SCHED_ENTRY_CMD]) > ++ command = > rta_getattr_u8(tb[TCA_TAPRIO_SCHED_ENTRY_CMD]); > ++ > ++ if (tb[TCA_TAPRIO_SCHED_ENTRY_GATE_MASK]) > ++ gatemask = > rta_getattr_u32(tb[TCA_TAPRIO_SCHED_ENTRY_GATE_MASK]); > ++ > ++ if (tb[TCA_TAPRIO_SCHED_ENTRY_INTERVAL]) > ++ interval = > rta_getattr_u32(tb[TCA_TAPRIO_SCHED_ENTRY_INTERVAL]); > ++ > ++ open_json_object(NULL); > ++ print_uint(PRINT_ANY, "index", "\tindex %u", index); > ++ print_string(PRINT_ANY, "cmd", " cmd %s", > entry_cmd_to_str(command)); > ++ print_0xhex(PRINT_ANY, "gatemask", " gatemask %#x", gatemask); > ++ print_uint(PRINT_ANY, "interval", " interval %u", interval); > ++ close_json_object(); > ++ > ++ print_string(PRINT_FP, NULL, "%s", _SL_); > ++ } > ++ > ++ close_json_array(PRINT_ANY, ""); > ++ > ++ return 0; > ++} > ++ > ++static int taprio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr > *opt) > ++{ > ++ struct rtattr *tb[TCA_TAPRIO_ATTR_MAX + 1]; > ++ struct tc_mqprio_qopt *qopt = 0; > ++ __s32 clockid = CLOCKID_INVALID; > ++ __s64 base_time = 0; > ++ int i; > ++ > ++ if (opt == NULL) > ++ return 0; > ++ > ++ parse_rtattr_nested(tb, TCA_TAPRIO_ATTR_MAX, opt); > ++ > ++ if (tb[TCA_TAPRIO_ATTR_PRIOMAP] == NULL) > ++ return -1; > ++ > ++ qopt = RTA_DATA(tb[TCA_TAPRIO_ATTR_PRIOMAP]); > ++ > ++ print_uint(PRINT_ANY, "tc", "tc %u ", qopt->num_tc); > ++ > ++ open_json_array(PRINT_ANY, "map"); > ++ for (i = 0; i <= TC_PRIO_MAX; i++) > ++ print_uint(PRINT_ANY, NULL, " %u", qopt->prio_tc_map[i]); > ++ close_json_array(PRINT_ANY, ""); > ++ > ++ print_string(PRINT_FP, NULL, "%s", _SL_); > ++ > ++ open_json_array(PRINT_ANY, "queues"); > ++ for (i = 0; i < qopt->num_tc; i++) { > ++ open_json_object(NULL); > ++ print_uint(PRINT_ANY, "offset", " offset %u", qopt->offset[i]); > ++ print_uint(PRINT_ANY, "count", " count %u", qopt->count[i]); > ++ close_json_object(); > ++ } > ++ close_json_array(PRINT_ANY, ""); > ++ > ++ print_string(PRINT_FP, NULL, "%s", _SL_); > ++ > ++ if (tb[TCA_TAPRIO_ATTR_SCHED_BASE_TIME]) > ++ base_time = > rta_getattr_s64(tb[TCA_TAPRIO_ATTR_SCHED_BASE_TIME]); > ++ > ++ if (tb[TCA_TAPRIO_ATTR_SCHED_CLOCKID]) > ++ clockid = rta_getattr_s32(tb[TCA_TAPRIO_ATTR_SCHED_CLOCKID]); > ++ > ++ print_string(PRINT_ANY, "clockid", "clockid %s", > get_clock_name(clockid)); > ++ > ++ print_lluint(PRINT_ANY, "base_time", " base-time %lld", base_time); > ++ > ++ print_string(PRINT_FP, NULL, "%s", _SL_); > ++ > ++ return print_sched_list(f, tb[TCA_TAPRIO_ATTR_SCHED_ENTRY_LIST]); > ++} > ++ > ++struct qdisc_util taprio_qdisc_util = { > ++ .id = "taprio", > ++ .parse_qopt = taprio_parse_opt, > ++ .print_qopt = taprio_print_opt, > ++}; > +-- > +2.18.1 > + > diff --git > a/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0005-taprio-Add-manpage-for-tc-taprio-8.patch > > b/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0005-taprio-Add-manpage-for-tc-taprio-8.patch > new file mode 100644 > index 0000000..a8bbcd0 > --- /dev/null > +++ > b/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0005-taprio-Add-manpage-for-tc-taprio-8.patch > @@ -0,0 +1,168 @@ > +From b21190927e151761f138805cf3c208f8d28e8314 Mon Sep 17 00:00:00 2001 > +From: Vinicius Costa Gomes <vinicius.go...@intel.com> > +Date: Fri, 5 Oct 2018 16:25:22 -0700 > +Subject: [PATCH 05/12] taprio: Add manpage for tc-taprio(8) > + > +commit 579acb4bc52f84c629df5fcd2f9a054f41b48c57 upstream. > + > +This documents the parameters and provides an example of usage. > + > +Signed-off-by: Vinicius Costa Gomes <vinicius.go...@intel.com> > +Signed-off-by: David Ahern <dsah...@gmail.com> > +Signed-off-by: Murali Karicheri <m-kariche...@ti.com> > +--- > + man/man8/tc-taprio.8 | 142 +++++++++++++++++++++++++++++++++++++++++++ > + 1 file changed, 142 insertions(+) > + create mode 100644 man/man8/tc-taprio.8 > + > +diff --git a/man/man8/tc-taprio.8 b/man/man8/tc-taprio.8 > +new file mode 100644 > +index 00000000..92055b43 > +--- /dev/null > ++++ b/man/man8/tc-taprio.8 > +@@ -0,0 +1,142 @@ > ++.TH TAPRIO 8 "25 Sept 2018" "iproute2" "Linux" > ++.SH NAME > ++TAPRIO \- Time Aware Priority Shaper > ++.SH SYNOPSIS > ++.B tc qdisc ... dev > ++dev > ++.B parent > ++classid > ++.B [ handle > ++major: > ++.B ] taprio num_tc > ++tcs > ++.ti +8 > ++.B map > ++P0 P1 P2 ... > ++.B queues > ++count1@offset1 count2@offset2 ... > ++.ti +8 > ++.B base-time > ++base-time > ++.B clockid > ++clockid > ++.ti +8 > ++.B sched-entry > ++<command 1> <gate mask 1> <interval 1> > ++.ti +8 > ++.B sched-entry > ++<command 2> <gate mask 2> <interval 2> > ++.ti +8 > ++.B sched-entry > ++<command 3> <gate mask 3> <interval 3> > ++.ti +8 > ++.B sched-entry > ++<command N> <gate mask N> <interval N> > ++ > ++.SH DESCRIPTION > ++The TAPRIO qdisc implements a simplified version of the scheduling > ++state machine defined by IEEE 802.1Q-2018 Section 8.6.9, which allows > ++configuration of a sequence of gate states, where each gate state > ++allows outgoing traffic for a subset (potentially empty) of traffic > ++classes. > ++ > ++How traffic is mapped to different hardware queues is similar to > ++.BR mqprio(8) > ++and so the > ++.B map > ++and > ++.Q queues > ++parameters have the same meaning. > ++ > ++The other parameters specify the schedule, and at what point in time > ++it should start (it can behave as the schedule started in the past). > ++ > ++.SH PARAMETERS > ++.TP > ++num_tc > ++.BR > ++Number of traffic classes to use. Up to 16 classes supported. > ++ > ++.TP > ++map > ++.br > ++The priority to traffic class map. Maps priorities 0..15 to a specified > ++traffic class. See > ++.BR mqprio(8) > ++for more details. > ++ > ++.TP > ++queues > ++.br > ++Provide count and offset of queue range for each traffic class. In the > ++format, > ++.B count@offset. > ++Queue ranges for each traffic classes cannot overlap and must be a > ++contiguous range of queues. > ++ > ++.TP > ++base-time > ++.br > ++Specifies the instant in nanoseconds, using the reference of > ++.B clockid, > ++defining the time when the schedule starts. If 'base-time' is a time > ++in the past, the schedule will start at > ++ > ++base-time + (N * cycle-time) > ++ > ++where N is the smallest integer so the resulting time is greater than > ++"now", and "cycle-time" is the sum of all the intervals of the entries > ++in the schedule; > ++ > ++.TP > ++clockid > ++.br > ++Specifies the clock to be used by qdisc's internal timer for measuring > ++time and scheduling events. > ++ > ++.TP > ++sched-entry > ++.br > ++There may multiple > ++.B sched-entry > ++parameters in a single schedule. Each one has the > ++ > ++sched-entry <command> <gatemask> <interval> > ++ > ++format. The only supported <command> is "S", which > ++means "SetGateStates", following the IEEE 802.1Q-2018 definition > ++(Table 8-7). <gate mask> is a bitmask where each bit is a associated > ++with a traffic class, so bit 0 (the least significant bit) being "on" > ++means that traffic class 0 is "active" for that schedule entry. > ++<interval> is a time duration, in nanoseconds, that specifies for how > ++long that state defined by <command> and <gate mask> should be held > ++before moving to the next entry. > ++ > ++.SH EXAMPLES > ++ > ++The following example shows how an traffic schedule with three traffic > ++classes ("num_tc 3"), which are separated different traffic classes, > ++we are going to call these TC 0, TC 1 and TC 2. We could read the > ++"map" parameter below as: traffic with priority 3 is classified as TC > ++0, priority 2 is classified as TC 1 and the rest is classified as TC > ++2. > ++ > ++The schedule will start at instant 1528743495910289987 using the > ++reference CLOCK_TAI. The schedule is composed of three entries each of > ++300us duration. > ++ > ++.EX > ++# tc qdisc replace dev eth0 parent root handle 100 taprio \\ > ++ num_tc 3 \\ > ++ map 2 2 1 0 2 2 2 2 2 2 2 2 2 2 2 2 \\ > ++ queues 1@0 1@1 2@2 \\ > ++ base-time 1528743495910289987 \\ > ++ sched-entry S 01 300000 \\ > ++ sched-entry S 02 300000 \\ > ++ sched-entry S 04 300000 \\ > ++ clockid CLOCK_TAI > ++.EE > ++ > ++ > ++.SH AUTHORS > ++Vinicius Costa Gomes <vinicius.go...@intel.com> > +-- > +2.18.1 > + > diff --git > a/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0006-taprio-Add-support-for-changing-schedules.patch > > b/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0006-taprio-Add-support-for-changing-schedules.patch > new file mode 100644 > index 0000000..f0dd3db > --- /dev/null > +++ > b/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0006-taprio-Add-support-for-changing-schedules.patch > @@ -0,0 +1,150 @@ > +From 3a650c67b63e502989fccdabf8c02a575bdf2116 Mon Sep 17 00:00:00 2001 > +From: Vinicius Costa Gomes <vinicius.go...@intel.com> > +Date: Mon, 29 Apr 2019 15:52:18 -0700 > +Subject: [PATCH 06/12] taprio: Add support for changing schedules > + > +commit 602fae856d80bbaa365fd0421e3f2c2417ea804f upstream. > + > +This allows for a new schedule to be specified during runtime, without > +removing the current one. > + > +For that, the semantics of the 'tc qdisc change' operation in the > +context of taprio is that if "change" is called and there is a running > +schedule, a new schedule is created and the base-time (let's call it > +X) of this new schedule is used so at instant X, it becomes the > +"current" schedule. So, in short, "change" doesn't change the current > +schedule, it creates a new one and sets it up to it becomes the > +current one at some point. > + > +In IEEE 802.1Q terms, it means that we have support for the > +"Oper" (current and read-only) and "Admin" (future and mutable) > +schedules. > + > +Example of creating the first schedule, then adding a new one: > + > +(1) > +tc qdisc add dev IFACE parent root handle 100 taprio \ > + num_tc 1 \ > + map 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 \ > + queues 1@0 \ > + sched-entry S 0x1 1000000 \ > + sched-entry S 0x0 2000000 \ > + sched-entry S 0x1 3000000 \ > + sched-entry S 0x0 4000000 \ > + base-time 100000000 \ > + clockid CLOCK_TAI > + > +(2) > +tc qdisc change dev IFACE parent root handle 100 taprio \ > + base-time 7500000000000 \ > + sched-entry S 0x0 5000000 \ > + sched-entry S 0x1 5000000 \ > + > +It was necessary to fix a bug, so the clockid doesn't need to be > +specified when changing the schedule. > + > +Most of the changes are related to make it easier to reuse the same > +function for printing the "admin" and "oper" schedules. > + > +Signed-off-by: Vinicius Costa Gomes <vinicius.go...@intel.com> > +Signed-off-by: David Ahern <dsah...@gmail.com> > +Signed-off-by: Murali Karicheri <m-kariche...@ti.com> > +--- > + tc/q_taprio.c | 42 +++++++++++++++++++++++++++++++++--------- > + 1 file changed, 33 insertions(+), 9 deletions(-) > + > +diff --git a/tc/q_taprio.c b/tc/q_taprio.c > +index 562dacb8..20804fc2 100644 > +--- a/tc/q_taprio.c > ++++ b/tc/q_taprio.c > +@@ -268,14 +268,15 @@ static int taprio_parse_opt(struct qdisc_util *qu, int > argc, > + tail = NLMSG_TAIL(n); > + addattr_l(n, 1024, TCA_OPTIONS, NULL, 0); > + > ++ if (clockid != CLOCKID_INVALID) > ++ addattr_l(n, 1024, TCA_TAPRIO_ATTR_SCHED_CLOCKID, &clockid, > sizeof(clockid)); > ++ > + if (opt.num_tc > 0) > + addattr_l(n, 1024, TCA_TAPRIO_ATTR_PRIOMAP, &opt, sizeof(opt)); > + > + if (base_time) > + addattr_l(n, 1024, TCA_TAPRIO_ATTR_SCHED_BASE_TIME, &base_time, > sizeof(base_time)); > + > +- addattr_l(n, 1024, TCA_TAPRIO_ATTR_SCHED_CLOCKID, &clockid, > sizeof(clockid)); > +- > + if (!list_empty(&sched_entries)) { > + struct rtattr *entry_list; > + entry_list = addattr_nest(n, 1024, > TCA_TAPRIO_ATTR_SCHED_ENTRY_LIST | NLA_F_NESTED); > +@@ -306,6 +307,8 @@ static int print_sched_list(FILE *f, struct rtattr *list) > + > + open_json_array(PRINT_JSON, "schedule"); > + > ++ print_string(PRINT_FP, NULL, "%s", _SL_); > ++ > + for (item = RTA_DATA(list); RTA_OK(item, rem); item = RTA_NEXT(item, > rem)) { > + struct rtattr *tb[TCA_TAPRIO_SCHED_ENTRY_MAX + 1]; > + __u32 index = 0, gatemask = 0, interval = 0; > +@@ -340,12 +343,25 @@ static int print_sched_list(FILE *f, struct rtattr > *list) > + return 0; > + } > + > ++static int print_schedule(FILE *f, struct rtattr **tb) > ++{ > ++ int64_t base_time = 0; > ++ > ++ if (tb[TCA_TAPRIO_ATTR_SCHED_BASE_TIME]) > ++ base_time = > rta_getattr_s64(tb[TCA_TAPRIO_ATTR_SCHED_BASE_TIME]); > ++ > ++ print_lluint(PRINT_ANY, "base_time", "\tbase-time %lld", base_time); > ++ > ++ print_sched_list(f, tb[TCA_TAPRIO_ATTR_SCHED_ENTRY_LIST]); > ++ > ++ return 0; > ++} > ++ > + static int taprio_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr > *opt) > + { > + struct rtattr *tb[TCA_TAPRIO_ATTR_MAX + 1]; > + struct tc_mqprio_qopt *qopt = 0; > + __s32 clockid = CLOCKID_INVALID; > +- __s64 base_time = 0; > + int i; > + > + if (opt == NULL) > +@@ -378,19 +394,27 @@ static int taprio_print_opt(struct qdisc_util *qu, > FILE *f, struct rtattr *opt) > + > + print_string(PRINT_FP, NULL, "%s", _SL_); > + > +- if (tb[TCA_TAPRIO_ATTR_SCHED_BASE_TIME]) > +- base_time = > rta_getattr_s64(tb[TCA_TAPRIO_ATTR_SCHED_BASE_TIME]); > +- > + if (tb[TCA_TAPRIO_ATTR_SCHED_CLOCKID]) > + clockid = rta_getattr_s32(tb[TCA_TAPRIO_ATTR_SCHED_CLOCKID]); > + > + print_string(PRINT_ANY, "clockid", "clockid %s", > get_clock_name(clockid)); > + > +- print_lluint(PRINT_ANY, "base_time", " base-time %lld", base_time); > ++ print_schedule(f, tb); > + > +- print_string(PRINT_FP, NULL, "%s", _SL_); > ++ if (tb[TCA_TAPRIO_ATTR_ADMIN_SCHED]) { > ++ struct rtattr *t[TCA_TAPRIO_ATTR_MAX + 1]; > ++ > ++ parse_rtattr_nested(t, TCA_TAPRIO_ATTR_MAX, > ++ tb[TCA_TAPRIO_ATTR_ADMIN_SCHED]); > + > +- return print_sched_list(f, tb[TCA_TAPRIO_ATTR_SCHED_ENTRY_LIST]); > ++ open_json_object(NULL); > ++ > ++ print_schedule(f, t); > ++ > ++ close_json_object(); > ++ } > ++ > ++ return 0; > + } > + > + struct qdisc_util taprio_qdisc_util = { > +-- > +2.18.1 > + > diff --git > a/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0007-taprio-Add-support-for-cycle_time-and-cycle_time_ext.patch > > b/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0007-taprio-Add-support-for-cycle_time-and-cycle_time_ext.patch > new file mode 100644 > index 0000000..6895a6a > --- /dev/null > +++ > b/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0007-taprio-Add-support-for-cycle_time-and-cycle_time_ext.patch > @@ -0,0 +1,147 @@ > +From 538fe8f7e208c7ed7c9af191c25b3c48adb348c3 Mon Sep 17 00:00:00 2001 > +From: Vinicius Costa Gomes <vinicius.go...@intel.com> > +Date: Mon, 29 Apr 2019 15:52:19 -0700 > +Subject: [PATCH 07/12] taprio: Add support for cycle_time and > + cycle_time_extension > + > +commit 92f4b6032e7971d9b0247d7370c08cae2f1c58f9 upstream. > + > +This allows a cycle-time and a cycle-time-extension to be specified. > + > +Specifying a cycle-time will truncate that cycle, so when that instant > +is reached, the cycle will start from its beginning. > + > +A cycle-time-extension may cause the last entry of a cycle, just > +before the start of a new schedule (the base-time of the "admin" > +schedule) to be extended by at maximum "cycle-time-extension" > +nanoseconds. The idea of this feauture, as described by the IEEE > +802.1Q, is too avoid too narrow gate states. > + > +Example: > + > +tc qdisc change dev IFACE parent root handle 100 taprio \ > + sched-entry S 0x1 1000000 \ > + sched-entry S 0x0 2000000 \ > + sched-entry S 0x1 3000000 \ > + sched-entry S 0x0 4000000 \ > + cycle-time-extension 100000 \ > + cycle-time 9000000 \ > + base-time 12345678900000000 > + > +Signed-off-by: Vinicius Costa Gomes <vinicius.go...@intel.com> > +Signed-off-by: David Ahern <dsah...@gmail.com> > +Signed-off-by: Murali Karicheri <m-kariche...@ti.com> > +--- > + tc/q_taprio.c | 64 ++++++++++++++++++++++++++++++++++++++++++--------- > + 1 file changed, 53 insertions(+), 11 deletions(-) > + > +diff --git a/tc/q_taprio.c b/tc/q_taprio.c > +index 20804fc2..9a69b86b 100644 > +--- a/tc/q_taprio.c > ++++ b/tc/q_taprio.c > +@@ -155,8 +155,10 @@ static int taprio_parse_opt(struct qdisc_util *qu, int > argc, > + { > + __s32 clockid = CLOCKID_INVALID; > + struct tc_mqprio_qopt opt = { }; > ++ __s64 cycle_time_extension = 0; > + struct list_head sched_entries; > +- struct rtattr *tail; > ++ struct rtattr *tail, *l; > ++ __s64 cycle_time = 0; > + __s64 base_time = 0; > + int err, idx; > + > +@@ -245,6 +247,29 @@ static int taprio_parse_opt(struct qdisc_util *qu, int > argc, > + PREV_ARG(); > + break; > + } > ++ } else if (strcmp(*argv, "cycle-time") == 0) { > ++ NEXT_ARG(); > ++ if (cycle_time) { > ++ fprintf(stderr, "taprio: duplicate > \"cycle-time\" specification\n"); > ++ return -1; > ++ } > ++ > ++ if (get_s64(&cycle_time, *argv, 10)) { > ++ PREV_ARG(); > ++ break; > ++ } > ++ > ++ } else if (strcmp(*argv, "cycle-time-extension") == 0) { > ++ NEXT_ARG(); > ++ if (cycle_time_extension) { > ++ fprintf(stderr, "taprio: duplicate > \"cycle-time-extension\" specification\n"); > ++ return -1; > ++ } > ++ > ++ if (get_s64(&cycle_time_extension, *argv, 10)) { > ++ PREV_ARG(); > ++ break; > ++ } > + } else if (strcmp(*argv, "clockid") == 0) { > + NEXT_ARG(); > + if (clockid != CLOCKID_INVALID) { > +@@ -277,19 +302,24 @@ static int taprio_parse_opt(struct qdisc_util *qu, int > argc, > + if (base_time) > + addattr_l(n, 1024, TCA_TAPRIO_ATTR_SCHED_BASE_TIME, &base_time, > sizeof(base_time)); > + > +- if (!list_empty(&sched_entries)) { > +- struct rtattr *entry_list; > +- entry_list = addattr_nest(n, 1024, > TCA_TAPRIO_ATTR_SCHED_ENTRY_LIST | NLA_F_NESTED); > ++ if (cycle_time) > ++ addattr_l(n, 1024, TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME, > ++ &cycle_time, sizeof(cycle_time)); > + > +- err = add_sched_list(&sched_entries, n); > +- if (err < 0) { > +- fprintf(stderr, "Could not add schedule to netlink > message\n"); > +- return -1; > +- } > ++ if (cycle_time_extension) > ++ addattr_l(n, 1024, TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME_EXTENSION, > ++ &cycle_time_extension, sizeof(cycle_time_extension)); > ++ > ++ l = addattr_nest(n, 1024, TCA_TAPRIO_ATTR_SCHED_ENTRY_LIST | > NLA_F_NESTED); > + > +- addattr_nest_end(n, entry_list); > ++ err = add_sched_list(&sched_entries, n); > ++ if (err < 0) { > ++ fprintf(stderr, "Could not add schedule to netlink message\n"); > ++ return -1; > + } > + > ++ addattr_nest_end(n, l); > ++ > + tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail; > + > + return 0; > +@@ -345,13 +375,25 @@ static int print_sched_list(FILE *f, struct rtattr > *list) > + > + static int print_schedule(FILE *f, struct rtattr **tb) > + { > +- int64_t base_time = 0; > ++ int64_t base_time = 0, cycle_time = 0, cycle_time_extension = 0; > + > + if (tb[TCA_TAPRIO_ATTR_SCHED_BASE_TIME]) > + base_time = > rta_getattr_s64(tb[TCA_TAPRIO_ATTR_SCHED_BASE_TIME]); > + > ++ if (tb[TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME]) > ++ cycle_time = > rta_getattr_s64(tb[TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME]); > ++ > ++ if (tb[TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME_EXTENSION]) > ++ cycle_time_extension = rta_getattr_s64( > ++ tb[TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME_EXTENSION]); > ++ > + print_lluint(PRINT_ANY, "base_time", "\tbase-time %lld", base_time); > + > ++ print_lluint(PRINT_ANY, "cycle_time", " cycle-time %lld", cycle_time); > ++ > ++ print_lluint(PRINT_ANY, "cycle_time_extension", > ++ " cycle-time-extension %lld", cycle_time_extension); > ++ > + print_sched_list(f, tb[TCA_TAPRIO_ATTR_SCHED_ENTRY_LIST]); > + > + return 0; > +-- > +2.18.1 > + > diff --git > a/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0008-utils-Fix-get_s64-function.patch > > b/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0008-utils-Fix-get_s64-function.patch > new file mode 100644 > index 0000000..cc265f8 > --- /dev/null > +++ > b/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0008-utils-Fix-get_s64-function.patch > @@ -0,0 +1,34 @@ > +From 0c672a07e1d5a8068f2323e88a72e5349dacbed9 Mon Sep 17 00:00:00 2001 > +From: Kurt Kanzenbach <k...@linutronix.de> > +Date: Thu, 4 Jul 2019 14:24:27 +0200 > +Subject: [PATCH 08/12] utils: Fix get_s64() function > + > +commit c875433b145e33645798ecfe4d99bcb28c80d1e9 upstream. > + > +get_s64() uses internally strtoll() to parse the value out of a given > +string. strtoll() returns a long long. However, the intermediate variable is > +long only which might be 32 bit on some systems. So, fix it. > + > +Signed-off-by: Kurt Kanzenbach <k...@linutronix.de> > +Signed-off-by: Stephen Hemminger <step...@networkplumber.org> > +Signed-off-by: Murali Karicheri <m-kariche...@ti.com> > +--- > + lib/utils.c | 2 +- > + 1 file changed, 1 insertion(+), 1 deletion(-) > + > +diff --git a/lib/utils.c b/lib/utils.c > +index be29530f..9c121ce3 100644 > +--- a/lib/utils.c > ++++ b/lib/utils.c > +@@ -386,7 +386,7 @@ int get_u8(__u8 *val, const char *arg, int base) > + > + int get_s64(__s64 *val, const char *arg, int base) > + { > +- long res; > ++ long long res; > + char *ptr; > + > + errno = 0; > +-- > +2.18.1 > + > diff --git > a/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0009-taprio-Add-support-for-setting-flags.patch > > b/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0009-taprio-Add-support-for-setting-flags.patch > new file mode 100644 > index 0000000..4f2ffde > --- /dev/null > +++ > b/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0009-taprio-Add-support-for-setting-flags.patch > @@ -0,0 +1,77 @@ > +From 7e5c69b7a4733f099ca53aecfafa5dac4a3a002d Mon Sep 17 00:00:00 2001 > +From: Vinicius Costa Gomes <vinicius.go...@intel.com> > +Date: Thu, 18 Jul 2019 12:55:40 -0700 > +Subject: [PATCH 09/12] taprio: Add support for setting flags > + > +commit ee000bf217870b6425849c03b309faa64539ff24 upstream. > + > +This allows a new parameter, flags, to be passed to taprio. Currently, it > +only supports enabling the txtime-assist mode. But, we plan to add > +different modes for taprio (e.g. hardware offloading) and this parameter > +will be useful in enabling those modes. > + > +Signed-off-by: Vinicius Costa Gomes <vinicius.go...@intel.com> > +Signed-off-by: Vedang Patel <vedang.pa...@intel.com> > +Signed-off-by: David Ahern <dsah...@gmail.com> > +Signed-off-by: Murali Karicheri <m-kariche...@ti.com> > +--- > + tc/q_taprio.c | 22 ++++++++++++++++++++++ > + 1 file changed, 22 insertions(+) > + > +diff --git a/tc/q_taprio.c b/tc/q_taprio.c > +index 9a69b86b..91e3f27b 100644 > +--- a/tc/q_taprio.c > ++++ b/tc/q_taprio.c > +@@ -158,6 +158,7 @@ static int taprio_parse_opt(struct qdisc_util *qu, int > argc, > + __s64 cycle_time_extension = 0; > + struct list_head sched_entries; > + struct rtattr *tail, *l; > ++ __u32 taprio_flags = 0; > + __s64 cycle_time = 0; > + __s64 base_time = 0; > + int err, idx; > +@@ -280,6 +281,17 @@ static int taprio_parse_opt(struct qdisc_util *qu, int > argc, > + explain_clockid(*argv); > + return -1; > + } > ++ } else if (strcmp(*argv, "flags") == 0) { > ++ NEXT_ARG(); > ++ if (taprio_flags) { > ++ fprintf(stderr, "taprio: duplicate \"flags\" > specification\n"); > ++ return -1; > ++ } > ++ if (get_u32(&taprio_flags, *argv, 0)) { > ++ PREV_ARG(); > ++ return -1; > ++ } > ++ > + } else if (strcmp(*argv, "help") == 0) { > + explain(); > + return -1; > +@@ -296,6 +308,9 @@ static int taprio_parse_opt(struct qdisc_util *qu, int > argc, > + if (clockid != CLOCKID_INVALID) > + addattr_l(n, 1024, TCA_TAPRIO_ATTR_SCHED_CLOCKID, &clockid, > sizeof(clockid)); > + > ++ if (taprio_flags) > ++ addattr_l(n, 1024, TCA_TAPRIO_ATTR_FLAGS, &taprio_flags, > sizeof(taprio_flags)); > ++ > + if (opt.num_tc > 0) > + addattr_l(n, 1024, TCA_TAPRIO_ATTR_PRIOMAP, &opt, sizeof(opt)); > + > +@@ -441,6 +456,13 @@ static int taprio_print_opt(struct qdisc_util *qu, FILE > *f, struct rtattr *opt) > + > + print_string(PRINT_ANY, "clockid", "clockid %s", > get_clock_name(clockid)); > + > ++ if (tb[TCA_TAPRIO_ATTR_FLAGS]) { > ++ __u32 flags; > ++ > ++ flags = rta_getattr_u32(tb[TCA_TAPRIO_ATTR_FLAGS]); > ++ print_0xhex(PRINT_ANY, "flags", " flags %#x", flags); > ++ } > ++ > + print_schedule(f, tb); > + > + if (tb[TCA_TAPRIO_ATTR_ADMIN_SCHED]) { > +-- > +2.18.1 > + > diff --git > a/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0010-taprio-add-support-for-setting-txtime_delay.patch > > b/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0010-taprio-add-support-for-setting-txtime_delay.patch > new file mode 100644 > index 0000000..77c9580 > --- /dev/null > +++ > b/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0010-taprio-add-support-for-setting-txtime_delay.patch > @@ -0,0 +1,96 @@ > +From 1f018de4a624dac26e7c4ea2a6b47a63d1c9c45f Mon Sep 17 00:00:00 2001 > +From: Vedang Patel <vedang.pa...@intel.com> > +Date: Thu, 18 Jul 2019 12:55:41 -0700 > +Subject: [PATCH 10/12] taprio: add support for setting txtime_delay. > + > +commit a5e6ee3b34226f76c8be4b1e3e3ad82212ea4d50 upstream. > + > +This adds support for setting the txtime_delay parameter which is useful > +for the txtime offload mode of taprio. > + > +Signed-off-by: Vedang Patel <vedang.pa...@intel.com> > +Signed-off-by: David Ahern <dsah...@gmail.com> > +Signed-off-by: Murali Karicheri <m-kariche...@ti.com> > +--- > + tc/q_taprio.c | 37 ++++++++++++++++++++++++++++++------- > + 1 file changed, 30 insertions(+), 7 deletions(-) > + > +diff --git a/tc/q_taprio.c b/tc/q_taprio.c > +index 91e3f27b..5e498489 100644 > +--- a/tc/q_taprio.c > ++++ b/tc/q_taprio.c > +@@ -47,13 +47,14 @@ static const struct static_clockid { > + > + static void explain(void) > + { > +- fprintf(stderr, "Usage: ... taprio clockid CLOCKID\n"); > +- fprintf(stderr, " [num_tc NUMBER] [map P0 P1 ...] "); > +- fprintf(stderr, " [queues COUNT@OFFSET COUNT@OFFSET > COUNT@OFFSET ...] "); > +- fprintf(stderr, " [ [sched-entry index cmd gate-mask > interval] ... ] "); > +- fprintf(stderr, " [base-time time] "); > +- fprintf(stderr, "\nCLOCKID must be a valid SYS-V id (i.e. CLOCK_TAI)"); > +- fprintf(stderr, "\n"); > ++ fprintf(stderr, > ++ "Usage: ... taprio clockid CLOCKID\n" > ++ " [num_tc NUMBER] [map P0 P1 ...] " > ++ " [queues COUNT@OFFSET COUNT@OFFSET COUNT@OFFSET > ...] " > ++ " [ [sched-entry index cmd gate-mask interval] > ... ] " > ++ " [base-time time] [txtime-delay delay]" > ++ "\n" > ++ "CLOCKID must be a valid SYS-V id (i.e. CLOCK_TAI)\n"); > + } > + > + static void explain_clockid(const char *val) > +@@ -159,6 +160,7 @@ static int taprio_parse_opt(struct qdisc_util *qu, int > argc, > + struct list_head sched_entries; > + struct rtattr *tail, *l; > + __u32 taprio_flags = 0; > ++ __u32 txtime_delay = 0; > + __s64 cycle_time = 0; > + __s64 base_time = 0; > + int err, idx; > +@@ -292,6 +294,17 @@ static int taprio_parse_opt(struct qdisc_util *qu, int > argc, > + return -1; > + } > + > ++ } else if (strcmp(*argv, "txtime-delay") == 0) { > ++ NEXT_ARG(); > ++ if (txtime_delay != 0) { > ++ fprintf(stderr, "taprio: duplicate > \"txtime-delay\" specification\n"); > ++ return -1; > ++ } > ++ if (get_u32(&txtime_delay, *argv, 0)) { > ++ PREV_ARG(); > ++ return -1; > ++ } > ++ > + } else if (strcmp(*argv, "help") == 0) { > + explain(); > + return -1; > +@@ -314,6 +327,9 @@ static int taprio_parse_opt(struct qdisc_util *qu, int > argc, > + if (opt.num_tc > 0) > + addattr_l(n, 1024, TCA_TAPRIO_ATTR_PRIOMAP, &opt, sizeof(opt)); > + > ++ if (txtime_delay) > ++ addattr_l(n, 1024, TCA_TAPRIO_ATTR_TXTIME_DELAY, &txtime_delay, > sizeof(txtime_delay)); > ++ > + if (base_time) > + addattr_l(n, 1024, TCA_TAPRIO_ATTR_SCHED_BASE_TIME, &base_time, > sizeof(base_time)); > + > +@@ -463,6 +479,13 @@ static int taprio_print_opt(struct qdisc_util *qu, FILE > *f, struct rtattr *opt) > + print_0xhex(PRINT_ANY, "flags", " flags %#x", flags); > + } > + > ++ if (tb[TCA_TAPRIO_ATTR_TXTIME_DELAY]) { > ++ __u32 txtime_delay; > ++ > ++ txtime_delay = > rta_getattr_s32(tb[TCA_TAPRIO_ATTR_TXTIME_DELAY]); > ++ print_uint(PRINT_ANY, "txtime_delay", " txtime delay %d", > txtime_delay); > ++ } > ++ > + print_schedule(f, tb); > + > + if (tb[TCA_TAPRIO_ATTR_ADMIN_SCHED]) { > +-- > +2.18.1 > + > diff --git > a/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0011-tc-taprio-Update-documentation.patch > > b/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0011-tc-taprio-Update-documentation.patch > new file mode 100644 > index 0000000..a575e2e > --- /dev/null > +++ > b/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0011-tc-taprio-Update-documentation.patch > @@ -0,0 +1,80 @@ > +From 5932369560e2ad1deecafa829edd0e89170a3545 Mon Sep 17 00:00:00 2001 > +From: Vedang Patel <vedang.pa...@intel.com> > +Date: Thu, 18 Jul 2019 12:55:43 -0700 > +Subject: [PATCH 11/12] tc: taprio: Update documentation > + > +commit a794d0523711d5ab4530483b9435ba627e07d28b upstream. > + > +Add documentation for the latest options, flags and txtime-delay, to the > +taprio manpage. > + > +This also adds an example to run tc in txtime offload mode. > + > +Signed-off-by: Vedang Patel <vedang.pa...@intel.com> > +Signed-off-by: David Ahern <dsah...@gmail.com> > +Signed-off-by: Murali Karicheri <m-kariche...@ti.com> > +--- > + man/man8/tc-taprio.8 | 40 ++++++++++++++++++++++++++++++++++++++++ > + 1 file changed, 40 insertions(+) > + > +diff --git a/man/man8/tc-taprio.8 b/man/man8/tc-taprio.8 > +index 92055b43..2cb39da3 100644 > +--- a/man/man8/tc-taprio.8 > ++++ b/man/man8/tc-taprio.8 > +@@ -112,6 +112,26 @@ means that traffic class 0 is "active" for that > schedule entry. > + long that state defined by <command> and <gate mask> should be held > + before moving to the next entry. > + > ++.TP > ++flags > ++.br > ++Specifies different modes for taprio. Currently, only txtime-assist is > ++supported which can be enabled by setting it to 0x1. In this mode, taprio > will > ++set the transmit timestamp depending on the interval in which the packet > needs > ++to be transmitted. It will then utililize the > ++.BR etf(8) > ++qdisc to sort and transmit the packets at the right time. The second example > ++can be used as a reference to configure this mode. > ++ > ++.TP > ++txtime-delay > ++.br > ++This parameter is specific to the txtime offload mode. It specifies the > maximum > ++time a packet might take to reach the network card from the taprio qdisc. > The > ++value should always be greater than the delta specified in the > ++.BR etf(8) > ++qdisc. > ++ > + .SH EXAMPLES > + > + The following example shows how an traffic schedule with three traffic > +@@ -137,6 +157,26 @@ reference CLOCK_TAI. The schedule is composed of three > entries each of > + clockid CLOCK_TAI > + .EE > + > ++Following is an example to enable the txtime offload mode in taprio. See > ++.BR etf(8) > ++for more information about configuring the ETF qdisc. > ++ > ++.EX > ++# tc qdisc replace dev eth0 parent root handle 100 taprio \\ > ++ num_tc 3 \\ > ++ map 2 2 1 0 2 2 2 2 2 2 2 2 2 2 2 2 \\ > ++ queues 1@0 1@0 1@0 \\ > ++ base-time 1528743495910289987 \\ > ++ sched-entry S 01 300000 \\ > ++ sched-entry S 02 300000 \\ > ++ sched-entry S 04 400000 \\ > ++ flags 0x1 \\ > ++ txtime-delay 200000 \\ > ++ clockid CLOCK_TAI > ++ > ++# tc qdisc replace dev $IFACE parent 100:1 etf skip_skb_check \\ > ++ offload delta 200000 clockid CLOCK_TAI > ++.EE > + > + .SH AUTHORS > + Vinicius Costa Gomes <vinicius.go...@intel.com> > +-- > +2.18.1 > + > diff --git > a/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0012-sync-pkt_sched-header-with-kernel-version.patch > > b/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0012-sync-pkt_sched-header-with-kernel-version.patch > new file mode 100644 > index 0000000..0914b8d > --- /dev/null > +++ > b/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0012-sync-pkt_sched-header-with-kernel-version.patch > @@ -0,0 +1,128 @@ > +From 3736970b76dc41cd2d76399650709eab6a031807 Mon Sep 17 00:00:00 2001 > +From: Murali Karicheri <m-kariche...@ti.com> > +Date: Thu, 17 Oct 2019 17:50:18 -0400 > +Subject: [PATCH 12/12] sync pkt_sched header with kernel version > + > +For picking taprio specific definitions, sync up the pkt_sched.h with > +kernel header. > + > +Signed-off-by: Murali Karicheri <m-kariche...@ti.com> > +--- > + include/uapi/linux/const.h | 31 ++++++++++++++++ > + include/uapi/linux/pkt_sched.h | 64 ++++++++++++++++++++++++++++++++++ > + 2 files changed, 95 insertions(+) > + create mode 100644 include/uapi/linux/const.h > + > +diff --git a/include/uapi/linux/const.h b/include/uapi/linux/const.h > +new file mode 100644 > +index 00000000..fd885c79 > +--- /dev/null > ++++ b/include/uapi/linux/const.h > +@@ -0,0 +1,31 @@ > ++/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ > ++/* const.h: Macros for dealing with constants. */ > ++ > ++#ifndef _LINUX_CONST_H > ++#define _LINUX_CONST_H > ++ > ++/* Some constant macros are used in both assembler and > ++ * C code. Therefore we cannot annotate them always with > ++ * 'UL' and other type specifiers unilaterally. We > ++ * use the following macros to deal with this. > ++ * > ++ * Similarly, _AT() will cast an expression with a type in C, but > ++ * leave it unchanged in asm. > ++ */ > ++ > ++#ifdef __ASSEMBLY__ > ++#define _AC(X,Y) X > ++#define _AT(T,X) X > ++#else > ++#define __AC(X,Y) (X##Y) > ++#define _AC(X,Y) __AC(X,Y) > ++#define _AT(T,X) ((T)(X)) > ++#endif > ++ > ++#define _UL(x) (_AC(x, UL)) > ++#define _ULL(x) (_AC(x, ULL)) > ++ > ++#define _BITUL(x) (_UL(1) << (x)) > ++#define _BITULL(x) (_ULL(1) << (x)) > ++ > ++#endif /* _LINUX_CONST_H */ > +diff --git a/include/uapi/linux/pkt_sched.h b/include/uapi/linux/pkt_sched.h > +index 8975fd1a..9408fb43 100644 > +--- a/include/uapi/linux/pkt_sched.h > ++++ b/include/uapi/linux/pkt_sched.h > +@@ -1084,4 +1084,68 @@ enum { > + CAKE_ATM_MAX > + }; > + > ++ > ++/* TAPRIO */ > ++enum { > ++ TC_TAPRIO_CMD_SET_GATES = 0x00, > ++ TC_TAPRIO_CMD_SET_AND_HOLD = 0x01, > ++ TC_TAPRIO_CMD_SET_AND_RELEASE = 0x02, > ++}; > ++ > ++enum { > ++ TCA_TAPRIO_SCHED_ENTRY_UNSPEC, > ++ TCA_TAPRIO_SCHED_ENTRY_INDEX, /* u32 */ > ++ TCA_TAPRIO_SCHED_ENTRY_CMD, /* u8 */ > ++ TCA_TAPRIO_SCHED_ENTRY_GATE_MASK, /* u32 */ > ++ TCA_TAPRIO_SCHED_ENTRY_INTERVAL, /* u32 */ > ++ __TCA_TAPRIO_SCHED_ENTRY_MAX, > ++}; > ++#define TCA_TAPRIO_SCHED_ENTRY_MAX (__TCA_TAPRIO_SCHED_ENTRY_MAX - 1) > ++ > ++/* The format for schedule entry list is: > ++ * [TCA_TAPRIO_SCHED_ENTRY_LIST] > ++ * [TCA_TAPRIO_SCHED_ENTRY] > ++ * [TCA_TAPRIO_SCHED_ENTRY_CMD] > ++ * [TCA_TAPRIO_SCHED_ENTRY_GATES] > ++ * [TCA_TAPRIO_SCHED_ENTRY_INTERVAL] > ++ */ > ++enum { > ++ TCA_TAPRIO_SCHED_UNSPEC, > ++ TCA_TAPRIO_SCHED_ENTRY, > ++ __TCA_TAPRIO_SCHED_MAX, > ++}; > ++ > ++#define TCA_TAPRIO_SCHED_MAX (__TCA_TAPRIO_SCHED_MAX - 1) > ++ > ++/* The format for the admin sched (dump only): > ++ * [TCA_TAPRIO_SCHED_ADMIN_SCHED] > ++ * [TCA_TAPRIO_ATTR_SCHED_BASE_TIME] > ++ * [TCA_TAPRIO_ATTR_SCHED_ENTRY_LIST] > ++ * [TCA_TAPRIO_ATTR_SCHED_ENTRY] > ++ * [TCA_TAPRIO_ATTR_SCHED_ENTRY_CMD] > ++ * [TCA_TAPRIO_ATTR_SCHED_ENTRY_GATES] > ++ * [TCA_TAPRIO_ATTR_SCHED_ENTRY_INTERVAL] > ++ */ > ++ > ++#define TCA_TAPRIO_ATTR_FLAG_TXTIME_ASSIST BIT(0) > ++#define TCA_TAPRIO_ATTR_FLAG_FULL_OFFLOAD BIT(1) > ++ > ++enum { > ++ TCA_TAPRIO_ATTR_UNSPEC, > ++ TCA_TAPRIO_ATTR_PRIOMAP, /* struct tc_mqprio_qopt */ > ++ TCA_TAPRIO_ATTR_SCHED_ENTRY_LIST, /* nested of entry */ > ++ TCA_TAPRIO_ATTR_SCHED_BASE_TIME, /* s64 */ > ++ TCA_TAPRIO_ATTR_SCHED_SINGLE_ENTRY, /* single entry */ > ++ TCA_TAPRIO_ATTR_SCHED_CLOCKID, /* s32 */ > ++ TCA_TAPRIO_PAD, > ++ TCA_TAPRIO_ATTR_ADMIN_SCHED, /* The admin sched, only used in dump */ > ++ TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME, /* s64 */ > ++ TCA_TAPRIO_ATTR_SCHED_CYCLE_TIME_EXTENSION, /* s64 */ > ++ TCA_TAPRIO_ATTR_FLAGS, /* u32 */ > ++ TCA_TAPRIO_ATTR_TXTIME_DELAY, /* u32 */ > ++ __TCA_TAPRIO_ATTR_MAX, > ++}; > ++ > ++#define TCA_TAPRIO_ATTR_MAX (__TCA_TAPRIO_ATTR_MAX - 1) > ++ > + #endif > +-- > +2.18.1 > + > diff --git > a/meta-arago-distro/recipes-connectivity/iproute2/iproute2_4.19.0.bbappend > b/meta-arago-distro/recipes-connectivity/iproute2/iproute2_4.19.0.bbappend > index 2100f49..7fa33f6 100644 > --- a/meta-arago-distro/recipes-connectivity/iproute2/iproute2_4.19.0.bbappend > +++ b/meta-arago-distro/recipes-connectivity/iproute2/iproute2_4.19.0.bbappend > @@ -1,4 +1,4 @@ > -PR_append = ".arago5" > +PR_append = ".arago6" > > FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" > > @@ -7,4 +7,16 @@ SRC_URI_append = " \ > file://0002-hsr-prp-introduce-common-definitions-for-netlink-int.patch \ > file://0003-hsr-prp-refactor-common-code.patch \ > file://0004-hsr-prp-add-support-for-vlan-tagged-supervision-fram.patch \ > + file://0001-utils-Implement-get_s64.patch \ > + file://0002-include-Add-helper-to-retrieve-a-__s64-from-a-netlin.patch \ > + file://0003-libnetlink-Add-helper-for-getting-a-__s32-from-netli.patch \ > + file://0004-tc-Add-support-for-configuring-the-taprio-scheduler.patch \ > + file://0005-taprio-Add-manpage-for-tc-taprio-8.patch \ > + file://0006-taprio-Add-support-for-changing-schedules.patch \ > + file://0007-taprio-Add-support-for-cycle_time-and-cycle_time_ext.patch \ > + file://0008-utils-Fix-get_s64-function.patch \ > + file://0009-taprio-Add-support-for-setting-flags.patch \ > + file://0010-taprio-add-support-for-setting-txtime_delay.patch \ > + file://0011-tc-taprio-Update-documentation.patch \ > + file://0012-sync-pkt_sched-header-with-kernel-version.patch \ > " > -- > 1.9.1 > > _______________________________________________ > meta-arago mailing list > meta-arago@arago-project.org > http://arago-project.org/cgi-bin/mailman/listinfo/meta-arago _______________________________________________ meta-arago mailing list meta-arago@arago-project.org http://arago-project.org/cgi-bin/mailman/listinfo/meta-arago