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.c33
1 files changed, 19 insertions, 14 deletions
diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index 56b8a96c2257..3eeb50a27b89 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -666,7 +666,7 @@ static int tipc_sendmcast(struct socket *sock, struct tipc_name_seq *seq,
666 struct tipc_sock *tsk = tipc_sk(sk); 666 struct tipc_sock *tsk = tipc_sk(sk);
667 struct net *net = sock_net(sk); 667 struct net *net = sock_net(sk);
668 struct tipc_msg *mhdr = &tsk->phdr; 668 struct tipc_msg *mhdr = &tsk->phdr;
669 struct sk_buff_head *pktchain = &sk->sk_write_queue; 669 struct sk_buff_head pktchain;
670 struct iov_iter save = msg->msg_iter; 670 struct iov_iter save = msg->msg_iter;
671 uint mtu; 671 uint mtu;
672 int rc; 672 int rc;
@@ -680,14 +680,16 @@ static int tipc_sendmcast(struct socket *sock, struct tipc_name_seq *seq,
680 msg_set_nameupper(mhdr, seq->upper); 680 msg_set_nameupper(mhdr, seq->upper);
681 msg_set_hdr_sz(mhdr, MCAST_H_SIZE); 681 msg_set_hdr_sz(mhdr, MCAST_H_SIZE);
682 682
683 skb_queue_head_init(&pktchain);
684
683new_mtu: 685new_mtu:
684 mtu = tipc_bcast_get_mtu(net); 686 mtu = tipc_bcast_get_mtu(net);
685 rc = tipc_msg_build(mhdr, msg, 0, dsz, mtu, pktchain); 687 rc = tipc_msg_build(mhdr, msg, 0, dsz, mtu, &pktchain);
686 if (unlikely(rc < 0)) 688 if (unlikely(rc < 0))
687 return rc; 689 return rc;
688 690
689 do { 691 do {
690 rc = tipc_bcast_xmit(net, pktchain); 692 rc = tipc_bcast_xmit(net, &pktchain);
691 if (likely(!rc)) 693 if (likely(!rc))
692 return dsz; 694 return dsz;
693 695
@@ -697,7 +699,7 @@ new_mtu:
697 if (!rc) 699 if (!rc)
698 continue; 700 continue;
699 } 701 }
700 __skb_queue_purge(pktchain); 702 __skb_queue_purge(&pktchain);
701 if (rc == -EMSGSIZE) { 703 if (rc == -EMSGSIZE) {
702 msg->msg_iter = save; 704 msg->msg_iter = save;
703 goto new_mtu; 705 goto new_mtu;
@@ -856,7 +858,7 @@ static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dsz)
856 struct net *net = sock_net(sk); 858 struct net *net = sock_net(sk);
857 struct tipc_msg *mhdr = &tsk->phdr; 859 struct tipc_msg *mhdr = &tsk->phdr;
858 u32 dnode, dport; 860 u32 dnode, dport;
859 struct sk_buff_head *pktchain = &sk->sk_write_queue; 861 struct sk_buff_head pktchain;
860 struct sk_buff *skb; 862 struct sk_buff *skb;
861 struct tipc_name_seq *seq; 863 struct tipc_name_seq *seq;
862 struct iov_iter save; 864 struct iov_iter save;
@@ -917,17 +919,18 @@ static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dsz)
917 msg_set_hdr_sz(mhdr, BASIC_H_SIZE); 919 msg_set_hdr_sz(mhdr, BASIC_H_SIZE);
918 } 920 }
919 921
922 skb_queue_head_init(&pktchain);
920 save = m->msg_iter; 923 save = m->msg_iter;
921new_mtu: 924new_mtu:
922 mtu = tipc_node_get_mtu(net, dnode, tsk->portid); 925 mtu = tipc_node_get_mtu(net, dnode, tsk->portid);
923 rc = tipc_msg_build(mhdr, m, 0, dsz, mtu, pktchain); 926 rc = tipc_msg_build(mhdr, m, 0, dsz, mtu, &pktchain);
924 if (rc < 0) 927 if (rc < 0)
925 return rc; 928 return rc;
926 929
927 do { 930 do {
928 skb = skb_peek(pktchain); 931 skb = skb_peek(&pktchain);
929 TIPC_SKB_CB(skb)->wakeup_pending = tsk->link_cong; 932 TIPC_SKB_CB(skb)->wakeup_pending = tsk->link_cong;
930 rc = tipc_node_xmit(net, pktchain, dnode, tsk->portid); 933 rc = tipc_node_xmit(net, &pktchain, dnode, tsk->portid);
931 if (likely(!rc)) { 934 if (likely(!rc)) {
932 if (sock->state != SS_READY) 935 if (sock->state != SS_READY)
933 sock->state = SS_CONNECTING; 936 sock->state = SS_CONNECTING;
@@ -939,7 +942,7 @@ new_mtu:
939 if (!rc) 942 if (!rc)
940 continue; 943 continue;
941 } 944 }
942 __skb_queue_purge(pktchain); 945 __skb_queue_purge(&pktchain);
943 if (rc == -EMSGSIZE) { 946 if (rc == -EMSGSIZE) {
944 m->msg_iter = save; 947 m->msg_iter = save;
945 goto new_mtu; 948 goto new_mtu;
@@ -1009,7 +1012,7 @@ static int __tipc_send_stream(struct socket *sock, struct msghdr *m, size_t dsz)
1009 struct net *net = sock_net(sk); 1012 struct net *net = sock_net(sk);
1010 struct tipc_sock *tsk = tipc_sk(sk); 1013 struct tipc_sock *tsk = tipc_sk(sk);
1011 struct tipc_msg *mhdr = &tsk->phdr; 1014 struct tipc_msg *mhdr = &tsk->phdr;
1012 struct sk_buff_head *pktchain = &sk->sk_write_queue; 1015 struct sk_buff_head pktchain;
1013 DECLARE_SOCKADDR(struct sockaddr_tipc *, dest, m->msg_name); 1016 DECLARE_SOCKADDR(struct sockaddr_tipc *, dest, m->msg_name);
1014 u32 portid = tsk->portid; 1017 u32 portid = tsk->portid;
1015 int rc = -EINVAL; 1018 int rc = -EINVAL;
@@ -1037,17 +1040,19 @@ static int __tipc_send_stream(struct socket *sock, struct msghdr *m, size_t dsz)
1037 1040
1038 timeo = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT); 1041 timeo = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT);
1039 dnode = tsk_peer_node(tsk); 1042 dnode = tsk_peer_node(tsk);
1043 skb_queue_head_init(&pktchain);
1040 1044
1041next: 1045next:
1042 save = m->msg_iter; 1046 save = m->msg_iter;
1043 mtu = tsk->max_pkt; 1047 mtu = tsk->max_pkt;
1044 send = min_t(uint, dsz - sent, TIPC_MAX_USER_MSG_SIZE); 1048 send = min_t(uint, dsz - sent, TIPC_MAX_USER_MSG_SIZE);
1045 rc = tipc_msg_build(mhdr, m, sent, send, mtu, pktchain); 1049 rc = tipc_msg_build(mhdr, m, sent, send, mtu, &pktchain);
1046 if (unlikely(rc < 0)) 1050 if (unlikely(rc < 0))
1047 return rc; 1051 return rc;
1052
1048 do { 1053 do {
1049 if (likely(!tsk_conn_cong(tsk))) { 1054 if (likely(!tsk_conn_cong(tsk))) {
1050 rc = tipc_node_xmit(net, pktchain, dnode, portid); 1055 rc = tipc_node_xmit(net, &pktchain, dnode, portid);
1051 if (likely(!rc)) { 1056 if (likely(!rc)) {
1052 tsk->sent_unacked++; 1057 tsk->sent_unacked++;
1053 sent += send; 1058 sent += send;
@@ -1056,7 +1061,7 @@ next:
1056 goto next; 1061 goto next;
1057 } 1062 }
1058 if (rc == -EMSGSIZE) { 1063 if (rc == -EMSGSIZE) {
1059 __skb_queue_purge(pktchain); 1064 __skb_queue_purge(&pktchain);
1060 tsk->max_pkt = tipc_node_get_mtu(net, dnode, 1065 tsk->max_pkt = tipc_node_get_mtu(net, dnode,
1061 portid); 1066 portid);
1062 m->msg_iter = save; 1067 m->msg_iter = save;
@@ -1070,7 +1075,7 @@ next:
1070 rc = tipc_wait_for_sndpkt(sock, &timeo); 1075 rc = tipc_wait_for_sndpkt(sock, &timeo);
1071 } while (!rc); 1076 } while (!rc);
1072 1077
1073 __skb_queue_purge(pktchain); 1078 __skb_queue_purge(&pktchain);
1074 return sent ? sent : rc; 1079 return sent ? sent : rc;
1075} 1080}
1076 1081