Jacob Stiffler
2018-09-20 16:26:32 UTC
Signed-off-by: Jacob Stiffler <j-***@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-***@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-***@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 \
"
---
...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-***@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-***@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
2.7.4