Lines Matching refs:grp

101 static void tipc_group_proto_xmit(struct tipc_group *grp, struct tipc_member *m,
114 static void tipc_group_decr_active(struct tipc_group *grp, in tipc_group_decr_active() argument
119 grp->active_cnt--; in tipc_group_decr_active()
122 static int tipc_group_rcvbuf_limit(struct tipc_group *grp) in tipc_group_rcvbuf_limit() argument
125 int mcnt = grp->member_cnt + 1; in tipc_group_rcvbuf_limit()
130 grp->max_active = max_active; in tipc_group_rcvbuf_limit()
140 u16 tipc_group_bc_snd_nxt(struct tipc_group *grp) in tipc_group_bc_snd_nxt() argument
142 return grp->bc_snd_nxt; in tipc_group_bc_snd_nxt()
155 u32 tipc_group_exclude(struct tipc_group *grp) in tipc_group_exclude() argument
157 if (!grp->loopback) in tipc_group_exclude()
158 return grp->portid; in tipc_group_exclude()
168 struct tipc_group *grp; in tipc_group_create() local
171 grp = kzalloc(sizeof(*grp), GFP_ATOMIC); in tipc_group_create()
172 if (!grp) in tipc_group_create()
174 tipc_nlist_init(&grp->dests, tipc_own_addr(net)); in tipc_group_create()
175 INIT_LIST_HEAD(&grp->small_win); in tipc_group_create()
176 INIT_LIST_HEAD(&grp->active); in tipc_group_create()
177 INIT_LIST_HEAD(&grp->pending); in tipc_group_create()
178 grp->members = RB_ROOT; in tipc_group_create()
179 grp->net = net; in tipc_group_create()
180 grp->portid = portid; in tipc_group_create()
181 grp->type = type; in tipc_group_create()
182 grp->instance = mreq->instance; in tipc_group_create()
183 grp->scope = mreq->scope; in tipc_group_create()
184 grp->loopback = mreq->flags & TIPC_GROUP_LOOPBACK; in tipc_group_create()
185 grp->events = mreq->flags & TIPC_GROUP_MEMBER_EVTS; in tipc_group_create()
186 grp->open = group_is_open; in tipc_group_create()
187 *grp->open = false; in tipc_group_create()
190 filter, &grp->subid)) in tipc_group_create()
191 return grp; in tipc_group_create()
192 kfree(grp); in tipc_group_create()
196 void tipc_group_join(struct net *net, struct tipc_group *grp, int *sk_rcvbuf) in tipc_group_join() argument
198 struct rb_root *tree = &grp->members; in tipc_group_join()
204 tipc_group_proto_xmit(grp, m, GRP_JOIN_MSG, &xmitq); in tipc_group_join()
208 *sk_rcvbuf = tipc_group_rcvbuf_limit(grp); in tipc_group_join()
211 void tipc_group_delete(struct net *net, struct tipc_group *grp) in tipc_group_delete() argument
213 struct rb_root *tree = &grp->members; in tipc_group_delete()
220 tipc_group_proto_xmit(grp, m, GRP_LEAVE_MSG, &xmitq); in tipc_group_delete()
225 tipc_nlist_purge(&grp->dests); in tipc_group_delete()
226 tipc_topsrv_kern_unsubscr(net, grp->subid); in tipc_group_delete()
227 kfree(grp); in tipc_group_delete()
230 static struct tipc_member *tipc_group_find_member(struct tipc_group *grp, in tipc_group_find_member() argument
233 struct rb_node *n = grp->members.rb_node; in tipc_group_find_member()
250 static struct tipc_member *tipc_group_find_dest(struct tipc_group *grp, in tipc_group_find_dest() argument
255 m = tipc_group_find_member(grp, node, port); in tipc_group_find_dest()
261 static struct tipc_member *tipc_group_find_node(struct tipc_group *grp, in tipc_group_find_node() argument
267 for (n = rb_first(&grp->members); n; n = rb_next(n)) { in tipc_group_find_node()
275 static void tipc_group_add_to_tree(struct tipc_group *grp, in tipc_group_add_to_tree() argument
282 n = &grp->members.rb_node; in tipc_group_add_to_tree()
296 rb_insert_color(&m->tree_node, &grp->members); in tipc_group_add_to_tree()
299 static struct tipc_member *tipc_group_create_member(struct tipc_group *grp, in tipc_group_create_member() argument
311 m->group = grp; in tipc_group_create_member()
315 m->bc_acked = grp->bc_snd_nxt - 1; in tipc_group_create_member()
316 grp->member_cnt++; in tipc_group_create_member()
317 tipc_group_add_to_tree(grp, m); in tipc_group_create_member()
318 tipc_nlist_add(&grp->dests, m->node); in tipc_group_create_member()
323 void tipc_group_add_member(struct tipc_group *grp, u32 node, in tipc_group_add_member() argument
326 tipc_group_create_member(grp, node, port, instance, MBR_PUBLISHED); in tipc_group_add_member()
329 static void tipc_group_delete_member(struct tipc_group *grp, in tipc_group_delete_member() argument
332 rb_erase(&m->tree_node, &grp->members); in tipc_group_delete_member()
333 grp->member_cnt--; in tipc_group_delete_member()
336 if (grp->bc_ackers && less(m->bc_acked, grp->bc_snd_nxt - 1)) in tipc_group_delete_member()
337 grp->bc_ackers--; in tipc_group_delete_member()
341 tipc_group_decr_active(grp, m); in tipc_group_delete_member()
344 if (!tipc_group_find_node(grp, m->node)) in tipc_group_delete_member()
345 tipc_nlist_del(&grp->dests, m->node); in tipc_group_delete_member()
350 struct tipc_nlist *tipc_group_dests(struct tipc_group *grp) in tipc_group_dests() argument
352 return &grp->dests; in tipc_group_dests()
355 void tipc_group_self(struct tipc_group *grp, struct tipc_name_seq *seq, in tipc_group_self() argument
358 seq->type = grp->type; in tipc_group_self()
359 seq->lower = grp->instance; in tipc_group_self()
360 seq->upper = grp->instance; in tipc_group_self()
361 *scope = grp->scope; in tipc_group_self()
366 struct tipc_group *grp = m->group; in tipc_group_update_member() local
380 list_for_each_entry_safe(_m, tmp, &grp->small_win, small_win) { in tipc_group_update_member()
387 void tipc_group_update_bc_members(struct tipc_group *grp, int len, bool ack) in tipc_group_update_bc_members() argument
389 u16 prev = grp->bc_snd_nxt - 1; in tipc_group_update_bc_members()
394 for (n = rb_first(&grp->members); n; n = rb_next(n)) { in tipc_group_update_bc_members()
405 grp->bc_ackers = ackers; in tipc_group_update_bc_members()
406 grp->bc_snd_nxt++; in tipc_group_update_bc_members()
409 bool tipc_group_cong(struct tipc_group *grp, u32 dnode, u32 dport, in tipc_group_cong() argument
416 m = tipc_group_find_dest(grp, dnode, dport); in tipc_group_cong()
426 *grp->open = false; in tipc_group_cong()
438 tipc_group_proto_xmit(grp, m, GRP_ADV_MSG, &xmitq); in tipc_group_cong()
439 tipc_node_distr_xmit(grp->net, &xmitq); in tipc_group_cong()
443 bool tipc_group_bc_cong(struct tipc_group *grp, int len) in tipc_group_bc_cong() argument
448 if (grp->bc_ackers) { in tipc_group_bc_cong()
449 *grp->open = false; in tipc_group_bc_cong()
452 if (list_empty(&grp->small_win)) in tipc_group_bc_cong()
455 m = list_first_entry(&grp->small_win, struct tipc_member, small_win); in tipc_group_bc_cong()
459 return tipc_group_cong(grp, m->node, m->port, len, &m); in tipc_group_bc_cong()
488 void tipc_group_filter_msg(struct tipc_group *grp, struct sk_buff_head *inputq, in tipc_group_filter_msg() argument
509 m = tipc_group_find_member(grp, node, port); in tipc_group_filter_msg()
534 if (msg_nameinst(hdr) != grp->instance) { in tipc_group_filter_msg()
548 if (!grp->events) in tipc_group_filter_msg()
563 tipc_group_proto_xmit(grp, m, GRP_ACK_MSG, xmitq); in tipc_group_filter_msg()
567 tipc_group_delete_member(grp, m); in tipc_group_filter_msg()
573 tipc_group_update_rcv_win(grp, blks, node, port, xmitq); in tipc_group_filter_msg()
580 void tipc_group_update_rcv_win(struct tipc_group *grp, int blks, u32 node, in tipc_group_update_rcv_win() argument
583 struct list_head *active = &grp->active; in tipc_group_update_rcv_win()
584 int max_active = grp->max_active; in tipc_group_update_rcv_win()
586 int active_cnt = grp->active_cnt; in tipc_group_update_rcv_win()
589 m = tipc_group_find_member(grp, node, port); in tipc_group_update_rcv_win()
601 grp->active_cnt++; in tipc_group_update_rcv_win()
602 tipc_group_proto_xmit(grp, m, GRP_ADV_MSG, xmitq); in tipc_group_update_rcv_win()
605 list_add_tail(&m->list, &grp->pending); in tipc_group_update_rcv_win()
616 tipc_group_proto_xmit(grp, rm, GRP_RECLAIM_MSG, xmitq); in tipc_group_update_rcv_win()
620 pm = list_first_entry(&grp->pending, struct tipc_member, list); in tipc_group_update_rcv_win()
623 tipc_group_proto_xmit(grp, pm, GRP_ADV_MSG, xmitq); in tipc_group_update_rcv_win()
626 if (!list_is_last(&m->list, &grp->active)) in tipc_group_update_rcv_win()
627 list_move_tail(&m->list, &grp->active); in tipc_group_update_rcv_win()
630 tipc_group_proto_xmit(grp, m, GRP_ADV_MSG, xmitq); in tipc_group_update_rcv_win()
636 grp->active_cnt--; in tipc_group_update_rcv_win()
639 tipc_group_proto_xmit(grp, m, GRP_ADV_MSG, xmitq); in tipc_group_update_rcv_win()
642 if (list_empty(&grp->pending)) in tipc_group_update_rcv_win()
646 pm = list_first_entry(&grp->pending, struct tipc_member, list); in tipc_group_update_rcv_win()
648 list_move_tail(&pm->list, &grp->active); in tipc_group_update_rcv_win()
649 grp->active_cnt++; in tipc_group_update_rcv_win()
650 tipc_group_proto_xmit(grp, pm, GRP_ADV_MSG, xmitq); in tipc_group_update_rcv_win()
660 static void tipc_group_create_event(struct tipc_group *grp, in tipc_group_create_event() argument
664 { u32 dnode = tipc_own_addr(grp->net); in tipc_group_create_event()
675 evt.s.seq.type = grp->type; in tipc_group_create_event()
681 grp->portid, m->port, 0); in tipc_group_create_event()
686 msg_set_nametype(hdr, grp->type); in tipc_group_create_event()
695 static void tipc_group_proto_xmit(struct tipc_group *grp, struct tipc_member *m, in tipc_group_proto_xmit() argument
703 m->node, tipc_own_addr(grp->net), in tipc_group_proto_xmit()
704 m->port, grp->portid, 0); in tipc_group_proto_xmit()
716 msg_set_grp_bc_syncpt(hdr, grp->bc_snd_nxt); in tipc_group_proto_xmit()
720 msg_set_grp_bc_syncpt(hdr, grp->bc_snd_nxt); in tipc_group_proto_xmit()
733 void tipc_group_proto_rcv(struct tipc_group *grp, bool *usr_wakeup, in tipc_group_proto_rcv() argument
742 if (!grp) in tipc_group_proto_rcv()
745 if (grp->scope == TIPC_NODE_SCOPE && node != tipc_own_addr(grp->net)) in tipc_group_proto_rcv()
748 m = tipc_group_find_member(grp, node, port); in tipc_group_proto_rcv()
753 m = tipc_group_create_member(grp, node, port, in tipc_group_proto_rcv()
769 tipc_group_proto_xmit(grp, m, GRP_ADV_MSG, xmitq); in tipc_group_proto_rcv()
770 tipc_group_create_event(grp, m, TIPC_PUBLISHED, in tipc_group_proto_rcv()
779 tipc_group_decr_active(grp, m); in tipc_group_proto_rcv()
781 tipc_group_create_event(grp, m, TIPC_WITHDRAWN, in tipc_group_proto_rcv()
794 if (--grp->bc_ackers) in tipc_group_proto_rcv()
804 tipc_group_proto_xmit(grp, m, GRP_REMIT_MSG, xmitq); in tipc_group_proto_rcv()
827 grp->active_cnt--; in tipc_group_proto_rcv()
831 if (list_empty(&grp->pending)) in tipc_group_proto_rcv()
833 pm = list_first_entry(&grp->pending, struct tipc_member, list); in tipc_group_proto_rcv()
835 list_move_tail(&pm->list, &grp->active); in tipc_group_proto_rcv()
836 grp->active_cnt++; in tipc_group_proto_rcv()
838 tipc_group_proto_xmit(grp, pm, GRP_ADV_MSG, xmitq); in tipc_group_proto_rcv()
847 void tipc_group_member_evt(struct tipc_group *grp, in tipc_group_member_evt() argument
863 if (!grp) in tipc_group_member_evt()
866 net = grp->net; in tipc_group_member_evt()
868 if (!grp->loopback && node == self && port == grp->portid) in tipc_group_member_evt()
871 m = tipc_group_find_member(grp, node, port); in tipc_group_member_evt()
877 m = tipc_group_create_member(grp, node, port, instance, in tipc_group_member_evt()
882 tipc_group_proto_xmit(grp, m, GRP_JOIN_MSG, xmitq); in tipc_group_member_evt()
894 tipc_group_proto_xmit(grp, m, GRP_JOIN_MSG, xmitq); in tipc_group_member_evt()
895 tipc_group_create_event(grp, m, TIPC_PUBLISHED, in tipc_group_member_evt()
902 tipc_group_decr_active(grp, m); in tipc_group_member_evt()
909 tipc_group_create_event(grp, m, TIPC_WITHDRAWN, in tipc_group_member_evt()
915 *sk_rcvbuf = tipc_group_rcvbuf_limit(grp); in tipc_group_member_evt()
918 int tipc_group_fill_sock_diag(struct tipc_group *grp, struct sk_buff *skb) in tipc_group_fill_sock_diag() argument
923 grp->type) || in tipc_group_fill_sock_diag()
925 grp->instance) || in tipc_group_fill_sock_diag()
927 grp->bc_snd_nxt)) in tipc_group_fill_sock_diag()
930 if (grp->scope == TIPC_NODE_SCOPE) in tipc_group_fill_sock_diag()
934 if (grp->scope == TIPC_CLUSTER_SCOPE) in tipc_group_fill_sock_diag()
938 if (*grp->open) in tipc_group_fill_sock_diag()