summaryrefslogtreecommitdiffstats
path: root/net/tipc/msg.c
diff options
context:
space:
mode:
authorJon Paul Maloy <jon.maloy@ericsson.com>2015-10-22 08:51:39 -0400
committerDavid S. Miller <davem@davemloft.net>2015-10-24 09:56:32 -0400
commit2f566124570625c29c3fd79bac4d9cd97c0c31a1 (patch)
treeeb1330a7984296a6f1eac0da479f6c83322691c8 /net/tipc/msg.c
parentc1ab3f1dea3df566ad38caf98baf69c656679090 (diff)
tipc: let broadcast transmission use new link transmit function
This commit simplifies the broadcast link transmission function, by leveraging previous changes to the link transmission function and the broadcast transmission link life cycle. Signed-off-by: Jon Maloy <jon.maloy@ericsson.com> Reviewed-by: Ying Xue <ying.xue@windriver.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/msg.c')
-rw-r--r--net/tipc/msg.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/net/tipc/msg.c b/net/tipc/msg.c
index 26d38b3d8760..5b47468739e7 100644
--- a/net/tipc/msg.c
+++ b/net/tipc/msg.c
@@ -565,18 +565,22 @@ bool tipc_msg_lookup_dest(struct net *net, struct sk_buff *skb, int *err)
565/* tipc_msg_reassemble() - clone a buffer chain of fragments and 565/* tipc_msg_reassemble() - clone a buffer chain of fragments and
566 * reassemble the clones into one message 566 * reassemble the clones into one message
567 */ 567 */
568struct sk_buff *tipc_msg_reassemble(struct sk_buff_head *list) 568bool tipc_msg_reassemble(struct sk_buff_head *list, struct sk_buff_head *rcvq)
569{ 569{
570 struct sk_buff *skb; 570 struct sk_buff *skb, *_skb;
571 struct sk_buff *frag = NULL; 571 struct sk_buff *frag = NULL;
572 struct sk_buff *head = NULL; 572 struct sk_buff *head = NULL;
573 int hdr_sz; 573 int hdr_len;
574 574
575 /* Copy header if single buffer */ 575 /* Copy header if single buffer */
576 if (skb_queue_len(list) == 1) { 576 if (skb_queue_len(list) == 1) {
577 skb = skb_peek(list); 577 skb = skb_peek(list);
578 hdr_sz = skb_headroom(skb) + msg_hdr_sz(buf_msg(skb)); 578 hdr_len = skb_headroom(skb) + msg_hdr_sz(buf_msg(skb));
579 return __pskb_copy(skb, hdr_sz, GFP_ATOMIC); 579 _skb = __pskb_copy(skb, hdr_len, GFP_ATOMIC);
580 if (!_skb)
581 return false;
582 __skb_queue_tail(rcvq, _skb);
583 return true;
580 } 584 }
581 585
582 /* Clone all fragments and reassemble */ 586 /* Clone all fragments and reassemble */
@@ -590,11 +594,12 @@ struct sk_buff *tipc_msg_reassemble(struct sk_buff_head *list)
590 if (!head) 594 if (!head)
591 goto error; 595 goto error;
592 } 596 }
593 return frag; 597 __skb_queue_tail(rcvq, frag);
598 return true;
594error: 599error:
595 pr_warn("Failed do clone local mcast rcv buffer\n"); 600 pr_warn("Failed do clone local mcast rcv buffer\n");
596 kfree_skb(head); 601 kfree_skb(head);
597 return NULL; 602 return false;
598} 603}
599 604
600/* tipc_skb_queue_sorted(); sort pkt into list according to sequence number 605/* tipc_skb_queue_sorted(); sort pkt into list according to sequence number