All of lore.kernel.org
 help / color / mirror / Atom feed
* [rocko/master][PATCH] iproute2: hsr/prp: add support for vlan tagged sv frames
@ 2018-09-20 16:26 Jacob Stiffler
  2018-09-21 17:36 ` Denys Dmytriyenko
  0 siblings, 1 reply; 3+ messages in thread
From: Jacob Stiffler @ 2018-09-20 16:26 UTC (permalink / raw)
  To: meta-arago

Signed-off-by: Jacob Stiffler <j-stiffler@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-karicheri2@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-karicheri2@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



^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [rocko/master][PATCH] iproute2: hsr/prp: add support for vlan tagged sv frames
  2018-09-20 16:26 [rocko/master][PATCH] iproute2: hsr/prp: add support for vlan tagged sv frames Jacob Stiffler
@ 2018-09-21 17:36 ` Denys Dmytriyenko
  2018-09-21 18:28   ` Jacob Stiffler
  0 siblings, 1 reply; 3+ messages in thread
From: Denys Dmytriyenko @ 2018-09-21 17:36 UTC (permalink / raw)
  To: Jacob Stiffler; +Cc: meta-arago

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-stiffler@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-karicheri2@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-karicheri2@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


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [rocko/master][PATCH] iproute2: hsr/prp: add support for vlan tagged sv frames
  2018-09-21 17:36 ` Denys Dmytriyenko
@ 2018-09-21 18:28   ` Jacob Stiffler
  0 siblings, 0 replies; 3+ messages in thread
From: Jacob Stiffler @ 2018-09-21 18:28 UTC (permalink / raw)
  To: Denys Dmytriyenko; +Cc: meta-arago

[-- Attachment #1: Type: text/plain, Size: 15079 bytes --]



On 9/21/2018 1:36 PM, Denys Dmytriyenko wrote:
> FYI, I also merged the patch to master, but it's currently disabled, as master
> has 4.17 version.

Thank you.

Can you please backport this to ti2018.03?


Thank you,

Jake



>
> On Thu, Sep 20, 2018 at 12:26:32PM -0400, Jacob Stiffler wrote:
>> Signed-off-by: Jacob Stiffler <j-stiffler@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-karicheri2@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-karicheri2@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


[-- Attachment #2: Type: text/html, Size: 15542 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2018-09-21 18:28 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-09-20 16:26 [rocko/master][PATCH] iproute2: hsr/prp: add support for vlan tagged sv frames Jacob Stiffler
2018-09-21 17:36 ` Denys Dmytriyenko
2018-09-21 18:28   ` Jacob Stiffler

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.