• Home
  • Raw
  • Download

Lines Matching +full:p +full:- +full:state

1 // SPDX-License-Identifier: GPL-2.0-or-later
35 list_for_each_entry(port, &br->port_list, list) { in br_mrp_get_port()
36 if (port->dev->ifindex == ifindex) { in br_mrp_get_port()
50 list_for_each_entry_rcu(mrp, &br->mrp_list, list, in br_mrp_find_id()
52 if (mrp->ring_id == ring_id) { in br_mrp_find_id()
66 list_for_each_entry_rcu(mrp, &br->mrp_list, list, in br_mrp_find_in_id()
68 if (mrp->in_id == in_id) { in br_mrp_find_in_id()
81 list_for_each_entry_rcu(mrp, &br->mrp_list, list, in br_mrp_unique_ifindex()
83 struct net_bridge_port *p; in br_mrp_unique_ifindex() local
85 p = rtnl_dereference(mrp->p_port); in br_mrp_unique_ifindex()
86 if (p && p->dev->ifindex == ifindex) in br_mrp_unique_ifindex()
89 p = rtnl_dereference(mrp->s_port); in br_mrp_unique_ifindex()
90 if (p && p->dev->ifindex == ifindex) in br_mrp_unique_ifindex()
93 p = rtnl_dereference(mrp->i_port); in br_mrp_unique_ifindex()
94 if (p && p->dev->ifindex == ifindex) in br_mrp_unique_ifindex()
102 struct net_bridge_port *p) in br_mrp_find_port() argument
107 list_for_each_entry_rcu(mrp, &br->mrp_list, list, in br_mrp_find_port()
109 if (rcu_access_pointer(mrp->p_port) == p || in br_mrp_find_port()
110 rcu_access_pointer(mrp->s_port) == p || in br_mrp_find_port()
111 rcu_access_pointer(mrp->i_port) == p) { in br_mrp_find_port()
122 mrp->seq_id++; in br_mrp_next_seq()
123 return mrp->seq_id; in br_mrp_next_seq()
126 static struct sk_buff *br_mrp_skb_alloc(struct net_bridge_port *p, in br_mrp_skb_alloc() argument
137 skb->dev = p->dev; in br_mrp_skb_alloc()
138 skb->protocol = htons(ETH_P_MRP); in br_mrp_skb_alloc()
139 skb->priority = MRP_FRAME_PRIO; in br_mrp_skb_alloc()
143 ether_addr_copy(eth_hdr->h_dest, dst); in br_mrp_skb_alloc()
144 ether_addr_copy(eth_hdr->h_source, src); in br_mrp_skb_alloc()
145 eth_hdr->h_proto = htons(ETH_P_MRP); in br_mrp_skb_alloc()
160 hdr->type = type; in br_mrp_skb_tlv()
161 hdr->length = length; in br_mrp_skb_tlv()
171 hdr->seq_id = cpu_to_be16(br_mrp_next_seq(mrp)); in br_mrp_skb_common()
172 memset(hdr->domain, 0xff, MRP_DOMAIN_UUID_LENGTH); in br_mrp_skb_common()
176 struct net_bridge_port *p, in br_mrp_alloc_test_skb() argument
182 if (!p) in br_mrp_alloc_test_skb()
185 skb = br_mrp_skb_alloc(p, p->dev->dev_addr, mrp_test_dmac); in br_mrp_alloc_test_skb()
192 hdr->prio = cpu_to_be16(mrp->prio); in br_mrp_alloc_test_skb()
193 ether_addr_copy(hdr->sa, p->br->dev->dev_addr); in br_mrp_alloc_test_skb()
194 hdr->port_role = cpu_to_be16(port_role); in br_mrp_alloc_test_skb()
195 hdr->state = cpu_to_be16(mrp->ring_state); in br_mrp_alloc_test_skb()
196 hdr->transitions = cpu_to_be16(mrp->ring_transitions); in br_mrp_alloc_test_skb()
197 hdr->timestamp = cpu_to_be32(jiffies_to_msecs(jiffies)); in br_mrp_alloc_test_skb()
206 struct net_bridge_port *p, in br_mrp_alloc_in_test_skb() argument
212 if (!p) in br_mrp_alloc_in_test_skb()
215 skb = br_mrp_skb_alloc(p, p->dev->dev_addr, mrp_in_test_dmac); in br_mrp_alloc_in_test_skb()
222 hdr->id = cpu_to_be16(mrp->in_id); in br_mrp_alloc_in_test_skb()
223 ether_addr_copy(hdr->sa, p->br->dev->dev_addr); in br_mrp_alloc_in_test_skb()
224 hdr->port_role = cpu_to_be16(port_role); in br_mrp_alloc_in_test_skb()
225 hdr->state = cpu_to_be16(mrp->in_state); in br_mrp_alloc_in_test_skb()
226 hdr->transitions = cpu_to_be16(mrp->in_transitions); in br_mrp_alloc_in_test_skb()
227 hdr->timestamp = cpu_to_be32(jiffies_to_msecs(jiffies)); in br_mrp_alloc_in_test_skb()
236 * - when node role is MRM, in this case test_monitor is always set to false
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,
249 struct net_bridge_port *p; in br_mrp_test_work_expired() local
253 if (time_before_eq(mrp->test_end, jiffies)) in br_mrp_test_work_expired()
256 if (mrp->test_count_miss < mrp->test_max_miss) { in br_mrp_test_work_expired()
257 mrp->test_count_miss++; in br_mrp_test_work_expired()
259 /* Notify that the ring is open only if the ring state is in br_mrp_test_work_expired()
268 if (mrp->ring_state == BR_MRP_RING_STATE_CLOSED || in br_mrp_test_work_expired()
269 mrp->test_monitor) in br_mrp_test_work_expired()
275 p = rcu_dereference(mrp->p_port); in br_mrp_test_work_expired()
276 if (p) { in br_mrp_test_work_expired()
277 if (!mrp->test_monitor) { in br_mrp_test_work_expired()
278 skb = br_mrp_alloc_test_skb(mrp, p, in br_mrp_test_work_expired()
287 if (notify_open && !mrp->ring_role_offloaded) in br_mrp_test_work_expired()
288 br_mrp_ring_port_open(p->dev, true); in br_mrp_test_work_expired()
291 p = rcu_dereference(mrp->s_port); in br_mrp_test_work_expired()
292 if (p) { in br_mrp_test_work_expired()
293 if (!mrp->test_monitor) { in br_mrp_test_work_expired()
294 skb = br_mrp_alloc_test_skb(mrp, p, in br_mrp_test_work_expired()
303 if (notify_open && !mrp->ring_role_offloaded) in br_mrp_test_work_expired()
304 br_mrp_ring_port_open(p->dev, true); in br_mrp_test_work_expired()
310 queue_delayed_work(system_wq, &mrp->test_work, in br_mrp_test_work_expired()
311 usecs_to_jiffies(mrp->test_interval)); in br_mrp_test_work_expired()
322 struct net_bridge_port *p; in br_mrp_in_test_work_expired() local
326 if (time_before_eq(mrp->in_test_end, jiffies)) in br_mrp_in_test_work_expired()
329 if (mrp->in_test_count_miss < mrp->in_test_max_miss) { in br_mrp_in_test_work_expired()
330 mrp->in_test_count_miss++; in br_mrp_in_test_work_expired()
333 * interconnect ring state is closed, otherwise it would in br_mrp_in_test_work_expired()
336 if (mrp->in_state == BR_MRP_IN_STATE_CLOSED) in br_mrp_in_test_work_expired()
342 p = rcu_dereference(mrp->p_port); in br_mrp_in_test_work_expired()
343 if (p) { in br_mrp_in_test_work_expired()
344 skb = br_mrp_alloc_in_test_skb(mrp, p, in br_mrp_in_test_work_expired()
352 if (notify_open && !mrp->in_role_offloaded) in br_mrp_in_test_work_expired()
353 br_mrp_in_port_open(p->dev, true); in br_mrp_in_test_work_expired()
356 p = rcu_dereference(mrp->s_port); in br_mrp_in_test_work_expired()
357 if (p) { in br_mrp_in_test_work_expired()
358 skb = br_mrp_alloc_in_test_skb(mrp, p, in br_mrp_in_test_work_expired()
366 if (notify_open && !mrp->in_role_offloaded) in br_mrp_in_test_work_expired()
367 br_mrp_in_port_open(p->dev, true); in br_mrp_in_test_work_expired()
370 p = rcu_dereference(mrp->i_port); in br_mrp_in_test_work_expired()
371 if (p) { in br_mrp_in_test_work_expired()
372 skb = br_mrp_alloc_in_test_skb(mrp, p, in br_mrp_in_test_work_expired()
380 if (notify_open && !mrp->in_role_offloaded) in br_mrp_in_test_work_expired()
381 br_mrp_in_port_open(p->dev, true); in br_mrp_in_test_work_expired()
387 queue_delayed_work(system_wq, &mrp->in_test_work, in br_mrp_in_test_work_expired()
388 usecs_to_jiffies(mrp->in_test_interval)); in br_mrp_in_test_work_expired()
396 struct net_bridge_port *p; in br_mrp_del_impl() local
397 u8 state; in br_mrp_del_impl() local
400 cancel_delayed_work_sync(&mrp->test_work); in br_mrp_del_impl()
404 cancel_delayed_work_sync(&mrp->in_test_work); in br_mrp_del_impl()
410 p = rtnl_dereference(mrp->p_port); in br_mrp_del_impl()
411 if (p) { in br_mrp_del_impl()
412 spin_lock_bh(&br->lock); in br_mrp_del_impl()
413 state = netif_running(br->dev) ? in br_mrp_del_impl()
415 p->state = state; in br_mrp_del_impl()
416 p->flags &= ~BR_MRP_AWARE; in br_mrp_del_impl()
417 spin_unlock_bh(&br->lock); in br_mrp_del_impl()
418 br_mrp_port_switchdev_set_state(p, state); in br_mrp_del_impl()
419 rcu_assign_pointer(mrp->p_port, NULL); in br_mrp_del_impl()
422 p = rtnl_dereference(mrp->s_port); in br_mrp_del_impl()
423 if (p) { in br_mrp_del_impl()
424 spin_lock_bh(&br->lock); in br_mrp_del_impl()
425 state = netif_running(br->dev) ? in br_mrp_del_impl()
427 p->state = state; in br_mrp_del_impl()
428 p->flags &= ~BR_MRP_AWARE; in br_mrp_del_impl()
429 spin_unlock_bh(&br->lock); in br_mrp_del_impl()
430 br_mrp_port_switchdev_set_state(p, state); in br_mrp_del_impl()
431 rcu_assign_pointer(mrp->s_port, NULL); in br_mrp_del_impl()
434 p = rtnl_dereference(mrp->i_port); in br_mrp_del_impl()
435 if (p) { in br_mrp_del_impl()
436 spin_lock_bh(&br->lock); in br_mrp_del_impl()
437 state = netif_running(br->dev) ? in br_mrp_del_impl()
439 p->state = state; in br_mrp_del_impl()
440 p->flags &= ~BR_MRP_AWARE; in br_mrp_del_impl()
441 spin_unlock_bh(&br->lock); in br_mrp_del_impl()
442 br_mrp_port_switchdev_set_state(p, state); in br_mrp_del_impl()
443 rcu_assign_pointer(mrp->i_port, NULL); in br_mrp_del_impl()
446 list_del_rcu(&mrp->list); in br_mrp_del_impl()
455 struct net_bridge_port *p; in br_mrp_add() local
462 mrp = br_mrp_find_id(br, instance->ring_id); in br_mrp_add()
464 return -EINVAL; in br_mrp_add()
466 if (!br_mrp_get_port(br, instance->p_ifindex) || in br_mrp_add()
467 !br_mrp_get_port(br, instance->s_ifindex)) in br_mrp_add()
468 return -EINVAL; in br_mrp_add()
471 if (!br_mrp_unique_ifindex(br, instance->p_ifindex) || in br_mrp_add()
472 !br_mrp_unique_ifindex(br, instance->s_ifindex)) in br_mrp_add()
473 return -EINVAL; in br_mrp_add()
477 return -ENOMEM; in br_mrp_add()
479 mrp->ring_id = instance->ring_id; in br_mrp_add()
480 mrp->prio = instance->prio; in br_mrp_add()
482 p = br_mrp_get_port(br, instance->p_ifindex); in br_mrp_add()
483 spin_lock_bh(&br->lock); in br_mrp_add()
484 p->state = BR_STATE_FORWARDING; in br_mrp_add()
485 p->flags |= BR_MRP_AWARE; in br_mrp_add()
486 spin_unlock_bh(&br->lock); in br_mrp_add()
487 rcu_assign_pointer(mrp->p_port, p); in br_mrp_add()
489 p = br_mrp_get_port(br, instance->s_ifindex); in br_mrp_add()
490 spin_lock_bh(&br->lock); in br_mrp_add()
491 p->state = BR_STATE_FORWARDING; in br_mrp_add()
492 p->flags |= BR_MRP_AWARE; in br_mrp_add()
493 spin_unlock_bh(&br->lock); in br_mrp_add()
494 rcu_assign_pointer(mrp->s_port, p); in br_mrp_add()
496 INIT_DELAYED_WORK(&mrp->test_work, br_mrp_test_work_expired); in br_mrp_add()
497 INIT_DELAYED_WORK(&mrp->in_test_work, br_mrp_in_test_work_expired); in br_mrp_add()
498 list_add_tail_rcu(&mrp->list, &br->mrp_list); in br_mrp_add()
515 void br_mrp_port_del(struct net_bridge *br, struct net_bridge_port *p) in br_mrp_port_del() argument
517 struct br_mrp *mrp = br_mrp_find_port(br, p); in br_mrp_port_del()
531 struct br_mrp *mrp = br_mrp_find_id(br, instance->ring_id); in br_mrp_del()
534 return -EINVAL; in br_mrp_del()
541 /* Set port state, port state can be forwarding, blocked or disabled
544 int br_mrp_set_port_state(struct net_bridge_port *p, in br_mrp_set_port_state() argument
545 enum br_mrp_port_state_type state) in br_mrp_set_port_state() argument
549 if (!p || !(p->flags & BR_MRP_AWARE)) in br_mrp_set_port_state()
550 return -EINVAL; in br_mrp_set_port_state()
552 spin_lock_bh(&p->br->lock); in br_mrp_set_port_state()
554 if (state == BR_MRP_PORT_STATE_FORWARDING) in br_mrp_set_port_state()
559 p->state = port_state; in br_mrp_set_port_state()
560 spin_unlock_bh(&p->br->lock); in br_mrp_set_port_state()
562 br_mrp_port_switchdev_set_state(p, port_state); in br_mrp_set_port_state()
570 int br_mrp_set_port_role(struct net_bridge_port *p, in br_mrp_set_port_role() argument
575 if (!p || !(p->flags & BR_MRP_AWARE)) in br_mrp_set_port_role()
576 return -EINVAL; in br_mrp_set_port_role()
578 mrp = br_mrp_find_port(p->br, p); in br_mrp_set_port_role()
581 return -EINVAL; in br_mrp_set_port_role()
585 rcu_assign_pointer(mrp->p_port, p); in br_mrp_set_port_role()
588 rcu_assign_pointer(mrp->s_port, p); in br_mrp_set_port_role()
591 return -EINVAL; in br_mrp_set_port_role()
594 br_mrp_port_switchdev_set_role(p, role); in br_mrp_set_port_role()
599 /* Set ring state, ring state can be only Open or Closed
603 struct br_mrp_ring_state *state) in br_mrp_set_ring_state() argument
605 struct br_mrp *mrp = br_mrp_find_id(br, state->ring_id); in br_mrp_set_ring_state()
608 return -EINVAL; in br_mrp_set_ring_state()
610 if (mrp->ring_state != state->ring_state) in br_mrp_set_ring_state()
611 mrp->ring_transitions++; in br_mrp_set_ring_state()
613 mrp->ring_state = state->ring_state; in br_mrp_set_ring_state()
615 br_mrp_switchdev_set_ring_state(br, mrp, state->ring_state); in br_mrp_set_ring_state()
627 struct br_mrp *mrp = br_mrp_find_id(br, role->ring_id); in br_mrp_set_ring_role()
631 return -EINVAL; in br_mrp_set_ring_role()
633 mrp->ring_role = role->ring_role; in br_mrp_set_ring_role()
636 err = br_mrp_switchdev_set_ring_role(br, mrp, role->ring_role); in br_mrp_set_ring_role()
637 if (err && err != -EOPNOTSUPP) in br_mrp_set_ring_role()
646 mrp->ring_role_offloaded = err == -EOPNOTSUPP ? 0 : 1; in br_mrp_set_ring_role()
658 struct br_mrp *mrp = br_mrp_find_id(br, test->ring_id); in br_mrp_start_test()
661 return -EINVAL; in br_mrp_start_test()
666 if (!br_mrp_switchdev_send_ring_test(br, mrp, test->interval, in br_mrp_start_test()
667 test->max_miss, test->period, in br_mrp_start_test()
668 test->monitor)) in br_mrp_start_test()
671 mrp->test_interval = test->interval; in br_mrp_start_test()
672 mrp->test_end = jiffies + usecs_to_jiffies(test->period); in br_mrp_start_test()
673 mrp->test_max_miss = test->max_miss; in br_mrp_start_test()
674 mrp->test_monitor = test->monitor; in br_mrp_start_test()
675 mrp->test_count_miss = 0; in br_mrp_start_test()
676 queue_delayed_work(system_wq, &mrp->test_work, in br_mrp_start_test()
677 usecs_to_jiffies(test->interval)); in br_mrp_start_test()
682 /* Set in state, int state can be only Open or Closed
685 int br_mrp_set_in_state(struct net_bridge *br, struct br_mrp_in_state *state) in br_mrp_set_in_state() argument
687 struct br_mrp *mrp = br_mrp_find_in_id(br, state->in_id); in br_mrp_set_in_state()
690 return -EINVAL; in br_mrp_set_in_state()
692 if (mrp->in_state != state->in_state) in br_mrp_set_in_state()
693 mrp->in_transitions++; in br_mrp_set_in_state()
695 mrp->in_state = state->in_state; in br_mrp_set_in_state()
697 br_mrp_switchdev_set_in_state(br, mrp, state->in_state); in br_mrp_set_in_state()
708 struct br_mrp *mrp = br_mrp_find_id(br, role->ring_id); in br_mrp_set_in_role()
709 struct net_bridge_port *p; in br_mrp_set_in_role() local
713 return -EINVAL; in br_mrp_set_in_role()
715 if (!br_mrp_get_port(br, role->i_ifindex)) in br_mrp_set_in_role()
716 return -EINVAL; in br_mrp_set_in_role()
718 if (role->in_role == BR_MRP_IN_ROLE_DISABLED) { in br_mrp_set_in_role()
719 u8 state; in br_mrp_set_in_role() local
722 p = rtnl_dereference(mrp->i_port); in br_mrp_set_in_role()
723 if (!p) in br_mrp_set_in_role()
724 return -EINVAL; in br_mrp_set_in_role()
727 cancel_delayed_work_sync(&mrp->in_test_work); in br_mrp_set_in_role()
731 spin_lock_bh(&br->lock); in br_mrp_set_in_role()
732 state = netif_running(br->dev) ? in br_mrp_set_in_role()
734 p->state = state; in br_mrp_set_in_role()
735 p->flags &= ~BR_MRP_AWARE; in br_mrp_set_in_role()
736 spin_unlock_bh(&br->lock); in br_mrp_set_in_role()
737 br_mrp_port_switchdev_set_state(p, state); in br_mrp_set_in_role()
738 rcu_assign_pointer(mrp->i_port, NULL); in br_mrp_set_in_role()
740 mrp->in_role = role->in_role; in br_mrp_set_in_role()
741 mrp->in_id = 0; in br_mrp_set_in_role()
747 if (!br_mrp_unique_ifindex(br, role->i_ifindex)) in br_mrp_set_in_role()
748 return -EINVAL; in br_mrp_set_in_role()
754 if (rcu_access_pointer(mrp->i_port)) in br_mrp_set_in_role()
755 return -EINVAL; in br_mrp_set_in_role()
757 p = br_mrp_get_port(br, role->i_ifindex); in br_mrp_set_in_role()
758 spin_lock_bh(&br->lock); in br_mrp_set_in_role()
759 p->state = BR_STATE_FORWARDING; in br_mrp_set_in_role()
760 p->flags |= BR_MRP_AWARE; in br_mrp_set_in_role()
761 spin_unlock_bh(&br->lock); in br_mrp_set_in_role()
762 rcu_assign_pointer(mrp->i_port, p); in br_mrp_set_in_role()
764 mrp->in_role = role->in_role; in br_mrp_set_in_role()
765 mrp->in_id = role->in_id; in br_mrp_set_in_role()
768 err = br_mrp_switchdev_set_in_role(br, mrp, role->in_id, in br_mrp_set_in_role()
769 role->ring_id, role->in_role); in br_mrp_set_in_role()
770 if (err && err != -EOPNOTSUPP) in br_mrp_set_in_role()
779 mrp->in_role_offloaded = err == -EOPNOTSUPP ? 0 : 1; in br_mrp_set_in_role()
791 struct br_mrp *mrp = br_mrp_find_in_id(br, in_test->in_id); in br_mrp_start_in_test()
794 return -EINVAL; in br_mrp_start_in_test()
796 if (mrp->in_role != BR_MRP_IN_ROLE_MIM) in br_mrp_start_in_test()
797 return -EINVAL; in br_mrp_start_in_test()
802 if (!br_mrp_switchdev_send_in_test(br, mrp, in_test->interval, in br_mrp_start_in_test()
803 in_test->max_miss, in_test->period)) in br_mrp_start_in_test()
806 mrp->in_test_interval = in_test->interval; in br_mrp_start_in_test()
807 mrp->in_test_end = jiffies + usecs_to_jiffies(in_test->period); in br_mrp_start_in_test()
808 mrp->in_test_max_miss = in_test->max_miss; in br_mrp_start_in_test()
809 mrp->in_test_count_miss = 0; in br_mrp_start_in_test()
810 queue_delayed_work(system_wq, &mrp->in_test_work, in br_mrp_start_in_test()
811 usecs_to_jiffies(in_test->interval)); in br_mrp_start_in_test()
826 if (hdr->type == BR_MRP_TLV_HEADER_RING_TEST || in br_mrp_ring_frame()
827 hdr->type == BR_MRP_TLV_HEADER_RING_TOPO || in br_mrp_ring_frame()
828 hdr->type == BR_MRP_TLV_HEADER_RING_LINK_DOWN || in br_mrp_ring_frame()
829 hdr->type == BR_MRP_TLV_HEADER_RING_LINK_UP || in br_mrp_ring_frame()
830 hdr->type == BR_MRP_TLV_HEADER_OPTION) in br_mrp_ring_frame()
846 if (hdr->type == BR_MRP_TLV_HEADER_IN_TEST || in br_mrp_in_frame()
847 hdr->type == BR_MRP_TLV_HEADER_IN_TOPO || in br_mrp_in_frame()
848 hdr->type == BR_MRP_TLV_HEADER_IN_LINK_DOWN || in br_mrp_in_frame()
849 hdr->type == BR_MRP_TLV_HEADER_IN_LINK_UP) in br_mrp_in_frame()
872 if (hdr->type != BR_MRP_TLV_HEADER_RING_TEST) in br_mrp_mrm_process()
875 mrp->test_count_miss = 0; in br_mrp_mrm_process()
880 if (mrp->ring_state != BR_MRP_RING_STATE_CLOSED) in br_mrp_mrm_process()
881 br_mrp_ring_port_open(port->dev, false); in br_mrp_mrm_process()
889 u16 prio = be16_to_cpu(hdr->prio); in br_mrp_test_better_than_own()
891 if (prio < mrp->prio || in br_mrp_test_better_than_own()
892 (prio == mrp->prio && in br_mrp_test_better_than_own()
893 ether_addr_to_u64(hdr->sa) < ether_addr_to_u64(br->dev->dev_addr))) in br_mrp_test_better_than_own()
919 if (hdr->type != BR_MRP_TLV_HEADER_RING_TEST) in br_mrp_mra_process()
932 mrp->test_count_miss = 0; in br_mrp_mra_process()
961 if (mrp->in_id != ntohs(in_hdr->id)) in br_mrp_mim_process()
964 mrp->in_test_count_miss = 0; in br_mrp_mim_process()
969 if (mrp->in_state != BR_MRP_IN_STATE_CLOSED) in br_mrp_mim_process()
970 br_mrp_in_port_open(port->dev, false); in br_mrp_mim_process()
990 return hdr->type; in br_mrp_get_frame_type()
995 if (mrp->ring_role == BR_MRP_RING_ROLE_MRM || in br_mrp_mrm_behaviour()
996 (mrp->ring_role == BR_MRP_RING_ROLE_MRA && !mrp->test_monitor)) in br_mrp_mrm_behaviour()
1004 if (mrp->ring_role == BR_MRP_RING_ROLE_MRC || in br_mrp_mrc_behaviour()
1005 (mrp->ring_role == BR_MRP_RING_ROLE_MRA && mrp->test_monitor)) in br_mrp_mrc_behaviour()
1015 static int br_mrp_rcv(struct net_bridge_port *p, in br_mrp_rcv() argument
1024 if (p->state == BR_STATE_DISABLED) in br_mrp_rcv()
1027 br = p->br; in br_mrp_rcv()
1028 mrp = br_mrp_find_port(br, p); in br_mrp_rcv()
1032 p_port = rcu_dereference(mrp->p_port); in br_mrp_rcv()
1037 s_port = rcu_dereference(mrp->s_port); in br_mrp_rcv()
1047 if (mrp->ring_role == BR_MRP_RING_ROLE_MRM) { in br_mrp_rcv()
1048 br_mrp_mrm_process(mrp, p, skb); in br_mrp_rcv()
1055 if (mrp->ring_role == BR_MRP_RING_ROLE_MRA) { in br_mrp_rcv()
1056 if (!mrp->test_monitor) { in br_mrp_rcv()
1057 br_mrp_mrm_process(mrp, p, skb); in br_mrp_rcv()
1061 br_mrp_mra_process(mrp, br, p, skb); in br_mrp_rcv()
1070 i_port = rcu_dereference(mrp->i_port); in br_mrp_rcv()
1073 /* If the ring port is in block state it should not forward in br_mrp_rcv()
1076 if (br_mrp_is_ring_port(p_port, s_port, p) && in br_mrp_rcv()
1077 p->state == BR_STATE_BLOCKING && in br_mrp_rcv()
1086 br_mrp_is_ring_port(p_port, s_port, p) && in br_mrp_rcv()
1087 (s_port->state != BR_STATE_FORWARDING || in br_mrp_rcv()
1088 p_port->state != BR_STATE_FORWARDING)) { in br_mrp_rcv()
1098 mrp->in_role == BR_MRP_IN_ROLE_DISABLED) in br_mrp_rcv()
1101 if (mrp->in_role == BR_MRP_IN_ROLE_MIM) { in br_mrp_rcv()
1106 if (br_mrp_mim_process(mrp, p, skb)) { in br_mrp_rcv()
1110 p)) in br_mrp_rcv()
1113 if (br_mrp_is_in_port(i_port, p)) in br_mrp_rcv()
1123 if (br_mrp_is_ring_port(p_port, s_port, p)) in br_mrp_rcv()
1126 if (br_mrp_is_in_port(i_port, p)) in br_mrp_rcv()
1131 if (mrp->in_role == BR_MRP_IN_ROLE_MIC) { in br_mrp_rcv()
1141 if (br_mrp_is_ring_port(p_port, s_port, p) && in br_mrp_rcv()
1176 int br_mrp_process(struct net_bridge_port *p, struct sk_buff *skb) in br_mrp_process() argument
1179 if (likely(!(p->flags & BR_MRP_AWARE))) in br_mrp_process()
1182 if (unlikely(skb->protocol == htons(ETH_P_MRP))) in br_mrp_process()
1183 return br_mrp_rcv(p, skb, p->dev); in br_mrp_process()
1191 return !list_empty(&br->mrp_list); in br_mrp_enabled()