Lines Matching +full:0 +full:m
102 static void tipc_group_proto_xmit(struct tipc_group *grp, struct tipc_member *m,
105 static void tipc_group_open(struct tipc_member *m, bool *wakeup) in tipc_group_open() argument
108 if (list_empty(&m->small_win)) in tipc_group_open()
110 list_del_init(&m->small_win); in tipc_group_open()
111 *m->group->open = true; in tipc_group_open()
116 struct tipc_member *m) in tipc_group_decr_active() argument
118 if (m->state == MBR_ACTIVE || m->state == MBR_RECLAIMING || in tipc_group_decr_active()
119 m->state == MBR_REMITTED) in tipc_group_decr_active()
146 static bool tipc_group_is_receiver(struct tipc_member *m) in tipc_group_is_receiver() argument
148 return m && m->state != MBR_JOINING && m->state != MBR_LEAVING; in tipc_group_is_receiver()
151 static bool tipc_group_is_sender(struct tipc_member *m) in tipc_group_is_sender() argument
153 return m && m->state != MBR_JOINING && m->state != MBR_PUBLISHED; in tipc_group_is_sender()
160 return 0; in tipc_group_exclude()
190 if (tipc_topsrv_kern_subscr(net, portid, type, 0, ~0, in tipc_group_create()
200 struct tipc_member *m, *tmp; in tipc_group_join() local
204 rbtree_postorder_for_each_entry_safe(m, tmp, tree, tree_node) { in tipc_group_join()
205 tipc_group_proto_xmit(grp, m, GRP_JOIN_MSG, &xmitq); in tipc_group_join()
206 tipc_group_update_member(m, 0); in tipc_group_join()
215 struct tipc_member *m, *tmp; in tipc_group_delete() local
220 rbtree_postorder_for_each_entry_safe(m, tmp, tree, tree_node) { in tipc_group_delete()
221 tipc_group_proto_xmit(grp, m, GRP_LEAVE_MSG, &xmitq); in tipc_group_delete()
222 __skb_queue_purge(&m->deferredq); in tipc_group_delete()
223 list_del(&m->list); in tipc_group_delete()
224 kfree(m); in tipc_group_delete()
237 struct tipc_member *m; in tipc_group_find_member() local
240 m = container_of(n, struct tipc_member, tree_node); in tipc_group_find_member()
241 nkey = (u64)m->node << 32 | m->port; in tipc_group_find_member()
247 return m; in tipc_group_find_member()
255 struct tipc_member *m; in tipc_group_find_dest() local
257 m = tipc_group_find_member(grp, node, port); in tipc_group_find_dest()
258 if (m && tipc_group_is_receiver(m)) in tipc_group_find_dest()
259 return m; in tipc_group_find_dest()
266 struct tipc_member *m; in tipc_group_find_node() local
270 m = container_of(n, struct tipc_member, tree_node); in tipc_group_find_node()
271 if (m->node == node) in tipc_group_find_node()
272 return m; in tipc_group_find_node()
278 struct tipc_member *m) in tipc_group_add_to_tree() argument
280 u64 nkey, key = (u64)m->node << 32 | m->port; in tipc_group_add_to_tree()
297 rb_link_node(&m->tree_node, parent, n); in tipc_group_add_to_tree()
298 rb_insert_color(&m->tree_node, &grp->members); in tipc_group_add_to_tree()
299 return 0; in tipc_group_add_to_tree()
306 struct tipc_member *m; in tipc_group_create_member() local
309 m = kzalloc_obj(*m, GFP_ATOMIC); in tipc_group_create_member()
310 if (!m) in tipc_group_create_member()
312 INIT_LIST_HEAD(&m->list); in tipc_group_create_member()
313 INIT_LIST_HEAD(&m->small_win); in tipc_group_create_member()
314 __skb_queue_head_init(&m->deferredq); in tipc_group_create_member()
315 m->group = grp; in tipc_group_create_member()
316 m->node = node; in tipc_group_create_member()
317 m->port = port; in tipc_group_create_member()
318 m->instance = instance; in tipc_group_create_member()
319 m->bc_acked = grp->bc_snd_nxt - 1; in tipc_group_create_member()
320 ret = tipc_group_add_to_tree(grp, m); in tipc_group_create_member()
321 if (ret < 0) { in tipc_group_create_member()
322 kfree(m); in tipc_group_create_member()
326 tipc_nlist_add(&grp->dests, m->node); in tipc_group_create_member()
327 m->state = state; in tipc_group_create_member()
328 return m; in tipc_group_create_member()
338 struct tipc_member *m) in tipc_group_delete_member() argument
340 rb_erase(&m->tree_node, &grp->members); in tipc_group_delete_member()
344 if (grp->bc_ackers && less(m->bc_acked, grp->bc_snd_nxt - 1)) in tipc_group_delete_member()
347 list_del_init(&m->list); in tipc_group_delete_member()
348 list_del_init(&m->small_win); in tipc_group_delete_member()
349 tipc_group_decr_active(grp, m); in tipc_group_delete_member()
352 if (!tipc_group_find_node(grp, m->node)) in tipc_group_delete_member()
353 tipc_nlist_del(&grp->dests, m->node); in tipc_group_delete_member()
355 kfree(m); in tipc_group_delete_member()
372 void tipc_group_update_member(struct tipc_member *m, int len) in tipc_group_update_member() argument
374 struct tipc_group *grp = m->group; in tipc_group_update_member()
377 if (!tipc_group_is_receiver(m)) in tipc_group_update_member()
380 m->window -= len; in tipc_group_update_member()
382 if (m->window >= ADV_IDLE) in tipc_group_update_member()
385 list_del_init(&m->small_win); in tipc_group_update_member()
389 if (_m->window > m->window) in tipc_group_update_member()
392 list_add_tail(&m->small_win, &_m->small_win); in tipc_group_update_member()
398 struct tipc_member *m; in tipc_group_update_bc_members() local
400 u16 ackers = 0; in tipc_group_update_bc_members()
403 m = container_of(n, struct tipc_member, tree_node); in tipc_group_update_bc_members()
404 if (tipc_group_is_receiver(m)) { in tipc_group_update_bc_members()
405 tipc_group_update_member(m, len); in tipc_group_update_bc_members()
406 m->bc_acked = prev; in tipc_group_update_bc_members()
421 struct tipc_member *m; in tipc_group_cong() local
424 m = tipc_group_find_dest(grp, dnode, dport); in tipc_group_cong()
425 if (!tipc_group_is_receiver(m)) { in tipc_group_cong()
429 *mbr = m; in tipc_group_cong()
431 if (m->window >= len) in tipc_group_cong()
437 adv = m->advertised; in tipc_group_cong()
438 state = m->state; in tipc_group_cong()
446 tipc_group_proto_xmit(grp, m, GRP_ADV_MSG, &xmitq); in tipc_group_cong()
453 struct tipc_member *m = NULL; in tipc_group_bc_cong() local
463 m = list_first_entry(&grp->small_win, struct tipc_member, small_win); in tipc_group_bc_cong()
464 if (m->window >= len) in tipc_group_bc_cong()
467 return tipc_group_cong(grp, m->node, m->port, len, &m); in tipc_group_bc_cong()
502 struct tipc_member *m; in tipc_group_filter_msg() local
517 m = tipc_group_find_member(grp, node, port); in tipc_group_filter_msg()
518 if (!tipc_group_is_sender(m)) in tipc_group_filter_msg()
521 if (less(msg_grp_bc_seqno(hdr), m->bc_rcv_nxt)) in tipc_group_filter_msg()
524 TIPC_SKB_CB(skb)->orig_member = m->instance; in tipc_group_filter_msg()
525 defq = &m->deferredq; in tipc_group_filter_msg()
536 if (more(msg_grp_bc_seqno(hdr), m->bc_rcv_nxt)) in tipc_group_filter_msg()
548 m->bc_rcv_nxt++; in tipc_group_filter_msg()
554 if (m->state == MBR_LEAVING) in tipc_group_filter_msg()
571 tipc_group_proto_xmit(grp, m, GRP_ACK_MSG, xmitq); in tipc_group_filter_msg()
575 tipc_group_delete_member(grp, m); in tipc_group_filter_msg()
595 struct tipc_member *m, *rm, *pm; in tipc_group_update_rcv_win() local
597 m = tipc_group_find_member(grp, node, port); in tipc_group_update_rcv_win()
598 if (!m) in tipc_group_update_rcv_win()
601 m->advertised -= blks; in tipc_group_update_rcv_win()
603 switch (m->state) { in tipc_group_update_rcv_win()
607 m->state = MBR_ACTIVE; in tipc_group_update_rcv_win()
608 list_add_tail(&m->list, active); in tipc_group_update_rcv_win()
610 tipc_group_proto_xmit(grp, m, GRP_ADV_MSG, xmitq); in tipc_group_update_rcv_win()
612 m->state = MBR_PENDING; in tipc_group_update_rcv_win()
613 list_add_tail(&m->list, &grp->pending); in tipc_group_update_rcv_win()
634 if (!list_is_last(&m->list, &grp->active)) in tipc_group_update_rcv_win()
635 list_move_tail(&m->list, &grp->active); in tipc_group_update_rcv_win()
636 if (m->advertised > (ADV_ACTIVE * 3 / 4)) in tipc_group_update_rcv_win()
638 tipc_group_proto_xmit(grp, m, GRP_ADV_MSG, xmitq); in tipc_group_update_rcv_win()
641 if (m->advertised > ADV_IDLE) in tipc_group_update_rcv_win()
643 m->state = MBR_JOINED; in tipc_group_update_rcv_win()
645 if (m->advertised < ADV_IDLE) { in tipc_group_update_rcv_win()
647 tipc_group_proto_xmit(grp, m, GRP_ADV_MSG, xmitq); in tipc_group_update_rcv_win()
669 struct tipc_member *m, in tipc_group_create_event() argument
677 memset(&evt, 0, sizeof(evt)); in tipc_group_create_event()
679 evt.found_lower = m->instance; in tipc_group_create_event()
680 evt.found_upper = m->instance; in tipc_group_create_event()
681 evt.port.ref = m->port; in tipc_group_create_event()
682 evt.port.node = m->node; in tipc_group_create_event()
684 evt.s.seq.lower = m->instance; in tipc_group_create_event()
685 evt.s.seq.upper = m->instance; in tipc_group_create_event()
688 GROUP_H_SIZE, sizeof(evt), dnode, m->node, in tipc_group_create_event()
689 grp->portid, m->port, 0); in tipc_group_create_event()
699 TIPC_SKB_CB(skb)->orig_member = m->instance; in tipc_group_create_event()
703 static void tipc_group_proto_xmit(struct tipc_group *grp, struct tipc_member *m, in tipc_group_proto_xmit() argument
708 int adv = 0; in tipc_group_proto_xmit()
710 skb = tipc_msg_create(GROUP_PROTOCOL, mtyp, INT_H_SIZE, 0, in tipc_group_proto_xmit()
711 m->node, tipc_own_addr(grp->net), in tipc_group_proto_xmit()
712 m->port, grp->portid, 0); in tipc_group_proto_xmit()
716 if (m->state == MBR_ACTIVE) in tipc_group_proto_xmit()
717 adv = ADV_ACTIVE - m->advertised; in tipc_group_proto_xmit()
718 else if (m->state == MBR_JOINED || m->state == MBR_PENDING) in tipc_group_proto_xmit()
719 adv = ADV_IDLE - m->advertised; in tipc_group_proto_xmit()
726 m->advertised += adv; in tipc_group_proto_xmit()
731 m->advertised += adv; in tipc_group_proto_xmit()
733 msg_set_grp_bc_acked(hdr, m->bc_rcv_nxt); in tipc_group_proto_xmit()
735 msg_set_grp_remitted(hdr, m->window); in tipc_group_proto_xmit()
747 struct tipc_member *m, *pm; in tipc_group_proto_rcv() local
757 m = tipc_group_find_member(grp, node, port); in tipc_group_proto_rcv()
761 if (!m) in tipc_group_proto_rcv()
762 m = tipc_group_create_member(grp, node, port, in tipc_group_proto_rcv()
763 0, MBR_JOINING); in tipc_group_proto_rcv()
764 if (!m) in tipc_group_proto_rcv()
766 m->bc_syncpt = msg_grp_bc_syncpt(hdr); in tipc_group_proto_rcv()
767 m->bc_rcv_nxt = m->bc_syncpt; in tipc_group_proto_rcv()
768 m->window += msg_adv_win(hdr); in tipc_group_proto_rcv()
771 if (m->state != MBR_PUBLISHED) in tipc_group_proto_rcv()
775 m->state = MBR_JOINED; in tipc_group_proto_rcv()
776 tipc_group_open(m, usr_wakeup); in tipc_group_proto_rcv()
777 tipc_group_update_member(m, 0); in tipc_group_proto_rcv()
778 tipc_group_proto_xmit(grp, m, GRP_ADV_MSG, xmitq); in tipc_group_proto_rcv()
779 tipc_group_create_event(grp, m, TIPC_PUBLISHED, in tipc_group_proto_rcv()
780 m->bc_syncpt, inputq); in tipc_group_proto_rcv()
783 if (!m) in tipc_group_proto_rcv()
785 m->bc_syncpt = msg_grp_bc_syncpt(hdr); in tipc_group_proto_rcv()
786 list_del_init(&m->list); in tipc_group_proto_rcv()
787 tipc_group_open(m, usr_wakeup); in tipc_group_proto_rcv()
788 tipc_group_decr_active(grp, m); in tipc_group_proto_rcv()
789 m->state = MBR_LEAVING; in tipc_group_proto_rcv()
790 tipc_group_create_event(grp, m, TIPC_WITHDRAWN, in tipc_group_proto_rcv()
791 m->bc_syncpt, inputq); in tipc_group_proto_rcv()
794 if (!m) in tipc_group_proto_rcv()
796 m->window += msg_adv_win(hdr); in tipc_group_proto_rcv()
797 tipc_group_open(m, usr_wakeup); in tipc_group_proto_rcv()
800 if (!m) in tipc_group_proto_rcv()
803 if (less_eq(acked, m->bc_acked)) in tipc_group_proto_rcv()
805 m->bc_acked = acked; in tipc_group_proto_rcv()
808 list_del_init(&m->small_win); in tipc_group_proto_rcv()
809 *m->group->open = true; in tipc_group_proto_rcv()
811 tipc_group_update_member(m, 0); in tipc_group_proto_rcv()
814 if (!m) in tipc_group_proto_rcv()
816 tipc_group_proto_xmit(grp, m, GRP_REMIT_MSG, xmitq); in tipc_group_proto_rcv()
817 m->window = ADV_IDLE; in tipc_group_proto_rcv()
818 tipc_group_open(m, usr_wakeup); in tipc_group_proto_rcv()
821 if (!m || m->state != MBR_RECLAIMING) in tipc_group_proto_rcv()
827 if (m->advertised > remitted) { in tipc_group_proto_rcv()
828 m->state = MBR_REMITTED; in tipc_group_proto_rcv()
829 in_flight = m->advertised - remitted; in tipc_group_proto_rcv()
830 m->advertised = ADV_IDLE + in_flight; in tipc_group_proto_rcv()
834 if (m->advertised < remitted) in tipc_group_proto_rcv()
838 m->state = MBR_JOINED; in tipc_group_proto_rcv()
840 m->advertised = ADV_IDLE; in tipc_group_proto_rcv()
871 struct tipc_member *m; in tipc_group_member_evt() local
883 m = tipc_group_find_member(grp, node, port); in tipc_group_member_evt()
888 if (!m) { in tipc_group_member_evt()
889 m = tipc_group_create_member(grp, node, port, instance, in tipc_group_member_evt()
891 if (!m) in tipc_group_member_evt()
893 tipc_group_update_member(m, 0); in tipc_group_member_evt()
894 tipc_group_proto_xmit(grp, m, GRP_JOIN_MSG, xmitq); in tipc_group_member_evt()
898 if (m->state != MBR_JOINING) in tipc_group_member_evt()
902 m->instance = instance; in tipc_group_member_evt()
903 m->state = MBR_JOINED; in tipc_group_member_evt()
904 tipc_group_open(m, usr_wakeup); in tipc_group_member_evt()
905 tipc_group_update_member(m, 0); in tipc_group_member_evt()
906 tipc_group_proto_xmit(grp, m, GRP_JOIN_MSG, xmitq); in tipc_group_member_evt()
907 tipc_group_create_event(grp, m, TIPC_PUBLISHED, in tipc_group_member_evt()
908 m->bc_syncpt, inputq); in tipc_group_member_evt()
911 if (!m) in tipc_group_member_evt()
914 tipc_group_decr_active(grp, m); in tipc_group_member_evt()
915 m->state = MBR_LEAVING; in tipc_group_member_evt()
916 list_del_init(&m->list); in tipc_group_member_evt()
917 tipc_group_open(m, usr_wakeup); in tipc_group_member_evt()
921 tipc_group_create_event(grp, m, TIPC_WITHDRAWN, in tipc_group_member_evt()
922 m->bc_rcv_nxt, inputq); in tipc_group_member_evt()
958 return 0; in tipc_group_fill_sock_diag()