Lines Matching defs:mrp
48 struct br_mrp *mrp;
50 list_for_each_entry_rcu(mrp, &br->mrp_list, list,
52 if (mrp->ring_id == ring_id) {
53 res = mrp;
64 struct br_mrp *mrp;
66 list_for_each_entry_rcu(mrp, &br->mrp_list, list,
68 if (mrp->in_id == in_id) {
69 res = mrp;
79 struct br_mrp *mrp;
81 list_for_each_entry_rcu(mrp, &br->mrp_list, list,
85 p = rtnl_dereference(mrp->p_port);
89 p = rtnl_dereference(mrp->s_port);
93 p = rtnl_dereference(mrp->i_port);
105 struct br_mrp *mrp;
107 list_for_each_entry_rcu(mrp, &br->mrp_list, list,
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;
120 static int br_mrp_next_seq(struct br_mrp *mrp)
122 mrp->seq_id++;
123 return mrp->seq_id;
164 static void br_mrp_skb_common(struct sk_buff *skb, struct br_mrp *mrp)
171 hdr->seq_id = cpu_to_be16(br_mrp_next_seq(mrp));
175 static struct sk_buff *br_mrp_alloc_test_skb(struct br_mrp *mrp,
192 hdr->prio = cpu_to_be16(mrp->prio);
195 hdr->state = cpu_to_be16(mrp->ring_state);
196 hdr->transitions = cpu_to_be16(mrp->ring_transitions);
199 br_mrp_skb_common(skb, mrp);
205 static struct sk_buff *br_mrp_alloc_in_test_skb(struct br_mrp *mrp,
222 hdr->id = cpu_to_be16(mrp->in_id);
225 hdr->state = cpu_to_be16(mrp->in_state);
226 hdr->transitions = cpu_to_be16(mrp->in_transitions);
229 br_mrp_skb_common(skb, mrp);
248 struct br_mrp *mrp = container_of(del_work, struct br_mrp, test_work);
253 if (time_before_eq(mrp->test_end, jiffies))
256 if (mrp->test_count_miss < mrp->test_max_miss) {
257 mrp->test_count_miss++;
268 if (mrp->ring_state == BR_MRP_RING_STATE_CLOSED ||
269 mrp->test_monitor)
275 p = rcu_dereference(mrp->p_port);
277 if (!mrp->test_monitor) {
278 skb = br_mrp_alloc_test_skb(mrp, p,
287 if (notify_open && !mrp->ring_role_offloaded)
291 p = rcu_dereference(mrp->s_port);
293 if (!mrp->test_monitor) {
294 skb = br_mrp_alloc_test_skb(mrp, p,
303 if (notify_open && !mrp->ring_role_offloaded)
310 queue_delayed_work(system_wq, &mrp->test_work,
311 usecs_to_jiffies(mrp->test_interval));
321 struct br_mrp *mrp = container_of(del_work, struct br_mrp, in_test_work);
326 if (time_before_eq(mrp->in_test_end, jiffies))
329 if (mrp->in_test_count_miss < mrp->in_test_max_miss) {
330 mrp->in_test_count_miss++;
336 if (mrp->in_state == BR_MRP_IN_STATE_CLOSED)
342 p = rcu_dereference(mrp->p_port);
344 skb = br_mrp_alloc_in_test_skb(mrp, p,
352 if (notify_open && !mrp->in_role_offloaded)
356 p = rcu_dereference(mrp->s_port);
358 skb = br_mrp_alloc_in_test_skb(mrp, p,
366 if (notify_open && !mrp->in_role_offloaded)
370 p = rcu_dereference(mrp->i_port);
372 skb = br_mrp_alloc_in_test_skb(mrp, p,
380 if (notify_open && !mrp->in_role_offloaded)
387 queue_delayed_work(system_wq, &mrp->in_test_work,
388 usecs_to_jiffies(mrp->in_test_interval));
394 static void br_mrp_del_impl(struct net_bridge *br, struct br_mrp *mrp)
400 cancel_delayed_work_sync(&mrp->test_work);
401 br_mrp_switchdev_send_ring_test(br, mrp, 0, 0, 0, 0);
404 cancel_delayed_work_sync(&mrp->in_test_work);
405 br_mrp_switchdev_send_in_test(br, mrp, 0, 0, 0);
407 br_mrp_switchdev_del(br, mrp);
410 p = rtnl_dereference(mrp->p_port);
419 rcu_assign_pointer(mrp->p_port, NULL);
422 p = rtnl_dereference(mrp->s_port);
431 rcu_assign_pointer(mrp->s_port, NULL);
434 p = rtnl_dereference(mrp->i_port);
443 rcu_assign_pointer(mrp->i_port, NULL);
446 list_del_rcu(&mrp->list);
447 kfree_rcu(mrp, rcu);
456 struct br_mrp *mrp;
462 mrp = br_mrp_find_id(br, instance->ring_id);
463 if (mrp)
475 mrp = kzalloc(sizeof(*mrp), GFP_KERNEL);
476 if (!mrp)
479 mrp->ring_id = instance->ring_id;
480 mrp->prio = instance->prio;
487 rcu_assign_pointer(mrp->p_port, p);
494 rcu_assign_pointer(mrp->s_port, p);
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);
500 err = br_mrp_switchdev_add(br, mrp);
507 br_mrp_del_impl(br, mrp);
517 struct br_mrp *mrp = br_mrp_find_port(br, p);
520 if (!mrp)
523 br_mrp_del_impl(br, mrp);
531 struct br_mrp *mrp = br_mrp_find_id(br, instance->ring_id);
533 if (!mrp)
536 br_mrp_del_impl(br, mrp);
573 struct br_mrp *mrp;
578 mrp = br_mrp_find_port(p->br, p);
580 if (!mrp)
585 rcu_assign_pointer(mrp->p_port, p);
588 rcu_assign_pointer(mrp->s_port, p);
605 struct br_mrp *mrp = br_mrp_find_id(br, state->ring_id);
607 if (!mrp)
610 if (mrp->ring_state != state->ring_state)
611 mrp->ring_transitions++;
613 mrp->ring_state = state->ring_state;
615 br_mrp_switchdev_set_ring_state(br, mrp, state->ring_state);
627 struct br_mrp *mrp = br_mrp_find_id(br, role->ring_id);
630 if (!mrp)
633 mrp->ring_role = role->ring_role;
636 err = br_mrp_switchdev_set_ring_role(br, mrp, role->ring_role);
646 mrp->ring_role_offloaded = err == -EOPNOTSUPP ? 0 : 1;
658 struct br_mrp *mrp = br_mrp_find_id(br, test->ring_id);
660 if (!mrp)
666 if (!br_mrp_switchdev_send_ring_test(br, mrp, test->interval,
671 mrp->test_interval = test->interval;
672 mrp->test_end = jiffies + usecs_to_jiffies(test->period);
673 mrp->test_max_miss = test->max_miss;
674 mrp->test_monitor = test->monitor;
675 mrp->test_count_miss = 0;
676 queue_delayed_work(system_wq, &mrp->test_work,
687 struct br_mrp *mrp = br_mrp_find_in_id(br, state->in_id);
689 if (!mrp)
692 if (mrp->in_state != state->in_state)
693 mrp->in_transitions++;
695 mrp->in_state = state->in_state;
697 br_mrp_switchdev_set_in_state(br, mrp, state->in_state);
708 struct br_mrp *mrp = br_mrp_find_id(br, role->ring_id);
712 if (!mrp)
722 p = rtnl_dereference(mrp->i_port);
727 cancel_delayed_work_sync(&mrp->in_test_work);
728 br_mrp_switchdev_send_in_test(br, mrp, 0, 0, 0);
738 rcu_assign_pointer(mrp->i_port, NULL);
740 mrp->in_role = role->in_role;
741 mrp->in_id = 0;
750 /* It is not allowed to set a different interconnect port if the mrp
754 if (rcu_access_pointer(mrp->i_port))
762 rcu_assign_pointer(mrp->i_port, p);
764 mrp->in_role = role->in_role;
765 mrp->in_id = role->in_id;
768 err = br_mrp_switchdev_set_in_role(br, mrp, role->in_id,
779 mrp->in_role_offloaded = err == -EOPNOTSUPP ? 0 : 1;
791 struct br_mrp *mrp = br_mrp_find_in_id(br, in_test->in_id);
793 if (!mrp)
796 if (mrp->in_role != BR_MRP_IN_ROLE_MIM)
802 if (!br_mrp_switchdev_send_in_test(br, mrp, in_test->interval,
806 mrp->in_test_interval = in_test->interval;
807 mrp->in_test_end = jiffies + usecs_to_jiffies(in_test->period);
808 mrp->in_test_max_miss = in_test->max_miss;
809 mrp->in_test_count_miss = 0;
810 queue_delayed_work(system_wq, &mrp->in_test_work,
859 static void br_mrp_mrm_process(struct br_mrp *mrp, struct net_bridge_port *port,
875 mrp->test_count_miss = 0;
880 if (mrp->ring_state != BR_MRP_RING_STATE_CLOSED)
885 static bool br_mrp_test_better_than_own(struct br_mrp *mrp,
891 if (prio < mrp->prio ||
892 (prio == mrp->prio &&
903 static void br_mrp_mra_process(struct br_mrp *mrp, struct net_bridge *br,
931 if (br_mrp_test_better_than_own(mrp, br, test_hdr))
932 mrp->test_count_miss = 0;
939 static bool br_mrp_mim_process(struct br_mrp *mrp, struct net_bridge_port *port,
961 if (mrp->in_id != ntohs(in_hdr->id))
964 mrp->in_test_count_miss = 0;
969 if (mrp->in_state != BR_MRP_IN_STATE_CLOSED)
993 static bool br_mrp_mrm_behaviour(struct br_mrp *mrp)
995 if (mrp->ring_role == BR_MRP_RING_ROLE_MRM ||
996 (mrp->ring_role == BR_MRP_RING_ROLE_MRA && !mrp->test_monitor))
1002 static bool br_mrp_mrc_behaviour(struct br_mrp *mrp)
1004 if (mrp->ring_role == BR_MRP_RING_ROLE_MRC ||
1005 (mrp->ring_role == BR_MRP_RING_ROLE_MRA && mrp->test_monitor))
1011 /* This will just forward the frame to the other mrp ring ports, depending on
1021 struct br_mrp *mrp;
1028 mrp = br_mrp_find_port(br, p);
1029 if (unlikely(!mrp))
1032 p_port = rcu_dereference(mrp->p_port);
1037 s_port = rcu_dereference(mrp->s_port);
1047 if (mrp->ring_role == BR_MRP_RING_ROLE_MRM) {
1048 br_mrp_mrm_process(mrp, p, skb);
1055 if (mrp->ring_role == BR_MRP_RING_ROLE_MRA) {
1056 if (!mrp->test_monitor) {
1057 br_mrp_mrm_process(mrp, p, skb);
1061 br_mrp_mra_process(mrp, br, p, skb);
1070 i_port = rcu_dereference(mrp->i_port);
1085 if (br_mrp_mrm_behaviour(mrp) &&
1097 if (br_mrp_mrc_behaviour(mrp) &&
1098 mrp->in_role == BR_MRP_IN_ROLE_DISABLED)
1101 if (mrp->in_role == BR_MRP_IN_ROLE_MIM) {
1106 if (br_mrp_mim_process(mrp, p, skb)) {
1131 if (mrp->in_role == BR_MRP_IN_ROLE_MIC) {