Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2
   3#include <linux/mrp_bridge.h>
   4#include "br_private_mrp.h"
   5
   6static const u8 mrp_test_dmac[ETH_ALEN] = { 0x1, 0x15, 0x4e, 0x0, 0x0, 0x1 };
   7static const u8 mrp_in_test_dmac[ETH_ALEN] = { 0x1, 0x15, 0x4e, 0x0, 0x0, 0x3 };
   8
   9static bool br_mrp_is_ring_port(struct net_bridge_port *p_port,
  10				struct net_bridge_port *s_port,
  11				struct net_bridge_port *port)
  12{
  13	if (port == p_port ||
  14	    port == s_port)
  15		return true;
  16
  17	return false;
  18}
  19
  20static bool br_mrp_is_in_port(struct net_bridge_port *i_port,
  21			      struct net_bridge_port *port)
  22{
  23	if (port == i_port)
  24		return true;
  25
  26	return false;
  27}
  28
  29static struct net_bridge_port *br_mrp_get_port(struct net_bridge *br,
  30					       u32 ifindex)
  31{
  32	struct net_bridge_port *res = NULL;
  33	struct net_bridge_port *port;
  34
  35	list_for_each_entry(port, &br->port_list, list) {
  36		if (port->dev->ifindex == ifindex) {
  37			res = port;
  38			break;
  39		}
  40	}
  41
  42	return res;
  43}
  44
  45static struct br_mrp *br_mrp_find_id(struct net_bridge *br, u32 ring_id)
  46{
  47	struct br_mrp *res = NULL;
  48	struct br_mrp *mrp;
  49
  50	list_for_each_entry_rcu(mrp, &br->mrp_list, list,
  51				lockdep_rtnl_is_held()) {
  52		if (mrp->ring_id == ring_id) {
  53			res = mrp;
  54			break;
  55		}
  56	}
  57
  58	return res;
  59}
  60
  61static struct br_mrp *br_mrp_find_in_id(struct net_bridge *br, u32 in_id)
  62{
  63	struct br_mrp *res = NULL;
  64	struct br_mrp *mrp;
  65
  66	list_for_each_entry_rcu(mrp, &br->mrp_list, list,
  67				lockdep_rtnl_is_held()) {
  68		if (mrp->in_id == in_id) {
  69			res = mrp;
  70			break;
  71		}
  72	}
  73
  74	return res;
  75}
  76
  77static bool br_mrp_unique_ifindex(struct net_bridge *br, u32 ifindex)
  78{
  79	struct br_mrp *mrp;
  80
  81	list_for_each_entry_rcu(mrp, &br->mrp_list, list,
  82				lockdep_rtnl_is_held()) {
  83		struct net_bridge_port *p;
  84
  85		p = rtnl_dereference(mrp->p_port);
  86		if (p && p->dev->ifindex == ifindex)
  87			return false;
  88
  89		p = rtnl_dereference(mrp->s_port);
  90		if (p && p->dev->ifindex == ifindex)
  91			return false;
  92
  93		p = rtnl_dereference(mrp->i_port);
  94		if (p && p->dev->ifindex == ifindex)
  95			return false;
  96	}
  97
  98	return true;
  99}
 100
 101static struct br_mrp *br_mrp_find_port(struct net_bridge *br,
 102				       struct net_bridge_port *p)
 103{
 104	struct br_mrp *res = NULL;
 105	struct br_mrp *mrp;
 106
 107	list_for_each_entry_rcu(mrp, &br->mrp_list, list,
 108				lockdep_rtnl_is_held()) {
 109		if (rcu_access_pointer(mrp->p_port) == p ||
 110		    rcu_access_pointer(mrp->s_port) == p ||
 111		    rcu_access_pointer(mrp->i_port) == p) {
 112			res = mrp;
 113			break;
 114		}
 115	}
 116
 117	return res;
 118}
 119
 120static int br_mrp_next_seq(struct br_mrp *mrp)
 121{
 122	mrp->seq_id++;
 123	return mrp->seq_id;
 124}
 125
 126static struct sk_buff *br_mrp_skb_alloc(struct net_bridge_port *p,
 127					const u8 *src, const u8 *dst)
 128{
 129	struct ethhdr *eth_hdr;
 130	struct sk_buff *skb;
 131	__be16 *version;
 132
 133	skb = dev_alloc_skb(MRP_MAX_FRAME_LENGTH);
 134	if (!skb)
 135		return NULL;
 136
 137	skb->dev = p->dev;
 138	skb->protocol = htons(ETH_P_MRP);
 139	skb->priority = MRP_FRAME_PRIO;
 140	skb_reserve(skb, sizeof(*eth_hdr));
 141
 142	eth_hdr = skb_push(skb, sizeof(*eth_hdr));
 143	ether_addr_copy(eth_hdr->h_dest, dst);
 144	ether_addr_copy(eth_hdr->h_source, src);
 145	eth_hdr->h_proto = htons(ETH_P_MRP);
 146
 147	version = skb_put(skb, sizeof(*version));
 148	*version = cpu_to_be16(MRP_VERSION);
 149
 150	return skb;
 151}
 152
 153static void br_mrp_skb_tlv(struct sk_buff *skb,
 154			   enum br_mrp_tlv_header_type type,
 155			   u8 length)
 156{
 157	struct br_mrp_tlv_hdr *hdr;
 158
 159	hdr = skb_put(skb, sizeof(*hdr));
 160	hdr->type = type;
 161	hdr->length = length;
 162}
 163
 164static void br_mrp_skb_common(struct sk_buff *skb, struct br_mrp *mrp)
 165{
 166	struct br_mrp_common_hdr *hdr;
 167
 168	br_mrp_skb_tlv(skb, BR_MRP_TLV_HEADER_COMMON, sizeof(*hdr));
 169
 170	hdr = skb_put(skb, sizeof(*hdr));
 171	hdr->seq_id = cpu_to_be16(br_mrp_next_seq(mrp));
 172	memset(hdr->domain, 0xff, MRP_DOMAIN_UUID_LENGTH);
 173}
 174
 175static struct sk_buff *br_mrp_alloc_test_skb(struct br_mrp *mrp,
 176					     struct net_bridge_port *p,
 177					     enum br_mrp_port_role_type port_role)
 178{
 179	struct br_mrp_ring_test_hdr *hdr = NULL;
 180	struct sk_buff *skb = NULL;
 181
 182	if (!p)
 183		return NULL;
 184
 185	skb = br_mrp_skb_alloc(p, p->dev->dev_addr, mrp_test_dmac);
 186	if (!skb)
 187		return NULL;
 188
 189	br_mrp_skb_tlv(skb, BR_MRP_TLV_HEADER_RING_TEST, sizeof(*hdr));
 190	hdr = skb_put(skb, sizeof(*hdr));
 191
 192	hdr->prio = cpu_to_be16(mrp->prio);
 193	ether_addr_copy(hdr->sa, p->br->dev->dev_addr);
 194	hdr->port_role = cpu_to_be16(port_role);
 195	hdr->state = cpu_to_be16(mrp->ring_state);
 196	hdr->transitions = cpu_to_be16(mrp->ring_transitions);
 197	hdr->timestamp = cpu_to_be32(jiffies_to_msecs(jiffies));
 198
 199	br_mrp_skb_common(skb, mrp);
 200	br_mrp_skb_tlv(skb, BR_MRP_TLV_HEADER_END, 0x0);
 201
 202	return skb;
 203}
 204
 205static struct sk_buff *br_mrp_alloc_in_test_skb(struct br_mrp *mrp,
 206						struct net_bridge_port *p,
 207						enum br_mrp_port_role_type port_role)
 208{
 209	struct br_mrp_in_test_hdr *hdr = NULL;
 210	struct sk_buff *skb = NULL;
 211
 212	if (!p)
 213		return NULL;
 214
 215	skb = br_mrp_skb_alloc(p, p->dev->dev_addr, mrp_in_test_dmac);
 216	if (!skb)
 217		return NULL;
 218
 219	br_mrp_skb_tlv(skb, BR_MRP_TLV_HEADER_IN_TEST, sizeof(*hdr));
 220	hdr = skb_put(skb, sizeof(*hdr));
 221
 222	hdr->id = cpu_to_be16(mrp->in_id);
 223	ether_addr_copy(hdr->sa, p->br->dev->dev_addr);
 224	hdr->port_role = cpu_to_be16(port_role);
 225	hdr->state = cpu_to_be16(mrp->in_state);
 226	hdr->transitions = cpu_to_be16(mrp->in_transitions);
 227	hdr->timestamp = cpu_to_be32(jiffies_to_msecs(jiffies));
 228
 229	br_mrp_skb_common(skb, mrp);
 230	br_mrp_skb_tlv(skb, BR_MRP_TLV_HEADER_END, 0x0);
 231
 232	return skb;
 233}
 234
 235/* This function is continuously called in the following cases:
 236 * - when node role is MRM, in this case test_monitor is always set to false
 237 *   because it needs to notify the userspace that the ring is open and needs to
 238 *   send MRP_Test frames
 239 * - when node role is MRA, there are 2 subcases:
 240 *     - when MRA behaves as MRM, in this case is similar with MRM role
 241 *     - when MRA behaves as MRC, in this case test_monitor is set to true,
 242 *       because it needs to detect when it stops seeing MRP_Test frames
 243 *       from MRM node but it doesn't need to send MRP_Test frames.
 244 */
 245static void br_mrp_test_work_expired(struct work_struct *work)
 246{
 247	struct delayed_work *del_work = to_delayed_work(work);
 248	struct br_mrp *mrp = container_of(del_work, struct br_mrp, test_work);
 249	struct net_bridge_port *p;
 250	bool notify_open = false;
 251	struct sk_buff *skb;
 252
 253	if (time_before_eq(mrp->test_end, jiffies))
 254		return;
 255
 256	if (mrp->test_count_miss < mrp->test_max_miss) {
 257		mrp->test_count_miss++;
 258	} else {
 259		/* Notify that the ring is open only if the ring state is
 260		 * closed, otherwise it would continue to notify at every
 261		 * interval.
 262		 * Also notify that the ring is open when the node has the
 263		 * role MRA and behaves as MRC. The reason is that the
 264		 * userspace needs to know when the MRM stopped sending
 265		 * MRP_Test frames so that the current node to try to take
 266		 * the role of a MRM.
 267		 */
 268		if (mrp->ring_state == BR_MRP_RING_STATE_CLOSED ||
 269		    mrp->test_monitor)
 270			notify_open = true;
 271	}
 272
 273	rcu_read_lock();
 274
 275	p = rcu_dereference(mrp->p_port);
 276	if (p) {
 277		if (!mrp->test_monitor) {
 278			skb = br_mrp_alloc_test_skb(mrp, p,
 279						    BR_MRP_PORT_ROLE_PRIMARY);
 280			if (!skb)
 281				goto out;
 282
 283			skb_reset_network_header(skb);
 284			dev_queue_xmit(skb);
 285		}
 286
 287		if (notify_open && !mrp->ring_role_offloaded)
 288			br_mrp_ring_port_open(p->dev, true);
 289	}
 290
 291	p = rcu_dereference(mrp->s_port);
 292	if (p) {
 293		if (!mrp->test_monitor) {
 294			skb = br_mrp_alloc_test_skb(mrp, p,
 295						    BR_MRP_PORT_ROLE_SECONDARY);
 296			if (!skb)
 297				goto out;
 298
 299			skb_reset_network_header(skb);
 300			dev_queue_xmit(skb);
 301		}
 302
 303		if (notify_open && !mrp->ring_role_offloaded)
 304			br_mrp_ring_port_open(p->dev, true);
 305	}
 306
 307out:
 308	rcu_read_unlock();
 309
 310	queue_delayed_work(system_wq, &mrp->test_work,
 311			   usecs_to_jiffies(mrp->test_interval));
 312}
 313
 314/* This function is continuously called when the node has the interconnect role
 315 * MIM. It would generate interconnect test frames and will send them on all 3
 316 * ports. But will also check if it stop receiving interconnect test frames.
 317 */
 318static void br_mrp_in_test_work_expired(struct work_struct *work)
 319{
 320	struct delayed_work *del_work = to_delayed_work(work);
 321	struct br_mrp *mrp = container_of(del_work, struct br_mrp, in_test_work);
 322	struct net_bridge_port *p;
 323	bool notify_open = false;
 324	struct sk_buff *skb;
 325
 326	if (time_before_eq(mrp->in_test_end, jiffies))
 327		return;
 328
 329	if (mrp->in_test_count_miss < mrp->in_test_max_miss) {
 330		mrp->in_test_count_miss++;
 331	} else {
 332		/* Notify that the interconnect ring is open only if the
 333		 * interconnect ring state is closed, otherwise it would
 334		 * continue to notify at every interval.
 335		 */
 336		if (mrp->in_state == BR_MRP_IN_STATE_CLOSED)
 337			notify_open = true;
 338	}
 339
 340	rcu_read_lock();
 341
 342	p = rcu_dereference(mrp->p_port);
 343	if (p) {
 344		skb = br_mrp_alloc_in_test_skb(mrp, p,
 345					       BR_MRP_PORT_ROLE_PRIMARY);
 346		if (!skb)
 347			goto out;
 348
 349		skb_reset_network_header(skb);
 350		dev_queue_xmit(skb);
 351
 352		if (notify_open && !mrp->in_role_offloaded)
 353			br_mrp_in_port_open(p->dev, true);
 354	}
 355
 356	p = rcu_dereference(mrp->s_port);
 357	if (p) {
 358		skb = br_mrp_alloc_in_test_skb(mrp, p,
 359					       BR_MRP_PORT_ROLE_SECONDARY);
 360		if (!skb)
 361			goto out;
 362
 363		skb_reset_network_header(skb);
 364		dev_queue_xmit(skb);
 365
 366		if (notify_open && !mrp->in_role_offloaded)
 367			br_mrp_in_port_open(p->dev, true);
 368	}
 369
 370	p = rcu_dereference(mrp->i_port);
 371	if (p) {
 372		skb = br_mrp_alloc_in_test_skb(mrp, p,
 373					       BR_MRP_PORT_ROLE_INTER);
 374		if (!skb)
 375			goto out;
 376
 377		skb_reset_network_header(skb);
 378		dev_queue_xmit(skb);
 379
 380		if (notify_open && !mrp->in_role_offloaded)
 381			br_mrp_in_port_open(p->dev, true);
 382	}
 383
 384out:
 385	rcu_read_unlock();
 386
 387	queue_delayed_work(system_wq, &mrp->in_test_work,
 388			   usecs_to_jiffies(mrp->in_test_interval));
 389}
 390
 391/* Deletes the MRP instance.
 392 * note: called under rtnl_lock
 393 */
 394static void br_mrp_del_impl(struct net_bridge *br, struct br_mrp *mrp)
 395{
 396	struct net_bridge_port *p;
 397	u8 state;
 398
 399	/* Stop sending MRP_Test frames */
 400	cancel_delayed_work_sync(&mrp->test_work);
 401	br_mrp_switchdev_send_ring_test(br, mrp, 0, 0, 0, 0);
 402
 403	/* Stop sending MRP_InTest frames if has an interconnect role */
 404	cancel_delayed_work_sync(&mrp->in_test_work);
 405	br_mrp_switchdev_send_in_test(br, mrp, 0, 0, 0);
 406
 407	br_mrp_switchdev_del(br, mrp);
 408
 409	/* Reset the ports */
 410	p = rtnl_dereference(mrp->p_port);
 411	if (p) {
 412		spin_lock_bh(&br->lock);
 413		state = netif_running(br->dev) ?
 414				BR_STATE_FORWARDING : BR_STATE_DISABLED;
 415		p->state = state;
 416		p->flags &= ~BR_MRP_AWARE;
 417		spin_unlock_bh(&br->lock);
 418		br_mrp_port_switchdev_set_state(p, state);
 419		rcu_assign_pointer(mrp->p_port, NULL);
 420	}
 421
 422	p = rtnl_dereference(mrp->s_port);
 423	if (p) {
 424		spin_lock_bh(&br->lock);
 425		state = netif_running(br->dev) ?
 426				BR_STATE_FORWARDING : BR_STATE_DISABLED;
 427		p->state = state;
 428		p->flags &= ~BR_MRP_AWARE;
 429		spin_unlock_bh(&br->lock);
 430		br_mrp_port_switchdev_set_state(p, state);
 431		rcu_assign_pointer(mrp->s_port, NULL);
 432	}
 433
 434	p = rtnl_dereference(mrp->i_port);
 435	if (p) {
 436		spin_lock_bh(&br->lock);
 437		state = netif_running(br->dev) ?
 438				BR_STATE_FORWARDING : BR_STATE_DISABLED;
 439		p->state = state;
 440		p->flags &= ~BR_MRP_AWARE;
 441		spin_unlock_bh(&br->lock);
 442		br_mrp_port_switchdev_set_state(p, state);
 443		rcu_assign_pointer(mrp->i_port, NULL);
 444	}
 445
 446	list_del_rcu(&mrp->list);
 447	kfree_rcu(mrp, rcu);
 448}
 449
 450/* Adds a new MRP instance.
 451 * note: called under rtnl_lock
 452 */
 453int br_mrp_add(struct net_bridge *br, struct br_mrp_instance *instance)
 454{
 455	struct net_bridge_port *p;
 456	struct br_mrp *mrp;
 457	int err;
 458
 459	/* If the ring exists, it is not possible to create another one with the
 460	 * same ring_id
 461	 */
 462	mrp = br_mrp_find_id(br, instance->ring_id);
 463	if (mrp)
 464		return -EINVAL;
 465
 466	if (!br_mrp_get_port(br, instance->p_ifindex) ||
 467	    !br_mrp_get_port(br, instance->s_ifindex))
 468		return -EINVAL;
 469
 470	/* It is not possible to have the same port part of multiple rings */
 471	if (!br_mrp_unique_ifindex(br, instance->p_ifindex) ||
 472	    !br_mrp_unique_ifindex(br, instance->s_ifindex))
 473		return -EINVAL;
 474
 475	mrp = kzalloc(sizeof(*mrp), GFP_KERNEL);
 476	if (!mrp)
 477		return -ENOMEM;
 478
 479	mrp->ring_id = instance->ring_id;
 480	mrp->prio = instance->prio;
 481
 482	p = br_mrp_get_port(br, instance->p_ifindex);
 483	spin_lock_bh(&br->lock);
 484	p->state = BR_STATE_FORWARDING;
 485	p->flags |= BR_MRP_AWARE;
 486	spin_unlock_bh(&br->lock);
 487	rcu_assign_pointer(mrp->p_port, p);
 488
 489	p = br_mrp_get_port(br, instance->s_ifindex);
 490	spin_lock_bh(&br->lock);
 491	p->state = BR_STATE_FORWARDING;
 492	p->flags |= BR_MRP_AWARE;
 493	spin_unlock_bh(&br->lock);
 494	rcu_assign_pointer(mrp->s_port, p);
 495
 496	INIT_DELAYED_WORK(&mrp->test_work, br_mrp_test_work_expired);
 497	INIT_DELAYED_WORK(&mrp->in_test_work, br_mrp_in_test_work_expired);
 498	list_add_tail_rcu(&mrp->list, &br->mrp_list);
 499
 500	err = br_mrp_switchdev_add(br, mrp);
 501	if (err)
 502		goto delete_mrp;
 503
 504	return 0;
 505
 506delete_mrp:
 507	br_mrp_del_impl(br, mrp);
 508
 509	return err;
 510}
 511
 512/* Deletes the MRP instance from which the port is part of
 513 * note: called under rtnl_lock
 514 */
 515void br_mrp_port_del(struct net_bridge *br, struct net_bridge_port *p)
 516{
 517	struct br_mrp *mrp = br_mrp_find_port(br, p);
 518
 519	/* If the port is not part of a MRP instance just bail out */
 520	if (!mrp)
 521		return;
 522
 523	br_mrp_del_impl(br, mrp);
 524}
 525
 526/* Deletes existing MRP instance based on ring_id
 527 * note: called under rtnl_lock
 528 */
 529int br_mrp_del(struct net_bridge *br, struct br_mrp_instance *instance)
 530{
 531	struct br_mrp *mrp = br_mrp_find_id(br, instance->ring_id);
 532
 533	if (!mrp)
 534		return -EINVAL;
 535
 536	br_mrp_del_impl(br, mrp);
 537
 538	return 0;
 539}
 540
 541/* Set port state, port state can be forwarding, blocked or disabled
 542 * note: already called with rtnl_lock
 543 */
 544int br_mrp_set_port_state(struct net_bridge_port *p,
 545			  enum br_mrp_port_state_type state)
 546{
 547	if (!p || !(p->flags & BR_MRP_AWARE))
 548		return -EINVAL;
 549
 550	spin_lock_bh(&p->br->lock);
 551
 552	if (state == BR_MRP_PORT_STATE_FORWARDING)
 553		p->state = BR_STATE_FORWARDING;
 554	else
 555		p->state = BR_STATE_BLOCKING;
 556
 557	spin_unlock_bh(&p->br->lock);
 558
 559	br_mrp_port_switchdev_set_state(p, state);
 560
 561	return 0;
 562}
 563
 564/* Set port role, port role can be primary or secondary
 565 * note: already called with rtnl_lock
 566 */
 567int br_mrp_set_port_role(struct net_bridge_port *p,
 568			 enum br_mrp_port_role_type role)
 569{
 570	struct br_mrp *mrp;
 571
 572	if (!p || !(p->flags & BR_MRP_AWARE))
 573		return -EINVAL;
 574
 575	mrp = br_mrp_find_port(p->br, p);
 576
 577	if (!mrp)
 578		return -EINVAL;
 579
 580	switch (role) {
 581	case BR_MRP_PORT_ROLE_PRIMARY:
 582		rcu_assign_pointer(mrp->p_port, p);
 583		break;
 584	case BR_MRP_PORT_ROLE_SECONDARY:
 585		rcu_assign_pointer(mrp->s_port, p);
 586		break;
 587	default:
 588		return -EINVAL;
 589	}
 590
 591	br_mrp_port_switchdev_set_role(p, role);
 592
 593	return 0;
 594}
 595
 596/* Set ring state, ring state can be only Open or Closed
 597 * note: already called with rtnl_lock
 598 */
 599int br_mrp_set_ring_state(struct net_bridge *br,
 600			  struct br_mrp_ring_state *state)
 601{
 602	struct br_mrp *mrp = br_mrp_find_id(br, state->ring_id);
 603
 604	if (!mrp)
 605		return -EINVAL;
 606
 607	if (mrp->ring_state == BR_MRP_RING_STATE_CLOSED &&
 608	    state->ring_state != BR_MRP_RING_STATE_CLOSED)
 609		mrp->ring_transitions++;
 610
 611	mrp->ring_state = state->ring_state;
 612
 613	br_mrp_switchdev_set_ring_state(br, mrp, state->ring_state);
 614
 615	return 0;
 616}
 617
 618/* Set ring role, ring role can be only MRM(Media Redundancy Manager) or
 619 * MRC(Media Redundancy Client).
 620 * note: already called with rtnl_lock
 621 */
 622int br_mrp_set_ring_role(struct net_bridge *br,
 623			 struct br_mrp_ring_role *role)
 624{
 625	struct br_mrp *mrp = br_mrp_find_id(br, role->ring_id);
 626	int err;
 627
 628	if (!mrp)
 629		return -EINVAL;
 630
 631	mrp->ring_role = role->ring_role;
 632
 633	/* If there is an error just bailed out */
 634	err = br_mrp_switchdev_set_ring_role(br, mrp, role->ring_role);
 635	if (err && err != -EOPNOTSUPP)
 636		return err;
 637
 638	/* Now detect if the HW actually applied the role or not. If the HW
 639	 * applied the role it means that the SW will not to do those operations
 640	 * anymore. For example if the role ir MRM then the HW will notify the
 641	 * SW when ring is open, but if the is not pushed to the HW the SW will
 642	 * need to detect when the ring is open
 643	 */
 644	mrp->ring_role_offloaded = err == -EOPNOTSUPP ? 0 : 1;
 645
 646	return 0;
 647}
 648
 649/* Start to generate or monitor MRP test frames, the frames are generated by
 650 * HW and if it fails, they are generated by the SW.
 651 * note: already called with rtnl_lock
 652 */
 653int br_mrp_start_test(struct net_bridge *br,
 654		      struct br_mrp_start_test *test)
 655{
 656	struct br_mrp *mrp = br_mrp_find_id(br, test->ring_id);
 657
 658	if (!mrp)
 659		return -EINVAL;
 660
 661	/* Try to push it to the HW and if it fails then continue with SW
 662	 * implementation and if that also fails then return error.
 663	 */
 664	if (!br_mrp_switchdev_send_ring_test(br, mrp, test->interval,
 665					     test->max_miss, test->period,
 666					     test->monitor))
 667		return 0;
 668
 669	mrp->test_interval = test->interval;
 670	mrp->test_end = jiffies + usecs_to_jiffies(test->period);
 671	mrp->test_max_miss = test->max_miss;
 672	mrp->test_monitor = test->monitor;
 673	mrp->test_count_miss = 0;
 674	queue_delayed_work(system_wq, &mrp->test_work,
 675			   usecs_to_jiffies(test->interval));
 676
 677	return 0;
 678}
 679
 680/* Set in state, int state can be only Open or Closed
 681 * note: already called with rtnl_lock
 682 */
 683int br_mrp_set_in_state(struct net_bridge *br, struct br_mrp_in_state *state)
 684{
 685	struct br_mrp *mrp = br_mrp_find_in_id(br, state->in_id);
 686
 687	if (!mrp)
 688		return -EINVAL;
 689
 690	if (mrp->in_state == BR_MRP_IN_STATE_CLOSED &&
 691	    state->in_state != BR_MRP_IN_STATE_CLOSED)
 692		mrp->in_transitions++;
 693
 694	mrp->in_state = state->in_state;
 695
 696	br_mrp_switchdev_set_in_state(br, mrp, state->in_state);
 697
 698	return 0;
 699}
 700
 701/* Set in role, in role can be only MIM(Media Interconnection Manager) or
 702 * MIC(Media Interconnection Client).
 703 * note: already called with rtnl_lock
 704 */
 705int br_mrp_set_in_role(struct net_bridge *br, struct br_mrp_in_role *role)
 706{
 707	struct br_mrp *mrp = br_mrp_find_id(br, role->ring_id);
 708	struct net_bridge_port *p;
 709	int err;
 710
 711	if (!mrp)
 712		return -EINVAL;
 713
 714	if (!br_mrp_get_port(br, role->i_ifindex))
 715		return -EINVAL;
 716
 717	if (role->in_role == BR_MRP_IN_ROLE_DISABLED) {
 718		u8 state;
 719
 720		/* It is not allowed to disable a port that doesn't exist */
 721		p = rtnl_dereference(mrp->i_port);
 722		if (!p)
 723			return -EINVAL;
 724
 725		/* Stop the generating MRP_InTest frames */
 726		cancel_delayed_work_sync(&mrp->in_test_work);
 727		br_mrp_switchdev_send_in_test(br, mrp, 0, 0, 0);
 728
 729		/* Remove the port */
 730		spin_lock_bh(&br->lock);
 731		state = netif_running(br->dev) ?
 732				BR_STATE_FORWARDING : BR_STATE_DISABLED;
 733		p->state = state;
 734		p->flags &= ~BR_MRP_AWARE;
 735		spin_unlock_bh(&br->lock);
 736		br_mrp_port_switchdev_set_state(p, state);
 737		rcu_assign_pointer(mrp->i_port, NULL);
 738
 739		mrp->in_role = role->in_role;
 740		mrp->in_id = 0;
 741
 742		return 0;
 743	}
 744
 745	/* It is not possible to have the same port part of multiple rings */
 746	if (!br_mrp_unique_ifindex(br, role->i_ifindex))
 747		return -EINVAL;
 748
 749	/* It is not allowed to set a different interconnect port if the mrp
 750	 * instance has already one. First it needs to be disabled and after
 751	 * that set the new port
 752	 */
 753	if (rcu_access_pointer(mrp->i_port))
 754		return -EINVAL;
 755
 756	p = br_mrp_get_port(br, role->i_ifindex);
 757	spin_lock_bh(&br->lock);
 758	p->state = BR_STATE_FORWARDING;
 759	p->flags |= BR_MRP_AWARE;
 760	spin_unlock_bh(&br->lock);
 761	rcu_assign_pointer(mrp->i_port, p);
 762
 763	mrp->in_role = role->in_role;
 764	mrp->in_id = role->in_id;
 765
 766	/* If there is an error just bailed out */
 767	err = br_mrp_switchdev_set_in_role(br, mrp, role->in_id,
 768					   role->ring_id, role->in_role);
 769	if (err && err != -EOPNOTSUPP)
 770		return err;
 771
 772	/* Now detect if the HW actually applied the role or not. If the HW
 773	 * applied the role it means that the SW will not to do those operations
 774	 * anymore. For example if the role is MIM then the HW will notify the
 775	 * SW when interconnect ring is open, but if the is not pushed to the HW
 776	 * the SW will need to detect when the interconnect ring is open.
 777	 */
 778	mrp->in_role_offloaded = err == -EOPNOTSUPP ? 0 : 1;
 779
 780	return 0;
 781}
 782
 783/* Start to generate MRP_InTest frames, the frames are generated by
 784 * HW and if it fails, they are generated by the SW.
 785 * note: already called with rtnl_lock
 786 */
 787int br_mrp_start_in_test(struct net_bridge *br,
 788			 struct br_mrp_start_in_test *in_test)
 789{
 790	struct br_mrp *mrp = br_mrp_find_in_id(br, in_test->in_id);
 791
 792	if (!mrp)
 793		return -EINVAL;
 794
 795	if (mrp->in_role != BR_MRP_IN_ROLE_MIM)
 796		return -EINVAL;
 797
 798	/* Try to push it to the HW and if it fails then continue with SW
 799	 * implementation and if that also fails then return error.
 800	 */
 801	if (!br_mrp_switchdev_send_in_test(br, mrp, in_test->interval,
 802					   in_test->max_miss, in_test->period))
 803		return 0;
 804
 805	mrp->in_test_interval = in_test->interval;
 806	mrp->in_test_end = jiffies + usecs_to_jiffies(in_test->period);
 807	mrp->in_test_max_miss = in_test->max_miss;
 808	mrp->in_test_count_miss = 0;
 809	queue_delayed_work(system_wq, &mrp->in_test_work,
 810			   usecs_to_jiffies(in_test->interval));
 811
 812	return 0;
 813}
 814
 815/* Determin if the frame type is a ring frame */
 816static bool br_mrp_ring_frame(struct sk_buff *skb)
 817{
 818	const struct br_mrp_tlv_hdr *hdr;
 819	struct br_mrp_tlv_hdr _hdr;
 820
 821	hdr = skb_header_pointer(skb, sizeof(uint16_t), sizeof(_hdr), &_hdr);
 822	if (!hdr)
 823		return false;
 824
 825	if (hdr->type == BR_MRP_TLV_HEADER_RING_TEST ||
 826	    hdr->type == BR_MRP_TLV_HEADER_RING_TOPO ||
 827	    hdr->type == BR_MRP_TLV_HEADER_RING_LINK_DOWN ||
 828	    hdr->type == BR_MRP_TLV_HEADER_RING_LINK_UP ||
 829	    hdr->type == BR_MRP_TLV_HEADER_OPTION)
 830		return true;
 831
 832	return false;
 833}
 834
 835/* Determin if the frame type is an interconnect frame */
 836static bool br_mrp_in_frame(struct sk_buff *skb)
 837{
 838	const struct br_mrp_tlv_hdr *hdr;
 839	struct br_mrp_tlv_hdr _hdr;
 840
 841	hdr = skb_header_pointer(skb, sizeof(uint16_t), sizeof(_hdr), &_hdr);
 842	if (!hdr)
 843		return false;
 844
 845	if (hdr->type == BR_MRP_TLV_HEADER_IN_TEST ||
 846	    hdr->type == BR_MRP_TLV_HEADER_IN_TOPO ||
 847	    hdr->type == BR_MRP_TLV_HEADER_IN_LINK_DOWN ||
 848	    hdr->type == BR_MRP_TLV_HEADER_IN_LINK_UP)
 849		return true;
 850
 851	return false;
 852}
 853
 854/* Process only MRP Test frame. All the other MRP frames are processed by
 855 * userspace application
 856 * note: already called with rcu_read_lock
 857 */
 858static void br_mrp_mrm_process(struct br_mrp *mrp, struct net_bridge_port *port,
 859			       struct sk_buff *skb)
 860{
 861	const struct br_mrp_tlv_hdr *hdr;
 862	struct br_mrp_tlv_hdr _hdr;
 863
 864	/* Each MRP header starts with a version field which is 16 bits.
 865	 * Therefore skip the version and get directly the TLV header.
 866	 */
 867	hdr = skb_header_pointer(skb, sizeof(uint16_t), sizeof(_hdr), &_hdr);
 868	if (!hdr)
 869		return;
 870
 871	if (hdr->type != BR_MRP_TLV_HEADER_RING_TEST)
 872		return;
 873
 874	mrp->test_count_miss = 0;
 875
 876	/* Notify the userspace that the ring is closed only when the ring is
 877	 * not closed
 878	 */
 879	if (mrp->ring_state != BR_MRP_RING_STATE_CLOSED)
 880		br_mrp_ring_port_open(port->dev, false);
 881}
 882
 883/* Determin if the test hdr has a better priority than the node */
 884static bool br_mrp_test_better_than_own(struct br_mrp *mrp,
 885					struct net_bridge *br,
 886					const struct br_mrp_ring_test_hdr *hdr)
 887{
 888	u16 prio = be16_to_cpu(hdr->prio);
 889
 890	if (prio < mrp->prio ||
 891	    (prio == mrp->prio &&
 892	    ether_addr_to_u64(hdr->sa) < ether_addr_to_u64(br->dev->dev_addr)))
 893		return true;
 894
 895	return false;
 896}
 897
 898/* Process only MRP Test frame. All the other MRP frames are processed by
 899 * userspace application
 900 * note: already called with rcu_read_lock
 901 */
 902static void br_mrp_mra_process(struct br_mrp *mrp, struct net_bridge *br,
 903			       struct net_bridge_port *port,
 904			       struct sk_buff *skb)
 905{
 906	const struct br_mrp_ring_test_hdr *test_hdr;
 907	struct br_mrp_ring_test_hdr _test_hdr;
 908	const struct br_mrp_tlv_hdr *hdr;
 909	struct br_mrp_tlv_hdr _hdr;
 910
 911	/* Each MRP header starts with a version field which is 16 bits.
 912	 * Therefore skip the version and get directly the TLV header.
 913	 */
 914	hdr = skb_header_pointer(skb, sizeof(uint16_t), sizeof(_hdr), &_hdr);
 915	if (!hdr)
 916		return;
 917
 918	if (hdr->type != BR_MRP_TLV_HEADER_RING_TEST)
 919		return;
 920
 921	test_hdr = skb_header_pointer(skb, sizeof(uint16_t) + sizeof(_hdr),
 922				      sizeof(_test_hdr), &_test_hdr);
 923	if (!test_hdr)
 924		return;
 925
 926	/* Only frames that have a better priority than the node will
 927	 * clear the miss counter because otherwise the node will need to behave
 928	 * as MRM.
 929	 */
 930	if (br_mrp_test_better_than_own(mrp, br, test_hdr))
 931		mrp->test_count_miss = 0;
 932}
 933
 934/* Process only MRP InTest frame. All the other MRP frames are processed by
 935 * userspace application
 936 * note: already called with rcu_read_lock
 937 */
 938static bool br_mrp_mim_process(struct br_mrp *mrp, struct net_bridge_port *port,
 939			       struct sk_buff *skb)
 940{
 941	const struct br_mrp_in_test_hdr *in_hdr;
 942	struct br_mrp_in_test_hdr _in_hdr;
 943	const struct br_mrp_tlv_hdr *hdr;
 944	struct br_mrp_tlv_hdr _hdr;
 945
 946	/* Each MRP header starts with a version field which is 16 bits.
 947	 * Therefore skip the version and get directly the TLV header.
 948	 */
 949	hdr = skb_header_pointer(skb, sizeof(uint16_t), sizeof(_hdr), &_hdr);
 950	if (!hdr)
 951		return false;
 952
 953	/* The check for InTest frame type was already done */
 954	in_hdr = skb_header_pointer(skb, sizeof(uint16_t) + sizeof(_hdr),
 955				    sizeof(_in_hdr), &_in_hdr);
 956	if (!in_hdr)
 957		return false;
 958
 959	/* It needs to process only it's own InTest frames. */
 960	if (mrp->in_id != ntohs(in_hdr->id))
 961		return false;
 962
 963	mrp->in_test_count_miss = 0;
 964
 965	/* Notify the userspace that the ring is closed only when the ring is
 966	 * not closed
 967	 */
 968	if (mrp->in_state != BR_MRP_IN_STATE_CLOSED)
 969		br_mrp_in_port_open(port->dev, false);
 970
 971	return true;
 972}
 973
 974/* Get the MRP frame type
 975 * note: already called with rcu_read_lock
 976 */
 977static u8 br_mrp_get_frame_type(struct sk_buff *skb)
 978{
 979	const struct br_mrp_tlv_hdr *hdr;
 980	struct br_mrp_tlv_hdr _hdr;
 981
 982	/* Each MRP header starts with a version field which is 16 bits.
 983	 * Therefore skip the version and get directly the TLV header.
 984	 */
 985	hdr = skb_header_pointer(skb, sizeof(uint16_t), sizeof(_hdr), &_hdr);
 986	if (!hdr)
 987		return 0xff;
 988
 989	return hdr->type;
 990}
 991
 992static bool br_mrp_mrm_behaviour(struct br_mrp *mrp)
 993{
 994	if (mrp->ring_role == BR_MRP_RING_ROLE_MRM ||
 995	    (mrp->ring_role == BR_MRP_RING_ROLE_MRA && !mrp->test_monitor))
 996		return true;
 997
 998	return false;
 999}
1000
1001static bool br_mrp_mrc_behaviour(struct br_mrp *mrp)
1002{
1003	if (mrp->ring_role == BR_MRP_RING_ROLE_MRC ||
1004	    (mrp->ring_role == BR_MRP_RING_ROLE_MRA && mrp->test_monitor))
1005		return true;
1006
1007	return false;
1008}
1009
1010/* This will just forward the frame to the other mrp ring ports, depending on
1011 * the frame type, ring role and interconnect role
1012 * note: already called with rcu_read_lock
1013 */
1014static int br_mrp_rcv(struct net_bridge_port *p,
1015		      struct sk_buff *skb, struct net_device *dev)
1016{
1017	struct net_bridge_port *p_port, *s_port, *i_port = NULL;
1018	struct net_bridge_port *p_dst, *s_dst, *i_dst = NULL;
1019	struct net_bridge *br;
1020	struct br_mrp *mrp;
1021
1022	/* If port is disabled don't accept any frames */
1023	if (p->state == BR_STATE_DISABLED)
1024		return 0;
1025
1026	br = p->br;
1027	mrp =  br_mrp_find_port(br, p);
1028	if (unlikely(!mrp))
1029		return 0;
1030
1031	p_port = rcu_dereference(mrp->p_port);
1032	if (!p_port)
1033		return 0;
1034	p_dst = p_port;
1035
1036	s_port = rcu_dereference(mrp->s_port);
1037	if (!s_port)
1038		return 0;
1039	s_dst = s_port;
1040
1041	/* If the frame is a ring frame then it is not required to check the
1042	 * interconnect role and ports to process or forward the frame
1043	 */
1044	if (br_mrp_ring_frame(skb)) {
1045		/* If the role is MRM then don't forward the frames */
1046		if (mrp->ring_role == BR_MRP_RING_ROLE_MRM) {
1047			br_mrp_mrm_process(mrp, p, skb);
1048			goto no_forward;
1049		}
1050
1051		/* If the role is MRA then don't forward the frames if it
1052		 * behaves as MRM node
1053		 */
1054		if (mrp->ring_role == BR_MRP_RING_ROLE_MRA) {
1055			if (!mrp->test_monitor) {
1056				br_mrp_mrm_process(mrp, p, skb);
1057				goto no_forward;
1058			}
1059
1060			br_mrp_mra_process(mrp, br, p, skb);
1061		}
1062
1063		goto forward;
1064	}
1065
1066	if (br_mrp_in_frame(skb)) {
1067		u8 in_type = br_mrp_get_frame_type(skb);
1068
1069		i_port = rcu_dereference(mrp->i_port);
1070		i_dst = i_port;
1071
1072		/* If the ring port is in block state it should not forward
1073		 * In_Test frames
1074		 */
1075		if (br_mrp_is_ring_port(p_port, s_port, p) &&
1076		    p->state == BR_STATE_BLOCKING &&
1077		    in_type == BR_MRP_TLV_HEADER_IN_TEST)
1078			goto no_forward;
1079
1080		/* Nodes that behaves as MRM needs to stop forwarding the
1081		 * frames in case the ring is closed, otherwise will be a loop.
1082		 * In this case the frame is no forward between the ring ports.
1083		 */
1084		if (br_mrp_mrm_behaviour(mrp) &&
1085		    br_mrp_is_ring_port(p_port, s_port, p) &&
1086		    (s_port->state != BR_STATE_FORWARDING ||
1087		     p_port->state != BR_STATE_FORWARDING)) {
1088			p_dst = NULL;
1089			s_dst = NULL;
1090		}
1091
1092		/* A node that behaves as MRC and doesn't have a interconnect
1093		 * role then it should forward all frames between the ring ports
1094		 * because it doesn't have an interconnect port
1095		 */
1096		if (br_mrp_mrc_behaviour(mrp) &&
1097		    mrp->in_role == BR_MRP_IN_ROLE_DISABLED)
1098			goto forward;
1099
1100		if (mrp->in_role == BR_MRP_IN_ROLE_MIM) {
1101			if (in_type == BR_MRP_TLV_HEADER_IN_TEST) {
1102				/* MIM should not forward it's own InTest
1103				 * frames
1104				 */
1105				if (br_mrp_mim_process(mrp, p, skb)) {
1106					goto no_forward;
1107				} else {
1108					if (br_mrp_is_ring_port(p_port, s_port,
1109								p))
1110						i_dst = NULL;
1111
1112					if (br_mrp_is_in_port(i_port, p))
1113						goto no_forward;
1114				}
1115			} else {
1116				/* MIM should forward IntLinkChange and
1117				 * IntTopoChange between ring ports but MIM
1118				 * should not forward IntLinkChange and
1119				 * IntTopoChange if the frame was received at
1120				 * the interconnect port
1121				 */
1122				if (br_mrp_is_ring_port(p_port, s_port, p))
1123					i_dst = NULL;
1124
1125				if (br_mrp_is_in_port(i_port, p))
1126					goto no_forward;
1127			}
1128		}
1129
1130		if (mrp->in_role == BR_MRP_IN_ROLE_MIC) {
1131			/* MIC should forward InTest frames on all ports
1132			 * regardless of the received port
1133			 */
1134			if (in_type == BR_MRP_TLV_HEADER_IN_TEST)
1135				goto forward;
1136
1137			/* MIC should forward IntLinkChange frames only if they
1138			 * are received on ring ports to all the ports
1139			 */
1140			if (br_mrp_is_ring_port(p_port, s_port, p) &&
1141			    (in_type == BR_MRP_TLV_HEADER_IN_LINK_UP ||
1142			     in_type == BR_MRP_TLV_HEADER_IN_LINK_DOWN))
1143				goto forward;
1144
1145			/* Should forward the InTopo frames only between the
1146			 * ring ports
1147			 */
1148			if (in_type == BR_MRP_TLV_HEADER_IN_TOPO) {
1149				i_dst = NULL;
1150				goto forward;
1151			}
1152
1153			/* In all the other cases don't forward the frames */
1154			goto no_forward;
1155		}
1156	}
1157
1158forward:
1159	if (p_dst)
1160		br_forward(p_dst, skb, true, false);
1161	if (s_dst)
1162		br_forward(s_dst, skb, true, false);
1163	if (i_dst)
1164		br_forward(i_dst, skb, true, false);
1165
1166no_forward:
1167	return 1;
1168}
1169
1170/* Check if the frame was received on a port that is part of MRP ring
1171 * and if the frame has MRP eth. In that case process the frame otherwise do
1172 * normal forwarding.
1173 * note: already called with rcu_read_lock
1174 */
1175int br_mrp_process(struct net_bridge_port *p, struct sk_buff *skb)
1176{
1177	/* If there is no MRP instance do normal forwarding */
1178	if (likely(!(p->flags & BR_MRP_AWARE)))
1179		goto out;
1180
1181	if (unlikely(skb->protocol == htons(ETH_P_MRP)))
1182		return br_mrp_rcv(p, skb, p->dev);
1183
1184out:
1185	return 0;
1186}
1187
1188bool br_mrp_enabled(struct net_bridge *br)
1189{
1190	return !list_empty(&br->mrp_list);
1191}