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.c42
1 files changed, 20 insertions, 22 deletions
diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index 69c29050f14a..3eeb50a27b89 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -42,6 +42,7 @@
42#include "name_distr.h" 42#include "name_distr.h"
43#include "socket.h" 43#include "socket.h"
44#include "bcast.h" 44#include "bcast.h"
45#include "netlink.h"
45 46
46#define SS_LISTENING -1 /* socket is listening */ 47#define SS_LISTENING -1 /* socket is listening */
47#define SS_READY -2 /* socket is connectionless */ 48#define SS_READY -2 /* socket is connectionless */
@@ -126,14 +127,6 @@ static const struct proto_ops stream_ops;
126static const struct proto_ops msg_ops; 127static const struct proto_ops msg_ops;
127static struct proto tipc_proto; 128static struct proto tipc_proto;
128 129
129static const struct nla_policy tipc_nl_sock_policy[TIPC_NLA_SOCK_MAX + 1] = {
130 [TIPC_NLA_SOCK_UNSPEC] = { .type = NLA_UNSPEC },
131 [TIPC_NLA_SOCK_ADDR] = { .type = NLA_U32 },
132 [TIPC_NLA_SOCK_REF] = { .type = NLA_U32 },
133 [TIPC_NLA_SOCK_CON] = { .type = NLA_NESTED },
134 [TIPC_NLA_SOCK_HAS_PUBL] = { .type = NLA_FLAG }
135};
136
137static const struct rhashtable_params tsk_rht_params; 130static const struct rhashtable_params tsk_rht_params;
138 131
139/* 132/*
@@ -673,7 +666,7 @@ static int tipc_sendmcast(struct socket *sock, struct tipc_name_seq *seq,
673 struct tipc_sock *tsk = tipc_sk(sk); 666 struct tipc_sock *tsk = tipc_sk(sk);
674 struct net *net = sock_net(sk); 667 struct net *net = sock_net(sk);
675 struct tipc_msg *mhdr = &tsk->phdr; 668 struct tipc_msg *mhdr = &tsk->phdr;
676 struct sk_buff_head *pktchain = &sk->sk_write_queue; 669 struct sk_buff_head pktchain;
677 struct iov_iter save = msg->msg_iter; 670 struct iov_iter save = msg->msg_iter;
678 uint mtu; 671 uint mtu;
679 int rc; 672 int rc;
@@ -687,14 +680,16 @@ static int tipc_sendmcast(struct socket *sock, struct tipc_name_seq *seq,
687 msg_set_nameupper(mhdr, seq->upper); 680 msg_set_nameupper(mhdr, seq->upper);
688 msg_set_hdr_sz(mhdr, MCAST_H_SIZE); 681 msg_set_hdr_sz(mhdr, MCAST_H_SIZE);
689 682
683 skb_queue_head_init(&pktchain);
684
690new_mtu: 685new_mtu:
691 mtu = tipc_bcast_get_mtu(net); 686 mtu = tipc_bcast_get_mtu(net);
692 rc = tipc_msg_build(mhdr, msg, 0, dsz, mtu, pktchain); 687 rc = tipc_msg_build(mhdr, msg, 0, dsz, mtu, &pktchain);
693 if (unlikely(rc < 0)) 688 if (unlikely(rc < 0))
694 return rc; 689 return rc;
695 690
696 do { 691 do {
697 rc = tipc_bcast_xmit(net, pktchain); 692 rc = tipc_bcast_xmit(net, &pktchain);
698 if (likely(!rc)) 693 if (likely(!rc))
699 return dsz; 694 return dsz;
700 695
@@ -704,7 +699,7 @@ new_mtu:
704 if (!rc) 699 if (!rc)
705 continue; 700 continue;
706 } 701 }
707 __skb_queue_purge(pktchain); 702 __skb_queue_purge(&pktchain);
708 if (rc == -EMSGSIZE) { 703 if (rc == -EMSGSIZE) {
709 msg->msg_iter = save; 704 msg->msg_iter = save;
710 goto new_mtu; 705 goto new_mtu;
@@ -863,7 +858,7 @@ static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dsz)
863 struct net *net = sock_net(sk); 858 struct net *net = sock_net(sk);
864 struct tipc_msg *mhdr = &tsk->phdr; 859 struct tipc_msg *mhdr = &tsk->phdr;
865 u32 dnode, dport; 860 u32 dnode, dport;
866 struct sk_buff_head *pktchain = &sk->sk_write_queue; 861 struct sk_buff_head pktchain;
867 struct sk_buff *skb; 862 struct sk_buff *skb;
868 struct tipc_name_seq *seq; 863 struct tipc_name_seq *seq;
869 struct iov_iter save; 864 struct iov_iter save;
@@ -924,17 +919,18 @@ static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dsz)
924 msg_set_hdr_sz(mhdr, BASIC_H_SIZE); 919 msg_set_hdr_sz(mhdr, BASIC_H_SIZE);
925 } 920 }
926 921
922 skb_queue_head_init(&pktchain);
927 save = m->msg_iter; 923 save = m->msg_iter;
928new_mtu: 924new_mtu:
929 mtu = tipc_node_get_mtu(net, dnode, tsk->portid); 925 mtu = tipc_node_get_mtu(net, dnode, tsk->portid);
930 rc = tipc_msg_build(mhdr, m, 0, dsz, mtu, pktchain); 926 rc = tipc_msg_build(mhdr, m, 0, dsz, mtu, &pktchain);
931 if (rc < 0) 927 if (rc < 0)
932 return rc; 928 return rc;
933 929
934 do { 930 do {
935 skb = skb_peek(pktchain); 931 skb = skb_peek(&pktchain);
936 TIPC_SKB_CB(skb)->wakeup_pending = tsk->link_cong; 932 TIPC_SKB_CB(skb)->wakeup_pending = tsk->link_cong;
937 rc = tipc_node_xmit(net, pktchain, dnode, tsk->portid); 933 rc = tipc_node_xmit(net, &pktchain, dnode, tsk->portid);
938 if (likely(!rc)) { 934 if (likely(!rc)) {
939 if (sock->state != SS_READY) 935 if (sock->state != SS_READY)
940 sock->state = SS_CONNECTING; 936 sock->state = SS_CONNECTING;
@@ -946,7 +942,7 @@ new_mtu:
946 if (!rc) 942 if (!rc)
947 continue; 943 continue;
948 } 944 }
949 __skb_queue_purge(pktchain); 945 __skb_queue_purge(&pktchain);
950 if (rc == -EMSGSIZE) { 946 if (rc == -EMSGSIZE) {
951 m->msg_iter = save; 947 m->msg_iter = save;
952 goto new_mtu; 948 goto new_mtu;
@@ -1016,7 +1012,7 @@ static int __tipc_send_stream(struct socket *sock, struct msghdr *m, size_t dsz)
1016 struct net *net = sock_net(sk); 1012 struct net *net = sock_net(sk);
1017 struct tipc_sock *tsk = tipc_sk(sk); 1013 struct tipc_sock *tsk = tipc_sk(sk);
1018 struct tipc_msg *mhdr = &tsk->phdr; 1014 struct tipc_msg *mhdr = &tsk->phdr;
1019 struct sk_buff_head *pktchain = &sk->sk_write_queue; 1015 struct sk_buff_head pktchain;
1020 DECLARE_SOCKADDR(struct sockaddr_tipc *, dest, m->msg_name); 1016 DECLARE_SOCKADDR(struct sockaddr_tipc *, dest, m->msg_name);
1021 u32 portid = tsk->portid; 1017 u32 portid = tsk->portid;
1022 int rc = -EINVAL; 1018 int rc = -EINVAL;
@@ -1044,17 +1040,19 @@ static int __tipc_send_stream(struct socket *sock, struct msghdr *m, size_t dsz)
1044 1040
1045 timeo = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT); 1041 timeo = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT);
1046 dnode = tsk_peer_node(tsk); 1042 dnode = tsk_peer_node(tsk);
1043 skb_queue_head_init(&pktchain);
1047 1044
1048next: 1045next:
1049 save = m->msg_iter; 1046 save = m->msg_iter;
1050 mtu = tsk->max_pkt; 1047 mtu = tsk->max_pkt;
1051 send = min_t(uint, dsz - sent, TIPC_MAX_USER_MSG_SIZE); 1048 send = min_t(uint, dsz - sent, TIPC_MAX_USER_MSG_SIZE);
1052 rc = tipc_msg_build(mhdr, m, sent, send, mtu, pktchain); 1049 rc = tipc_msg_build(mhdr, m, sent, send, mtu, &pktchain);
1053 if (unlikely(rc < 0)) 1050 if (unlikely(rc < 0))
1054 return rc; 1051 return rc;
1052
1055 do { 1053 do {
1056 if (likely(!tsk_conn_cong(tsk))) { 1054 if (likely(!tsk_conn_cong(tsk))) {
1057 rc = tipc_node_xmit(net, pktchain, dnode, portid); 1055 rc = tipc_node_xmit(net, &pktchain, dnode, portid);
1058 if (likely(!rc)) { 1056 if (likely(!rc)) {
1059 tsk->sent_unacked++; 1057 tsk->sent_unacked++;
1060 sent += send; 1058 sent += send;
@@ -1063,7 +1061,7 @@ next:
1063 goto next; 1061 goto next;
1064 } 1062 }
1065 if (rc == -EMSGSIZE) { 1063 if (rc == -EMSGSIZE) {
1066 __skb_queue_purge(pktchain); 1064 __skb_queue_purge(&pktchain);
1067 tsk->max_pkt = tipc_node_get_mtu(net, dnode, 1065 tsk->max_pkt = tipc_node_get_mtu(net, dnode,
1068 portid); 1066 portid);
1069 m->msg_iter = save; 1067 m->msg_iter = save;
@@ -1077,7 +1075,7 @@ next:
1077 rc = tipc_wait_for_sndpkt(sock, &timeo); 1075 rc = tipc_wait_for_sndpkt(sock, &timeo);
1078 } while (!rc); 1076 } while (!rc);
1079 1077
1080 __skb_queue_purge(pktchain); 1078 __skb_queue_purge(&pktchain);
1081 return sent ? sent : rc; 1079 return sent ? sent : rc;
1082} 1080}
1083 1081