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

Reply via email to