summaryrefslogtreecommitdiffstats
path: root/net/tipc/group.c
diff options
context:
space:
mode:
authorJon Maloy <jon.maloy@ericsson.com>2017-10-13 11:04:29 +0200
committerDavid S. Miller <davem@davemloft.net>2017-10-13 17:46:01 +0200
commit5b8dddb63769587badc50725ec9857caaeba4de0 (patch)
treeed36b50ef06a7162d3b71ccbb54fbf3236227562 /net/tipc/group.c
parenttipc: introduce group anycast messaging (diff)
downloadlinux-5b8dddb63769587badc50725ec9857caaeba4de0.tar.xz
linux-5b8dddb63769587badc50725ec9857caaeba4de0.zip
tipc: introduce group multicast messaging
The previously introduced message transport to all group members is based on the tipc multicast service, but is logically a broadcast service within the group, and that is what we call it. We now add functionality for sending messages to all group members having a certain identity. Correspondingly, we call this feature 'group multicast'. The service is using unicast when only one destination is found, otherwise it will use the bearer broadcast service to transfer the messages. In the latter case, the receiving members filter arriving messages by looking at the intended destination instance. If there is no match, the message will be dropped, while still being considered received and read as seen by the flow control mechanism. Signed-off-by: Jon Maloy <jon.maloy@ericsson.com> Acked-by: Ying Xue <ying.xue@windriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/group.c')
-rw-r--r--net/tipc/group.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/net/tipc/group.c b/net/tipc/group.c
index 16aaaa97a005..ffac2f33fce2 100644
--- a/net/tipc/group.c
+++ b/net/tipc/group.c
@@ -413,10 +413,22 @@ void tipc_group_filter_msg(struct tipc_group *grp, struct sk_buff_head *inputq,
if (!tipc_group_is_receiver(m))
goto drop;
+ m->bc_rcv_nxt = msg_grp_bc_seqno(hdr) + 1;
+
+ /* Drop multicast here if not for this member */
+ if (mtyp == TIPC_GRP_MCAST_MSG) {
+ if (msg_nameinst(hdr) != grp->instance) {
+ m->bc_rcv_nxt = msg_grp_bc_seqno(hdr) + 1;
+ tipc_group_update_rcv_win(grp, msg_blocks(hdr),
+ node, port, xmitq);
+ kfree_skb(skb);
+ return;
+ }
+ }
+
TIPC_SKB_CB(skb)->orig_member = m->instance;
__skb_queue_tail(inputq, skb);
- m->bc_rcv_nxt = msg_grp_bc_seqno(hdr) + 1;
return;
drop:
kfree_skb(skb);