Lines Matching refs:mrp
48 struct br_mrp *mrp; in br_mrp_find_id() local
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()
53 res = mrp; in br_mrp_find_id()
64 struct br_mrp *mrp; in br_mrp_find_in_id() local
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()
69 res = mrp; in br_mrp_find_in_id()
79 struct br_mrp *mrp; in br_mrp_unique_ifindex() local
81 list_for_each_entry_rcu(mrp, &br->mrp_list, list, in br_mrp_unique_ifindex()
85 p = rtnl_dereference(mrp->p_port); in br_mrp_unique_ifindex()
89 p = rtnl_dereference(mrp->s_port); in br_mrp_unique_ifindex()
93 p = rtnl_dereference(mrp->i_port); in br_mrp_unique_ifindex()
105 struct br_mrp *mrp; in br_mrp_find_port() local
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()
112 res = mrp; in br_mrp_find_port()
120 static int br_mrp_next_seq(struct br_mrp *mrp) in br_mrp_next_seq() argument
122 mrp->seq_id++; in br_mrp_next_seq()
123 return mrp->seq_id; in br_mrp_next_seq()
164 static void br_mrp_skb_common(struct sk_buff *skb, struct br_mrp *mrp) in br_mrp_skb_common() argument
171 hdr->seq_id = cpu_to_be16(br_mrp_next_seq(mrp)); in br_mrp_skb_common()
175 static struct sk_buff *br_mrp_alloc_test_skb(struct br_mrp *mrp, in br_mrp_alloc_test_skb() argument
192 hdr->prio = cpu_to_be16(mrp->prio); 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()
199 br_mrp_skb_common(skb, mrp); in br_mrp_alloc_test_skb()
205 static struct sk_buff *br_mrp_alloc_in_test_skb(struct br_mrp *mrp, in br_mrp_alloc_in_test_skb() argument
222 hdr->id = cpu_to_be16(mrp->in_id); 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()
229 br_mrp_skb_common(skb, mrp); in br_mrp_alloc_in_test_skb()
248 struct br_mrp *mrp = container_of(del_work, struct br_mrp, test_work); 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()
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()
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()
291 p = rcu_dereference(mrp->s_port); 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()
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()
321 struct br_mrp *mrp = container_of(del_work, struct br_mrp, in_test_work); 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()
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()
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()
356 p = rcu_dereference(mrp->s_port); 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()
370 p = rcu_dereference(mrp->i_port); 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()
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()
394 static void br_mrp_del_impl(struct net_bridge *br, struct br_mrp *mrp) in br_mrp_del_impl() argument
400 cancel_delayed_work_sync(&mrp->test_work); in br_mrp_del_impl()
401 br_mrp_switchdev_send_ring_test(br, mrp, 0, 0, 0, 0); in br_mrp_del_impl()
404 cancel_delayed_work_sync(&mrp->in_test_work); in br_mrp_del_impl()
405 br_mrp_switchdev_send_in_test(br, mrp, 0, 0, 0); in br_mrp_del_impl()
407 br_mrp_switchdev_del(br, mrp); in br_mrp_del_impl()
410 p = rtnl_dereference(mrp->p_port); 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()
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()
443 rcu_assign_pointer(mrp->i_port, NULL); in br_mrp_del_impl()
446 list_del_rcu(&mrp->list); in br_mrp_del_impl()
447 kfree_rcu(mrp, rcu); in br_mrp_del_impl()
456 struct br_mrp *mrp; in br_mrp_add() local
462 mrp = br_mrp_find_id(br, instance->ring_id); in br_mrp_add()
463 if (mrp) in br_mrp_add()
475 mrp = kzalloc(sizeof(*mrp), GFP_KERNEL); in br_mrp_add()
476 if (!mrp) in br_mrp_add()
479 mrp->ring_id = instance->ring_id; in br_mrp_add()
480 mrp->prio = instance->prio; in br_mrp_add()
487 rcu_assign_pointer(mrp->p_port, p); 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()
500 err = br_mrp_switchdev_add(br, mrp); in br_mrp_add()
507 br_mrp_del_impl(br, mrp); in br_mrp_add()
517 struct br_mrp *mrp = br_mrp_find_port(br, p); in br_mrp_port_del() local
520 if (!mrp) in br_mrp_port_del()
523 br_mrp_del_impl(br, mrp); in br_mrp_port_del()
531 struct br_mrp *mrp = br_mrp_find_id(br, instance->ring_id); in br_mrp_del() local
533 if (!mrp) in br_mrp_del()
536 br_mrp_del_impl(br, mrp); in br_mrp_del()
573 struct br_mrp *mrp; in br_mrp_set_port_role() local
578 mrp = br_mrp_find_port(p->br, p); in br_mrp_set_port_role()
580 if (!mrp) 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()
605 struct br_mrp *mrp = br_mrp_find_id(br, state->ring_id); in br_mrp_set_ring_state() local
607 if (!mrp) 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() local
630 if (!mrp) 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()
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() local
660 if (!mrp) in br_mrp_start_test()
666 if (!br_mrp_switchdev_send_ring_test(br, mrp, test->interval, 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()
687 struct br_mrp *mrp = br_mrp_find_in_id(br, state->in_id); in br_mrp_set_in_state() local
689 if (!mrp) 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() local
712 if (!mrp) in br_mrp_set_in_role()
722 p = rtnl_dereference(mrp->i_port); in br_mrp_set_in_role()
727 cancel_delayed_work_sync(&mrp->in_test_work); in br_mrp_set_in_role()
728 br_mrp_switchdev_send_in_test(br, mrp, 0, 0, 0); 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()
754 if (rcu_access_pointer(mrp->i_port)) 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()
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() local
793 if (!mrp) in br_mrp_start_in_test()
796 if (mrp->in_role != BR_MRP_IN_ROLE_MIM) 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()
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()
859 static void br_mrp_mrm_process(struct br_mrp *mrp, struct net_bridge_port *port, in br_mrp_mrm_process() argument
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()
885 static bool br_mrp_test_better_than_own(struct br_mrp *mrp, in br_mrp_test_better_than_own() argument
891 if (prio < mrp->prio || in br_mrp_test_better_than_own()
892 (prio == mrp->prio && in br_mrp_test_better_than_own()
903 static void br_mrp_mra_process(struct br_mrp *mrp, struct net_bridge *br, in br_mrp_mra_process() argument
931 if (br_mrp_test_better_than_own(mrp, br, test_hdr)) in br_mrp_mra_process()
932 mrp->test_count_miss = 0; in br_mrp_mra_process()
939 static bool br_mrp_mim_process(struct br_mrp *mrp, struct net_bridge_port *port, in br_mrp_mim_process() argument
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()
993 static bool br_mrp_mrm_behaviour(struct br_mrp *mrp) in br_mrp_mrm_behaviour() argument
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()
1002 static bool br_mrp_mrc_behaviour(struct br_mrp *mrp) in br_mrp_mrc_behaviour() argument
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()
1021 struct br_mrp *mrp; in br_mrp_rcv() local
1028 mrp = br_mrp_find_port(br, p); in br_mrp_rcv()
1029 if (unlikely(!mrp)) 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()
1085 if (br_mrp_mrm_behaviour(mrp) && in br_mrp_rcv()
1097 if (br_mrp_mrc_behaviour(mrp) && 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()
1131 if (mrp->in_role == BR_MRP_IN_ROLE_MIC) { in br_mrp_rcv()