Lines Matching refs:grp

102 static void tipc_group_proto_xmit(struct tipc_group *grp, struct tipc_member *m,
115 static void tipc_group_decr_active(struct tipc_group *grp,
120 grp->active_cnt--;
123 static int tipc_group_rcvbuf_limit(struct tipc_group *grp)
126 int mcnt = grp->member_cnt + 1;
131 grp->max_active = max_active;
141 u16 tipc_group_bc_snd_nxt(struct tipc_group *grp)
143 return grp->bc_snd_nxt;
156 u32 tipc_group_exclude(struct tipc_group *grp)
158 if (!grp->loopback)
159 return grp->portid;
169 struct tipc_group *grp;
172 grp = kzalloc(sizeof(*grp), GFP_ATOMIC);
173 if (!grp)
175 tipc_nlist_init(&grp->dests, tipc_own_addr(net));
176 INIT_LIST_HEAD(&grp->small_win);
177 INIT_LIST_HEAD(&grp->active);
178 INIT_LIST_HEAD(&grp->pending);
179 grp->members = RB_ROOT;
180 grp->net = net;
181 grp->portid = portid;
182 grp->type = type;
183 grp->instance = mreq->instance;
184 grp->scope = mreq->scope;
185 grp->loopback = mreq->flags & TIPC_GROUP_LOOPBACK;
186 grp->events = mreq->flags & TIPC_GROUP_MEMBER_EVTS;
187 grp->open = group_is_open;
188 *grp->open = false;
191 filter, &grp->subid))
192 return grp;
193 kfree(grp);
197 void tipc_group_join(struct net *net, struct tipc_group *grp, int *sk_rcvbuf)
199 struct rb_root *tree = &grp->members;
205 tipc_group_proto_xmit(grp, m, GRP_JOIN_MSG, &xmitq);
209 *sk_rcvbuf = tipc_group_rcvbuf_limit(grp);
212 void tipc_group_delete(struct net *net, struct tipc_group *grp)
214 struct rb_root *tree = &grp->members;
221 tipc_group_proto_xmit(grp, m, GRP_LEAVE_MSG, &xmitq);
227 tipc_nlist_purge(&grp->dests);
228 tipc_topsrv_kern_unsubscr(net, grp->subid);
229 kfree(grp);
232 static struct tipc_member *tipc_group_find_member(struct tipc_group *grp,
235 struct rb_node *n = grp->members.rb_node;
252 static struct tipc_member *tipc_group_find_dest(struct tipc_group *grp,
257 m = tipc_group_find_member(grp, node, port);
263 static struct tipc_member *tipc_group_find_node(struct tipc_group *grp,
269 for (n = rb_first(&grp->members); n; n = rb_next(n)) {
277 static int tipc_group_add_to_tree(struct tipc_group *grp,
284 n = &grp->members.rb_node;
298 rb_insert_color(&m->tree_node, &grp->members);
302 static struct tipc_member *tipc_group_create_member(struct tipc_group *grp,
315 m->group = grp;
319 m->bc_acked = grp->bc_snd_nxt - 1;
320 ret = tipc_group_add_to_tree(grp, m);
325 grp->member_cnt++;
326 tipc_nlist_add(&grp->dests, m->node);
331 void tipc_group_add_member(struct tipc_group *grp, u32 node,
334 tipc_group_create_member(grp, node, port, instance, MBR_PUBLISHED);
337 static void tipc_group_delete_member(struct tipc_group *grp,
340 rb_erase(&m->tree_node, &grp->members);
341 grp->member_cnt--;
344 if (grp->bc_ackers && less(m->bc_acked, grp->bc_snd_nxt - 1))
345 grp->bc_ackers--;
349 tipc_group_decr_active(grp, m);
352 if (!tipc_group_find_node(grp, m->node))
353 tipc_nlist_del(&grp->dests, m->node);
358 struct tipc_nlist *tipc_group_dests(struct tipc_group *grp)
360 return &grp->dests;
363 void tipc_group_self(struct tipc_group *grp, struct tipc_service_range *seq,
366 seq->type = grp->type;
367 seq->lower = grp->instance;
368 seq->upper = grp->instance;
369 *scope = grp->scope;
374 struct tipc_group *grp = m->group;
388 list_for_each_entry_safe(_m, tmp, &grp->small_win, small_win) {
395 void tipc_group_update_bc_members(struct tipc_group *grp, int len, bool ack)
397 u16 prev = grp->bc_snd_nxt - 1;
402 for (n = rb_first(&grp->members); n; n = rb_next(n)) {
413 grp->bc_ackers = ackers;
414 grp->bc_snd_nxt++;
417 bool tipc_group_cong(struct tipc_group *grp, u32 dnode, u32 dport,
424 m = tipc_group_find_dest(grp, dnode, dport);
434 *grp->open = false;
446 tipc_group_proto_xmit(grp, m, GRP_ADV_MSG, &xmitq);
447 tipc_node_distr_xmit(grp->net, &xmitq);
451 bool tipc_group_bc_cong(struct tipc_group *grp, int len)
456 if (grp->bc_ackers) {
457 *grp->open = false;
460 if (list_empty(&grp->small_win))
463 m = list_first_entry(&grp->small_win, struct tipc_member, small_win);
467 return tipc_group_cong(grp, m->node, m->port, len, &m);
496 void tipc_group_filter_msg(struct tipc_group *grp, struct sk_buff_head *inputq,
517 m = tipc_group_find_member(grp, node, port);
542 if (msg_nameinst(hdr) != grp->instance) {
556 if (!grp->events)
571 tipc_group_proto_xmit(grp, m, GRP_ACK_MSG, xmitq);
575 tipc_group_delete_member(grp, m);
581 tipc_group_update_rcv_win(grp, blks, node, port, xmitq);
588 void tipc_group_update_rcv_win(struct tipc_group *grp, int blks, u32 node,
591 struct list_head *active = &grp->active;
592 int max_active = grp->max_active;
594 int active_cnt = grp->active_cnt;
597 m = tipc_group_find_member(grp, node, port);
609 grp->active_cnt++;
610 tipc_group_proto_xmit(grp, m, GRP_ADV_MSG, xmitq);
613 list_add_tail(&m->list, &grp->pending);
624 tipc_group_proto_xmit(grp, rm, GRP_RECLAIM_MSG, xmitq);
628 pm = list_first_entry(&grp->pending, struct tipc_member, list);
631 tipc_group_proto_xmit(grp, pm, GRP_ADV_MSG, xmitq);
634 if (!list_is_last(&m->list, &grp->active))
635 list_move_tail(&m->list, &grp->active);
638 tipc_group_proto_xmit(grp, m, GRP_ADV_MSG, xmitq);
644 grp->active_cnt--;
647 tipc_group_proto_xmit(grp, m, GRP_ADV_MSG, xmitq);
650 if (list_empty(&grp->pending))
654 pm = list_first_entry(&grp->pending, struct tipc_member, list);
656 list_move_tail(&pm->list, &grp->active);
657 grp->active_cnt++;
658 tipc_group_proto_xmit(grp, pm, GRP_ADV_MSG, xmitq);
668 static void tipc_group_create_event(struct tipc_group *grp,
672 { u32 dnode = tipc_own_addr(grp->net);
683 evt.s.seq.type = grp->type;
689 grp->portid, m->port, 0);
694 msg_set_nametype(hdr, grp->type);
703 static void tipc_group_proto_xmit(struct tipc_group *grp, struct tipc_member *m,
711 m->node, tipc_own_addr(grp->net),
712 m->port, grp->portid, 0);
724 msg_set_grp_bc_syncpt(hdr, grp->bc_snd_nxt);
728 msg_set_grp_bc_syncpt(hdr, grp->bc_snd_nxt);
741 void tipc_group_proto_rcv(struct tipc_group *grp, bool *usr_wakeup,
750 if (!grp)
753 if (grp->scope == TIPC_NODE_SCOPE && node != tipc_own_addr(grp->net))
756 m = tipc_group_find_member(grp, node, port);
761 m = tipc_group_create_member(grp, node, port,
777 tipc_group_proto_xmit(grp, m, GRP_ADV_MSG, xmitq);
778 tipc_group_create_event(grp, m, TIPC_PUBLISHED,
787 tipc_group_decr_active(grp, m);
789 tipc_group_create_event(grp, m, TIPC_WITHDRAWN,
802 if (--grp->bc_ackers)
812 tipc_group_proto_xmit(grp, m, GRP_REMIT_MSG, xmitq);
835 grp->active_cnt--;
839 if (list_empty(&grp->pending))
841 pm = list_first_entry(&grp->pending, struct tipc_member, list);
843 list_move_tail(&pm->list, &grp->active);
844 grp->active_cnt++;
846 tipc_group_proto_xmit(grp, pm, GRP_ADV_MSG, xmitq);
855 void tipc_group_member_evt(struct tipc_group *grp,
871 if (!grp)
874 net = grp->net;
876 if (!grp->loopback && node == self && port == grp->portid)
879 m = tipc_group_find_member(grp, node, port);
885 m = tipc_group_create_member(grp, node, port, instance,
890 tipc_group_proto_xmit(grp, m, GRP_JOIN_MSG, xmitq);
902 tipc_group_proto_xmit(grp, m, GRP_JOIN_MSG, xmitq);
903 tipc_group_create_event(grp, m, TIPC_PUBLISHED,
910 tipc_group_decr_active(grp, m);
917 tipc_group_create_event(grp, m, TIPC_WITHDRAWN,
923 *sk_rcvbuf = tipc_group_rcvbuf_limit(grp);
926 int tipc_group_fill_sock_diag(struct tipc_group *grp, struct sk_buff *skb)
934 grp->type) ||
936 grp->instance) ||
938 grp->bc_snd_nxt))
941 if (grp->scope == TIPC_NODE_SCOPE)
945 if (grp->scope == TIPC_CLUSTER_SCOPE)
949 if (*grp->open)