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,
119 grp->active_cnt--;
122 static int tipc_group_rcvbuf_limit(struct tipc_group *grp)
125 int mcnt = grp->member_cnt + 1;
130 grp->max_active = max_active;
140 u16 tipc_group_bc_snd_nxt(struct tipc_group *grp)
142 return grp->bc_snd_nxt;
155 u32 tipc_group_exclude(struct tipc_group *grp)
157 if (!grp->loopback)
158 return grp->portid;
168 struct tipc_group *grp;
171 grp = kzalloc(sizeof(*grp), GFP_ATOMIC);
172 if (!grp)
174 tipc_nlist_init(&grp->dests, tipc_own_addr(net));
175 INIT_LIST_HEAD(&grp->small_win);
176 INIT_LIST_HEAD(&grp->active);
177 INIT_LIST_HEAD(&grp->pending);
178 grp->members = RB_ROOT;
179 grp->net = net;
180 grp->portid = portid;
181 grp->type = type;
182 grp->instance = mreq->instance;
183 grp->scope = mreq->scope;
184 grp->loopback = mreq->flags & TIPC_GROUP_LOOPBACK;
185 grp->events = mreq->flags & TIPC_GROUP_MEMBER_EVTS;
186 grp->open = group_is_open;
187 *grp->open = false;
190 filter, &grp->subid))
191 return grp;
192 kfree(grp);
196 void tipc_group_join(struct net *net, struct tipc_group *grp, int *sk_rcvbuf)
198 struct rb_root *tree = &grp->members;
204 tipc_group_proto_xmit(grp, m, GRP_JOIN_MSG, &xmitq);
208 *sk_rcvbuf = tipc_group_rcvbuf_limit(grp);
211 void tipc_group_delete(struct net *net, struct tipc_group *grp)
213 struct rb_root *tree = &grp->members;
220 tipc_group_proto_xmit(grp, m, GRP_LEAVE_MSG, &xmitq);
226 tipc_nlist_purge(&grp->dests);
227 tipc_topsrv_kern_unsubscr(net, grp->subid);
228 kfree(grp);
231 static struct tipc_member *tipc_group_find_member(struct tipc_group *grp,
234 struct rb_node *n = grp->members.rb_node;
251 static struct tipc_member *tipc_group_find_dest(struct tipc_group *grp,
256 m = tipc_group_find_member(grp, node, port);
262 static struct tipc_member *tipc_group_find_node(struct tipc_group *grp,
268 for (n = rb_first(&grp->members); n; n = rb_next(n)) {
276 static int tipc_group_add_to_tree(struct tipc_group *grp,
283 n = &grp->members.rb_node;
297 rb_insert_color(&m->tree_node, &grp->members);
301 static struct tipc_member *tipc_group_create_member(struct tipc_group *grp,
314 m->group = grp;
318 m->bc_acked = grp->bc_snd_nxt - 1;
319 ret = tipc_group_add_to_tree(grp, m);
324 grp->member_cnt++;
325 tipc_nlist_add(&grp->dests, m->node);
330 void tipc_group_add_member(struct tipc_group *grp, u32 node,
333 tipc_group_create_member(grp, node, port, instance, MBR_PUBLISHED);
336 static void tipc_group_delete_member(struct tipc_group *grp,
339 rb_erase(&m->tree_node, &grp->members);
340 grp->member_cnt--;
343 if (grp->bc_ackers && less(m->bc_acked, grp->bc_snd_nxt - 1))
344 grp->bc_ackers--;
348 tipc_group_decr_active(grp, m);
351 if (!tipc_group_find_node(grp, m->node))
352 tipc_nlist_del(&grp->dests, m->node);
357 struct tipc_nlist *tipc_group_dests(struct tipc_group *grp)
359 return &grp->dests;
362 void tipc_group_self(struct tipc_group *grp, struct tipc_name_seq *seq,
365 seq->type = grp->type;
366 seq->lower = grp->instance;
367 seq->upper = grp->instance;
368 *scope = grp->scope;
373 struct tipc_group *grp = m->group;
387 list_for_each_entry_safe(_m, tmp, &grp->small_win, small_win) {
394 void tipc_group_update_bc_members(struct tipc_group *grp, int len, bool ack)
396 u16 prev = grp->bc_snd_nxt - 1;
401 for (n = rb_first(&grp->members); n; n = rb_next(n)) {
412 grp->bc_ackers = ackers;
413 grp->bc_snd_nxt++;
416 bool tipc_group_cong(struct tipc_group *grp, u32 dnode, u32 dport,
423 m = tipc_group_find_dest(grp, dnode, dport);
433 *grp->open = false;
445 tipc_group_proto_xmit(grp, m, GRP_ADV_MSG, &xmitq);
446 tipc_node_distr_xmit(grp->net, &xmitq);
450 bool tipc_group_bc_cong(struct tipc_group *grp, int len)
455 if (grp->bc_ackers) {
456 *grp->open = false;
459 if (list_empty(&grp->small_win))
462 m = list_first_entry(&grp->small_win, struct tipc_member, small_win);
466 return tipc_group_cong(grp, m->node, m->port, len, &m);
495 void tipc_group_filter_msg(struct tipc_group *grp, struct sk_buff_head *inputq,
516 m = tipc_group_find_member(grp, node, port);
541 if (msg_nameinst(hdr) != grp->instance) {
555 if (!grp->events)
570 tipc_group_proto_xmit(grp, m, GRP_ACK_MSG, xmitq);
574 tipc_group_delete_member(grp, m);
580 tipc_group_update_rcv_win(grp, blks, node, port, xmitq);
587 void tipc_group_update_rcv_win(struct tipc_group *grp, int blks, u32 node,
590 struct list_head *active = &grp->active;
591 int max_active = grp->max_active;
593 int active_cnt = grp->active_cnt;
596 m = tipc_group_find_member(grp, node, port);
608 grp->active_cnt++;
609 tipc_group_proto_xmit(grp, m, GRP_ADV_MSG, xmitq);
612 list_add_tail(&m->list, &grp->pending);
623 tipc_group_proto_xmit(grp, rm, GRP_RECLAIM_MSG, xmitq);
627 pm = list_first_entry(&grp->pending, struct tipc_member, list);
630 tipc_group_proto_xmit(grp, pm, GRP_ADV_MSG, xmitq);
633 if (!list_is_last(&m->list, &grp->active))
634 list_move_tail(&m->list, &grp->active);
637 tipc_group_proto_xmit(grp, m, GRP_ADV_MSG, xmitq);
643 grp->active_cnt--;
646 tipc_group_proto_xmit(grp, m, GRP_ADV_MSG, xmitq);
649 if (list_empty(&grp->pending))
653 pm = list_first_entry(&grp->pending, struct tipc_member, list);
655 list_move_tail(&pm->list, &grp->active);
656 grp->active_cnt++;
657 tipc_group_proto_xmit(grp, pm, GRP_ADV_MSG, xmitq);
667 static void tipc_group_create_event(struct tipc_group *grp,
671 { u32 dnode = tipc_own_addr(grp->net);
682 evt.s.seq.type = grp->type;
688 grp->portid, m->port, 0);
693 msg_set_nametype(hdr, grp->type);
702 static void tipc_group_proto_xmit(struct tipc_group *grp, struct tipc_member *m,
710 m->node, tipc_own_addr(grp->net),
711 m->port, grp->portid, 0);
723 msg_set_grp_bc_syncpt(hdr, grp->bc_snd_nxt);
727 msg_set_grp_bc_syncpt(hdr, grp->bc_snd_nxt);
740 void tipc_group_proto_rcv(struct tipc_group *grp, bool *usr_wakeup,
749 if (!grp)
752 if (grp->scope == TIPC_NODE_SCOPE && node != tipc_own_addr(grp->net))
755 m = tipc_group_find_member(grp, node, port);
760 m = tipc_group_create_member(grp, node, port,
776 tipc_group_proto_xmit(grp, m, GRP_ADV_MSG, xmitq);
777 tipc_group_create_event(grp, m, TIPC_PUBLISHED,
786 tipc_group_decr_active(grp, m);
788 tipc_group_create_event(grp, m, TIPC_WITHDRAWN,
801 if (--grp->bc_ackers)
811 tipc_group_proto_xmit(grp, m, GRP_REMIT_MSG, xmitq);
834 grp->active_cnt--;
838 if (list_empty(&grp->pending))
840 pm = list_first_entry(&grp->pending, struct tipc_member, list);
842 list_move_tail(&pm->list, &grp->active);
843 grp->active_cnt++;
845 tipc_group_proto_xmit(grp, pm, GRP_ADV_MSG, xmitq);
854 void tipc_group_member_evt(struct tipc_group *grp,
870 if (!grp)
873 net = grp->net;
875 if (!grp->loopback && node == self && port == grp->portid)
878 m = tipc_group_find_member(grp, node, port);
884 m = tipc_group_create_member(grp, node, port, instance,
889 tipc_group_proto_xmit(grp, m, GRP_JOIN_MSG, xmitq);
901 tipc_group_proto_xmit(grp, m, GRP_JOIN_MSG, xmitq);
902 tipc_group_create_event(grp, m, TIPC_PUBLISHED,
909 tipc_group_decr_active(grp, m);
916 tipc_group_create_event(grp, m, TIPC_WITHDRAWN,
922 *sk_rcvbuf = tipc_group_rcvbuf_limit(grp);
925 int tipc_group_fill_sock_diag(struct tipc_group *grp, struct sk_buff *skb)
933 grp->type) ||
935 grp->instance) ||
937 grp->bc_snd_nxt))
940 if (grp->scope == TIPC_NODE_SCOPE)
944 if (grp->scope == TIPC_CLUSTER_SCOPE)
948 if (*grp->open)