Lines Matching +full:- +full:grp

102 static void tipc_group_proto_xmit(struct tipc_group *grp, struct tipc_member *m,
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()
115 static void tipc_group_decr_active(struct tipc_group *grp, 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()
120 grp->active_cnt--; in tipc_group_decr_active()
123 static int tipc_group_rcvbuf_limit(struct tipc_group *grp) in tipc_group_rcvbuf_limit() argument
126 int mcnt = grp->member_cnt + 1; in tipc_group_rcvbuf_limit()
131 grp->max_active = max_active; in tipc_group_rcvbuf_limit()
135 idle_pool = (mcnt - max_active) * ADV_IDLE; in tipc_group_rcvbuf_limit()
137 /* Scale to bytes, considering worst-case truesize/msgsize ratio */ in tipc_group_rcvbuf_limit()
141 u16 tipc_group_bc_snd_nxt(struct tipc_group *grp) in tipc_group_bc_snd_nxt() argument
143 return grp->bc_snd_nxt; in tipc_group_bc_snd_nxt()
148 return m && m->state != MBR_JOINING && m->state != MBR_LEAVING; in tipc_group_is_receiver()
153 return m && m->state != MBR_JOINING && m->state != MBR_PUBLISHED; in tipc_group_is_sender()
156 u32 tipc_group_exclude(struct tipc_group *grp) in tipc_group_exclude() argument
158 if (!grp->loopback) in tipc_group_exclude()
159 return grp->portid; in tipc_group_exclude()
168 bool global = mreq->scope != TIPC_NODE_SCOPE; in tipc_group_create()
169 struct tipc_group *grp; in tipc_group_create() local
170 u32 type = mreq->type; in tipc_group_create()
172 grp = kzalloc(sizeof(*grp), GFP_ATOMIC); in tipc_group_create()
173 if (!grp) in tipc_group_create()
175 tipc_nlist_init(&grp->dests, tipc_own_addr(net)); in tipc_group_create()
176 INIT_LIST_HEAD(&grp->small_win); in tipc_group_create()
177 INIT_LIST_HEAD(&grp->active); in tipc_group_create()
178 INIT_LIST_HEAD(&grp->pending); in tipc_group_create()
179 grp->members = RB_ROOT; in tipc_group_create()
180 grp->net = net; in tipc_group_create()
181 grp->portid = portid; in tipc_group_create()
182 grp->type = type; in tipc_group_create()
183 grp->instance = mreq->instance; in tipc_group_create()
184 grp->scope = mreq->scope; in tipc_group_create()
185 grp->loopback = mreq->flags & TIPC_GROUP_LOOPBACK; in tipc_group_create()
186 grp->events = mreq->flags & TIPC_GROUP_MEMBER_EVTS; in tipc_group_create()
187 grp->open = group_is_open; in tipc_group_create()
188 *grp->open = false; in tipc_group_create()
191 filter, &grp->subid)) in tipc_group_create()
192 return grp; in tipc_group_create()
193 kfree(grp); in tipc_group_create()
197 void tipc_group_join(struct net *net, struct tipc_group *grp, int *sk_rcvbuf) in tipc_group_join() argument
199 struct rb_root *tree = &grp->members; in tipc_group_join()
205 tipc_group_proto_xmit(grp, m, GRP_JOIN_MSG, &xmitq); in tipc_group_join()
209 *sk_rcvbuf = tipc_group_rcvbuf_limit(grp); in tipc_group_join()
212 void tipc_group_delete(struct net *net, struct tipc_group *grp) in tipc_group_delete() argument
214 struct rb_root *tree = &grp->members; 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()
227 tipc_nlist_purge(&grp->dests); in tipc_group_delete()
228 tipc_topsrv_kern_unsubscr(net, grp->subid); in tipc_group_delete()
229 kfree(grp); in tipc_group_delete()
232 static struct tipc_member *tipc_group_find_member(struct tipc_group *grp, in tipc_group_find_member() argument
235 struct rb_node *n = grp->members.rb_node; in tipc_group_find_member()
241 nkey = (u64)m->node << 32 | m->port; in tipc_group_find_member()
243 n = n->rb_left; in tipc_group_find_member()
245 n = n->rb_right; in tipc_group_find_member()
252 static struct tipc_member *tipc_group_find_dest(struct tipc_group *grp, in tipc_group_find_dest() argument
257 m = tipc_group_find_member(grp, node, port); in tipc_group_find_dest()
263 static struct tipc_member *tipc_group_find_node(struct tipc_group *grp, in tipc_group_find_node() argument
269 for (n = rb_first(&grp->members); n; n = rb_next(n)) { in tipc_group_find_node()
271 if (m->node == node) in tipc_group_find_node()
277 static int tipc_group_add_to_tree(struct tipc_group *grp, in tipc_group_add_to_tree() argument
280 u64 nkey, key = (u64)m->node << 32 | m->port; in tipc_group_add_to_tree()
284 n = &grp->members.rb_node; in tipc_group_add_to_tree()
289 nkey = (u64)tmp->node << 32 | tmp->port; in tipc_group_add_to_tree()
291 n = &(*n)->rb_left; in tipc_group_add_to_tree()
293 n = &(*n)->rb_right; in tipc_group_add_to_tree()
295 return -EEXIST; 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()
302 static struct tipc_member *tipc_group_create_member(struct tipc_group *grp, in tipc_group_create_member() argument
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()
325 grp->member_cnt++; 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()
331 void tipc_group_add_member(struct tipc_group *grp, u32 node, in tipc_group_add_member() argument
334 tipc_group_create_member(grp, node, port, instance, MBR_PUBLISHED); in tipc_group_add_member()
337 static void tipc_group_delete_member(struct tipc_group *grp, in tipc_group_delete_member() argument
340 rb_erase(&m->tree_node, &grp->members); in tipc_group_delete_member()
341 grp->member_cnt--; in tipc_group_delete_member()
344 if (grp->bc_ackers && less(m->bc_acked, grp->bc_snd_nxt - 1)) in tipc_group_delete_member()
345 grp->bc_ackers--; 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()
358 struct tipc_nlist *tipc_group_dests(struct tipc_group *grp) in tipc_group_dests() argument
360 return &grp->dests; in tipc_group_dests()
363 void tipc_group_self(struct tipc_group *grp, struct tipc_service_range *seq, in tipc_group_self() argument
366 seq->type = grp->type; in tipc_group_self()
367 seq->lower = grp->instance; in tipc_group_self()
368 seq->upper = grp->instance; in tipc_group_self()
369 *scope = grp->scope; in tipc_group_self()
374 struct tipc_group *grp = m->group; in tipc_group_update_member() local
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()
388 list_for_each_entry_safe(_m, tmp, &grp->small_win, 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()
395 void tipc_group_update_bc_members(struct tipc_group *grp, int len, bool ack) in tipc_group_update_bc_members() argument
397 u16 prev = grp->bc_snd_nxt - 1; in tipc_group_update_bc_members()
402 for (n = rb_first(&grp->members); n; n = rb_next(n)) { in tipc_group_update_bc_members()
406 m->bc_acked = prev; in tipc_group_update_bc_members()
413 grp->bc_ackers = ackers; in tipc_group_update_bc_members()
414 grp->bc_snd_nxt++; in tipc_group_update_bc_members()
417 bool tipc_group_cong(struct tipc_group *grp, u32 dnode, u32 dport, in tipc_group_cong() argument
424 m = tipc_group_find_dest(grp, dnode, dport); in tipc_group_cong()
431 if (m->window >= len) in tipc_group_cong()
434 *grp->open = false; 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()
447 tipc_node_distr_xmit(grp->net, &xmitq); in tipc_group_cong()
451 bool tipc_group_bc_cong(struct tipc_group *grp, int len) in tipc_group_bc_cong() argument
456 if (grp->bc_ackers) { in tipc_group_bc_cong()
457 *grp->open = false; in tipc_group_bc_cong()
460 if (list_empty(&grp->small_win)) in tipc_group_bc_cong()
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()
470 /* tipc_group_sort_msg() - sort msg into queue by bcast sequence number
479 /* Bcast/mcast may be bypassed by ucast or other bcast, - sort it in */ in tipc_group_sort_msg()
488 /* Bcast was not bypassed, - add to tail */ in tipc_group_sort_msg()
490 /* Unicasts are never bypassed, - always add to tail */ in tipc_group_sort_msg()
494 /* tipc_group_filter_msg() - determine if we should accept arriving message
496 void tipc_group_filter_msg(struct tipc_group *grp, struct sk_buff_head *inputq, in tipc_group_filter_msg() argument
517 m = tipc_group_find_member(grp, node, port); 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()
542 if (msg_nameinst(hdr) != grp->instance) { 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()
556 if (!grp->events) 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()
581 tipc_group_update_rcv_win(grp, blks, node, port, xmitq); in tipc_group_filter_msg()
588 void tipc_group_update_rcv_win(struct tipc_group *grp, int blks, u32 node, in tipc_group_update_rcv_win() argument
591 struct list_head *active = &grp->active; in tipc_group_update_rcv_win()
592 int max_active = grp->max_active; in tipc_group_update_rcv_win()
594 int active_cnt = grp->active_cnt; in tipc_group_update_rcv_win()
597 m = tipc_group_find_member(grp, node, port); 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()
609 grp->active_cnt++; 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()
622 rm->state = MBR_RECLAIMING; in tipc_group_update_rcv_win()
623 list_del_init(&rm->list); in tipc_group_update_rcv_win()
624 tipc_group_proto_xmit(grp, rm, GRP_RECLAIM_MSG, xmitq); in tipc_group_update_rcv_win()
627 /* Nobody to reclaim from; - revert oldest pending to JOINED */ in tipc_group_update_rcv_win()
628 pm = list_first_entry(&grp->pending, struct tipc_member, list); in tipc_group_update_rcv_win()
629 list_del_init(&pm->list); in tipc_group_update_rcv_win()
630 pm->state = MBR_JOINED; in tipc_group_update_rcv_win()
631 tipc_group_proto_xmit(grp, pm, GRP_ADV_MSG, xmitq); 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()
644 grp->active_cnt--; 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()
650 if (list_empty(&grp->pending)) in tipc_group_update_rcv_win()
654 pm = list_first_entry(&grp->pending, struct tipc_member, list); in tipc_group_update_rcv_win()
655 pm->state = MBR_ACTIVE; in tipc_group_update_rcv_win()
656 list_move_tail(&pm->list, &grp->active); in tipc_group_update_rcv_win()
657 grp->active_cnt++; in tipc_group_update_rcv_win()
658 tipc_group_proto_xmit(grp, pm, GRP_ADV_MSG, xmitq); in tipc_group_update_rcv_win()
668 static void tipc_group_create_event(struct tipc_group *grp, in tipc_group_create_event() argument
672 { u32 dnode = tipc_own_addr(grp->net); 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()
683 evt.s.seq.type = grp->type; 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()
694 msg_set_nametype(hdr, grp->type); 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
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()
724 msg_set_grp_bc_syncpt(hdr, grp->bc_snd_nxt); in tipc_group_proto_xmit()
726 m->advertised += adv; in tipc_group_proto_xmit()
728 msg_set_grp_bc_syncpt(hdr, grp->bc_snd_nxt); 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()
741 void tipc_group_proto_rcv(struct tipc_group *grp, bool *usr_wakeup, in tipc_group_proto_rcv() argument
750 if (!grp) in tipc_group_proto_rcv()
753 if (grp->scope == TIPC_NODE_SCOPE && node != tipc_own_addr(grp->net)) in tipc_group_proto_rcv()
756 m = tipc_group_find_member(grp, node, port); in tipc_group_proto_rcv()
761 m = tipc_group_create_member(grp, node, port, in tipc_group_proto_rcv()
765 m->bc_syncpt = msg_grp_bc_syncpt(hdr); in tipc_group_proto_rcv()
766 m->bc_rcv_nxt = m->bc_syncpt; in tipc_group_proto_rcv()
767 m->window += msg_adv_win(hdr); in tipc_group_proto_rcv()
770 if (m->state != MBR_PUBLISHED) in tipc_group_proto_rcv()
774 m->state = MBR_JOINED; in tipc_group_proto_rcv()
777 tipc_group_proto_xmit(grp, m, GRP_ADV_MSG, xmitq); in tipc_group_proto_rcv()
778 tipc_group_create_event(grp, m, TIPC_PUBLISHED, in tipc_group_proto_rcv()
779 m->bc_syncpt, inputq); in tipc_group_proto_rcv()
784 m->bc_syncpt = msg_grp_bc_syncpt(hdr); in tipc_group_proto_rcv()
785 list_del_init(&m->list); in tipc_group_proto_rcv()
787 tipc_group_decr_active(grp, m); in tipc_group_proto_rcv()
788 m->state = MBR_LEAVING; in tipc_group_proto_rcv()
789 tipc_group_create_event(grp, m, TIPC_WITHDRAWN, in tipc_group_proto_rcv()
790 m->bc_syncpt, inputq); in tipc_group_proto_rcv()
795 m->window += msg_adv_win(hdr); in tipc_group_proto_rcv()
801 m->bc_acked = msg_grp_bc_acked(hdr); in tipc_group_proto_rcv()
802 if (--grp->bc_ackers) in tipc_group_proto_rcv()
804 list_del_init(&m->small_win); in tipc_group_proto_rcv()
805 *m->group->open = true; in tipc_group_proto_rcv()
812 tipc_group_proto_xmit(grp, m, GRP_REMIT_MSG, xmitq); in tipc_group_proto_rcv()
813 m->window = ADV_IDLE; in tipc_group_proto_rcv()
817 if (!m || m->state != MBR_RECLAIMING) in tipc_group_proto_rcv()
823 if (m->advertised > remitted) { in tipc_group_proto_rcv()
824 m->state = MBR_REMITTED; in tipc_group_proto_rcv()
825 in_flight = m->advertised - remitted; in tipc_group_proto_rcv()
826 m->advertised = ADV_IDLE + in_flight; in tipc_group_proto_rcv()
830 if (m->advertised < remitted) in tipc_group_proto_rcv()
834 m->state = MBR_JOINED; in tipc_group_proto_rcv()
835 grp->active_cnt--; in tipc_group_proto_rcv()
836 m->advertised = ADV_IDLE; in tipc_group_proto_rcv()
839 if (list_empty(&grp->pending)) in tipc_group_proto_rcv()
841 pm = list_first_entry(&grp->pending, struct tipc_member, list); in tipc_group_proto_rcv()
842 pm->state = MBR_ACTIVE; in tipc_group_proto_rcv()
843 list_move_tail(&pm->list, &grp->active); in tipc_group_proto_rcv()
844 grp->active_cnt++; in tipc_group_proto_rcv()
845 if (pm->advertised <= (ADV_ACTIVE * 3 / 4)) in tipc_group_proto_rcv()
846 tipc_group_proto_xmit(grp, pm, GRP_ADV_MSG, xmitq); in tipc_group_proto_rcv()
853 /* tipc_group_member_evt() - receive and handle a member up/down event
855 void tipc_group_member_evt(struct tipc_group *grp, in tipc_group_member_evt() argument
863 u32 instance = evt->found_lower; in tipc_group_member_evt()
864 u32 node = evt->port.node; in tipc_group_member_evt()
865 u32 port = evt->port.ref; in tipc_group_member_evt()
866 int event = evt->event; in tipc_group_member_evt()
871 if (!grp) in tipc_group_member_evt()
874 net = grp->net; in tipc_group_member_evt()
876 if (!grp->loopback && node == self && port == grp->portid) in tipc_group_member_evt()
879 m = tipc_group_find_member(grp, node, port); in tipc_group_member_evt()
885 m = tipc_group_create_member(grp, node, port, instance, in tipc_group_member_evt()
890 tipc_group_proto_xmit(grp, m, GRP_JOIN_MSG, xmitq); in tipc_group_member_evt()
894 if (m->state != MBR_JOINING) in tipc_group_member_evt()
898 m->instance = instance; in tipc_group_member_evt()
899 m->state = MBR_JOINED; in tipc_group_member_evt()
902 tipc_group_proto_xmit(grp, m, GRP_JOIN_MSG, xmitq); in tipc_group_member_evt()
903 tipc_group_create_event(grp, m, TIPC_PUBLISHED, in tipc_group_member_evt()
904 m->bc_syncpt, inputq); in tipc_group_member_evt()
910 tipc_group_decr_active(grp, m); in tipc_group_member_evt()
911 m->state = MBR_LEAVING; in tipc_group_member_evt()
912 list_del_init(&m->list); in tipc_group_member_evt()
917 tipc_group_create_event(grp, m, TIPC_WITHDRAWN, in tipc_group_member_evt()
918 m->bc_rcv_nxt, inputq); in tipc_group_member_evt()
923 *sk_rcvbuf = tipc_group_rcvbuf_limit(grp); in tipc_group_member_evt()
926 int tipc_group_fill_sock_diag(struct tipc_group *grp, struct sk_buff *skb) in tipc_group_fill_sock_diag() argument
931 return -EMSGSIZE; in tipc_group_fill_sock_diag()
934 grp->type) || in tipc_group_fill_sock_diag()
936 grp->instance) || in tipc_group_fill_sock_diag()
938 grp->bc_snd_nxt)) in tipc_group_fill_sock_diag()
941 if (grp->scope == TIPC_NODE_SCOPE) in tipc_group_fill_sock_diag()
945 if (grp->scope == TIPC_CLUSTER_SCOPE) in tipc_group_fill_sock_diag()
949 if (*grp->open) in tipc_group_fill_sock_diag()
958 return -1; in tipc_group_fill_sock_diag()