diff options
Diffstat (limited to 'net/tipc/socket.c')
-rw-r--r-- | net/tipc/socket.c | 42 |
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; | |||
126 | static const struct proto_ops msg_ops; | 127 | static const struct proto_ops msg_ops; |
127 | static struct proto tipc_proto; | 128 | static struct proto tipc_proto; |
128 | 129 | ||
129 | static 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 | |||
137 | static const struct rhashtable_params tsk_rht_params; | 130 | static 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 | |||
690 | new_mtu: | 685 | new_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; |
928 | new_mtu: | 924 | new_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 | ||
1048 | next: | 1045 | next: |
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 | ||