Skip to content

Commit 4b3a61b

Browse files
HoratiuVulturdavem330
authored andcommitted
bridge: mrp: Set the priority of MRP instance
Each MRP instance has a priority, a lower value means a higher priority. The priority of MRP instance is stored in MRP_Test frame in this way all the MRP nodes in the ring can see other nodes priority. Signed-off-by: Horatiu Vultur <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 7e89ed8 commit 4b3a61b

File tree

6 files changed

+12
-1
lines changed

6 files changed

+12
-1
lines changed

include/net/switchdev.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ struct switchdev_obj_mrp {
116116
struct net_device *p_port;
117117
struct net_device *s_port;
118118
u32 ring_id;
119+
u16 prio;
119120
};
120121

121122
#define SWITCHDEV_OBJ_MRP(OBJ) \

include/uapi/linux/if_bridge.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ enum {
176176
IFLA_BRIDGE_MRP_INSTANCE_RING_ID,
177177
IFLA_BRIDGE_MRP_INSTANCE_P_IFINDEX,
178178
IFLA_BRIDGE_MRP_INSTANCE_S_IFINDEX,
179+
IFLA_BRIDGE_MRP_INSTANCE_PRIO,
179180
__IFLA_BRIDGE_MRP_INSTANCE_MAX,
180181
};
181182

@@ -230,6 +231,7 @@ struct br_mrp_instance {
230231
__u32 ring_id;
231232
__u32 p_ifindex;
232233
__u32 s_ifindex;
234+
__u16 prio;
233235
};
234236

235237
struct br_mrp_ring_state {

net/bridge/br_mrp.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ static struct sk_buff *br_mrp_alloc_test_skb(struct br_mrp *mrp,
147147
br_mrp_skb_tlv(skb, BR_MRP_TLV_HEADER_RING_TEST, sizeof(*hdr));
148148
hdr = skb_put(skb, sizeof(*hdr));
149149

150-
hdr->prio = cpu_to_be16(MRP_DEFAULT_PRIO);
150+
hdr->prio = cpu_to_be16(mrp->prio);
151151
ether_addr_copy(hdr->sa, p->br->dev->dev_addr);
152152
hdr->port_role = cpu_to_be16(port_role);
153153
hdr->state = cpu_to_be16(mrp->ring_state);
@@ -290,6 +290,7 @@ int br_mrp_add(struct net_bridge *br, struct br_mrp_instance *instance)
290290
return -ENOMEM;
291291

292292
mrp->ring_id = instance->ring_id;
293+
mrp->prio = instance->prio;
293294

294295
p = br_mrp_get_port(br, instance->p_ifindex);
295296
spin_lock_bh(&br->lock);

net/bridge/br_mrp_netlink.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ br_mrp_instance_policy[IFLA_BRIDGE_MRP_INSTANCE_MAX + 1] = {
2222
[IFLA_BRIDGE_MRP_INSTANCE_RING_ID] = { .type = NLA_U32 },
2323
[IFLA_BRIDGE_MRP_INSTANCE_P_IFINDEX] = { .type = NLA_U32 },
2424
[IFLA_BRIDGE_MRP_INSTANCE_S_IFINDEX] = { .type = NLA_U32 },
25+
[IFLA_BRIDGE_MRP_INSTANCE_PRIO] = { .type = NLA_U16 },
2526
};
2627

2728
static int br_mrp_instance_parse(struct net_bridge *br, struct nlattr *attr,
@@ -49,6 +50,10 @@ static int br_mrp_instance_parse(struct net_bridge *br, struct nlattr *attr,
4950
inst.ring_id = nla_get_u32(tb[IFLA_BRIDGE_MRP_INSTANCE_RING_ID]);
5051
inst.p_ifindex = nla_get_u32(tb[IFLA_BRIDGE_MRP_INSTANCE_P_IFINDEX]);
5152
inst.s_ifindex = nla_get_u32(tb[IFLA_BRIDGE_MRP_INSTANCE_S_IFINDEX]);
53+
inst.prio = MRP_DEFAULT_PRIO;
54+
55+
if (tb[IFLA_BRIDGE_MRP_INSTANCE_PRIO])
56+
inst.prio = nla_get_u16(tb[IFLA_BRIDGE_MRP_INSTANCE_PRIO]);
5257

5358
if (cmd == RTM_SETLINK)
5459
return br_mrp_add(br, &inst);

net/bridge/br_mrp_switchdev.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ int br_mrp_switchdev_add(struct net_bridge *br, struct br_mrp *mrp)
1212
.p_port = rtnl_dereference(mrp->p_port)->dev,
1313
.s_port = rtnl_dereference(mrp->s_port)->dev,
1414
.ring_id = mrp->ring_id,
15+
.prio = mrp->prio,
1516
};
1617
int err;
1718

net/bridge/br_private_mrp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ struct br_mrp {
1414
struct net_bridge_port __rcu *s_port;
1515

1616
u32 ring_id;
17+
u16 prio;
1718

1819
enum br_mrp_ring_role_type ring_role;
1920
u8 ring_role_offloaded;

0 commit comments

Comments
 (0)