Cc: Murali Karicheri <[email protected]> Signed-off-by: Denys Dmytriyenko <[email protected]> --- .../0001-add-support-for-prp-similar-to-hsr.patch | 225 ---------- .../iproute2/0001-utils-Implement-get_s64.patch | 65 --- ...roduce-common-definitions-for-netlink-int.patch | 259 ----------- ...-helper-to-retrieve-a-__s64-from-a-netlin.patch | 40 -- .../0003-hsr-prp-refactor-common-code.patch | 452 ------------------- ...Add-helper-for-getting-a-__s32-from-netli.patch | 37 -- ...-support-for-vlan-tagged-supervision-fram.patch | 148 ------- ...port-for-configuring-the-taprio-scheduler.patch | 489 --------------------- .../0005-taprio-Add-manpage-for-tc-taprio-8.patch | 169 ------- ...taprio-Add-support-for-changing-schedules.patch | 151 ------- ...support-for-cycle_time-and-cycle_time_ext.patch | 148 ------- .../iproute2/0008-utils-Fix-get_s64-function.patch | 35 -- ...0009-taprio-Add-support-for-setting-flags.patch | 78 ---- ...prio-add-support-for-setting-txtime_delay.patch | 97 ---- .../0011-tc-taprio-Update-documentation.patch | 81 ---- ...sync-pkt_sched-header-with-kernel-version.patch | 131 ------ .../iproute2/iproute2_4.19.0.bbappend | 22 - 17 files changed, 2627 deletions(-) delete mode 100644 meta-arago-distro/recipes-connectivity/iproute2/iproute2/0001-add-support-for-prp-similar-to-hsr.patch delete mode 100644 meta-arago-distro/recipes-connectivity/iproute2/iproute2/0001-utils-Implement-get_s64.patch delete mode 100644 meta-arago-distro/recipes-connectivity/iproute2/iproute2/0002-hsr-prp-introduce-common-definitions-for-netlink-int.patch delete mode 100644 meta-arago-distro/recipes-connectivity/iproute2/iproute2/0002-include-Add-helper-to-retrieve-a-__s64-from-a-netlin.patch delete mode 100644 meta-arago-distro/recipes-connectivity/iproute2/iproute2/0003-hsr-prp-refactor-common-code.patch delete mode 100644 meta-arago-distro/recipes-connectivity/iproute2/iproute2/0003-libnetlink-Add-helper-for-getting-a-__s32-from-netli.patch delete mode 100644 meta-arago-distro/recipes-connectivity/iproute2/iproute2/0004-hsr-prp-add-support-for-vlan-tagged-supervision-fram.patch delete mode 100644 meta-arago-distro/recipes-connectivity/iproute2/iproute2/0004-tc-Add-support-for-configuring-the-taprio-scheduler.patch delete mode 100644 meta-arago-distro/recipes-connectivity/iproute2/iproute2/0005-taprio-Add-manpage-for-tc-taprio-8.patch delete mode 100644 meta-arago-distro/recipes-connectivity/iproute2/iproute2/0006-taprio-Add-support-for-changing-schedules.patch delete mode 100644 meta-arago-distro/recipes-connectivity/iproute2/iproute2/0007-taprio-Add-support-for-cycle_time-and-cycle_time_ext.patch delete mode 100644 meta-arago-distro/recipes-connectivity/iproute2/iproute2/0008-utils-Fix-get_s64-function.patch delete mode 100644 meta-arago-distro/recipes-connectivity/iproute2/iproute2/0009-taprio-Add-support-for-setting-flags.patch delete mode 100644 meta-arago-distro/recipes-connectivity/iproute2/iproute2/0010-taprio-add-support-for-setting-txtime_delay.patch delete mode 100644 meta-arago-distro/recipes-connectivity/iproute2/iproute2/0011-tc-taprio-Update-documentation.patch delete mode 100644 meta-arago-distro/recipes-connectivity/iproute2/iproute2/0012-sync-pkt_sched-header-with-kernel-version.patch delete mode 100644 meta-arago-distro/recipes-connectivity/iproute2/iproute2_4.19.0.bbappend
diff --git a/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0001-add-support-for-prp-similar-to-hsr.patch b/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0001-add-support-for-prp-similar-to-hsr.patch deleted file mode 100644 index 8cb1047..0000000 --- a/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0001-add-support-for-prp-similar-to-hsr.patch +++ /dev/null @@ -1,225 +0,0 @@ -From 8cce18533dff81eb72c07acb20775576b8bd2c25 Mon Sep 17 00:00:00 2001 -From: Murali Karicheri <[email protected]> -Date: Wed, 19 Sep 2018 16:41:30 -0400 -Subject: [PATCH 1/4] add support for prp similar to hsr - -prp protocol is similar to hsr in many aspects and this patch add a -command type prp to create prp interface using two slave interfaces -similar to hsr - -Upstream-Status: Pending - -Signed-off-by: Murali Karicheri <[email protected]> ---- - include/uapi/linux/if_link.h | 14 ++++- - ip/Makefile | 2 +- - ip/iplink_prp.c | 147 +++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 160 insertions(+), 3 deletions(-) - create mode 100644 ip/iplink_prp.c - -diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h -index f4a9715..5a6d728 100644 ---- a/include/uapi/linux/if_link.h -+++ b/include/uapi/linux/if_link.h -@@ -852,7 +852,6 @@ enum { - - - /* HSR section */ -- - enum { - IFLA_HSR_UNSPEC, - IFLA_HSR_SLAVE1, -@@ -863,7 +862,6 @@ enum { - IFLA_HSR_VERSION, /* HSR version */ - __IFLA_HSR_MAX, - }; -- - #define IFLA_HSR_MAX (__IFLA_HSR_MAX - 1) - - /* STATS section */ -@@ -997,4 +995,16 @@ struct ifla_rmnet_flags { - __u32 mask; - }; - -+/* PRP section */ -+enum { -+ IFLA_PRP_UNSPEC, -+ IFLA_PRP_SLAVE1, -+ IFLA_PRP_SLAVE2, -+ IFLA_PRP_MULTICAST_SPEC, /* Last byte of supervision addr */ -+ IFLA_PRP_SUPERVISION_ADDR, /* Supervision frame multicast addr */ -+ IFLA_PRP_SEQ_NR, -+ __IFLA_PRP_MAX, -+}; -+#define IFLA_PRP_MAX (__IFLA_PRP_MAX - 1) -+ - #endif /* _LINUX_IF_LINK_H */ -diff --git a/ip/Makefile b/ip/Makefile -index a88f936..c0efc3a 100644 ---- a/ip/Makefile -+++ b/ip/Makefile -@@ -8,7 +8,7 @@ IPOBJ=ip.o ipaddress.o ipaddrlabel.o iproute.o iprule.o ipnetns.o \ - iplink_macvlan.o ipl2tp.o link_vti.o link_vti6.o \ - iplink_vxlan.o tcp_metrics.o iplink_ipoib.o ipnetconf.o link_ip6tnl.o \ - link_iptnl.o link_gre6.o iplink_bond.o iplink_bond_slave.o iplink_hsr.o \ -- iplink_bridge.o iplink_bridge_slave.o ipfou.o iplink_ipvlan.o \ -+ iplink_prp.o iplink_bridge.o iplink_bridge_slave.o ipfou.o iplink_ipvlan.o \ - iplink_geneve.o iplink_vrf.o iproute_lwtunnel.o ipmacsec.o ipila.o \ - ipvrf.o iplink_xstats.o ipseg6.o iplink_netdevsim.o iplink_rmnet.o - -diff --git a/ip/iplink_prp.c b/ip/iplink_prp.c -new file mode 100644 -index 0000000..46533e9 ---- /dev/null -+++ b/ip/iplink_prp.c -@@ -0,0 +1,147 @@ -+/* -+ * iplink_prp.c PRP device support -+ * -+ * 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: Murali Karicheri <[email protected]> -+ * -+ * Based on iplink_hsr.c by Arvid Brodin <[email protected]> -+ */ -+ -+#include <stdio.h> -+#include <stdlib.h> -+#include <string.h> -+#include <sys/socket.h> /* Needed by linux/if.h for some reason */ -+#include <linux/if.h> -+#include <linux/if_arp.h> -+#include "rt_names.h" -+#include "utils.h" -+#include "ip_common.h" -+ -+static void print_usage(FILE *f) -+{ -+ fprintf(f, -+"Usage:\tip link add name NAME type prp slave1 SLAVE1-IF slave2 SLAVE2-IF\n" -+"\t[ supervision ADDR-BYTE ]\n" -+"\n" -+"NAME\n" -+" name of new prp device (e.g. prp0)\n" -+"SLAVE1-IF, SLAVE2-IF\n" -+" the two slave devices bound to the PRP device\n" -+"ADDR-BYTE\n" -+" 0-255; the last byte of the multicast address used for PRP supervision\n" -+" frames (default = 0)\n"); -+} -+ -+static void usage(void) -+{ -+ print_usage(stderr); -+} -+ -+static int prp_parse_opt(struct link_util *lu, int argc, char **argv, -+ struct nlmsghdr *n) -+{ -+ int ifindex; -+ unsigned char multicast_spec; -+ -+ while (argc > 0) { -+ if (matches(*argv, "supervision") == 0) { -+ NEXT_ARG(); -+ if (get_u8(&multicast_spec, *argv, 0)) -+ invarg("ADDR-BYTE is invalid", *argv); -+ addattr_l(n, 1024, IFLA_PRP_MULTICAST_SPEC, -+ &multicast_spec, 1); -+ } else if (matches(*argv, "slave1") == 0) { -+ NEXT_ARG(); -+ ifindex = ll_name_to_index(*argv); -+ if (ifindex == 0) -+ invarg("No such interface", *argv); -+ addattr_l(n, 1024, IFLA_PRP_SLAVE1, &ifindex, 4); -+ } else if (matches(*argv, "slave2") == 0) { -+ NEXT_ARG(); -+ ifindex = ll_name_to_index(*argv); -+ if (ifindex == 0) -+ invarg("No such interface", *argv); -+ addattr_l(n, 1024, IFLA_PRP_SLAVE2, &ifindex, 4); -+ } else if (matches(*argv, "help") == 0) { -+ usage(); -+ return -1; -+ } else { -+ fprintf(stderr, "prp: what is \"%s\"?\n", *argv); -+ usage(); -+ return -1; -+ } -+ argc--, argv++; -+ } -+ -+ return 0; -+} -+ -+static void prp_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[]) -+{ -+ SPRINT_BUF(b1); -+ -+ if (!tb) -+ return; -+ -+ if (tb[IFLA_PRP_SLAVE1] && -+ RTA_PAYLOAD(tb[IFLA_PRP_SLAVE1]) < sizeof(__u32)) -+ return; -+ if (tb[IFLA_PRP_SLAVE2] && -+ RTA_PAYLOAD(tb[IFLA_PRP_SLAVE2]) < sizeof(__u32)) -+ return; -+ if (tb[IFLA_PRP_SEQ_NR] && -+ RTA_PAYLOAD(tb[IFLA_PRP_SEQ_NR]) < sizeof(__u16)) -+ return; -+ if (tb[IFLA_PRP_SUPERVISION_ADDR] && -+ RTA_PAYLOAD(tb[IFLA_PRP_SUPERVISION_ADDR]) < ETH_ALEN) -+ return; -+ -+ if (tb[IFLA_PRP_SLAVE1]) -+ print_string(PRINT_ANY, -+ "slave1", -+ "slave1 %s ", -+ ll_index_to_name(rta_getattr_u32(tb[IFLA_PRP_SLAVE1]))); -+ else -+ print_null(PRINT_ANY, "slave1", "slave1 %s ", "<none>"); -+ -+ if (tb[IFLA_PRP_SLAVE2]) -+ print_string(PRINT_ANY, -+ "slave2", -+ "slave2 %s ", -+ ll_index_to_name(rta_getattr_u32(tb[IFLA_HSR_SLAVE2]))); -+ else -+ print_null(PRINT_ANY, "slave2", "slave2 %s ", "<none>"); -+ -+ if (tb[IFLA_PRP_SEQ_NR]) -+ print_int(PRINT_ANY, -+ "seq_nr", -+ "sequence %d ", -+ rta_getattr_u16(tb[IFLA_PRP_SEQ_NR])); -+ -+ if (tb[IFLA_PRP_SUPERVISION_ADDR]) -+ print_string(PRINT_ANY, -+ "supervision_addr", -+ "supervision %s ", -+ ll_addr_n2a(RTA_DATA(tb[IFLA_PRP_SUPERVISION_ADDR]), -+ RTA_PAYLOAD(tb[IFLA_PRP_SUPERVISION_ADDR]), -+ ARPHRD_VOID, -+ b1, sizeof(b1))); -+} -+ -+static void prp_print_help(struct link_util *lu, int argc, char **argv, -+ FILE *f) -+{ -+ print_usage(f); -+} -+ -+struct link_util prp_link_util = { -+ .id = "prp", -+ .maxattr = IFLA_PRP_MAX, -+ .parse_opt = prp_parse_opt, -+ .print_opt = prp_print_opt, -+ .print_help = prp_print_help, -+}; --- -2.7.4 - 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 deleted file mode 100644 index 9e799ab..0000000 --- a/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0001-utils-Implement-get_s64.patch +++ /dev/null @@ -1,65 +0,0 @@ -From 7e4397dff47438be65fdf90dc4e51b763797d201 Mon Sep 17 00:00:00 2001 -From: Vinicius Costa Gomes <[email protected]> -Date: Fri, 5 Oct 2018 16:25:17 -0700 -Subject: [PATCH 01/12] utils: Implement get_s64() - -Upstream-Status: Backport -commit a066bac8a2775bc43d54ae7173057f75f543c44b upstream. - -Add this helper to read signed 64-bit integers from a string. - -Signed-off-by: Vinicius Costa Gomes <[email protected]> -Signed-off-by: David Ahern <[email protected]> -Signed-off-by: Murali Karicheri <[email protected]> ---- - 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-hsr-prp-introduce-common-definitions-for-netlink-int.patch b/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0002-hsr-prp-introduce-common-definitions-for-netlink-int.patch deleted file mode 100644 index 78988c6..0000000 --- a/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0002-hsr-prp-introduce-common-definitions-for-netlink-int.patch +++ /dev/null @@ -1,259 +0,0 @@ -From d8a98010127fabf4898d6fca67d14c21ad7e1f62 Mon Sep 17 00:00:00 2001 -From: Murali Karicheri <[email protected]> -Date: Fri, 12 Apr 2019 10:11:28 -0400 -Subject: [PATCH 2/4] hsr/prp: introduce common definitions for netlink - interface - -HSR and PRP interfaces are setup in a similar way in kernel as -the protocols shares many similar attributes. So introduce a common -definitions for netlink interface and modify hsr/prp code to re-use -the same. - -Upstream-Status: Pending - -Signed-off-by: Murali Karicheri <[email protected]> ---- - include/uapi/linux/if_link.h | 20 +++++++++++--------- - ip/iplink_hsr.c | 42 +++++++++++++++++++++--------------------- - ip/iplink_prp.c | 40 ++++++++++++++++++++-------------------- - 3 files changed, 52 insertions(+), 50 deletions(-) - -diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h -index 5a6d728..ba78aaf 100644 ---- a/include/uapi/linux/if_link.h -+++ b/include/uapi/linux/if_link.h -@@ -995,16 +995,18 @@ struct ifla_rmnet_flags { - __u32 mask; - }; - --/* PRP section */ -+/* HSR-PRP section */ - enum { -- IFLA_PRP_UNSPEC, -- IFLA_PRP_SLAVE1, -- IFLA_PRP_SLAVE2, -- IFLA_PRP_MULTICAST_SPEC, /* Last byte of supervision addr */ -- IFLA_PRP_SUPERVISION_ADDR, /* Supervision frame multicast addr */ -- IFLA_PRP_SEQ_NR, -- __IFLA_PRP_MAX, -+ IFLA_HSR_PRP_UNSPEC, -+ IFLA_HSR_PRP_SLAVE1, -+ IFLA_HSR_PRP_SLAVE2, -+ IFLA_HSR_PRP_SF_MC_ADDR_LSB, /* Last byte of supervision addr */ -+ IFLA_HSR_PRP_SF_MC_ADDR, /* Supervision frame multicast addr */ -+ IFLA_HSR_PRP_SEQ_NR, -+ IFLA_HSR_PRP_VERSION, /* HSR version */ -+ __IFLA_HSR_PRP_MAX, - }; --#define IFLA_PRP_MAX (__IFLA_PRP_MAX - 1) -+ -+#define IFLA_HSR_PRP_MAX (__IFLA_HSR_PRP_MAX - 1) - - #endif /* _LINUX_IF_LINK_H */ -diff --git a/ip/iplink_hsr.c b/ip/iplink_hsr.c -index c673ccf..1281e09 100644 ---- a/ip/iplink_hsr.c -+++ b/ip/iplink_hsr.c -@@ -55,7 +55,7 @@ static int hsr_parse_opt(struct link_util *lu, int argc, char **argv, - NEXT_ARG(); - if (get_u8(&multicast_spec, *argv, 0)) - invarg("ADDR-BYTE is invalid", *argv); -- addattr_l(n, 1024, IFLA_HSR_MULTICAST_SPEC, -+ addattr_l(n, 1024, IFLA_HSR_PRP_SF_MC_ADDR_LSB, - &multicast_spec, 1); - } else if (matches(*argv, "version") == 0) { - NEXT_ARG(); -@@ -69,13 +69,13 @@ static int hsr_parse_opt(struct link_util *lu, int argc, char **argv, - ifindex = ll_name_to_index(*argv); - if (ifindex == 0) - invarg("No such interface", *argv); -- addattr_l(n, 1024, IFLA_HSR_SLAVE1, &ifindex, 4); -+ addattr_l(n, 1024, IFLA_HSR_PRP_SLAVE1, &ifindex, 4); - } else if (matches(*argv, "slave2") == 0) { - NEXT_ARG(); - ifindex = ll_name_to_index(*argv); - if (ifindex == 0) - invarg("No such interface", *argv); -- addattr_l(n, 1024, IFLA_HSR_SLAVE2, &ifindex, 4); -+ addattr_l(n, 1024, IFLA_HSR_PRP_SLAVE2, &ifindex, 4); - } else if (matches(*argv, "help") == 0) { - usage(); - return -1; -@@ -97,47 +97,47 @@ static void hsr_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[]) - if (!tb) - return; - -- if (tb[IFLA_HSR_SLAVE1] && -- RTA_PAYLOAD(tb[IFLA_HSR_SLAVE1]) < sizeof(__u32)) -+ if (tb[IFLA_HSR_PRP_SLAVE1] && -+ RTA_PAYLOAD(tb[IFLA_HSR_PRP_SLAVE1]) < sizeof(__u32)) - return; -- if (tb[IFLA_HSR_SLAVE2] && -- RTA_PAYLOAD(tb[IFLA_HSR_SLAVE2]) < sizeof(__u32)) -+ if (tb[IFLA_HSR_PRP_SLAVE2] && -+ RTA_PAYLOAD(tb[IFLA_HSR_PRP_SLAVE2]) < sizeof(__u32)) - return; -- if (tb[IFLA_HSR_SEQ_NR] && -- RTA_PAYLOAD(tb[IFLA_HSR_SEQ_NR]) < sizeof(__u16)) -+ if (tb[IFLA_HSR_PRP_SEQ_NR] && -+ RTA_PAYLOAD(tb[IFLA_HSR_PRP_SEQ_NR]) < sizeof(__u16)) - return; -- if (tb[IFLA_HSR_SUPERVISION_ADDR] && -- RTA_PAYLOAD(tb[IFLA_HSR_SUPERVISION_ADDR]) < ETH_ALEN) -+ if (tb[IFLA_HSR_PRP_SF_MC_ADDR] && -+ RTA_PAYLOAD(tb[IFLA_HSR_PRP_SF_MC_ADDR]) < ETH_ALEN) - return; - -- if (tb[IFLA_HSR_SLAVE1]) -+ if (tb[IFLA_HSR_PRP_SLAVE1]) - print_string(PRINT_ANY, - "slave1", - "slave1 %s ", -- ll_index_to_name(rta_getattr_u32(tb[IFLA_HSR_SLAVE1]))); -+ ll_index_to_name(rta_getattr_u32(tb[IFLA_HSR_PRP_SLAVE1]))); - else - print_null(PRINT_ANY, "slave1", "slave1 %s ", "<none>"); - -- if (tb[IFLA_HSR_SLAVE2]) -+ if (tb[IFLA_HSR_PRP_SLAVE2]) - print_string(PRINT_ANY, - "slave2", - "slave2 %s ", -- ll_index_to_name(rta_getattr_u32(tb[IFLA_HSR_SLAVE2]))); -+ ll_index_to_name(rta_getattr_u32(tb[IFLA_HSR_PRP_SLAVE2]))); - else - print_null(PRINT_ANY, "slave2", "slave2 %s ", "<none>"); - -- if (tb[IFLA_HSR_SEQ_NR]) -+ if (tb[IFLA_HSR_PRP_SEQ_NR]) - print_int(PRINT_ANY, - "seq_nr", - "sequence %d ", -- rta_getattr_u16(tb[IFLA_HSR_SEQ_NR])); -+ rta_getattr_u16(tb[IFLA_HSR_PRP_SEQ_NR])); - -- if (tb[IFLA_HSR_SUPERVISION_ADDR]) -+ if (tb[IFLA_HSR_PRP_SF_MC_ADDR]) - print_string(PRINT_ANY, - "supervision_addr", - "supervision %s ", -- ll_addr_n2a(RTA_DATA(tb[IFLA_HSR_SUPERVISION_ADDR]), -- RTA_PAYLOAD(tb[IFLA_HSR_SUPERVISION_ADDR]), -+ ll_addr_n2a(RTA_DATA(tb[IFLA_HSR_PRP_SF_MC_ADDR]), -+ RTA_PAYLOAD(tb[IFLA_HSR_PRP_SF_MC_ADDR]), - ARPHRD_VOID, - b1, sizeof(b1))); - } -@@ -150,7 +150,7 @@ static void hsr_print_help(struct link_util *lu, int argc, char **argv, - - struct link_util hsr_link_util = { - .id = "hsr", -- .maxattr = IFLA_HSR_MAX, -+ .maxattr = IFLA_HSR_PRP_MAX, - .parse_opt = hsr_parse_opt, - .print_opt = hsr_print_opt, - .print_help = hsr_print_help, -diff --git a/ip/iplink_prp.c b/ip/iplink_prp.c -index 46533e9..062c1c7 100644 ---- a/ip/iplink_prp.c -+++ b/ip/iplink_prp.c -@@ -52,20 +52,20 @@ static int prp_parse_opt(struct link_util *lu, int argc, char **argv, - NEXT_ARG(); - if (get_u8(&multicast_spec, *argv, 0)) - invarg("ADDR-BYTE is invalid", *argv); -- addattr_l(n, 1024, IFLA_PRP_MULTICAST_SPEC, -+ addattr_l(n, 1024, IFLA_HSR_PRP_SF_MC_ADDR_LSB, - &multicast_spec, 1); - } else if (matches(*argv, "slave1") == 0) { - NEXT_ARG(); - ifindex = ll_name_to_index(*argv); - if (ifindex == 0) - invarg("No such interface", *argv); -- addattr_l(n, 1024, IFLA_PRP_SLAVE1, &ifindex, 4); -+ addattr_l(n, 1024, IFLA_HSR_PRP_SLAVE1, &ifindex, 4); - } else if (matches(*argv, "slave2") == 0) { - NEXT_ARG(); - ifindex = ll_name_to_index(*argv); - if (ifindex == 0) - invarg("No such interface", *argv); -- addattr_l(n, 1024, IFLA_PRP_SLAVE2, &ifindex, 4); -+ addattr_l(n, 1024, IFLA_HSR_PRP_SLAVE2, &ifindex, 4); - } else if (matches(*argv, "help") == 0) { - usage(); - return -1; -@@ -87,28 +87,28 @@ static void prp_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[]) - if (!tb) - return; - -- if (tb[IFLA_PRP_SLAVE1] && -- RTA_PAYLOAD(tb[IFLA_PRP_SLAVE1]) < sizeof(__u32)) -+ if (tb[IFLA_HSR_PRP_SLAVE1] && -+ RTA_PAYLOAD(tb[IFLA_HSR_PRP_SLAVE1]) < sizeof(__u32)) - return; -- if (tb[IFLA_PRP_SLAVE2] && -- RTA_PAYLOAD(tb[IFLA_PRP_SLAVE2]) < sizeof(__u32)) -+ if (tb[IFLA_HSR_PRP_SLAVE2] && -+ RTA_PAYLOAD(tb[IFLA_HSR_PRP_SLAVE2]) < sizeof(__u32)) - return; -- if (tb[IFLA_PRP_SEQ_NR] && -- RTA_PAYLOAD(tb[IFLA_PRP_SEQ_NR]) < sizeof(__u16)) -+ if (tb[IFLA_HSR_PRP_SEQ_NR] && -+ RTA_PAYLOAD(tb[IFLA_HSR_PRP_SEQ_NR]) < sizeof(__u16)) - return; -- if (tb[IFLA_PRP_SUPERVISION_ADDR] && -- RTA_PAYLOAD(tb[IFLA_PRP_SUPERVISION_ADDR]) < ETH_ALEN) -+ if (tb[IFLA_HSR_PRP_SF_MC_ADDR] && -+ RTA_PAYLOAD(tb[IFLA_HSR_PRP_SF_MC_ADDR]) < ETH_ALEN) - return; - -- if (tb[IFLA_PRP_SLAVE1]) -+ if (tb[IFLA_HSR_PRP_SLAVE1]) - print_string(PRINT_ANY, - "slave1", - "slave1 %s ", -- ll_index_to_name(rta_getattr_u32(tb[IFLA_PRP_SLAVE1]))); -+ ll_index_to_name(rta_getattr_u32(tb[IFLA_HSR_PRP_SLAVE1]))); - else - print_null(PRINT_ANY, "slave1", "slave1 %s ", "<none>"); - -- if (tb[IFLA_PRP_SLAVE2]) -+ if (tb[IFLA_HSR_PRP_SLAVE2]) - print_string(PRINT_ANY, - "slave2", - "slave2 %s ", -@@ -116,18 +116,18 @@ static void prp_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[]) - else - print_null(PRINT_ANY, "slave2", "slave2 %s ", "<none>"); - -- if (tb[IFLA_PRP_SEQ_NR]) -+ if (tb[IFLA_HSR_PRP_SEQ_NR]) - print_int(PRINT_ANY, - "seq_nr", - "sequence %d ", -- rta_getattr_u16(tb[IFLA_PRP_SEQ_NR])); -+ rta_getattr_u16(tb[IFLA_HSR_PRP_SEQ_NR])); - -- if (tb[IFLA_PRP_SUPERVISION_ADDR]) -+ if (tb[IFLA_HSR_PRP_SF_MC_ADDR]) - print_string(PRINT_ANY, - "supervision_addr", - "supervision %s ", -- ll_addr_n2a(RTA_DATA(tb[IFLA_PRP_SUPERVISION_ADDR]), -- RTA_PAYLOAD(tb[IFLA_PRP_SUPERVISION_ADDR]), -+ ll_addr_n2a(RTA_DATA(tb[IFLA_HSR_PRP_SF_MC_ADDR]), -+ RTA_PAYLOAD(tb[IFLA_HSR_PRP_SF_MC_ADDR]), - ARPHRD_VOID, - b1, sizeof(b1))); - } -@@ -140,7 +140,7 @@ static void prp_print_help(struct link_util *lu, int argc, char **argv, - - struct link_util prp_link_util = { - .id = "prp", -- .maxattr = IFLA_PRP_MAX, -+ .maxattr = IFLA_HSR_PRP_MAX, - .parse_opt = prp_parse_opt, - .print_opt = prp_print_opt, - .print_help = prp_print_help, --- -2.7.4 - 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 deleted file mode 100644 index 1098145..0000000 --- a/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0002-include-Add-helper-to-retrieve-a-__s64-from-a-netlin.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 6d0bcdd9d0283768798227f4046414ed7da42047 Mon Sep 17 00:00:00 2001 -From: Vinicius Costa Gomes <[email protected]> -Date: Fri, 5 Oct 2018 16:25:18 -0700 -Subject: [PATCH 02/12] include: Add helper to retrieve a __s64 from a netlink - msg - -Upstream-Status: Backport -commit de63cd90444ac9fdf238f950c16cafe351846691 upstream. - -This allows signed 64-bit integers to be retrieved from a netlink -message. - -Signed-off-by: Vinicius Costa Gomes <[email protected]> -Signed-off-by: David Ahern <[email protected]> -Signed-off-by: Murali Karicheri <[email protected]> ---- - 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-hsr-prp-refactor-common-code.patch b/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0003-hsr-prp-refactor-common-code.patch deleted file mode 100644 index 26cca27..0000000 --- a/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0003-hsr-prp-refactor-common-code.patch +++ /dev/null @@ -1,452 +0,0 @@ -From 87e8845929c0f42ebaba4341580d58de19296ba3 Mon Sep 17 00:00:00 2001 -From: Murali Karicheri <[email protected]> -Date: Fri, 17 May 2019 16:59:38 -0400 -Subject: [PATCH 3/4] hsr/prp: refactor common code - -As there is similar code between the hsr and prp device support, -move them to a common file and re-use - -Upstream-Status: Pending - -Signed-off-by: Murali Karicheri <[email protected]> ---- - ip/Makefile | 5 +- - ip/iplink_hsr.c | 109 +++---------------------------------------- - ip/iplink_hsr_prp_common.c | 114 +++++++++++++++++++++++++++++++++++++++++++++ - ip/iplink_hsr_prp_common.h | 24 ++++++++++ - ip/iplink_prp.c | 101 +++------------------------------------ - 5 files changed, 155 insertions(+), 198 deletions(-) - create mode 100644 ip/iplink_hsr_prp_common.c - create mode 100644 ip/iplink_hsr_prp_common.h - -diff --git a/ip/Makefile b/ip/Makefile -index c0efc3a..130e1ae 100644 ---- a/ip/Makefile -+++ b/ip/Makefile -@@ -7,8 +7,9 @@ IPOBJ=ip.o ipaddress.o ipaddrlabel.o iproute.o iprule.o ipnetns.o \ - iplink_vlan.o link_veth.o link_gre.o iplink_can.o iplink_xdp.o \ - iplink_macvlan.o ipl2tp.o link_vti.o link_vti6.o \ - iplink_vxlan.o tcp_metrics.o iplink_ipoib.o ipnetconf.o link_ip6tnl.o \ -- link_iptnl.o link_gre6.o iplink_bond.o iplink_bond_slave.o iplink_hsr.o \ -- iplink_prp.o iplink_bridge.o iplink_bridge_slave.o ipfou.o iplink_ipvlan.o \ -+ link_iptnl.o link_gre6.o iplink_bond.o iplink_bond_slave.o \ -+ iplink_hsr_prp_common.o iplink_hsr.o iplink_prp.o iplink_bridge.o \ -+ iplink_bridge_slave.o ipfou.o iplink_ipvlan.o \ - iplink_geneve.o iplink_vrf.o iproute_lwtunnel.o ipmacsec.o ipila.o \ - ipvrf.o iplink_xstats.o ipseg6.o iplink_netdevsim.o iplink_rmnet.o - -diff --git a/ip/iplink_hsr.c b/ip/iplink_hsr.c -index 1281e09..2e83af0 100644 ---- a/ip/iplink_hsr.c -+++ b/ip/iplink_hsr.c -@@ -11,15 +11,7 @@ - * Based on iplink_vlan.c by Patrick McHardy <[email protected]> - */ - --#include <stdio.h> --#include <stdlib.h> --#include <string.h> --#include <sys/socket.h> /* Needed by linux/if.h for some reason */ --#include <linux/if.h> --#include <linux/if_arp.h> --#include "rt_names.h" --#include "utils.h" --#include "ip_common.h" -+#include "iplink_hsr_prp_common.h" - - static void print_usage(FILE *f) - { -@@ -46,100 +38,13 @@ static void usage(void) - static int hsr_parse_opt(struct link_util *lu, int argc, char **argv, - struct nlmsghdr *n) - { -- int ifindex; -- unsigned char multicast_spec; -- unsigned char protocol_version; -+ int ret; - -- while (argc > 0) { -- if (matches(*argv, "supervision") == 0) { -- NEXT_ARG(); -- if (get_u8(&multicast_spec, *argv, 0)) -- invarg("ADDR-BYTE is invalid", *argv); -- addattr_l(n, 1024, IFLA_HSR_PRP_SF_MC_ADDR_LSB, -- &multicast_spec, 1); -- } else if (matches(*argv, "version") == 0) { -- NEXT_ARG(); -- if (!(get_u8(&protocol_version, *argv, 0) == 0 || -- get_u8(&protocol_version, *argv, 0) == 1)) -- invarg("version is invalid", *argv); -- addattr_l(n, 1024, IFLA_HSR_VERSION, -- &protocol_version, 1); -- } else if (matches(*argv, "slave1") == 0) { -- NEXT_ARG(); -- ifindex = ll_name_to_index(*argv); -- if (ifindex == 0) -- invarg("No such interface", *argv); -- addattr_l(n, 1024, IFLA_HSR_PRP_SLAVE1, &ifindex, 4); -- } else if (matches(*argv, "slave2") == 0) { -- NEXT_ARG(); -- ifindex = ll_name_to_index(*argv); -- if (ifindex == 0) -- invarg("No such interface", *argv); -- addattr_l(n, 1024, IFLA_HSR_PRP_SLAVE2, &ifindex, 4); -- } else if (matches(*argv, "help") == 0) { -- usage(); -- return -1; -- } else { -- fprintf(stderr, "hsr: what is \"%s\"?\n", *argv); -- usage(); -- return -1; -- } -- argc--, argv++; -- } -+ ret = hsr_prp_parse_opt(true, lu, argc, argv, n); -+ if (ret < 0) -+ usage(); - -- return 0; --} -- --static void hsr_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[]) --{ -- SPRINT_BUF(b1); -- -- if (!tb) -- return; -- -- if (tb[IFLA_HSR_PRP_SLAVE1] && -- RTA_PAYLOAD(tb[IFLA_HSR_PRP_SLAVE1]) < sizeof(__u32)) -- return; -- if (tb[IFLA_HSR_PRP_SLAVE2] && -- RTA_PAYLOAD(tb[IFLA_HSR_PRP_SLAVE2]) < sizeof(__u32)) -- return; -- if (tb[IFLA_HSR_PRP_SEQ_NR] && -- RTA_PAYLOAD(tb[IFLA_HSR_PRP_SEQ_NR]) < sizeof(__u16)) -- return; -- if (tb[IFLA_HSR_PRP_SF_MC_ADDR] && -- RTA_PAYLOAD(tb[IFLA_HSR_PRP_SF_MC_ADDR]) < ETH_ALEN) -- return; -- -- if (tb[IFLA_HSR_PRP_SLAVE1]) -- print_string(PRINT_ANY, -- "slave1", -- "slave1 %s ", -- ll_index_to_name(rta_getattr_u32(tb[IFLA_HSR_PRP_SLAVE1]))); -- else -- print_null(PRINT_ANY, "slave1", "slave1 %s ", "<none>"); -- -- if (tb[IFLA_HSR_PRP_SLAVE2]) -- print_string(PRINT_ANY, -- "slave2", -- "slave2 %s ", -- ll_index_to_name(rta_getattr_u32(tb[IFLA_HSR_PRP_SLAVE2]))); -- else -- print_null(PRINT_ANY, "slave2", "slave2 %s ", "<none>"); -- -- if (tb[IFLA_HSR_PRP_SEQ_NR]) -- print_int(PRINT_ANY, -- "seq_nr", -- "sequence %d ", -- rta_getattr_u16(tb[IFLA_HSR_PRP_SEQ_NR])); -- -- if (tb[IFLA_HSR_PRP_SF_MC_ADDR]) -- print_string(PRINT_ANY, -- "supervision_addr", -- "supervision %s ", -- ll_addr_n2a(RTA_DATA(tb[IFLA_HSR_PRP_SF_MC_ADDR]), -- RTA_PAYLOAD(tb[IFLA_HSR_PRP_SF_MC_ADDR]), -- ARPHRD_VOID, -- b1, sizeof(b1))); -+ return ret; - } - - static void hsr_print_help(struct link_util *lu, int argc, char **argv, -@@ -152,6 +57,6 @@ struct link_util hsr_link_util = { - .id = "hsr", - .maxattr = IFLA_HSR_PRP_MAX, - .parse_opt = hsr_parse_opt, -- .print_opt = hsr_print_opt, -+ .print_opt = hsr_prp_print_opt, - .print_help = hsr_print_help, - }; -diff --git a/ip/iplink_hsr_prp_common.c b/ip/iplink_hsr_prp_common.c -new file mode 100644 -index 0000000..780c1cb ---- /dev/null -+++ b/ip/iplink_hsr_prp_common.c -@@ -0,0 +1,114 @@ -+/* -+ * iplink_hsr_prp_common.c Common utilities for hsr and prp -+ * -+ * 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: Murali Karicheri <[email protected]> -+ * -+ * -+ */ -+ -+#include "iplink_hsr_prp_common.h" -+ -+int hsr_prp_parse_opt(bool hsr, struct link_util *lu, int argc, char **argv, -+ struct nlmsghdr *n) -+{ -+ int ifindex; -+ unsigned char multicast_spec; -+ unsigned char protocol_version; -+ -+ while (argc > 0) { -+ if (matches(*argv, "supervision") == 0) { -+ NEXT_ARG(); -+ if (get_u8(&multicast_spec, *argv, 0)) -+ invarg("ADDR-BYTE is invalid", *argv); -+ addattr_l(n, 1024, IFLA_HSR_PRP_SF_MC_ADDR_LSB, -+ &multicast_spec, 1); -+ } else if (hsr && matches(*argv, "version") == 0) { -+ NEXT_ARG(); -+ if (!(get_u8(&protocol_version, *argv, 0) == 0 || -+ get_u8(&protocol_version, *argv, 0) == 1)) -+ invarg("version is invalid", *argv); -+ addattr_l(n, 1024, IFLA_HSR_PRP_VERSION, -+ &protocol_version, 1); -+ } else if (matches(*argv, "slave1") == 0) { -+ NEXT_ARG(); -+ ifindex = ll_name_to_index(*argv); -+ if (ifindex == 0) -+ invarg("No such interface", *argv); -+ addattr_l(n, 1024, IFLA_HSR_PRP_SLAVE1, &ifindex, 4); -+ } else if (matches(*argv, "slave2") == 0) { -+ NEXT_ARG(); -+ ifindex = ll_name_to_index(*argv); -+ if (ifindex == 0) -+ invarg("No such interface", *argv); -+ addattr_l(n, 1024, IFLA_HSR_PRP_SLAVE2, &ifindex, 4); -+ } else if (matches(*argv, "help") == 0) { -+ return -1; -+ } else { -+ if (hsr) -+ fprintf(stderr, "hsr: what is \"%s\"?\n", *argv); -+ else -+ fprintf(stderr, "prp: what is \"%s\"?\n", *argv); -+ return -1; -+ } -+ argc--, argv++; -+ } -+ -+ return 0; -+} -+ -+void hsr_prp_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[]) -+{ -+ SPRINT_BUF(b1); -+ -+ if (!tb) -+ return; -+ -+ if (tb[IFLA_HSR_PRP_SLAVE1] && -+ RTA_PAYLOAD(tb[IFLA_HSR_PRP_SLAVE1]) < sizeof(__u32)) -+ return; -+ if (tb[IFLA_HSR_PRP_SLAVE2] && -+ RTA_PAYLOAD(tb[IFLA_HSR_PRP_SLAVE2]) < sizeof(__u32)) -+ return; -+ if (tb[IFLA_HSR_PRP_SEQ_NR] && -+ RTA_PAYLOAD(tb[IFLA_HSR_PRP_SEQ_NR]) < sizeof(__u16)) -+ return; -+ if (tb[IFLA_HSR_PRP_SF_MC_ADDR] && -+ RTA_PAYLOAD(tb[IFLA_HSR_PRP_SF_MC_ADDR]) < ETH_ALEN) -+ return; -+ -+ if (tb[IFLA_HSR_PRP_SLAVE1]) -+ print_string(PRINT_ANY, -+ "slave1", -+ "slave1 %s ", -+ ll_index_to_name(rta_getattr_u32(tb[IFLA_HSR_PRP_SLAVE1]))); -+ else -+ print_null(PRINT_ANY, "slave1", "slave1 %s ", "<none>"); -+ -+ if (tb[IFLA_HSR_PRP_SLAVE2]) -+ print_string(PRINT_ANY, -+ "slave2", -+ "slave2 %s ", -+ ll_index_to_name(rta_getattr_u32(tb[IFLA_HSR_PRP_SLAVE2]))); -+ else -+ print_null(PRINT_ANY, "slave2", "slave2 %s ", "<none>"); -+ -+ if (tb[IFLA_HSR_PRP_SEQ_NR]) -+ print_int(PRINT_ANY, -+ "seq_nr", -+ "sequence %d ", -+ rta_getattr_u16(tb[IFLA_HSR_PRP_SEQ_NR])); -+ -+ if (tb[IFLA_HSR_PRP_SF_MC_ADDR]) -+ print_string(PRINT_ANY, -+ "supervision_addr", -+ "supervision %s ", -+ ll_addr_n2a(RTA_DATA(tb[IFLA_HSR_PRP_SF_MC_ADDR]), -+ RTA_PAYLOAD(tb[IFLA_HSR_PRP_SF_MC_ADDR]), -+ ARPHRD_VOID, -+ b1, sizeof(b1))); -+} -diff --git a/ip/iplink_hsr_prp_common.h b/ip/iplink_hsr_prp_common.h -new file mode 100644 -index 0000000..a50bd7e ---- /dev/null -+++ b/ip/iplink_hsr_prp_common.h -@@ -0,0 +1,24 @@ -+/* -+ * iplink_hsr_prp_common.h HSR/PRP common header file -+ * -+ * 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: Murali Karicheri <[email protected]> -+ * -+ */ -+ -+#include <stdio.h> -+#include <stdlib.h> -+#include <string.h> -+#include <sys/socket.h> /* Needed by linux/if.h for some reason */ -+#include <linux/if.h> -+#include <linux/if_arp.h> -+#include "rt_names.h" -+#include "utils.h" -+#include "ip_common.h" -+int hsr_prp_parse_opt(bool hsr, struct link_util *lu, int argc, char **argv, -+ struct nlmsghdr *n); -+void hsr_prp_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[]); -diff --git a/ip/iplink_prp.c b/ip/iplink_prp.c -index 062c1c7..eff8a0d 100644 ---- a/ip/iplink_prp.c -+++ b/ip/iplink_prp.c -@@ -11,15 +11,7 @@ - * Based on iplink_hsr.c by Arvid Brodin <[email protected]> - */ - --#include <stdio.h> --#include <stdlib.h> --#include <string.h> --#include <sys/socket.h> /* Needed by linux/if.h for some reason */ --#include <linux/if.h> --#include <linux/if_arp.h> --#include "rt_names.h" --#include "utils.h" --#include "ip_common.h" -+#include "iplink_hsr_prp_common.h" - - static void print_usage(FILE *f) - { -@@ -44,92 +36,13 @@ static void usage(void) - static int prp_parse_opt(struct link_util *lu, int argc, char **argv, - struct nlmsghdr *n) - { -- int ifindex; -- unsigned char multicast_spec; -+ int ret; - -- while (argc > 0) { -- if (matches(*argv, "supervision") == 0) { -- NEXT_ARG(); -- if (get_u8(&multicast_spec, *argv, 0)) -- invarg("ADDR-BYTE is invalid", *argv); -- addattr_l(n, 1024, IFLA_HSR_PRP_SF_MC_ADDR_LSB, -- &multicast_spec, 1); -- } else if (matches(*argv, "slave1") == 0) { -- NEXT_ARG(); -- ifindex = ll_name_to_index(*argv); -- if (ifindex == 0) -- invarg("No such interface", *argv); -- addattr_l(n, 1024, IFLA_HSR_PRP_SLAVE1, &ifindex, 4); -- } else if (matches(*argv, "slave2") == 0) { -- NEXT_ARG(); -- ifindex = ll_name_to_index(*argv); -- if (ifindex == 0) -- invarg("No such interface", *argv); -- addattr_l(n, 1024, IFLA_HSR_PRP_SLAVE2, &ifindex, 4); -- } else if (matches(*argv, "help") == 0) { -- usage(); -- return -1; -- } else { -- fprintf(stderr, "prp: what is \"%s\"?\n", *argv); -- usage(); -- return -1; -- } -- argc--, argv++; -- } -+ ret = hsr_prp_parse_opt(false, lu, argc, argv, n); -+ if (ret < 0) -+ usage(); - -- return 0; --} -- --static void prp_print_opt(struct link_util *lu, FILE *f, struct rtattr *tb[]) --{ -- SPRINT_BUF(b1); -- -- if (!tb) -- return; -- -- if (tb[IFLA_HSR_PRP_SLAVE1] && -- RTA_PAYLOAD(tb[IFLA_HSR_PRP_SLAVE1]) < sizeof(__u32)) -- return; -- if (tb[IFLA_HSR_PRP_SLAVE2] && -- RTA_PAYLOAD(tb[IFLA_HSR_PRP_SLAVE2]) < sizeof(__u32)) -- return; -- if (tb[IFLA_HSR_PRP_SEQ_NR] && -- RTA_PAYLOAD(tb[IFLA_HSR_PRP_SEQ_NR]) < sizeof(__u16)) -- return; -- if (tb[IFLA_HSR_PRP_SF_MC_ADDR] && -- RTA_PAYLOAD(tb[IFLA_HSR_PRP_SF_MC_ADDR]) < ETH_ALEN) -- return; -- -- if (tb[IFLA_HSR_PRP_SLAVE1]) -- print_string(PRINT_ANY, -- "slave1", -- "slave1 %s ", -- ll_index_to_name(rta_getattr_u32(tb[IFLA_HSR_PRP_SLAVE1]))); -- else -- print_null(PRINT_ANY, "slave1", "slave1 %s ", "<none>"); -- -- if (tb[IFLA_HSR_PRP_SLAVE2]) -- print_string(PRINT_ANY, -- "slave2", -- "slave2 %s ", -- ll_index_to_name(rta_getattr_u32(tb[IFLA_HSR_SLAVE2]))); -- else -- print_null(PRINT_ANY, "slave2", "slave2 %s ", "<none>"); -- -- if (tb[IFLA_HSR_PRP_SEQ_NR]) -- print_int(PRINT_ANY, -- "seq_nr", -- "sequence %d ", -- rta_getattr_u16(tb[IFLA_HSR_PRP_SEQ_NR])); -- -- if (tb[IFLA_HSR_PRP_SF_MC_ADDR]) -- print_string(PRINT_ANY, -- "supervision_addr", -- "supervision %s ", -- ll_addr_n2a(RTA_DATA(tb[IFLA_HSR_PRP_SF_MC_ADDR]), -- RTA_PAYLOAD(tb[IFLA_HSR_PRP_SF_MC_ADDR]), -- ARPHRD_VOID, -- b1, sizeof(b1))); -+ return ret; - } - - static void prp_print_help(struct link_util *lu, int argc, char **argv, -@@ -142,6 +55,6 @@ struct link_util prp_link_util = { - .id = "prp", - .maxattr = IFLA_HSR_PRP_MAX, - .parse_opt = prp_parse_opt, -- .print_opt = prp_print_opt, -+ .print_opt = hsr_prp_print_opt, - .print_help = prp_print_help, - }; --- -2.7.4 - 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 deleted file mode 100644 index 983e901..0000000 --- a/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0003-libnetlink-Add-helper-for-getting-a-__s32-from-netli.patch +++ /dev/null @@ -1,37 +0,0 @@ -From ca37dce0e9c50645a3473dc942a33478eb79378d Mon Sep 17 00:00:00 2001 -From: Jesus Sanchez-Palencia <[email protected]> -Date: Fri, 5 Oct 2018 16:25:19 -0700 -Subject: [PATCH 03/12] libnetlink: Add helper for getting a __s32 from netlink - msgs - -Upstream-Status: Backport -commit d791f3ad869659da4b151eded060840a88d9656a upstream. - -This function retrieves a signed 32-bit integer from a netlink message -and returns it. - -Signed-off-by: Jesus Sanchez-Palencia <[email protected]> -Signed-off-by: David Ahern <[email protected]> -Signed-off-by: Murali Karicheri <[email protected]> ---- - 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-hsr-prp-add-support-for-vlan-tagged-supervision-fram.patch b/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0004-hsr-prp-add-support-for-vlan-tagged-supervision-fram.patch deleted file mode 100644 index 9757645..0000000 --- a/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0004-hsr-prp-add-support-for-vlan-tagged-supervision-fram.patch +++ /dev/null @@ -1,148 +0,0 @@ -From 87877ac34fd4656dd61e3f8d4b37fa458cf7015a Mon Sep 17 00:00:00 2001 -From: Murali Karicheri <[email protected]> -Date: Fri, 17 May 2019 17:06:29 -0400 -Subject: [PATCH 4/4] hsr/prp: add support for vlan tagged supervision frames - -This patch adds support to configure vlan tag information -(vid, pcp and dei) at the hsr/prp lre device. This tag values -will be used by the lre device to generate a VLAN tagged -Supervision frames. This is done by adding 3 additional attributes -to the hsr/prp link type and passing this to Linux HSR/PRP -device through the ip link command. - -Upstream-Status: Pending - -Signed-off-by: Murali Karicheri <[email protected]> ---- - include/uapi/linux/if_link.h | 3 +++ - ip/iplink_hsr.c | 13 +++++++++++-- - ip/iplink_hsr_prp_common.c | 28 ++++++++++++++++++++++++++++ - ip/iplink_prp.c | 15 ++++++++++++--- - 4 files changed, 54 insertions(+), 5 deletions(-) - -diff --git a/include/uapi/linux/if_link.h b/include/uapi/linux/if_link.h -index ba78aaf..9b02642 100644 ---- a/include/uapi/linux/if_link.h -+++ b/include/uapi/linux/if_link.h -@@ -1004,6 +1004,9 @@ enum { - IFLA_HSR_PRP_SF_MC_ADDR, /* Supervision frame multicast addr */ - IFLA_HSR_PRP_SEQ_NR, - IFLA_HSR_PRP_VERSION, /* HSR version */ -+ IFLA_HSR_PRP_SV_VID, -+ IFLA_HSR_PRP_SV_DEI, -+ IFLA_HSR_PRP_SV_PCP, - __IFLA_HSR_PRP_MAX, - }; - -diff --git a/ip/iplink_hsr.c b/ip/iplink_hsr.c -index 2e83af0..0190e12 100644 ---- a/ip/iplink_hsr.c -+++ b/ip/iplink_hsr.c -@@ -17,7 +17,8 @@ static void print_usage(FILE *f) - { - fprintf(f, - "Usage:\tip link add name NAME type hsr slave1 SLAVE1-IF slave2 SLAVE2-IF\n" --"\t[ supervision ADDR-BYTE ] [version VERSION]\n" -+"\t[ supervision ADDR-BYTE ] [version VERSION] [ sv_vid SV-VID ] \n" -+"\t[ sv_pcp SV-PCP ] [ sv_cfi SV-CFI ] \n" - "\n" - "NAME\n" - " name of new hsr device (e.g. hsr0)\n" -@@ -27,7 +28,15 @@ static void print_usage(FILE *f) - " 0-255; the last byte of the multicast address used for HSR supervision\n" - " frames (default = 0)\n" - "VERSION\n" --" 0,1; the protocol version to be used. (default = 0)\n"); -+" 0,1; the protocol version to be used. (default = 0)\n" -+"SV-VID\n" -+" 0-4094; VLAN ID to be used in the VLAN tag of SV frames (default 0)\n" -+"SV-PCP\n" -+" 0-7; PCP value to be used in the VLAN tag of SV frames (default 0)\n" -+"SV-CFI\n" -+" 0-1; CFI value to be used in the VLAN tag of SV frames (default 0)\n" -+"Use VLAN tag if one of sv_vid, sv_pcp or sv_cfi is specified. Default value\n" -+"used for unspecified ones\n"); - } - - static void usage(void) -diff --git a/ip/iplink_hsr_prp_common.c b/ip/iplink_hsr_prp_common.c -index 780c1cb..734cc56 100644 ---- a/ip/iplink_hsr_prp_common.c -+++ b/ip/iplink_hsr_prp_common.c -@@ -19,6 +19,9 @@ int hsr_prp_parse_opt(bool hsr, struct link_util *lu, int argc, char **argv, - int ifindex; - unsigned char multicast_spec; - unsigned char protocol_version; -+ unsigned short sv_vid; -+ unsigned char sv_dei; -+ unsigned char sv_pcp; - - while (argc > 0) { - if (matches(*argv, "supervision") == 0) { -@@ -46,6 +49,31 @@ int hsr_prp_parse_opt(bool hsr, struct link_util *lu, int argc, char **argv, - if (ifindex == 0) - invarg("No such interface", *argv); - addattr_l(n, 1024, IFLA_HSR_PRP_SLAVE2, &ifindex, 4); -+ } else if (matches(*argv, "sv_vid") == 0) { -+ NEXT_ARG(); -+ if (get_u16(&sv_vid, *argv, 0)) -+ invarg("SV-VID is invalid", *argv); -+ /* exclude reserved 4095 */ -+ if (sv_vid >= 4095) -+ invarg("SV-VID is invalid", *argv); -+ addattr_l(n, 1024, IFLA_HSR_PRP_SV_VID, -+ &sv_vid, sizeof(sv_vid)); -+ } else if (matches(*argv, "sv_pcp") == 0) { -+ NEXT_ARG(); -+ if (get_u8(&sv_pcp, *argv, 0)) -+ invarg("SV-PCP is invalid", *argv); -+ if (sv_pcp > 7) -+ invarg("SV-PCP is invalid", *argv); -+ addattr_l(n, 1024, IFLA_HSR_PRP_SV_PCP, -+ &sv_pcp, sizeof(sv_pcp)); -+ } else if (matches(*argv, "sv_dei") == 0) { -+ NEXT_ARG(); -+ if (get_u8(&sv_dei, *argv, 0)) -+ invarg("SV-DEI is invalid", *argv); -+ if (sv_dei > 1) -+ invarg("SV-DEI is invalid", *argv); -+ addattr_l(n, 1024, IFLA_HSR_PRP_SV_DEI, -+ &sv_dei, sizeof(sv_dei)); - } else if (matches(*argv, "help") == 0) { - return -1; - } else { -diff --git a/ip/iplink_prp.c b/ip/iplink_prp.c -index eff8a0d..52c4cf6 100644 ---- a/ip/iplink_prp.c -+++ b/ip/iplink_prp.c -@@ -17,15 +17,24 @@ static void print_usage(FILE *f) - { - fprintf(f, - "Usage:\tip link add name NAME type prp slave1 SLAVE1-IF slave2 SLAVE2-IF\n" --"\t[ supervision ADDR-BYTE ]\n" -+"\t[ supervision ADDR-BYTE ] [ sv_vid SV-VID ] [ sv_pcp SV-PCP ] \n" -+"\t [ sv_cfi SV-CFI ] \n" - "\n" - "NAME\n" - " name of new prp device (e.g. prp0)\n" - "SLAVE1-IF, SLAVE2-IF\n" - " the two slave devices bound to the PRP device\n" - "ADDR-BYTE\n" --" 0-255; the last byte of the multicast address used for PRP supervision\n" --" frames (default = 0)\n"); -+" 0-255; the last byte of the multicast address used for PRP supervision\n" -+" frames (default = 0) \n" -+"SV-VID\n" -+" 0-4094; VLAN ID to be used in the VLAN tag of SV frames (default 0)\n" -+"SV-PCP\n" -+" 0-7; PCP value to be used in the VLAN tag of SV frames (default 0)\n" -+"SV-CFI\n" -+" 0-1; CFI value to be used in the VLAN tag of SV frames (default 0)\n" -+"Use VLAN tag if one of sv_vid, sv_pcp or sv_cfi is specified. Default value\n" -+"used for unspecified ones\n"); - } - - static void usage(void) --- -2.7.4 - 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 deleted file mode 100644 index 798b42e..0000000 --- a/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0004-tc-Add-support-for-configuring-the-taprio-scheduler.patch +++ /dev/null @@ -1,489 +0,0 @@ -From b53ed00cc819a9d57983f48a9fe8d02ec3b50fca Mon Sep 17 00:00:00 2001 -From: Vinicius Costa Gomes <[email protected]> -Date: Fri, 5 Oct 2018 16:25:21 -0700 -Subject: [PATCH 04/12] tc: Add support for configuring the taprio scheduler - -Upstream-Status: Backport -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 <[email protected]> -Signed-off-by: Jesus Sanchez-Palencia <[email protected]> -Signed-off-by: David Ahern <[email protected]> -Signed-off-by: Murali Karicheri <[email protected]> ---- - 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 <[email protected]> -+ * Jesus Sanchez-Palencia <[email protected]> -+ */ -+ -+#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 deleted file mode 100644 index 78a2e1f..0000000 --- a/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0005-taprio-Add-manpage-for-tc-taprio-8.patch +++ /dev/null @@ -1,169 +0,0 @@ -From b21190927e151761f138805cf3c208f8d28e8314 Mon Sep 17 00:00:00 2001 -From: Vinicius Costa Gomes <[email protected]> -Date: Fri, 5 Oct 2018 16:25:22 -0700 -Subject: [PATCH 05/12] taprio: Add manpage for tc-taprio(8) - -Upstream-Status: Backport -commit 579acb4bc52f84c629df5fcd2f9a054f41b48c57 upstream. - -This documents the parameters and provides an example of usage. - -Signed-off-by: Vinicius Costa Gomes <[email protected]> -Signed-off-by: David Ahern <[email protected]> -Signed-off-by: Murali Karicheri <[email protected]> ---- - 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 <[email protected]> --- -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 deleted file mode 100644 index 49fea1b..0000000 --- a/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0006-taprio-Add-support-for-changing-schedules.patch +++ /dev/null @@ -1,151 +0,0 @@ -From 3a650c67b63e502989fccdabf8c02a575bdf2116 Mon Sep 17 00:00:00 2001 -From: Vinicius Costa Gomes <[email protected]> -Date: Mon, 29 Apr 2019 15:52:18 -0700 -Subject: [PATCH 06/12] taprio: Add support for changing schedules - -Upstream-Status: Backport -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 <[email protected]> -Signed-off-by: David Ahern <[email protected]> -Signed-off-by: Murali Karicheri <[email protected]> ---- - 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 deleted file mode 100644 index cd50d4b..0000000 --- a/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0007-taprio-Add-support-for-cycle_time-and-cycle_time_ext.patch +++ /dev/null @@ -1,148 +0,0 @@ -From 538fe8f7e208c7ed7c9af191c25b3c48adb348c3 Mon Sep 17 00:00:00 2001 -From: Vinicius Costa Gomes <[email protected]> -Date: Mon, 29 Apr 2019 15:52:19 -0700 -Subject: [PATCH 07/12] taprio: Add support for cycle_time and - cycle_time_extension - -Upstream-Status: Backport -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 <[email protected]> -Signed-off-by: David Ahern <[email protected]> -Signed-off-by: Murali Karicheri <[email protected]> ---- - 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 deleted file mode 100644 index 63a02b4..0000000 --- a/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0008-utils-Fix-get_s64-function.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 0c672a07e1d5a8068f2323e88a72e5349dacbed9 Mon Sep 17 00:00:00 2001 -From: Kurt Kanzenbach <[email protected]> -Date: Thu, 4 Jul 2019 14:24:27 +0200 -Subject: [PATCH 08/12] utils: Fix get_s64() function - -Upstream-Status: Backport -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 <[email protected]> -Signed-off-by: Stephen Hemminger <[email protected]> -Signed-off-by: Murali Karicheri <[email protected]> ---- - 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 deleted file mode 100644 index 95c1df4..0000000 --- a/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0009-taprio-Add-support-for-setting-flags.patch +++ /dev/null @@ -1,78 +0,0 @@ -From 7e5c69b7a4733f099ca53aecfafa5dac4a3a002d Mon Sep 17 00:00:00 2001 -From: Vinicius Costa Gomes <[email protected]> -Date: Thu, 18 Jul 2019 12:55:40 -0700 -Subject: [PATCH 09/12] taprio: Add support for setting flags - -Upstream-Status: Backport -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 <[email protected]> -Signed-off-by: Vedang Patel <[email protected]> -Signed-off-by: David Ahern <[email protected]> -Signed-off-by: Murali Karicheri <[email protected]> ---- - 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 deleted file mode 100644 index 1cc31c3..0000000 --- a/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0010-taprio-add-support-for-setting-txtime_delay.patch +++ /dev/null @@ -1,97 +0,0 @@ -From 1f018de4a624dac26e7c4ea2a6b47a63d1c9c45f Mon Sep 17 00:00:00 2001 -From: Vedang Patel <[email protected]> -Date: Thu, 18 Jul 2019 12:55:41 -0700 -Subject: [PATCH 10/12] taprio: add support for setting txtime_delay. - -Upstream-Status: Backport -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 <[email protected]> -Signed-off-by: David Ahern <[email protected]> -Signed-off-by: Murali Karicheri <[email protected]> ---- - 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 deleted file mode 100644 index f47ac17..0000000 --- a/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0011-tc-taprio-Update-documentation.patch +++ /dev/null @@ -1,81 +0,0 @@ -From 5932369560e2ad1deecafa829edd0e89170a3545 Mon Sep 17 00:00:00 2001 -From: Vedang Patel <[email protected]> -Date: Thu, 18 Jul 2019 12:55:43 -0700 -Subject: [PATCH 11/12] tc: taprio: Update documentation - -Upstream-Status: Backport -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 <[email protected]> -Signed-off-by: David Ahern <[email protected]> -Signed-off-by: Murali Karicheri <[email protected]> ---- - 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 <[email protected]> --- -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 deleted file mode 100644 index 3f22520..0000000 --- a/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0012-sync-pkt_sched-header-with-kernel-version.patch +++ /dev/null @@ -1,131 +0,0 @@ -From 3736970b76dc41cd2d76399650709eab6a031807 Mon Sep 17 00:00:00 2001 -From: Murali Karicheri <[email protected]> -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. - -Upstream-Status: Backport -commit 720a44a751a922cc6e1e62ae3b7c3d5ae6c084f3 upstream. - -Signed-off-by: Murali Karicheri <[email protected]> ---- - 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 deleted file mode 100644 index 7fa33f6..0000000 --- a/meta-arago-distro/recipes-connectivity/iproute2/iproute2_4.19.0.bbappend +++ /dev/null @@ -1,22 +0,0 @@ -PR_append = ".arago6" - -FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" - -SRC_URI_append = " \ - file://0001-add-support-for-prp-similar-to-hsr.patch \ - 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 \ -" -- 2.7.4 _______________________________________________ meta-arago mailing list [email protected] http://arago-project.org/cgi-bin/mailman/listinfo/meta-arago
