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

Reply via email to