Lines Matching +full:p +full:- +full:state
1 // SPDX-License-Identifier: GPL-2.0-or-later
9 static int br_mrp_process(struct net_bridge_port *p, struct sk_buff *skb);
42 list_for_each_entry(port, &br->port_list, list) { in br_mrp_get_port()
43 if (port->dev->ifindex == ifindex) { in br_mrp_get_port()
57 hlist_for_each_entry_rcu(mrp, &br->mrp_list, list, in br_mrp_find_id()
59 if (mrp->ring_id == ring_id) { in br_mrp_find_id()
73 hlist_for_each_entry_rcu(mrp, &br->mrp_list, list, in br_mrp_find_in_id()
75 if (mrp->in_id == in_id) { in br_mrp_find_in_id()
88 hlist_for_each_entry_rcu(mrp, &br->mrp_list, list, in br_mrp_unique_ifindex()
90 struct net_bridge_port *p; in br_mrp_unique_ifindex() local
92 p = rtnl_dereference(mrp->p_port); in br_mrp_unique_ifindex()
93 if (p && p->dev->ifindex == ifindex) in br_mrp_unique_ifindex()
96 p = rtnl_dereference(mrp->s_port); in br_mrp_unique_ifindex()
97 if (p && p->dev->ifindex == ifindex) in br_mrp_unique_ifindex()
100 p = rtnl_dereference(mrp->i_port); in br_mrp_unique_ifindex()
101 if (p && p->dev->ifindex == ifindex) in br_mrp_unique_ifindex()
109 struct net_bridge_port *p) in br_mrp_find_port() argument
114 hlist_for_each_entry_rcu(mrp, &br->mrp_list, list, in br_mrp_find_port()
116 if (rcu_access_pointer(mrp->p_port) == p || in br_mrp_find_port()
117 rcu_access_pointer(mrp->s_port) == p || in br_mrp_find_port()
118 rcu_access_pointer(mrp->i_port) == p) { in br_mrp_find_port()
129 mrp->seq_id++; in br_mrp_next_seq()
130 return mrp->seq_id; in br_mrp_next_seq()
133 static struct sk_buff *br_mrp_skb_alloc(struct net_bridge_port *p, in br_mrp_skb_alloc() argument
144 skb->dev = p->dev; in br_mrp_skb_alloc()
145 skb->protocol = htons(ETH_P_MRP); in br_mrp_skb_alloc()
146 skb->priority = MRP_FRAME_PRIO; in br_mrp_skb_alloc()
150 ether_addr_copy(eth_hdr->h_dest, dst); in br_mrp_skb_alloc()
151 ether_addr_copy(eth_hdr->h_source, src); in br_mrp_skb_alloc()
152 eth_hdr->h_proto = htons(ETH_P_MRP); in br_mrp_skb_alloc()
167 hdr->type = type; in br_mrp_skb_tlv()
168 hdr->length = length; in br_mrp_skb_tlv()
178 hdr->seq_id = cpu_to_be16(br_mrp_next_seq(mrp)); in br_mrp_skb_common()
179 memset(hdr->domain, 0xff, MRP_DOMAIN_UUID_LENGTH); in br_mrp_skb_common()
183 struct net_bridge_port *p, in br_mrp_alloc_test_skb() argument
189 if (!p) in br_mrp_alloc_test_skb()
192 skb = br_mrp_skb_alloc(p, p->dev->dev_addr, mrp_test_dmac); in br_mrp_alloc_test_skb()
199 hdr->prio = cpu_to_be16(mrp->prio); in br_mrp_alloc_test_skb()
200 ether_addr_copy(hdr->sa, p->br->dev->dev_addr); in br_mrp_alloc_test_skb()
201 hdr->port_role = cpu_to_be16(port_role); in br_mrp_alloc_test_skb()
202 hdr->state = cpu_to_be16(mrp->ring_state); in br_mrp_alloc_test_skb()
203 hdr->transitions = cpu_to_be16(mrp->ring_transitions); in br_mrp_alloc_test_skb()
204 hdr->timestamp = cpu_to_be32(jiffies_to_msecs(jiffies)); in br_mrp_alloc_test_skb()
209 * an Option TLV which includes eventually a sub-option TLV that has in br_mrp_alloc_test_skb()
212 if (mrp->ring_role == BR_MRP_RING_ROLE_MRA) { in br_mrp_alloc_test_skb()
228 sub_tlv->type = BR_MRP_SUB_TLV_HEADER_TEST_AUTO_MGR; in br_mrp_alloc_test_skb()
240 struct net_bridge_port *p, in br_mrp_alloc_in_test_skb() argument
246 if (!p) in br_mrp_alloc_in_test_skb()
249 skb = br_mrp_skb_alloc(p, p->dev->dev_addr, mrp_in_test_dmac); in br_mrp_alloc_in_test_skb()
256 hdr->id = cpu_to_be16(mrp->in_id); in br_mrp_alloc_in_test_skb()
257 ether_addr_copy(hdr->sa, p->br->dev->dev_addr); in br_mrp_alloc_in_test_skb()
258 hdr->port_role = cpu_to_be16(port_role); in br_mrp_alloc_in_test_skb()
259 hdr->state = cpu_to_be16(mrp->in_state); in br_mrp_alloc_in_test_skb()
260 hdr->transitions = cpu_to_be16(mrp->in_transitions); in br_mrp_alloc_in_test_skb()
261 hdr->timestamp = cpu_to_be32(jiffies_to_msecs(jiffies)); in br_mrp_alloc_in_test_skb()
270 * - when node role is MRM, in this case test_monitor is always set to false
273 * - when node role is MRA, there are 2 subcases:
274 * - when MRA behaves as MRM, in this case is similar with MRM role
275 * - when MRA behaves as MRC, in this case test_monitor is set to true,
283 struct net_bridge_port *p; in br_mrp_test_work_expired() local
287 if (time_before_eq(mrp->test_end, jiffies)) in br_mrp_test_work_expired()
290 if (mrp->test_count_miss < mrp->test_max_miss) { in br_mrp_test_work_expired()
291 mrp->test_count_miss++; in br_mrp_test_work_expired()
293 /* Notify that the ring is open only if the ring state is in br_mrp_test_work_expired()
302 if (mrp->ring_state == BR_MRP_RING_STATE_CLOSED || in br_mrp_test_work_expired()
303 mrp->test_monitor) in br_mrp_test_work_expired()
309 p = rcu_dereference(mrp->p_port); in br_mrp_test_work_expired()
310 if (p) { in br_mrp_test_work_expired()
311 if (!mrp->test_monitor) { in br_mrp_test_work_expired()
312 skb = br_mrp_alloc_test_skb(mrp, p, in br_mrp_test_work_expired()
321 if (notify_open && !mrp->ring_role_offloaded) in br_mrp_test_work_expired()
322 br_mrp_ring_port_open(p->dev, true); in br_mrp_test_work_expired()
325 p = rcu_dereference(mrp->s_port); in br_mrp_test_work_expired()
326 if (p) { in br_mrp_test_work_expired()
327 if (!mrp->test_monitor) { in br_mrp_test_work_expired()
328 skb = br_mrp_alloc_test_skb(mrp, p, in br_mrp_test_work_expired()
337 if (notify_open && !mrp->ring_role_offloaded) in br_mrp_test_work_expired()
338 br_mrp_ring_port_open(p->dev, true); in br_mrp_test_work_expired()
344 queue_delayed_work(system_wq, &mrp->test_work, in br_mrp_test_work_expired()
345 usecs_to_jiffies(mrp->test_interval)); in br_mrp_test_work_expired()
356 struct net_bridge_port *p; in br_mrp_in_test_work_expired() local
360 if (time_before_eq(mrp->in_test_end, jiffies)) in br_mrp_in_test_work_expired()
363 if (mrp->in_test_count_miss < mrp->in_test_max_miss) { in br_mrp_in_test_work_expired()
364 mrp->in_test_count_miss++; in br_mrp_in_test_work_expired()
367 * interconnect ring state is closed, otherwise it would in br_mrp_in_test_work_expired()
370 if (mrp->in_state == BR_MRP_IN_STATE_CLOSED) in br_mrp_in_test_work_expired()
376 p = rcu_dereference(mrp->p_port); in br_mrp_in_test_work_expired()
377 if (p) { in br_mrp_in_test_work_expired()
378 skb = br_mrp_alloc_in_test_skb(mrp, p, in br_mrp_in_test_work_expired()
386 if (notify_open && !mrp->in_role_offloaded) in br_mrp_in_test_work_expired()
387 br_mrp_in_port_open(p->dev, true); in br_mrp_in_test_work_expired()
390 p = rcu_dereference(mrp->s_port); in br_mrp_in_test_work_expired()
391 if (p) { in br_mrp_in_test_work_expired()
392 skb = br_mrp_alloc_in_test_skb(mrp, p, in br_mrp_in_test_work_expired()
400 if (notify_open && !mrp->in_role_offloaded) in br_mrp_in_test_work_expired()
401 br_mrp_in_port_open(p->dev, true); in br_mrp_in_test_work_expired()
404 p = rcu_dereference(mrp->i_port); in br_mrp_in_test_work_expired()
405 if (p) { in br_mrp_in_test_work_expired()
406 skb = br_mrp_alloc_in_test_skb(mrp, p, in br_mrp_in_test_work_expired()
414 if (notify_open && !mrp->in_role_offloaded) in br_mrp_in_test_work_expired()
415 br_mrp_in_port_open(p->dev, true); in br_mrp_in_test_work_expired()
421 queue_delayed_work(system_wq, &mrp->in_test_work, in br_mrp_in_test_work_expired()
422 usecs_to_jiffies(mrp->in_test_interval)); in br_mrp_in_test_work_expired()
430 struct net_bridge_port *p; in br_mrp_del_impl() local
431 u8 state; in br_mrp_del_impl() local
434 cancel_delayed_work_sync(&mrp->test_work); in br_mrp_del_impl()
438 cancel_delayed_work_sync(&mrp->in_test_work); in br_mrp_del_impl()
443 p = rtnl_dereference(mrp->i_port); in br_mrp_del_impl()
444 if (p) in br_mrp_del_impl()
445 br_mrp_switchdev_set_in_role(br, mrp, mrp->in_id, mrp->ring_id, in br_mrp_del_impl()
451 p = rtnl_dereference(mrp->p_port); in br_mrp_del_impl()
452 if (p) { in br_mrp_del_impl()
453 spin_lock_bh(&br->lock); in br_mrp_del_impl()
454 state = netif_running(br->dev) ? in br_mrp_del_impl()
456 p->state = state; in br_mrp_del_impl()
457 p->flags &= ~BR_MRP_AWARE; in br_mrp_del_impl()
458 spin_unlock_bh(&br->lock); in br_mrp_del_impl()
459 br_mrp_port_switchdev_set_state(p, state); in br_mrp_del_impl()
460 rcu_assign_pointer(mrp->p_port, NULL); in br_mrp_del_impl()
463 p = rtnl_dereference(mrp->s_port); in br_mrp_del_impl()
464 if (p) { in br_mrp_del_impl()
465 spin_lock_bh(&br->lock); in br_mrp_del_impl()
466 state = netif_running(br->dev) ? in br_mrp_del_impl()
468 p->state = state; in br_mrp_del_impl()
469 p->flags &= ~BR_MRP_AWARE; in br_mrp_del_impl()
470 spin_unlock_bh(&br->lock); in br_mrp_del_impl()
471 br_mrp_port_switchdev_set_state(p, state); in br_mrp_del_impl()
472 rcu_assign_pointer(mrp->s_port, NULL); in br_mrp_del_impl()
475 p = rtnl_dereference(mrp->i_port); in br_mrp_del_impl()
476 if (p) { in br_mrp_del_impl()
477 spin_lock_bh(&br->lock); in br_mrp_del_impl()
478 state = netif_running(br->dev) ? in br_mrp_del_impl()
480 p->state = state; in br_mrp_del_impl()
481 p->flags &= ~BR_MRP_AWARE; in br_mrp_del_impl()
482 spin_unlock_bh(&br->lock); in br_mrp_del_impl()
483 br_mrp_port_switchdev_set_state(p, state); in br_mrp_del_impl()
484 rcu_assign_pointer(mrp->i_port, NULL); in br_mrp_del_impl()
487 hlist_del_rcu(&mrp->list); in br_mrp_del_impl()
490 if (hlist_empty(&br->mrp_list)) in br_mrp_del_impl()
499 struct net_bridge_port *p; in br_mrp_add() local
506 mrp = br_mrp_find_id(br, instance->ring_id); in br_mrp_add()
508 return -EINVAL; in br_mrp_add()
510 if (!br_mrp_get_port(br, instance->p_ifindex) || in br_mrp_add()
511 !br_mrp_get_port(br, instance->s_ifindex)) in br_mrp_add()
512 return -EINVAL; in br_mrp_add()
515 if (!br_mrp_unique_ifindex(br, instance->p_ifindex) || in br_mrp_add()
516 !br_mrp_unique_ifindex(br, instance->s_ifindex)) in br_mrp_add()
517 return -EINVAL; in br_mrp_add()
521 return -ENOMEM; in br_mrp_add()
523 mrp->ring_id = instance->ring_id; in br_mrp_add()
524 mrp->prio = instance->prio; in br_mrp_add()
526 p = br_mrp_get_port(br, instance->p_ifindex); in br_mrp_add()
527 spin_lock_bh(&br->lock); in br_mrp_add()
528 p->state = BR_STATE_FORWARDING; in br_mrp_add()
529 p->flags |= BR_MRP_AWARE; in br_mrp_add()
530 spin_unlock_bh(&br->lock); in br_mrp_add()
531 rcu_assign_pointer(mrp->p_port, p); in br_mrp_add()
533 p = br_mrp_get_port(br, instance->s_ifindex); in br_mrp_add()
534 spin_lock_bh(&br->lock); in br_mrp_add()
535 p->state = BR_STATE_FORWARDING; in br_mrp_add()
536 p->flags |= BR_MRP_AWARE; in br_mrp_add()
537 spin_unlock_bh(&br->lock); in br_mrp_add()
538 rcu_assign_pointer(mrp->s_port, p); in br_mrp_add()
540 if (hlist_empty(&br->mrp_list)) in br_mrp_add()
543 INIT_DELAYED_WORK(&mrp->test_work, br_mrp_test_work_expired); in br_mrp_add()
544 INIT_DELAYED_WORK(&mrp->in_test_work, br_mrp_in_test_work_expired); in br_mrp_add()
545 hlist_add_tail_rcu(&mrp->list, &br->mrp_list); in br_mrp_add()
562 void br_mrp_port_del(struct net_bridge *br, struct net_bridge_port *p) in br_mrp_port_del() argument
564 struct br_mrp *mrp = br_mrp_find_port(br, p); in br_mrp_port_del()
578 struct br_mrp *mrp = br_mrp_find_id(br, instance->ring_id); in br_mrp_del()
581 return -EINVAL; in br_mrp_del()
588 /* Set port state, port state can be forwarding, blocked or disabled
591 int br_mrp_set_port_state(struct net_bridge_port *p, in br_mrp_set_port_state() argument
592 enum br_mrp_port_state_type state) in br_mrp_set_port_state() argument
596 if (!p || !(p->flags & BR_MRP_AWARE)) in br_mrp_set_port_state()
597 return -EINVAL; in br_mrp_set_port_state()
599 spin_lock_bh(&p->br->lock); in br_mrp_set_port_state()
601 if (state == BR_MRP_PORT_STATE_FORWARDING) in br_mrp_set_port_state()
606 p->state = port_state; in br_mrp_set_port_state()
607 spin_unlock_bh(&p->br->lock); in br_mrp_set_port_state()
609 br_mrp_port_switchdev_set_state(p, port_state); in br_mrp_set_port_state()
617 int br_mrp_set_port_role(struct net_bridge_port *p, in br_mrp_set_port_role() argument
622 if (!p || !(p->flags & BR_MRP_AWARE)) in br_mrp_set_port_role()
623 return -EINVAL; in br_mrp_set_port_role()
625 mrp = br_mrp_find_port(p->br, p); in br_mrp_set_port_role()
628 return -EINVAL; in br_mrp_set_port_role()
632 rcu_assign_pointer(mrp->p_port, p); in br_mrp_set_port_role()
635 rcu_assign_pointer(mrp->s_port, p); in br_mrp_set_port_role()
638 return -EINVAL; in br_mrp_set_port_role()
641 br_mrp_port_switchdev_set_role(p, role); in br_mrp_set_port_role()
646 /* Set ring state, ring state can be only Open or Closed
650 struct br_mrp_ring_state *state) in br_mrp_set_ring_state() argument
652 struct br_mrp *mrp = br_mrp_find_id(br, state->ring_id); in br_mrp_set_ring_state()
655 return -EINVAL; in br_mrp_set_ring_state()
657 if (mrp->ring_state != state->ring_state) in br_mrp_set_ring_state()
658 mrp->ring_transitions++; in br_mrp_set_ring_state()
660 mrp->ring_state = state->ring_state; in br_mrp_set_ring_state()
662 br_mrp_switchdev_set_ring_state(br, mrp, state->ring_state); in br_mrp_set_ring_state()
674 struct br_mrp *mrp = br_mrp_find_id(br, role->ring_id); in br_mrp_set_ring_role()
678 return -EINVAL; in br_mrp_set_ring_role()
680 mrp->ring_role = role->ring_role; in br_mrp_set_ring_role()
683 support = br_mrp_switchdev_set_ring_role(br, mrp, role->ring_role); in br_mrp_set_ring_role()
685 return -EOPNOTSUPP; in br_mrp_set_ring_role()
693 mrp->ring_role_offloaded = support == BR_MRP_SW ? 0 : 1; in br_mrp_set_ring_role()
705 struct br_mrp *mrp = br_mrp_find_id(br, test->ring_id); in br_mrp_start_test()
709 return -EINVAL; in br_mrp_start_test()
714 support = br_mrp_switchdev_send_ring_test(br, mrp, test->interval, in br_mrp_start_test()
715 test->max_miss, test->period, in br_mrp_start_test()
716 test->monitor); in br_mrp_start_test()
718 return -EOPNOTSUPP; in br_mrp_start_test()
723 mrp->test_interval = test->interval; in br_mrp_start_test()
724 mrp->test_end = jiffies + usecs_to_jiffies(test->period); in br_mrp_start_test()
725 mrp->test_max_miss = test->max_miss; in br_mrp_start_test()
726 mrp->test_monitor = test->monitor; in br_mrp_start_test()
727 mrp->test_count_miss = 0; in br_mrp_start_test()
728 queue_delayed_work(system_wq, &mrp->test_work, in br_mrp_start_test()
729 usecs_to_jiffies(test->interval)); in br_mrp_start_test()
734 /* Set in state, int state can be only Open or Closed
737 int br_mrp_set_in_state(struct net_bridge *br, struct br_mrp_in_state *state) in br_mrp_set_in_state() argument
739 struct br_mrp *mrp = br_mrp_find_in_id(br, state->in_id); in br_mrp_set_in_state()
742 return -EINVAL; in br_mrp_set_in_state()
744 if (mrp->in_state != state->in_state) in br_mrp_set_in_state()
745 mrp->in_transitions++; in br_mrp_set_in_state()
747 mrp->in_state = state->in_state; in br_mrp_set_in_state()
749 br_mrp_switchdev_set_in_state(br, mrp, state->in_state); in br_mrp_set_in_state()
760 struct br_mrp *mrp = br_mrp_find_id(br, role->ring_id); in br_mrp_set_in_role()
762 struct net_bridge_port *p; in br_mrp_set_in_role() local
765 return -EINVAL; in br_mrp_set_in_role()
767 if (!br_mrp_get_port(br, role->i_ifindex)) in br_mrp_set_in_role()
768 return -EINVAL; in br_mrp_set_in_role()
770 if (role->in_role == BR_MRP_IN_ROLE_DISABLED) { in br_mrp_set_in_role()
771 u8 state; in br_mrp_set_in_role() local
774 p = rtnl_dereference(mrp->i_port); in br_mrp_set_in_role()
775 if (!p) in br_mrp_set_in_role()
776 return -EINVAL; in br_mrp_set_in_role()
779 cancel_delayed_work_sync(&mrp->in_test_work); in br_mrp_set_in_role()
783 spin_lock_bh(&br->lock); in br_mrp_set_in_role()
784 state = netif_running(br->dev) ? in br_mrp_set_in_role()
786 p->state = state; in br_mrp_set_in_role()
787 p->flags &= ~BR_MRP_AWARE; in br_mrp_set_in_role()
788 spin_unlock_bh(&br->lock); in br_mrp_set_in_role()
789 br_mrp_port_switchdev_set_state(p, state); in br_mrp_set_in_role()
790 rcu_assign_pointer(mrp->i_port, NULL); in br_mrp_set_in_role()
792 mrp->in_role = role->in_role; in br_mrp_set_in_role()
793 mrp->in_id = 0; in br_mrp_set_in_role()
799 if (!br_mrp_unique_ifindex(br, role->i_ifindex)) in br_mrp_set_in_role()
800 return -EINVAL; in br_mrp_set_in_role()
806 if (rcu_access_pointer(mrp->i_port)) in br_mrp_set_in_role()
807 return -EINVAL; in br_mrp_set_in_role()
809 p = br_mrp_get_port(br, role->i_ifindex); in br_mrp_set_in_role()
810 spin_lock_bh(&br->lock); in br_mrp_set_in_role()
811 p->state = BR_STATE_FORWARDING; in br_mrp_set_in_role()
812 p->flags |= BR_MRP_AWARE; in br_mrp_set_in_role()
813 spin_unlock_bh(&br->lock); in br_mrp_set_in_role()
814 rcu_assign_pointer(mrp->i_port, p); in br_mrp_set_in_role()
816 mrp->in_role = role->in_role; in br_mrp_set_in_role()
817 mrp->in_id = role->in_id; in br_mrp_set_in_role()
820 support = br_mrp_switchdev_set_in_role(br, mrp, role->in_id, in br_mrp_set_in_role()
821 role->ring_id, role->in_role); in br_mrp_set_in_role()
823 return -EOPNOTSUPP; in br_mrp_set_in_role()
831 mrp->in_role_offloaded = support == BR_MRP_SW ? 0 : 1; in br_mrp_set_in_role()
843 struct br_mrp *mrp = br_mrp_find_in_id(br, in_test->in_id); in br_mrp_start_in_test()
847 return -EINVAL; in br_mrp_start_in_test()
849 if (mrp->in_role != BR_MRP_IN_ROLE_MIM) in br_mrp_start_in_test()
850 return -EINVAL; in br_mrp_start_in_test()
855 support = br_mrp_switchdev_send_in_test(br, mrp, in_test->interval, in br_mrp_start_in_test()
856 in_test->max_miss, in br_mrp_start_in_test()
857 in_test->period); in br_mrp_start_in_test()
859 return -EOPNOTSUPP; in br_mrp_start_in_test()
864 mrp->in_test_interval = in_test->interval; in br_mrp_start_in_test()
865 mrp->in_test_end = jiffies + usecs_to_jiffies(in_test->period); in br_mrp_start_in_test()
866 mrp->in_test_max_miss = in_test->max_miss; in br_mrp_start_in_test()
867 mrp->in_test_count_miss = 0; in br_mrp_start_in_test()
868 queue_delayed_work(system_wq, &mrp->in_test_work, in br_mrp_start_in_test()
869 usecs_to_jiffies(in_test->interval)); in br_mrp_start_in_test()
884 if (hdr->type == BR_MRP_TLV_HEADER_RING_TEST || in br_mrp_ring_frame()
885 hdr->type == BR_MRP_TLV_HEADER_RING_TOPO || in br_mrp_ring_frame()
886 hdr->type == BR_MRP_TLV_HEADER_RING_LINK_DOWN || in br_mrp_ring_frame()
887 hdr->type == BR_MRP_TLV_HEADER_RING_LINK_UP || in br_mrp_ring_frame()
888 hdr->type == BR_MRP_TLV_HEADER_OPTION) in br_mrp_ring_frame()
904 if (hdr->type == BR_MRP_TLV_HEADER_IN_TEST || in br_mrp_in_frame()
905 hdr->type == BR_MRP_TLV_HEADER_IN_TOPO || in br_mrp_in_frame()
906 hdr->type == BR_MRP_TLV_HEADER_IN_LINK_DOWN || in br_mrp_in_frame()
907 hdr->type == BR_MRP_TLV_HEADER_IN_LINK_UP || in br_mrp_in_frame()
908 hdr->type == BR_MRP_TLV_HEADER_IN_LINK_STATUS) in br_mrp_in_frame()
931 if (hdr->type != BR_MRP_TLV_HEADER_RING_TEST) in br_mrp_mrm_process()
934 mrp->test_count_miss = 0; in br_mrp_mrm_process()
939 if (mrp->ring_state != BR_MRP_RING_STATE_CLOSED) in br_mrp_mrm_process()
940 br_mrp_ring_port_open(port->dev, false); in br_mrp_mrm_process()
948 u16 prio = be16_to_cpu(hdr->prio); in br_mrp_test_better_than_own()
950 if (prio < mrp->prio || in br_mrp_test_better_than_own()
951 (prio == mrp->prio && in br_mrp_test_better_than_own()
952 ether_addr_to_u64(hdr->sa) < ether_addr_to_u64(br->dev->dev_addr))) in br_mrp_test_better_than_own()
978 if (hdr->type != BR_MRP_TLV_HEADER_RING_TEST) in br_mrp_mra_process()
991 mrp->test_count_miss = 0; in br_mrp_mra_process()
1020 if (mrp->in_id != ntohs(in_hdr->id)) in br_mrp_mim_process()
1023 mrp->in_test_count_miss = 0; in br_mrp_mim_process()
1028 if (mrp->in_state != BR_MRP_IN_STATE_CLOSED) in br_mrp_mim_process()
1029 br_mrp_in_port_open(port->dev, false); in br_mrp_mim_process()
1049 return hdr->type; in br_mrp_get_frame_type()
1054 if (mrp->ring_role == BR_MRP_RING_ROLE_MRM || in br_mrp_mrm_behaviour()
1055 (mrp->ring_role == BR_MRP_RING_ROLE_MRA && !mrp->test_monitor)) in br_mrp_mrm_behaviour()
1063 if (mrp->ring_role == BR_MRP_RING_ROLE_MRC || in br_mrp_mrc_behaviour()
1064 (mrp->ring_role == BR_MRP_RING_ROLE_MRA && mrp->test_monitor)) in br_mrp_mrc_behaviour()
1074 static int br_mrp_rcv(struct net_bridge_port *p, in br_mrp_rcv() argument
1083 if (p->state == BR_STATE_DISABLED) in br_mrp_rcv()
1086 br = p->br; in br_mrp_rcv()
1087 mrp = br_mrp_find_port(br, p); in br_mrp_rcv()
1091 p_port = rcu_dereference(mrp->p_port); in br_mrp_rcv()
1096 s_port = rcu_dereference(mrp->s_port); in br_mrp_rcv()
1106 if (mrp->ring_role == BR_MRP_RING_ROLE_MRM) { in br_mrp_rcv()
1107 br_mrp_mrm_process(mrp, p, skb); in br_mrp_rcv()
1114 if (mrp->ring_role == BR_MRP_RING_ROLE_MRA) { in br_mrp_rcv()
1115 if (!mrp->test_monitor) { in br_mrp_rcv()
1116 br_mrp_mrm_process(mrp, p, skb); in br_mrp_rcv()
1120 br_mrp_mra_process(mrp, br, p, skb); in br_mrp_rcv()
1129 i_port = rcu_dereference(mrp->i_port); in br_mrp_rcv()
1132 /* If the ring port is in block state it should not forward in br_mrp_rcv()
1135 if (br_mrp_is_ring_port(p_port, s_port, p) && in br_mrp_rcv()
1136 p->state == BR_STATE_BLOCKING && in br_mrp_rcv()
1145 br_mrp_is_ring_port(p_port, s_port, p) && in br_mrp_rcv()
1146 (s_port->state != BR_STATE_FORWARDING || in br_mrp_rcv()
1147 p_port->state != BR_STATE_FORWARDING)) { in br_mrp_rcv()
1157 mrp->in_role == BR_MRP_IN_ROLE_DISABLED) in br_mrp_rcv()
1160 if (mrp->in_role == BR_MRP_IN_ROLE_MIM) { in br_mrp_rcv()
1165 if (br_mrp_mim_process(mrp, p, skb)) { in br_mrp_rcv()
1169 p)) in br_mrp_rcv()
1172 if (br_mrp_is_in_port(i_port, p)) in br_mrp_rcv()
1182 if (br_mrp_is_ring_port(p_port, s_port, p)) in br_mrp_rcv()
1185 if (br_mrp_is_in_port(i_port, p)) in br_mrp_rcv()
1190 if (mrp->in_role == BR_MRP_IN_ROLE_MIC) { in br_mrp_rcv()
1200 if (br_mrp_is_ring_port(p_port, s_port, p) && in br_mrp_rcv()
1210 if (br_mrp_is_ring_port(p_port, s_port, p) && in br_mrp_rcv()
1246 static int br_mrp_process(struct net_bridge_port *p, struct sk_buff *skb) in br_mrp_process() argument
1249 if (likely(!(p->flags & BR_MRP_AWARE))) in br_mrp_process()
1252 return br_mrp_rcv(p, skb, p->dev); in br_mrp_process()
1259 return !hlist_empty(&br->mrp_list); in br_mrp_enabled()