FYI, I also merged the patch to master, but it's currently disabled, as master has 4.17 version.
On Thu, Sep 20, 2018 at 12:26:32PM -0400, Jacob Stiffler wrote: > Signed-off-by: Jacob Stiffler <j-stiff...@ti.com> > --- > ...prp-add-support-for-vlan-tagged-sv-frames.patch | 330 > +++++++++++++++++++++ > .../iproute2/iproute2_4.11.0.bbappend | 3 +- > 2 files changed, 332 insertions(+), 1 deletion(-) > create mode 100644 > meta-arago-distro/recipes-connectivity/iproute2/iproute2/0001-hsr-prp-add-support-for-vlan-tagged-sv-frames.patch > > diff --git > a/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0001-hsr-prp-add-support-for-vlan-tagged-sv-frames.patch > > b/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0001-hsr-prp-add-support-for-vlan-tagged-sv-frames.patch > new file mode 100644 > index 0000000..93a21b6 > --- /dev/null > +++ > b/meta-arago-distro/recipes-connectivity/iproute2/iproute2/0001-hsr-prp-add-support-for-vlan-tagged-sv-frames.patch > @@ -0,0 +1,330 @@ > +From 9cb64f217a6c7c4720c0dd408ce71874a04252da Mon Sep 17 00:00:00 2001 > +From: Murali Karicheri <m-kariche...@ti.com> > +Date: Wed, 12 Sep 2018 14:30:13 -0400 > +Subject: [PATCH] hsr/prp: add support for vlan tagged sv frames > + > +This patch adds support to configure vlan tag information > +(vid, pcp and cfi) at the hsr/prp lre device. This tag values > +will be used by the lre device to generate a VLAN tagged > +SV 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 <m-kariche...@ti.com> > +--- > + include/linux/if_link.h | 6 +++ > + ip/iplink_hsr.c | 60 +++++++++++++++++++++++++++- > + ip/iplink_prp.c | 101 > +++++++++++++++++++++++++++++++++++++----------- > + 3 files changed, 142 insertions(+), 25 deletions(-) > + > +diff --git a/include/linux/if_link.h b/include/linux/if_link.h > +index 6b9b59b..233b7dc 100644 > +--- a/include/linux/if_link.h > ++++ b/include/linux/if_link.h > +@@ -818,6 +818,9 @@ enum { > + IFLA_HSR_SUPERVISION_ADDR, /* Supervision frame multicast addr */ > + IFLA_HSR_SEQ_NR, > + IFLA_HSR_VERSION, /* HSR version */ > ++ IFLA_HSR_SV_VID, > ++ IFLA_HSR_SV_CFI, > ++ IFLA_HSR_SV_PCP, > + __IFLA_HSR_MAX, > + }; > + #define IFLA_HSR_MAX (__IFLA_HSR_MAX - 1) > +@@ -887,6 +890,9 @@ enum { > + IFLA_PRP_MULTICAST_SPEC, /* Last byte of supervision addr */ > + IFLA_PRP_SUPERVISION_ADDR, /* Supervision frame multicast addr */ > + IFLA_PRP_SEQ_NR, > ++ IFLA_PRP_SV_VID, > ++ IFLA_PRP_SV_CFI, > ++ IFLA_PRP_SV_PCP, > + __IFLA_PRP_MAX, > + }; > + #define IFLA_PRP_MAX (__IFLA_PRP_MAX - 1) > +diff --git a/ip/iplink_hsr.c b/ip/iplink_hsr.c > +index 696b2c9..2153494 100644 > +--- a/ip/iplink_hsr.c > ++++ b/ip/iplink_hsr.c > +@@ -25,7 +25,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" > +@@ -35,7 +36,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) > +@@ -49,6 +58,9 @@ static int hsr_parse_opt(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_cfi; > ++ unsigned char sv_pcp; > + > + while (argc > 0) { > + if (matches(*argv, "supervision") == 0) { > +@@ -76,6 +88,31 @@ static int hsr_parse_opt(struct link_util *lu, int argc, > char **argv, > + if (ifindex == 0) > + invarg("No such interface", *argv); > + addattr_l(n, 1024, IFLA_HSR_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_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_SV_PCP, > ++ &sv_pcp, sizeof(sv_pcp)); > ++ } else if (matches(*argv, "sv_cfi") == 0) { > ++ NEXT_ARG(); > ++ if (get_u8(&sv_cfi, *argv, 0)) > ++ invarg("SV-CFI is invalid", *argv); > ++ if (sv_cfi > 1) > ++ invarg("SV-CFI is invalid", *argv); > ++ addattr_l(n, 1024, IFLA_HSR_SV_CFI, > ++ &sv_cfi, sizeof(sv_cfi)); > + } else if (matches(*argv, "help") == 0) { > + usage(); > + return -1; > +@@ -97,6 +134,7 @@ static void hsr_print_opt(struct link_util *lu, FILE *f, > struct rtattr *tb[]) > + if (!tb) > + return; > + > ++ printf("%s\n", __func__); > + if (tb[IFLA_HSR_SLAVE1] && > + RTA_PAYLOAD(tb[IFLA_HSR_SLAVE1]) < sizeof(__u32)) > + return; > +@@ -109,6 +147,15 @@ static void hsr_print_opt(struct link_util *lu, FILE > *f, struct rtattr *tb[]) > + if (tb[IFLA_HSR_SUPERVISION_ADDR] && > + RTA_PAYLOAD(tb[IFLA_HSR_SUPERVISION_ADDR]) < ETH_ALEN) > + return; > ++ if (tb[IFLA_HSR_SV_VID] && > ++ RTA_PAYLOAD(tb[IFLA_HSR_SV_VID]) < sizeof(__u16)) > ++ return; > ++ if (tb[IFLA_HSR_SV_PCP] && > ++ RTA_PAYLOAD(tb[IFLA_HSR_SV_PCP]) < sizeof(__u8)) > ++ return; > ++ if (tb[IFLA_HSR_SV_CFI] && > ++ RTA_PAYLOAD(tb[IFLA_HSR_SV_CFI]) < sizeof(__u8)) > ++ return; > + > + fprintf(f, "slave1 "); > + if (tb[IFLA_HSR_SLAVE1]) > +@@ -134,6 +181,15 @@ static void hsr_print_opt(struct link_util *lu, FILE > *f, struct rtattr *tb[]) > + RTA_PAYLOAD(tb[IFLA_HSR_SUPERVISION_ADDR]), > + ARPHRD_VOID, > + b1, sizeof(b1))); > ++ if (tb[IFLA_HSR_SV_VID]) > ++ fprintf(f, "SV_VID %d ", > ++ rta_getattr_u16(tb[IFLA_HSR_SV_VID])); > ++ if (tb[IFLA_HSR_SV_PCP]) > ++ fprintf(f, "SV_PCP %d ", > ++ rta_getattr_u8(tb[IFLA_HSR_SV_PCP])); > ++ if (tb[IFLA_HSR_SV_CFI]) > ++ fprintf(f, "SV_CFI %d ", > ++ rta_getattr_u8(tb[IFLA_HSR_SV_CFI])); > + } > + > + static void hsr_print_help(struct link_util *lu, int argc, char **argv, > +diff --git a/ip/iplink_prp.c b/ip/iplink_prp.c > +index c1e5a3b..e25ae82 100644 > +--- a/ip/iplink_prp.c > ++++ b/ip/iplink_prp.c > +@@ -25,15 +25,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 HSR > 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) > +@@ -46,26 +55,54 @@ static int prp_parse_opt(struct link_util *lu, int argc, > char **argv, > + { > + int ifindex; > + unsigned char multicast_spec; > ++ unsigned short sv_vid; > ++ unsigned char sv_cfi; > ++ unsigned char sv_pcp; > + > + 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_MULTICAST_SPEC, > ++ 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_HSR_SLAVE1, &ifindex, 4); > ++ 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_HSR_SLAVE2, &ifindex, 4); > ++ addattr_l(n, 1024, IFLA_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_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_PRP_SV_PCP, > ++ &sv_pcp, sizeof(sv_pcp)); > ++ } else if (matches(*argv, "sv_cfi") == 0) { > ++ NEXT_ARG(); > ++ if (get_u8(&sv_cfi, *argv, 0)) > ++ invarg("SV-CFI is invalid", *argv); > ++ if (sv_cfi > 1) > ++ invarg("SV-CFI is invalid", *argv); > ++ addattr_l(n, 1024, IFLA_PRP_SV_CFI, > ++ &sv_cfi, sizeof(sv_cfi)); > + } else if (matches(*argv, "help") == 0) { > + usage(); > + return -1; > +@@ -87,43 +124,61 @@ static void prp_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_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_HSR_SLAVE2] && > +- RTA_PAYLOAD(tb[IFLA_HSR_SLAVE2]) < sizeof(__u32)) > ++ if (tb[IFLA_PRP_SV_VID] && > ++ RTA_PAYLOAD(tb[IFLA_PRP_SV_VID]) < sizeof(__u16)) > + return; > +- if (tb[IFLA_HSR_SEQ_NR] && > +- RTA_PAYLOAD(tb[IFLA_HSR_SEQ_NR]) < sizeof(__u16)) > ++ if (tb[IFLA_PRP_SV_PCP] && > ++ RTA_PAYLOAD(tb[IFLA_PRP_SV_PCP]) < sizeof(__u8)) > + return; > +- if (tb[IFLA_HSR_SUPERVISION_ADDR] && > +- RTA_PAYLOAD(tb[IFLA_HSR_SUPERVISION_ADDR]) < ETH_ALEN) > ++ if (tb[IFLA_PRP_SV_CFI] && > ++ RTA_PAYLOAD(tb[IFLA_PRP_SV_CFI]) < sizeof(__u8)) > + return; > + > + fprintf(f, "slave1 "); > +- if (tb[IFLA_HSR_SLAVE1]) > ++ if (tb[IFLA_PRP_SLAVE1]) > + fprintf(f, "%s ", > +- ll_index_to_name(rta_getattr_u32(tb[IFLA_HSR_SLAVE1]))); > ++ ll_index_to_name(rta_getattr_u32(tb[IFLA_PRP_SLAVE1]))); > + else > + fprintf(f, "<none> "); > + > + fprintf(f, "slave2 "); > +- if (tb[IFLA_HSR_SLAVE2]) > ++ if (tb[IFLA_PRP_SLAVE2]) > + fprintf(f, "%s ", > +- ll_index_to_name(rta_getattr_u32(tb[IFLA_HSR_SLAVE2]))); > ++ ll_index_to_name(rta_getattr_u32(tb[IFLA_PRP_SLAVE2]))); > + else > + fprintf(f, "<none> "); > + > +- if (tb[IFLA_HSR_SEQ_NR]) > ++ if (tb[IFLA_PRP_SEQ_NR]) > + fprintf(f, "sequence %d ", > +- rta_getattr_u16(tb[IFLA_HSR_SEQ_NR])); > ++ rta_getattr_u16(tb[IFLA_PRP_SEQ_NR])); > + > +- if (tb[IFLA_HSR_SUPERVISION_ADDR]) > ++ if (tb[IFLA_PRP_SUPERVISION_ADDR]) > + fprintf(f, "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_PRP_SUPERVISION_ADDR]), > ++ RTA_PAYLOAD(tb[IFLA_PRP_SUPERVISION_ADDR]), > + ARPHRD_VOID, > + b1, sizeof(b1))); > ++ if (tb[IFLA_PRP_SV_VID]) > ++ fprintf(f, "SV_VID %d ", > ++ rta_getattr_u16(tb[IFLA_PRP_SV_VID])); > ++ if (tb[IFLA_PRP_SV_PCP]) > ++ fprintf(f, "SV_PCP %d ", > ++ rta_getattr_u8(tb[IFLA_PRP_SV_PCP])); > ++ if (tb[IFLA_PRP_SV_CFI]) > ++ fprintf(f, "SV_CFI %d ", > ++ rta_getattr_u8(tb[IFLA_PRP_SV_CFI])); > + } > + > + static void prp_print_help(struct link_util *lu, int argc, char **argv, > +-- > +2.7.4 > + > diff --git > a/meta-arago-distro/recipes-connectivity/iproute2/iproute2_4.11.0.bbappend > b/meta-arago-distro/recipes-connectivity/iproute2/iproute2_4.11.0.bbappend > index 327b85b..e65d90e 100644 > --- a/meta-arago-distro/recipes-connectivity/iproute2/iproute2_4.11.0.bbappend > +++ b/meta-arago-distro/recipes-connectivity/iproute2/iproute2_4.11.0.bbappend > @@ -1,7 +1,8 @@ > -PR_append = ".arago0" > +PR_append = ".arago1" > > FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" > > SRC_URI_append = " \ > file://0001-add-support-for-prp-similar-to-hsr.patch \ > + file://0001-hsr-prp-add-support-for-vlan-tagged-sv-frames.patch \ > " > -- > 2.7.4 > > _______________________________________________ > 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