summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2020-06-01 11:56:11 -0700
committerDavid S. Miller <davem@davemloft.net>2020-06-01 11:56:11 -0700
commit2a67ab99aad078504ded787211351a12717c6e96 (patch)
treeac66bfc38aaea7b6f0cd6dfc0cd4a0a884e88a4d /include
parent3e1c6846b9e108740ef8a37be80314053f5dd52a (diff)
parentc6676e7d62cfb5cb7c1c5320a26f3634a11afdb0 (diff)
Merge branch 'bridge-mrp-Add-support-for-MRA-role'
Horatiu Vultur says: ==================== bridge: mrp: Add support for MRA role This patch series extends the MRP with the MRA role. A node that has the MRA role can behave as a MRM or as a MRC. In case there are multiple nodes in the topology that has the MRA role then only one node can behave as MRM and all the others need to be have as MRC. The node that has the higher priority(lower value) will behave as MRM. A node that has the MRA role and behaves as MRC, it just needs to forward the MRP_Test frames between the ring ports but also it needs to detect in case it stops receiving MRP_Test frames. In that case it would try to behave as MRM. v2: - add new patch that fixes sparse warnings - fix parsing of prio attribute ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
-rw-r--r--include/net/switchdev.h2
-rw-r--r--include/uapi/linux/if_bridge.h4
-rw-r--r--include/uapi/linux/mrp_bridge.h60
3 files changed, 55 insertions, 11 deletions
diff --git a/include/net/switchdev.h b/include/net/switchdev.h
index db519957e134..b8c059b4e06d 100644
--- a/include/net/switchdev.h
+++ b/include/net/switchdev.h
@@ -116,6 +116,7 @@ struct switchdev_obj_mrp {
struct net_device *p_port;
struct net_device *s_port;
u32 ring_id;
+ u16 prio;
};
#define SWITCHDEV_OBJ_MRP(OBJ) \
@@ -129,6 +130,7 @@ struct switchdev_obj_ring_test_mrp {
u8 max_miss;
u32 ring_id;
u32 period;
+ bool monitor;
};
#define SWITCHDEV_OBJ_RING_TEST_MRP(OBJ) \
diff --git a/include/uapi/linux/if_bridge.h b/include/uapi/linux/if_bridge.h
index 5a43eb86c93b..caa6914a3e53 100644
--- a/include/uapi/linux/if_bridge.h
+++ b/include/uapi/linux/if_bridge.h
@@ -176,6 +176,7 @@ enum {
IFLA_BRIDGE_MRP_INSTANCE_RING_ID,
IFLA_BRIDGE_MRP_INSTANCE_P_IFINDEX,
IFLA_BRIDGE_MRP_INSTANCE_S_IFINDEX,
+ IFLA_BRIDGE_MRP_INSTANCE_PRIO,
__IFLA_BRIDGE_MRP_INSTANCE_MAX,
};
@@ -221,6 +222,7 @@ enum {
IFLA_BRIDGE_MRP_START_TEST_INTERVAL,
IFLA_BRIDGE_MRP_START_TEST_MAX_MISS,
IFLA_BRIDGE_MRP_START_TEST_PERIOD,
+ IFLA_BRIDGE_MRP_START_TEST_MONITOR,
__IFLA_BRIDGE_MRP_START_TEST_MAX,
};
@@ -230,6 +232,7 @@ struct br_mrp_instance {
__u32 ring_id;
__u32 p_ifindex;
__u32 s_ifindex;
+ __u16 prio;
};
struct br_mrp_ring_state {
@@ -247,6 +250,7 @@ struct br_mrp_start_test {
__u32 interval;
__u32 max_miss;
__u32 period;
+ __u32 monitor;
};
struct bridge_stp_xstats {
diff --git a/include/uapi/linux/mrp_bridge.h b/include/uapi/linux/mrp_bridge.h
index 2600cdf5a284..84f15f48a7cb 100644
--- a/include/uapi/linux/mrp_bridge.h
+++ b/include/uapi/linux/mrp_bridge.h
@@ -11,11 +11,14 @@
#define MRP_DOMAIN_UUID_LENGTH 16
#define MRP_VERSION 1
#define MRP_FRAME_PRIO 7
+#define MRP_OUI_LENGTH 3
+#define MRP_MANUFACTURE_DATA_LENGTH 2
enum br_mrp_ring_role_type {
BR_MRP_RING_ROLE_DISABLED,
BR_MRP_RING_ROLE_MRC,
BR_MRP_RING_ROLE_MRM,
+ BR_MRP_RING_ROLE_MRA,
};
enum br_mrp_ring_state_type {
@@ -43,6 +46,13 @@ enum br_mrp_tlv_header_type {
BR_MRP_TLV_HEADER_RING_TOPO = 0x3,
BR_MRP_TLV_HEADER_RING_LINK_DOWN = 0x4,
BR_MRP_TLV_HEADER_RING_LINK_UP = 0x5,
+ BR_MRP_TLV_HEADER_OPTION = 0x7f,
+};
+
+enum br_mrp_sub_tlv_header_type {
+ BR_MRP_SUB_TLV_HEADER_TEST_MGR_NACK = 0x1,
+ BR_MRP_SUB_TLV_HEADER_TEST_PROPAGATE = 0x2,
+ BR_MRP_SUB_TLV_HEADER_TEST_AUTO_MGR = 0x3,
};
struct br_mrp_tlv_hdr {
@@ -50,35 +60,63 @@ struct br_mrp_tlv_hdr {
__u8 length;
};
+struct br_mrp_sub_tlv_hdr {
+ __u8 type;
+ __u8 length;
+};
+
struct br_mrp_end_hdr {
struct br_mrp_tlv_hdr hdr;
};
struct br_mrp_common_hdr {
- __u16 seq_id;
+ __be16 seq_id;
__u8 domain[MRP_DOMAIN_UUID_LENGTH];
};
struct br_mrp_ring_test_hdr {
- __u16 prio;
+ __be16 prio;
__u8 sa[ETH_ALEN];
- __u16 port_role;
- __u16 state;
- __u16 transitions;
- __u32 timestamp;
+ __be16 port_role;
+ __be16 state;
+ __be16 transitions;
+ __be32 timestamp;
};
struct br_mrp_ring_topo_hdr {
- __u16 prio;
+ __be16 prio;
__u8 sa[ETH_ALEN];
- __u16 interval;
+ __be16 interval;
};
struct br_mrp_ring_link_hdr {
__u8 sa[ETH_ALEN];
- __u16 port_role;
- __u16 interval;
- __u16 blocked;
+ __be16 port_role;
+ __be16 interval;
+ __be16 blocked;
+};
+
+struct br_mrp_sub_opt_hdr {
+ __u8 type;
+ __u8 manufacture_data[MRP_MANUFACTURE_DATA_LENGTH];
+};
+
+struct br_mrp_test_mgr_nack_hdr {
+ __be16 prio;
+ __u8 sa[ETH_ALEN];
+ __be16 other_prio;
+ __u8 other_sa[ETH_ALEN];
+};
+
+struct br_mrp_test_prop_hdr {
+ __be16 prio;
+ __u8 sa[ETH_ALEN];
+ __be16 other_prio;
+ __u8 other_sa[ETH_ALEN];
+};
+
+struct br_mrp_oui_hdr {
+ __u8 oui[MRP_OUI_LENGTH];
};
#endif