aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/tipc/socket.c')
-rw-r--r--net/tipc/socket.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index b542f14ed444..922b75ff56d3 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -485,6 +485,7 @@ static int tipc_sk_create(struct net *net, struct socket *sock,
485 tsk_set_unreturnable(tsk, true); 485 tsk_set_unreturnable(tsk, true);
486 if (sock->type == SOCK_DGRAM) 486 if (sock->type == SOCK_DGRAM)
487 tsk_set_unreliable(tsk, true); 487 tsk_set_unreliable(tsk, true);
488 __skb_queue_head_init(&tsk->mc_method.deferredq);
488 } 489 }
489 490
490 trace_tipc_sk_create(sk, NULL, TIPC_DUMP_NONE, " "); 491 trace_tipc_sk_create(sk, NULL, TIPC_DUMP_NONE, " ");
@@ -582,6 +583,7 @@ static int tipc_release(struct socket *sock)
582 sk->sk_shutdown = SHUTDOWN_MASK; 583 sk->sk_shutdown = SHUTDOWN_MASK;
583 tipc_sk_leave(tsk); 584 tipc_sk_leave(tsk);
584 tipc_sk_withdraw(tsk, 0, NULL); 585 tipc_sk_withdraw(tsk, 0, NULL);
586 __skb_queue_purge(&tsk->mc_method.deferredq);
585 sk_stop_timer(sk, &sk->sk_timer); 587 sk_stop_timer(sk, &sk->sk_timer);
586 tipc_sk_remove(tsk); 588 tipc_sk_remove(tsk);
587 589
@@ -2162,6 +2164,9 @@ static void tipc_sk_filter_rcv(struct sock *sk, struct sk_buff *skb,
2162 if (unlikely(grp)) 2164 if (unlikely(grp))
2163 tipc_group_filter_msg(grp, &inputq, xmitq); 2165 tipc_group_filter_msg(grp, &inputq, xmitq);
2164 2166
2167 if (msg_type(hdr) == TIPC_MCAST_MSG)
2168 tipc_mcast_filter_msg(&tsk->mc_method.deferredq, &inputq);
2169
2165 /* Validate and add to receive buffer if there is space */ 2170 /* Validate and add to receive buffer if there is space */
2166 while ((skb = __skb_dequeue(&inputq))) { 2171 while ((skb = __skb_dequeue(&inputq))) {
2167 hdr = buf_msg(skb); 2172 hdr = buf_msg(skb);