Commit 3594698a1fb8e5ae60a92c72ce9ca280256939a7
Committed by
David S. Miller
1 parent
b51642f6d7
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
net: Make CAP_NET_BIND_SERVICE per user namespace
Allow privileged users in any user namespace to bind to privileged sockets in network namespaces they control. Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Showing 3 changed files with 10 additions and 6 deletions Inline Diff
net/ipv4/af_inet.c
1 | /* | 1 | /* |
2 | * INET An implementation of the TCP/IP protocol suite for the LINUX | 2 | * INET An implementation of the TCP/IP protocol suite for the LINUX |
3 | * operating system. INET is implemented using the BSD Socket | 3 | * operating system. INET is implemented using the BSD Socket |
4 | * interface as the means of communication with the user level. | 4 | * interface as the means of communication with the user level. |
5 | * | 5 | * |
6 | * PF_INET protocol family socket handler. | 6 | * PF_INET protocol family socket handler. |
7 | * | 7 | * |
8 | * Authors: Ross Biro | 8 | * Authors: Ross Biro |
9 | * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> | 9 | * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> |
10 | * Florian La Roche, <flla@stud.uni-sb.de> | 10 | * Florian La Roche, <flla@stud.uni-sb.de> |
11 | * Alan Cox, <A.Cox@swansea.ac.uk> | 11 | * Alan Cox, <A.Cox@swansea.ac.uk> |
12 | * | 12 | * |
13 | * Changes (see also sock.c) | 13 | * Changes (see also sock.c) |
14 | * | 14 | * |
15 | * piggy, | 15 | * piggy, |
16 | * Karl Knutson : Socket protocol table | 16 | * Karl Knutson : Socket protocol table |
17 | * A.N.Kuznetsov : Socket death error in accept(). | 17 | * A.N.Kuznetsov : Socket death error in accept(). |
18 | * John Richardson : Fix non blocking error in connect() | 18 | * John Richardson : Fix non blocking error in connect() |
19 | * so sockets that fail to connect | 19 | * so sockets that fail to connect |
20 | * don't return -EINPROGRESS. | 20 | * don't return -EINPROGRESS. |
21 | * Alan Cox : Asynchronous I/O support | 21 | * Alan Cox : Asynchronous I/O support |
22 | * Alan Cox : Keep correct socket pointer on sock | 22 | * Alan Cox : Keep correct socket pointer on sock |
23 | * structures | 23 | * structures |
24 | * when accept() ed | 24 | * when accept() ed |
25 | * Alan Cox : Semantics of SO_LINGER aren't state | 25 | * Alan Cox : Semantics of SO_LINGER aren't state |
26 | * moved to close when you look carefully. | 26 | * moved to close when you look carefully. |
27 | * With this fixed and the accept bug fixed | 27 | * With this fixed and the accept bug fixed |
28 | * some RPC stuff seems happier. | 28 | * some RPC stuff seems happier. |
29 | * Niibe Yutaka : 4.4BSD style write async I/O | 29 | * Niibe Yutaka : 4.4BSD style write async I/O |
30 | * Alan Cox, | 30 | * Alan Cox, |
31 | * Tony Gale : Fixed reuse semantics. | 31 | * Tony Gale : Fixed reuse semantics. |
32 | * Alan Cox : bind() shouldn't abort existing but dead | 32 | * Alan Cox : bind() shouldn't abort existing but dead |
33 | * sockets. Stops FTP netin:.. I hope. | 33 | * sockets. Stops FTP netin:.. I hope. |
34 | * Alan Cox : bind() works correctly for RAW sockets. | 34 | * Alan Cox : bind() works correctly for RAW sockets. |
35 | * Note that FreeBSD at least was broken | 35 | * Note that FreeBSD at least was broken |
36 | * in this respect so be careful with | 36 | * in this respect so be careful with |
37 | * compatibility tests... | 37 | * compatibility tests... |
38 | * Alan Cox : routing cache support | 38 | * Alan Cox : routing cache support |
39 | * Alan Cox : memzero the socket structure for | 39 | * Alan Cox : memzero the socket structure for |
40 | * compactness. | 40 | * compactness. |
41 | * Matt Day : nonblock connect error handler | 41 | * Matt Day : nonblock connect error handler |
42 | * Alan Cox : Allow large numbers of pending sockets | 42 | * Alan Cox : Allow large numbers of pending sockets |
43 | * (eg for big web sites), but only if | 43 | * (eg for big web sites), but only if |
44 | * specifically application requested. | 44 | * specifically application requested. |
45 | * Alan Cox : New buffering throughout IP. Used | 45 | * Alan Cox : New buffering throughout IP. Used |
46 | * dumbly. | 46 | * dumbly. |
47 | * Alan Cox : New buffering now used smartly. | 47 | * Alan Cox : New buffering now used smartly. |
48 | * Alan Cox : BSD rather than common sense | 48 | * Alan Cox : BSD rather than common sense |
49 | * interpretation of listen. | 49 | * interpretation of listen. |
50 | * Germano Caronni : Assorted small races. | 50 | * Germano Caronni : Assorted small races. |
51 | * Alan Cox : sendmsg/recvmsg basic support. | 51 | * Alan Cox : sendmsg/recvmsg basic support. |
52 | * Alan Cox : Only sendmsg/recvmsg now supported. | 52 | * Alan Cox : Only sendmsg/recvmsg now supported. |
53 | * Alan Cox : Locked down bind (see security list). | 53 | * Alan Cox : Locked down bind (see security list). |
54 | * Alan Cox : Loosened bind a little. | 54 | * Alan Cox : Loosened bind a little. |
55 | * Mike McLagan : ADD/DEL DLCI Ioctls | 55 | * Mike McLagan : ADD/DEL DLCI Ioctls |
56 | * Willy Konynenberg : Transparent proxying support. | 56 | * Willy Konynenberg : Transparent proxying support. |
57 | * David S. Miller : New socket lookup architecture. | 57 | * David S. Miller : New socket lookup architecture. |
58 | * Some other random speedups. | 58 | * Some other random speedups. |
59 | * Cyrus Durgin : Cleaned up file for kmod hacks. | 59 | * Cyrus Durgin : Cleaned up file for kmod hacks. |
60 | * Andi Kleen : Fix inet_stream_connect TCP race. | 60 | * Andi Kleen : Fix inet_stream_connect TCP race. |
61 | * | 61 | * |
62 | * This program is free software; you can redistribute it and/or | 62 | * This program is free software; you can redistribute it and/or |
63 | * modify it under the terms of the GNU General Public License | 63 | * modify it under the terms of the GNU General Public License |
64 | * as published by the Free Software Foundation; either version | 64 | * as published by the Free Software Foundation; either version |
65 | * 2 of the License, or (at your option) any later version. | 65 | * 2 of the License, or (at your option) any later version. |
66 | */ | 66 | */ |
67 | 67 | ||
68 | #define pr_fmt(fmt) "IPv4: " fmt | 68 | #define pr_fmt(fmt) "IPv4: " fmt |
69 | 69 | ||
70 | #include <linux/err.h> | 70 | #include <linux/err.h> |
71 | #include <linux/errno.h> | 71 | #include <linux/errno.h> |
72 | #include <linux/types.h> | 72 | #include <linux/types.h> |
73 | #include <linux/socket.h> | 73 | #include <linux/socket.h> |
74 | #include <linux/in.h> | 74 | #include <linux/in.h> |
75 | #include <linux/kernel.h> | 75 | #include <linux/kernel.h> |
76 | #include <linux/module.h> | 76 | #include <linux/module.h> |
77 | #include <linux/sched.h> | 77 | #include <linux/sched.h> |
78 | #include <linux/timer.h> | 78 | #include <linux/timer.h> |
79 | #include <linux/string.h> | 79 | #include <linux/string.h> |
80 | #include <linux/sockios.h> | 80 | #include <linux/sockios.h> |
81 | #include <linux/net.h> | 81 | #include <linux/net.h> |
82 | #include <linux/capability.h> | 82 | #include <linux/capability.h> |
83 | #include <linux/fcntl.h> | 83 | #include <linux/fcntl.h> |
84 | #include <linux/mm.h> | 84 | #include <linux/mm.h> |
85 | #include <linux/interrupt.h> | 85 | #include <linux/interrupt.h> |
86 | #include <linux/stat.h> | 86 | #include <linux/stat.h> |
87 | #include <linux/init.h> | 87 | #include <linux/init.h> |
88 | #include <linux/poll.h> | 88 | #include <linux/poll.h> |
89 | #include <linux/netfilter_ipv4.h> | 89 | #include <linux/netfilter_ipv4.h> |
90 | #include <linux/random.h> | 90 | #include <linux/random.h> |
91 | #include <linux/slab.h> | 91 | #include <linux/slab.h> |
92 | 92 | ||
93 | #include <asm/uaccess.h> | 93 | #include <asm/uaccess.h> |
94 | 94 | ||
95 | #include <linux/inet.h> | 95 | #include <linux/inet.h> |
96 | #include <linux/igmp.h> | 96 | #include <linux/igmp.h> |
97 | #include <linux/inetdevice.h> | 97 | #include <linux/inetdevice.h> |
98 | #include <linux/netdevice.h> | 98 | #include <linux/netdevice.h> |
99 | #include <net/checksum.h> | 99 | #include <net/checksum.h> |
100 | #include <net/ip.h> | 100 | #include <net/ip.h> |
101 | #include <net/protocol.h> | 101 | #include <net/protocol.h> |
102 | #include <net/arp.h> | 102 | #include <net/arp.h> |
103 | #include <net/route.h> | 103 | #include <net/route.h> |
104 | #include <net/ip_fib.h> | 104 | #include <net/ip_fib.h> |
105 | #include <net/inet_connection_sock.h> | 105 | #include <net/inet_connection_sock.h> |
106 | #include <net/tcp.h> | 106 | #include <net/tcp.h> |
107 | #include <net/udp.h> | 107 | #include <net/udp.h> |
108 | #include <net/udplite.h> | 108 | #include <net/udplite.h> |
109 | #include <net/ping.h> | 109 | #include <net/ping.h> |
110 | #include <linux/skbuff.h> | 110 | #include <linux/skbuff.h> |
111 | #include <net/sock.h> | 111 | #include <net/sock.h> |
112 | #include <net/raw.h> | 112 | #include <net/raw.h> |
113 | #include <net/icmp.h> | 113 | #include <net/icmp.h> |
114 | #include <net/ipip.h> | 114 | #include <net/ipip.h> |
115 | #include <net/inet_common.h> | 115 | #include <net/inet_common.h> |
116 | #include <net/xfrm.h> | 116 | #include <net/xfrm.h> |
117 | #include <net/net_namespace.h> | 117 | #include <net/net_namespace.h> |
118 | #ifdef CONFIG_IP_MROUTE | 118 | #ifdef CONFIG_IP_MROUTE |
119 | #include <linux/mroute.h> | 119 | #include <linux/mroute.h> |
120 | #endif | 120 | #endif |
121 | 121 | ||
122 | 122 | ||
123 | /* The inetsw table contains everything that inet_create needs to | 123 | /* The inetsw table contains everything that inet_create needs to |
124 | * build a new socket. | 124 | * build a new socket. |
125 | */ | 125 | */ |
126 | static struct list_head inetsw[SOCK_MAX]; | 126 | static struct list_head inetsw[SOCK_MAX]; |
127 | static DEFINE_SPINLOCK(inetsw_lock); | 127 | static DEFINE_SPINLOCK(inetsw_lock); |
128 | 128 | ||
129 | struct ipv4_config ipv4_config; | 129 | struct ipv4_config ipv4_config; |
130 | EXPORT_SYMBOL(ipv4_config); | 130 | EXPORT_SYMBOL(ipv4_config); |
131 | 131 | ||
132 | /* New destruction routine */ | 132 | /* New destruction routine */ |
133 | 133 | ||
134 | void inet_sock_destruct(struct sock *sk) | 134 | void inet_sock_destruct(struct sock *sk) |
135 | { | 135 | { |
136 | struct inet_sock *inet = inet_sk(sk); | 136 | struct inet_sock *inet = inet_sk(sk); |
137 | 137 | ||
138 | __skb_queue_purge(&sk->sk_receive_queue); | 138 | __skb_queue_purge(&sk->sk_receive_queue); |
139 | __skb_queue_purge(&sk->sk_error_queue); | 139 | __skb_queue_purge(&sk->sk_error_queue); |
140 | 140 | ||
141 | sk_mem_reclaim(sk); | 141 | sk_mem_reclaim(sk); |
142 | 142 | ||
143 | if (sk->sk_type == SOCK_STREAM && sk->sk_state != TCP_CLOSE) { | 143 | if (sk->sk_type == SOCK_STREAM && sk->sk_state != TCP_CLOSE) { |
144 | pr_err("Attempt to release TCP socket in state %d %p\n", | 144 | pr_err("Attempt to release TCP socket in state %d %p\n", |
145 | sk->sk_state, sk); | 145 | sk->sk_state, sk); |
146 | return; | 146 | return; |
147 | } | 147 | } |
148 | if (!sock_flag(sk, SOCK_DEAD)) { | 148 | if (!sock_flag(sk, SOCK_DEAD)) { |
149 | pr_err("Attempt to release alive inet socket %p\n", sk); | 149 | pr_err("Attempt to release alive inet socket %p\n", sk); |
150 | return; | 150 | return; |
151 | } | 151 | } |
152 | 152 | ||
153 | WARN_ON(atomic_read(&sk->sk_rmem_alloc)); | 153 | WARN_ON(atomic_read(&sk->sk_rmem_alloc)); |
154 | WARN_ON(atomic_read(&sk->sk_wmem_alloc)); | 154 | WARN_ON(atomic_read(&sk->sk_wmem_alloc)); |
155 | WARN_ON(sk->sk_wmem_queued); | 155 | WARN_ON(sk->sk_wmem_queued); |
156 | WARN_ON(sk->sk_forward_alloc); | 156 | WARN_ON(sk->sk_forward_alloc); |
157 | 157 | ||
158 | kfree(rcu_dereference_protected(inet->inet_opt, 1)); | 158 | kfree(rcu_dereference_protected(inet->inet_opt, 1)); |
159 | dst_release(rcu_dereference_check(sk->sk_dst_cache, 1)); | 159 | dst_release(rcu_dereference_check(sk->sk_dst_cache, 1)); |
160 | dst_release(sk->sk_rx_dst); | 160 | dst_release(sk->sk_rx_dst); |
161 | sk_refcnt_debug_dec(sk); | 161 | sk_refcnt_debug_dec(sk); |
162 | } | 162 | } |
163 | EXPORT_SYMBOL(inet_sock_destruct); | 163 | EXPORT_SYMBOL(inet_sock_destruct); |
164 | 164 | ||
165 | /* | 165 | /* |
166 | * The routines beyond this point handle the behaviour of an AF_INET | 166 | * The routines beyond this point handle the behaviour of an AF_INET |
167 | * socket object. Mostly it punts to the subprotocols of IP to do | 167 | * socket object. Mostly it punts to the subprotocols of IP to do |
168 | * the work. | 168 | * the work. |
169 | */ | 169 | */ |
170 | 170 | ||
171 | /* | 171 | /* |
172 | * Automatically bind an unbound socket. | 172 | * Automatically bind an unbound socket. |
173 | */ | 173 | */ |
174 | 174 | ||
175 | static int inet_autobind(struct sock *sk) | 175 | static int inet_autobind(struct sock *sk) |
176 | { | 176 | { |
177 | struct inet_sock *inet; | 177 | struct inet_sock *inet; |
178 | /* We may need to bind the socket. */ | 178 | /* We may need to bind the socket. */ |
179 | lock_sock(sk); | 179 | lock_sock(sk); |
180 | inet = inet_sk(sk); | 180 | inet = inet_sk(sk); |
181 | if (!inet->inet_num) { | 181 | if (!inet->inet_num) { |
182 | if (sk->sk_prot->get_port(sk, 0)) { | 182 | if (sk->sk_prot->get_port(sk, 0)) { |
183 | release_sock(sk); | 183 | release_sock(sk); |
184 | return -EAGAIN; | 184 | return -EAGAIN; |
185 | } | 185 | } |
186 | inet->inet_sport = htons(inet->inet_num); | 186 | inet->inet_sport = htons(inet->inet_num); |
187 | } | 187 | } |
188 | release_sock(sk); | 188 | release_sock(sk); |
189 | return 0; | 189 | return 0; |
190 | } | 190 | } |
191 | 191 | ||
192 | /* | 192 | /* |
193 | * Move a socket into listening state. | 193 | * Move a socket into listening state. |
194 | */ | 194 | */ |
195 | int inet_listen(struct socket *sock, int backlog) | 195 | int inet_listen(struct socket *sock, int backlog) |
196 | { | 196 | { |
197 | struct sock *sk = sock->sk; | 197 | struct sock *sk = sock->sk; |
198 | unsigned char old_state; | 198 | unsigned char old_state; |
199 | int err; | 199 | int err; |
200 | 200 | ||
201 | lock_sock(sk); | 201 | lock_sock(sk); |
202 | 202 | ||
203 | err = -EINVAL; | 203 | err = -EINVAL; |
204 | if (sock->state != SS_UNCONNECTED || sock->type != SOCK_STREAM) | 204 | if (sock->state != SS_UNCONNECTED || sock->type != SOCK_STREAM) |
205 | goto out; | 205 | goto out; |
206 | 206 | ||
207 | old_state = sk->sk_state; | 207 | old_state = sk->sk_state; |
208 | if (!((1 << old_state) & (TCPF_CLOSE | TCPF_LISTEN))) | 208 | if (!((1 << old_state) & (TCPF_CLOSE | TCPF_LISTEN))) |
209 | goto out; | 209 | goto out; |
210 | 210 | ||
211 | /* Really, if the socket is already in listen state | 211 | /* Really, if the socket is already in listen state |
212 | * we can only allow the backlog to be adjusted. | 212 | * we can only allow the backlog to be adjusted. |
213 | */ | 213 | */ |
214 | if (old_state != TCP_LISTEN) { | 214 | if (old_state != TCP_LISTEN) { |
215 | /* Check special setups for testing purpose to enable TFO w/o | 215 | /* Check special setups for testing purpose to enable TFO w/o |
216 | * requiring TCP_FASTOPEN sockopt. | 216 | * requiring TCP_FASTOPEN sockopt. |
217 | * Note that only TCP sockets (SOCK_STREAM) will reach here. | 217 | * Note that only TCP sockets (SOCK_STREAM) will reach here. |
218 | * Also fastopenq may already been allocated because this | 218 | * Also fastopenq may already been allocated because this |
219 | * socket was in TCP_LISTEN state previously but was | 219 | * socket was in TCP_LISTEN state previously but was |
220 | * shutdown() (rather than close()). | 220 | * shutdown() (rather than close()). |
221 | */ | 221 | */ |
222 | if ((sysctl_tcp_fastopen & TFO_SERVER_ENABLE) != 0 && | 222 | if ((sysctl_tcp_fastopen & TFO_SERVER_ENABLE) != 0 && |
223 | inet_csk(sk)->icsk_accept_queue.fastopenq == NULL) { | 223 | inet_csk(sk)->icsk_accept_queue.fastopenq == NULL) { |
224 | if ((sysctl_tcp_fastopen & TFO_SERVER_WO_SOCKOPT1) != 0) | 224 | if ((sysctl_tcp_fastopen & TFO_SERVER_WO_SOCKOPT1) != 0) |
225 | err = fastopen_init_queue(sk, backlog); | 225 | err = fastopen_init_queue(sk, backlog); |
226 | else if ((sysctl_tcp_fastopen & | 226 | else if ((sysctl_tcp_fastopen & |
227 | TFO_SERVER_WO_SOCKOPT2) != 0) | 227 | TFO_SERVER_WO_SOCKOPT2) != 0) |
228 | err = fastopen_init_queue(sk, | 228 | err = fastopen_init_queue(sk, |
229 | ((uint)sysctl_tcp_fastopen) >> 16); | 229 | ((uint)sysctl_tcp_fastopen) >> 16); |
230 | else | 230 | else |
231 | err = 0; | 231 | err = 0; |
232 | if (err) | 232 | if (err) |
233 | goto out; | 233 | goto out; |
234 | } | 234 | } |
235 | err = inet_csk_listen_start(sk, backlog); | 235 | err = inet_csk_listen_start(sk, backlog); |
236 | if (err) | 236 | if (err) |
237 | goto out; | 237 | goto out; |
238 | } | 238 | } |
239 | sk->sk_max_ack_backlog = backlog; | 239 | sk->sk_max_ack_backlog = backlog; |
240 | err = 0; | 240 | err = 0; |
241 | 241 | ||
242 | out: | 242 | out: |
243 | release_sock(sk); | 243 | release_sock(sk); |
244 | return err; | 244 | return err; |
245 | } | 245 | } |
246 | EXPORT_SYMBOL(inet_listen); | 246 | EXPORT_SYMBOL(inet_listen); |
247 | 247 | ||
248 | u32 inet_ehash_secret __read_mostly; | 248 | u32 inet_ehash_secret __read_mostly; |
249 | EXPORT_SYMBOL(inet_ehash_secret); | 249 | EXPORT_SYMBOL(inet_ehash_secret); |
250 | 250 | ||
251 | /* | 251 | /* |
252 | * inet_ehash_secret must be set exactly once | 252 | * inet_ehash_secret must be set exactly once |
253 | */ | 253 | */ |
254 | void build_ehash_secret(void) | 254 | void build_ehash_secret(void) |
255 | { | 255 | { |
256 | u32 rnd; | 256 | u32 rnd; |
257 | 257 | ||
258 | do { | 258 | do { |
259 | get_random_bytes(&rnd, sizeof(rnd)); | 259 | get_random_bytes(&rnd, sizeof(rnd)); |
260 | } while (rnd == 0); | 260 | } while (rnd == 0); |
261 | 261 | ||
262 | cmpxchg(&inet_ehash_secret, 0, rnd); | 262 | cmpxchg(&inet_ehash_secret, 0, rnd); |
263 | } | 263 | } |
264 | EXPORT_SYMBOL(build_ehash_secret); | 264 | EXPORT_SYMBOL(build_ehash_secret); |
265 | 265 | ||
266 | static inline int inet_netns_ok(struct net *net, __u8 protocol) | 266 | static inline int inet_netns_ok(struct net *net, __u8 protocol) |
267 | { | 267 | { |
268 | const struct net_protocol *ipprot; | 268 | const struct net_protocol *ipprot; |
269 | 269 | ||
270 | if (net_eq(net, &init_net)) | 270 | if (net_eq(net, &init_net)) |
271 | return 1; | 271 | return 1; |
272 | 272 | ||
273 | ipprot = rcu_dereference(inet_protos[protocol]); | 273 | ipprot = rcu_dereference(inet_protos[protocol]); |
274 | if (ipprot == NULL) { | 274 | if (ipprot == NULL) { |
275 | /* raw IP is OK */ | 275 | /* raw IP is OK */ |
276 | return 1; | 276 | return 1; |
277 | } | 277 | } |
278 | return ipprot->netns_ok; | 278 | return ipprot->netns_ok; |
279 | } | 279 | } |
280 | 280 | ||
281 | /* | 281 | /* |
282 | * Create an inet socket. | 282 | * Create an inet socket. |
283 | */ | 283 | */ |
284 | 284 | ||
285 | static int inet_create(struct net *net, struct socket *sock, int protocol, | 285 | static int inet_create(struct net *net, struct socket *sock, int protocol, |
286 | int kern) | 286 | int kern) |
287 | { | 287 | { |
288 | struct sock *sk; | 288 | struct sock *sk; |
289 | struct inet_protosw *answer; | 289 | struct inet_protosw *answer; |
290 | struct inet_sock *inet; | 290 | struct inet_sock *inet; |
291 | struct proto *answer_prot; | 291 | struct proto *answer_prot; |
292 | unsigned char answer_flags; | 292 | unsigned char answer_flags; |
293 | char answer_no_check; | 293 | char answer_no_check; |
294 | int try_loading_module = 0; | 294 | int try_loading_module = 0; |
295 | int err; | 295 | int err; |
296 | 296 | ||
297 | if (unlikely(!inet_ehash_secret)) | 297 | if (unlikely(!inet_ehash_secret)) |
298 | if (sock->type != SOCK_RAW && sock->type != SOCK_DGRAM) | 298 | if (sock->type != SOCK_RAW && sock->type != SOCK_DGRAM) |
299 | build_ehash_secret(); | 299 | build_ehash_secret(); |
300 | 300 | ||
301 | sock->state = SS_UNCONNECTED; | 301 | sock->state = SS_UNCONNECTED; |
302 | 302 | ||
303 | /* Look for the requested type/protocol pair. */ | 303 | /* Look for the requested type/protocol pair. */ |
304 | lookup_protocol: | 304 | lookup_protocol: |
305 | err = -ESOCKTNOSUPPORT; | 305 | err = -ESOCKTNOSUPPORT; |
306 | rcu_read_lock(); | 306 | rcu_read_lock(); |
307 | list_for_each_entry_rcu(answer, &inetsw[sock->type], list) { | 307 | list_for_each_entry_rcu(answer, &inetsw[sock->type], list) { |
308 | 308 | ||
309 | err = 0; | 309 | err = 0; |
310 | /* Check the non-wild match. */ | 310 | /* Check the non-wild match. */ |
311 | if (protocol == answer->protocol) { | 311 | if (protocol == answer->protocol) { |
312 | if (protocol != IPPROTO_IP) | 312 | if (protocol != IPPROTO_IP) |
313 | break; | 313 | break; |
314 | } else { | 314 | } else { |
315 | /* Check for the two wild cases. */ | 315 | /* Check for the two wild cases. */ |
316 | if (IPPROTO_IP == protocol) { | 316 | if (IPPROTO_IP == protocol) { |
317 | protocol = answer->protocol; | 317 | protocol = answer->protocol; |
318 | break; | 318 | break; |
319 | } | 319 | } |
320 | if (IPPROTO_IP == answer->protocol) | 320 | if (IPPROTO_IP == answer->protocol) |
321 | break; | 321 | break; |
322 | } | 322 | } |
323 | err = -EPROTONOSUPPORT; | 323 | err = -EPROTONOSUPPORT; |
324 | } | 324 | } |
325 | 325 | ||
326 | if (unlikely(err)) { | 326 | if (unlikely(err)) { |
327 | if (try_loading_module < 2) { | 327 | if (try_loading_module < 2) { |
328 | rcu_read_unlock(); | 328 | rcu_read_unlock(); |
329 | /* | 329 | /* |
330 | * Be more specific, e.g. net-pf-2-proto-132-type-1 | 330 | * Be more specific, e.g. net-pf-2-proto-132-type-1 |
331 | * (net-pf-PF_INET-proto-IPPROTO_SCTP-type-SOCK_STREAM) | 331 | * (net-pf-PF_INET-proto-IPPROTO_SCTP-type-SOCK_STREAM) |
332 | */ | 332 | */ |
333 | if (++try_loading_module == 1) | 333 | if (++try_loading_module == 1) |
334 | request_module("net-pf-%d-proto-%d-type-%d", | 334 | request_module("net-pf-%d-proto-%d-type-%d", |
335 | PF_INET, protocol, sock->type); | 335 | PF_INET, protocol, sock->type); |
336 | /* | 336 | /* |
337 | * Fall back to generic, e.g. net-pf-2-proto-132 | 337 | * Fall back to generic, e.g. net-pf-2-proto-132 |
338 | * (net-pf-PF_INET-proto-IPPROTO_SCTP) | 338 | * (net-pf-PF_INET-proto-IPPROTO_SCTP) |
339 | */ | 339 | */ |
340 | else | 340 | else |
341 | request_module("net-pf-%d-proto-%d", | 341 | request_module("net-pf-%d-proto-%d", |
342 | PF_INET, protocol); | 342 | PF_INET, protocol); |
343 | goto lookup_protocol; | 343 | goto lookup_protocol; |
344 | } else | 344 | } else |
345 | goto out_rcu_unlock; | 345 | goto out_rcu_unlock; |
346 | } | 346 | } |
347 | 347 | ||
348 | err = -EPERM; | 348 | err = -EPERM; |
349 | if (sock->type == SOCK_RAW && !kern && | 349 | if (sock->type == SOCK_RAW && !kern && |
350 | !ns_capable(net->user_ns, CAP_NET_RAW)) | 350 | !ns_capable(net->user_ns, CAP_NET_RAW)) |
351 | goto out_rcu_unlock; | 351 | goto out_rcu_unlock; |
352 | 352 | ||
353 | err = -EAFNOSUPPORT; | 353 | err = -EAFNOSUPPORT; |
354 | if (!inet_netns_ok(net, protocol)) | 354 | if (!inet_netns_ok(net, protocol)) |
355 | goto out_rcu_unlock; | 355 | goto out_rcu_unlock; |
356 | 356 | ||
357 | sock->ops = answer->ops; | 357 | sock->ops = answer->ops; |
358 | answer_prot = answer->prot; | 358 | answer_prot = answer->prot; |
359 | answer_no_check = answer->no_check; | 359 | answer_no_check = answer->no_check; |
360 | answer_flags = answer->flags; | 360 | answer_flags = answer->flags; |
361 | rcu_read_unlock(); | 361 | rcu_read_unlock(); |
362 | 362 | ||
363 | WARN_ON(answer_prot->slab == NULL); | 363 | WARN_ON(answer_prot->slab == NULL); |
364 | 364 | ||
365 | err = -ENOBUFS; | 365 | err = -ENOBUFS; |
366 | sk = sk_alloc(net, PF_INET, GFP_KERNEL, answer_prot); | 366 | sk = sk_alloc(net, PF_INET, GFP_KERNEL, answer_prot); |
367 | if (sk == NULL) | 367 | if (sk == NULL) |
368 | goto out; | 368 | goto out; |
369 | 369 | ||
370 | err = 0; | 370 | err = 0; |
371 | sk->sk_no_check = answer_no_check; | 371 | sk->sk_no_check = answer_no_check; |
372 | if (INET_PROTOSW_REUSE & answer_flags) | 372 | if (INET_PROTOSW_REUSE & answer_flags) |
373 | sk->sk_reuse = SK_CAN_REUSE; | 373 | sk->sk_reuse = SK_CAN_REUSE; |
374 | 374 | ||
375 | inet = inet_sk(sk); | 375 | inet = inet_sk(sk); |
376 | inet->is_icsk = (INET_PROTOSW_ICSK & answer_flags) != 0; | 376 | inet->is_icsk = (INET_PROTOSW_ICSK & answer_flags) != 0; |
377 | 377 | ||
378 | inet->nodefrag = 0; | 378 | inet->nodefrag = 0; |
379 | 379 | ||
380 | if (SOCK_RAW == sock->type) { | 380 | if (SOCK_RAW == sock->type) { |
381 | inet->inet_num = protocol; | 381 | inet->inet_num = protocol; |
382 | if (IPPROTO_RAW == protocol) | 382 | if (IPPROTO_RAW == protocol) |
383 | inet->hdrincl = 1; | 383 | inet->hdrincl = 1; |
384 | } | 384 | } |
385 | 385 | ||
386 | if (ipv4_config.no_pmtu_disc) | 386 | if (ipv4_config.no_pmtu_disc) |
387 | inet->pmtudisc = IP_PMTUDISC_DONT; | 387 | inet->pmtudisc = IP_PMTUDISC_DONT; |
388 | else | 388 | else |
389 | inet->pmtudisc = IP_PMTUDISC_WANT; | 389 | inet->pmtudisc = IP_PMTUDISC_WANT; |
390 | 390 | ||
391 | inet->inet_id = 0; | 391 | inet->inet_id = 0; |
392 | 392 | ||
393 | sock_init_data(sock, sk); | 393 | sock_init_data(sock, sk); |
394 | 394 | ||
395 | sk->sk_destruct = inet_sock_destruct; | 395 | sk->sk_destruct = inet_sock_destruct; |
396 | sk->sk_protocol = protocol; | 396 | sk->sk_protocol = protocol; |
397 | sk->sk_backlog_rcv = sk->sk_prot->backlog_rcv; | 397 | sk->sk_backlog_rcv = sk->sk_prot->backlog_rcv; |
398 | 398 | ||
399 | inet->uc_ttl = -1; | 399 | inet->uc_ttl = -1; |
400 | inet->mc_loop = 1; | 400 | inet->mc_loop = 1; |
401 | inet->mc_ttl = 1; | 401 | inet->mc_ttl = 1; |
402 | inet->mc_all = 1; | 402 | inet->mc_all = 1; |
403 | inet->mc_index = 0; | 403 | inet->mc_index = 0; |
404 | inet->mc_list = NULL; | 404 | inet->mc_list = NULL; |
405 | inet->rcv_tos = 0; | 405 | inet->rcv_tos = 0; |
406 | 406 | ||
407 | sk_refcnt_debug_inc(sk); | 407 | sk_refcnt_debug_inc(sk); |
408 | 408 | ||
409 | if (inet->inet_num) { | 409 | if (inet->inet_num) { |
410 | /* It assumes that any protocol which allows | 410 | /* It assumes that any protocol which allows |
411 | * the user to assign a number at socket | 411 | * the user to assign a number at socket |
412 | * creation time automatically | 412 | * creation time automatically |
413 | * shares. | 413 | * shares. |
414 | */ | 414 | */ |
415 | inet->inet_sport = htons(inet->inet_num); | 415 | inet->inet_sport = htons(inet->inet_num); |
416 | /* Add to protocol hash chains. */ | 416 | /* Add to protocol hash chains. */ |
417 | sk->sk_prot->hash(sk); | 417 | sk->sk_prot->hash(sk); |
418 | } | 418 | } |
419 | 419 | ||
420 | if (sk->sk_prot->init) { | 420 | if (sk->sk_prot->init) { |
421 | err = sk->sk_prot->init(sk); | 421 | err = sk->sk_prot->init(sk); |
422 | if (err) | 422 | if (err) |
423 | sk_common_release(sk); | 423 | sk_common_release(sk); |
424 | } | 424 | } |
425 | out: | 425 | out: |
426 | return err; | 426 | return err; |
427 | out_rcu_unlock: | 427 | out_rcu_unlock: |
428 | rcu_read_unlock(); | 428 | rcu_read_unlock(); |
429 | goto out; | 429 | goto out; |
430 | } | 430 | } |
431 | 431 | ||
432 | 432 | ||
433 | /* | 433 | /* |
434 | * The peer socket should always be NULL (or else). When we call this | 434 | * The peer socket should always be NULL (or else). When we call this |
435 | * function we are destroying the object and from then on nobody | 435 | * function we are destroying the object and from then on nobody |
436 | * should refer to it. | 436 | * should refer to it. |
437 | */ | 437 | */ |
438 | int inet_release(struct socket *sock) | 438 | int inet_release(struct socket *sock) |
439 | { | 439 | { |
440 | struct sock *sk = sock->sk; | 440 | struct sock *sk = sock->sk; |
441 | 441 | ||
442 | if (sk) { | 442 | if (sk) { |
443 | long timeout; | 443 | long timeout; |
444 | 444 | ||
445 | sock_rps_reset_flow(sk); | 445 | sock_rps_reset_flow(sk); |
446 | 446 | ||
447 | /* Applications forget to leave groups before exiting */ | 447 | /* Applications forget to leave groups before exiting */ |
448 | ip_mc_drop_socket(sk); | 448 | ip_mc_drop_socket(sk); |
449 | 449 | ||
450 | /* If linger is set, we don't return until the close | 450 | /* If linger is set, we don't return until the close |
451 | * is complete. Otherwise we return immediately. The | 451 | * is complete. Otherwise we return immediately. The |
452 | * actually closing is done the same either way. | 452 | * actually closing is done the same either way. |
453 | * | 453 | * |
454 | * If the close is due to the process exiting, we never | 454 | * If the close is due to the process exiting, we never |
455 | * linger.. | 455 | * linger.. |
456 | */ | 456 | */ |
457 | timeout = 0; | 457 | timeout = 0; |
458 | if (sock_flag(sk, SOCK_LINGER) && | 458 | if (sock_flag(sk, SOCK_LINGER) && |
459 | !(current->flags & PF_EXITING)) | 459 | !(current->flags & PF_EXITING)) |
460 | timeout = sk->sk_lingertime; | 460 | timeout = sk->sk_lingertime; |
461 | sock->sk = NULL; | 461 | sock->sk = NULL; |
462 | sk->sk_prot->close(sk, timeout); | 462 | sk->sk_prot->close(sk, timeout); |
463 | } | 463 | } |
464 | return 0; | 464 | return 0; |
465 | } | 465 | } |
466 | EXPORT_SYMBOL(inet_release); | 466 | EXPORT_SYMBOL(inet_release); |
467 | 467 | ||
468 | /* It is off by default, see below. */ | 468 | /* It is off by default, see below. */ |
469 | int sysctl_ip_nonlocal_bind __read_mostly; | 469 | int sysctl_ip_nonlocal_bind __read_mostly; |
470 | EXPORT_SYMBOL(sysctl_ip_nonlocal_bind); | 470 | EXPORT_SYMBOL(sysctl_ip_nonlocal_bind); |
471 | 471 | ||
472 | int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | 472 | int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) |
473 | { | 473 | { |
474 | struct sockaddr_in *addr = (struct sockaddr_in *)uaddr; | 474 | struct sockaddr_in *addr = (struct sockaddr_in *)uaddr; |
475 | struct sock *sk = sock->sk; | 475 | struct sock *sk = sock->sk; |
476 | struct inet_sock *inet = inet_sk(sk); | 476 | struct inet_sock *inet = inet_sk(sk); |
477 | struct net *net = sock_net(sk); | ||
477 | unsigned short snum; | 478 | unsigned short snum; |
478 | int chk_addr_ret; | 479 | int chk_addr_ret; |
479 | int err; | 480 | int err; |
480 | 481 | ||
481 | /* If the socket has its own bind function then use it. (RAW) */ | 482 | /* If the socket has its own bind function then use it. (RAW) */ |
482 | if (sk->sk_prot->bind) { | 483 | if (sk->sk_prot->bind) { |
483 | err = sk->sk_prot->bind(sk, uaddr, addr_len); | 484 | err = sk->sk_prot->bind(sk, uaddr, addr_len); |
484 | goto out; | 485 | goto out; |
485 | } | 486 | } |
486 | err = -EINVAL; | 487 | err = -EINVAL; |
487 | if (addr_len < sizeof(struct sockaddr_in)) | 488 | if (addr_len < sizeof(struct sockaddr_in)) |
488 | goto out; | 489 | goto out; |
489 | 490 | ||
490 | if (addr->sin_family != AF_INET) { | 491 | if (addr->sin_family != AF_INET) { |
491 | /* Compatibility games : accept AF_UNSPEC (mapped to AF_INET) | 492 | /* Compatibility games : accept AF_UNSPEC (mapped to AF_INET) |
492 | * only if s_addr is INADDR_ANY. | 493 | * only if s_addr is INADDR_ANY. |
493 | */ | 494 | */ |
494 | err = -EAFNOSUPPORT; | 495 | err = -EAFNOSUPPORT; |
495 | if (addr->sin_family != AF_UNSPEC || | 496 | if (addr->sin_family != AF_UNSPEC || |
496 | addr->sin_addr.s_addr != htonl(INADDR_ANY)) | 497 | addr->sin_addr.s_addr != htonl(INADDR_ANY)) |
497 | goto out; | 498 | goto out; |
498 | } | 499 | } |
499 | 500 | ||
500 | chk_addr_ret = inet_addr_type(sock_net(sk), addr->sin_addr.s_addr); | 501 | chk_addr_ret = inet_addr_type(net, addr->sin_addr.s_addr); |
501 | 502 | ||
502 | /* Not specified by any standard per-se, however it breaks too | 503 | /* Not specified by any standard per-se, however it breaks too |
503 | * many applications when removed. It is unfortunate since | 504 | * many applications when removed. It is unfortunate since |
504 | * allowing applications to make a non-local bind solves | 505 | * allowing applications to make a non-local bind solves |
505 | * several problems with systems using dynamic addressing. | 506 | * several problems with systems using dynamic addressing. |
506 | * (ie. your servers still start up even if your ISDN link | 507 | * (ie. your servers still start up even if your ISDN link |
507 | * is temporarily down) | 508 | * is temporarily down) |
508 | */ | 509 | */ |
509 | err = -EADDRNOTAVAIL; | 510 | err = -EADDRNOTAVAIL; |
510 | if (!sysctl_ip_nonlocal_bind && | 511 | if (!sysctl_ip_nonlocal_bind && |
511 | !(inet->freebind || inet->transparent) && | 512 | !(inet->freebind || inet->transparent) && |
512 | addr->sin_addr.s_addr != htonl(INADDR_ANY) && | 513 | addr->sin_addr.s_addr != htonl(INADDR_ANY) && |
513 | chk_addr_ret != RTN_LOCAL && | 514 | chk_addr_ret != RTN_LOCAL && |
514 | chk_addr_ret != RTN_MULTICAST && | 515 | chk_addr_ret != RTN_MULTICAST && |
515 | chk_addr_ret != RTN_BROADCAST) | 516 | chk_addr_ret != RTN_BROADCAST) |
516 | goto out; | 517 | goto out; |
517 | 518 | ||
518 | snum = ntohs(addr->sin_port); | 519 | snum = ntohs(addr->sin_port); |
519 | err = -EACCES; | 520 | err = -EACCES; |
520 | if (snum && snum < PROT_SOCK && !capable(CAP_NET_BIND_SERVICE)) | 521 | if (snum && snum < PROT_SOCK && |
522 | !ns_capable(net->user_ns, CAP_NET_BIND_SERVICE)) | ||
521 | goto out; | 523 | goto out; |
522 | 524 | ||
523 | /* We keep a pair of addresses. rcv_saddr is the one | 525 | /* We keep a pair of addresses. rcv_saddr is the one |
524 | * used by hash lookups, and saddr is used for transmit. | 526 | * used by hash lookups, and saddr is used for transmit. |
525 | * | 527 | * |
526 | * In the BSD API these are the same except where it | 528 | * In the BSD API these are the same except where it |
527 | * would be illegal to use them (multicast/broadcast) in | 529 | * would be illegal to use them (multicast/broadcast) in |
528 | * which case the sending device address is used. | 530 | * which case the sending device address is used. |
529 | */ | 531 | */ |
530 | lock_sock(sk); | 532 | lock_sock(sk); |
531 | 533 | ||
532 | /* Check these errors (active socket, double bind). */ | 534 | /* Check these errors (active socket, double bind). */ |
533 | err = -EINVAL; | 535 | err = -EINVAL; |
534 | if (sk->sk_state != TCP_CLOSE || inet->inet_num) | 536 | if (sk->sk_state != TCP_CLOSE || inet->inet_num) |
535 | goto out_release_sock; | 537 | goto out_release_sock; |
536 | 538 | ||
537 | inet->inet_rcv_saddr = inet->inet_saddr = addr->sin_addr.s_addr; | 539 | inet->inet_rcv_saddr = inet->inet_saddr = addr->sin_addr.s_addr; |
538 | if (chk_addr_ret == RTN_MULTICAST || chk_addr_ret == RTN_BROADCAST) | 540 | if (chk_addr_ret == RTN_MULTICAST || chk_addr_ret == RTN_BROADCAST) |
539 | inet->inet_saddr = 0; /* Use device */ | 541 | inet->inet_saddr = 0; /* Use device */ |
540 | 542 | ||
541 | /* Make sure we are allowed to bind here. */ | 543 | /* Make sure we are allowed to bind here. */ |
542 | if (sk->sk_prot->get_port(sk, snum)) { | 544 | if (sk->sk_prot->get_port(sk, snum)) { |
543 | inet->inet_saddr = inet->inet_rcv_saddr = 0; | 545 | inet->inet_saddr = inet->inet_rcv_saddr = 0; |
544 | err = -EADDRINUSE; | 546 | err = -EADDRINUSE; |
545 | goto out_release_sock; | 547 | goto out_release_sock; |
546 | } | 548 | } |
547 | 549 | ||
548 | if (inet->inet_rcv_saddr) | 550 | if (inet->inet_rcv_saddr) |
549 | sk->sk_userlocks |= SOCK_BINDADDR_LOCK; | 551 | sk->sk_userlocks |= SOCK_BINDADDR_LOCK; |
550 | if (snum) | 552 | if (snum) |
551 | sk->sk_userlocks |= SOCK_BINDPORT_LOCK; | 553 | sk->sk_userlocks |= SOCK_BINDPORT_LOCK; |
552 | inet->inet_sport = htons(inet->inet_num); | 554 | inet->inet_sport = htons(inet->inet_num); |
553 | inet->inet_daddr = 0; | 555 | inet->inet_daddr = 0; |
554 | inet->inet_dport = 0; | 556 | inet->inet_dport = 0; |
555 | sk_dst_reset(sk); | 557 | sk_dst_reset(sk); |
556 | err = 0; | 558 | err = 0; |
557 | out_release_sock: | 559 | out_release_sock: |
558 | release_sock(sk); | 560 | release_sock(sk); |
559 | out: | 561 | out: |
560 | return err; | 562 | return err; |
561 | } | 563 | } |
562 | EXPORT_SYMBOL(inet_bind); | 564 | EXPORT_SYMBOL(inet_bind); |
563 | 565 | ||
564 | int inet_dgram_connect(struct socket *sock, struct sockaddr *uaddr, | 566 | int inet_dgram_connect(struct socket *sock, struct sockaddr *uaddr, |
565 | int addr_len, int flags) | 567 | int addr_len, int flags) |
566 | { | 568 | { |
567 | struct sock *sk = sock->sk; | 569 | struct sock *sk = sock->sk; |
568 | 570 | ||
569 | if (addr_len < sizeof(uaddr->sa_family)) | 571 | if (addr_len < sizeof(uaddr->sa_family)) |
570 | return -EINVAL; | 572 | return -EINVAL; |
571 | if (uaddr->sa_family == AF_UNSPEC) | 573 | if (uaddr->sa_family == AF_UNSPEC) |
572 | return sk->sk_prot->disconnect(sk, flags); | 574 | return sk->sk_prot->disconnect(sk, flags); |
573 | 575 | ||
574 | if (!inet_sk(sk)->inet_num && inet_autobind(sk)) | 576 | if (!inet_sk(sk)->inet_num && inet_autobind(sk)) |
575 | return -EAGAIN; | 577 | return -EAGAIN; |
576 | return sk->sk_prot->connect(sk, uaddr, addr_len); | 578 | return sk->sk_prot->connect(sk, uaddr, addr_len); |
577 | } | 579 | } |
578 | EXPORT_SYMBOL(inet_dgram_connect); | 580 | EXPORT_SYMBOL(inet_dgram_connect); |
579 | 581 | ||
580 | static long inet_wait_for_connect(struct sock *sk, long timeo, int writebias) | 582 | static long inet_wait_for_connect(struct sock *sk, long timeo, int writebias) |
581 | { | 583 | { |
582 | DEFINE_WAIT(wait); | 584 | DEFINE_WAIT(wait); |
583 | 585 | ||
584 | prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); | 586 | prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); |
585 | sk->sk_write_pending += writebias; | 587 | sk->sk_write_pending += writebias; |
586 | 588 | ||
587 | /* Basic assumption: if someone sets sk->sk_err, he _must_ | 589 | /* Basic assumption: if someone sets sk->sk_err, he _must_ |
588 | * change state of the socket from TCP_SYN_*. | 590 | * change state of the socket from TCP_SYN_*. |
589 | * Connect() does not allow to get error notifications | 591 | * Connect() does not allow to get error notifications |
590 | * without closing the socket. | 592 | * without closing the socket. |
591 | */ | 593 | */ |
592 | while ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) { | 594 | while ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) { |
593 | release_sock(sk); | 595 | release_sock(sk); |
594 | timeo = schedule_timeout(timeo); | 596 | timeo = schedule_timeout(timeo); |
595 | lock_sock(sk); | 597 | lock_sock(sk); |
596 | if (signal_pending(current) || !timeo) | 598 | if (signal_pending(current) || !timeo) |
597 | break; | 599 | break; |
598 | prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); | 600 | prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); |
599 | } | 601 | } |
600 | finish_wait(sk_sleep(sk), &wait); | 602 | finish_wait(sk_sleep(sk), &wait); |
601 | sk->sk_write_pending -= writebias; | 603 | sk->sk_write_pending -= writebias; |
602 | return timeo; | 604 | return timeo; |
603 | } | 605 | } |
604 | 606 | ||
605 | /* | 607 | /* |
606 | * Connect to a remote host. There is regrettably still a little | 608 | * Connect to a remote host. There is regrettably still a little |
607 | * TCP 'magic' in here. | 609 | * TCP 'magic' in here. |
608 | */ | 610 | */ |
609 | int __inet_stream_connect(struct socket *sock, struct sockaddr *uaddr, | 611 | int __inet_stream_connect(struct socket *sock, struct sockaddr *uaddr, |
610 | int addr_len, int flags) | 612 | int addr_len, int flags) |
611 | { | 613 | { |
612 | struct sock *sk = sock->sk; | 614 | struct sock *sk = sock->sk; |
613 | int err; | 615 | int err; |
614 | long timeo; | 616 | long timeo; |
615 | 617 | ||
616 | if (addr_len < sizeof(uaddr->sa_family)) | 618 | if (addr_len < sizeof(uaddr->sa_family)) |
617 | return -EINVAL; | 619 | return -EINVAL; |
618 | 620 | ||
619 | if (uaddr->sa_family == AF_UNSPEC) { | 621 | if (uaddr->sa_family == AF_UNSPEC) { |
620 | err = sk->sk_prot->disconnect(sk, flags); | 622 | err = sk->sk_prot->disconnect(sk, flags); |
621 | sock->state = err ? SS_DISCONNECTING : SS_UNCONNECTED; | 623 | sock->state = err ? SS_DISCONNECTING : SS_UNCONNECTED; |
622 | goto out; | 624 | goto out; |
623 | } | 625 | } |
624 | 626 | ||
625 | switch (sock->state) { | 627 | switch (sock->state) { |
626 | default: | 628 | default: |
627 | err = -EINVAL; | 629 | err = -EINVAL; |
628 | goto out; | 630 | goto out; |
629 | case SS_CONNECTED: | 631 | case SS_CONNECTED: |
630 | err = -EISCONN; | 632 | err = -EISCONN; |
631 | goto out; | 633 | goto out; |
632 | case SS_CONNECTING: | 634 | case SS_CONNECTING: |
633 | err = -EALREADY; | 635 | err = -EALREADY; |
634 | /* Fall out of switch with err, set for this state */ | 636 | /* Fall out of switch with err, set for this state */ |
635 | break; | 637 | break; |
636 | case SS_UNCONNECTED: | 638 | case SS_UNCONNECTED: |
637 | err = -EISCONN; | 639 | err = -EISCONN; |
638 | if (sk->sk_state != TCP_CLOSE) | 640 | if (sk->sk_state != TCP_CLOSE) |
639 | goto out; | 641 | goto out; |
640 | 642 | ||
641 | err = sk->sk_prot->connect(sk, uaddr, addr_len); | 643 | err = sk->sk_prot->connect(sk, uaddr, addr_len); |
642 | if (err < 0) | 644 | if (err < 0) |
643 | goto out; | 645 | goto out; |
644 | 646 | ||
645 | sock->state = SS_CONNECTING; | 647 | sock->state = SS_CONNECTING; |
646 | 648 | ||
647 | /* Just entered SS_CONNECTING state; the only | 649 | /* Just entered SS_CONNECTING state; the only |
648 | * difference is that return value in non-blocking | 650 | * difference is that return value in non-blocking |
649 | * case is EINPROGRESS, rather than EALREADY. | 651 | * case is EINPROGRESS, rather than EALREADY. |
650 | */ | 652 | */ |
651 | err = -EINPROGRESS; | 653 | err = -EINPROGRESS; |
652 | break; | 654 | break; |
653 | } | 655 | } |
654 | 656 | ||
655 | timeo = sock_sndtimeo(sk, flags & O_NONBLOCK); | 657 | timeo = sock_sndtimeo(sk, flags & O_NONBLOCK); |
656 | 658 | ||
657 | if ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) { | 659 | if ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) { |
658 | int writebias = (sk->sk_protocol == IPPROTO_TCP) && | 660 | int writebias = (sk->sk_protocol == IPPROTO_TCP) && |
659 | tcp_sk(sk)->fastopen_req && | 661 | tcp_sk(sk)->fastopen_req && |
660 | tcp_sk(sk)->fastopen_req->data ? 1 : 0; | 662 | tcp_sk(sk)->fastopen_req->data ? 1 : 0; |
661 | 663 | ||
662 | /* Error code is set above */ | 664 | /* Error code is set above */ |
663 | if (!timeo || !inet_wait_for_connect(sk, timeo, writebias)) | 665 | if (!timeo || !inet_wait_for_connect(sk, timeo, writebias)) |
664 | goto out; | 666 | goto out; |
665 | 667 | ||
666 | err = sock_intr_errno(timeo); | 668 | err = sock_intr_errno(timeo); |
667 | if (signal_pending(current)) | 669 | if (signal_pending(current)) |
668 | goto out; | 670 | goto out; |
669 | } | 671 | } |
670 | 672 | ||
671 | /* Connection was closed by RST, timeout, ICMP error | 673 | /* Connection was closed by RST, timeout, ICMP error |
672 | * or another process disconnected us. | 674 | * or another process disconnected us. |
673 | */ | 675 | */ |
674 | if (sk->sk_state == TCP_CLOSE) | 676 | if (sk->sk_state == TCP_CLOSE) |
675 | goto sock_error; | 677 | goto sock_error; |
676 | 678 | ||
677 | /* sk->sk_err may be not zero now, if RECVERR was ordered by user | 679 | /* sk->sk_err may be not zero now, if RECVERR was ordered by user |
678 | * and error was received after socket entered established state. | 680 | * and error was received after socket entered established state. |
679 | * Hence, it is handled normally after connect() return successfully. | 681 | * Hence, it is handled normally after connect() return successfully. |
680 | */ | 682 | */ |
681 | 683 | ||
682 | sock->state = SS_CONNECTED; | 684 | sock->state = SS_CONNECTED; |
683 | err = 0; | 685 | err = 0; |
684 | out: | 686 | out: |
685 | return err; | 687 | return err; |
686 | 688 | ||
687 | sock_error: | 689 | sock_error: |
688 | err = sock_error(sk) ? : -ECONNABORTED; | 690 | err = sock_error(sk) ? : -ECONNABORTED; |
689 | sock->state = SS_UNCONNECTED; | 691 | sock->state = SS_UNCONNECTED; |
690 | if (sk->sk_prot->disconnect(sk, flags)) | 692 | if (sk->sk_prot->disconnect(sk, flags)) |
691 | sock->state = SS_DISCONNECTING; | 693 | sock->state = SS_DISCONNECTING; |
692 | goto out; | 694 | goto out; |
693 | } | 695 | } |
694 | EXPORT_SYMBOL(__inet_stream_connect); | 696 | EXPORT_SYMBOL(__inet_stream_connect); |
695 | 697 | ||
696 | int inet_stream_connect(struct socket *sock, struct sockaddr *uaddr, | 698 | int inet_stream_connect(struct socket *sock, struct sockaddr *uaddr, |
697 | int addr_len, int flags) | 699 | int addr_len, int flags) |
698 | { | 700 | { |
699 | int err; | 701 | int err; |
700 | 702 | ||
701 | lock_sock(sock->sk); | 703 | lock_sock(sock->sk); |
702 | err = __inet_stream_connect(sock, uaddr, addr_len, flags); | 704 | err = __inet_stream_connect(sock, uaddr, addr_len, flags); |
703 | release_sock(sock->sk); | 705 | release_sock(sock->sk); |
704 | return err; | 706 | return err; |
705 | } | 707 | } |
706 | EXPORT_SYMBOL(inet_stream_connect); | 708 | EXPORT_SYMBOL(inet_stream_connect); |
707 | 709 | ||
708 | /* | 710 | /* |
709 | * Accept a pending connection. The TCP layer now gives BSD semantics. | 711 | * Accept a pending connection. The TCP layer now gives BSD semantics. |
710 | */ | 712 | */ |
711 | 713 | ||
712 | int inet_accept(struct socket *sock, struct socket *newsock, int flags) | 714 | int inet_accept(struct socket *sock, struct socket *newsock, int flags) |
713 | { | 715 | { |
714 | struct sock *sk1 = sock->sk; | 716 | struct sock *sk1 = sock->sk; |
715 | int err = -EINVAL; | 717 | int err = -EINVAL; |
716 | struct sock *sk2 = sk1->sk_prot->accept(sk1, flags, &err); | 718 | struct sock *sk2 = sk1->sk_prot->accept(sk1, flags, &err); |
717 | 719 | ||
718 | if (!sk2) | 720 | if (!sk2) |
719 | goto do_err; | 721 | goto do_err; |
720 | 722 | ||
721 | lock_sock(sk2); | 723 | lock_sock(sk2); |
722 | 724 | ||
723 | sock_rps_record_flow(sk2); | 725 | sock_rps_record_flow(sk2); |
724 | WARN_ON(!((1 << sk2->sk_state) & | 726 | WARN_ON(!((1 << sk2->sk_state) & |
725 | (TCPF_ESTABLISHED | TCPF_SYN_RECV | | 727 | (TCPF_ESTABLISHED | TCPF_SYN_RECV | |
726 | TCPF_CLOSE_WAIT | TCPF_CLOSE))); | 728 | TCPF_CLOSE_WAIT | TCPF_CLOSE))); |
727 | 729 | ||
728 | sock_graft(sk2, newsock); | 730 | sock_graft(sk2, newsock); |
729 | 731 | ||
730 | newsock->state = SS_CONNECTED; | 732 | newsock->state = SS_CONNECTED; |
731 | err = 0; | 733 | err = 0; |
732 | release_sock(sk2); | 734 | release_sock(sk2); |
733 | do_err: | 735 | do_err: |
734 | return err; | 736 | return err; |
735 | } | 737 | } |
736 | EXPORT_SYMBOL(inet_accept); | 738 | EXPORT_SYMBOL(inet_accept); |
737 | 739 | ||
738 | 740 | ||
739 | /* | 741 | /* |
740 | * This does both peername and sockname. | 742 | * This does both peername and sockname. |
741 | */ | 743 | */ |
742 | int inet_getname(struct socket *sock, struct sockaddr *uaddr, | 744 | int inet_getname(struct socket *sock, struct sockaddr *uaddr, |
743 | int *uaddr_len, int peer) | 745 | int *uaddr_len, int peer) |
744 | { | 746 | { |
745 | struct sock *sk = sock->sk; | 747 | struct sock *sk = sock->sk; |
746 | struct inet_sock *inet = inet_sk(sk); | 748 | struct inet_sock *inet = inet_sk(sk); |
747 | DECLARE_SOCKADDR(struct sockaddr_in *, sin, uaddr); | 749 | DECLARE_SOCKADDR(struct sockaddr_in *, sin, uaddr); |
748 | 750 | ||
749 | sin->sin_family = AF_INET; | 751 | sin->sin_family = AF_INET; |
750 | if (peer) { | 752 | if (peer) { |
751 | if (!inet->inet_dport || | 753 | if (!inet->inet_dport || |
752 | (((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_SYN_SENT)) && | 754 | (((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_SYN_SENT)) && |
753 | peer == 1)) | 755 | peer == 1)) |
754 | return -ENOTCONN; | 756 | return -ENOTCONN; |
755 | sin->sin_port = inet->inet_dport; | 757 | sin->sin_port = inet->inet_dport; |
756 | sin->sin_addr.s_addr = inet->inet_daddr; | 758 | sin->sin_addr.s_addr = inet->inet_daddr; |
757 | } else { | 759 | } else { |
758 | __be32 addr = inet->inet_rcv_saddr; | 760 | __be32 addr = inet->inet_rcv_saddr; |
759 | if (!addr) | 761 | if (!addr) |
760 | addr = inet->inet_saddr; | 762 | addr = inet->inet_saddr; |
761 | sin->sin_port = inet->inet_sport; | 763 | sin->sin_port = inet->inet_sport; |
762 | sin->sin_addr.s_addr = addr; | 764 | sin->sin_addr.s_addr = addr; |
763 | } | 765 | } |
764 | memset(sin->sin_zero, 0, sizeof(sin->sin_zero)); | 766 | memset(sin->sin_zero, 0, sizeof(sin->sin_zero)); |
765 | *uaddr_len = sizeof(*sin); | 767 | *uaddr_len = sizeof(*sin); |
766 | return 0; | 768 | return 0; |
767 | } | 769 | } |
768 | EXPORT_SYMBOL(inet_getname); | 770 | EXPORT_SYMBOL(inet_getname); |
769 | 771 | ||
770 | int inet_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, | 772 | int inet_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, |
771 | size_t size) | 773 | size_t size) |
772 | { | 774 | { |
773 | struct sock *sk = sock->sk; | 775 | struct sock *sk = sock->sk; |
774 | 776 | ||
775 | sock_rps_record_flow(sk); | 777 | sock_rps_record_flow(sk); |
776 | 778 | ||
777 | /* We may need to bind the socket. */ | 779 | /* We may need to bind the socket. */ |
778 | if (!inet_sk(sk)->inet_num && !sk->sk_prot->no_autobind && | 780 | if (!inet_sk(sk)->inet_num && !sk->sk_prot->no_autobind && |
779 | inet_autobind(sk)) | 781 | inet_autobind(sk)) |
780 | return -EAGAIN; | 782 | return -EAGAIN; |
781 | 783 | ||
782 | return sk->sk_prot->sendmsg(iocb, sk, msg, size); | 784 | return sk->sk_prot->sendmsg(iocb, sk, msg, size); |
783 | } | 785 | } |
784 | EXPORT_SYMBOL(inet_sendmsg); | 786 | EXPORT_SYMBOL(inet_sendmsg); |
785 | 787 | ||
786 | ssize_t inet_sendpage(struct socket *sock, struct page *page, int offset, | 788 | ssize_t inet_sendpage(struct socket *sock, struct page *page, int offset, |
787 | size_t size, int flags) | 789 | size_t size, int flags) |
788 | { | 790 | { |
789 | struct sock *sk = sock->sk; | 791 | struct sock *sk = sock->sk; |
790 | 792 | ||
791 | sock_rps_record_flow(sk); | 793 | sock_rps_record_flow(sk); |
792 | 794 | ||
793 | /* We may need to bind the socket. */ | 795 | /* We may need to bind the socket. */ |
794 | if (!inet_sk(sk)->inet_num && !sk->sk_prot->no_autobind && | 796 | if (!inet_sk(sk)->inet_num && !sk->sk_prot->no_autobind && |
795 | inet_autobind(sk)) | 797 | inet_autobind(sk)) |
796 | return -EAGAIN; | 798 | return -EAGAIN; |
797 | 799 | ||
798 | if (sk->sk_prot->sendpage) | 800 | if (sk->sk_prot->sendpage) |
799 | return sk->sk_prot->sendpage(sk, page, offset, size, flags); | 801 | return sk->sk_prot->sendpage(sk, page, offset, size, flags); |
800 | return sock_no_sendpage(sock, page, offset, size, flags); | 802 | return sock_no_sendpage(sock, page, offset, size, flags); |
801 | } | 803 | } |
802 | EXPORT_SYMBOL(inet_sendpage); | 804 | EXPORT_SYMBOL(inet_sendpage); |
803 | 805 | ||
804 | int inet_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, | 806 | int inet_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, |
805 | size_t size, int flags) | 807 | size_t size, int flags) |
806 | { | 808 | { |
807 | struct sock *sk = sock->sk; | 809 | struct sock *sk = sock->sk; |
808 | int addr_len = 0; | 810 | int addr_len = 0; |
809 | int err; | 811 | int err; |
810 | 812 | ||
811 | sock_rps_record_flow(sk); | 813 | sock_rps_record_flow(sk); |
812 | 814 | ||
813 | err = sk->sk_prot->recvmsg(iocb, sk, msg, size, flags & MSG_DONTWAIT, | 815 | err = sk->sk_prot->recvmsg(iocb, sk, msg, size, flags & MSG_DONTWAIT, |
814 | flags & ~MSG_DONTWAIT, &addr_len); | 816 | flags & ~MSG_DONTWAIT, &addr_len); |
815 | if (err >= 0) | 817 | if (err >= 0) |
816 | msg->msg_namelen = addr_len; | 818 | msg->msg_namelen = addr_len; |
817 | return err; | 819 | return err; |
818 | } | 820 | } |
819 | EXPORT_SYMBOL(inet_recvmsg); | 821 | EXPORT_SYMBOL(inet_recvmsg); |
820 | 822 | ||
821 | int inet_shutdown(struct socket *sock, int how) | 823 | int inet_shutdown(struct socket *sock, int how) |
822 | { | 824 | { |
823 | struct sock *sk = sock->sk; | 825 | struct sock *sk = sock->sk; |
824 | int err = 0; | 826 | int err = 0; |
825 | 827 | ||
826 | /* This should really check to make sure | 828 | /* This should really check to make sure |
827 | * the socket is a TCP socket. (WHY AC...) | 829 | * the socket is a TCP socket. (WHY AC...) |
828 | */ | 830 | */ |
829 | how++; /* maps 0->1 has the advantage of making bit 1 rcvs and | 831 | how++; /* maps 0->1 has the advantage of making bit 1 rcvs and |
830 | 1->2 bit 2 snds. | 832 | 1->2 bit 2 snds. |
831 | 2->3 */ | 833 | 2->3 */ |
832 | if ((how & ~SHUTDOWN_MASK) || !how) /* MAXINT->0 */ | 834 | if ((how & ~SHUTDOWN_MASK) || !how) /* MAXINT->0 */ |
833 | return -EINVAL; | 835 | return -EINVAL; |
834 | 836 | ||
835 | lock_sock(sk); | 837 | lock_sock(sk); |
836 | if (sock->state == SS_CONNECTING) { | 838 | if (sock->state == SS_CONNECTING) { |
837 | if ((1 << sk->sk_state) & | 839 | if ((1 << sk->sk_state) & |
838 | (TCPF_SYN_SENT | TCPF_SYN_RECV | TCPF_CLOSE)) | 840 | (TCPF_SYN_SENT | TCPF_SYN_RECV | TCPF_CLOSE)) |
839 | sock->state = SS_DISCONNECTING; | 841 | sock->state = SS_DISCONNECTING; |
840 | else | 842 | else |
841 | sock->state = SS_CONNECTED; | 843 | sock->state = SS_CONNECTED; |
842 | } | 844 | } |
843 | 845 | ||
844 | switch (sk->sk_state) { | 846 | switch (sk->sk_state) { |
845 | case TCP_CLOSE: | 847 | case TCP_CLOSE: |
846 | err = -ENOTCONN; | 848 | err = -ENOTCONN; |
847 | /* Hack to wake up other listeners, who can poll for | 849 | /* Hack to wake up other listeners, who can poll for |
848 | POLLHUP, even on eg. unconnected UDP sockets -- RR */ | 850 | POLLHUP, even on eg. unconnected UDP sockets -- RR */ |
849 | default: | 851 | default: |
850 | sk->sk_shutdown |= how; | 852 | sk->sk_shutdown |= how; |
851 | if (sk->sk_prot->shutdown) | 853 | if (sk->sk_prot->shutdown) |
852 | sk->sk_prot->shutdown(sk, how); | 854 | sk->sk_prot->shutdown(sk, how); |
853 | break; | 855 | break; |
854 | 856 | ||
855 | /* Remaining two branches are temporary solution for missing | 857 | /* Remaining two branches are temporary solution for missing |
856 | * close() in multithreaded environment. It is _not_ a good idea, | 858 | * close() in multithreaded environment. It is _not_ a good idea, |
857 | * but we have no choice until close() is repaired at VFS level. | 859 | * but we have no choice until close() is repaired at VFS level. |
858 | */ | 860 | */ |
859 | case TCP_LISTEN: | 861 | case TCP_LISTEN: |
860 | if (!(how & RCV_SHUTDOWN)) | 862 | if (!(how & RCV_SHUTDOWN)) |
861 | break; | 863 | break; |
862 | /* Fall through */ | 864 | /* Fall through */ |
863 | case TCP_SYN_SENT: | 865 | case TCP_SYN_SENT: |
864 | err = sk->sk_prot->disconnect(sk, O_NONBLOCK); | 866 | err = sk->sk_prot->disconnect(sk, O_NONBLOCK); |
865 | sock->state = err ? SS_DISCONNECTING : SS_UNCONNECTED; | 867 | sock->state = err ? SS_DISCONNECTING : SS_UNCONNECTED; |
866 | break; | 868 | break; |
867 | } | 869 | } |
868 | 870 | ||
869 | /* Wake up anyone sleeping in poll. */ | 871 | /* Wake up anyone sleeping in poll. */ |
870 | sk->sk_state_change(sk); | 872 | sk->sk_state_change(sk); |
871 | release_sock(sk); | 873 | release_sock(sk); |
872 | return err; | 874 | return err; |
873 | } | 875 | } |
874 | EXPORT_SYMBOL(inet_shutdown); | 876 | EXPORT_SYMBOL(inet_shutdown); |
875 | 877 | ||
876 | /* | 878 | /* |
877 | * ioctl() calls you can issue on an INET socket. Most of these are | 879 | * ioctl() calls you can issue on an INET socket. Most of these are |
878 | * device configuration and stuff and very rarely used. Some ioctls | 880 | * device configuration and stuff and very rarely used. Some ioctls |
879 | * pass on to the socket itself. | 881 | * pass on to the socket itself. |
880 | * | 882 | * |
881 | * NOTE: I like the idea of a module for the config stuff. ie ifconfig | 883 | * NOTE: I like the idea of a module for the config stuff. ie ifconfig |
882 | * loads the devconfigure module does its configuring and unloads it. | 884 | * loads the devconfigure module does its configuring and unloads it. |
883 | * There's a good 20K of config code hanging around the kernel. | 885 | * There's a good 20K of config code hanging around the kernel. |
884 | */ | 886 | */ |
885 | 887 | ||
886 | int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) | 888 | int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) |
887 | { | 889 | { |
888 | struct sock *sk = sock->sk; | 890 | struct sock *sk = sock->sk; |
889 | int err = 0; | 891 | int err = 0; |
890 | struct net *net = sock_net(sk); | 892 | struct net *net = sock_net(sk); |
891 | 893 | ||
892 | switch (cmd) { | 894 | switch (cmd) { |
893 | case SIOCGSTAMP: | 895 | case SIOCGSTAMP: |
894 | err = sock_get_timestamp(sk, (struct timeval __user *)arg); | 896 | err = sock_get_timestamp(sk, (struct timeval __user *)arg); |
895 | break; | 897 | break; |
896 | case SIOCGSTAMPNS: | 898 | case SIOCGSTAMPNS: |
897 | err = sock_get_timestampns(sk, (struct timespec __user *)arg); | 899 | err = sock_get_timestampns(sk, (struct timespec __user *)arg); |
898 | break; | 900 | break; |
899 | case SIOCADDRT: | 901 | case SIOCADDRT: |
900 | case SIOCDELRT: | 902 | case SIOCDELRT: |
901 | case SIOCRTMSG: | 903 | case SIOCRTMSG: |
902 | err = ip_rt_ioctl(net, cmd, (void __user *)arg); | 904 | err = ip_rt_ioctl(net, cmd, (void __user *)arg); |
903 | break; | 905 | break; |
904 | case SIOCDARP: | 906 | case SIOCDARP: |
905 | case SIOCGARP: | 907 | case SIOCGARP: |
906 | case SIOCSARP: | 908 | case SIOCSARP: |
907 | err = arp_ioctl(net, cmd, (void __user *)arg); | 909 | err = arp_ioctl(net, cmd, (void __user *)arg); |
908 | break; | 910 | break; |
909 | case SIOCGIFADDR: | 911 | case SIOCGIFADDR: |
910 | case SIOCSIFADDR: | 912 | case SIOCSIFADDR: |
911 | case SIOCGIFBRDADDR: | 913 | case SIOCGIFBRDADDR: |
912 | case SIOCSIFBRDADDR: | 914 | case SIOCSIFBRDADDR: |
913 | case SIOCGIFNETMASK: | 915 | case SIOCGIFNETMASK: |
914 | case SIOCSIFNETMASK: | 916 | case SIOCSIFNETMASK: |
915 | case SIOCGIFDSTADDR: | 917 | case SIOCGIFDSTADDR: |
916 | case SIOCSIFDSTADDR: | 918 | case SIOCSIFDSTADDR: |
917 | case SIOCSIFPFLAGS: | 919 | case SIOCSIFPFLAGS: |
918 | case SIOCGIFPFLAGS: | 920 | case SIOCGIFPFLAGS: |
919 | case SIOCSIFFLAGS: | 921 | case SIOCSIFFLAGS: |
920 | err = devinet_ioctl(net, cmd, (void __user *)arg); | 922 | err = devinet_ioctl(net, cmd, (void __user *)arg); |
921 | break; | 923 | break; |
922 | default: | 924 | default: |
923 | if (sk->sk_prot->ioctl) | 925 | if (sk->sk_prot->ioctl) |
924 | err = sk->sk_prot->ioctl(sk, cmd, arg); | 926 | err = sk->sk_prot->ioctl(sk, cmd, arg); |
925 | else | 927 | else |
926 | err = -ENOIOCTLCMD; | 928 | err = -ENOIOCTLCMD; |
927 | break; | 929 | break; |
928 | } | 930 | } |
929 | return err; | 931 | return err; |
930 | } | 932 | } |
931 | EXPORT_SYMBOL(inet_ioctl); | 933 | EXPORT_SYMBOL(inet_ioctl); |
932 | 934 | ||
933 | #ifdef CONFIG_COMPAT | 935 | #ifdef CONFIG_COMPAT |
934 | static int inet_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) | 936 | static int inet_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) |
935 | { | 937 | { |
936 | struct sock *sk = sock->sk; | 938 | struct sock *sk = sock->sk; |
937 | int err = -ENOIOCTLCMD; | 939 | int err = -ENOIOCTLCMD; |
938 | 940 | ||
939 | if (sk->sk_prot->compat_ioctl) | 941 | if (sk->sk_prot->compat_ioctl) |
940 | err = sk->sk_prot->compat_ioctl(sk, cmd, arg); | 942 | err = sk->sk_prot->compat_ioctl(sk, cmd, arg); |
941 | 943 | ||
942 | return err; | 944 | return err; |
943 | } | 945 | } |
944 | #endif | 946 | #endif |
945 | 947 | ||
946 | const struct proto_ops inet_stream_ops = { | 948 | const struct proto_ops inet_stream_ops = { |
947 | .family = PF_INET, | 949 | .family = PF_INET, |
948 | .owner = THIS_MODULE, | 950 | .owner = THIS_MODULE, |
949 | .release = inet_release, | 951 | .release = inet_release, |
950 | .bind = inet_bind, | 952 | .bind = inet_bind, |
951 | .connect = inet_stream_connect, | 953 | .connect = inet_stream_connect, |
952 | .socketpair = sock_no_socketpair, | 954 | .socketpair = sock_no_socketpair, |
953 | .accept = inet_accept, | 955 | .accept = inet_accept, |
954 | .getname = inet_getname, | 956 | .getname = inet_getname, |
955 | .poll = tcp_poll, | 957 | .poll = tcp_poll, |
956 | .ioctl = inet_ioctl, | 958 | .ioctl = inet_ioctl, |
957 | .listen = inet_listen, | 959 | .listen = inet_listen, |
958 | .shutdown = inet_shutdown, | 960 | .shutdown = inet_shutdown, |
959 | .setsockopt = sock_common_setsockopt, | 961 | .setsockopt = sock_common_setsockopt, |
960 | .getsockopt = sock_common_getsockopt, | 962 | .getsockopt = sock_common_getsockopt, |
961 | .sendmsg = inet_sendmsg, | 963 | .sendmsg = inet_sendmsg, |
962 | .recvmsg = inet_recvmsg, | 964 | .recvmsg = inet_recvmsg, |
963 | .mmap = sock_no_mmap, | 965 | .mmap = sock_no_mmap, |
964 | .sendpage = inet_sendpage, | 966 | .sendpage = inet_sendpage, |
965 | .splice_read = tcp_splice_read, | 967 | .splice_read = tcp_splice_read, |
966 | #ifdef CONFIG_COMPAT | 968 | #ifdef CONFIG_COMPAT |
967 | .compat_setsockopt = compat_sock_common_setsockopt, | 969 | .compat_setsockopt = compat_sock_common_setsockopt, |
968 | .compat_getsockopt = compat_sock_common_getsockopt, | 970 | .compat_getsockopt = compat_sock_common_getsockopt, |
969 | .compat_ioctl = inet_compat_ioctl, | 971 | .compat_ioctl = inet_compat_ioctl, |
970 | #endif | 972 | #endif |
971 | }; | 973 | }; |
972 | EXPORT_SYMBOL(inet_stream_ops); | 974 | EXPORT_SYMBOL(inet_stream_ops); |
973 | 975 | ||
974 | const struct proto_ops inet_dgram_ops = { | 976 | const struct proto_ops inet_dgram_ops = { |
975 | .family = PF_INET, | 977 | .family = PF_INET, |
976 | .owner = THIS_MODULE, | 978 | .owner = THIS_MODULE, |
977 | .release = inet_release, | 979 | .release = inet_release, |
978 | .bind = inet_bind, | 980 | .bind = inet_bind, |
979 | .connect = inet_dgram_connect, | 981 | .connect = inet_dgram_connect, |
980 | .socketpair = sock_no_socketpair, | 982 | .socketpair = sock_no_socketpair, |
981 | .accept = sock_no_accept, | 983 | .accept = sock_no_accept, |
982 | .getname = inet_getname, | 984 | .getname = inet_getname, |
983 | .poll = udp_poll, | 985 | .poll = udp_poll, |
984 | .ioctl = inet_ioctl, | 986 | .ioctl = inet_ioctl, |
985 | .listen = sock_no_listen, | 987 | .listen = sock_no_listen, |
986 | .shutdown = inet_shutdown, | 988 | .shutdown = inet_shutdown, |
987 | .setsockopt = sock_common_setsockopt, | 989 | .setsockopt = sock_common_setsockopt, |
988 | .getsockopt = sock_common_getsockopt, | 990 | .getsockopt = sock_common_getsockopt, |
989 | .sendmsg = inet_sendmsg, | 991 | .sendmsg = inet_sendmsg, |
990 | .recvmsg = inet_recvmsg, | 992 | .recvmsg = inet_recvmsg, |
991 | .mmap = sock_no_mmap, | 993 | .mmap = sock_no_mmap, |
992 | .sendpage = inet_sendpage, | 994 | .sendpage = inet_sendpage, |
993 | #ifdef CONFIG_COMPAT | 995 | #ifdef CONFIG_COMPAT |
994 | .compat_setsockopt = compat_sock_common_setsockopt, | 996 | .compat_setsockopt = compat_sock_common_setsockopt, |
995 | .compat_getsockopt = compat_sock_common_getsockopt, | 997 | .compat_getsockopt = compat_sock_common_getsockopt, |
996 | .compat_ioctl = inet_compat_ioctl, | 998 | .compat_ioctl = inet_compat_ioctl, |
997 | #endif | 999 | #endif |
998 | }; | 1000 | }; |
999 | EXPORT_SYMBOL(inet_dgram_ops); | 1001 | EXPORT_SYMBOL(inet_dgram_ops); |
1000 | 1002 | ||
1001 | /* | 1003 | /* |
1002 | * For SOCK_RAW sockets; should be the same as inet_dgram_ops but without | 1004 | * For SOCK_RAW sockets; should be the same as inet_dgram_ops but without |
1003 | * udp_poll | 1005 | * udp_poll |
1004 | */ | 1006 | */ |
1005 | static const struct proto_ops inet_sockraw_ops = { | 1007 | static const struct proto_ops inet_sockraw_ops = { |
1006 | .family = PF_INET, | 1008 | .family = PF_INET, |
1007 | .owner = THIS_MODULE, | 1009 | .owner = THIS_MODULE, |
1008 | .release = inet_release, | 1010 | .release = inet_release, |
1009 | .bind = inet_bind, | 1011 | .bind = inet_bind, |
1010 | .connect = inet_dgram_connect, | 1012 | .connect = inet_dgram_connect, |
1011 | .socketpair = sock_no_socketpair, | 1013 | .socketpair = sock_no_socketpair, |
1012 | .accept = sock_no_accept, | 1014 | .accept = sock_no_accept, |
1013 | .getname = inet_getname, | 1015 | .getname = inet_getname, |
1014 | .poll = datagram_poll, | 1016 | .poll = datagram_poll, |
1015 | .ioctl = inet_ioctl, | 1017 | .ioctl = inet_ioctl, |
1016 | .listen = sock_no_listen, | 1018 | .listen = sock_no_listen, |
1017 | .shutdown = inet_shutdown, | 1019 | .shutdown = inet_shutdown, |
1018 | .setsockopt = sock_common_setsockopt, | 1020 | .setsockopt = sock_common_setsockopt, |
1019 | .getsockopt = sock_common_getsockopt, | 1021 | .getsockopt = sock_common_getsockopt, |
1020 | .sendmsg = inet_sendmsg, | 1022 | .sendmsg = inet_sendmsg, |
1021 | .recvmsg = inet_recvmsg, | 1023 | .recvmsg = inet_recvmsg, |
1022 | .mmap = sock_no_mmap, | 1024 | .mmap = sock_no_mmap, |
1023 | .sendpage = inet_sendpage, | 1025 | .sendpage = inet_sendpage, |
1024 | #ifdef CONFIG_COMPAT | 1026 | #ifdef CONFIG_COMPAT |
1025 | .compat_setsockopt = compat_sock_common_setsockopt, | 1027 | .compat_setsockopt = compat_sock_common_setsockopt, |
1026 | .compat_getsockopt = compat_sock_common_getsockopt, | 1028 | .compat_getsockopt = compat_sock_common_getsockopt, |
1027 | .compat_ioctl = inet_compat_ioctl, | 1029 | .compat_ioctl = inet_compat_ioctl, |
1028 | #endif | 1030 | #endif |
1029 | }; | 1031 | }; |
1030 | 1032 | ||
1031 | static const struct net_proto_family inet_family_ops = { | 1033 | static const struct net_proto_family inet_family_ops = { |
1032 | .family = PF_INET, | 1034 | .family = PF_INET, |
1033 | .create = inet_create, | 1035 | .create = inet_create, |
1034 | .owner = THIS_MODULE, | 1036 | .owner = THIS_MODULE, |
1035 | }; | 1037 | }; |
1036 | 1038 | ||
1037 | /* Upon startup we insert all the elements in inetsw_array[] into | 1039 | /* Upon startup we insert all the elements in inetsw_array[] into |
1038 | * the linked list inetsw. | 1040 | * the linked list inetsw. |
1039 | */ | 1041 | */ |
1040 | static struct inet_protosw inetsw_array[] = | 1042 | static struct inet_protosw inetsw_array[] = |
1041 | { | 1043 | { |
1042 | { | 1044 | { |
1043 | .type = SOCK_STREAM, | 1045 | .type = SOCK_STREAM, |
1044 | .protocol = IPPROTO_TCP, | 1046 | .protocol = IPPROTO_TCP, |
1045 | .prot = &tcp_prot, | 1047 | .prot = &tcp_prot, |
1046 | .ops = &inet_stream_ops, | 1048 | .ops = &inet_stream_ops, |
1047 | .no_check = 0, | 1049 | .no_check = 0, |
1048 | .flags = INET_PROTOSW_PERMANENT | | 1050 | .flags = INET_PROTOSW_PERMANENT | |
1049 | INET_PROTOSW_ICSK, | 1051 | INET_PROTOSW_ICSK, |
1050 | }, | 1052 | }, |
1051 | 1053 | ||
1052 | { | 1054 | { |
1053 | .type = SOCK_DGRAM, | 1055 | .type = SOCK_DGRAM, |
1054 | .protocol = IPPROTO_UDP, | 1056 | .protocol = IPPROTO_UDP, |
1055 | .prot = &udp_prot, | 1057 | .prot = &udp_prot, |
1056 | .ops = &inet_dgram_ops, | 1058 | .ops = &inet_dgram_ops, |
1057 | .no_check = UDP_CSUM_DEFAULT, | 1059 | .no_check = UDP_CSUM_DEFAULT, |
1058 | .flags = INET_PROTOSW_PERMANENT, | 1060 | .flags = INET_PROTOSW_PERMANENT, |
1059 | }, | 1061 | }, |
1060 | 1062 | ||
1061 | { | 1063 | { |
1062 | .type = SOCK_DGRAM, | 1064 | .type = SOCK_DGRAM, |
1063 | .protocol = IPPROTO_ICMP, | 1065 | .protocol = IPPROTO_ICMP, |
1064 | .prot = &ping_prot, | 1066 | .prot = &ping_prot, |
1065 | .ops = &inet_dgram_ops, | 1067 | .ops = &inet_dgram_ops, |
1066 | .no_check = UDP_CSUM_DEFAULT, | 1068 | .no_check = UDP_CSUM_DEFAULT, |
1067 | .flags = INET_PROTOSW_REUSE, | 1069 | .flags = INET_PROTOSW_REUSE, |
1068 | }, | 1070 | }, |
1069 | 1071 | ||
1070 | { | 1072 | { |
1071 | .type = SOCK_RAW, | 1073 | .type = SOCK_RAW, |
1072 | .protocol = IPPROTO_IP, /* wild card */ | 1074 | .protocol = IPPROTO_IP, /* wild card */ |
1073 | .prot = &raw_prot, | 1075 | .prot = &raw_prot, |
1074 | .ops = &inet_sockraw_ops, | 1076 | .ops = &inet_sockraw_ops, |
1075 | .no_check = UDP_CSUM_DEFAULT, | 1077 | .no_check = UDP_CSUM_DEFAULT, |
1076 | .flags = INET_PROTOSW_REUSE, | 1078 | .flags = INET_PROTOSW_REUSE, |
1077 | } | 1079 | } |
1078 | }; | 1080 | }; |
1079 | 1081 | ||
1080 | #define INETSW_ARRAY_LEN ARRAY_SIZE(inetsw_array) | 1082 | #define INETSW_ARRAY_LEN ARRAY_SIZE(inetsw_array) |
1081 | 1083 | ||
1082 | void inet_register_protosw(struct inet_protosw *p) | 1084 | void inet_register_protosw(struct inet_protosw *p) |
1083 | { | 1085 | { |
1084 | struct list_head *lh; | 1086 | struct list_head *lh; |
1085 | struct inet_protosw *answer; | 1087 | struct inet_protosw *answer; |
1086 | int protocol = p->protocol; | 1088 | int protocol = p->protocol; |
1087 | struct list_head *last_perm; | 1089 | struct list_head *last_perm; |
1088 | 1090 | ||
1089 | spin_lock_bh(&inetsw_lock); | 1091 | spin_lock_bh(&inetsw_lock); |
1090 | 1092 | ||
1091 | if (p->type >= SOCK_MAX) | 1093 | if (p->type >= SOCK_MAX) |
1092 | goto out_illegal; | 1094 | goto out_illegal; |
1093 | 1095 | ||
1094 | /* If we are trying to override a permanent protocol, bail. */ | 1096 | /* If we are trying to override a permanent protocol, bail. */ |
1095 | answer = NULL; | 1097 | answer = NULL; |
1096 | last_perm = &inetsw[p->type]; | 1098 | last_perm = &inetsw[p->type]; |
1097 | list_for_each(lh, &inetsw[p->type]) { | 1099 | list_for_each(lh, &inetsw[p->type]) { |
1098 | answer = list_entry(lh, struct inet_protosw, list); | 1100 | answer = list_entry(lh, struct inet_protosw, list); |
1099 | 1101 | ||
1100 | /* Check only the non-wild match. */ | 1102 | /* Check only the non-wild match. */ |
1101 | if (INET_PROTOSW_PERMANENT & answer->flags) { | 1103 | if (INET_PROTOSW_PERMANENT & answer->flags) { |
1102 | if (protocol == answer->protocol) | 1104 | if (protocol == answer->protocol) |
1103 | break; | 1105 | break; |
1104 | last_perm = lh; | 1106 | last_perm = lh; |
1105 | } | 1107 | } |
1106 | 1108 | ||
1107 | answer = NULL; | 1109 | answer = NULL; |
1108 | } | 1110 | } |
1109 | if (answer) | 1111 | if (answer) |
1110 | goto out_permanent; | 1112 | goto out_permanent; |
1111 | 1113 | ||
1112 | /* Add the new entry after the last permanent entry if any, so that | 1114 | /* Add the new entry after the last permanent entry if any, so that |
1113 | * the new entry does not override a permanent entry when matched with | 1115 | * the new entry does not override a permanent entry when matched with |
1114 | * a wild-card protocol. But it is allowed to override any existing | 1116 | * a wild-card protocol. But it is allowed to override any existing |
1115 | * non-permanent entry. This means that when we remove this entry, the | 1117 | * non-permanent entry. This means that when we remove this entry, the |
1116 | * system automatically returns to the old behavior. | 1118 | * system automatically returns to the old behavior. |
1117 | */ | 1119 | */ |
1118 | list_add_rcu(&p->list, last_perm); | 1120 | list_add_rcu(&p->list, last_perm); |
1119 | out: | 1121 | out: |
1120 | spin_unlock_bh(&inetsw_lock); | 1122 | spin_unlock_bh(&inetsw_lock); |
1121 | 1123 | ||
1122 | return; | 1124 | return; |
1123 | 1125 | ||
1124 | out_permanent: | 1126 | out_permanent: |
1125 | pr_err("Attempt to override permanent protocol %d\n", protocol); | 1127 | pr_err("Attempt to override permanent protocol %d\n", protocol); |
1126 | goto out; | 1128 | goto out; |
1127 | 1129 | ||
1128 | out_illegal: | 1130 | out_illegal: |
1129 | pr_err("Ignoring attempt to register invalid socket type %d\n", | 1131 | pr_err("Ignoring attempt to register invalid socket type %d\n", |
1130 | p->type); | 1132 | p->type); |
1131 | goto out; | 1133 | goto out; |
1132 | } | 1134 | } |
1133 | EXPORT_SYMBOL(inet_register_protosw); | 1135 | EXPORT_SYMBOL(inet_register_protosw); |
1134 | 1136 | ||
1135 | void inet_unregister_protosw(struct inet_protosw *p) | 1137 | void inet_unregister_protosw(struct inet_protosw *p) |
1136 | { | 1138 | { |
1137 | if (INET_PROTOSW_PERMANENT & p->flags) { | 1139 | if (INET_PROTOSW_PERMANENT & p->flags) { |
1138 | pr_err("Attempt to unregister permanent protocol %d\n", | 1140 | pr_err("Attempt to unregister permanent protocol %d\n", |
1139 | p->protocol); | 1141 | p->protocol); |
1140 | } else { | 1142 | } else { |
1141 | spin_lock_bh(&inetsw_lock); | 1143 | spin_lock_bh(&inetsw_lock); |
1142 | list_del_rcu(&p->list); | 1144 | list_del_rcu(&p->list); |
1143 | spin_unlock_bh(&inetsw_lock); | 1145 | spin_unlock_bh(&inetsw_lock); |
1144 | 1146 | ||
1145 | synchronize_net(); | 1147 | synchronize_net(); |
1146 | } | 1148 | } |
1147 | } | 1149 | } |
1148 | EXPORT_SYMBOL(inet_unregister_protosw); | 1150 | EXPORT_SYMBOL(inet_unregister_protosw); |
1149 | 1151 | ||
1150 | /* | 1152 | /* |
1151 | * Shall we try to damage output packets if routing dev changes? | 1153 | * Shall we try to damage output packets if routing dev changes? |
1152 | */ | 1154 | */ |
1153 | 1155 | ||
1154 | int sysctl_ip_dynaddr __read_mostly; | 1156 | int sysctl_ip_dynaddr __read_mostly; |
1155 | 1157 | ||
1156 | static int inet_sk_reselect_saddr(struct sock *sk) | 1158 | static int inet_sk_reselect_saddr(struct sock *sk) |
1157 | { | 1159 | { |
1158 | struct inet_sock *inet = inet_sk(sk); | 1160 | struct inet_sock *inet = inet_sk(sk); |
1159 | __be32 old_saddr = inet->inet_saddr; | 1161 | __be32 old_saddr = inet->inet_saddr; |
1160 | __be32 daddr = inet->inet_daddr; | 1162 | __be32 daddr = inet->inet_daddr; |
1161 | struct flowi4 *fl4; | 1163 | struct flowi4 *fl4; |
1162 | struct rtable *rt; | 1164 | struct rtable *rt; |
1163 | __be32 new_saddr; | 1165 | __be32 new_saddr; |
1164 | struct ip_options_rcu *inet_opt; | 1166 | struct ip_options_rcu *inet_opt; |
1165 | 1167 | ||
1166 | inet_opt = rcu_dereference_protected(inet->inet_opt, | 1168 | inet_opt = rcu_dereference_protected(inet->inet_opt, |
1167 | sock_owned_by_user(sk)); | 1169 | sock_owned_by_user(sk)); |
1168 | if (inet_opt && inet_opt->opt.srr) | 1170 | if (inet_opt && inet_opt->opt.srr) |
1169 | daddr = inet_opt->opt.faddr; | 1171 | daddr = inet_opt->opt.faddr; |
1170 | 1172 | ||
1171 | /* Query new route. */ | 1173 | /* Query new route. */ |
1172 | fl4 = &inet->cork.fl.u.ip4; | 1174 | fl4 = &inet->cork.fl.u.ip4; |
1173 | rt = ip_route_connect(fl4, daddr, 0, RT_CONN_FLAGS(sk), | 1175 | rt = ip_route_connect(fl4, daddr, 0, RT_CONN_FLAGS(sk), |
1174 | sk->sk_bound_dev_if, sk->sk_protocol, | 1176 | sk->sk_bound_dev_if, sk->sk_protocol, |
1175 | inet->inet_sport, inet->inet_dport, sk, false); | 1177 | inet->inet_sport, inet->inet_dport, sk, false); |
1176 | if (IS_ERR(rt)) | 1178 | if (IS_ERR(rt)) |
1177 | return PTR_ERR(rt); | 1179 | return PTR_ERR(rt); |
1178 | 1180 | ||
1179 | sk_setup_caps(sk, &rt->dst); | 1181 | sk_setup_caps(sk, &rt->dst); |
1180 | 1182 | ||
1181 | new_saddr = fl4->saddr; | 1183 | new_saddr = fl4->saddr; |
1182 | 1184 | ||
1183 | if (new_saddr == old_saddr) | 1185 | if (new_saddr == old_saddr) |
1184 | return 0; | 1186 | return 0; |
1185 | 1187 | ||
1186 | if (sysctl_ip_dynaddr > 1) { | 1188 | if (sysctl_ip_dynaddr > 1) { |
1187 | pr_info("%s(): shifting inet->saddr from %pI4 to %pI4\n", | 1189 | pr_info("%s(): shifting inet->saddr from %pI4 to %pI4\n", |
1188 | __func__, &old_saddr, &new_saddr); | 1190 | __func__, &old_saddr, &new_saddr); |
1189 | } | 1191 | } |
1190 | 1192 | ||
1191 | inet->inet_saddr = inet->inet_rcv_saddr = new_saddr; | 1193 | inet->inet_saddr = inet->inet_rcv_saddr = new_saddr; |
1192 | 1194 | ||
1193 | /* | 1195 | /* |
1194 | * XXX The only one ugly spot where we need to | 1196 | * XXX The only one ugly spot where we need to |
1195 | * XXX really change the sockets identity after | 1197 | * XXX really change the sockets identity after |
1196 | * XXX it has entered the hashes. -DaveM | 1198 | * XXX it has entered the hashes. -DaveM |
1197 | * | 1199 | * |
1198 | * Besides that, it does not check for connection | 1200 | * Besides that, it does not check for connection |
1199 | * uniqueness. Wait for troubles. | 1201 | * uniqueness. Wait for troubles. |
1200 | */ | 1202 | */ |
1201 | __sk_prot_rehash(sk); | 1203 | __sk_prot_rehash(sk); |
1202 | return 0; | 1204 | return 0; |
1203 | } | 1205 | } |
1204 | 1206 | ||
1205 | int inet_sk_rebuild_header(struct sock *sk) | 1207 | int inet_sk_rebuild_header(struct sock *sk) |
1206 | { | 1208 | { |
1207 | struct inet_sock *inet = inet_sk(sk); | 1209 | struct inet_sock *inet = inet_sk(sk); |
1208 | struct rtable *rt = (struct rtable *)__sk_dst_check(sk, 0); | 1210 | struct rtable *rt = (struct rtable *)__sk_dst_check(sk, 0); |
1209 | __be32 daddr; | 1211 | __be32 daddr; |
1210 | struct ip_options_rcu *inet_opt; | 1212 | struct ip_options_rcu *inet_opt; |
1211 | struct flowi4 *fl4; | 1213 | struct flowi4 *fl4; |
1212 | int err; | 1214 | int err; |
1213 | 1215 | ||
1214 | /* Route is OK, nothing to do. */ | 1216 | /* Route is OK, nothing to do. */ |
1215 | if (rt) | 1217 | if (rt) |
1216 | return 0; | 1218 | return 0; |
1217 | 1219 | ||
1218 | /* Reroute. */ | 1220 | /* Reroute. */ |
1219 | rcu_read_lock(); | 1221 | rcu_read_lock(); |
1220 | inet_opt = rcu_dereference(inet->inet_opt); | 1222 | inet_opt = rcu_dereference(inet->inet_opt); |
1221 | daddr = inet->inet_daddr; | 1223 | daddr = inet->inet_daddr; |
1222 | if (inet_opt && inet_opt->opt.srr) | 1224 | if (inet_opt && inet_opt->opt.srr) |
1223 | daddr = inet_opt->opt.faddr; | 1225 | daddr = inet_opt->opt.faddr; |
1224 | rcu_read_unlock(); | 1226 | rcu_read_unlock(); |
1225 | fl4 = &inet->cork.fl.u.ip4; | 1227 | fl4 = &inet->cork.fl.u.ip4; |
1226 | rt = ip_route_output_ports(sock_net(sk), fl4, sk, daddr, inet->inet_saddr, | 1228 | rt = ip_route_output_ports(sock_net(sk), fl4, sk, daddr, inet->inet_saddr, |
1227 | inet->inet_dport, inet->inet_sport, | 1229 | inet->inet_dport, inet->inet_sport, |
1228 | sk->sk_protocol, RT_CONN_FLAGS(sk), | 1230 | sk->sk_protocol, RT_CONN_FLAGS(sk), |
1229 | sk->sk_bound_dev_if); | 1231 | sk->sk_bound_dev_if); |
1230 | if (!IS_ERR(rt)) { | 1232 | if (!IS_ERR(rt)) { |
1231 | err = 0; | 1233 | err = 0; |
1232 | sk_setup_caps(sk, &rt->dst); | 1234 | sk_setup_caps(sk, &rt->dst); |
1233 | } else { | 1235 | } else { |
1234 | err = PTR_ERR(rt); | 1236 | err = PTR_ERR(rt); |
1235 | 1237 | ||
1236 | /* Routing failed... */ | 1238 | /* Routing failed... */ |
1237 | sk->sk_route_caps = 0; | 1239 | sk->sk_route_caps = 0; |
1238 | /* | 1240 | /* |
1239 | * Other protocols have to map its equivalent state to TCP_SYN_SENT. | 1241 | * Other protocols have to map its equivalent state to TCP_SYN_SENT. |
1240 | * DCCP maps its DCCP_REQUESTING state to TCP_SYN_SENT. -acme | 1242 | * DCCP maps its DCCP_REQUESTING state to TCP_SYN_SENT. -acme |
1241 | */ | 1243 | */ |
1242 | if (!sysctl_ip_dynaddr || | 1244 | if (!sysctl_ip_dynaddr || |
1243 | sk->sk_state != TCP_SYN_SENT || | 1245 | sk->sk_state != TCP_SYN_SENT || |
1244 | (sk->sk_userlocks & SOCK_BINDADDR_LOCK) || | 1246 | (sk->sk_userlocks & SOCK_BINDADDR_LOCK) || |
1245 | (err = inet_sk_reselect_saddr(sk)) != 0) | 1247 | (err = inet_sk_reselect_saddr(sk)) != 0) |
1246 | sk->sk_err_soft = -err; | 1248 | sk->sk_err_soft = -err; |
1247 | } | 1249 | } |
1248 | 1250 | ||
1249 | return err; | 1251 | return err; |
1250 | } | 1252 | } |
1251 | EXPORT_SYMBOL(inet_sk_rebuild_header); | 1253 | EXPORT_SYMBOL(inet_sk_rebuild_header); |
1252 | 1254 | ||
1253 | static int inet_gso_send_check(struct sk_buff *skb) | 1255 | static int inet_gso_send_check(struct sk_buff *skb) |
1254 | { | 1256 | { |
1255 | const struct net_offload *ops; | 1257 | const struct net_offload *ops; |
1256 | const struct iphdr *iph; | 1258 | const struct iphdr *iph; |
1257 | int proto; | 1259 | int proto; |
1258 | int ihl; | 1260 | int ihl; |
1259 | int err = -EINVAL; | 1261 | int err = -EINVAL; |
1260 | 1262 | ||
1261 | if (unlikely(!pskb_may_pull(skb, sizeof(*iph)))) | 1263 | if (unlikely(!pskb_may_pull(skb, sizeof(*iph)))) |
1262 | goto out; | 1264 | goto out; |
1263 | 1265 | ||
1264 | iph = ip_hdr(skb); | 1266 | iph = ip_hdr(skb); |
1265 | ihl = iph->ihl * 4; | 1267 | ihl = iph->ihl * 4; |
1266 | if (ihl < sizeof(*iph)) | 1268 | if (ihl < sizeof(*iph)) |
1267 | goto out; | 1269 | goto out; |
1268 | 1270 | ||
1269 | if (unlikely(!pskb_may_pull(skb, ihl))) | 1271 | if (unlikely(!pskb_may_pull(skb, ihl))) |
1270 | goto out; | 1272 | goto out; |
1271 | 1273 | ||
1272 | __skb_pull(skb, ihl); | 1274 | __skb_pull(skb, ihl); |
1273 | skb_reset_transport_header(skb); | 1275 | skb_reset_transport_header(skb); |
1274 | iph = ip_hdr(skb); | 1276 | iph = ip_hdr(skb); |
1275 | proto = iph->protocol; | 1277 | proto = iph->protocol; |
1276 | err = -EPROTONOSUPPORT; | 1278 | err = -EPROTONOSUPPORT; |
1277 | 1279 | ||
1278 | rcu_read_lock(); | 1280 | rcu_read_lock(); |
1279 | ops = rcu_dereference(inet_offloads[proto]); | 1281 | ops = rcu_dereference(inet_offloads[proto]); |
1280 | if (likely(ops && ops->callbacks.gso_send_check)) | 1282 | if (likely(ops && ops->callbacks.gso_send_check)) |
1281 | err = ops->callbacks.gso_send_check(skb); | 1283 | err = ops->callbacks.gso_send_check(skb); |
1282 | rcu_read_unlock(); | 1284 | rcu_read_unlock(); |
1283 | 1285 | ||
1284 | out: | 1286 | out: |
1285 | return err; | 1287 | return err; |
1286 | } | 1288 | } |
1287 | 1289 | ||
1288 | static struct sk_buff *inet_gso_segment(struct sk_buff *skb, | 1290 | static struct sk_buff *inet_gso_segment(struct sk_buff *skb, |
1289 | netdev_features_t features) | 1291 | netdev_features_t features) |
1290 | { | 1292 | { |
1291 | struct sk_buff *segs = ERR_PTR(-EINVAL); | 1293 | struct sk_buff *segs = ERR_PTR(-EINVAL); |
1292 | const struct net_offload *ops; | 1294 | const struct net_offload *ops; |
1293 | struct iphdr *iph; | 1295 | struct iphdr *iph; |
1294 | int proto; | 1296 | int proto; |
1295 | int ihl; | 1297 | int ihl; |
1296 | int id; | 1298 | int id; |
1297 | unsigned int offset = 0; | 1299 | unsigned int offset = 0; |
1298 | 1300 | ||
1299 | if (!(features & NETIF_F_V4_CSUM)) | 1301 | if (!(features & NETIF_F_V4_CSUM)) |
1300 | features &= ~NETIF_F_SG; | 1302 | features &= ~NETIF_F_SG; |
1301 | 1303 | ||
1302 | if (unlikely(skb_shinfo(skb)->gso_type & | 1304 | if (unlikely(skb_shinfo(skb)->gso_type & |
1303 | ~(SKB_GSO_TCPV4 | | 1305 | ~(SKB_GSO_TCPV4 | |
1304 | SKB_GSO_UDP | | 1306 | SKB_GSO_UDP | |
1305 | SKB_GSO_DODGY | | 1307 | SKB_GSO_DODGY | |
1306 | SKB_GSO_TCP_ECN | | 1308 | SKB_GSO_TCP_ECN | |
1307 | 0))) | 1309 | 0))) |
1308 | goto out; | 1310 | goto out; |
1309 | 1311 | ||
1310 | if (unlikely(!pskb_may_pull(skb, sizeof(*iph)))) | 1312 | if (unlikely(!pskb_may_pull(skb, sizeof(*iph)))) |
1311 | goto out; | 1313 | goto out; |
1312 | 1314 | ||
1313 | iph = ip_hdr(skb); | 1315 | iph = ip_hdr(skb); |
1314 | ihl = iph->ihl * 4; | 1316 | ihl = iph->ihl * 4; |
1315 | if (ihl < sizeof(*iph)) | 1317 | if (ihl < sizeof(*iph)) |
1316 | goto out; | 1318 | goto out; |
1317 | 1319 | ||
1318 | if (unlikely(!pskb_may_pull(skb, ihl))) | 1320 | if (unlikely(!pskb_may_pull(skb, ihl))) |
1319 | goto out; | 1321 | goto out; |
1320 | 1322 | ||
1321 | __skb_pull(skb, ihl); | 1323 | __skb_pull(skb, ihl); |
1322 | skb_reset_transport_header(skb); | 1324 | skb_reset_transport_header(skb); |
1323 | iph = ip_hdr(skb); | 1325 | iph = ip_hdr(skb); |
1324 | id = ntohs(iph->id); | 1326 | id = ntohs(iph->id); |
1325 | proto = iph->protocol; | 1327 | proto = iph->protocol; |
1326 | segs = ERR_PTR(-EPROTONOSUPPORT); | 1328 | segs = ERR_PTR(-EPROTONOSUPPORT); |
1327 | 1329 | ||
1328 | rcu_read_lock(); | 1330 | rcu_read_lock(); |
1329 | ops = rcu_dereference(inet_offloads[proto]); | 1331 | ops = rcu_dereference(inet_offloads[proto]); |
1330 | if (likely(ops && ops->callbacks.gso_segment)) | 1332 | if (likely(ops && ops->callbacks.gso_segment)) |
1331 | segs = ops->callbacks.gso_segment(skb, features); | 1333 | segs = ops->callbacks.gso_segment(skb, features); |
1332 | rcu_read_unlock(); | 1334 | rcu_read_unlock(); |
1333 | 1335 | ||
1334 | if (!segs || IS_ERR(segs)) | 1336 | if (!segs || IS_ERR(segs)) |
1335 | goto out; | 1337 | goto out; |
1336 | 1338 | ||
1337 | skb = segs; | 1339 | skb = segs; |
1338 | do { | 1340 | do { |
1339 | iph = ip_hdr(skb); | 1341 | iph = ip_hdr(skb); |
1340 | if (proto == IPPROTO_UDP) { | 1342 | if (proto == IPPROTO_UDP) { |
1341 | iph->id = htons(id); | 1343 | iph->id = htons(id); |
1342 | iph->frag_off = htons(offset >> 3); | 1344 | iph->frag_off = htons(offset >> 3); |
1343 | if (skb->next != NULL) | 1345 | if (skb->next != NULL) |
1344 | iph->frag_off |= htons(IP_MF); | 1346 | iph->frag_off |= htons(IP_MF); |
1345 | offset += (skb->len - skb->mac_len - iph->ihl * 4); | 1347 | offset += (skb->len - skb->mac_len - iph->ihl * 4); |
1346 | } else | 1348 | } else |
1347 | iph->id = htons(id++); | 1349 | iph->id = htons(id++); |
1348 | iph->tot_len = htons(skb->len - skb->mac_len); | 1350 | iph->tot_len = htons(skb->len - skb->mac_len); |
1349 | iph->check = 0; | 1351 | iph->check = 0; |
1350 | iph->check = ip_fast_csum(skb_network_header(skb), iph->ihl); | 1352 | iph->check = ip_fast_csum(skb_network_header(skb), iph->ihl); |
1351 | } while ((skb = skb->next)); | 1353 | } while ((skb = skb->next)); |
1352 | 1354 | ||
1353 | out: | 1355 | out: |
1354 | return segs; | 1356 | return segs; |
1355 | } | 1357 | } |
1356 | 1358 | ||
1357 | static struct sk_buff **inet_gro_receive(struct sk_buff **head, | 1359 | static struct sk_buff **inet_gro_receive(struct sk_buff **head, |
1358 | struct sk_buff *skb) | 1360 | struct sk_buff *skb) |
1359 | { | 1361 | { |
1360 | const struct net_offload *ops; | 1362 | const struct net_offload *ops; |
1361 | struct sk_buff **pp = NULL; | 1363 | struct sk_buff **pp = NULL; |
1362 | struct sk_buff *p; | 1364 | struct sk_buff *p; |
1363 | const struct iphdr *iph; | 1365 | const struct iphdr *iph; |
1364 | unsigned int hlen; | 1366 | unsigned int hlen; |
1365 | unsigned int off; | 1367 | unsigned int off; |
1366 | unsigned int id; | 1368 | unsigned int id; |
1367 | int flush = 1; | 1369 | int flush = 1; |
1368 | int proto; | 1370 | int proto; |
1369 | 1371 | ||
1370 | off = skb_gro_offset(skb); | 1372 | off = skb_gro_offset(skb); |
1371 | hlen = off + sizeof(*iph); | 1373 | hlen = off + sizeof(*iph); |
1372 | iph = skb_gro_header_fast(skb, off); | 1374 | iph = skb_gro_header_fast(skb, off); |
1373 | if (skb_gro_header_hard(skb, hlen)) { | 1375 | if (skb_gro_header_hard(skb, hlen)) { |
1374 | iph = skb_gro_header_slow(skb, hlen, off); | 1376 | iph = skb_gro_header_slow(skb, hlen, off); |
1375 | if (unlikely(!iph)) | 1377 | if (unlikely(!iph)) |
1376 | goto out; | 1378 | goto out; |
1377 | } | 1379 | } |
1378 | 1380 | ||
1379 | proto = iph->protocol; | 1381 | proto = iph->protocol; |
1380 | 1382 | ||
1381 | rcu_read_lock(); | 1383 | rcu_read_lock(); |
1382 | ops = rcu_dereference(inet_offloads[proto]); | 1384 | ops = rcu_dereference(inet_offloads[proto]); |
1383 | if (!ops || !ops->callbacks.gro_receive) | 1385 | if (!ops || !ops->callbacks.gro_receive) |
1384 | goto out_unlock; | 1386 | goto out_unlock; |
1385 | 1387 | ||
1386 | if (*(u8 *)iph != 0x45) | 1388 | if (*(u8 *)iph != 0x45) |
1387 | goto out_unlock; | 1389 | goto out_unlock; |
1388 | 1390 | ||
1389 | if (unlikely(ip_fast_csum((u8 *)iph, 5))) | 1391 | if (unlikely(ip_fast_csum((u8 *)iph, 5))) |
1390 | goto out_unlock; | 1392 | goto out_unlock; |
1391 | 1393 | ||
1392 | id = ntohl(*(__be32 *)&iph->id); | 1394 | id = ntohl(*(__be32 *)&iph->id); |
1393 | flush = (u16)((ntohl(*(__be32 *)iph) ^ skb_gro_len(skb)) | (id ^ IP_DF)); | 1395 | flush = (u16)((ntohl(*(__be32 *)iph) ^ skb_gro_len(skb)) | (id ^ IP_DF)); |
1394 | id >>= 16; | 1396 | id >>= 16; |
1395 | 1397 | ||
1396 | for (p = *head; p; p = p->next) { | 1398 | for (p = *head; p; p = p->next) { |
1397 | struct iphdr *iph2; | 1399 | struct iphdr *iph2; |
1398 | 1400 | ||
1399 | if (!NAPI_GRO_CB(p)->same_flow) | 1401 | if (!NAPI_GRO_CB(p)->same_flow) |
1400 | continue; | 1402 | continue; |
1401 | 1403 | ||
1402 | iph2 = ip_hdr(p); | 1404 | iph2 = ip_hdr(p); |
1403 | 1405 | ||
1404 | if ((iph->protocol ^ iph2->protocol) | | 1406 | if ((iph->protocol ^ iph2->protocol) | |
1405 | ((__force u32)iph->saddr ^ (__force u32)iph2->saddr) | | 1407 | ((__force u32)iph->saddr ^ (__force u32)iph2->saddr) | |
1406 | ((__force u32)iph->daddr ^ (__force u32)iph2->daddr)) { | 1408 | ((__force u32)iph->daddr ^ (__force u32)iph2->daddr)) { |
1407 | NAPI_GRO_CB(p)->same_flow = 0; | 1409 | NAPI_GRO_CB(p)->same_flow = 0; |
1408 | continue; | 1410 | continue; |
1409 | } | 1411 | } |
1410 | 1412 | ||
1411 | /* All fields must match except length and checksum. */ | 1413 | /* All fields must match except length and checksum. */ |
1412 | NAPI_GRO_CB(p)->flush |= | 1414 | NAPI_GRO_CB(p)->flush |= |
1413 | (iph->ttl ^ iph2->ttl) | | 1415 | (iph->ttl ^ iph2->ttl) | |
1414 | (iph->tos ^ iph2->tos) | | 1416 | (iph->tos ^ iph2->tos) | |
1415 | ((u16)(ntohs(iph2->id) + NAPI_GRO_CB(p)->count) ^ id); | 1417 | ((u16)(ntohs(iph2->id) + NAPI_GRO_CB(p)->count) ^ id); |
1416 | 1418 | ||
1417 | NAPI_GRO_CB(p)->flush |= flush; | 1419 | NAPI_GRO_CB(p)->flush |= flush; |
1418 | } | 1420 | } |
1419 | 1421 | ||
1420 | NAPI_GRO_CB(skb)->flush |= flush; | 1422 | NAPI_GRO_CB(skb)->flush |= flush; |
1421 | skb_gro_pull(skb, sizeof(*iph)); | 1423 | skb_gro_pull(skb, sizeof(*iph)); |
1422 | skb_set_transport_header(skb, skb_gro_offset(skb)); | 1424 | skb_set_transport_header(skb, skb_gro_offset(skb)); |
1423 | 1425 | ||
1424 | pp = ops->callbacks.gro_receive(head, skb); | 1426 | pp = ops->callbacks.gro_receive(head, skb); |
1425 | 1427 | ||
1426 | out_unlock: | 1428 | out_unlock: |
1427 | rcu_read_unlock(); | 1429 | rcu_read_unlock(); |
1428 | 1430 | ||
1429 | out: | 1431 | out: |
1430 | NAPI_GRO_CB(skb)->flush |= flush; | 1432 | NAPI_GRO_CB(skb)->flush |= flush; |
1431 | 1433 | ||
1432 | return pp; | 1434 | return pp; |
1433 | } | 1435 | } |
1434 | 1436 | ||
1435 | static int inet_gro_complete(struct sk_buff *skb) | 1437 | static int inet_gro_complete(struct sk_buff *skb) |
1436 | { | 1438 | { |
1437 | __be16 newlen = htons(skb->len - skb_network_offset(skb)); | 1439 | __be16 newlen = htons(skb->len - skb_network_offset(skb)); |
1438 | struct iphdr *iph = ip_hdr(skb); | 1440 | struct iphdr *iph = ip_hdr(skb); |
1439 | const struct net_offload *ops; | 1441 | const struct net_offload *ops; |
1440 | int proto = iph->protocol; | 1442 | int proto = iph->protocol; |
1441 | int err = -ENOSYS; | 1443 | int err = -ENOSYS; |
1442 | 1444 | ||
1443 | csum_replace2(&iph->check, iph->tot_len, newlen); | 1445 | csum_replace2(&iph->check, iph->tot_len, newlen); |
1444 | iph->tot_len = newlen; | 1446 | iph->tot_len = newlen; |
1445 | 1447 | ||
1446 | rcu_read_lock(); | 1448 | rcu_read_lock(); |
1447 | ops = rcu_dereference(inet_offloads[proto]); | 1449 | ops = rcu_dereference(inet_offloads[proto]); |
1448 | if (WARN_ON(!ops || !ops->callbacks.gro_complete)) | 1450 | if (WARN_ON(!ops || !ops->callbacks.gro_complete)) |
1449 | goto out_unlock; | 1451 | goto out_unlock; |
1450 | 1452 | ||
1451 | err = ops->callbacks.gro_complete(skb); | 1453 | err = ops->callbacks.gro_complete(skb); |
1452 | 1454 | ||
1453 | out_unlock: | 1455 | out_unlock: |
1454 | rcu_read_unlock(); | 1456 | rcu_read_unlock(); |
1455 | 1457 | ||
1456 | return err; | 1458 | return err; |
1457 | } | 1459 | } |
1458 | 1460 | ||
1459 | int inet_ctl_sock_create(struct sock **sk, unsigned short family, | 1461 | int inet_ctl_sock_create(struct sock **sk, unsigned short family, |
1460 | unsigned short type, unsigned char protocol, | 1462 | unsigned short type, unsigned char protocol, |
1461 | struct net *net) | 1463 | struct net *net) |
1462 | { | 1464 | { |
1463 | struct socket *sock; | 1465 | struct socket *sock; |
1464 | int rc = sock_create_kern(family, type, protocol, &sock); | 1466 | int rc = sock_create_kern(family, type, protocol, &sock); |
1465 | 1467 | ||
1466 | if (rc == 0) { | 1468 | if (rc == 0) { |
1467 | *sk = sock->sk; | 1469 | *sk = sock->sk; |
1468 | (*sk)->sk_allocation = GFP_ATOMIC; | 1470 | (*sk)->sk_allocation = GFP_ATOMIC; |
1469 | /* | 1471 | /* |
1470 | * Unhash it so that IP input processing does not even see it, | 1472 | * Unhash it so that IP input processing does not even see it, |
1471 | * we do not wish this socket to see incoming packets. | 1473 | * we do not wish this socket to see incoming packets. |
1472 | */ | 1474 | */ |
1473 | (*sk)->sk_prot->unhash(*sk); | 1475 | (*sk)->sk_prot->unhash(*sk); |
1474 | 1476 | ||
1475 | sk_change_net(*sk, net); | 1477 | sk_change_net(*sk, net); |
1476 | } | 1478 | } |
1477 | return rc; | 1479 | return rc; |
1478 | } | 1480 | } |
1479 | EXPORT_SYMBOL_GPL(inet_ctl_sock_create); | 1481 | EXPORT_SYMBOL_GPL(inet_ctl_sock_create); |
1480 | 1482 | ||
1481 | unsigned long snmp_fold_field(void __percpu *mib[], int offt) | 1483 | unsigned long snmp_fold_field(void __percpu *mib[], int offt) |
1482 | { | 1484 | { |
1483 | unsigned long res = 0; | 1485 | unsigned long res = 0; |
1484 | int i, j; | 1486 | int i, j; |
1485 | 1487 | ||
1486 | for_each_possible_cpu(i) { | 1488 | for_each_possible_cpu(i) { |
1487 | for (j = 0; j < SNMP_ARRAY_SZ; j++) | 1489 | for (j = 0; j < SNMP_ARRAY_SZ; j++) |
1488 | res += *(((unsigned long *) per_cpu_ptr(mib[j], i)) + offt); | 1490 | res += *(((unsigned long *) per_cpu_ptr(mib[j], i)) + offt); |
1489 | } | 1491 | } |
1490 | return res; | 1492 | return res; |
1491 | } | 1493 | } |
1492 | EXPORT_SYMBOL_GPL(snmp_fold_field); | 1494 | EXPORT_SYMBOL_GPL(snmp_fold_field); |
1493 | 1495 | ||
1494 | #if BITS_PER_LONG==32 | 1496 | #if BITS_PER_LONG==32 |
1495 | 1497 | ||
1496 | u64 snmp_fold_field64(void __percpu *mib[], int offt, size_t syncp_offset) | 1498 | u64 snmp_fold_field64(void __percpu *mib[], int offt, size_t syncp_offset) |
1497 | { | 1499 | { |
1498 | u64 res = 0; | 1500 | u64 res = 0; |
1499 | int cpu; | 1501 | int cpu; |
1500 | 1502 | ||
1501 | for_each_possible_cpu(cpu) { | 1503 | for_each_possible_cpu(cpu) { |
1502 | void *bhptr; | 1504 | void *bhptr; |
1503 | struct u64_stats_sync *syncp; | 1505 | struct u64_stats_sync *syncp; |
1504 | u64 v; | 1506 | u64 v; |
1505 | unsigned int start; | 1507 | unsigned int start; |
1506 | 1508 | ||
1507 | bhptr = per_cpu_ptr(mib[0], cpu); | 1509 | bhptr = per_cpu_ptr(mib[0], cpu); |
1508 | syncp = (struct u64_stats_sync *)(bhptr + syncp_offset); | 1510 | syncp = (struct u64_stats_sync *)(bhptr + syncp_offset); |
1509 | do { | 1511 | do { |
1510 | start = u64_stats_fetch_begin_bh(syncp); | 1512 | start = u64_stats_fetch_begin_bh(syncp); |
1511 | v = *(((u64 *) bhptr) + offt); | 1513 | v = *(((u64 *) bhptr) + offt); |
1512 | } while (u64_stats_fetch_retry_bh(syncp, start)); | 1514 | } while (u64_stats_fetch_retry_bh(syncp, start)); |
1513 | 1515 | ||
1514 | res += v; | 1516 | res += v; |
1515 | } | 1517 | } |
1516 | return res; | 1518 | return res; |
1517 | } | 1519 | } |
1518 | EXPORT_SYMBOL_GPL(snmp_fold_field64); | 1520 | EXPORT_SYMBOL_GPL(snmp_fold_field64); |
1519 | #endif | 1521 | #endif |
1520 | 1522 | ||
1521 | int snmp_mib_init(void __percpu *ptr[2], size_t mibsize, size_t align) | 1523 | int snmp_mib_init(void __percpu *ptr[2], size_t mibsize, size_t align) |
1522 | { | 1524 | { |
1523 | BUG_ON(ptr == NULL); | 1525 | BUG_ON(ptr == NULL); |
1524 | ptr[0] = __alloc_percpu(mibsize, align); | 1526 | ptr[0] = __alloc_percpu(mibsize, align); |
1525 | if (!ptr[0]) | 1527 | if (!ptr[0]) |
1526 | return -ENOMEM; | 1528 | return -ENOMEM; |
1527 | #if SNMP_ARRAY_SZ == 2 | 1529 | #if SNMP_ARRAY_SZ == 2 |
1528 | ptr[1] = __alloc_percpu(mibsize, align); | 1530 | ptr[1] = __alloc_percpu(mibsize, align); |
1529 | if (!ptr[1]) { | 1531 | if (!ptr[1]) { |
1530 | free_percpu(ptr[0]); | 1532 | free_percpu(ptr[0]); |
1531 | ptr[0] = NULL; | 1533 | ptr[0] = NULL; |
1532 | return -ENOMEM; | 1534 | return -ENOMEM; |
1533 | } | 1535 | } |
1534 | #endif | 1536 | #endif |
1535 | return 0; | 1537 | return 0; |
1536 | } | 1538 | } |
1537 | EXPORT_SYMBOL_GPL(snmp_mib_init); | 1539 | EXPORT_SYMBOL_GPL(snmp_mib_init); |
1538 | 1540 | ||
1539 | void snmp_mib_free(void __percpu *ptr[SNMP_ARRAY_SZ]) | 1541 | void snmp_mib_free(void __percpu *ptr[SNMP_ARRAY_SZ]) |
1540 | { | 1542 | { |
1541 | int i; | 1543 | int i; |
1542 | 1544 | ||
1543 | BUG_ON(ptr == NULL); | 1545 | BUG_ON(ptr == NULL); |
1544 | for (i = 0; i < SNMP_ARRAY_SZ; i++) { | 1546 | for (i = 0; i < SNMP_ARRAY_SZ; i++) { |
1545 | free_percpu(ptr[i]); | 1547 | free_percpu(ptr[i]); |
1546 | ptr[i] = NULL; | 1548 | ptr[i] = NULL; |
1547 | } | 1549 | } |
1548 | } | 1550 | } |
1549 | EXPORT_SYMBOL_GPL(snmp_mib_free); | 1551 | EXPORT_SYMBOL_GPL(snmp_mib_free); |
1550 | 1552 | ||
1551 | #ifdef CONFIG_IP_MULTICAST | 1553 | #ifdef CONFIG_IP_MULTICAST |
1552 | static const struct net_protocol igmp_protocol = { | 1554 | static const struct net_protocol igmp_protocol = { |
1553 | .handler = igmp_rcv, | 1555 | .handler = igmp_rcv, |
1554 | .netns_ok = 1, | 1556 | .netns_ok = 1, |
1555 | }; | 1557 | }; |
1556 | #endif | 1558 | #endif |
1557 | 1559 | ||
1558 | static const struct net_protocol tcp_protocol = { | 1560 | static const struct net_protocol tcp_protocol = { |
1559 | .early_demux = tcp_v4_early_demux, | 1561 | .early_demux = tcp_v4_early_demux, |
1560 | .handler = tcp_v4_rcv, | 1562 | .handler = tcp_v4_rcv, |
1561 | .err_handler = tcp_v4_err, | 1563 | .err_handler = tcp_v4_err, |
1562 | .no_policy = 1, | 1564 | .no_policy = 1, |
1563 | .netns_ok = 1, | 1565 | .netns_ok = 1, |
1564 | }; | 1566 | }; |
1565 | 1567 | ||
1566 | static const struct net_offload tcp_offload = { | 1568 | static const struct net_offload tcp_offload = { |
1567 | .callbacks = { | 1569 | .callbacks = { |
1568 | .gso_send_check = tcp_v4_gso_send_check, | 1570 | .gso_send_check = tcp_v4_gso_send_check, |
1569 | .gso_segment = tcp_tso_segment, | 1571 | .gso_segment = tcp_tso_segment, |
1570 | .gro_receive = tcp4_gro_receive, | 1572 | .gro_receive = tcp4_gro_receive, |
1571 | .gro_complete = tcp4_gro_complete, | 1573 | .gro_complete = tcp4_gro_complete, |
1572 | }, | 1574 | }, |
1573 | }; | 1575 | }; |
1574 | 1576 | ||
1575 | static const struct net_protocol udp_protocol = { | 1577 | static const struct net_protocol udp_protocol = { |
1576 | .handler = udp_rcv, | 1578 | .handler = udp_rcv, |
1577 | .err_handler = udp_err, | 1579 | .err_handler = udp_err, |
1578 | .no_policy = 1, | 1580 | .no_policy = 1, |
1579 | .netns_ok = 1, | 1581 | .netns_ok = 1, |
1580 | }; | 1582 | }; |
1581 | 1583 | ||
1582 | static const struct net_offload udp_offload = { | 1584 | static const struct net_offload udp_offload = { |
1583 | .callbacks = { | 1585 | .callbacks = { |
1584 | .gso_send_check = udp4_ufo_send_check, | 1586 | .gso_send_check = udp4_ufo_send_check, |
1585 | .gso_segment = udp4_ufo_fragment, | 1587 | .gso_segment = udp4_ufo_fragment, |
1586 | }, | 1588 | }, |
1587 | }; | 1589 | }; |
1588 | 1590 | ||
1589 | static const struct net_protocol icmp_protocol = { | 1591 | static const struct net_protocol icmp_protocol = { |
1590 | .handler = icmp_rcv, | 1592 | .handler = icmp_rcv, |
1591 | .err_handler = ping_err, | 1593 | .err_handler = ping_err, |
1592 | .no_policy = 1, | 1594 | .no_policy = 1, |
1593 | .netns_ok = 1, | 1595 | .netns_ok = 1, |
1594 | }; | 1596 | }; |
1595 | 1597 | ||
1596 | static __net_init int ipv4_mib_init_net(struct net *net) | 1598 | static __net_init int ipv4_mib_init_net(struct net *net) |
1597 | { | 1599 | { |
1598 | if (snmp_mib_init((void __percpu **)net->mib.tcp_statistics, | 1600 | if (snmp_mib_init((void __percpu **)net->mib.tcp_statistics, |
1599 | sizeof(struct tcp_mib), | 1601 | sizeof(struct tcp_mib), |
1600 | __alignof__(struct tcp_mib)) < 0) | 1602 | __alignof__(struct tcp_mib)) < 0) |
1601 | goto err_tcp_mib; | 1603 | goto err_tcp_mib; |
1602 | if (snmp_mib_init((void __percpu **)net->mib.ip_statistics, | 1604 | if (snmp_mib_init((void __percpu **)net->mib.ip_statistics, |
1603 | sizeof(struct ipstats_mib), | 1605 | sizeof(struct ipstats_mib), |
1604 | __alignof__(struct ipstats_mib)) < 0) | 1606 | __alignof__(struct ipstats_mib)) < 0) |
1605 | goto err_ip_mib; | 1607 | goto err_ip_mib; |
1606 | if (snmp_mib_init((void __percpu **)net->mib.net_statistics, | 1608 | if (snmp_mib_init((void __percpu **)net->mib.net_statistics, |
1607 | sizeof(struct linux_mib), | 1609 | sizeof(struct linux_mib), |
1608 | __alignof__(struct linux_mib)) < 0) | 1610 | __alignof__(struct linux_mib)) < 0) |
1609 | goto err_net_mib; | 1611 | goto err_net_mib; |
1610 | if (snmp_mib_init((void __percpu **)net->mib.udp_statistics, | 1612 | if (snmp_mib_init((void __percpu **)net->mib.udp_statistics, |
1611 | sizeof(struct udp_mib), | 1613 | sizeof(struct udp_mib), |
1612 | __alignof__(struct udp_mib)) < 0) | 1614 | __alignof__(struct udp_mib)) < 0) |
1613 | goto err_udp_mib; | 1615 | goto err_udp_mib; |
1614 | if (snmp_mib_init((void __percpu **)net->mib.udplite_statistics, | 1616 | if (snmp_mib_init((void __percpu **)net->mib.udplite_statistics, |
1615 | sizeof(struct udp_mib), | 1617 | sizeof(struct udp_mib), |
1616 | __alignof__(struct udp_mib)) < 0) | 1618 | __alignof__(struct udp_mib)) < 0) |
1617 | goto err_udplite_mib; | 1619 | goto err_udplite_mib; |
1618 | if (snmp_mib_init((void __percpu **)net->mib.icmp_statistics, | 1620 | if (snmp_mib_init((void __percpu **)net->mib.icmp_statistics, |
1619 | sizeof(struct icmp_mib), | 1621 | sizeof(struct icmp_mib), |
1620 | __alignof__(struct icmp_mib)) < 0) | 1622 | __alignof__(struct icmp_mib)) < 0) |
1621 | goto err_icmp_mib; | 1623 | goto err_icmp_mib; |
1622 | net->mib.icmpmsg_statistics = kzalloc(sizeof(struct icmpmsg_mib), | 1624 | net->mib.icmpmsg_statistics = kzalloc(sizeof(struct icmpmsg_mib), |
1623 | GFP_KERNEL); | 1625 | GFP_KERNEL); |
1624 | if (!net->mib.icmpmsg_statistics) | 1626 | if (!net->mib.icmpmsg_statistics) |
1625 | goto err_icmpmsg_mib; | 1627 | goto err_icmpmsg_mib; |
1626 | 1628 | ||
1627 | tcp_mib_init(net); | 1629 | tcp_mib_init(net); |
1628 | return 0; | 1630 | return 0; |
1629 | 1631 | ||
1630 | err_icmpmsg_mib: | 1632 | err_icmpmsg_mib: |
1631 | snmp_mib_free((void __percpu **)net->mib.icmp_statistics); | 1633 | snmp_mib_free((void __percpu **)net->mib.icmp_statistics); |
1632 | err_icmp_mib: | 1634 | err_icmp_mib: |
1633 | snmp_mib_free((void __percpu **)net->mib.udplite_statistics); | 1635 | snmp_mib_free((void __percpu **)net->mib.udplite_statistics); |
1634 | err_udplite_mib: | 1636 | err_udplite_mib: |
1635 | snmp_mib_free((void __percpu **)net->mib.udp_statistics); | 1637 | snmp_mib_free((void __percpu **)net->mib.udp_statistics); |
1636 | err_udp_mib: | 1638 | err_udp_mib: |
1637 | snmp_mib_free((void __percpu **)net->mib.net_statistics); | 1639 | snmp_mib_free((void __percpu **)net->mib.net_statistics); |
1638 | err_net_mib: | 1640 | err_net_mib: |
1639 | snmp_mib_free((void __percpu **)net->mib.ip_statistics); | 1641 | snmp_mib_free((void __percpu **)net->mib.ip_statistics); |
1640 | err_ip_mib: | 1642 | err_ip_mib: |
1641 | snmp_mib_free((void __percpu **)net->mib.tcp_statistics); | 1643 | snmp_mib_free((void __percpu **)net->mib.tcp_statistics); |
1642 | err_tcp_mib: | 1644 | err_tcp_mib: |
1643 | return -ENOMEM; | 1645 | return -ENOMEM; |
1644 | } | 1646 | } |
1645 | 1647 | ||
1646 | static __net_exit void ipv4_mib_exit_net(struct net *net) | 1648 | static __net_exit void ipv4_mib_exit_net(struct net *net) |
1647 | { | 1649 | { |
1648 | kfree(net->mib.icmpmsg_statistics); | 1650 | kfree(net->mib.icmpmsg_statistics); |
1649 | snmp_mib_free((void __percpu **)net->mib.icmp_statistics); | 1651 | snmp_mib_free((void __percpu **)net->mib.icmp_statistics); |
1650 | snmp_mib_free((void __percpu **)net->mib.udplite_statistics); | 1652 | snmp_mib_free((void __percpu **)net->mib.udplite_statistics); |
1651 | snmp_mib_free((void __percpu **)net->mib.udp_statistics); | 1653 | snmp_mib_free((void __percpu **)net->mib.udp_statistics); |
1652 | snmp_mib_free((void __percpu **)net->mib.net_statistics); | 1654 | snmp_mib_free((void __percpu **)net->mib.net_statistics); |
1653 | snmp_mib_free((void __percpu **)net->mib.ip_statistics); | 1655 | snmp_mib_free((void __percpu **)net->mib.ip_statistics); |
1654 | snmp_mib_free((void __percpu **)net->mib.tcp_statistics); | 1656 | snmp_mib_free((void __percpu **)net->mib.tcp_statistics); |
1655 | } | 1657 | } |
1656 | 1658 | ||
1657 | static __net_initdata struct pernet_operations ipv4_mib_ops = { | 1659 | static __net_initdata struct pernet_operations ipv4_mib_ops = { |
1658 | .init = ipv4_mib_init_net, | 1660 | .init = ipv4_mib_init_net, |
1659 | .exit = ipv4_mib_exit_net, | 1661 | .exit = ipv4_mib_exit_net, |
1660 | }; | 1662 | }; |
1661 | 1663 | ||
1662 | static int __init init_ipv4_mibs(void) | 1664 | static int __init init_ipv4_mibs(void) |
1663 | { | 1665 | { |
1664 | return register_pernet_subsys(&ipv4_mib_ops); | 1666 | return register_pernet_subsys(&ipv4_mib_ops); |
1665 | } | 1667 | } |
1666 | 1668 | ||
1667 | static int ipv4_proc_init(void); | 1669 | static int ipv4_proc_init(void); |
1668 | 1670 | ||
1669 | /* | 1671 | /* |
1670 | * IP protocol layer initialiser | 1672 | * IP protocol layer initialiser |
1671 | */ | 1673 | */ |
1672 | 1674 | ||
1673 | static struct packet_offload ip_packet_offload __read_mostly = { | 1675 | static struct packet_offload ip_packet_offload __read_mostly = { |
1674 | .type = cpu_to_be16(ETH_P_IP), | 1676 | .type = cpu_to_be16(ETH_P_IP), |
1675 | .callbacks = { | 1677 | .callbacks = { |
1676 | .gso_send_check = inet_gso_send_check, | 1678 | .gso_send_check = inet_gso_send_check, |
1677 | .gso_segment = inet_gso_segment, | 1679 | .gso_segment = inet_gso_segment, |
1678 | .gro_receive = inet_gro_receive, | 1680 | .gro_receive = inet_gro_receive, |
1679 | .gro_complete = inet_gro_complete, | 1681 | .gro_complete = inet_gro_complete, |
1680 | }, | 1682 | }, |
1681 | }; | 1683 | }; |
1682 | 1684 | ||
1683 | static int __init ipv4_offload_init(void) | 1685 | static int __init ipv4_offload_init(void) |
1684 | { | 1686 | { |
1685 | /* | 1687 | /* |
1686 | * Add offloads | 1688 | * Add offloads |
1687 | */ | 1689 | */ |
1688 | if (inet_add_offload(&udp_offload, IPPROTO_UDP) < 0) | 1690 | if (inet_add_offload(&udp_offload, IPPROTO_UDP) < 0) |
1689 | pr_crit("%s: Cannot add UDP protocol offload\n", __func__); | 1691 | pr_crit("%s: Cannot add UDP protocol offload\n", __func__); |
1690 | if (inet_add_offload(&tcp_offload, IPPROTO_TCP) < 0) | 1692 | if (inet_add_offload(&tcp_offload, IPPROTO_TCP) < 0) |
1691 | pr_crit("%s: Cannot add TCP protocol offlaod\n", __func__); | 1693 | pr_crit("%s: Cannot add TCP protocol offlaod\n", __func__); |
1692 | 1694 | ||
1693 | dev_add_offload(&ip_packet_offload); | 1695 | dev_add_offload(&ip_packet_offload); |
1694 | return 0; | 1696 | return 0; |
1695 | } | 1697 | } |
1696 | 1698 | ||
1697 | fs_initcall(ipv4_offload_init); | 1699 | fs_initcall(ipv4_offload_init); |
1698 | 1700 | ||
1699 | static struct packet_type ip_packet_type __read_mostly = { | 1701 | static struct packet_type ip_packet_type __read_mostly = { |
1700 | .type = cpu_to_be16(ETH_P_IP), | 1702 | .type = cpu_to_be16(ETH_P_IP), |
1701 | .func = ip_rcv, | 1703 | .func = ip_rcv, |
1702 | }; | 1704 | }; |
1703 | 1705 | ||
1704 | static int __init inet_init(void) | 1706 | static int __init inet_init(void) |
1705 | { | 1707 | { |
1706 | struct sk_buff *dummy_skb; | 1708 | struct sk_buff *dummy_skb; |
1707 | struct inet_protosw *q; | 1709 | struct inet_protosw *q; |
1708 | struct list_head *r; | 1710 | struct list_head *r; |
1709 | int rc = -EINVAL; | 1711 | int rc = -EINVAL; |
1710 | 1712 | ||
1711 | BUILD_BUG_ON(sizeof(struct inet_skb_parm) > sizeof(dummy_skb->cb)); | 1713 | BUILD_BUG_ON(sizeof(struct inet_skb_parm) > sizeof(dummy_skb->cb)); |
1712 | 1714 | ||
1713 | sysctl_local_reserved_ports = kzalloc(65536 / 8, GFP_KERNEL); | 1715 | sysctl_local_reserved_ports = kzalloc(65536 / 8, GFP_KERNEL); |
1714 | if (!sysctl_local_reserved_ports) | 1716 | if (!sysctl_local_reserved_ports) |
1715 | goto out; | 1717 | goto out; |
1716 | 1718 | ||
1717 | rc = proto_register(&tcp_prot, 1); | 1719 | rc = proto_register(&tcp_prot, 1); |
1718 | if (rc) | 1720 | if (rc) |
1719 | goto out_free_reserved_ports; | 1721 | goto out_free_reserved_ports; |
1720 | 1722 | ||
1721 | rc = proto_register(&udp_prot, 1); | 1723 | rc = proto_register(&udp_prot, 1); |
1722 | if (rc) | 1724 | if (rc) |
1723 | goto out_unregister_tcp_proto; | 1725 | goto out_unregister_tcp_proto; |
1724 | 1726 | ||
1725 | rc = proto_register(&raw_prot, 1); | 1727 | rc = proto_register(&raw_prot, 1); |
1726 | if (rc) | 1728 | if (rc) |
1727 | goto out_unregister_udp_proto; | 1729 | goto out_unregister_udp_proto; |
1728 | 1730 | ||
1729 | rc = proto_register(&ping_prot, 1); | 1731 | rc = proto_register(&ping_prot, 1); |
1730 | if (rc) | 1732 | if (rc) |
1731 | goto out_unregister_raw_proto; | 1733 | goto out_unregister_raw_proto; |
1732 | 1734 | ||
1733 | /* | 1735 | /* |
1734 | * Tell SOCKET that we are alive... | 1736 | * Tell SOCKET that we are alive... |
1735 | */ | 1737 | */ |
1736 | 1738 | ||
1737 | (void)sock_register(&inet_family_ops); | 1739 | (void)sock_register(&inet_family_ops); |
1738 | 1740 | ||
1739 | #ifdef CONFIG_SYSCTL | 1741 | #ifdef CONFIG_SYSCTL |
1740 | ip_static_sysctl_init(); | 1742 | ip_static_sysctl_init(); |
1741 | #endif | 1743 | #endif |
1742 | 1744 | ||
1743 | tcp_prot.sysctl_mem = init_net.ipv4.sysctl_tcp_mem; | 1745 | tcp_prot.sysctl_mem = init_net.ipv4.sysctl_tcp_mem; |
1744 | 1746 | ||
1745 | /* | 1747 | /* |
1746 | * Add all the base protocols. | 1748 | * Add all the base protocols. |
1747 | */ | 1749 | */ |
1748 | 1750 | ||
1749 | if (inet_add_protocol(&icmp_protocol, IPPROTO_ICMP) < 0) | 1751 | if (inet_add_protocol(&icmp_protocol, IPPROTO_ICMP) < 0) |
1750 | pr_crit("%s: Cannot add ICMP protocol\n", __func__); | 1752 | pr_crit("%s: Cannot add ICMP protocol\n", __func__); |
1751 | if (inet_add_protocol(&udp_protocol, IPPROTO_UDP) < 0) | 1753 | if (inet_add_protocol(&udp_protocol, IPPROTO_UDP) < 0) |
1752 | pr_crit("%s: Cannot add UDP protocol\n", __func__); | 1754 | pr_crit("%s: Cannot add UDP protocol\n", __func__); |
1753 | if (inet_add_protocol(&tcp_protocol, IPPROTO_TCP) < 0) | 1755 | if (inet_add_protocol(&tcp_protocol, IPPROTO_TCP) < 0) |
1754 | pr_crit("%s: Cannot add TCP protocol\n", __func__); | 1756 | pr_crit("%s: Cannot add TCP protocol\n", __func__); |
1755 | #ifdef CONFIG_IP_MULTICAST | 1757 | #ifdef CONFIG_IP_MULTICAST |
1756 | if (inet_add_protocol(&igmp_protocol, IPPROTO_IGMP) < 0) | 1758 | if (inet_add_protocol(&igmp_protocol, IPPROTO_IGMP) < 0) |
1757 | pr_crit("%s: Cannot add IGMP protocol\n", __func__); | 1759 | pr_crit("%s: Cannot add IGMP protocol\n", __func__); |
1758 | #endif | 1760 | #endif |
1759 | 1761 | ||
1760 | /* Register the socket-side information for inet_create. */ | 1762 | /* Register the socket-side information for inet_create. */ |
1761 | for (r = &inetsw[0]; r < &inetsw[SOCK_MAX]; ++r) | 1763 | for (r = &inetsw[0]; r < &inetsw[SOCK_MAX]; ++r) |
1762 | INIT_LIST_HEAD(r); | 1764 | INIT_LIST_HEAD(r); |
1763 | 1765 | ||
1764 | for (q = inetsw_array; q < &inetsw_array[INETSW_ARRAY_LEN]; ++q) | 1766 | for (q = inetsw_array; q < &inetsw_array[INETSW_ARRAY_LEN]; ++q) |
1765 | inet_register_protosw(q); | 1767 | inet_register_protosw(q); |
1766 | 1768 | ||
1767 | /* | 1769 | /* |
1768 | * Set the ARP module up | 1770 | * Set the ARP module up |
1769 | */ | 1771 | */ |
1770 | 1772 | ||
1771 | arp_init(); | 1773 | arp_init(); |
1772 | 1774 | ||
1773 | /* | 1775 | /* |
1774 | * Set the IP module up | 1776 | * Set the IP module up |
1775 | */ | 1777 | */ |
1776 | 1778 | ||
1777 | ip_init(); | 1779 | ip_init(); |
1778 | 1780 | ||
1779 | tcp_v4_init(); | 1781 | tcp_v4_init(); |
1780 | 1782 | ||
1781 | /* Setup TCP slab cache for open requests. */ | 1783 | /* Setup TCP slab cache for open requests. */ |
1782 | tcp_init(); | 1784 | tcp_init(); |
1783 | 1785 | ||
1784 | /* Setup UDP memory threshold */ | 1786 | /* Setup UDP memory threshold */ |
1785 | udp_init(); | 1787 | udp_init(); |
1786 | 1788 | ||
1787 | /* Add UDP-Lite (RFC 3828) */ | 1789 | /* Add UDP-Lite (RFC 3828) */ |
1788 | udplite4_register(); | 1790 | udplite4_register(); |
1789 | 1791 | ||
1790 | ping_init(); | 1792 | ping_init(); |
1791 | 1793 | ||
1792 | /* | 1794 | /* |
1793 | * Set the ICMP layer up | 1795 | * Set the ICMP layer up |
1794 | */ | 1796 | */ |
1795 | 1797 | ||
1796 | if (icmp_init() < 0) | 1798 | if (icmp_init() < 0) |
1797 | panic("Failed to create the ICMP control socket.\n"); | 1799 | panic("Failed to create the ICMP control socket.\n"); |
1798 | 1800 | ||
1799 | /* | 1801 | /* |
1800 | * Initialise the multicast router | 1802 | * Initialise the multicast router |
1801 | */ | 1803 | */ |
1802 | #if defined(CONFIG_IP_MROUTE) | 1804 | #if defined(CONFIG_IP_MROUTE) |
1803 | if (ip_mr_init()) | 1805 | if (ip_mr_init()) |
1804 | pr_crit("%s: Cannot init ipv4 mroute\n", __func__); | 1806 | pr_crit("%s: Cannot init ipv4 mroute\n", __func__); |
1805 | #endif | 1807 | #endif |
1806 | /* | 1808 | /* |
1807 | * Initialise per-cpu ipv4 mibs | 1809 | * Initialise per-cpu ipv4 mibs |
1808 | */ | 1810 | */ |
1809 | 1811 | ||
1810 | if (init_ipv4_mibs()) | 1812 | if (init_ipv4_mibs()) |
1811 | pr_crit("%s: Cannot init ipv4 mibs\n", __func__); | 1813 | pr_crit("%s: Cannot init ipv4 mibs\n", __func__); |
1812 | 1814 | ||
1813 | ipv4_proc_init(); | 1815 | ipv4_proc_init(); |
1814 | 1816 | ||
1815 | ipfrag_init(); | 1817 | ipfrag_init(); |
1816 | 1818 | ||
1817 | dev_add_pack(&ip_packet_type); | 1819 | dev_add_pack(&ip_packet_type); |
1818 | 1820 | ||
1819 | rc = 0; | 1821 | rc = 0; |
1820 | out: | 1822 | out: |
1821 | return rc; | 1823 | return rc; |
1822 | out_unregister_raw_proto: | 1824 | out_unregister_raw_proto: |
1823 | proto_unregister(&raw_prot); | 1825 | proto_unregister(&raw_prot); |
1824 | out_unregister_udp_proto: | 1826 | out_unregister_udp_proto: |
1825 | proto_unregister(&udp_prot); | 1827 | proto_unregister(&udp_prot); |
1826 | out_unregister_tcp_proto: | 1828 | out_unregister_tcp_proto: |
1827 | proto_unregister(&tcp_prot); | 1829 | proto_unregister(&tcp_prot); |
1828 | out_free_reserved_ports: | 1830 | out_free_reserved_ports: |
1829 | kfree(sysctl_local_reserved_ports); | 1831 | kfree(sysctl_local_reserved_ports); |
1830 | goto out; | 1832 | goto out; |
1831 | } | 1833 | } |
1832 | 1834 | ||
1833 | fs_initcall(inet_init); | 1835 | fs_initcall(inet_init); |
1834 | 1836 | ||
1835 | /* ------------------------------------------------------------------------ */ | 1837 | /* ------------------------------------------------------------------------ */ |
1836 | 1838 | ||
1837 | #ifdef CONFIG_PROC_FS | 1839 | #ifdef CONFIG_PROC_FS |
1838 | static int __init ipv4_proc_init(void) | 1840 | static int __init ipv4_proc_init(void) |
1839 | { | 1841 | { |
1840 | int rc = 0; | 1842 | int rc = 0; |
1841 | 1843 | ||
1842 | if (raw_proc_init()) | 1844 | if (raw_proc_init()) |
1843 | goto out_raw; | 1845 | goto out_raw; |
1844 | if (tcp4_proc_init()) | 1846 | if (tcp4_proc_init()) |
1845 | goto out_tcp; | 1847 | goto out_tcp; |
1846 | if (udp4_proc_init()) | 1848 | if (udp4_proc_init()) |
1847 | goto out_udp; | 1849 | goto out_udp; |
1848 | if (ping_proc_init()) | 1850 | if (ping_proc_init()) |
1849 | goto out_ping; | 1851 | goto out_ping; |
1850 | if (ip_misc_proc_init()) | 1852 | if (ip_misc_proc_init()) |
1851 | goto out_misc; | 1853 | goto out_misc; |
1852 | out: | 1854 | out: |
1853 | return rc; | 1855 | return rc; |
1854 | out_misc: | 1856 | out_misc: |
1855 | ping_proc_exit(); | 1857 | ping_proc_exit(); |
1856 | out_ping: | 1858 | out_ping: |
1857 | udp4_proc_exit(); | 1859 | udp4_proc_exit(); |
1858 | out_udp: | 1860 | out_udp: |
1859 | tcp4_proc_exit(); | 1861 | tcp4_proc_exit(); |
1860 | out_tcp: | 1862 | out_tcp: |
1861 | raw_proc_exit(); | 1863 | raw_proc_exit(); |
1862 | out_raw: | 1864 | out_raw: |
1863 | rc = -ENOMEM; | 1865 | rc = -ENOMEM; |
1864 | goto out; | 1866 | goto out; |
1865 | } | 1867 | } |
1866 | 1868 | ||
1867 | #else /* CONFIG_PROC_FS */ | 1869 | #else /* CONFIG_PROC_FS */ |
1868 | static int __init ipv4_proc_init(void) | 1870 | static int __init ipv4_proc_init(void) |
1869 | { | 1871 | { |
1870 | return 0; | 1872 | return 0; |
1871 | } | 1873 | } |
1872 | #endif /* CONFIG_PROC_FS */ | 1874 | #endif /* CONFIG_PROC_FS */ |
1873 | 1875 | ||
1874 | MODULE_ALIAS_NETPROTO(PF_INET); | 1876 | MODULE_ALIAS_NETPROTO(PF_INET); |
1875 | 1877 | ||
1876 | 1878 |
net/ipv6/af_inet6.c
1 | /* | 1 | /* |
2 | * PF_INET6 socket protocol family | 2 | * PF_INET6 socket protocol family |
3 | * Linux INET6 implementation | 3 | * Linux INET6 implementation |
4 | * | 4 | * |
5 | * Authors: | 5 | * Authors: |
6 | * Pedro Roque <roque@di.fc.ul.pt> | 6 | * Pedro Roque <roque@di.fc.ul.pt> |
7 | * | 7 | * |
8 | * Adapted from linux/net/ipv4/af_inet.c | 8 | * Adapted from linux/net/ipv4/af_inet.c |
9 | * | 9 | * |
10 | * Fixes: | 10 | * Fixes: |
11 | * piggy, Karl Knutson : Socket protocol table | 11 | * piggy, Karl Knutson : Socket protocol table |
12 | * Hideaki YOSHIFUJI : sin6_scope_id support | 12 | * Hideaki YOSHIFUJI : sin6_scope_id support |
13 | * Arnaldo Melo : check proc_net_create return, cleanups | 13 | * Arnaldo Melo : check proc_net_create return, cleanups |
14 | * | 14 | * |
15 | * This program is free software; you can redistribute it and/or | 15 | * This program is free software; you can redistribute it and/or |
16 | * modify it under the terms of the GNU General Public License | 16 | * modify it under the terms of the GNU General Public License |
17 | * as published by the Free Software Foundation; either version | 17 | * as published by the Free Software Foundation; either version |
18 | * 2 of the License, or (at your option) any later version. | 18 | * 2 of the License, or (at your option) any later version. |
19 | */ | 19 | */ |
20 | 20 | ||
21 | #define pr_fmt(fmt) "IPv6: " fmt | 21 | #define pr_fmt(fmt) "IPv6: " fmt |
22 | 22 | ||
23 | #include <linux/module.h> | 23 | #include <linux/module.h> |
24 | #include <linux/capability.h> | 24 | #include <linux/capability.h> |
25 | #include <linux/errno.h> | 25 | #include <linux/errno.h> |
26 | #include <linux/types.h> | 26 | #include <linux/types.h> |
27 | #include <linux/socket.h> | 27 | #include <linux/socket.h> |
28 | #include <linux/in.h> | 28 | #include <linux/in.h> |
29 | #include <linux/kernel.h> | 29 | #include <linux/kernel.h> |
30 | #include <linux/timer.h> | 30 | #include <linux/timer.h> |
31 | #include <linux/string.h> | 31 | #include <linux/string.h> |
32 | #include <linux/sockios.h> | 32 | #include <linux/sockios.h> |
33 | #include <linux/net.h> | 33 | #include <linux/net.h> |
34 | #include <linux/fcntl.h> | 34 | #include <linux/fcntl.h> |
35 | #include <linux/mm.h> | 35 | #include <linux/mm.h> |
36 | #include <linux/interrupt.h> | 36 | #include <linux/interrupt.h> |
37 | #include <linux/proc_fs.h> | 37 | #include <linux/proc_fs.h> |
38 | #include <linux/stat.h> | 38 | #include <linux/stat.h> |
39 | #include <linux/init.h> | 39 | #include <linux/init.h> |
40 | #include <linux/slab.h> | 40 | #include <linux/slab.h> |
41 | 41 | ||
42 | #include <linux/inet.h> | 42 | #include <linux/inet.h> |
43 | #include <linux/netdevice.h> | 43 | #include <linux/netdevice.h> |
44 | #include <linux/icmpv6.h> | 44 | #include <linux/icmpv6.h> |
45 | #include <linux/netfilter_ipv6.h> | 45 | #include <linux/netfilter_ipv6.h> |
46 | 46 | ||
47 | #include <net/ip.h> | 47 | #include <net/ip.h> |
48 | #include <net/ipv6.h> | 48 | #include <net/ipv6.h> |
49 | #include <net/udp.h> | 49 | #include <net/udp.h> |
50 | #include <net/udplite.h> | 50 | #include <net/udplite.h> |
51 | #include <net/tcp.h> | 51 | #include <net/tcp.h> |
52 | #include <net/ipip.h> | 52 | #include <net/ipip.h> |
53 | #include <net/protocol.h> | 53 | #include <net/protocol.h> |
54 | #include <net/inet_common.h> | 54 | #include <net/inet_common.h> |
55 | #include <net/route.h> | 55 | #include <net/route.h> |
56 | #include <net/transp_v6.h> | 56 | #include <net/transp_v6.h> |
57 | #include <net/ip6_route.h> | 57 | #include <net/ip6_route.h> |
58 | #include <net/addrconf.h> | 58 | #include <net/addrconf.h> |
59 | #ifdef CONFIG_IPV6_TUNNEL | 59 | #ifdef CONFIG_IPV6_TUNNEL |
60 | #include <net/ip6_tunnel.h> | 60 | #include <net/ip6_tunnel.h> |
61 | #endif | 61 | #endif |
62 | 62 | ||
63 | #include <asm/uaccess.h> | 63 | #include <asm/uaccess.h> |
64 | #include <linux/mroute6.h> | 64 | #include <linux/mroute6.h> |
65 | 65 | ||
66 | MODULE_AUTHOR("Cast of dozens"); | 66 | MODULE_AUTHOR("Cast of dozens"); |
67 | MODULE_DESCRIPTION("IPv6 protocol stack for Linux"); | 67 | MODULE_DESCRIPTION("IPv6 protocol stack for Linux"); |
68 | MODULE_LICENSE("GPL"); | 68 | MODULE_LICENSE("GPL"); |
69 | 69 | ||
70 | /* The inetsw6 table contains everything that inet6_create needs to | 70 | /* The inetsw6 table contains everything that inet6_create needs to |
71 | * build a new socket. | 71 | * build a new socket. |
72 | */ | 72 | */ |
73 | static struct list_head inetsw6[SOCK_MAX]; | 73 | static struct list_head inetsw6[SOCK_MAX]; |
74 | static DEFINE_SPINLOCK(inetsw6_lock); | 74 | static DEFINE_SPINLOCK(inetsw6_lock); |
75 | 75 | ||
76 | struct ipv6_params ipv6_defaults = { | 76 | struct ipv6_params ipv6_defaults = { |
77 | .disable_ipv6 = 0, | 77 | .disable_ipv6 = 0, |
78 | .autoconf = 1, | 78 | .autoconf = 1, |
79 | }; | 79 | }; |
80 | 80 | ||
81 | static int disable_ipv6_mod; | 81 | static int disable_ipv6_mod; |
82 | 82 | ||
83 | module_param_named(disable, disable_ipv6_mod, int, 0444); | 83 | module_param_named(disable, disable_ipv6_mod, int, 0444); |
84 | MODULE_PARM_DESC(disable, "Disable IPv6 module such that it is non-functional"); | 84 | MODULE_PARM_DESC(disable, "Disable IPv6 module such that it is non-functional"); |
85 | 85 | ||
86 | module_param_named(disable_ipv6, ipv6_defaults.disable_ipv6, int, 0444); | 86 | module_param_named(disable_ipv6, ipv6_defaults.disable_ipv6, int, 0444); |
87 | MODULE_PARM_DESC(disable_ipv6, "Disable IPv6 on all interfaces"); | 87 | MODULE_PARM_DESC(disable_ipv6, "Disable IPv6 on all interfaces"); |
88 | 88 | ||
89 | module_param_named(autoconf, ipv6_defaults.autoconf, int, 0444); | 89 | module_param_named(autoconf, ipv6_defaults.autoconf, int, 0444); |
90 | MODULE_PARM_DESC(autoconf, "Enable IPv6 address autoconfiguration on all interfaces"); | 90 | MODULE_PARM_DESC(autoconf, "Enable IPv6 address autoconfiguration on all interfaces"); |
91 | 91 | ||
92 | static __inline__ struct ipv6_pinfo *inet6_sk_generic(struct sock *sk) | 92 | static __inline__ struct ipv6_pinfo *inet6_sk_generic(struct sock *sk) |
93 | { | 93 | { |
94 | const int offset = sk->sk_prot->obj_size - sizeof(struct ipv6_pinfo); | 94 | const int offset = sk->sk_prot->obj_size - sizeof(struct ipv6_pinfo); |
95 | 95 | ||
96 | return (struct ipv6_pinfo *)(((u8 *)sk) + offset); | 96 | return (struct ipv6_pinfo *)(((u8 *)sk) + offset); |
97 | } | 97 | } |
98 | 98 | ||
99 | static int inet6_create(struct net *net, struct socket *sock, int protocol, | 99 | static int inet6_create(struct net *net, struct socket *sock, int protocol, |
100 | int kern) | 100 | int kern) |
101 | { | 101 | { |
102 | struct inet_sock *inet; | 102 | struct inet_sock *inet; |
103 | struct ipv6_pinfo *np; | 103 | struct ipv6_pinfo *np; |
104 | struct sock *sk; | 104 | struct sock *sk; |
105 | struct inet_protosw *answer; | 105 | struct inet_protosw *answer; |
106 | struct proto *answer_prot; | 106 | struct proto *answer_prot; |
107 | unsigned char answer_flags; | 107 | unsigned char answer_flags; |
108 | char answer_no_check; | 108 | char answer_no_check; |
109 | int try_loading_module = 0; | 109 | int try_loading_module = 0; |
110 | int err; | 110 | int err; |
111 | 111 | ||
112 | if (sock->type != SOCK_RAW && | 112 | if (sock->type != SOCK_RAW && |
113 | sock->type != SOCK_DGRAM && | 113 | sock->type != SOCK_DGRAM && |
114 | !inet_ehash_secret) | 114 | !inet_ehash_secret) |
115 | build_ehash_secret(); | 115 | build_ehash_secret(); |
116 | 116 | ||
117 | /* Look for the requested type/protocol pair. */ | 117 | /* Look for the requested type/protocol pair. */ |
118 | lookup_protocol: | 118 | lookup_protocol: |
119 | err = -ESOCKTNOSUPPORT; | 119 | err = -ESOCKTNOSUPPORT; |
120 | rcu_read_lock(); | 120 | rcu_read_lock(); |
121 | list_for_each_entry_rcu(answer, &inetsw6[sock->type], list) { | 121 | list_for_each_entry_rcu(answer, &inetsw6[sock->type], list) { |
122 | 122 | ||
123 | err = 0; | 123 | err = 0; |
124 | /* Check the non-wild match. */ | 124 | /* Check the non-wild match. */ |
125 | if (protocol == answer->protocol) { | 125 | if (protocol == answer->protocol) { |
126 | if (protocol != IPPROTO_IP) | 126 | if (protocol != IPPROTO_IP) |
127 | break; | 127 | break; |
128 | } else { | 128 | } else { |
129 | /* Check for the two wild cases. */ | 129 | /* Check for the two wild cases. */ |
130 | if (IPPROTO_IP == protocol) { | 130 | if (IPPROTO_IP == protocol) { |
131 | protocol = answer->protocol; | 131 | protocol = answer->protocol; |
132 | break; | 132 | break; |
133 | } | 133 | } |
134 | if (IPPROTO_IP == answer->protocol) | 134 | if (IPPROTO_IP == answer->protocol) |
135 | break; | 135 | break; |
136 | } | 136 | } |
137 | err = -EPROTONOSUPPORT; | 137 | err = -EPROTONOSUPPORT; |
138 | } | 138 | } |
139 | 139 | ||
140 | if (err) { | 140 | if (err) { |
141 | if (try_loading_module < 2) { | 141 | if (try_loading_module < 2) { |
142 | rcu_read_unlock(); | 142 | rcu_read_unlock(); |
143 | /* | 143 | /* |
144 | * Be more specific, e.g. net-pf-10-proto-132-type-1 | 144 | * Be more specific, e.g. net-pf-10-proto-132-type-1 |
145 | * (net-pf-PF_INET6-proto-IPPROTO_SCTP-type-SOCK_STREAM) | 145 | * (net-pf-PF_INET6-proto-IPPROTO_SCTP-type-SOCK_STREAM) |
146 | */ | 146 | */ |
147 | if (++try_loading_module == 1) | 147 | if (++try_loading_module == 1) |
148 | request_module("net-pf-%d-proto-%d-type-%d", | 148 | request_module("net-pf-%d-proto-%d-type-%d", |
149 | PF_INET6, protocol, sock->type); | 149 | PF_INET6, protocol, sock->type); |
150 | /* | 150 | /* |
151 | * Fall back to generic, e.g. net-pf-10-proto-132 | 151 | * Fall back to generic, e.g. net-pf-10-proto-132 |
152 | * (net-pf-PF_INET6-proto-IPPROTO_SCTP) | 152 | * (net-pf-PF_INET6-proto-IPPROTO_SCTP) |
153 | */ | 153 | */ |
154 | else | 154 | else |
155 | request_module("net-pf-%d-proto-%d", | 155 | request_module("net-pf-%d-proto-%d", |
156 | PF_INET6, protocol); | 156 | PF_INET6, protocol); |
157 | goto lookup_protocol; | 157 | goto lookup_protocol; |
158 | } else | 158 | } else |
159 | goto out_rcu_unlock; | 159 | goto out_rcu_unlock; |
160 | } | 160 | } |
161 | 161 | ||
162 | err = -EPERM; | 162 | err = -EPERM; |
163 | if (sock->type == SOCK_RAW && !kern && | 163 | if (sock->type == SOCK_RAW && !kern && |
164 | !ns_capable(net->user_ns, CAP_NET_RAW)) | 164 | !ns_capable(net->user_ns, CAP_NET_RAW)) |
165 | goto out_rcu_unlock; | 165 | goto out_rcu_unlock; |
166 | 166 | ||
167 | sock->ops = answer->ops; | 167 | sock->ops = answer->ops; |
168 | answer_prot = answer->prot; | 168 | answer_prot = answer->prot; |
169 | answer_no_check = answer->no_check; | 169 | answer_no_check = answer->no_check; |
170 | answer_flags = answer->flags; | 170 | answer_flags = answer->flags; |
171 | rcu_read_unlock(); | 171 | rcu_read_unlock(); |
172 | 172 | ||
173 | WARN_ON(answer_prot->slab == NULL); | 173 | WARN_ON(answer_prot->slab == NULL); |
174 | 174 | ||
175 | err = -ENOBUFS; | 175 | err = -ENOBUFS; |
176 | sk = sk_alloc(net, PF_INET6, GFP_KERNEL, answer_prot); | 176 | sk = sk_alloc(net, PF_INET6, GFP_KERNEL, answer_prot); |
177 | if (sk == NULL) | 177 | if (sk == NULL) |
178 | goto out; | 178 | goto out; |
179 | 179 | ||
180 | sock_init_data(sock, sk); | 180 | sock_init_data(sock, sk); |
181 | 181 | ||
182 | err = 0; | 182 | err = 0; |
183 | sk->sk_no_check = answer_no_check; | 183 | sk->sk_no_check = answer_no_check; |
184 | if (INET_PROTOSW_REUSE & answer_flags) | 184 | if (INET_PROTOSW_REUSE & answer_flags) |
185 | sk->sk_reuse = SK_CAN_REUSE; | 185 | sk->sk_reuse = SK_CAN_REUSE; |
186 | 186 | ||
187 | inet = inet_sk(sk); | 187 | inet = inet_sk(sk); |
188 | inet->is_icsk = (INET_PROTOSW_ICSK & answer_flags) != 0; | 188 | inet->is_icsk = (INET_PROTOSW_ICSK & answer_flags) != 0; |
189 | 189 | ||
190 | if (SOCK_RAW == sock->type) { | 190 | if (SOCK_RAW == sock->type) { |
191 | inet->inet_num = protocol; | 191 | inet->inet_num = protocol; |
192 | if (IPPROTO_RAW == protocol) | 192 | if (IPPROTO_RAW == protocol) |
193 | inet->hdrincl = 1; | 193 | inet->hdrincl = 1; |
194 | } | 194 | } |
195 | 195 | ||
196 | sk->sk_destruct = inet_sock_destruct; | 196 | sk->sk_destruct = inet_sock_destruct; |
197 | sk->sk_family = PF_INET6; | 197 | sk->sk_family = PF_INET6; |
198 | sk->sk_protocol = protocol; | 198 | sk->sk_protocol = protocol; |
199 | 199 | ||
200 | sk->sk_backlog_rcv = answer->prot->backlog_rcv; | 200 | sk->sk_backlog_rcv = answer->prot->backlog_rcv; |
201 | 201 | ||
202 | inet_sk(sk)->pinet6 = np = inet6_sk_generic(sk); | 202 | inet_sk(sk)->pinet6 = np = inet6_sk_generic(sk); |
203 | np->hop_limit = -1; | 203 | np->hop_limit = -1; |
204 | np->mcast_hops = IPV6_DEFAULT_MCASTHOPS; | 204 | np->mcast_hops = IPV6_DEFAULT_MCASTHOPS; |
205 | np->mc_loop = 1; | 205 | np->mc_loop = 1; |
206 | np->pmtudisc = IPV6_PMTUDISC_WANT; | 206 | np->pmtudisc = IPV6_PMTUDISC_WANT; |
207 | np->ipv6only = net->ipv6.sysctl.bindv6only; | 207 | np->ipv6only = net->ipv6.sysctl.bindv6only; |
208 | 208 | ||
209 | /* Init the ipv4 part of the socket since we can have sockets | 209 | /* Init the ipv4 part of the socket since we can have sockets |
210 | * using v6 API for ipv4. | 210 | * using v6 API for ipv4. |
211 | */ | 211 | */ |
212 | inet->uc_ttl = -1; | 212 | inet->uc_ttl = -1; |
213 | 213 | ||
214 | inet->mc_loop = 1; | 214 | inet->mc_loop = 1; |
215 | inet->mc_ttl = 1; | 215 | inet->mc_ttl = 1; |
216 | inet->mc_index = 0; | 216 | inet->mc_index = 0; |
217 | inet->mc_list = NULL; | 217 | inet->mc_list = NULL; |
218 | inet->rcv_tos = 0; | 218 | inet->rcv_tos = 0; |
219 | 219 | ||
220 | if (ipv4_config.no_pmtu_disc) | 220 | if (ipv4_config.no_pmtu_disc) |
221 | inet->pmtudisc = IP_PMTUDISC_DONT; | 221 | inet->pmtudisc = IP_PMTUDISC_DONT; |
222 | else | 222 | else |
223 | inet->pmtudisc = IP_PMTUDISC_WANT; | 223 | inet->pmtudisc = IP_PMTUDISC_WANT; |
224 | /* | 224 | /* |
225 | * Increment only the relevant sk_prot->socks debug field, this changes | 225 | * Increment only the relevant sk_prot->socks debug field, this changes |
226 | * the previous behaviour of incrementing both the equivalent to | 226 | * the previous behaviour of incrementing both the equivalent to |
227 | * answer->prot->socks (inet6_sock_nr) and inet_sock_nr. | 227 | * answer->prot->socks (inet6_sock_nr) and inet_sock_nr. |
228 | * | 228 | * |
229 | * This allows better debug granularity as we'll know exactly how many | 229 | * This allows better debug granularity as we'll know exactly how many |
230 | * UDPv6, TCPv6, etc socks were allocated, not the sum of all IPv6 | 230 | * UDPv6, TCPv6, etc socks were allocated, not the sum of all IPv6 |
231 | * transport protocol socks. -acme | 231 | * transport protocol socks. -acme |
232 | */ | 232 | */ |
233 | sk_refcnt_debug_inc(sk); | 233 | sk_refcnt_debug_inc(sk); |
234 | 234 | ||
235 | if (inet->inet_num) { | 235 | if (inet->inet_num) { |
236 | /* It assumes that any protocol which allows | 236 | /* It assumes that any protocol which allows |
237 | * the user to assign a number at socket | 237 | * the user to assign a number at socket |
238 | * creation time automatically shares. | 238 | * creation time automatically shares. |
239 | */ | 239 | */ |
240 | inet->inet_sport = htons(inet->inet_num); | 240 | inet->inet_sport = htons(inet->inet_num); |
241 | sk->sk_prot->hash(sk); | 241 | sk->sk_prot->hash(sk); |
242 | } | 242 | } |
243 | if (sk->sk_prot->init) { | 243 | if (sk->sk_prot->init) { |
244 | err = sk->sk_prot->init(sk); | 244 | err = sk->sk_prot->init(sk); |
245 | if (err) { | 245 | if (err) { |
246 | sk_common_release(sk); | 246 | sk_common_release(sk); |
247 | goto out; | 247 | goto out; |
248 | } | 248 | } |
249 | } | 249 | } |
250 | out: | 250 | out: |
251 | return err; | 251 | return err; |
252 | out_rcu_unlock: | 252 | out_rcu_unlock: |
253 | rcu_read_unlock(); | 253 | rcu_read_unlock(); |
254 | goto out; | 254 | goto out; |
255 | } | 255 | } |
256 | 256 | ||
257 | 257 | ||
258 | /* bind for INET6 API */ | 258 | /* bind for INET6 API */ |
259 | int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | 259 | int inet6_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) |
260 | { | 260 | { |
261 | struct sockaddr_in6 *addr = (struct sockaddr_in6 *)uaddr; | 261 | struct sockaddr_in6 *addr = (struct sockaddr_in6 *)uaddr; |
262 | struct sock *sk = sock->sk; | 262 | struct sock *sk = sock->sk; |
263 | struct inet_sock *inet = inet_sk(sk); | 263 | struct inet_sock *inet = inet_sk(sk); |
264 | struct ipv6_pinfo *np = inet6_sk(sk); | 264 | struct ipv6_pinfo *np = inet6_sk(sk); |
265 | struct net *net = sock_net(sk); | 265 | struct net *net = sock_net(sk); |
266 | __be32 v4addr = 0; | 266 | __be32 v4addr = 0; |
267 | unsigned short snum; | 267 | unsigned short snum; |
268 | int addr_type = 0; | 268 | int addr_type = 0; |
269 | int err = 0; | 269 | int err = 0; |
270 | 270 | ||
271 | /* If the socket has its own bind function then use it. */ | 271 | /* If the socket has its own bind function then use it. */ |
272 | if (sk->sk_prot->bind) | 272 | if (sk->sk_prot->bind) |
273 | return sk->sk_prot->bind(sk, uaddr, addr_len); | 273 | return sk->sk_prot->bind(sk, uaddr, addr_len); |
274 | 274 | ||
275 | if (addr_len < SIN6_LEN_RFC2133) | 275 | if (addr_len < SIN6_LEN_RFC2133) |
276 | return -EINVAL; | 276 | return -EINVAL; |
277 | 277 | ||
278 | if (addr->sin6_family != AF_INET6) | 278 | if (addr->sin6_family != AF_INET6) |
279 | return -EAFNOSUPPORT; | 279 | return -EAFNOSUPPORT; |
280 | 280 | ||
281 | addr_type = ipv6_addr_type(&addr->sin6_addr); | 281 | addr_type = ipv6_addr_type(&addr->sin6_addr); |
282 | if ((addr_type & IPV6_ADDR_MULTICAST) && sock->type == SOCK_STREAM) | 282 | if ((addr_type & IPV6_ADDR_MULTICAST) && sock->type == SOCK_STREAM) |
283 | return -EINVAL; | 283 | return -EINVAL; |
284 | 284 | ||
285 | snum = ntohs(addr->sin6_port); | 285 | snum = ntohs(addr->sin6_port); |
286 | if (snum && snum < PROT_SOCK && !capable(CAP_NET_BIND_SERVICE)) | 286 | if (snum && snum < PROT_SOCK && !ns_capable(net->user_ns, CAP_NET_BIND_SERVICE)) |
287 | return -EACCES; | 287 | return -EACCES; |
288 | 288 | ||
289 | lock_sock(sk); | 289 | lock_sock(sk); |
290 | 290 | ||
291 | /* Check these errors (active socket, double bind). */ | 291 | /* Check these errors (active socket, double bind). */ |
292 | if (sk->sk_state != TCP_CLOSE || inet->inet_num) { | 292 | if (sk->sk_state != TCP_CLOSE || inet->inet_num) { |
293 | err = -EINVAL; | 293 | err = -EINVAL; |
294 | goto out; | 294 | goto out; |
295 | } | 295 | } |
296 | 296 | ||
297 | /* Check if the address belongs to the host. */ | 297 | /* Check if the address belongs to the host. */ |
298 | if (addr_type == IPV6_ADDR_MAPPED) { | 298 | if (addr_type == IPV6_ADDR_MAPPED) { |
299 | int chk_addr_ret; | 299 | int chk_addr_ret; |
300 | 300 | ||
301 | /* Binding to v4-mapped address on a v6-only socket | 301 | /* Binding to v4-mapped address on a v6-only socket |
302 | * makes no sense | 302 | * makes no sense |
303 | */ | 303 | */ |
304 | if (np->ipv6only) { | 304 | if (np->ipv6only) { |
305 | err = -EINVAL; | 305 | err = -EINVAL; |
306 | goto out; | 306 | goto out; |
307 | } | 307 | } |
308 | 308 | ||
309 | /* Reproduce AF_INET checks to make the bindings consistent */ | 309 | /* Reproduce AF_INET checks to make the bindings consistent */ |
310 | v4addr = addr->sin6_addr.s6_addr32[3]; | 310 | v4addr = addr->sin6_addr.s6_addr32[3]; |
311 | chk_addr_ret = inet_addr_type(net, v4addr); | 311 | chk_addr_ret = inet_addr_type(net, v4addr); |
312 | if (!sysctl_ip_nonlocal_bind && | 312 | if (!sysctl_ip_nonlocal_bind && |
313 | !(inet->freebind || inet->transparent) && | 313 | !(inet->freebind || inet->transparent) && |
314 | v4addr != htonl(INADDR_ANY) && | 314 | v4addr != htonl(INADDR_ANY) && |
315 | chk_addr_ret != RTN_LOCAL && | 315 | chk_addr_ret != RTN_LOCAL && |
316 | chk_addr_ret != RTN_MULTICAST && | 316 | chk_addr_ret != RTN_MULTICAST && |
317 | chk_addr_ret != RTN_BROADCAST) { | 317 | chk_addr_ret != RTN_BROADCAST) { |
318 | err = -EADDRNOTAVAIL; | 318 | err = -EADDRNOTAVAIL; |
319 | goto out; | 319 | goto out; |
320 | } | 320 | } |
321 | } else { | 321 | } else { |
322 | if (addr_type != IPV6_ADDR_ANY) { | 322 | if (addr_type != IPV6_ADDR_ANY) { |
323 | struct net_device *dev = NULL; | 323 | struct net_device *dev = NULL; |
324 | 324 | ||
325 | rcu_read_lock(); | 325 | rcu_read_lock(); |
326 | if (addr_type & IPV6_ADDR_LINKLOCAL) { | 326 | if (addr_type & IPV6_ADDR_LINKLOCAL) { |
327 | if (addr_len >= sizeof(struct sockaddr_in6) && | 327 | if (addr_len >= sizeof(struct sockaddr_in6) && |
328 | addr->sin6_scope_id) { | 328 | addr->sin6_scope_id) { |
329 | /* Override any existing binding, if another one | 329 | /* Override any existing binding, if another one |
330 | * is supplied by user. | 330 | * is supplied by user. |
331 | */ | 331 | */ |
332 | sk->sk_bound_dev_if = addr->sin6_scope_id; | 332 | sk->sk_bound_dev_if = addr->sin6_scope_id; |
333 | } | 333 | } |
334 | 334 | ||
335 | /* Binding to link-local address requires an interface */ | 335 | /* Binding to link-local address requires an interface */ |
336 | if (!sk->sk_bound_dev_if) { | 336 | if (!sk->sk_bound_dev_if) { |
337 | err = -EINVAL; | 337 | err = -EINVAL; |
338 | goto out_unlock; | 338 | goto out_unlock; |
339 | } | 339 | } |
340 | dev = dev_get_by_index_rcu(net, sk->sk_bound_dev_if); | 340 | dev = dev_get_by_index_rcu(net, sk->sk_bound_dev_if); |
341 | if (!dev) { | 341 | if (!dev) { |
342 | err = -ENODEV; | 342 | err = -ENODEV; |
343 | goto out_unlock; | 343 | goto out_unlock; |
344 | } | 344 | } |
345 | } | 345 | } |
346 | 346 | ||
347 | /* ipv4 addr of the socket is invalid. Only the | 347 | /* ipv4 addr of the socket is invalid. Only the |
348 | * unspecified and mapped address have a v4 equivalent. | 348 | * unspecified and mapped address have a v4 equivalent. |
349 | */ | 349 | */ |
350 | v4addr = LOOPBACK4_IPV6; | 350 | v4addr = LOOPBACK4_IPV6; |
351 | if (!(addr_type & IPV6_ADDR_MULTICAST)) { | 351 | if (!(addr_type & IPV6_ADDR_MULTICAST)) { |
352 | if (!(inet->freebind || inet->transparent) && | 352 | if (!(inet->freebind || inet->transparent) && |
353 | !ipv6_chk_addr(net, &addr->sin6_addr, | 353 | !ipv6_chk_addr(net, &addr->sin6_addr, |
354 | dev, 0)) { | 354 | dev, 0)) { |
355 | err = -EADDRNOTAVAIL; | 355 | err = -EADDRNOTAVAIL; |
356 | goto out_unlock; | 356 | goto out_unlock; |
357 | } | 357 | } |
358 | } | 358 | } |
359 | rcu_read_unlock(); | 359 | rcu_read_unlock(); |
360 | } | 360 | } |
361 | } | 361 | } |
362 | 362 | ||
363 | inet->inet_rcv_saddr = v4addr; | 363 | inet->inet_rcv_saddr = v4addr; |
364 | inet->inet_saddr = v4addr; | 364 | inet->inet_saddr = v4addr; |
365 | 365 | ||
366 | np->rcv_saddr = addr->sin6_addr; | 366 | np->rcv_saddr = addr->sin6_addr; |
367 | 367 | ||
368 | if (!(addr_type & IPV6_ADDR_MULTICAST)) | 368 | if (!(addr_type & IPV6_ADDR_MULTICAST)) |
369 | np->saddr = addr->sin6_addr; | 369 | np->saddr = addr->sin6_addr; |
370 | 370 | ||
371 | /* Make sure we are allowed to bind here. */ | 371 | /* Make sure we are allowed to bind here. */ |
372 | if (sk->sk_prot->get_port(sk, snum)) { | 372 | if (sk->sk_prot->get_port(sk, snum)) { |
373 | inet_reset_saddr(sk); | 373 | inet_reset_saddr(sk); |
374 | err = -EADDRINUSE; | 374 | err = -EADDRINUSE; |
375 | goto out; | 375 | goto out; |
376 | } | 376 | } |
377 | 377 | ||
378 | if (addr_type != IPV6_ADDR_ANY) { | 378 | if (addr_type != IPV6_ADDR_ANY) { |
379 | sk->sk_userlocks |= SOCK_BINDADDR_LOCK; | 379 | sk->sk_userlocks |= SOCK_BINDADDR_LOCK; |
380 | if (addr_type != IPV6_ADDR_MAPPED) | 380 | if (addr_type != IPV6_ADDR_MAPPED) |
381 | np->ipv6only = 1; | 381 | np->ipv6only = 1; |
382 | } | 382 | } |
383 | if (snum) | 383 | if (snum) |
384 | sk->sk_userlocks |= SOCK_BINDPORT_LOCK; | 384 | sk->sk_userlocks |= SOCK_BINDPORT_LOCK; |
385 | inet->inet_sport = htons(inet->inet_num); | 385 | inet->inet_sport = htons(inet->inet_num); |
386 | inet->inet_dport = 0; | 386 | inet->inet_dport = 0; |
387 | inet->inet_daddr = 0; | 387 | inet->inet_daddr = 0; |
388 | out: | 388 | out: |
389 | release_sock(sk); | 389 | release_sock(sk); |
390 | return err; | 390 | return err; |
391 | out_unlock: | 391 | out_unlock: |
392 | rcu_read_unlock(); | 392 | rcu_read_unlock(); |
393 | goto out; | 393 | goto out; |
394 | } | 394 | } |
395 | EXPORT_SYMBOL(inet6_bind); | 395 | EXPORT_SYMBOL(inet6_bind); |
396 | 396 | ||
397 | int inet6_release(struct socket *sock) | 397 | int inet6_release(struct socket *sock) |
398 | { | 398 | { |
399 | struct sock *sk = sock->sk; | 399 | struct sock *sk = sock->sk; |
400 | 400 | ||
401 | if (sk == NULL) | 401 | if (sk == NULL) |
402 | return -EINVAL; | 402 | return -EINVAL; |
403 | 403 | ||
404 | /* Free mc lists */ | 404 | /* Free mc lists */ |
405 | ipv6_sock_mc_close(sk); | 405 | ipv6_sock_mc_close(sk); |
406 | 406 | ||
407 | /* Free ac lists */ | 407 | /* Free ac lists */ |
408 | ipv6_sock_ac_close(sk); | 408 | ipv6_sock_ac_close(sk); |
409 | 409 | ||
410 | return inet_release(sock); | 410 | return inet_release(sock); |
411 | } | 411 | } |
412 | EXPORT_SYMBOL(inet6_release); | 412 | EXPORT_SYMBOL(inet6_release); |
413 | 413 | ||
414 | void inet6_destroy_sock(struct sock *sk) | 414 | void inet6_destroy_sock(struct sock *sk) |
415 | { | 415 | { |
416 | struct ipv6_pinfo *np = inet6_sk(sk); | 416 | struct ipv6_pinfo *np = inet6_sk(sk); |
417 | struct sk_buff *skb; | 417 | struct sk_buff *skb; |
418 | struct ipv6_txoptions *opt; | 418 | struct ipv6_txoptions *opt; |
419 | 419 | ||
420 | /* Release rx options */ | 420 | /* Release rx options */ |
421 | 421 | ||
422 | skb = xchg(&np->pktoptions, NULL); | 422 | skb = xchg(&np->pktoptions, NULL); |
423 | if (skb != NULL) | 423 | if (skb != NULL) |
424 | kfree_skb(skb); | 424 | kfree_skb(skb); |
425 | 425 | ||
426 | skb = xchg(&np->rxpmtu, NULL); | 426 | skb = xchg(&np->rxpmtu, NULL); |
427 | if (skb != NULL) | 427 | if (skb != NULL) |
428 | kfree_skb(skb); | 428 | kfree_skb(skb); |
429 | 429 | ||
430 | /* Free flowlabels */ | 430 | /* Free flowlabels */ |
431 | fl6_free_socklist(sk); | 431 | fl6_free_socklist(sk); |
432 | 432 | ||
433 | /* Free tx options */ | 433 | /* Free tx options */ |
434 | 434 | ||
435 | opt = xchg(&np->opt, NULL); | 435 | opt = xchg(&np->opt, NULL); |
436 | if (opt != NULL) | 436 | if (opt != NULL) |
437 | sock_kfree_s(sk, opt, opt->tot_len); | 437 | sock_kfree_s(sk, opt, opt->tot_len); |
438 | } | 438 | } |
439 | EXPORT_SYMBOL_GPL(inet6_destroy_sock); | 439 | EXPORT_SYMBOL_GPL(inet6_destroy_sock); |
440 | 440 | ||
441 | /* | 441 | /* |
442 | * This does both peername and sockname. | 442 | * This does both peername and sockname. |
443 | */ | 443 | */ |
444 | 444 | ||
445 | int inet6_getname(struct socket *sock, struct sockaddr *uaddr, | 445 | int inet6_getname(struct socket *sock, struct sockaddr *uaddr, |
446 | int *uaddr_len, int peer) | 446 | int *uaddr_len, int peer) |
447 | { | 447 | { |
448 | struct sockaddr_in6 *sin = (struct sockaddr_in6 *)uaddr; | 448 | struct sockaddr_in6 *sin = (struct sockaddr_in6 *)uaddr; |
449 | struct sock *sk = sock->sk; | 449 | struct sock *sk = sock->sk; |
450 | struct inet_sock *inet = inet_sk(sk); | 450 | struct inet_sock *inet = inet_sk(sk); |
451 | struct ipv6_pinfo *np = inet6_sk(sk); | 451 | struct ipv6_pinfo *np = inet6_sk(sk); |
452 | 452 | ||
453 | sin->sin6_family = AF_INET6; | 453 | sin->sin6_family = AF_INET6; |
454 | sin->sin6_flowinfo = 0; | 454 | sin->sin6_flowinfo = 0; |
455 | sin->sin6_scope_id = 0; | 455 | sin->sin6_scope_id = 0; |
456 | if (peer) { | 456 | if (peer) { |
457 | if (!inet->inet_dport) | 457 | if (!inet->inet_dport) |
458 | return -ENOTCONN; | 458 | return -ENOTCONN; |
459 | if (((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_SYN_SENT)) && | 459 | if (((1 << sk->sk_state) & (TCPF_CLOSE | TCPF_SYN_SENT)) && |
460 | peer == 1) | 460 | peer == 1) |
461 | return -ENOTCONN; | 461 | return -ENOTCONN; |
462 | sin->sin6_port = inet->inet_dport; | 462 | sin->sin6_port = inet->inet_dport; |
463 | sin->sin6_addr = np->daddr; | 463 | sin->sin6_addr = np->daddr; |
464 | if (np->sndflow) | 464 | if (np->sndflow) |
465 | sin->sin6_flowinfo = np->flow_label; | 465 | sin->sin6_flowinfo = np->flow_label; |
466 | } else { | 466 | } else { |
467 | if (ipv6_addr_any(&np->rcv_saddr)) | 467 | if (ipv6_addr_any(&np->rcv_saddr)) |
468 | sin->sin6_addr = np->saddr; | 468 | sin->sin6_addr = np->saddr; |
469 | else | 469 | else |
470 | sin->sin6_addr = np->rcv_saddr; | 470 | sin->sin6_addr = np->rcv_saddr; |
471 | 471 | ||
472 | sin->sin6_port = inet->inet_sport; | 472 | sin->sin6_port = inet->inet_sport; |
473 | } | 473 | } |
474 | if (ipv6_addr_type(&sin->sin6_addr) & IPV6_ADDR_LINKLOCAL) | 474 | if (ipv6_addr_type(&sin->sin6_addr) & IPV6_ADDR_LINKLOCAL) |
475 | sin->sin6_scope_id = sk->sk_bound_dev_if; | 475 | sin->sin6_scope_id = sk->sk_bound_dev_if; |
476 | *uaddr_len = sizeof(*sin); | 476 | *uaddr_len = sizeof(*sin); |
477 | return 0; | 477 | return 0; |
478 | } | 478 | } |
479 | EXPORT_SYMBOL(inet6_getname); | 479 | EXPORT_SYMBOL(inet6_getname); |
480 | 480 | ||
481 | int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) | 481 | int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) |
482 | { | 482 | { |
483 | struct sock *sk = sock->sk; | 483 | struct sock *sk = sock->sk; |
484 | struct net *net = sock_net(sk); | 484 | struct net *net = sock_net(sk); |
485 | 485 | ||
486 | switch (cmd) { | 486 | switch (cmd) { |
487 | case SIOCGSTAMP: | 487 | case SIOCGSTAMP: |
488 | return sock_get_timestamp(sk, (struct timeval __user *)arg); | 488 | return sock_get_timestamp(sk, (struct timeval __user *)arg); |
489 | 489 | ||
490 | case SIOCGSTAMPNS: | 490 | case SIOCGSTAMPNS: |
491 | return sock_get_timestampns(sk, (struct timespec __user *)arg); | 491 | return sock_get_timestampns(sk, (struct timespec __user *)arg); |
492 | 492 | ||
493 | case SIOCADDRT: | 493 | case SIOCADDRT: |
494 | case SIOCDELRT: | 494 | case SIOCDELRT: |
495 | 495 | ||
496 | return ipv6_route_ioctl(net, cmd, (void __user *)arg); | 496 | return ipv6_route_ioctl(net, cmd, (void __user *)arg); |
497 | 497 | ||
498 | case SIOCSIFADDR: | 498 | case SIOCSIFADDR: |
499 | return addrconf_add_ifaddr(net, (void __user *) arg); | 499 | return addrconf_add_ifaddr(net, (void __user *) arg); |
500 | case SIOCDIFADDR: | 500 | case SIOCDIFADDR: |
501 | return addrconf_del_ifaddr(net, (void __user *) arg); | 501 | return addrconf_del_ifaddr(net, (void __user *) arg); |
502 | case SIOCSIFDSTADDR: | 502 | case SIOCSIFDSTADDR: |
503 | return addrconf_set_dstaddr(net, (void __user *) arg); | 503 | return addrconf_set_dstaddr(net, (void __user *) arg); |
504 | default: | 504 | default: |
505 | if (!sk->sk_prot->ioctl) | 505 | if (!sk->sk_prot->ioctl) |
506 | return -ENOIOCTLCMD; | 506 | return -ENOIOCTLCMD; |
507 | return sk->sk_prot->ioctl(sk, cmd, arg); | 507 | return sk->sk_prot->ioctl(sk, cmd, arg); |
508 | } | 508 | } |
509 | /*NOTREACHED*/ | 509 | /*NOTREACHED*/ |
510 | return 0; | 510 | return 0; |
511 | } | 511 | } |
512 | EXPORT_SYMBOL(inet6_ioctl); | 512 | EXPORT_SYMBOL(inet6_ioctl); |
513 | 513 | ||
514 | const struct proto_ops inet6_stream_ops = { | 514 | const struct proto_ops inet6_stream_ops = { |
515 | .family = PF_INET6, | 515 | .family = PF_INET6, |
516 | .owner = THIS_MODULE, | 516 | .owner = THIS_MODULE, |
517 | .release = inet6_release, | 517 | .release = inet6_release, |
518 | .bind = inet6_bind, | 518 | .bind = inet6_bind, |
519 | .connect = inet_stream_connect, /* ok */ | 519 | .connect = inet_stream_connect, /* ok */ |
520 | .socketpair = sock_no_socketpair, /* a do nothing */ | 520 | .socketpair = sock_no_socketpair, /* a do nothing */ |
521 | .accept = inet_accept, /* ok */ | 521 | .accept = inet_accept, /* ok */ |
522 | .getname = inet6_getname, | 522 | .getname = inet6_getname, |
523 | .poll = tcp_poll, /* ok */ | 523 | .poll = tcp_poll, /* ok */ |
524 | .ioctl = inet6_ioctl, /* must change */ | 524 | .ioctl = inet6_ioctl, /* must change */ |
525 | .listen = inet_listen, /* ok */ | 525 | .listen = inet_listen, /* ok */ |
526 | .shutdown = inet_shutdown, /* ok */ | 526 | .shutdown = inet_shutdown, /* ok */ |
527 | .setsockopt = sock_common_setsockopt, /* ok */ | 527 | .setsockopt = sock_common_setsockopt, /* ok */ |
528 | .getsockopt = sock_common_getsockopt, /* ok */ | 528 | .getsockopt = sock_common_getsockopt, /* ok */ |
529 | .sendmsg = inet_sendmsg, /* ok */ | 529 | .sendmsg = inet_sendmsg, /* ok */ |
530 | .recvmsg = inet_recvmsg, /* ok */ | 530 | .recvmsg = inet_recvmsg, /* ok */ |
531 | .mmap = sock_no_mmap, | 531 | .mmap = sock_no_mmap, |
532 | .sendpage = inet_sendpage, | 532 | .sendpage = inet_sendpage, |
533 | .splice_read = tcp_splice_read, | 533 | .splice_read = tcp_splice_read, |
534 | #ifdef CONFIG_COMPAT | 534 | #ifdef CONFIG_COMPAT |
535 | .compat_setsockopt = compat_sock_common_setsockopt, | 535 | .compat_setsockopt = compat_sock_common_setsockopt, |
536 | .compat_getsockopt = compat_sock_common_getsockopt, | 536 | .compat_getsockopt = compat_sock_common_getsockopt, |
537 | #endif | 537 | #endif |
538 | }; | 538 | }; |
539 | 539 | ||
540 | const struct proto_ops inet6_dgram_ops = { | 540 | const struct proto_ops inet6_dgram_ops = { |
541 | .family = PF_INET6, | 541 | .family = PF_INET6, |
542 | .owner = THIS_MODULE, | 542 | .owner = THIS_MODULE, |
543 | .release = inet6_release, | 543 | .release = inet6_release, |
544 | .bind = inet6_bind, | 544 | .bind = inet6_bind, |
545 | .connect = inet_dgram_connect, /* ok */ | 545 | .connect = inet_dgram_connect, /* ok */ |
546 | .socketpair = sock_no_socketpair, /* a do nothing */ | 546 | .socketpair = sock_no_socketpair, /* a do nothing */ |
547 | .accept = sock_no_accept, /* a do nothing */ | 547 | .accept = sock_no_accept, /* a do nothing */ |
548 | .getname = inet6_getname, | 548 | .getname = inet6_getname, |
549 | .poll = udp_poll, /* ok */ | 549 | .poll = udp_poll, /* ok */ |
550 | .ioctl = inet6_ioctl, /* must change */ | 550 | .ioctl = inet6_ioctl, /* must change */ |
551 | .listen = sock_no_listen, /* ok */ | 551 | .listen = sock_no_listen, /* ok */ |
552 | .shutdown = inet_shutdown, /* ok */ | 552 | .shutdown = inet_shutdown, /* ok */ |
553 | .setsockopt = sock_common_setsockopt, /* ok */ | 553 | .setsockopt = sock_common_setsockopt, /* ok */ |
554 | .getsockopt = sock_common_getsockopt, /* ok */ | 554 | .getsockopt = sock_common_getsockopt, /* ok */ |
555 | .sendmsg = inet_sendmsg, /* ok */ | 555 | .sendmsg = inet_sendmsg, /* ok */ |
556 | .recvmsg = inet_recvmsg, /* ok */ | 556 | .recvmsg = inet_recvmsg, /* ok */ |
557 | .mmap = sock_no_mmap, | 557 | .mmap = sock_no_mmap, |
558 | .sendpage = sock_no_sendpage, | 558 | .sendpage = sock_no_sendpage, |
559 | #ifdef CONFIG_COMPAT | 559 | #ifdef CONFIG_COMPAT |
560 | .compat_setsockopt = compat_sock_common_setsockopt, | 560 | .compat_setsockopt = compat_sock_common_setsockopt, |
561 | .compat_getsockopt = compat_sock_common_getsockopt, | 561 | .compat_getsockopt = compat_sock_common_getsockopt, |
562 | #endif | 562 | #endif |
563 | }; | 563 | }; |
564 | 564 | ||
565 | static const struct net_proto_family inet6_family_ops = { | 565 | static const struct net_proto_family inet6_family_ops = { |
566 | .family = PF_INET6, | 566 | .family = PF_INET6, |
567 | .create = inet6_create, | 567 | .create = inet6_create, |
568 | .owner = THIS_MODULE, | 568 | .owner = THIS_MODULE, |
569 | }; | 569 | }; |
570 | 570 | ||
571 | int inet6_register_protosw(struct inet_protosw *p) | 571 | int inet6_register_protosw(struct inet_protosw *p) |
572 | { | 572 | { |
573 | struct list_head *lh; | 573 | struct list_head *lh; |
574 | struct inet_protosw *answer; | 574 | struct inet_protosw *answer; |
575 | struct list_head *last_perm; | 575 | struct list_head *last_perm; |
576 | int protocol = p->protocol; | 576 | int protocol = p->protocol; |
577 | int ret; | 577 | int ret; |
578 | 578 | ||
579 | spin_lock_bh(&inetsw6_lock); | 579 | spin_lock_bh(&inetsw6_lock); |
580 | 580 | ||
581 | ret = -EINVAL; | 581 | ret = -EINVAL; |
582 | if (p->type >= SOCK_MAX) | 582 | if (p->type >= SOCK_MAX) |
583 | goto out_illegal; | 583 | goto out_illegal; |
584 | 584 | ||
585 | /* If we are trying to override a permanent protocol, bail. */ | 585 | /* If we are trying to override a permanent protocol, bail. */ |
586 | answer = NULL; | 586 | answer = NULL; |
587 | ret = -EPERM; | 587 | ret = -EPERM; |
588 | last_perm = &inetsw6[p->type]; | 588 | last_perm = &inetsw6[p->type]; |
589 | list_for_each(lh, &inetsw6[p->type]) { | 589 | list_for_each(lh, &inetsw6[p->type]) { |
590 | answer = list_entry(lh, struct inet_protosw, list); | 590 | answer = list_entry(lh, struct inet_protosw, list); |
591 | 591 | ||
592 | /* Check only the non-wild match. */ | 592 | /* Check only the non-wild match. */ |
593 | if (INET_PROTOSW_PERMANENT & answer->flags) { | 593 | if (INET_PROTOSW_PERMANENT & answer->flags) { |
594 | if (protocol == answer->protocol) | 594 | if (protocol == answer->protocol) |
595 | break; | 595 | break; |
596 | last_perm = lh; | 596 | last_perm = lh; |
597 | } | 597 | } |
598 | 598 | ||
599 | answer = NULL; | 599 | answer = NULL; |
600 | } | 600 | } |
601 | if (answer) | 601 | if (answer) |
602 | goto out_permanent; | 602 | goto out_permanent; |
603 | 603 | ||
604 | /* Add the new entry after the last permanent entry if any, so that | 604 | /* Add the new entry after the last permanent entry if any, so that |
605 | * the new entry does not override a permanent entry when matched with | 605 | * the new entry does not override a permanent entry when matched with |
606 | * a wild-card protocol. But it is allowed to override any existing | 606 | * a wild-card protocol. But it is allowed to override any existing |
607 | * non-permanent entry. This means that when we remove this entry, the | 607 | * non-permanent entry. This means that when we remove this entry, the |
608 | * system automatically returns to the old behavior. | 608 | * system automatically returns to the old behavior. |
609 | */ | 609 | */ |
610 | list_add_rcu(&p->list, last_perm); | 610 | list_add_rcu(&p->list, last_perm); |
611 | ret = 0; | 611 | ret = 0; |
612 | out: | 612 | out: |
613 | spin_unlock_bh(&inetsw6_lock); | 613 | spin_unlock_bh(&inetsw6_lock); |
614 | return ret; | 614 | return ret; |
615 | 615 | ||
616 | out_permanent: | 616 | out_permanent: |
617 | pr_err("Attempt to override permanent protocol %d\n", protocol); | 617 | pr_err("Attempt to override permanent protocol %d\n", protocol); |
618 | goto out; | 618 | goto out; |
619 | 619 | ||
620 | out_illegal: | 620 | out_illegal: |
621 | pr_err("Ignoring attempt to register invalid socket type %d\n", | 621 | pr_err("Ignoring attempt to register invalid socket type %d\n", |
622 | p->type); | 622 | p->type); |
623 | goto out; | 623 | goto out; |
624 | } | 624 | } |
625 | EXPORT_SYMBOL(inet6_register_protosw); | 625 | EXPORT_SYMBOL(inet6_register_protosw); |
626 | 626 | ||
627 | void | 627 | void |
628 | inet6_unregister_protosw(struct inet_protosw *p) | 628 | inet6_unregister_protosw(struct inet_protosw *p) |
629 | { | 629 | { |
630 | if (INET_PROTOSW_PERMANENT & p->flags) { | 630 | if (INET_PROTOSW_PERMANENT & p->flags) { |
631 | pr_err("Attempt to unregister permanent protocol %d\n", | 631 | pr_err("Attempt to unregister permanent protocol %d\n", |
632 | p->protocol); | 632 | p->protocol); |
633 | } else { | 633 | } else { |
634 | spin_lock_bh(&inetsw6_lock); | 634 | spin_lock_bh(&inetsw6_lock); |
635 | list_del_rcu(&p->list); | 635 | list_del_rcu(&p->list); |
636 | spin_unlock_bh(&inetsw6_lock); | 636 | spin_unlock_bh(&inetsw6_lock); |
637 | 637 | ||
638 | synchronize_net(); | 638 | synchronize_net(); |
639 | } | 639 | } |
640 | } | 640 | } |
641 | EXPORT_SYMBOL(inet6_unregister_protosw); | 641 | EXPORT_SYMBOL(inet6_unregister_protosw); |
642 | 642 | ||
643 | int inet6_sk_rebuild_header(struct sock *sk) | 643 | int inet6_sk_rebuild_header(struct sock *sk) |
644 | { | 644 | { |
645 | struct ipv6_pinfo *np = inet6_sk(sk); | 645 | struct ipv6_pinfo *np = inet6_sk(sk); |
646 | struct dst_entry *dst; | 646 | struct dst_entry *dst; |
647 | 647 | ||
648 | dst = __sk_dst_check(sk, np->dst_cookie); | 648 | dst = __sk_dst_check(sk, np->dst_cookie); |
649 | 649 | ||
650 | if (dst == NULL) { | 650 | if (dst == NULL) { |
651 | struct inet_sock *inet = inet_sk(sk); | 651 | struct inet_sock *inet = inet_sk(sk); |
652 | struct in6_addr *final_p, final; | 652 | struct in6_addr *final_p, final; |
653 | struct flowi6 fl6; | 653 | struct flowi6 fl6; |
654 | 654 | ||
655 | memset(&fl6, 0, sizeof(fl6)); | 655 | memset(&fl6, 0, sizeof(fl6)); |
656 | fl6.flowi6_proto = sk->sk_protocol; | 656 | fl6.flowi6_proto = sk->sk_protocol; |
657 | fl6.daddr = np->daddr; | 657 | fl6.daddr = np->daddr; |
658 | fl6.saddr = np->saddr; | 658 | fl6.saddr = np->saddr; |
659 | fl6.flowlabel = np->flow_label; | 659 | fl6.flowlabel = np->flow_label; |
660 | fl6.flowi6_oif = sk->sk_bound_dev_if; | 660 | fl6.flowi6_oif = sk->sk_bound_dev_if; |
661 | fl6.flowi6_mark = sk->sk_mark; | 661 | fl6.flowi6_mark = sk->sk_mark; |
662 | fl6.fl6_dport = inet->inet_dport; | 662 | fl6.fl6_dport = inet->inet_dport; |
663 | fl6.fl6_sport = inet->inet_sport; | 663 | fl6.fl6_sport = inet->inet_sport; |
664 | security_sk_classify_flow(sk, flowi6_to_flowi(&fl6)); | 664 | security_sk_classify_flow(sk, flowi6_to_flowi(&fl6)); |
665 | 665 | ||
666 | final_p = fl6_update_dst(&fl6, np->opt, &final); | 666 | final_p = fl6_update_dst(&fl6, np->opt, &final); |
667 | 667 | ||
668 | dst = ip6_dst_lookup_flow(sk, &fl6, final_p, false); | 668 | dst = ip6_dst_lookup_flow(sk, &fl6, final_p, false); |
669 | if (IS_ERR(dst)) { | 669 | if (IS_ERR(dst)) { |
670 | sk->sk_route_caps = 0; | 670 | sk->sk_route_caps = 0; |
671 | sk->sk_err_soft = -PTR_ERR(dst); | 671 | sk->sk_err_soft = -PTR_ERR(dst); |
672 | return PTR_ERR(dst); | 672 | return PTR_ERR(dst); |
673 | } | 673 | } |
674 | 674 | ||
675 | __ip6_dst_store(sk, dst, NULL, NULL); | 675 | __ip6_dst_store(sk, dst, NULL, NULL); |
676 | } | 676 | } |
677 | 677 | ||
678 | return 0; | 678 | return 0; |
679 | } | 679 | } |
680 | EXPORT_SYMBOL_GPL(inet6_sk_rebuild_header); | 680 | EXPORT_SYMBOL_GPL(inet6_sk_rebuild_header); |
681 | 681 | ||
682 | bool ipv6_opt_accepted(const struct sock *sk, const struct sk_buff *skb) | 682 | bool ipv6_opt_accepted(const struct sock *sk, const struct sk_buff *skb) |
683 | { | 683 | { |
684 | const struct ipv6_pinfo *np = inet6_sk(sk); | 684 | const struct ipv6_pinfo *np = inet6_sk(sk); |
685 | const struct inet6_skb_parm *opt = IP6CB(skb); | 685 | const struct inet6_skb_parm *opt = IP6CB(skb); |
686 | 686 | ||
687 | if (np->rxopt.all) { | 687 | if (np->rxopt.all) { |
688 | if ((opt->hop && (np->rxopt.bits.hopopts || | 688 | if ((opt->hop && (np->rxopt.bits.hopopts || |
689 | np->rxopt.bits.ohopopts)) || | 689 | np->rxopt.bits.ohopopts)) || |
690 | ((IPV6_FLOWINFO_MASK & | 690 | ((IPV6_FLOWINFO_MASK & |
691 | *(__be32 *)skb_network_header(skb)) && | 691 | *(__be32 *)skb_network_header(skb)) && |
692 | np->rxopt.bits.rxflow) || | 692 | np->rxopt.bits.rxflow) || |
693 | (opt->srcrt && (np->rxopt.bits.srcrt || | 693 | (opt->srcrt && (np->rxopt.bits.srcrt || |
694 | np->rxopt.bits.osrcrt)) || | 694 | np->rxopt.bits.osrcrt)) || |
695 | ((opt->dst1 || opt->dst0) && | 695 | ((opt->dst1 || opt->dst0) && |
696 | (np->rxopt.bits.dstopts || np->rxopt.bits.odstopts))) | 696 | (np->rxopt.bits.dstopts || np->rxopt.bits.odstopts))) |
697 | return true; | 697 | return true; |
698 | } | 698 | } |
699 | return false; | 699 | return false; |
700 | } | 700 | } |
701 | EXPORT_SYMBOL_GPL(ipv6_opt_accepted); | 701 | EXPORT_SYMBOL_GPL(ipv6_opt_accepted); |
702 | 702 | ||
703 | static struct packet_type ipv6_packet_type __read_mostly = { | 703 | static struct packet_type ipv6_packet_type __read_mostly = { |
704 | .type = cpu_to_be16(ETH_P_IPV6), | 704 | .type = cpu_to_be16(ETH_P_IPV6), |
705 | .func = ipv6_rcv, | 705 | .func = ipv6_rcv, |
706 | }; | 706 | }; |
707 | 707 | ||
708 | static int __init ipv6_packet_init(void) | 708 | static int __init ipv6_packet_init(void) |
709 | { | 709 | { |
710 | dev_add_pack(&ipv6_packet_type); | 710 | dev_add_pack(&ipv6_packet_type); |
711 | return 0; | 711 | return 0; |
712 | } | 712 | } |
713 | 713 | ||
714 | static void ipv6_packet_cleanup(void) | 714 | static void ipv6_packet_cleanup(void) |
715 | { | 715 | { |
716 | dev_remove_pack(&ipv6_packet_type); | 716 | dev_remove_pack(&ipv6_packet_type); |
717 | } | 717 | } |
718 | 718 | ||
719 | static int __net_init ipv6_init_mibs(struct net *net) | 719 | static int __net_init ipv6_init_mibs(struct net *net) |
720 | { | 720 | { |
721 | if (snmp_mib_init((void __percpu **)net->mib.udp_stats_in6, | 721 | if (snmp_mib_init((void __percpu **)net->mib.udp_stats_in6, |
722 | sizeof(struct udp_mib), | 722 | sizeof(struct udp_mib), |
723 | __alignof__(struct udp_mib)) < 0) | 723 | __alignof__(struct udp_mib)) < 0) |
724 | return -ENOMEM; | 724 | return -ENOMEM; |
725 | if (snmp_mib_init((void __percpu **)net->mib.udplite_stats_in6, | 725 | if (snmp_mib_init((void __percpu **)net->mib.udplite_stats_in6, |
726 | sizeof(struct udp_mib), | 726 | sizeof(struct udp_mib), |
727 | __alignof__(struct udp_mib)) < 0) | 727 | __alignof__(struct udp_mib)) < 0) |
728 | goto err_udplite_mib; | 728 | goto err_udplite_mib; |
729 | if (snmp_mib_init((void __percpu **)net->mib.ipv6_statistics, | 729 | if (snmp_mib_init((void __percpu **)net->mib.ipv6_statistics, |
730 | sizeof(struct ipstats_mib), | 730 | sizeof(struct ipstats_mib), |
731 | __alignof__(struct ipstats_mib)) < 0) | 731 | __alignof__(struct ipstats_mib)) < 0) |
732 | goto err_ip_mib; | 732 | goto err_ip_mib; |
733 | if (snmp_mib_init((void __percpu **)net->mib.icmpv6_statistics, | 733 | if (snmp_mib_init((void __percpu **)net->mib.icmpv6_statistics, |
734 | sizeof(struct icmpv6_mib), | 734 | sizeof(struct icmpv6_mib), |
735 | __alignof__(struct icmpv6_mib)) < 0) | 735 | __alignof__(struct icmpv6_mib)) < 0) |
736 | goto err_icmp_mib; | 736 | goto err_icmp_mib; |
737 | net->mib.icmpv6msg_statistics = kzalloc(sizeof(struct icmpv6msg_mib), | 737 | net->mib.icmpv6msg_statistics = kzalloc(sizeof(struct icmpv6msg_mib), |
738 | GFP_KERNEL); | 738 | GFP_KERNEL); |
739 | if (!net->mib.icmpv6msg_statistics) | 739 | if (!net->mib.icmpv6msg_statistics) |
740 | goto err_icmpmsg_mib; | 740 | goto err_icmpmsg_mib; |
741 | return 0; | 741 | return 0; |
742 | 742 | ||
743 | err_icmpmsg_mib: | 743 | err_icmpmsg_mib: |
744 | snmp_mib_free((void __percpu **)net->mib.icmpv6_statistics); | 744 | snmp_mib_free((void __percpu **)net->mib.icmpv6_statistics); |
745 | err_icmp_mib: | 745 | err_icmp_mib: |
746 | snmp_mib_free((void __percpu **)net->mib.ipv6_statistics); | 746 | snmp_mib_free((void __percpu **)net->mib.ipv6_statistics); |
747 | err_ip_mib: | 747 | err_ip_mib: |
748 | snmp_mib_free((void __percpu **)net->mib.udplite_stats_in6); | 748 | snmp_mib_free((void __percpu **)net->mib.udplite_stats_in6); |
749 | err_udplite_mib: | 749 | err_udplite_mib: |
750 | snmp_mib_free((void __percpu **)net->mib.udp_stats_in6); | 750 | snmp_mib_free((void __percpu **)net->mib.udp_stats_in6); |
751 | return -ENOMEM; | 751 | return -ENOMEM; |
752 | } | 752 | } |
753 | 753 | ||
754 | static void ipv6_cleanup_mibs(struct net *net) | 754 | static void ipv6_cleanup_mibs(struct net *net) |
755 | { | 755 | { |
756 | snmp_mib_free((void __percpu **)net->mib.udp_stats_in6); | 756 | snmp_mib_free((void __percpu **)net->mib.udp_stats_in6); |
757 | snmp_mib_free((void __percpu **)net->mib.udplite_stats_in6); | 757 | snmp_mib_free((void __percpu **)net->mib.udplite_stats_in6); |
758 | snmp_mib_free((void __percpu **)net->mib.ipv6_statistics); | 758 | snmp_mib_free((void __percpu **)net->mib.ipv6_statistics); |
759 | snmp_mib_free((void __percpu **)net->mib.icmpv6_statistics); | 759 | snmp_mib_free((void __percpu **)net->mib.icmpv6_statistics); |
760 | kfree(net->mib.icmpv6msg_statistics); | 760 | kfree(net->mib.icmpv6msg_statistics); |
761 | } | 761 | } |
762 | 762 | ||
763 | static int __net_init inet6_net_init(struct net *net) | 763 | static int __net_init inet6_net_init(struct net *net) |
764 | { | 764 | { |
765 | int err = 0; | 765 | int err = 0; |
766 | 766 | ||
767 | net->ipv6.sysctl.bindv6only = 0; | 767 | net->ipv6.sysctl.bindv6only = 0; |
768 | net->ipv6.sysctl.icmpv6_time = 1*HZ; | 768 | net->ipv6.sysctl.icmpv6_time = 1*HZ; |
769 | 769 | ||
770 | err = ipv6_init_mibs(net); | 770 | err = ipv6_init_mibs(net); |
771 | if (err) | 771 | if (err) |
772 | return err; | 772 | return err; |
773 | #ifdef CONFIG_PROC_FS | 773 | #ifdef CONFIG_PROC_FS |
774 | err = udp6_proc_init(net); | 774 | err = udp6_proc_init(net); |
775 | if (err) | 775 | if (err) |
776 | goto out; | 776 | goto out; |
777 | err = tcp6_proc_init(net); | 777 | err = tcp6_proc_init(net); |
778 | if (err) | 778 | if (err) |
779 | goto proc_tcp6_fail; | 779 | goto proc_tcp6_fail; |
780 | err = ac6_proc_init(net); | 780 | err = ac6_proc_init(net); |
781 | if (err) | 781 | if (err) |
782 | goto proc_ac6_fail; | 782 | goto proc_ac6_fail; |
783 | #endif | 783 | #endif |
784 | return err; | 784 | return err; |
785 | 785 | ||
786 | #ifdef CONFIG_PROC_FS | 786 | #ifdef CONFIG_PROC_FS |
787 | proc_ac6_fail: | 787 | proc_ac6_fail: |
788 | tcp6_proc_exit(net); | 788 | tcp6_proc_exit(net); |
789 | proc_tcp6_fail: | 789 | proc_tcp6_fail: |
790 | udp6_proc_exit(net); | 790 | udp6_proc_exit(net); |
791 | out: | 791 | out: |
792 | ipv6_cleanup_mibs(net); | 792 | ipv6_cleanup_mibs(net); |
793 | return err; | 793 | return err; |
794 | #endif | 794 | #endif |
795 | } | 795 | } |
796 | 796 | ||
797 | static void __net_exit inet6_net_exit(struct net *net) | 797 | static void __net_exit inet6_net_exit(struct net *net) |
798 | { | 798 | { |
799 | #ifdef CONFIG_PROC_FS | 799 | #ifdef CONFIG_PROC_FS |
800 | udp6_proc_exit(net); | 800 | udp6_proc_exit(net); |
801 | tcp6_proc_exit(net); | 801 | tcp6_proc_exit(net); |
802 | ac6_proc_exit(net); | 802 | ac6_proc_exit(net); |
803 | #endif | 803 | #endif |
804 | ipv6_cleanup_mibs(net); | 804 | ipv6_cleanup_mibs(net); |
805 | } | 805 | } |
806 | 806 | ||
807 | static struct pernet_operations inet6_net_ops = { | 807 | static struct pernet_operations inet6_net_ops = { |
808 | .init = inet6_net_init, | 808 | .init = inet6_net_init, |
809 | .exit = inet6_net_exit, | 809 | .exit = inet6_net_exit, |
810 | }; | 810 | }; |
811 | 811 | ||
812 | static int __init inet6_init(void) | 812 | static int __init inet6_init(void) |
813 | { | 813 | { |
814 | struct sk_buff *dummy_skb; | 814 | struct sk_buff *dummy_skb; |
815 | struct list_head *r; | 815 | struct list_head *r; |
816 | int err = 0; | 816 | int err = 0; |
817 | 817 | ||
818 | BUILD_BUG_ON(sizeof(struct inet6_skb_parm) > sizeof(dummy_skb->cb)); | 818 | BUILD_BUG_ON(sizeof(struct inet6_skb_parm) > sizeof(dummy_skb->cb)); |
819 | 819 | ||
820 | /* Register the socket-side information for inet6_create. */ | 820 | /* Register the socket-side information for inet6_create. */ |
821 | for (r = &inetsw6[0]; r < &inetsw6[SOCK_MAX]; ++r) | 821 | for (r = &inetsw6[0]; r < &inetsw6[SOCK_MAX]; ++r) |
822 | INIT_LIST_HEAD(r); | 822 | INIT_LIST_HEAD(r); |
823 | 823 | ||
824 | if (disable_ipv6_mod) { | 824 | if (disable_ipv6_mod) { |
825 | pr_info("Loaded, but administratively disabled, reboot required to enable\n"); | 825 | pr_info("Loaded, but administratively disabled, reboot required to enable\n"); |
826 | goto out; | 826 | goto out; |
827 | } | 827 | } |
828 | 828 | ||
829 | err = proto_register(&tcpv6_prot, 1); | 829 | err = proto_register(&tcpv6_prot, 1); |
830 | if (err) | 830 | if (err) |
831 | goto out; | 831 | goto out; |
832 | 832 | ||
833 | err = proto_register(&udpv6_prot, 1); | 833 | err = proto_register(&udpv6_prot, 1); |
834 | if (err) | 834 | if (err) |
835 | goto out_unregister_tcp_proto; | 835 | goto out_unregister_tcp_proto; |
836 | 836 | ||
837 | err = proto_register(&udplitev6_prot, 1); | 837 | err = proto_register(&udplitev6_prot, 1); |
838 | if (err) | 838 | if (err) |
839 | goto out_unregister_udp_proto; | 839 | goto out_unregister_udp_proto; |
840 | 840 | ||
841 | err = proto_register(&rawv6_prot, 1); | 841 | err = proto_register(&rawv6_prot, 1); |
842 | if (err) | 842 | if (err) |
843 | goto out_unregister_udplite_proto; | 843 | goto out_unregister_udplite_proto; |
844 | 844 | ||
845 | 845 | ||
846 | /* We MUST register RAW sockets before we create the ICMP6, | 846 | /* We MUST register RAW sockets before we create the ICMP6, |
847 | * IGMP6, or NDISC control sockets. | 847 | * IGMP6, or NDISC control sockets. |
848 | */ | 848 | */ |
849 | err = rawv6_init(); | 849 | err = rawv6_init(); |
850 | if (err) | 850 | if (err) |
851 | goto out_unregister_raw_proto; | 851 | goto out_unregister_raw_proto; |
852 | 852 | ||
853 | /* Register the family here so that the init calls below will | 853 | /* Register the family here so that the init calls below will |
854 | * be able to create sockets. (?? is this dangerous ??) | 854 | * be able to create sockets. (?? is this dangerous ??) |
855 | */ | 855 | */ |
856 | err = sock_register(&inet6_family_ops); | 856 | err = sock_register(&inet6_family_ops); |
857 | if (err) | 857 | if (err) |
858 | goto out_sock_register_fail; | 858 | goto out_sock_register_fail; |
859 | 859 | ||
860 | tcpv6_prot.sysctl_mem = init_net.ipv4.sysctl_tcp_mem; | 860 | tcpv6_prot.sysctl_mem = init_net.ipv4.sysctl_tcp_mem; |
861 | 861 | ||
862 | /* | 862 | /* |
863 | * ipngwg API draft makes clear that the correct semantics | 863 | * ipngwg API draft makes clear that the correct semantics |
864 | * for TCP and UDP is to consider one TCP and UDP instance | 864 | * for TCP and UDP is to consider one TCP and UDP instance |
865 | * in a host available by both INET and INET6 APIs and | 865 | * in a host available by both INET and INET6 APIs and |
866 | * able to communicate via both network protocols. | 866 | * able to communicate via both network protocols. |
867 | */ | 867 | */ |
868 | 868 | ||
869 | err = register_pernet_subsys(&inet6_net_ops); | 869 | err = register_pernet_subsys(&inet6_net_ops); |
870 | if (err) | 870 | if (err) |
871 | goto register_pernet_fail; | 871 | goto register_pernet_fail; |
872 | err = icmpv6_init(); | 872 | err = icmpv6_init(); |
873 | if (err) | 873 | if (err) |
874 | goto icmp_fail; | 874 | goto icmp_fail; |
875 | err = ip6_mr_init(); | 875 | err = ip6_mr_init(); |
876 | if (err) | 876 | if (err) |
877 | goto ipmr_fail; | 877 | goto ipmr_fail; |
878 | err = ndisc_init(); | 878 | err = ndisc_init(); |
879 | if (err) | 879 | if (err) |
880 | goto ndisc_fail; | 880 | goto ndisc_fail; |
881 | err = igmp6_init(); | 881 | err = igmp6_init(); |
882 | if (err) | 882 | if (err) |
883 | goto igmp_fail; | 883 | goto igmp_fail; |
884 | err = ipv6_netfilter_init(); | 884 | err = ipv6_netfilter_init(); |
885 | if (err) | 885 | if (err) |
886 | goto netfilter_fail; | 886 | goto netfilter_fail; |
887 | /* Create /proc/foo6 entries. */ | 887 | /* Create /proc/foo6 entries. */ |
888 | #ifdef CONFIG_PROC_FS | 888 | #ifdef CONFIG_PROC_FS |
889 | err = -ENOMEM; | 889 | err = -ENOMEM; |
890 | if (raw6_proc_init()) | 890 | if (raw6_proc_init()) |
891 | goto proc_raw6_fail; | 891 | goto proc_raw6_fail; |
892 | if (udplite6_proc_init()) | 892 | if (udplite6_proc_init()) |
893 | goto proc_udplite6_fail; | 893 | goto proc_udplite6_fail; |
894 | if (ipv6_misc_proc_init()) | 894 | if (ipv6_misc_proc_init()) |
895 | goto proc_misc6_fail; | 895 | goto proc_misc6_fail; |
896 | if (if6_proc_init()) | 896 | if (if6_proc_init()) |
897 | goto proc_if6_fail; | 897 | goto proc_if6_fail; |
898 | #endif | 898 | #endif |
899 | err = ip6_route_init(); | 899 | err = ip6_route_init(); |
900 | if (err) | 900 | if (err) |
901 | goto ip6_route_fail; | 901 | goto ip6_route_fail; |
902 | err = ip6_flowlabel_init(); | 902 | err = ip6_flowlabel_init(); |
903 | if (err) | 903 | if (err) |
904 | goto ip6_flowlabel_fail; | 904 | goto ip6_flowlabel_fail; |
905 | err = addrconf_init(); | 905 | err = addrconf_init(); |
906 | if (err) | 906 | if (err) |
907 | goto addrconf_fail; | 907 | goto addrconf_fail; |
908 | 908 | ||
909 | /* Init v6 extension headers. */ | 909 | /* Init v6 extension headers. */ |
910 | err = ipv6_exthdrs_init(); | 910 | err = ipv6_exthdrs_init(); |
911 | if (err) | 911 | if (err) |
912 | goto ipv6_exthdrs_fail; | 912 | goto ipv6_exthdrs_fail; |
913 | 913 | ||
914 | err = ipv6_frag_init(); | 914 | err = ipv6_frag_init(); |
915 | if (err) | 915 | if (err) |
916 | goto ipv6_frag_fail; | 916 | goto ipv6_frag_fail; |
917 | 917 | ||
918 | /* Init v6 transport protocols. */ | 918 | /* Init v6 transport protocols. */ |
919 | err = udpv6_init(); | 919 | err = udpv6_init(); |
920 | if (err) | 920 | if (err) |
921 | goto udpv6_fail; | 921 | goto udpv6_fail; |
922 | 922 | ||
923 | err = udplitev6_init(); | 923 | err = udplitev6_init(); |
924 | if (err) | 924 | if (err) |
925 | goto udplitev6_fail; | 925 | goto udplitev6_fail; |
926 | 926 | ||
927 | err = tcpv6_init(); | 927 | err = tcpv6_init(); |
928 | if (err) | 928 | if (err) |
929 | goto tcpv6_fail; | 929 | goto tcpv6_fail; |
930 | 930 | ||
931 | err = ipv6_packet_init(); | 931 | err = ipv6_packet_init(); |
932 | if (err) | 932 | if (err) |
933 | goto ipv6_packet_fail; | 933 | goto ipv6_packet_fail; |
934 | 934 | ||
935 | #ifdef CONFIG_SYSCTL | 935 | #ifdef CONFIG_SYSCTL |
936 | err = ipv6_sysctl_register(); | 936 | err = ipv6_sysctl_register(); |
937 | if (err) | 937 | if (err) |
938 | goto sysctl_fail; | 938 | goto sysctl_fail; |
939 | #endif | 939 | #endif |
940 | out: | 940 | out: |
941 | return err; | 941 | return err; |
942 | 942 | ||
943 | #ifdef CONFIG_SYSCTL | 943 | #ifdef CONFIG_SYSCTL |
944 | sysctl_fail: | 944 | sysctl_fail: |
945 | ipv6_packet_cleanup(); | 945 | ipv6_packet_cleanup(); |
946 | #endif | 946 | #endif |
947 | ipv6_packet_fail: | 947 | ipv6_packet_fail: |
948 | tcpv6_exit(); | 948 | tcpv6_exit(); |
949 | tcpv6_fail: | 949 | tcpv6_fail: |
950 | udplitev6_exit(); | 950 | udplitev6_exit(); |
951 | udplitev6_fail: | 951 | udplitev6_fail: |
952 | udpv6_exit(); | 952 | udpv6_exit(); |
953 | udpv6_fail: | 953 | udpv6_fail: |
954 | ipv6_frag_exit(); | 954 | ipv6_frag_exit(); |
955 | ipv6_frag_fail: | 955 | ipv6_frag_fail: |
956 | ipv6_exthdrs_exit(); | 956 | ipv6_exthdrs_exit(); |
957 | ipv6_exthdrs_fail: | 957 | ipv6_exthdrs_fail: |
958 | addrconf_cleanup(); | 958 | addrconf_cleanup(); |
959 | addrconf_fail: | 959 | addrconf_fail: |
960 | ip6_flowlabel_cleanup(); | 960 | ip6_flowlabel_cleanup(); |
961 | ip6_flowlabel_fail: | 961 | ip6_flowlabel_fail: |
962 | ip6_route_cleanup(); | 962 | ip6_route_cleanup(); |
963 | ip6_route_fail: | 963 | ip6_route_fail: |
964 | #ifdef CONFIG_PROC_FS | 964 | #ifdef CONFIG_PROC_FS |
965 | if6_proc_exit(); | 965 | if6_proc_exit(); |
966 | proc_if6_fail: | 966 | proc_if6_fail: |
967 | ipv6_misc_proc_exit(); | 967 | ipv6_misc_proc_exit(); |
968 | proc_misc6_fail: | 968 | proc_misc6_fail: |
969 | udplite6_proc_exit(); | 969 | udplite6_proc_exit(); |
970 | proc_udplite6_fail: | 970 | proc_udplite6_fail: |
971 | raw6_proc_exit(); | 971 | raw6_proc_exit(); |
972 | proc_raw6_fail: | 972 | proc_raw6_fail: |
973 | #endif | 973 | #endif |
974 | ipv6_netfilter_fini(); | 974 | ipv6_netfilter_fini(); |
975 | netfilter_fail: | 975 | netfilter_fail: |
976 | igmp6_cleanup(); | 976 | igmp6_cleanup(); |
977 | igmp_fail: | 977 | igmp_fail: |
978 | ndisc_cleanup(); | 978 | ndisc_cleanup(); |
979 | ndisc_fail: | 979 | ndisc_fail: |
980 | ip6_mr_cleanup(); | 980 | ip6_mr_cleanup(); |
981 | ipmr_fail: | 981 | ipmr_fail: |
982 | icmpv6_cleanup(); | 982 | icmpv6_cleanup(); |
983 | icmp_fail: | 983 | icmp_fail: |
984 | unregister_pernet_subsys(&inet6_net_ops); | 984 | unregister_pernet_subsys(&inet6_net_ops); |
985 | register_pernet_fail: | 985 | register_pernet_fail: |
986 | sock_unregister(PF_INET6); | 986 | sock_unregister(PF_INET6); |
987 | rtnl_unregister_all(PF_INET6); | 987 | rtnl_unregister_all(PF_INET6); |
988 | out_sock_register_fail: | 988 | out_sock_register_fail: |
989 | rawv6_exit(); | 989 | rawv6_exit(); |
990 | out_unregister_raw_proto: | 990 | out_unregister_raw_proto: |
991 | proto_unregister(&rawv6_prot); | 991 | proto_unregister(&rawv6_prot); |
992 | out_unregister_udplite_proto: | 992 | out_unregister_udplite_proto: |
993 | proto_unregister(&udplitev6_prot); | 993 | proto_unregister(&udplitev6_prot); |
994 | out_unregister_udp_proto: | 994 | out_unregister_udp_proto: |
995 | proto_unregister(&udpv6_prot); | 995 | proto_unregister(&udpv6_prot); |
996 | out_unregister_tcp_proto: | 996 | out_unregister_tcp_proto: |
997 | proto_unregister(&tcpv6_prot); | 997 | proto_unregister(&tcpv6_prot); |
998 | goto out; | 998 | goto out; |
999 | } | 999 | } |
1000 | module_init(inet6_init); | 1000 | module_init(inet6_init); |
1001 | 1001 | ||
1002 | static void __exit inet6_exit(void) | 1002 | static void __exit inet6_exit(void) |
1003 | { | 1003 | { |
1004 | if (disable_ipv6_mod) | 1004 | if (disable_ipv6_mod) |
1005 | return; | 1005 | return; |
1006 | 1006 | ||
1007 | /* First of all disallow new sockets creation. */ | 1007 | /* First of all disallow new sockets creation. */ |
1008 | sock_unregister(PF_INET6); | 1008 | sock_unregister(PF_INET6); |
1009 | /* Disallow any further netlink messages */ | 1009 | /* Disallow any further netlink messages */ |
1010 | rtnl_unregister_all(PF_INET6); | 1010 | rtnl_unregister_all(PF_INET6); |
1011 | 1011 | ||
1012 | udpv6_exit(); | 1012 | udpv6_exit(); |
1013 | udplitev6_exit(); | 1013 | udplitev6_exit(); |
1014 | tcpv6_exit(); | 1014 | tcpv6_exit(); |
1015 | 1015 | ||
1016 | /* Cleanup code parts. */ | 1016 | /* Cleanup code parts. */ |
1017 | ipv6_packet_cleanup(); | 1017 | ipv6_packet_cleanup(); |
1018 | ipv6_frag_exit(); | 1018 | ipv6_frag_exit(); |
1019 | ipv6_exthdrs_exit(); | 1019 | ipv6_exthdrs_exit(); |
1020 | addrconf_cleanup(); | 1020 | addrconf_cleanup(); |
1021 | ip6_flowlabel_cleanup(); | 1021 | ip6_flowlabel_cleanup(); |
1022 | ip6_route_cleanup(); | 1022 | ip6_route_cleanup(); |
1023 | #ifdef CONFIG_PROC_FS | 1023 | #ifdef CONFIG_PROC_FS |
1024 | 1024 | ||
1025 | /* Cleanup code parts. */ | 1025 | /* Cleanup code parts. */ |
1026 | if6_proc_exit(); | 1026 | if6_proc_exit(); |
1027 | ipv6_misc_proc_exit(); | 1027 | ipv6_misc_proc_exit(); |
1028 | udplite6_proc_exit(); | 1028 | udplite6_proc_exit(); |
1029 | raw6_proc_exit(); | 1029 | raw6_proc_exit(); |
1030 | #endif | 1030 | #endif |
1031 | ipv6_netfilter_fini(); | 1031 | ipv6_netfilter_fini(); |
1032 | igmp6_cleanup(); | 1032 | igmp6_cleanup(); |
1033 | ndisc_cleanup(); | 1033 | ndisc_cleanup(); |
1034 | ip6_mr_cleanup(); | 1034 | ip6_mr_cleanup(); |
1035 | icmpv6_cleanup(); | 1035 | icmpv6_cleanup(); |
1036 | rawv6_exit(); | 1036 | rawv6_exit(); |
1037 | 1037 | ||
1038 | unregister_pernet_subsys(&inet6_net_ops); | 1038 | unregister_pernet_subsys(&inet6_net_ops); |
1039 | proto_unregister(&rawv6_prot); | 1039 | proto_unregister(&rawv6_prot); |
1040 | proto_unregister(&udplitev6_prot); | 1040 | proto_unregister(&udplitev6_prot); |
1041 | proto_unregister(&udpv6_prot); | 1041 | proto_unregister(&udpv6_prot); |
1042 | proto_unregister(&tcpv6_prot); | 1042 | proto_unregister(&tcpv6_prot); |
1043 | 1043 | ||
1044 | rcu_barrier(); /* Wait for completion of call_rcu()'s */ | 1044 | rcu_barrier(); /* Wait for completion of call_rcu()'s */ |
1045 | } | 1045 | } |
1046 | module_exit(inet6_exit); | 1046 | module_exit(inet6_exit); |
1047 | 1047 | ||
1048 | MODULE_ALIAS_NETPROTO(PF_INET6); | 1048 | MODULE_ALIAS_NETPROTO(PF_INET6); |
1049 | 1049 |
net/sctp/socket.c
1 | /* SCTP kernel implementation | 1 | /* SCTP kernel implementation |
2 | * (C) Copyright IBM Corp. 2001, 2004 | 2 | * (C) Copyright IBM Corp. 2001, 2004 |
3 | * Copyright (c) 1999-2000 Cisco, Inc. | 3 | * Copyright (c) 1999-2000 Cisco, Inc. |
4 | * Copyright (c) 1999-2001 Motorola, Inc. | 4 | * Copyright (c) 1999-2001 Motorola, Inc. |
5 | * Copyright (c) 2001-2003 Intel Corp. | 5 | * Copyright (c) 2001-2003 Intel Corp. |
6 | * Copyright (c) 2001-2002 Nokia, Inc. | 6 | * Copyright (c) 2001-2002 Nokia, Inc. |
7 | * Copyright (c) 2001 La Monte H.P. Yarroll | 7 | * Copyright (c) 2001 La Monte H.P. Yarroll |
8 | * | 8 | * |
9 | * This file is part of the SCTP kernel implementation | 9 | * This file is part of the SCTP kernel implementation |
10 | * | 10 | * |
11 | * These functions interface with the sockets layer to implement the | 11 | * These functions interface with the sockets layer to implement the |
12 | * SCTP Extensions for the Sockets API. | 12 | * SCTP Extensions for the Sockets API. |
13 | * | 13 | * |
14 | * Note that the descriptions from the specification are USER level | 14 | * Note that the descriptions from the specification are USER level |
15 | * functions--this file is the functions which populate the struct proto | 15 | * functions--this file is the functions which populate the struct proto |
16 | * for SCTP which is the BOTTOM of the sockets interface. | 16 | * for SCTP which is the BOTTOM of the sockets interface. |
17 | * | 17 | * |
18 | * This SCTP implementation is free software; | 18 | * This SCTP implementation is free software; |
19 | * you can redistribute it and/or modify it under the terms of | 19 | * you can redistribute it and/or modify it under the terms of |
20 | * the GNU General Public License as published by | 20 | * the GNU General Public License as published by |
21 | * the Free Software Foundation; either version 2, or (at your option) | 21 | * the Free Software Foundation; either version 2, or (at your option) |
22 | * any later version. | 22 | * any later version. |
23 | * | 23 | * |
24 | * This SCTP implementation is distributed in the hope that it | 24 | * This SCTP implementation is distributed in the hope that it |
25 | * will be useful, but WITHOUT ANY WARRANTY; without even the implied | 25 | * will be useful, but WITHOUT ANY WARRANTY; without even the implied |
26 | * ************************ | 26 | * ************************ |
27 | * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | 27 | * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
28 | * See the GNU General Public License for more details. | 28 | * See the GNU General Public License for more details. |
29 | * | 29 | * |
30 | * You should have received a copy of the GNU General Public License | 30 | * You should have received a copy of the GNU General Public License |
31 | * along with GNU CC; see the file COPYING. If not, write to | 31 | * along with GNU CC; see the file COPYING. If not, write to |
32 | * the Free Software Foundation, 59 Temple Place - Suite 330, | 32 | * the Free Software Foundation, 59 Temple Place - Suite 330, |
33 | * Boston, MA 02111-1307, USA. | 33 | * Boston, MA 02111-1307, USA. |
34 | * | 34 | * |
35 | * Please send any bug reports or fixes you make to the | 35 | * Please send any bug reports or fixes you make to the |
36 | * email address(es): | 36 | * email address(es): |
37 | * lksctp developers <lksctp-developers@lists.sourceforge.net> | 37 | * lksctp developers <lksctp-developers@lists.sourceforge.net> |
38 | * | 38 | * |
39 | * Or submit a bug report through the following website: | 39 | * Or submit a bug report through the following website: |
40 | * http://www.sf.net/projects/lksctp | 40 | * http://www.sf.net/projects/lksctp |
41 | * | 41 | * |
42 | * Written or modified by: | 42 | * Written or modified by: |
43 | * La Monte H.P. Yarroll <piggy@acm.org> | 43 | * La Monte H.P. Yarroll <piggy@acm.org> |
44 | * Narasimha Budihal <narsi@refcode.org> | 44 | * Narasimha Budihal <narsi@refcode.org> |
45 | * Karl Knutson <karl@athena.chicago.il.us> | 45 | * Karl Knutson <karl@athena.chicago.il.us> |
46 | * Jon Grimm <jgrimm@us.ibm.com> | 46 | * Jon Grimm <jgrimm@us.ibm.com> |
47 | * Xingang Guo <xingang.guo@intel.com> | 47 | * Xingang Guo <xingang.guo@intel.com> |
48 | * Daisy Chang <daisyc@us.ibm.com> | 48 | * Daisy Chang <daisyc@us.ibm.com> |
49 | * Sridhar Samudrala <samudrala@us.ibm.com> | 49 | * Sridhar Samudrala <samudrala@us.ibm.com> |
50 | * Inaky Perez-Gonzalez <inaky.gonzalez@intel.com> | 50 | * Inaky Perez-Gonzalez <inaky.gonzalez@intel.com> |
51 | * Ardelle Fan <ardelle.fan@intel.com> | 51 | * Ardelle Fan <ardelle.fan@intel.com> |
52 | * Ryan Layer <rmlayer@us.ibm.com> | 52 | * Ryan Layer <rmlayer@us.ibm.com> |
53 | * Anup Pemmaiah <pemmaiah@cc.usu.edu> | 53 | * Anup Pemmaiah <pemmaiah@cc.usu.edu> |
54 | * Kevin Gao <kevin.gao@intel.com> | 54 | * Kevin Gao <kevin.gao@intel.com> |
55 | * | 55 | * |
56 | * Any bugs reported given to us we will try to fix... any fixes shared will | 56 | * Any bugs reported given to us we will try to fix... any fixes shared will |
57 | * be incorporated into the next SCTP release. | 57 | * be incorporated into the next SCTP release. |
58 | */ | 58 | */ |
59 | 59 | ||
60 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | 60 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt |
61 | 61 | ||
62 | #include <linux/types.h> | 62 | #include <linux/types.h> |
63 | #include <linux/kernel.h> | 63 | #include <linux/kernel.h> |
64 | #include <linux/wait.h> | 64 | #include <linux/wait.h> |
65 | #include <linux/time.h> | 65 | #include <linux/time.h> |
66 | #include <linux/ip.h> | 66 | #include <linux/ip.h> |
67 | #include <linux/capability.h> | 67 | #include <linux/capability.h> |
68 | #include <linux/fcntl.h> | 68 | #include <linux/fcntl.h> |
69 | #include <linux/poll.h> | 69 | #include <linux/poll.h> |
70 | #include <linux/init.h> | 70 | #include <linux/init.h> |
71 | #include <linux/crypto.h> | 71 | #include <linux/crypto.h> |
72 | #include <linux/slab.h> | 72 | #include <linux/slab.h> |
73 | #include <linux/file.h> | 73 | #include <linux/file.h> |
74 | 74 | ||
75 | #include <net/ip.h> | 75 | #include <net/ip.h> |
76 | #include <net/icmp.h> | 76 | #include <net/icmp.h> |
77 | #include <net/route.h> | 77 | #include <net/route.h> |
78 | #include <net/ipv6.h> | 78 | #include <net/ipv6.h> |
79 | #include <net/inet_common.h> | 79 | #include <net/inet_common.h> |
80 | 80 | ||
81 | #include <linux/socket.h> /* for sa_family_t */ | 81 | #include <linux/socket.h> /* for sa_family_t */ |
82 | #include <linux/export.h> | 82 | #include <linux/export.h> |
83 | #include <net/sock.h> | 83 | #include <net/sock.h> |
84 | #include <net/sctp/sctp.h> | 84 | #include <net/sctp/sctp.h> |
85 | #include <net/sctp/sm.h> | 85 | #include <net/sctp/sm.h> |
86 | 86 | ||
87 | /* WARNING: Please do not remove the SCTP_STATIC attribute to | 87 | /* WARNING: Please do not remove the SCTP_STATIC attribute to |
88 | * any of the functions below as they are used to export functions | 88 | * any of the functions below as they are used to export functions |
89 | * used by a project regression testsuite. | 89 | * used by a project regression testsuite. |
90 | */ | 90 | */ |
91 | 91 | ||
92 | /* Forward declarations for internal helper functions. */ | 92 | /* Forward declarations for internal helper functions. */ |
93 | static int sctp_writeable(struct sock *sk); | 93 | static int sctp_writeable(struct sock *sk); |
94 | static void sctp_wfree(struct sk_buff *skb); | 94 | static void sctp_wfree(struct sk_buff *skb); |
95 | static int sctp_wait_for_sndbuf(struct sctp_association *, long *timeo_p, | 95 | static int sctp_wait_for_sndbuf(struct sctp_association *, long *timeo_p, |
96 | size_t msg_len); | 96 | size_t msg_len); |
97 | static int sctp_wait_for_packet(struct sock * sk, int *err, long *timeo_p); | 97 | static int sctp_wait_for_packet(struct sock * sk, int *err, long *timeo_p); |
98 | static int sctp_wait_for_connect(struct sctp_association *, long *timeo_p); | 98 | static int sctp_wait_for_connect(struct sctp_association *, long *timeo_p); |
99 | static int sctp_wait_for_accept(struct sock *sk, long timeo); | 99 | static int sctp_wait_for_accept(struct sock *sk, long timeo); |
100 | static void sctp_wait_for_close(struct sock *sk, long timeo); | 100 | static void sctp_wait_for_close(struct sock *sk, long timeo); |
101 | static struct sctp_af *sctp_sockaddr_af(struct sctp_sock *opt, | 101 | static struct sctp_af *sctp_sockaddr_af(struct sctp_sock *opt, |
102 | union sctp_addr *addr, int len); | 102 | union sctp_addr *addr, int len); |
103 | static int sctp_bindx_add(struct sock *, struct sockaddr *, int); | 103 | static int sctp_bindx_add(struct sock *, struct sockaddr *, int); |
104 | static int sctp_bindx_rem(struct sock *, struct sockaddr *, int); | 104 | static int sctp_bindx_rem(struct sock *, struct sockaddr *, int); |
105 | static int sctp_send_asconf_add_ip(struct sock *, struct sockaddr *, int); | 105 | static int sctp_send_asconf_add_ip(struct sock *, struct sockaddr *, int); |
106 | static int sctp_send_asconf_del_ip(struct sock *, struct sockaddr *, int); | 106 | static int sctp_send_asconf_del_ip(struct sock *, struct sockaddr *, int); |
107 | static int sctp_send_asconf(struct sctp_association *asoc, | 107 | static int sctp_send_asconf(struct sctp_association *asoc, |
108 | struct sctp_chunk *chunk); | 108 | struct sctp_chunk *chunk); |
109 | static int sctp_do_bind(struct sock *, union sctp_addr *, int); | 109 | static int sctp_do_bind(struct sock *, union sctp_addr *, int); |
110 | static int sctp_autobind(struct sock *sk); | 110 | static int sctp_autobind(struct sock *sk); |
111 | static void sctp_sock_migrate(struct sock *, struct sock *, | 111 | static void sctp_sock_migrate(struct sock *, struct sock *, |
112 | struct sctp_association *, sctp_socket_type_t); | 112 | struct sctp_association *, sctp_socket_type_t); |
113 | 113 | ||
114 | extern struct kmem_cache *sctp_bucket_cachep; | 114 | extern struct kmem_cache *sctp_bucket_cachep; |
115 | extern long sysctl_sctp_mem[3]; | 115 | extern long sysctl_sctp_mem[3]; |
116 | extern int sysctl_sctp_rmem[3]; | 116 | extern int sysctl_sctp_rmem[3]; |
117 | extern int sysctl_sctp_wmem[3]; | 117 | extern int sysctl_sctp_wmem[3]; |
118 | 118 | ||
119 | static int sctp_memory_pressure; | 119 | static int sctp_memory_pressure; |
120 | static atomic_long_t sctp_memory_allocated; | 120 | static atomic_long_t sctp_memory_allocated; |
121 | struct percpu_counter sctp_sockets_allocated; | 121 | struct percpu_counter sctp_sockets_allocated; |
122 | 122 | ||
123 | static void sctp_enter_memory_pressure(struct sock *sk) | 123 | static void sctp_enter_memory_pressure(struct sock *sk) |
124 | { | 124 | { |
125 | sctp_memory_pressure = 1; | 125 | sctp_memory_pressure = 1; |
126 | } | 126 | } |
127 | 127 | ||
128 | 128 | ||
129 | /* Get the sndbuf space available at the time on the association. */ | 129 | /* Get the sndbuf space available at the time on the association. */ |
130 | static inline int sctp_wspace(struct sctp_association *asoc) | 130 | static inline int sctp_wspace(struct sctp_association *asoc) |
131 | { | 131 | { |
132 | int amt; | 132 | int amt; |
133 | 133 | ||
134 | if (asoc->ep->sndbuf_policy) | 134 | if (asoc->ep->sndbuf_policy) |
135 | amt = asoc->sndbuf_used; | 135 | amt = asoc->sndbuf_used; |
136 | else | 136 | else |
137 | amt = sk_wmem_alloc_get(asoc->base.sk); | 137 | amt = sk_wmem_alloc_get(asoc->base.sk); |
138 | 138 | ||
139 | if (amt >= asoc->base.sk->sk_sndbuf) { | 139 | if (amt >= asoc->base.sk->sk_sndbuf) { |
140 | if (asoc->base.sk->sk_userlocks & SOCK_SNDBUF_LOCK) | 140 | if (asoc->base.sk->sk_userlocks & SOCK_SNDBUF_LOCK) |
141 | amt = 0; | 141 | amt = 0; |
142 | else { | 142 | else { |
143 | amt = sk_stream_wspace(asoc->base.sk); | 143 | amt = sk_stream_wspace(asoc->base.sk); |
144 | if (amt < 0) | 144 | if (amt < 0) |
145 | amt = 0; | 145 | amt = 0; |
146 | } | 146 | } |
147 | } else { | 147 | } else { |
148 | amt = asoc->base.sk->sk_sndbuf - amt; | 148 | amt = asoc->base.sk->sk_sndbuf - amt; |
149 | } | 149 | } |
150 | return amt; | 150 | return amt; |
151 | } | 151 | } |
152 | 152 | ||
153 | /* Increment the used sndbuf space count of the corresponding association by | 153 | /* Increment the used sndbuf space count of the corresponding association by |
154 | * the size of the outgoing data chunk. | 154 | * the size of the outgoing data chunk. |
155 | * Also, set the skb destructor for sndbuf accounting later. | 155 | * Also, set the skb destructor for sndbuf accounting later. |
156 | * | 156 | * |
157 | * Since it is always 1-1 between chunk and skb, and also a new skb is always | 157 | * Since it is always 1-1 between chunk and skb, and also a new skb is always |
158 | * allocated for chunk bundling in sctp_packet_transmit(), we can use the | 158 | * allocated for chunk bundling in sctp_packet_transmit(), we can use the |
159 | * destructor in the data chunk skb for the purpose of the sndbuf space | 159 | * destructor in the data chunk skb for the purpose of the sndbuf space |
160 | * tracking. | 160 | * tracking. |
161 | */ | 161 | */ |
162 | static inline void sctp_set_owner_w(struct sctp_chunk *chunk) | 162 | static inline void sctp_set_owner_w(struct sctp_chunk *chunk) |
163 | { | 163 | { |
164 | struct sctp_association *asoc = chunk->asoc; | 164 | struct sctp_association *asoc = chunk->asoc; |
165 | struct sock *sk = asoc->base.sk; | 165 | struct sock *sk = asoc->base.sk; |
166 | 166 | ||
167 | /* The sndbuf space is tracked per association. */ | 167 | /* The sndbuf space is tracked per association. */ |
168 | sctp_association_hold(asoc); | 168 | sctp_association_hold(asoc); |
169 | 169 | ||
170 | skb_set_owner_w(chunk->skb, sk); | 170 | skb_set_owner_w(chunk->skb, sk); |
171 | 171 | ||
172 | chunk->skb->destructor = sctp_wfree; | 172 | chunk->skb->destructor = sctp_wfree; |
173 | /* Save the chunk pointer in skb for sctp_wfree to use later. */ | 173 | /* Save the chunk pointer in skb for sctp_wfree to use later. */ |
174 | *((struct sctp_chunk **)(chunk->skb->cb)) = chunk; | 174 | *((struct sctp_chunk **)(chunk->skb->cb)) = chunk; |
175 | 175 | ||
176 | asoc->sndbuf_used += SCTP_DATA_SNDSIZE(chunk) + | 176 | asoc->sndbuf_used += SCTP_DATA_SNDSIZE(chunk) + |
177 | sizeof(struct sk_buff) + | 177 | sizeof(struct sk_buff) + |
178 | sizeof(struct sctp_chunk); | 178 | sizeof(struct sctp_chunk); |
179 | 179 | ||
180 | atomic_add(sizeof(struct sctp_chunk), &sk->sk_wmem_alloc); | 180 | atomic_add(sizeof(struct sctp_chunk), &sk->sk_wmem_alloc); |
181 | sk->sk_wmem_queued += chunk->skb->truesize; | 181 | sk->sk_wmem_queued += chunk->skb->truesize; |
182 | sk_mem_charge(sk, chunk->skb->truesize); | 182 | sk_mem_charge(sk, chunk->skb->truesize); |
183 | } | 183 | } |
184 | 184 | ||
185 | /* Verify that this is a valid address. */ | 185 | /* Verify that this is a valid address. */ |
186 | static inline int sctp_verify_addr(struct sock *sk, union sctp_addr *addr, | 186 | static inline int sctp_verify_addr(struct sock *sk, union sctp_addr *addr, |
187 | int len) | 187 | int len) |
188 | { | 188 | { |
189 | struct sctp_af *af; | 189 | struct sctp_af *af; |
190 | 190 | ||
191 | /* Verify basic sockaddr. */ | 191 | /* Verify basic sockaddr. */ |
192 | af = sctp_sockaddr_af(sctp_sk(sk), addr, len); | 192 | af = sctp_sockaddr_af(sctp_sk(sk), addr, len); |
193 | if (!af) | 193 | if (!af) |
194 | return -EINVAL; | 194 | return -EINVAL; |
195 | 195 | ||
196 | /* Is this a valid SCTP address? */ | 196 | /* Is this a valid SCTP address? */ |
197 | if (!af->addr_valid(addr, sctp_sk(sk), NULL)) | 197 | if (!af->addr_valid(addr, sctp_sk(sk), NULL)) |
198 | return -EINVAL; | 198 | return -EINVAL; |
199 | 199 | ||
200 | if (!sctp_sk(sk)->pf->send_verify(sctp_sk(sk), (addr))) | 200 | if (!sctp_sk(sk)->pf->send_verify(sctp_sk(sk), (addr))) |
201 | return -EINVAL; | 201 | return -EINVAL; |
202 | 202 | ||
203 | return 0; | 203 | return 0; |
204 | } | 204 | } |
205 | 205 | ||
206 | /* Look up the association by its id. If this is not a UDP-style | 206 | /* Look up the association by its id. If this is not a UDP-style |
207 | * socket, the ID field is always ignored. | 207 | * socket, the ID field is always ignored. |
208 | */ | 208 | */ |
209 | struct sctp_association *sctp_id2assoc(struct sock *sk, sctp_assoc_t id) | 209 | struct sctp_association *sctp_id2assoc(struct sock *sk, sctp_assoc_t id) |
210 | { | 210 | { |
211 | struct sctp_association *asoc = NULL; | 211 | struct sctp_association *asoc = NULL; |
212 | 212 | ||
213 | /* If this is not a UDP-style socket, assoc id should be ignored. */ | 213 | /* If this is not a UDP-style socket, assoc id should be ignored. */ |
214 | if (!sctp_style(sk, UDP)) { | 214 | if (!sctp_style(sk, UDP)) { |
215 | /* Return NULL if the socket state is not ESTABLISHED. It | 215 | /* Return NULL if the socket state is not ESTABLISHED. It |
216 | * could be a TCP-style listening socket or a socket which | 216 | * could be a TCP-style listening socket or a socket which |
217 | * hasn't yet called connect() to establish an association. | 217 | * hasn't yet called connect() to establish an association. |
218 | */ | 218 | */ |
219 | if (!sctp_sstate(sk, ESTABLISHED)) | 219 | if (!sctp_sstate(sk, ESTABLISHED)) |
220 | return NULL; | 220 | return NULL; |
221 | 221 | ||
222 | /* Get the first and the only association from the list. */ | 222 | /* Get the first and the only association from the list. */ |
223 | if (!list_empty(&sctp_sk(sk)->ep->asocs)) | 223 | if (!list_empty(&sctp_sk(sk)->ep->asocs)) |
224 | asoc = list_entry(sctp_sk(sk)->ep->asocs.next, | 224 | asoc = list_entry(sctp_sk(sk)->ep->asocs.next, |
225 | struct sctp_association, asocs); | 225 | struct sctp_association, asocs); |
226 | return asoc; | 226 | return asoc; |
227 | } | 227 | } |
228 | 228 | ||
229 | /* Otherwise this is a UDP-style socket. */ | 229 | /* Otherwise this is a UDP-style socket. */ |
230 | if (!id || (id == (sctp_assoc_t)-1)) | 230 | if (!id || (id == (sctp_assoc_t)-1)) |
231 | return NULL; | 231 | return NULL; |
232 | 232 | ||
233 | spin_lock_bh(&sctp_assocs_id_lock); | 233 | spin_lock_bh(&sctp_assocs_id_lock); |
234 | asoc = (struct sctp_association *)idr_find(&sctp_assocs_id, (int)id); | 234 | asoc = (struct sctp_association *)idr_find(&sctp_assocs_id, (int)id); |
235 | spin_unlock_bh(&sctp_assocs_id_lock); | 235 | spin_unlock_bh(&sctp_assocs_id_lock); |
236 | 236 | ||
237 | if (!asoc || (asoc->base.sk != sk) || asoc->base.dead) | 237 | if (!asoc || (asoc->base.sk != sk) || asoc->base.dead) |
238 | return NULL; | 238 | return NULL; |
239 | 239 | ||
240 | return asoc; | 240 | return asoc; |
241 | } | 241 | } |
242 | 242 | ||
243 | /* Look up the transport from an address and an assoc id. If both address and | 243 | /* Look up the transport from an address and an assoc id. If both address and |
244 | * id are specified, the associations matching the address and the id should be | 244 | * id are specified, the associations matching the address and the id should be |
245 | * the same. | 245 | * the same. |
246 | */ | 246 | */ |
247 | static struct sctp_transport *sctp_addr_id2transport(struct sock *sk, | 247 | static struct sctp_transport *sctp_addr_id2transport(struct sock *sk, |
248 | struct sockaddr_storage *addr, | 248 | struct sockaddr_storage *addr, |
249 | sctp_assoc_t id) | 249 | sctp_assoc_t id) |
250 | { | 250 | { |
251 | struct sctp_association *addr_asoc = NULL, *id_asoc = NULL; | 251 | struct sctp_association *addr_asoc = NULL, *id_asoc = NULL; |
252 | struct sctp_transport *transport; | 252 | struct sctp_transport *transport; |
253 | union sctp_addr *laddr = (union sctp_addr *)addr; | 253 | union sctp_addr *laddr = (union sctp_addr *)addr; |
254 | 254 | ||
255 | addr_asoc = sctp_endpoint_lookup_assoc(sctp_sk(sk)->ep, | 255 | addr_asoc = sctp_endpoint_lookup_assoc(sctp_sk(sk)->ep, |
256 | laddr, | 256 | laddr, |
257 | &transport); | 257 | &transport); |
258 | 258 | ||
259 | if (!addr_asoc) | 259 | if (!addr_asoc) |
260 | return NULL; | 260 | return NULL; |
261 | 261 | ||
262 | id_asoc = sctp_id2assoc(sk, id); | 262 | id_asoc = sctp_id2assoc(sk, id); |
263 | if (id_asoc && (id_asoc != addr_asoc)) | 263 | if (id_asoc && (id_asoc != addr_asoc)) |
264 | return NULL; | 264 | return NULL; |
265 | 265 | ||
266 | sctp_get_pf_specific(sk->sk_family)->addr_v4map(sctp_sk(sk), | 266 | sctp_get_pf_specific(sk->sk_family)->addr_v4map(sctp_sk(sk), |
267 | (union sctp_addr *)addr); | 267 | (union sctp_addr *)addr); |
268 | 268 | ||
269 | return transport; | 269 | return transport; |
270 | } | 270 | } |
271 | 271 | ||
272 | /* API 3.1.2 bind() - UDP Style Syntax | 272 | /* API 3.1.2 bind() - UDP Style Syntax |
273 | * The syntax of bind() is, | 273 | * The syntax of bind() is, |
274 | * | 274 | * |
275 | * ret = bind(int sd, struct sockaddr *addr, int addrlen); | 275 | * ret = bind(int sd, struct sockaddr *addr, int addrlen); |
276 | * | 276 | * |
277 | * sd - the socket descriptor returned by socket(). | 277 | * sd - the socket descriptor returned by socket(). |
278 | * addr - the address structure (struct sockaddr_in or struct | 278 | * addr - the address structure (struct sockaddr_in or struct |
279 | * sockaddr_in6 [RFC 2553]), | 279 | * sockaddr_in6 [RFC 2553]), |
280 | * addr_len - the size of the address structure. | 280 | * addr_len - the size of the address structure. |
281 | */ | 281 | */ |
282 | SCTP_STATIC int sctp_bind(struct sock *sk, struct sockaddr *addr, int addr_len) | 282 | SCTP_STATIC int sctp_bind(struct sock *sk, struct sockaddr *addr, int addr_len) |
283 | { | 283 | { |
284 | int retval = 0; | 284 | int retval = 0; |
285 | 285 | ||
286 | sctp_lock_sock(sk); | 286 | sctp_lock_sock(sk); |
287 | 287 | ||
288 | SCTP_DEBUG_PRINTK("sctp_bind(sk: %p, addr: %p, addr_len: %d)\n", | 288 | SCTP_DEBUG_PRINTK("sctp_bind(sk: %p, addr: %p, addr_len: %d)\n", |
289 | sk, addr, addr_len); | 289 | sk, addr, addr_len); |
290 | 290 | ||
291 | /* Disallow binding twice. */ | 291 | /* Disallow binding twice. */ |
292 | if (!sctp_sk(sk)->ep->base.bind_addr.port) | 292 | if (!sctp_sk(sk)->ep->base.bind_addr.port) |
293 | retval = sctp_do_bind(sk, (union sctp_addr *)addr, | 293 | retval = sctp_do_bind(sk, (union sctp_addr *)addr, |
294 | addr_len); | 294 | addr_len); |
295 | else | 295 | else |
296 | retval = -EINVAL; | 296 | retval = -EINVAL; |
297 | 297 | ||
298 | sctp_release_sock(sk); | 298 | sctp_release_sock(sk); |
299 | 299 | ||
300 | return retval; | 300 | return retval; |
301 | } | 301 | } |
302 | 302 | ||
303 | static long sctp_get_port_local(struct sock *, union sctp_addr *); | 303 | static long sctp_get_port_local(struct sock *, union sctp_addr *); |
304 | 304 | ||
305 | /* Verify this is a valid sockaddr. */ | 305 | /* Verify this is a valid sockaddr. */ |
306 | static struct sctp_af *sctp_sockaddr_af(struct sctp_sock *opt, | 306 | static struct sctp_af *sctp_sockaddr_af(struct sctp_sock *opt, |
307 | union sctp_addr *addr, int len) | 307 | union sctp_addr *addr, int len) |
308 | { | 308 | { |
309 | struct sctp_af *af; | 309 | struct sctp_af *af; |
310 | 310 | ||
311 | /* Check minimum size. */ | 311 | /* Check minimum size. */ |
312 | if (len < sizeof (struct sockaddr)) | 312 | if (len < sizeof (struct sockaddr)) |
313 | return NULL; | 313 | return NULL; |
314 | 314 | ||
315 | /* V4 mapped address are really of AF_INET family */ | 315 | /* V4 mapped address are really of AF_INET family */ |
316 | if (addr->sa.sa_family == AF_INET6 && | 316 | if (addr->sa.sa_family == AF_INET6 && |
317 | ipv6_addr_v4mapped(&addr->v6.sin6_addr)) { | 317 | ipv6_addr_v4mapped(&addr->v6.sin6_addr)) { |
318 | if (!opt->pf->af_supported(AF_INET, opt)) | 318 | if (!opt->pf->af_supported(AF_INET, opt)) |
319 | return NULL; | 319 | return NULL; |
320 | } else { | 320 | } else { |
321 | /* Does this PF support this AF? */ | 321 | /* Does this PF support this AF? */ |
322 | if (!opt->pf->af_supported(addr->sa.sa_family, opt)) | 322 | if (!opt->pf->af_supported(addr->sa.sa_family, opt)) |
323 | return NULL; | 323 | return NULL; |
324 | } | 324 | } |
325 | 325 | ||
326 | /* If we get this far, af is valid. */ | 326 | /* If we get this far, af is valid. */ |
327 | af = sctp_get_af_specific(addr->sa.sa_family); | 327 | af = sctp_get_af_specific(addr->sa.sa_family); |
328 | 328 | ||
329 | if (len < af->sockaddr_len) | 329 | if (len < af->sockaddr_len) |
330 | return NULL; | 330 | return NULL; |
331 | 331 | ||
332 | return af; | 332 | return af; |
333 | } | 333 | } |
334 | 334 | ||
335 | /* Bind a local address either to an endpoint or to an association. */ | 335 | /* Bind a local address either to an endpoint or to an association. */ |
336 | SCTP_STATIC int sctp_do_bind(struct sock *sk, union sctp_addr *addr, int len) | 336 | SCTP_STATIC int sctp_do_bind(struct sock *sk, union sctp_addr *addr, int len) |
337 | { | 337 | { |
338 | struct net *net = sock_net(sk); | ||
338 | struct sctp_sock *sp = sctp_sk(sk); | 339 | struct sctp_sock *sp = sctp_sk(sk); |
339 | struct sctp_endpoint *ep = sp->ep; | 340 | struct sctp_endpoint *ep = sp->ep; |
340 | struct sctp_bind_addr *bp = &ep->base.bind_addr; | 341 | struct sctp_bind_addr *bp = &ep->base.bind_addr; |
341 | struct sctp_af *af; | 342 | struct sctp_af *af; |
342 | unsigned short snum; | 343 | unsigned short snum; |
343 | int ret = 0; | 344 | int ret = 0; |
344 | 345 | ||
345 | /* Common sockaddr verification. */ | 346 | /* Common sockaddr verification. */ |
346 | af = sctp_sockaddr_af(sp, addr, len); | 347 | af = sctp_sockaddr_af(sp, addr, len); |
347 | if (!af) { | 348 | if (!af) { |
348 | SCTP_DEBUG_PRINTK("sctp_do_bind(sk: %p, newaddr: %p, len: %d) EINVAL\n", | 349 | SCTP_DEBUG_PRINTK("sctp_do_bind(sk: %p, newaddr: %p, len: %d) EINVAL\n", |
349 | sk, addr, len); | 350 | sk, addr, len); |
350 | return -EINVAL; | 351 | return -EINVAL; |
351 | } | 352 | } |
352 | 353 | ||
353 | snum = ntohs(addr->v4.sin_port); | 354 | snum = ntohs(addr->v4.sin_port); |
354 | 355 | ||
355 | SCTP_DEBUG_PRINTK_IPADDR("sctp_do_bind(sk: %p, new addr: ", | 356 | SCTP_DEBUG_PRINTK_IPADDR("sctp_do_bind(sk: %p, new addr: ", |
356 | ", port: %d, new port: %d, len: %d)\n", | 357 | ", port: %d, new port: %d, len: %d)\n", |
357 | sk, | 358 | sk, |
358 | addr, | 359 | addr, |
359 | bp->port, snum, | 360 | bp->port, snum, |
360 | len); | 361 | len); |
361 | 362 | ||
362 | /* PF specific bind() address verification. */ | 363 | /* PF specific bind() address verification. */ |
363 | if (!sp->pf->bind_verify(sp, addr)) | 364 | if (!sp->pf->bind_verify(sp, addr)) |
364 | return -EADDRNOTAVAIL; | 365 | return -EADDRNOTAVAIL; |
365 | 366 | ||
366 | /* We must either be unbound, or bind to the same port. | 367 | /* We must either be unbound, or bind to the same port. |
367 | * It's OK to allow 0 ports if we are already bound. | 368 | * It's OK to allow 0 ports if we are already bound. |
368 | * We'll just inhert an already bound port in this case | 369 | * We'll just inhert an already bound port in this case |
369 | */ | 370 | */ |
370 | if (bp->port) { | 371 | if (bp->port) { |
371 | if (!snum) | 372 | if (!snum) |
372 | snum = bp->port; | 373 | snum = bp->port; |
373 | else if (snum != bp->port) { | 374 | else if (snum != bp->port) { |
374 | SCTP_DEBUG_PRINTK("sctp_do_bind:" | 375 | SCTP_DEBUG_PRINTK("sctp_do_bind:" |
375 | " New port %d does not match existing port " | 376 | " New port %d does not match existing port " |
376 | "%d.\n", snum, bp->port); | 377 | "%d.\n", snum, bp->port); |
377 | return -EINVAL; | 378 | return -EINVAL; |
378 | } | 379 | } |
379 | } | 380 | } |
380 | 381 | ||
381 | if (snum && snum < PROT_SOCK && !capable(CAP_NET_BIND_SERVICE)) | 382 | if (snum && snum < PROT_SOCK && |
383 | !ns_capable(net->user_ns, CAP_NET_BIND_SERVICE)) | ||
382 | return -EACCES; | 384 | return -EACCES; |
383 | 385 | ||
384 | /* See if the address matches any of the addresses we may have | 386 | /* See if the address matches any of the addresses we may have |
385 | * already bound before checking against other endpoints. | 387 | * already bound before checking against other endpoints. |
386 | */ | 388 | */ |
387 | if (sctp_bind_addr_match(bp, addr, sp)) | 389 | if (sctp_bind_addr_match(bp, addr, sp)) |
388 | return -EINVAL; | 390 | return -EINVAL; |
389 | 391 | ||
390 | /* Make sure we are allowed to bind here. | 392 | /* Make sure we are allowed to bind here. |
391 | * The function sctp_get_port_local() does duplicate address | 393 | * The function sctp_get_port_local() does duplicate address |
392 | * detection. | 394 | * detection. |
393 | */ | 395 | */ |
394 | addr->v4.sin_port = htons(snum); | 396 | addr->v4.sin_port = htons(snum); |
395 | if ((ret = sctp_get_port_local(sk, addr))) { | 397 | if ((ret = sctp_get_port_local(sk, addr))) { |
396 | return -EADDRINUSE; | 398 | return -EADDRINUSE; |
397 | } | 399 | } |
398 | 400 | ||
399 | /* Refresh ephemeral port. */ | 401 | /* Refresh ephemeral port. */ |
400 | if (!bp->port) | 402 | if (!bp->port) |
401 | bp->port = inet_sk(sk)->inet_num; | 403 | bp->port = inet_sk(sk)->inet_num; |
402 | 404 | ||
403 | /* Add the address to the bind address list. | 405 | /* Add the address to the bind address list. |
404 | * Use GFP_ATOMIC since BHs will be disabled. | 406 | * Use GFP_ATOMIC since BHs will be disabled. |
405 | */ | 407 | */ |
406 | ret = sctp_add_bind_addr(bp, addr, SCTP_ADDR_SRC, GFP_ATOMIC); | 408 | ret = sctp_add_bind_addr(bp, addr, SCTP_ADDR_SRC, GFP_ATOMIC); |
407 | 409 | ||
408 | /* Copy back into socket for getsockname() use. */ | 410 | /* Copy back into socket for getsockname() use. */ |
409 | if (!ret) { | 411 | if (!ret) { |
410 | inet_sk(sk)->inet_sport = htons(inet_sk(sk)->inet_num); | 412 | inet_sk(sk)->inet_sport = htons(inet_sk(sk)->inet_num); |
411 | af->to_sk_saddr(addr, sk); | 413 | af->to_sk_saddr(addr, sk); |
412 | } | 414 | } |
413 | 415 | ||
414 | return ret; | 416 | return ret; |
415 | } | 417 | } |
416 | 418 | ||
417 | /* ADDIP Section 4.1.1 Congestion Control of ASCONF Chunks | 419 | /* ADDIP Section 4.1.1 Congestion Control of ASCONF Chunks |
418 | * | 420 | * |
419 | * R1) One and only one ASCONF Chunk MAY be in transit and unacknowledged | 421 | * R1) One and only one ASCONF Chunk MAY be in transit and unacknowledged |
420 | * at any one time. If a sender, after sending an ASCONF chunk, decides | 422 | * at any one time. If a sender, after sending an ASCONF chunk, decides |
421 | * it needs to transfer another ASCONF Chunk, it MUST wait until the | 423 | * it needs to transfer another ASCONF Chunk, it MUST wait until the |
422 | * ASCONF-ACK Chunk returns from the previous ASCONF Chunk before sending a | 424 | * ASCONF-ACK Chunk returns from the previous ASCONF Chunk before sending a |
423 | * subsequent ASCONF. Note this restriction binds each side, so at any | 425 | * subsequent ASCONF. Note this restriction binds each side, so at any |
424 | * time two ASCONF may be in-transit on any given association (one sent | 426 | * time two ASCONF may be in-transit on any given association (one sent |
425 | * from each endpoint). | 427 | * from each endpoint). |
426 | */ | 428 | */ |
427 | static int sctp_send_asconf(struct sctp_association *asoc, | 429 | static int sctp_send_asconf(struct sctp_association *asoc, |
428 | struct sctp_chunk *chunk) | 430 | struct sctp_chunk *chunk) |
429 | { | 431 | { |
430 | struct net *net = sock_net(asoc->base.sk); | 432 | struct net *net = sock_net(asoc->base.sk); |
431 | int retval = 0; | 433 | int retval = 0; |
432 | 434 | ||
433 | /* If there is an outstanding ASCONF chunk, queue it for later | 435 | /* If there is an outstanding ASCONF chunk, queue it for later |
434 | * transmission. | 436 | * transmission. |
435 | */ | 437 | */ |
436 | if (asoc->addip_last_asconf) { | 438 | if (asoc->addip_last_asconf) { |
437 | list_add_tail(&chunk->list, &asoc->addip_chunk_list); | 439 | list_add_tail(&chunk->list, &asoc->addip_chunk_list); |
438 | goto out; | 440 | goto out; |
439 | } | 441 | } |
440 | 442 | ||
441 | /* Hold the chunk until an ASCONF_ACK is received. */ | 443 | /* Hold the chunk until an ASCONF_ACK is received. */ |
442 | sctp_chunk_hold(chunk); | 444 | sctp_chunk_hold(chunk); |
443 | retval = sctp_primitive_ASCONF(net, asoc, chunk); | 445 | retval = sctp_primitive_ASCONF(net, asoc, chunk); |
444 | if (retval) | 446 | if (retval) |
445 | sctp_chunk_free(chunk); | 447 | sctp_chunk_free(chunk); |
446 | else | 448 | else |
447 | asoc->addip_last_asconf = chunk; | 449 | asoc->addip_last_asconf = chunk; |
448 | 450 | ||
449 | out: | 451 | out: |
450 | return retval; | 452 | return retval; |
451 | } | 453 | } |
452 | 454 | ||
453 | /* Add a list of addresses as bind addresses to local endpoint or | 455 | /* Add a list of addresses as bind addresses to local endpoint or |
454 | * association. | 456 | * association. |
455 | * | 457 | * |
456 | * Basically run through each address specified in the addrs/addrcnt | 458 | * Basically run through each address specified in the addrs/addrcnt |
457 | * array/length pair, determine if it is IPv6 or IPv4 and call | 459 | * array/length pair, determine if it is IPv6 or IPv4 and call |
458 | * sctp_do_bind() on it. | 460 | * sctp_do_bind() on it. |
459 | * | 461 | * |
460 | * If any of them fails, then the operation will be reversed and the | 462 | * If any of them fails, then the operation will be reversed and the |
461 | * ones that were added will be removed. | 463 | * ones that were added will be removed. |
462 | * | 464 | * |
463 | * Only sctp_setsockopt_bindx() is supposed to call this function. | 465 | * Only sctp_setsockopt_bindx() is supposed to call this function. |
464 | */ | 466 | */ |
465 | static int sctp_bindx_add(struct sock *sk, struct sockaddr *addrs, int addrcnt) | 467 | static int sctp_bindx_add(struct sock *sk, struct sockaddr *addrs, int addrcnt) |
466 | { | 468 | { |
467 | int cnt; | 469 | int cnt; |
468 | int retval = 0; | 470 | int retval = 0; |
469 | void *addr_buf; | 471 | void *addr_buf; |
470 | struct sockaddr *sa_addr; | 472 | struct sockaddr *sa_addr; |
471 | struct sctp_af *af; | 473 | struct sctp_af *af; |
472 | 474 | ||
473 | SCTP_DEBUG_PRINTK("sctp_bindx_add (sk: %p, addrs: %p, addrcnt: %d)\n", | 475 | SCTP_DEBUG_PRINTK("sctp_bindx_add (sk: %p, addrs: %p, addrcnt: %d)\n", |
474 | sk, addrs, addrcnt); | 476 | sk, addrs, addrcnt); |
475 | 477 | ||
476 | addr_buf = addrs; | 478 | addr_buf = addrs; |
477 | for (cnt = 0; cnt < addrcnt; cnt++) { | 479 | for (cnt = 0; cnt < addrcnt; cnt++) { |
478 | /* The list may contain either IPv4 or IPv6 address; | 480 | /* The list may contain either IPv4 or IPv6 address; |
479 | * determine the address length for walking thru the list. | 481 | * determine the address length for walking thru the list. |
480 | */ | 482 | */ |
481 | sa_addr = addr_buf; | 483 | sa_addr = addr_buf; |
482 | af = sctp_get_af_specific(sa_addr->sa_family); | 484 | af = sctp_get_af_specific(sa_addr->sa_family); |
483 | if (!af) { | 485 | if (!af) { |
484 | retval = -EINVAL; | 486 | retval = -EINVAL; |
485 | goto err_bindx_add; | 487 | goto err_bindx_add; |
486 | } | 488 | } |
487 | 489 | ||
488 | retval = sctp_do_bind(sk, (union sctp_addr *)sa_addr, | 490 | retval = sctp_do_bind(sk, (union sctp_addr *)sa_addr, |
489 | af->sockaddr_len); | 491 | af->sockaddr_len); |
490 | 492 | ||
491 | addr_buf += af->sockaddr_len; | 493 | addr_buf += af->sockaddr_len; |
492 | 494 | ||
493 | err_bindx_add: | 495 | err_bindx_add: |
494 | if (retval < 0) { | 496 | if (retval < 0) { |
495 | /* Failed. Cleanup the ones that have been added */ | 497 | /* Failed. Cleanup the ones that have been added */ |
496 | if (cnt > 0) | 498 | if (cnt > 0) |
497 | sctp_bindx_rem(sk, addrs, cnt); | 499 | sctp_bindx_rem(sk, addrs, cnt); |
498 | return retval; | 500 | return retval; |
499 | } | 501 | } |
500 | } | 502 | } |
501 | 503 | ||
502 | return retval; | 504 | return retval; |
503 | } | 505 | } |
504 | 506 | ||
505 | /* Send an ASCONF chunk with Add IP address parameters to all the peers of the | 507 | /* Send an ASCONF chunk with Add IP address parameters to all the peers of the |
506 | * associations that are part of the endpoint indicating that a list of local | 508 | * associations that are part of the endpoint indicating that a list of local |
507 | * addresses are added to the endpoint. | 509 | * addresses are added to the endpoint. |
508 | * | 510 | * |
509 | * If any of the addresses is already in the bind address list of the | 511 | * If any of the addresses is already in the bind address list of the |
510 | * association, we do not send the chunk for that association. But it will not | 512 | * association, we do not send the chunk for that association. But it will not |
511 | * affect other associations. | 513 | * affect other associations. |
512 | * | 514 | * |
513 | * Only sctp_setsockopt_bindx() is supposed to call this function. | 515 | * Only sctp_setsockopt_bindx() is supposed to call this function. |
514 | */ | 516 | */ |
515 | static int sctp_send_asconf_add_ip(struct sock *sk, | 517 | static int sctp_send_asconf_add_ip(struct sock *sk, |
516 | struct sockaddr *addrs, | 518 | struct sockaddr *addrs, |
517 | int addrcnt) | 519 | int addrcnt) |
518 | { | 520 | { |
519 | struct net *net = sock_net(sk); | 521 | struct net *net = sock_net(sk); |
520 | struct sctp_sock *sp; | 522 | struct sctp_sock *sp; |
521 | struct sctp_endpoint *ep; | 523 | struct sctp_endpoint *ep; |
522 | struct sctp_association *asoc; | 524 | struct sctp_association *asoc; |
523 | struct sctp_bind_addr *bp; | 525 | struct sctp_bind_addr *bp; |
524 | struct sctp_chunk *chunk; | 526 | struct sctp_chunk *chunk; |
525 | struct sctp_sockaddr_entry *laddr; | 527 | struct sctp_sockaddr_entry *laddr; |
526 | union sctp_addr *addr; | 528 | union sctp_addr *addr; |
527 | union sctp_addr saveaddr; | 529 | union sctp_addr saveaddr; |
528 | void *addr_buf; | 530 | void *addr_buf; |
529 | struct sctp_af *af; | 531 | struct sctp_af *af; |
530 | struct list_head *p; | 532 | struct list_head *p; |
531 | int i; | 533 | int i; |
532 | int retval = 0; | 534 | int retval = 0; |
533 | 535 | ||
534 | if (!net->sctp.addip_enable) | 536 | if (!net->sctp.addip_enable) |
535 | return retval; | 537 | return retval; |
536 | 538 | ||
537 | sp = sctp_sk(sk); | 539 | sp = sctp_sk(sk); |
538 | ep = sp->ep; | 540 | ep = sp->ep; |
539 | 541 | ||
540 | SCTP_DEBUG_PRINTK("%s: (sk: %p, addrs: %p, addrcnt: %d)\n", | 542 | SCTP_DEBUG_PRINTK("%s: (sk: %p, addrs: %p, addrcnt: %d)\n", |
541 | __func__, sk, addrs, addrcnt); | 543 | __func__, sk, addrs, addrcnt); |
542 | 544 | ||
543 | list_for_each_entry(asoc, &ep->asocs, asocs) { | 545 | list_for_each_entry(asoc, &ep->asocs, asocs) { |
544 | 546 | ||
545 | if (!asoc->peer.asconf_capable) | 547 | if (!asoc->peer.asconf_capable) |
546 | continue; | 548 | continue; |
547 | 549 | ||
548 | if (asoc->peer.addip_disabled_mask & SCTP_PARAM_ADD_IP) | 550 | if (asoc->peer.addip_disabled_mask & SCTP_PARAM_ADD_IP) |
549 | continue; | 551 | continue; |
550 | 552 | ||
551 | if (!sctp_state(asoc, ESTABLISHED)) | 553 | if (!sctp_state(asoc, ESTABLISHED)) |
552 | continue; | 554 | continue; |
553 | 555 | ||
554 | /* Check if any address in the packed array of addresses is | 556 | /* Check if any address in the packed array of addresses is |
555 | * in the bind address list of the association. If so, | 557 | * in the bind address list of the association. If so, |
556 | * do not send the asconf chunk to its peer, but continue with | 558 | * do not send the asconf chunk to its peer, but continue with |
557 | * other associations. | 559 | * other associations. |
558 | */ | 560 | */ |
559 | addr_buf = addrs; | 561 | addr_buf = addrs; |
560 | for (i = 0; i < addrcnt; i++) { | 562 | for (i = 0; i < addrcnt; i++) { |
561 | addr = addr_buf; | 563 | addr = addr_buf; |
562 | af = sctp_get_af_specific(addr->v4.sin_family); | 564 | af = sctp_get_af_specific(addr->v4.sin_family); |
563 | if (!af) { | 565 | if (!af) { |
564 | retval = -EINVAL; | 566 | retval = -EINVAL; |
565 | goto out; | 567 | goto out; |
566 | } | 568 | } |
567 | 569 | ||
568 | if (sctp_assoc_lookup_laddr(asoc, addr)) | 570 | if (sctp_assoc_lookup_laddr(asoc, addr)) |
569 | break; | 571 | break; |
570 | 572 | ||
571 | addr_buf += af->sockaddr_len; | 573 | addr_buf += af->sockaddr_len; |
572 | } | 574 | } |
573 | if (i < addrcnt) | 575 | if (i < addrcnt) |
574 | continue; | 576 | continue; |
575 | 577 | ||
576 | /* Use the first valid address in bind addr list of | 578 | /* Use the first valid address in bind addr list of |
577 | * association as Address Parameter of ASCONF CHUNK. | 579 | * association as Address Parameter of ASCONF CHUNK. |
578 | */ | 580 | */ |
579 | bp = &asoc->base.bind_addr; | 581 | bp = &asoc->base.bind_addr; |
580 | p = bp->address_list.next; | 582 | p = bp->address_list.next; |
581 | laddr = list_entry(p, struct sctp_sockaddr_entry, list); | 583 | laddr = list_entry(p, struct sctp_sockaddr_entry, list); |
582 | chunk = sctp_make_asconf_update_ip(asoc, &laddr->a, addrs, | 584 | chunk = sctp_make_asconf_update_ip(asoc, &laddr->a, addrs, |
583 | addrcnt, SCTP_PARAM_ADD_IP); | 585 | addrcnt, SCTP_PARAM_ADD_IP); |
584 | if (!chunk) { | 586 | if (!chunk) { |
585 | retval = -ENOMEM; | 587 | retval = -ENOMEM; |
586 | goto out; | 588 | goto out; |
587 | } | 589 | } |
588 | 590 | ||
589 | /* Add the new addresses to the bind address list with | 591 | /* Add the new addresses to the bind address list with |
590 | * use_as_src set to 0. | 592 | * use_as_src set to 0. |
591 | */ | 593 | */ |
592 | addr_buf = addrs; | 594 | addr_buf = addrs; |
593 | for (i = 0; i < addrcnt; i++) { | 595 | for (i = 0; i < addrcnt; i++) { |
594 | addr = addr_buf; | 596 | addr = addr_buf; |
595 | af = sctp_get_af_specific(addr->v4.sin_family); | 597 | af = sctp_get_af_specific(addr->v4.sin_family); |
596 | memcpy(&saveaddr, addr, af->sockaddr_len); | 598 | memcpy(&saveaddr, addr, af->sockaddr_len); |
597 | retval = sctp_add_bind_addr(bp, &saveaddr, | 599 | retval = sctp_add_bind_addr(bp, &saveaddr, |
598 | SCTP_ADDR_NEW, GFP_ATOMIC); | 600 | SCTP_ADDR_NEW, GFP_ATOMIC); |
599 | addr_buf += af->sockaddr_len; | 601 | addr_buf += af->sockaddr_len; |
600 | } | 602 | } |
601 | if (asoc->src_out_of_asoc_ok) { | 603 | if (asoc->src_out_of_asoc_ok) { |
602 | struct sctp_transport *trans; | 604 | struct sctp_transport *trans; |
603 | 605 | ||
604 | list_for_each_entry(trans, | 606 | list_for_each_entry(trans, |
605 | &asoc->peer.transport_addr_list, transports) { | 607 | &asoc->peer.transport_addr_list, transports) { |
606 | /* Clear the source and route cache */ | 608 | /* Clear the source and route cache */ |
607 | dst_release(trans->dst); | 609 | dst_release(trans->dst); |
608 | trans->cwnd = min(4*asoc->pathmtu, max_t(__u32, | 610 | trans->cwnd = min(4*asoc->pathmtu, max_t(__u32, |
609 | 2*asoc->pathmtu, 4380)); | 611 | 2*asoc->pathmtu, 4380)); |
610 | trans->ssthresh = asoc->peer.i.a_rwnd; | 612 | trans->ssthresh = asoc->peer.i.a_rwnd; |
611 | trans->rto = asoc->rto_initial; | 613 | trans->rto = asoc->rto_initial; |
612 | trans->rtt = trans->srtt = trans->rttvar = 0; | 614 | trans->rtt = trans->srtt = trans->rttvar = 0; |
613 | sctp_transport_route(trans, NULL, | 615 | sctp_transport_route(trans, NULL, |
614 | sctp_sk(asoc->base.sk)); | 616 | sctp_sk(asoc->base.sk)); |
615 | } | 617 | } |
616 | } | 618 | } |
617 | retval = sctp_send_asconf(asoc, chunk); | 619 | retval = sctp_send_asconf(asoc, chunk); |
618 | } | 620 | } |
619 | 621 | ||
620 | out: | 622 | out: |
621 | return retval; | 623 | return retval; |
622 | } | 624 | } |
623 | 625 | ||
624 | /* Remove a list of addresses from bind addresses list. Do not remove the | 626 | /* Remove a list of addresses from bind addresses list. Do not remove the |
625 | * last address. | 627 | * last address. |
626 | * | 628 | * |
627 | * Basically run through each address specified in the addrs/addrcnt | 629 | * Basically run through each address specified in the addrs/addrcnt |
628 | * array/length pair, determine if it is IPv6 or IPv4 and call | 630 | * array/length pair, determine if it is IPv6 or IPv4 and call |
629 | * sctp_del_bind() on it. | 631 | * sctp_del_bind() on it. |
630 | * | 632 | * |
631 | * If any of them fails, then the operation will be reversed and the | 633 | * If any of them fails, then the operation will be reversed and the |
632 | * ones that were removed will be added back. | 634 | * ones that were removed will be added back. |
633 | * | 635 | * |
634 | * At least one address has to be left; if only one address is | 636 | * At least one address has to be left; if only one address is |
635 | * available, the operation will return -EBUSY. | 637 | * available, the operation will return -EBUSY. |
636 | * | 638 | * |
637 | * Only sctp_setsockopt_bindx() is supposed to call this function. | 639 | * Only sctp_setsockopt_bindx() is supposed to call this function. |
638 | */ | 640 | */ |
639 | static int sctp_bindx_rem(struct sock *sk, struct sockaddr *addrs, int addrcnt) | 641 | static int sctp_bindx_rem(struct sock *sk, struct sockaddr *addrs, int addrcnt) |
640 | { | 642 | { |
641 | struct sctp_sock *sp = sctp_sk(sk); | 643 | struct sctp_sock *sp = sctp_sk(sk); |
642 | struct sctp_endpoint *ep = sp->ep; | 644 | struct sctp_endpoint *ep = sp->ep; |
643 | int cnt; | 645 | int cnt; |
644 | struct sctp_bind_addr *bp = &ep->base.bind_addr; | 646 | struct sctp_bind_addr *bp = &ep->base.bind_addr; |
645 | int retval = 0; | 647 | int retval = 0; |
646 | void *addr_buf; | 648 | void *addr_buf; |
647 | union sctp_addr *sa_addr; | 649 | union sctp_addr *sa_addr; |
648 | struct sctp_af *af; | 650 | struct sctp_af *af; |
649 | 651 | ||
650 | SCTP_DEBUG_PRINTK("sctp_bindx_rem (sk: %p, addrs: %p, addrcnt: %d)\n", | 652 | SCTP_DEBUG_PRINTK("sctp_bindx_rem (sk: %p, addrs: %p, addrcnt: %d)\n", |
651 | sk, addrs, addrcnt); | 653 | sk, addrs, addrcnt); |
652 | 654 | ||
653 | addr_buf = addrs; | 655 | addr_buf = addrs; |
654 | for (cnt = 0; cnt < addrcnt; cnt++) { | 656 | for (cnt = 0; cnt < addrcnt; cnt++) { |
655 | /* If the bind address list is empty or if there is only one | 657 | /* If the bind address list is empty or if there is only one |
656 | * bind address, there is nothing more to be removed (we need | 658 | * bind address, there is nothing more to be removed (we need |
657 | * at least one address here). | 659 | * at least one address here). |
658 | */ | 660 | */ |
659 | if (list_empty(&bp->address_list) || | 661 | if (list_empty(&bp->address_list) || |
660 | (sctp_list_single_entry(&bp->address_list))) { | 662 | (sctp_list_single_entry(&bp->address_list))) { |
661 | retval = -EBUSY; | 663 | retval = -EBUSY; |
662 | goto err_bindx_rem; | 664 | goto err_bindx_rem; |
663 | } | 665 | } |
664 | 666 | ||
665 | sa_addr = addr_buf; | 667 | sa_addr = addr_buf; |
666 | af = sctp_get_af_specific(sa_addr->sa.sa_family); | 668 | af = sctp_get_af_specific(sa_addr->sa.sa_family); |
667 | if (!af) { | 669 | if (!af) { |
668 | retval = -EINVAL; | 670 | retval = -EINVAL; |
669 | goto err_bindx_rem; | 671 | goto err_bindx_rem; |
670 | } | 672 | } |
671 | 673 | ||
672 | if (!af->addr_valid(sa_addr, sp, NULL)) { | 674 | if (!af->addr_valid(sa_addr, sp, NULL)) { |
673 | retval = -EADDRNOTAVAIL; | 675 | retval = -EADDRNOTAVAIL; |
674 | goto err_bindx_rem; | 676 | goto err_bindx_rem; |
675 | } | 677 | } |
676 | 678 | ||
677 | if (sa_addr->v4.sin_port && | 679 | if (sa_addr->v4.sin_port && |
678 | sa_addr->v4.sin_port != htons(bp->port)) { | 680 | sa_addr->v4.sin_port != htons(bp->port)) { |
679 | retval = -EINVAL; | 681 | retval = -EINVAL; |
680 | goto err_bindx_rem; | 682 | goto err_bindx_rem; |
681 | } | 683 | } |
682 | 684 | ||
683 | if (!sa_addr->v4.sin_port) | 685 | if (!sa_addr->v4.sin_port) |
684 | sa_addr->v4.sin_port = htons(bp->port); | 686 | sa_addr->v4.sin_port = htons(bp->port); |
685 | 687 | ||
686 | /* FIXME - There is probably a need to check if sk->sk_saddr and | 688 | /* FIXME - There is probably a need to check if sk->sk_saddr and |
687 | * sk->sk_rcv_addr are currently set to one of the addresses to | 689 | * sk->sk_rcv_addr are currently set to one of the addresses to |
688 | * be removed. This is something which needs to be looked into | 690 | * be removed. This is something which needs to be looked into |
689 | * when we are fixing the outstanding issues with multi-homing | 691 | * when we are fixing the outstanding issues with multi-homing |
690 | * socket routing and failover schemes. Refer to comments in | 692 | * socket routing and failover schemes. Refer to comments in |
691 | * sctp_do_bind(). -daisy | 693 | * sctp_do_bind(). -daisy |
692 | */ | 694 | */ |
693 | retval = sctp_del_bind_addr(bp, sa_addr); | 695 | retval = sctp_del_bind_addr(bp, sa_addr); |
694 | 696 | ||
695 | addr_buf += af->sockaddr_len; | 697 | addr_buf += af->sockaddr_len; |
696 | err_bindx_rem: | 698 | err_bindx_rem: |
697 | if (retval < 0) { | 699 | if (retval < 0) { |
698 | /* Failed. Add the ones that has been removed back */ | 700 | /* Failed. Add the ones that has been removed back */ |
699 | if (cnt > 0) | 701 | if (cnt > 0) |
700 | sctp_bindx_add(sk, addrs, cnt); | 702 | sctp_bindx_add(sk, addrs, cnt); |
701 | return retval; | 703 | return retval; |
702 | } | 704 | } |
703 | } | 705 | } |
704 | 706 | ||
705 | return retval; | 707 | return retval; |
706 | } | 708 | } |
707 | 709 | ||
708 | /* Send an ASCONF chunk with Delete IP address parameters to all the peers of | 710 | /* Send an ASCONF chunk with Delete IP address parameters to all the peers of |
709 | * the associations that are part of the endpoint indicating that a list of | 711 | * the associations that are part of the endpoint indicating that a list of |
710 | * local addresses are removed from the endpoint. | 712 | * local addresses are removed from the endpoint. |
711 | * | 713 | * |
712 | * If any of the addresses is already in the bind address list of the | 714 | * If any of the addresses is already in the bind address list of the |
713 | * association, we do not send the chunk for that association. But it will not | 715 | * association, we do not send the chunk for that association. But it will not |
714 | * affect other associations. | 716 | * affect other associations. |
715 | * | 717 | * |
716 | * Only sctp_setsockopt_bindx() is supposed to call this function. | 718 | * Only sctp_setsockopt_bindx() is supposed to call this function. |
717 | */ | 719 | */ |
718 | static int sctp_send_asconf_del_ip(struct sock *sk, | 720 | static int sctp_send_asconf_del_ip(struct sock *sk, |
719 | struct sockaddr *addrs, | 721 | struct sockaddr *addrs, |
720 | int addrcnt) | 722 | int addrcnt) |
721 | { | 723 | { |
722 | struct net *net = sock_net(sk); | 724 | struct net *net = sock_net(sk); |
723 | struct sctp_sock *sp; | 725 | struct sctp_sock *sp; |
724 | struct sctp_endpoint *ep; | 726 | struct sctp_endpoint *ep; |
725 | struct sctp_association *asoc; | 727 | struct sctp_association *asoc; |
726 | struct sctp_transport *transport; | 728 | struct sctp_transport *transport; |
727 | struct sctp_bind_addr *bp; | 729 | struct sctp_bind_addr *bp; |
728 | struct sctp_chunk *chunk; | 730 | struct sctp_chunk *chunk; |
729 | union sctp_addr *laddr; | 731 | union sctp_addr *laddr; |
730 | void *addr_buf; | 732 | void *addr_buf; |
731 | struct sctp_af *af; | 733 | struct sctp_af *af; |
732 | struct sctp_sockaddr_entry *saddr; | 734 | struct sctp_sockaddr_entry *saddr; |
733 | int i; | 735 | int i; |
734 | int retval = 0; | 736 | int retval = 0; |
735 | int stored = 0; | 737 | int stored = 0; |
736 | 738 | ||
737 | chunk = NULL; | 739 | chunk = NULL; |
738 | if (!net->sctp.addip_enable) | 740 | if (!net->sctp.addip_enable) |
739 | return retval; | 741 | return retval; |
740 | 742 | ||
741 | sp = sctp_sk(sk); | 743 | sp = sctp_sk(sk); |
742 | ep = sp->ep; | 744 | ep = sp->ep; |
743 | 745 | ||
744 | SCTP_DEBUG_PRINTK("%s: (sk: %p, addrs: %p, addrcnt: %d)\n", | 746 | SCTP_DEBUG_PRINTK("%s: (sk: %p, addrs: %p, addrcnt: %d)\n", |
745 | __func__, sk, addrs, addrcnt); | 747 | __func__, sk, addrs, addrcnt); |
746 | 748 | ||
747 | list_for_each_entry(asoc, &ep->asocs, asocs) { | 749 | list_for_each_entry(asoc, &ep->asocs, asocs) { |
748 | 750 | ||
749 | if (!asoc->peer.asconf_capable) | 751 | if (!asoc->peer.asconf_capable) |
750 | continue; | 752 | continue; |
751 | 753 | ||
752 | if (asoc->peer.addip_disabled_mask & SCTP_PARAM_DEL_IP) | 754 | if (asoc->peer.addip_disabled_mask & SCTP_PARAM_DEL_IP) |
753 | continue; | 755 | continue; |
754 | 756 | ||
755 | if (!sctp_state(asoc, ESTABLISHED)) | 757 | if (!sctp_state(asoc, ESTABLISHED)) |
756 | continue; | 758 | continue; |
757 | 759 | ||
758 | /* Check if any address in the packed array of addresses is | 760 | /* Check if any address in the packed array of addresses is |
759 | * not present in the bind address list of the association. | 761 | * not present in the bind address list of the association. |
760 | * If so, do not send the asconf chunk to its peer, but | 762 | * If so, do not send the asconf chunk to its peer, but |
761 | * continue with other associations. | 763 | * continue with other associations. |
762 | */ | 764 | */ |
763 | addr_buf = addrs; | 765 | addr_buf = addrs; |
764 | for (i = 0; i < addrcnt; i++) { | 766 | for (i = 0; i < addrcnt; i++) { |
765 | laddr = addr_buf; | 767 | laddr = addr_buf; |
766 | af = sctp_get_af_specific(laddr->v4.sin_family); | 768 | af = sctp_get_af_specific(laddr->v4.sin_family); |
767 | if (!af) { | 769 | if (!af) { |
768 | retval = -EINVAL; | 770 | retval = -EINVAL; |
769 | goto out; | 771 | goto out; |
770 | } | 772 | } |
771 | 773 | ||
772 | if (!sctp_assoc_lookup_laddr(asoc, laddr)) | 774 | if (!sctp_assoc_lookup_laddr(asoc, laddr)) |
773 | break; | 775 | break; |
774 | 776 | ||
775 | addr_buf += af->sockaddr_len; | 777 | addr_buf += af->sockaddr_len; |
776 | } | 778 | } |
777 | if (i < addrcnt) | 779 | if (i < addrcnt) |
778 | continue; | 780 | continue; |
779 | 781 | ||
780 | /* Find one address in the association's bind address list | 782 | /* Find one address in the association's bind address list |
781 | * that is not in the packed array of addresses. This is to | 783 | * that is not in the packed array of addresses. This is to |
782 | * make sure that we do not delete all the addresses in the | 784 | * make sure that we do not delete all the addresses in the |
783 | * association. | 785 | * association. |
784 | */ | 786 | */ |
785 | bp = &asoc->base.bind_addr; | 787 | bp = &asoc->base.bind_addr; |
786 | laddr = sctp_find_unmatch_addr(bp, (union sctp_addr *)addrs, | 788 | laddr = sctp_find_unmatch_addr(bp, (union sctp_addr *)addrs, |
787 | addrcnt, sp); | 789 | addrcnt, sp); |
788 | if ((laddr == NULL) && (addrcnt == 1)) { | 790 | if ((laddr == NULL) && (addrcnt == 1)) { |
789 | if (asoc->asconf_addr_del_pending) | 791 | if (asoc->asconf_addr_del_pending) |
790 | continue; | 792 | continue; |
791 | asoc->asconf_addr_del_pending = | 793 | asoc->asconf_addr_del_pending = |
792 | kzalloc(sizeof(union sctp_addr), GFP_ATOMIC); | 794 | kzalloc(sizeof(union sctp_addr), GFP_ATOMIC); |
793 | if (asoc->asconf_addr_del_pending == NULL) { | 795 | if (asoc->asconf_addr_del_pending == NULL) { |
794 | retval = -ENOMEM; | 796 | retval = -ENOMEM; |
795 | goto out; | 797 | goto out; |
796 | } | 798 | } |
797 | asoc->asconf_addr_del_pending->sa.sa_family = | 799 | asoc->asconf_addr_del_pending->sa.sa_family = |
798 | addrs->sa_family; | 800 | addrs->sa_family; |
799 | asoc->asconf_addr_del_pending->v4.sin_port = | 801 | asoc->asconf_addr_del_pending->v4.sin_port = |
800 | htons(bp->port); | 802 | htons(bp->port); |
801 | if (addrs->sa_family == AF_INET) { | 803 | if (addrs->sa_family == AF_INET) { |
802 | struct sockaddr_in *sin; | 804 | struct sockaddr_in *sin; |
803 | 805 | ||
804 | sin = (struct sockaddr_in *)addrs; | 806 | sin = (struct sockaddr_in *)addrs; |
805 | asoc->asconf_addr_del_pending->v4.sin_addr.s_addr = sin->sin_addr.s_addr; | 807 | asoc->asconf_addr_del_pending->v4.sin_addr.s_addr = sin->sin_addr.s_addr; |
806 | } else if (addrs->sa_family == AF_INET6) { | 808 | } else if (addrs->sa_family == AF_INET6) { |
807 | struct sockaddr_in6 *sin6; | 809 | struct sockaddr_in6 *sin6; |
808 | 810 | ||
809 | sin6 = (struct sockaddr_in6 *)addrs; | 811 | sin6 = (struct sockaddr_in6 *)addrs; |
810 | asoc->asconf_addr_del_pending->v6.sin6_addr = sin6->sin6_addr; | 812 | asoc->asconf_addr_del_pending->v6.sin6_addr = sin6->sin6_addr; |
811 | } | 813 | } |
812 | SCTP_DEBUG_PRINTK_IPADDR("send_asconf_del_ip: keep the last address asoc: %p ", | 814 | SCTP_DEBUG_PRINTK_IPADDR("send_asconf_del_ip: keep the last address asoc: %p ", |
813 | " at %p\n", asoc, asoc->asconf_addr_del_pending, | 815 | " at %p\n", asoc, asoc->asconf_addr_del_pending, |
814 | asoc->asconf_addr_del_pending); | 816 | asoc->asconf_addr_del_pending); |
815 | asoc->src_out_of_asoc_ok = 1; | 817 | asoc->src_out_of_asoc_ok = 1; |
816 | stored = 1; | 818 | stored = 1; |
817 | goto skip_mkasconf; | 819 | goto skip_mkasconf; |
818 | } | 820 | } |
819 | 821 | ||
820 | /* We do not need RCU protection throughout this loop | 822 | /* We do not need RCU protection throughout this loop |
821 | * because this is done under a socket lock from the | 823 | * because this is done under a socket lock from the |
822 | * setsockopt call. | 824 | * setsockopt call. |
823 | */ | 825 | */ |
824 | chunk = sctp_make_asconf_update_ip(asoc, laddr, addrs, addrcnt, | 826 | chunk = sctp_make_asconf_update_ip(asoc, laddr, addrs, addrcnt, |
825 | SCTP_PARAM_DEL_IP); | 827 | SCTP_PARAM_DEL_IP); |
826 | if (!chunk) { | 828 | if (!chunk) { |
827 | retval = -ENOMEM; | 829 | retval = -ENOMEM; |
828 | goto out; | 830 | goto out; |
829 | } | 831 | } |
830 | 832 | ||
831 | skip_mkasconf: | 833 | skip_mkasconf: |
832 | /* Reset use_as_src flag for the addresses in the bind address | 834 | /* Reset use_as_src flag for the addresses in the bind address |
833 | * list that are to be deleted. | 835 | * list that are to be deleted. |
834 | */ | 836 | */ |
835 | addr_buf = addrs; | 837 | addr_buf = addrs; |
836 | for (i = 0; i < addrcnt; i++) { | 838 | for (i = 0; i < addrcnt; i++) { |
837 | laddr = addr_buf; | 839 | laddr = addr_buf; |
838 | af = sctp_get_af_specific(laddr->v4.sin_family); | 840 | af = sctp_get_af_specific(laddr->v4.sin_family); |
839 | list_for_each_entry(saddr, &bp->address_list, list) { | 841 | list_for_each_entry(saddr, &bp->address_list, list) { |
840 | if (sctp_cmp_addr_exact(&saddr->a, laddr)) | 842 | if (sctp_cmp_addr_exact(&saddr->a, laddr)) |
841 | saddr->state = SCTP_ADDR_DEL; | 843 | saddr->state = SCTP_ADDR_DEL; |
842 | } | 844 | } |
843 | addr_buf += af->sockaddr_len; | 845 | addr_buf += af->sockaddr_len; |
844 | } | 846 | } |
845 | 847 | ||
846 | /* Update the route and saddr entries for all the transports | 848 | /* Update the route and saddr entries for all the transports |
847 | * as some of the addresses in the bind address list are | 849 | * as some of the addresses in the bind address list are |
848 | * about to be deleted and cannot be used as source addresses. | 850 | * about to be deleted and cannot be used as source addresses. |
849 | */ | 851 | */ |
850 | list_for_each_entry(transport, &asoc->peer.transport_addr_list, | 852 | list_for_each_entry(transport, &asoc->peer.transport_addr_list, |
851 | transports) { | 853 | transports) { |
852 | dst_release(transport->dst); | 854 | dst_release(transport->dst); |
853 | sctp_transport_route(transport, NULL, | 855 | sctp_transport_route(transport, NULL, |
854 | sctp_sk(asoc->base.sk)); | 856 | sctp_sk(asoc->base.sk)); |
855 | } | 857 | } |
856 | 858 | ||
857 | if (stored) | 859 | if (stored) |
858 | /* We don't need to transmit ASCONF */ | 860 | /* We don't need to transmit ASCONF */ |
859 | continue; | 861 | continue; |
860 | retval = sctp_send_asconf(asoc, chunk); | 862 | retval = sctp_send_asconf(asoc, chunk); |
861 | } | 863 | } |
862 | out: | 864 | out: |
863 | return retval; | 865 | return retval; |
864 | } | 866 | } |
865 | 867 | ||
866 | /* set addr events to assocs in the endpoint. ep and addr_wq must be locked */ | 868 | /* set addr events to assocs in the endpoint. ep and addr_wq must be locked */ |
867 | int sctp_asconf_mgmt(struct sctp_sock *sp, struct sctp_sockaddr_entry *addrw) | 869 | int sctp_asconf_mgmt(struct sctp_sock *sp, struct sctp_sockaddr_entry *addrw) |
868 | { | 870 | { |
869 | struct sock *sk = sctp_opt2sk(sp); | 871 | struct sock *sk = sctp_opt2sk(sp); |
870 | union sctp_addr *addr; | 872 | union sctp_addr *addr; |
871 | struct sctp_af *af; | 873 | struct sctp_af *af; |
872 | 874 | ||
873 | /* It is safe to write port space in caller. */ | 875 | /* It is safe to write port space in caller. */ |
874 | addr = &addrw->a; | 876 | addr = &addrw->a; |
875 | addr->v4.sin_port = htons(sp->ep->base.bind_addr.port); | 877 | addr->v4.sin_port = htons(sp->ep->base.bind_addr.port); |
876 | af = sctp_get_af_specific(addr->sa.sa_family); | 878 | af = sctp_get_af_specific(addr->sa.sa_family); |
877 | if (!af) | 879 | if (!af) |
878 | return -EINVAL; | 880 | return -EINVAL; |
879 | if (sctp_verify_addr(sk, addr, af->sockaddr_len)) | 881 | if (sctp_verify_addr(sk, addr, af->sockaddr_len)) |
880 | return -EINVAL; | 882 | return -EINVAL; |
881 | 883 | ||
882 | if (addrw->state == SCTP_ADDR_NEW) | 884 | if (addrw->state == SCTP_ADDR_NEW) |
883 | return sctp_send_asconf_add_ip(sk, (struct sockaddr *)addr, 1); | 885 | return sctp_send_asconf_add_ip(sk, (struct sockaddr *)addr, 1); |
884 | else | 886 | else |
885 | return sctp_send_asconf_del_ip(sk, (struct sockaddr *)addr, 1); | 887 | return sctp_send_asconf_del_ip(sk, (struct sockaddr *)addr, 1); |
886 | } | 888 | } |
887 | 889 | ||
888 | /* Helper for tunneling sctp_bindx() requests through sctp_setsockopt() | 890 | /* Helper for tunneling sctp_bindx() requests through sctp_setsockopt() |
889 | * | 891 | * |
890 | * API 8.1 | 892 | * API 8.1 |
891 | * int sctp_bindx(int sd, struct sockaddr *addrs, int addrcnt, | 893 | * int sctp_bindx(int sd, struct sockaddr *addrs, int addrcnt, |
892 | * int flags); | 894 | * int flags); |
893 | * | 895 | * |
894 | * If sd is an IPv4 socket, the addresses passed must be IPv4 addresses. | 896 | * If sd is an IPv4 socket, the addresses passed must be IPv4 addresses. |
895 | * If the sd is an IPv6 socket, the addresses passed can either be IPv4 | 897 | * If the sd is an IPv6 socket, the addresses passed can either be IPv4 |
896 | * or IPv6 addresses. | 898 | * or IPv6 addresses. |
897 | * | 899 | * |
898 | * A single address may be specified as INADDR_ANY or IN6ADDR_ANY, see | 900 | * A single address may be specified as INADDR_ANY or IN6ADDR_ANY, see |
899 | * Section 3.1.2 for this usage. | 901 | * Section 3.1.2 for this usage. |
900 | * | 902 | * |
901 | * addrs is a pointer to an array of one or more socket addresses. Each | 903 | * addrs is a pointer to an array of one or more socket addresses. Each |
902 | * address is contained in its appropriate structure (i.e. struct | 904 | * address is contained in its appropriate structure (i.e. struct |
903 | * sockaddr_in or struct sockaddr_in6) the family of the address type | 905 | * sockaddr_in or struct sockaddr_in6) the family of the address type |
904 | * must be used to distinguish the address length (note that this | 906 | * must be used to distinguish the address length (note that this |
905 | * representation is termed a "packed array" of addresses). The caller | 907 | * representation is termed a "packed array" of addresses). The caller |
906 | * specifies the number of addresses in the array with addrcnt. | 908 | * specifies the number of addresses in the array with addrcnt. |
907 | * | 909 | * |
908 | * On success, sctp_bindx() returns 0. On failure, sctp_bindx() returns | 910 | * On success, sctp_bindx() returns 0. On failure, sctp_bindx() returns |
909 | * -1, and sets errno to the appropriate error code. | 911 | * -1, and sets errno to the appropriate error code. |
910 | * | 912 | * |
911 | * For SCTP, the port given in each socket address must be the same, or | 913 | * For SCTP, the port given in each socket address must be the same, or |
912 | * sctp_bindx() will fail, setting errno to EINVAL. | 914 | * sctp_bindx() will fail, setting errno to EINVAL. |
913 | * | 915 | * |
914 | * The flags parameter is formed from the bitwise OR of zero or more of | 916 | * The flags parameter is formed from the bitwise OR of zero or more of |
915 | * the following currently defined flags: | 917 | * the following currently defined flags: |
916 | * | 918 | * |
917 | * SCTP_BINDX_ADD_ADDR | 919 | * SCTP_BINDX_ADD_ADDR |
918 | * | 920 | * |
919 | * SCTP_BINDX_REM_ADDR | 921 | * SCTP_BINDX_REM_ADDR |
920 | * | 922 | * |
921 | * SCTP_BINDX_ADD_ADDR directs SCTP to add the given addresses to the | 923 | * SCTP_BINDX_ADD_ADDR directs SCTP to add the given addresses to the |
922 | * association, and SCTP_BINDX_REM_ADDR directs SCTP to remove the given | 924 | * association, and SCTP_BINDX_REM_ADDR directs SCTP to remove the given |
923 | * addresses from the association. The two flags are mutually exclusive; | 925 | * addresses from the association. The two flags are mutually exclusive; |
924 | * if both are given, sctp_bindx() will fail with EINVAL. A caller may | 926 | * if both are given, sctp_bindx() will fail with EINVAL. A caller may |
925 | * not remove all addresses from an association; sctp_bindx() will | 927 | * not remove all addresses from an association; sctp_bindx() will |
926 | * reject such an attempt with EINVAL. | 928 | * reject such an attempt with EINVAL. |
927 | * | 929 | * |
928 | * An application can use sctp_bindx(SCTP_BINDX_ADD_ADDR) to associate | 930 | * An application can use sctp_bindx(SCTP_BINDX_ADD_ADDR) to associate |
929 | * additional addresses with an endpoint after calling bind(). Or use | 931 | * additional addresses with an endpoint after calling bind(). Or use |
930 | * sctp_bindx(SCTP_BINDX_REM_ADDR) to remove some addresses a listening | 932 | * sctp_bindx(SCTP_BINDX_REM_ADDR) to remove some addresses a listening |
931 | * socket is associated with so that no new association accepted will be | 933 | * socket is associated with so that no new association accepted will be |
932 | * associated with those addresses. If the endpoint supports dynamic | 934 | * associated with those addresses. If the endpoint supports dynamic |
933 | * address a SCTP_BINDX_REM_ADDR or SCTP_BINDX_ADD_ADDR may cause a | 935 | * address a SCTP_BINDX_REM_ADDR or SCTP_BINDX_ADD_ADDR may cause a |
934 | * endpoint to send the appropriate message to the peer to change the | 936 | * endpoint to send the appropriate message to the peer to change the |
935 | * peers address lists. | 937 | * peers address lists. |
936 | * | 938 | * |
937 | * Adding and removing addresses from a connected association is | 939 | * Adding and removing addresses from a connected association is |
938 | * optional functionality. Implementations that do not support this | 940 | * optional functionality. Implementations that do not support this |
939 | * functionality should return EOPNOTSUPP. | 941 | * functionality should return EOPNOTSUPP. |
940 | * | 942 | * |
941 | * Basically do nothing but copying the addresses from user to kernel | 943 | * Basically do nothing but copying the addresses from user to kernel |
942 | * land and invoking either sctp_bindx_add() or sctp_bindx_rem() on the sk. | 944 | * land and invoking either sctp_bindx_add() or sctp_bindx_rem() on the sk. |
943 | * This is used for tunneling the sctp_bindx() request through sctp_setsockopt() | 945 | * This is used for tunneling the sctp_bindx() request through sctp_setsockopt() |
944 | * from userspace. | 946 | * from userspace. |
945 | * | 947 | * |
946 | * We don't use copy_from_user() for optimization: we first do the | 948 | * We don't use copy_from_user() for optimization: we first do the |
947 | * sanity checks (buffer size -fast- and access check-healthy | 949 | * sanity checks (buffer size -fast- and access check-healthy |
948 | * pointer); if all of those succeed, then we can alloc the memory | 950 | * pointer); if all of those succeed, then we can alloc the memory |
949 | * (expensive operation) needed to copy the data to kernel. Then we do | 951 | * (expensive operation) needed to copy the data to kernel. Then we do |
950 | * the copying without checking the user space area | 952 | * the copying without checking the user space area |
951 | * (__copy_from_user()). | 953 | * (__copy_from_user()). |
952 | * | 954 | * |
953 | * On exit there is no need to do sockfd_put(), sys_setsockopt() does | 955 | * On exit there is no need to do sockfd_put(), sys_setsockopt() does |
954 | * it. | 956 | * it. |
955 | * | 957 | * |
956 | * sk The sk of the socket | 958 | * sk The sk of the socket |
957 | * addrs The pointer to the addresses in user land | 959 | * addrs The pointer to the addresses in user land |
958 | * addrssize Size of the addrs buffer | 960 | * addrssize Size of the addrs buffer |
959 | * op Operation to perform (add or remove, see the flags of | 961 | * op Operation to perform (add or remove, see the flags of |
960 | * sctp_bindx) | 962 | * sctp_bindx) |
961 | * | 963 | * |
962 | * Returns 0 if ok, <0 errno code on error. | 964 | * Returns 0 if ok, <0 errno code on error. |
963 | */ | 965 | */ |
964 | SCTP_STATIC int sctp_setsockopt_bindx(struct sock* sk, | 966 | SCTP_STATIC int sctp_setsockopt_bindx(struct sock* sk, |
965 | struct sockaddr __user *addrs, | 967 | struct sockaddr __user *addrs, |
966 | int addrs_size, int op) | 968 | int addrs_size, int op) |
967 | { | 969 | { |
968 | struct sockaddr *kaddrs; | 970 | struct sockaddr *kaddrs; |
969 | int err; | 971 | int err; |
970 | int addrcnt = 0; | 972 | int addrcnt = 0; |
971 | int walk_size = 0; | 973 | int walk_size = 0; |
972 | struct sockaddr *sa_addr; | 974 | struct sockaddr *sa_addr; |
973 | void *addr_buf; | 975 | void *addr_buf; |
974 | struct sctp_af *af; | 976 | struct sctp_af *af; |
975 | 977 | ||
976 | SCTP_DEBUG_PRINTK("sctp_setsockopt_bindx: sk %p addrs %p" | 978 | SCTP_DEBUG_PRINTK("sctp_setsockopt_bindx: sk %p addrs %p" |
977 | " addrs_size %d opt %d\n", sk, addrs, addrs_size, op); | 979 | " addrs_size %d opt %d\n", sk, addrs, addrs_size, op); |
978 | 980 | ||
979 | if (unlikely(addrs_size <= 0)) | 981 | if (unlikely(addrs_size <= 0)) |
980 | return -EINVAL; | 982 | return -EINVAL; |
981 | 983 | ||
982 | /* Check the user passed a healthy pointer. */ | 984 | /* Check the user passed a healthy pointer. */ |
983 | if (unlikely(!access_ok(VERIFY_READ, addrs, addrs_size))) | 985 | if (unlikely(!access_ok(VERIFY_READ, addrs, addrs_size))) |
984 | return -EFAULT; | 986 | return -EFAULT; |
985 | 987 | ||
986 | /* Alloc space for the address array in kernel memory. */ | 988 | /* Alloc space for the address array in kernel memory. */ |
987 | kaddrs = kmalloc(addrs_size, GFP_KERNEL); | 989 | kaddrs = kmalloc(addrs_size, GFP_KERNEL); |
988 | if (unlikely(!kaddrs)) | 990 | if (unlikely(!kaddrs)) |
989 | return -ENOMEM; | 991 | return -ENOMEM; |
990 | 992 | ||
991 | if (__copy_from_user(kaddrs, addrs, addrs_size)) { | 993 | if (__copy_from_user(kaddrs, addrs, addrs_size)) { |
992 | kfree(kaddrs); | 994 | kfree(kaddrs); |
993 | return -EFAULT; | 995 | return -EFAULT; |
994 | } | 996 | } |
995 | 997 | ||
996 | /* Walk through the addrs buffer and count the number of addresses. */ | 998 | /* Walk through the addrs buffer and count the number of addresses. */ |
997 | addr_buf = kaddrs; | 999 | addr_buf = kaddrs; |
998 | while (walk_size < addrs_size) { | 1000 | while (walk_size < addrs_size) { |
999 | if (walk_size + sizeof(sa_family_t) > addrs_size) { | 1001 | if (walk_size + sizeof(sa_family_t) > addrs_size) { |
1000 | kfree(kaddrs); | 1002 | kfree(kaddrs); |
1001 | return -EINVAL; | 1003 | return -EINVAL; |
1002 | } | 1004 | } |
1003 | 1005 | ||
1004 | sa_addr = addr_buf; | 1006 | sa_addr = addr_buf; |
1005 | af = sctp_get_af_specific(sa_addr->sa_family); | 1007 | af = sctp_get_af_specific(sa_addr->sa_family); |
1006 | 1008 | ||
1007 | /* If the address family is not supported or if this address | 1009 | /* If the address family is not supported or if this address |
1008 | * causes the address buffer to overflow return EINVAL. | 1010 | * causes the address buffer to overflow return EINVAL. |
1009 | */ | 1011 | */ |
1010 | if (!af || (walk_size + af->sockaddr_len) > addrs_size) { | 1012 | if (!af || (walk_size + af->sockaddr_len) > addrs_size) { |
1011 | kfree(kaddrs); | 1013 | kfree(kaddrs); |
1012 | return -EINVAL; | 1014 | return -EINVAL; |
1013 | } | 1015 | } |
1014 | addrcnt++; | 1016 | addrcnt++; |
1015 | addr_buf += af->sockaddr_len; | 1017 | addr_buf += af->sockaddr_len; |
1016 | walk_size += af->sockaddr_len; | 1018 | walk_size += af->sockaddr_len; |
1017 | } | 1019 | } |
1018 | 1020 | ||
1019 | /* Do the work. */ | 1021 | /* Do the work. */ |
1020 | switch (op) { | 1022 | switch (op) { |
1021 | case SCTP_BINDX_ADD_ADDR: | 1023 | case SCTP_BINDX_ADD_ADDR: |
1022 | err = sctp_bindx_add(sk, kaddrs, addrcnt); | 1024 | err = sctp_bindx_add(sk, kaddrs, addrcnt); |
1023 | if (err) | 1025 | if (err) |
1024 | goto out; | 1026 | goto out; |
1025 | err = sctp_send_asconf_add_ip(sk, kaddrs, addrcnt); | 1027 | err = sctp_send_asconf_add_ip(sk, kaddrs, addrcnt); |
1026 | break; | 1028 | break; |
1027 | 1029 | ||
1028 | case SCTP_BINDX_REM_ADDR: | 1030 | case SCTP_BINDX_REM_ADDR: |
1029 | err = sctp_bindx_rem(sk, kaddrs, addrcnt); | 1031 | err = sctp_bindx_rem(sk, kaddrs, addrcnt); |
1030 | if (err) | 1032 | if (err) |
1031 | goto out; | 1033 | goto out; |
1032 | err = sctp_send_asconf_del_ip(sk, kaddrs, addrcnt); | 1034 | err = sctp_send_asconf_del_ip(sk, kaddrs, addrcnt); |
1033 | break; | 1035 | break; |
1034 | 1036 | ||
1035 | default: | 1037 | default: |
1036 | err = -EINVAL; | 1038 | err = -EINVAL; |
1037 | break; | 1039 | break; |
1038 | } | 1040 | } |
1039 | 1041 | ||
1040 | out: | 1042 | out: |
1041 | kfree(kaddrs); | 1043 | kfree(kaddrs); |
1042 | 1044 | ||
1043 | return err; | 1045 | return err; |
1044 | } | 1046 | } |
1045 | 1047 | ||
1046 | /* __sctp_connect(struct sock* sk, struct sockaddr *kaddrs, int addrs_size) | 1048 | /* __sctp_connect(struct sock* sk, struct sockaddr *kaddrs, int addrs_size) |
1047 | * | 1049 | * |
1048 | * Common routine for handling connect() and sctp_connectx(). | 1050 | * Common routine for handling connect() and sctp_connectx(). |
1049 | * Connect will come in with just a single address. | 1051 | * Connect will come in with just a single address. |
1050 | */ | 1052 | */ |
1051 | static int __sctp_connect(struct sock* sk, | 1053 | static int __sctp_connect(struct sock* sk, |
1052 | struct sockaddr *kaddrs, | 1054 | struct sockaddr *kaddrs, |
1053 | int addrs_size, | 1055 | int addrs_size, |
1054 | sctp_assoc_t *assoc_id) | 1056 | sctp_assoc_t *assoc_id) |
1055 | { | 1057 | { |
1056 | struct net *net = sock_net(sk); | 1058 | struct net *net = sock_net(sk); |
1057 | struct sctp_sock *sp; | 1059 | struct sctp_sock *sp; |
1058 | struct sctp_endpoint *ep; | 1060 | struct sctp_endpoint *ep; |
1059 | struct sctp_association *asoc = NULL; | 1061 | struct sctp_association *asoc = NULL; |
1060 | struct sctp_association *asoc2; | 1062 | struct sctp_association *asoc2; |
1061 | struct sctp_transport *transport; | 1063 | struct sctp_transport *transport; |
1062 | union sctp_addr to; | 1064 | union sctp_addr to; |
1063 | struct sctp_af *af; | 1065 | struct sctp_af *af; |
1064 | sctp_scope_t scope; | 1066 | sctp_scope_t scope; |
1065 | long timeo; | 1067 | long timeo; |
1066 | int err = 0; | 1068 | int err = 0; |
1067 | int addrcnt = 0; | 1069 | int addrcnt = 0; |
1068 | int walk_size = 0; | 1070 | int walk_size = 0; |
1069 | union sctp_addr *sa_addr = NULL; | 1071 | union sctp_addr *sa_addr = NULL; |
1070 | void *addr_buf; | 1072 | void *addr_buf; |
1071 | unsigned short port; | 1073 | unsigned short port; |
1072 | unsigned int f_flags = 0; | 1074 | unsigned int f_flags = 0; |
1073 | 1075 | ||
1074 | sp = sctp_sk(sk); | 1076 | sp = sctp_sk(sk); |
1075 | ep = sp->ep; | 1077 | ep = sp->ep; |
1076 | 1078 | ||
1077 | /* connect() cannot be done on a socket that is already in ESTABLISHED | 1079 | /* connect() cannot be done on a socket that is already in ESTABLISHED |
1078 | * state - UDP-style peeled off socket or a TCP-style socket that | 1080 | * state - UDP-style peeled off socket or a TCP-style socket that |
1079 | * is already connected. | 1081 | * is already connected. |
1080 | * It cannot be done even on a TCP-style listening socket. | 1082 | * It cannot be done even on a TCP-style listening socket. |
1081 | */ | 1083 | */ |
1082 | if (sctp_sstate(sk, ESTABLISHED) || | 1084 | if (sctp_sstate(sk, ESTABLISHED) || |
1083 | (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING))) { | 1085 | (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING))) { |
1084 | err = -EISCONN; | 1086 | err = -EISCONN; |
1085 | goto out_free; | 1087 | goto out_free; |
1086 | } | 1088 | } |
1087 | 1089 | ||
1088 | /* Walk through the addrs buffer and count the number of addresses. */ | 1090 | /* Walk through the addrs buffer and count the number of addresses. */ |
1089 | addr_buf = kaddrs; | 1091 | addr_buf = kaddrs; |
1090 | while (walk_size < addrs_size) { | 1092 | while (walk_size < addrs_size) { |
1091 | if (walk_size + sizeof(sa_family_t) > addrs_size) { | 1093 | if (walk_size + sizeof(sa_family_t) > addrs_size) { |
1092 | err = -EINVAL; | 1094 | err = -EINVAL; |
1093 | goto out_free; | 1095 | goto out_free; |
1094 | } | 1096 | } |
1095 | 1097 | ||
1096 | sa_addr = addr_buf; | 1098 | sa_addr = addr_buf; |
1097 | af = sctp_get_af_specific(sa_addr->sa.sa_family); | 1099 | af = sctp_get_af_specific(sa_addr->sa.sa_family); |
1098 | 1100 | ||
1099 | /* If the address family is not supported or if this address | 1101 | /* If the address family is not supported or if this address |
1100 | * causes the address buffer to overflow return EINVAL. | 1102 | * causes the address buffer to overflow return EINVAL. |
1101 | */ | 1103 | */ |
1102 | if (!af || (walk_size + af->sockaddr_len) > addrs_size) { | 1104 | if (!af || (walk_size + af->sockaddr_len) > addrs_size) { |
1103 | err = -EINVAL; | 1105 | err = -EINVAL; |
1104 | goto out_free; | 1106 | goto out_free; |
1105 | } | 1107 | } |
1106 | 1108 | ||
1107 | port = ntohs(sa_addr->v4.sin_port); | 1109 | port = ntohs(sa_addr->v4.sin_port); |
1108 | 1110 | ||
1109 | /* Save current address so we can work with it */ | 1111 | /* Save current address so we can work with it */ |
1110 | memcpy(&to, sa_addr, af->sockaddr_len); | 1112 | memcpy(&to, sa_addr, af->sockaddr_len); |
1111 | 1113 | ||
1112 | err = sctp_verify_addr(sk, &to, af->sockaddr_len); | 1114 | err = sctp_verify_addr(sk, &to, af->sockaddr_len); |
1113 | if (err) | 1115 | if (err) |
1114 | goto out_free; | 1116 | goto out_free; |
1115 | 1117 | ||
1116 | /* Make sure the destination port is correctly set | 1118 | /* Make sure the destination port is correctly set |
1117 | * in all addresses. | 1119 | * in all addresses. |
1118 | */ | 1120 | */ |
1119 | if (asoc && asoc->peer.port && asoc->peer.port != port) | 1121 | if (asoc && asoc->peer.port && asoc->peer.port != port) |
1120 | goto out_free; | 1122 | goto out_free; |
1121 | 1123 | ||
1122 | 1124 | ||
1123 | /* Check if there already is a matching association on the | 1125 | /* Check if there already is a matching association on the |
1124 | * endpoint (other than the one created here). | 1126 | * endpoint (other than the one created here). |
1125 | */ | 1127 | */ |
1126 | asoc2 = sctp_endpoint_lookup_assoc(ep, &to, &transport); | 1128 | asoc2 = sctp_endpoint_lookup_assoc(ep, &to, &transport); |
1127 | if (asoc2 && asoc2 != asoc) { | 1129 | if (asoc2 && asoc2 != asoc) { |
1128 | if (asoc2->state >= SCTP_STATE_ESTABLISHED) | 1130 | if (asoc2->state >= SCTP_STATE_ESTABLISHED) |
1129 | err = -EISCONN; | 1131 | err = -EISCONN; |
1130 | else | 1132 | else |
1131 | err = -EALREADY; | 1133 | err = -EALREADY; |
1132 | goto out_free; | 1134 | goto out_free; |
1133 | } | 1135 | } |
1134 | 1136 | ||
1135 | /* If we could not find a matching association on the endpoint, | 1137 | /* If we could not find a matching association on the endpoint, |
1136 | * make sure that there is no peeled-off association matching | 1138 | * make sure that there is no peeled-off association matching |
1137 | * the peer address even on another socket. | 1139 | * the peer address even on another socket. |
1138 | */ | 1140 | */ |
1139 | if (sctp_endpoint_is_peeled_off(ep, &to)) { | 1141 | if (sctp_endpoint_is_peeled_off(ep, &to)) { |
1140 | err = -EADDRNOTAVAIL; | 1142 | err = -EADDRNOTAVAIL; |
1141 | goto out_free; | 1143 | goto out_free; |
1142 | } | 1144 | } |
1143 | 1145 | ||
1144 | if (!asoc) { | 1146 | if (!asoc) { |
1145 | /* If a bind() or sctp_bindx() is not called prior to | 1147 | /* If a bind() or sctp_bindx() is not called prior to |
1146 | * an sctp_connectx() call, the system picks an | 1148 | * an sctp_connectx() call, the system picks an |
1147 | * ephemeral port and will choose an address set | 1149 | * ephemeral port and will choose an address set |
1148 | * equivalent to binding with a wildcard address. | 1150 | * equivalent to binding with a wildcard address. |
1149 | */ | 1151 | */ |
1150 | if (!ep->base.bind_addr.port) { | 1152 | if (!ep->base.bind_addr.port) { |
1151 | if (sctp_autobind(sk)) { | 1153 | if (sctp_autobind(sk)) { |
1152 | err = -EAGAIN; | 1154 | err = -EAGAIN; |
1153 | goto out_free; | 1155 | goto out_free; |
1154 | } | 1156 | } |
1155 | } else { | 1157 | } else { |
1156 | /* | 1158 | /* |
1157 | * If an unprivileged user inherits a 1-many | 1159 | * If an unprivileged user inherits a 1-many |
1158 | * style socket with open associations on a | 1160 | * style socket with open associations on a |
1159 | * privileged port, it MAY be permitted to | 1161 | * privileged port, it MAY be permitted to |
1160 | * accept new associations, but it SHOULD NOT | 1162 | * accept new associations, but it SHOULD NOT |
1161 | * be permitted to open new associations. | 1163 | * be permitted to open new associations. |
1162 | */ | 1164 | */ |
1163 | if (ep->base.bind_addr.port < PROT_SOCK && | 1165 | if (ep->base.bind_addr.port < PROT_SOCK && |
1164 | !capable(CAP_NET_BIND_SERVICE)) { | 1166 | !ns_capable(net->user_ns, CAP_NET_BIND_SERVICE)) { |
1165 | err = -EACCES; | 1167 | err = -EACCES; |
1166 | goto out_free; | 1168 | goto out_free; |
1167 | } | 1169 | } |
1168 | } | 1170 | } |
1169 | 1171 | ||
1170 | scope = sctp_scope(&to); | 1172 | scope = sctp_scope(&to); |
1171 | asoc = sctp_association_new(ep, sk, scope, GFP_KERNEL); | 1173 | asoc = sctp_association_new(ep, sk, scope, GFP_KERNEL); |
1172 | if (!asoc) { | 1174 | if (!asoc) { |
1173 | err = -ENOMEM; | 1175 | err = -ENOMEM; |
1174 | goto out_free; | 1176 | goto out_free; |
1175 | } | 1177 | } |
1176 | 1178 | ||
1177 | err = sctp_assoc_set_bind_addr_from_ep(asoc, scope, | 1179 | err = sctp_assoc_set_bind_addr_from_ep(asoc, scope, |
1178 | GFP_KERNEL); | 1180 | GFP_KERNEL); |
1179 | if (err < 0) { | 1181 | if (err < 0) { |
1180 | goto out_free; | 1182 | goto out_free; |
1181 | } | 1183 | } |
1182 | 1184 | ||
1183 | } | 1185 | } |
1184 | 1186 | ||
1185 | /* Prime the peer's transport structures. */ | 1187 | /* Prime the peer's transport structures. */ |
1186 | transport = sctp_assoc_add_peer(asoc, &to, GFP_KERNEL, | 1188 | transport = sctp_assoc_add_peer(asoc, &to, GFP_KERNEL, |
1187 | SCTP_UNKNOWN); | 1189 | SCTP_UNKNOWN); |
1188 | if (!transport) { | 1190 | if (!transport) { |
1189 | err = -ENOMEM; | 1191 | err = -ENOMEM; |
1190 | goto out_free; | 1192 | goto out_free; |
1191 | } | 1193 | } |
1192 | 1194 | ||
1193 | addrcnt++; | 1195 | addrcnt++; |
1194 | addr_buf += af->sockaddr_len; | 1196 | addr_buf += af->sockaddr_len; |
1195 | walk_size += af->sockaddr_len; | 1197 | walk_size += af->sockaddr_len; |
1196 | } | 1198 | } |
1197 | 1199 | ||
1198 | /* In case the user of sctp_connectx() wants an association | 1200 | /* In case the user of sctp_connectx() wants an association |
1199 | * id back, assign one now. | 1201 | * id back, assign one now. |
1200 | */ | 1202 | */ |
1201 | if (assoc_id) { | 1203 | if (assoc_id) { |
1202 | err = sctp_assoc_set_id(asoc, GFP_KERNEL); | 1204 | err = sctp_assoc_set_id(asoc, GFP_KERNEL); |
1203 | if (err < 0) | 1205 | if (err < 0) |
1204 | goto out_free; | 1206 | goto out_free; |
1205 | } | 1207 | } |
1206 | 1208 | ||
1207 | err = sctp_primitive_ASSOCIATE(net, asoc, NULL); | 1209 | err = sctp_primitive_ASSOCIATE(net, asoc, NULL); |
1208 | if (err < 0) { | 1210 | if (err < 0) { |
1209 | goto out_free; | 1211 | goto out_free; |
1210 | } | 1212 | } |
1211 | 1213 | ||
1212 | /* Initialize sk's dport and daddr for getpeername() */ | 1214 | /* Initialize sk's dport and daddr for getpeername() */ |
1213 | inet_sk(sk)->inet_dport = htons(asoc->peer.port); | 1215 | inet_sk(sk)->inet_dport = htons(asoc->peer.port); |
1214 | af = sctp_get_af_specific(sa_addr->sa.sa_family); | 1216 | af = sctp_get_af_specific(sa_addr->sa.sa_family); |
1215 | af->to_sk_daddr(sa_addr, sk); | 1217 | af->to_sk_daddr(sa_addr, sk); |
1216 | sk->sk_err = 0; | 1218 | sk->sk_err = 0; |
1217 | 1219 | ||
1218 | /* in-kernel sockets don't generally have a file allocated to them | 1220 | /* in-kernel sockets don't generally have a file allocated to them |
1219 | * if all they do is call sock_create_kern(). | 1221 | * if all they do is call sock_create_kern(). |
1220 | */ | 1222 | */ |
1221 | if (sk->sk_socket->file) | 1223 | if (sk->sk_socket->file) |
1222 | f_flags = sk->sk_socket->file->f_flags; | 1224 | f_flags = sk->sk_socket->file->f_flags; |
1223 | 1225 | ||
1224 | timeo = sock_sndtimeo(sk, f_flags & O_NONBLOCK); | 1226 | timeo = sock_sndtimeo(sk, f_flags & O_NONBLOCK); |
1225 | 1227 | ||
1226 | err = sctp_wait_for_connect(asoc, &timeo); | 1228 | err = sctp_wait_for_connect(asoc, &timeo); |
1227 | if ((err == 0 || err == -EINPROGRESS) && assoc_id) | 1229 | if ((err == 0 || err == -EINPROGRESS) && assoc_id) |
1228 | *assoc_id = asoc->assoc_id; | 1230 | *assoc_id = asoc->assoc_id; |
1229 | 1231 | ||
1230 | /* Don't free association on exit. */ | 1232 | /* Don't free association on exit. */ |
1231 | asoc = NULL; | 1233 | asoc = NULL; |
1232 | 1234 | ||
1233 | out_free: | 1235 | out_free: |
1234 | 1236 | ||
1235 | SCTP_DEBUG_PRINTK("About to exit __sctp_connect() free asoc: %p" | 1237 | SCTP_DEBUG_PRINTK("About to exit __sctp_connect() free asoc: %p" |
1236 | " kaddrs: %p err: %d\n", | 1238 | " kaddrs: %p err: %d\n", |
1237 | asoc, kaddrs, err); | 1239 | asoc, kaddrs, err); |
1238 | if (asoc) { | 1240 | if (asoc) { |
1239 | /* sctp_primitive_ASSOCIATE may have added this association | 1241 | /* sctp_primitive_ASSOCIATE may have added this association |
1240 | * To the hash table, try to unhash it, just in case, its a noop | 1242 | * To the hash table, try to unhash it, just in case, its a noop |
1241 | * if it wasn't hashed so we're safe | 1243 | * if it wasn't hashed so we're safe |
1242 | */ | 1244 | */ |
1243 | sctp_unhash_established(asoc); | 1245 | sctp_unhash_established(asoc); |
1244 | sctp_association_free(asoc); | 1246 | sctp_association_free(asoc); |
1245 | } | 1247 | } |
1246 | return err; | 1248 | return err; |
1247 | } | 1249 | } |
1248 | 1250 | ||
1249 | /* Helper for tunneling sctp_connectx() requests through sctp_setsockopt() | 1251 | /* Helper for tunneling sctp_connectx() requests through sctp_setsockopt() |
1250 | * | 1252 | * |
1251 | * API 8.9 | 1253 | * API 8.9 |
1252 | * int sctp_connectx(int sd, struct sockaddr *addrs, int addrcnt, | 1254 | * int sctp_connectx(int sd, struct sockaddr *addrs, int addrcnt, |
1253 | * sctp_assoc_t *asoc); | 1255 | * sctp_assoc_t *asoc); |
1254 | * | 1256 | * |
1255 | * If sd is an IPv4 socket, the addresses passed must be IPv4 addresses. | 1257 | * If sd is an IPv4 socket, the addresses passed must be IPv4 addresses. |
1256 | * If the sd is an IPv6 socket, the addresses passed can either be IPv4 | 1258 | * If the sd is an IPv6 socket, the addresses passed can either be IPv4 |
1257 | * or IPv6 addresses. | 1259 | * or IPv6 addresses. |
1258 | * | 1260 | * |
1259 | * A single address may be specified as INADDR_ANY or IN6ADDR_ANY, see | 1261 | * A single address may be specified as INADDR_ANY or IN6ADDR_ANY, see |
1260 | * Section 3.1.2 for this usage. | 1262 | * Section 3.1.2 for this usage. |
1261 | * | 1263 | * |
1262 | * addrs is a pointer to an array of one or more socket addresses. Each | 1264 | * addrs is a pointer to an array of one or more socket addresses. Each |
1263 | * address is contained in its appropriate structure (i.e. struct | 1265 | * address is contained in its appropriate structure (i.e. struct |
1264 | * sockaddr_in or struct sockaddr_in6) the family of the address type | 1266 | * sockaddr_in or struct sockaddr_in6) the family of the address type |
1265 | * must be used to distengish the address length (note that this | 1267 | * must be used to distengish the address length (note that this |
1266 | * representation is termed a "packed array" of addresses). The caller | 1268 | * representation is termed a "packed array" of addresses). The caller |
1267 | * specifies the number of addresses in the array with addrcnt. | 1269 | * specifies the number of addresses in the array with addrcnt. |
1268 | * | 1270 | * |
1269 | * On success, sctp_connectx() returns 0. It also sets the assoc_id to | 1271 | * On success, sctp_connectx() returns 0. It also sets the assoc_id to |
1270 | * the association id of the new association. On failure, sctp_connectx() | 1272 | * the association id of the new association. On failure, sctp_connectx() |
1271 | * returns -1, and sets errno to the appropriate error code. The assoc_id | 1273 | * returns -1, and sets errno to the appropriate error code. The assoc_id |
1272 | * is not touched by the kernel. | 1274 | * is not touched by the kernel. |
1273 | * | 1275 | * |
1274 | * For SCTP, the port given in each socket address must be the same, or | 1276 | * For SCTP, the port given in each socket address must be the same, or |
1275 | * sctp_connectx() will fail, setting errno to EINVAL. | 1277 | * sctp_connectx() will fail, setting errno to EINVAL. |
1276 | * | 1278 | * |
1277 | * An application can use sctp_connectx to initiate an association with | 1279 | * An application can use sctp_connectx to initiate an association with |
1278 | * an endpoint that is multi-homed. Much like sctp_bindx() this call | 1280 | * an endpoint that is multi-homed. Much like sctp_bindx() this call |
1279 | * allows a caller to specify multiple addresses at which a peer can be | 1281 | * allows a caller to specify multiple addresses at which a peer can be |
1280 | * reached. The way the SCTP stack uses the list of addresses to set up | 1282 | * reached. The way the SCTP stack uses the list of addresses to set up |
1281 | * the association is implementation dependent. This function only | 1283 | * the association is implementation dependent. This function only |
1282 | * specifies that the stack will try to make use of all the addresses in | 1284 | * specifies that the stack will try to make use of all the addresses in |
1283 | * the list when needed. | 1285 | * the list when needed. |
1284 | * | 1286 | * |
1285 | * Note that the list of addresses passed in is only used for setting up | 1287 | * Note that the list of addresses passed in is only used for setting up |
1286 | * the association. It does not necessarily equal the set of addresses | 1288 | * the association. It does not necessarily equal the set of addresses |
1287 | * the peer uses for the resulting association. If the caller wants to | 1289 | * the peer uses for the resulting association. If the caller wants to |
1288 | * find out the set of peer addresses, it must use sctp_getpaddrs() to | 1290 | * find out the set of peer addresses, it must use sctp_getpaddrs() to |
1289 | * retrieve them after the association has been set up. | 1291 | * retrieve them after the association has been set up. |
1290 | * | 1292 | * |
1291 | * Basically do nothing but copying the addresses from user to kernel | 1293 | * Basically do nothing but copying the addresses from user to kernel |
1292 | * land and invoking either sctp_connectx(). This is used for tunneling | 1294 | * land and invoking either sctp_connectx(). This is used for tunneling |
1293 | * the sctp_connectx() request through sctp_setsockopt() from userspace. | 1295 | * the sctp_connectx() request through sctp_setsockopt() from userspace. |
1294 | * | 1296 | * |
1295 | * We don't use copy_from_user() for optimization: we first do the | 1297 | * We don't use copy_from_user() for optimization: we first do the |
1296 | * sanity checks (buffer size -fast- and access check-healthy | 1298 | * sanity checks (buffer size -fast- and access check-healthy |
1297 | * pointer); if all of those succeed, then we can alloc the memory | 1299 | * pointer); if all of those succeed, then we can alloc the memory |
1298 | * (expensive operation) needed to copy the data to kernel. Then we do | 1300 | * (expensive operation) needed to copy the data to kernel. Then we do |
1299 | * the copying without checking the user space area | 1301 | * the copying without checking the user space area |
1300 | * (__copy_from_user()). | 1302 | * (__copy_from_user()). |
1301 | * | 1303 | * |
1302 | * On exit there is no need to do sockfd_put(), sys_setsockopt() does | 1304 | * On exit there is no need to do sockfd_put(), sys_setsockopt() does |
1303 | * it. | 1305 | * it. |
1304 | * | 1306 | * |
1305 | * sk The sk of the socket | 1307 | * sk The sk of the socket |
1306 | * addrs The pointer to the addresses in user land | 1308 | * addrs The pointer to the addresses in user land |
1307 | * addrssize Size of the addrs buffer | 1309 | * addrssize Size of the addrs buffer |
1308 | * | 1310 | * |
1309 | * Returns >=0 if ok, <0 errno code on error. | 1311 | * Returns >=0 if ok, <0 errno code on error. |
1310 | */ | 1312 | */ |
1311 | SCTP_STATIC int __sctp_setsockopt_connectx(struct sock* sk, | 1313 | SCTP_STATIC int __sctp_setsockopt_connectx(struct sock* sk, |
1312 | struct sockaddr __user *addrs, | 1314 | struct sockaddr __user *addrs, |
1313 | int addrs_size, | 1315 | int addrs_size, |
1314 | sctp_assoc_t *assoc_id) | 1316 | sctp_assoc_t *assoc_id) |
1315 | { | 1317 | { |
1316 | int err = 0; | 1318 | int err = 0; |
1317 | struct sockaddr *kaddrs; | 1319 | struct sockaddr *kaddrs; |
1318 | 1320 | ||
1319 | SCTP_DEBUG_PRINTK("%s - sk %p addrs %p addrs_size %d\n", | 1321 | SCTP_DEBUG_PRINTK("%s - sk %p addrs %p addrs_size %d\n", |
1320 | __func__, sk, addrs, addrs_size); | 1322 | __func__, sk, addrs, addrs_size); |
1321 | 1323 | ||
1322 | if (unlikely(addrs_size <= 0)) | 1324 | if (unlikely(addrs_size <= 0)) |
1323 | return -EINVAL; | 1325 | return -EINVAL; |
1324 | 1326 | ||
1325 | /* Check the user passed a healthy pointer. */ | 1327 | /* Check the user passed a healthy pointer. */ |
1326 | if (unlikely(!access_ok(VERIFY_READ, addrs, addrs_size))) | 1328 | if (unlikely(!access_ok(VERIFY_READ, addrs, addrs_size))) |
1327 | return -EFAULT; | 1329 | return -EFAULT; |
1328 | 1330 | ||
1329 | /* Alloc space for the address array in kernel memory. */ | 1331 | /* Alloc space for the address array in kernel memory. */ |
1330 | kaddrs = kmalloc(addrs_size, GFP_KERNEL); | 1332 | kaddrs = kmalloc(addrs_size, GFP_KERNEL); |
1331 | if (unlikely(!kaddrs)) | 1333 | if (unlikely(!kaddrs)) |
1332 | return -ENOMEM; | 1334 | return -ENOMEM; |
1333 | 1335 | ||
1334 | if (__copy_from_user(kaddrs, addrs, addrs_size)) { | 1336 | if (__copy_from_user(kaddrs, addrs, addrs_size)) { |
1335 | err = -EFAULT; | 1337 | err = -EFAULT; |
1336 | } else { | 1338 | } else { |
1337 | err = __sctp_connect(sk, kaddrs, addrs_size, assoc_id); | 1339 | err = __sctp_connect(sk, kaddrs, addrs_size, assoc_id); |
1338 | } | 1340 | } |
1339 | 1341 | ||
1340 | kfree(kaddrs); | 1342 | kfree(kaddrs); |
1341 | 1343 | ||
1342 | return err; | 1344 | return err; |
1343 | } | 1345 | } |
1344 | 1346 | ||
1345 | /* | 1347 | /* |
1346 | * This is an older interface. It's kept for backward compatibility | 1348 | * This is an older interface. It's kept for backward compatibility |
1347 | * to the option that doesn't provide association id. | 1349 | * to the option that doesn't provide association id. |
1348 | */ | 1350 | */ |
1349 | SCTP_STATIC int sctp_setsockopt_connectx_old(struct sock* sk, | 1351 | SCTP_STATIC int sctp_setsockopt_connectx_old(struct sock* sk, |
1350 | struct sockaddr __user *addrs, | 1352 | struct sockaddr __user *addrs, |
1351 | int addrs_size) | 1353 | int addrs_size) |
1352 | { | 1354 | { |
1353 | return __sctp_setsockopt_connectx(sk, addrs, addrs_size, NULL); | 1355 | return __sctp_setsockopt_connectx(sk, addrs, addrs_size, NULL); |
1354 | } | 1356 | } |
1355 | 1357 | ||
1356 | /* | 1358 | /* |
1357 | * New interface for the API. The since the API is done with a socket | 1359 | * New interface for the API. The since the API is done with a socket |
1358 | * option, to make it simple we feed back the association id is as a return | 1360 | * option, to make it simple we feed back the association id is as a return |
1359 | * indication to the call. Error is always negative and association id is | 1361 | * indication to the call. Error is always negative and association id is |
1360 | * always positive. | 1362 | * always positive. |
1361 | */ | 1363 | */ |
1362 | SCTP_STATIC int sctp_setsockopt_connectx(struct sock* sk, | 1364 | SCTP_STATIC int sctp_setsockopt_connectx(struct sock* sk, |
1363 | struct sockaddr __user *addrs, | 1365 | struct sockaddr __user *addrs, |
1364 | int addrs_size) | 1366 | int addrs_size) |
1365 | { | 1367 | { |
1366 | sctp_assoc_t assoc_id = 0; | 1368 | sctp_assoc_t assoc_id = 0; |
1367 | int err = 0; | 1369 | int err = 0; |
1368 | 1370 | ||
1369 | err = __sctp_setsockopt_connectx(sk, addrs, addrs_size, &assoc_id); | 1371 | err = __sctp_setsockopt_connectx(sk, addrs, addrs_size, &assoc_id); |
1370 | 1372 | ||
1371 | if (err) | 1373 | if (err) |
1372 | return err; | 1374 | return err; |
1373 | else | 1375 | else |
1374 | return assoc_id; | 1376 | return assoc_id; |
1375 | } | 1377 | } |
1376 | 1378 | ||
1377 | /* | 1379 | /* |
1378 | * New (hopefully final) interface for the API. | 1380 | * New (hopefully final) interface for the API. |
1379 | * We use the sctp_getaddrs_old structure so that use-space library | 1381 | * We use the sctp_getaddrs_old structure so that use-space library |
1380 | * can avoid any unnecessary allocations. The only defferent part | 1382 | * can avoid any unnecessary allocations. The only defferent part |
1381 | * is that we store the actual length of the address buffer into the | 1383 | * is that we store the actual length of the address buffer into the |
1382 | * addrs_num structure member. That way we can re-use the existing | 1384 | * addrs_num structure member. That way we can re-use the existing |
1383 | * code. | 1385 | * code. |
1384 | */ | 1386 | */ |
1385 | SCTP_STATIC int sctp_getsockopt_connectx3(struct sock* sk, int len, | 1387 | SCTP_STATIC int sctp_getsockopt_connectx3(struct sock* sk, int len, |
1386 | char __user *optval, | 1388 | char __user *optval, |
1387 | int __user *optlen) | 1389 | int __user *optlen) |
1388 | { | 1390 | { |
1389 | struct sctp_getaddrs_old param; | 1391 | struct sctp_getaddrs_old param; |
1390 | sctp_assoc_t assoc_id = 0; | 1392 | sctp_assoc_t assoc_id = 0; |
1391 | int err = 0; | 1393 | int err = 0; |
1392 | 1394 | ||
1393 | if (len < sizeof(param)) | 1395 | if (len < sizeof(param)) |
1394 | return -EINVAL; | 1396 | return -EINVAL; |
1395 | 1397 | ||
1396 | if (copy_from_user(¶m, optval, sizeof(param))) | 1398 | if (copy_from_user(¶m, optval, sizeof(param))) |
1397 | return -EFAULT; | 1399 | return -EFAULT; |
1398 | 1400 | ||
1399 | err = __sctp_setsockopt_connectx(sk, | 1401 | err = __sctp_setsockopt_connectx(sk, |
1400 | (struct sockaddr __user *)param.addrs, | 1402 | (struct sockaddr __user *)param.addrs, |
1401 | param.addr_num, &assoc_id); | 1403 | param.addr_num, &assoc_id); |
1402 | 1404 | ||
1403 | if (err == 0 || err == -EINPROGRESS) { | 1405 | if (err == 0 || err == -EINPROGRESS) { |
1404 | if (copy_to_user(optval, &assoc_id, sizeof(assoc_id))) | 1406 | if (copy_to_user(optval, &assoc_id, sizeof(assoc_id))) |
1405 | return -EFAULT; | 1407 | return -EFAULT; |
1406 | if (put_user(sizeof(assoc_id), optlen)) | 1408 | if (put_user(sizeof(assoc_id), optlen)) |
1407 | return -EFAULT; | 1409 | return -EFAULT; |
1408 | } | 1410 | } |
1409 | 1411 | ||
1410 | return err; | 1412 | return err; |
1411 | } | 1413 | } |
1412 | 1414 | ||
1413 | /* API 3.1.4 close() - UDP Style Syntax | 1415 | /* API 3.1.4 close() - UDP Style Syntax |
1414 | * Applications use close() to perform graceful shutdown (as described in | 1416 | * Applications use close() to perform graceful shutdown (as described in |
1415 | * Section 10.1 of [SCTP]) on ALL the associations currently represented | 1417 | * Section 10.1 of [SCTP]) on ALL the associations currently represented |
1416 | * by a UDP-style socket. | 1418 | * by a UDP-style socket. |
1417 | * | 1419 | * |
1418 | * The syntax is | 1420 | * The syntax is |
1419 | * | 1421 | * |
1420 | * ret = close(int sd); | 1422 | * ret = close(int sd); |
1421 | * | 1423 | * |
1422 | * sd - the socket descriptor of the associations to be closed. | 1424 | * sd - the socket descriptor of the associations to be closed. |
1423 | * | 1425 | * |
1424 | * To gracefully shutdown a specific association represented by the | 1426 | * To gracefully shutdown a specific association represented by the |
1425 | * UDP-style socket, an application should use the sendmsg() call, | 1427 | * UDP-style socket, an application should use the sendmsg() call, |
1426 | * passing no user data, but including the appropriate flag in the | 1428 | * passing no user data, but including the appropriate flag in the |
1427 | * ancillary data (see Section xxxx). | 1429 | * ancillary data (see Section xxxx). |
1428 | * | 1430 | * |
1429 | * If sd in the close() call is a branched-off socket representing only | 1431 | * If sd in the close() call is a branched-off socket representing only |
1430 | * one association, the shutdown is performed on that association only. | 1432 | * one association, the shutdown is performed on that association only. |
1431 | * | 1433 | * |
1432 | * 4.1.6 close() - TCP Style Syntax | 1434 | * 4.1.6 close() - TCP Style Syntax |
1433 | * | 1435 | * |
1434 | * Applications use close() to gracefully close down an association. | 1436 | * Applications use close() to gracefully close down an association. |
1435 | * | 1437 | * |
1436 | * The syntax is: | 1438 | * The syntax is: |
1437 | * | 1439 | * |
1438 | * int close(int sd); | 1440 | * int close(int sd); |
1439 | * | 1441 | * |
1440 | * sd - the socket descriptor of the association to be closed. | 1442 | * sd - the socket descriptor of the association to be closed. |
1441 | * | 1443 | * |
1442 | * After an application calls close() on a socket descriptor, no further | 1444 | * After an application calls close() on a socket descriptor, no further |
1443 | * socket operations will succeed on that descriptor. | 1445 | * socket operations will succeed on that descriptor. |
1444 | * | 1446 | * |
1445 | * API 7.1.4 SO_LINGER | 1447 | * API 7.1.4 SO_LINGER |
1446 | * | 1448 | * |
1447 | * An application using the TCP-style socket can use this option to | 1449 | * An application using the TCP-style socket can use this option to |
1448 | * perform the SCTP ABORT primitive. The linger option structure is: | 1450 | * perform the SCTP ABORT primitive. The linger option structure is: |
1449 | * | 1451 | * |
1450 | * struct linger { | 1452 | * struct linger { |
1451 | * int l_onoff; // option on/off | 1453 | * int l_onoff; // option on/off |
1452 | * int l_linger; // linger time | 1454 | * int l_linger; // linger time |
1453 | * }; | 1455 | * }; |
1454 | * | 1456 | * |
1455 | * To enable the option, set l_onoff to 1. If the l_linger value is set | 1457 | * To enable the option, set l_onoff to 1. If the l_linger value is set |
1456 | * to 0, calling close() is the same as the ABORT primitive. If the | 1458 | * to 0, calling close() is the same as the ABORT primitive. If the |
1457 | * value is set to a negative value, the setsockopt() call will return | 1459 | * value is set to a negative value, the setsockopt() call will return |
1458 | * an error. If the value is set to a positive value linger_time, the | 1460 | * an error. If the value is set to a positive value linger_time, the |
1459 | * close() can be blocked for at most linger_time ms. If the graceful | 1461 | * close() can be blocked for at most linger_time ms. If the graceful |
1460 | * shutdown phase does not finish during this period, close() will | 1462 | * shutdown phase does not finish during this period, close() will |
1461 | * return but the graceful shutdown phase continues in the system. | 1463 | * return but the graceful shutdown phase continues in the system. |
1462 | */ | 1464 | */ |
1463 | SCTP_STATIC void sctp_close(struct sock *sk, long timeout) | 1465 | SCTP_STATIC void sctp_close(struct sock *sk, long timeout) |
1464 | { | 1466 | { |
1465 | struct net *net = sock_net(sk); | 1467 | struct net *net = sock_net(sk); |
1466 | struct sctp_endpoint *ep; | 1468 | struct sctp_endpoint *ep; |
1467 | struct sctp_association *asoc; | 1469 | struct sctp_association *asoc; |
1468 | struct list_head *pos, *temp; | 1470 | struct list_head *pos, *temp; |
1469 | unsigned int data_was_unread; | 1471 | unsigned int data_was_unread; |
1470 | 1472 | ||
1471 | SCTP_DEBUG_PRINTK("sctp_close(sk: 0x%p, timeout:%ld)\n", sk, timeout); | 1473 | SCTP_DEBUG_PRINTK("sctp_close(sk: 0x%p, timeout:%ld)\n", sk, timeout); |
1472 | 1474 | ||
1473 | sctp_lock_sock(sk); | 1475 | sctp_lock_sock(sk); |
1474 | sk->sk_shutdown = SHUTDOWN_MASK; | 1476 | sk->sk_shutdown = SHUTDOWN_MASK; |
1475 | sk->sk_state = SCTP_SS_CLOSING; | 1477 | sk->sk_state = SCTP_SS_CLOSING; |
1476 | 1478 | ||
1477 | ep = sctp_sk(sk)->ep; | 1479 | ep = sctp_sk(sk)->ep; |
1478 | 1480 | ||
1479 | /* Clean up any skbs sitting on the receive queue. */ | 1481 | /* Clean up any skbs sitting on the receive queue. */ |
1480 | data_was_unread = sctp_queue_purge_ulpevents(&sk->sk_receive_queue); | 1482 | data_was_unread = sctp_queue_purge_ulpevents(&sk->sk_receive_queue); |
1481 | data_was_unread += sctp_queue_purge_ulpevents(&sctp_sk(sk)->pd_lobby); | 1483 | data_was_unread += sctp_queue_purge_ulpevents(&sctp_sk(sk)->pd_lobby); |
1482 | 1484 | ||
1483 | /* Walk all associations on an endpoint. */ | 1485 | /* Walk all associations on an endpoint. */ |
1484 | list_for_each_safe(pos, temp, &ep->asocs) { | 1486 | list_for_each_safe(pos, temp, &ep->asocs) { |
1485 | asoc = list_entry(pos, struct sctp_association, asocs); | 1487 | asoc = list_entry(pos, struct sctp_association, asocs); |
1486 | 1488 | ||
1487 | if (sctp_style(sk, TCP)) { | 1489 | if (sctp_style(sk, TCP)) { |
1488 | /* A closed association can still be in the list if | 1490 | /* A closed association can still be in the list if |
1489 | * it belongs to a TCP-style listening socket that is | 1491 | * it belongs to a TCP-style listening socket that is |
1490 | * not yet accepted. If so, free it. If not, send an | 1492 | * not yet accepted. If so, free it. If not, send an |
1491 | * ABORT or SHUTDOWN based on the linger options. | 1493 | * ABORT or SHUTDOWN based on the linger options. |
1492 | */ | 1494 | */ |
1493 | if (sctp_state(asoc, CLOSED)) { | 1495 | if (sctp_state(asoc, CLOSED)) { |
1494 | sctp_unhash_established(asoc); | 1496 | sctp_unhash_established(asoc); |
1495 | sctp_association_free(asoc); | 1497 | sctp_association_free(asoc); |
1496 | continue; | 1498 | continue; |
1497 | } | 1499 | } |
1498 | } | 1500 | } |
1499 | 1501 | ||
1500 | if (data_was_unread || !skb_queue_empty(&asoc->ulpq.lobby) || | 1502 | if (data_was_unread || !skb_queue_empty(&asoc->ulpq.lobby) || |
1501 | !skb_queue_empty(&asoc->ulpq.reasm) || | 1503 | !skb_queue_empty(&asoc->ulpq.reasm) || |
1502 | (sock_flag(sk, SOCK_LINGER) && !sk->sk_lingertime)) { | 1504 | (sock_flag(sk, SOCK_LINGER) && !sk->sk_lingertime)) { |
1503 | struct sctp_chunk *chunk; | 1505 | struct sctp_chunk *chunk; |
1504 | 1506 | ||
1505 | chunk = sctp_make_abort_user(asoc, NULL, 0); | 1507 | chunk = sctp_make_abort_user(asoc, NULL, 0); |
1506 | if (chunk) | 1508 | if (chunk) |
1507 | sctp_primitive_ABORT(net, asoc, chunk); | 1509 | sctp_primitive_ABORT(net, asoc, chunk); |
1508 | } else | 1510 | } else |
1509 | sctp_primitive_SHUTDOWN(net, asoc, NULL); | 1511 | sctp_primitive_SHUTDOWN(net, asoc, NULL); |
1510 | } | 1512 | } |
1511 | 1513 | ||
1512 | /* On a TCP-style socket, block for at most linger_time if set. */ | 1514 | /* On a TCP-style socket, block for at most linger_time if set. */ |
1513 | if (sctp_style(sk, TCP) && timeout) | 1515 | if (sctp_style(sk, TCP) && timeout) |
1514 | sctp_wait_for_close(sk, timeout); | 1516 | sctp_wait_for_close(sk, timeout); |
1515 | 1517 | ||
1516 | /* This will run the backlog queue. */ | 1518 | /* This will run the backlog queue. */ |
1517 | sctp_release_sock(sk); | 1519 | sctp_release_sock(sk); |
1518 | 1520 | ||
1519 | /* Supposedly, no process has access to the socket, but | 1521 | /* Supposedly, no process has access to the socket, but |
1520 | * the net layers still may. | 1522 | * the net layers still may. |
1521 | */ | 1523 | */ |
1522 | sctp_local_bh_disable(); | 1524 | sctp_local_bh_disable(); |
1523 | sctp_bh_lock_sock(sk); | 1525 | sctp_bh_lock_sock(sk); |
1524 | 1526 | ||
1525 | /* Hold the sock, since sk_common_release() will put sock_put() | 1527 | /* Hold the sock, since sk_common_release() will put sock_put() |
1526 | * and we have just a little more cleanup. | 1528 | * and we have just a little more cleanup. |
1527 | */ | 1529 | */ |
1528 | sock_hold(sk); | 1530 | sock_hold(sk); |
1529 | sk_common_release(sk); | 1531 | sk_common_release(sk); |
1530 | 1532 | ||
1531 | sctp_bh_unlock_sock(sk); | 1533 | sctp_bh_unlock_sock(sk); |
1532 | sctp_local_bh_enable(); | 1534 | sctp_local_bh_enable(); |
1533 | 1535 | ||
1534 | sock_put(sk); | 1536 | sock_put(sk); |
1535 | 1537 | ||
1536 | SCTP_DBG_OBJCNT_DEC(sock); | 1538 | SCTP_DBG_OBJCNT_DEC(sock); |
1537 | } | 1539 | } |
1538 | 1540 | ||
1539 | /* Handle EPIPE error. */ | 1541 | /* Handle EPIPE error. */ |
1540 | static int sctp_error(struct sock *sk, int flags, int err) | 1542 | static int sctp_error(struct sock *sk, int flags, int err) |
1541 | { | 1543 | { |
1542 | if (err == -EPIPE) | 1544 | if (err == -EPIPE) |
1543 | err = sock_error(sk) ? : -EPIPE; | 1545 | err = sock_error(sk) ? : -EPIPE; |
1544 | if (err == -EPIPE && !(flags & MSG_NOSIGNAL)) | 1546 | if (err == -EPIPE && !(flags & MSG_NOSIGNAL)) |
1545 | send_sig(SIGPIPE, current, 0); | 1547 | send_sig(SIGPIPE, current, 0); |
1546 | return err; | 1548 | return err; |
1547 | } | 1549 | } |
1548 | 1550 | ||
1549 | /* API 3.1.3 sendmsg() - UDP Style Syntax | 1551 | /* API 3.1.3 sendmsg() - UDP Style Syntax |
1550 | * | 1552 | * |
1551 | * An application uses sendmsg() and recvmsg() calls to transmit data to | 1553 | * An application uses sendmsg() and recvmsg() calls to transmit data to |
1552 | * and receive data from its peer. | 1554 | * and receive data from its peer. |
1553 | * | 1555 | * |
1554 | * ssize_t sendmsg(int socket, const struct msghdr *message, | 1556 | * ssize_t sendmsg(int socket, const struct msghdr *message, |
1555 | * int flags); | 1557 | * int flags); |
1556 | * | 1558 | * |
1557 | * socket - the socket descriptor of the endpoint. | 1559 | * socket - the socket descriptor of the endpoint. |
1558 | * message - pointer to the msghdr structure which contains a single | 1560 | * message - pointer to the msghdr structure which contains a single |
1559 | * user message and possibly some ancillary data. | 1561 | * user message and possibly some ancillary data. |
1560 | * | 1562 | * |
1561 | * See Section 5 for complete description of the data | 1563 | * See Section 5 for complete description of the data |
1562 | * structures. | 1564 | * structures. |
1563 | * | 1565 | * |
1564 | * flags - flags sent or received with the user message, see Section | 1566 | * flags - flags sent or received with the user message, see Section |
1565 | * 5 for complete description of the flags. | 1567 | * 5 for complete description of the flags. |
1566 | * | 1568 | * |
1567 | * Note: This function could use a rewrite especially when explicit | 1569 | * Note: This function could use a rewrite especially when explicit |
1568 | * connect support comes in. | 1570 | * connect support comes in. |
1569 | */ | 1571 | */ |
1570 | /* BUG: We do not implement the equivalent of sk_stream_wait_memory(). */ | 1572 | /* BUG: We do not implement the equivalent of sk_stream_wait_memory(). */ |
1571 | 1573 | ||
1572 | SCTP_STATIC int sctp_msghdr_parse(const struct msghdr *, sctp_cmsgs_t *); | 1574 | SCTP_STATIC int sctp_msghdr_parse(const struct msghdr *, sctp_cmsgs_t *); |
1573 | 1575 | ||
1574 | SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk, | 1576 | SCTP_STATIC int sctp_sendmsg(struct kiocb *iocb, struct sock *sk, |
1575 | struct msghdr *msg, size_t msg_len) | 1577 | struct msghdr *msg, size_t msg_len) |
1576 | { | 1578 | { |
1577 | struct net *net = sock_net(sk); | 1579 | struct net *net = sock_net(sk); |
1578 | struct sctp_sock *sp; | 1580 | struct sctp_sock *sp; |
1579 | struct sctp_endpoint *ep; | 1581 | struct sctp_endpoint *ep; |
1580 | struct sctp_association *new_asoc=NULL, *asoc=NULL; | 1582 | struct sctp_association *new_asoc=NULL, *asoc=NULL; |
1581 | struct sctp_transport *transport, *chunk_tp; | 1583 | struct sctp_transport *transport, *chunk_tp; |
1582 | struct sctp_chunk *chunk; | 1584 | struct sctp_chunk *chunk; |
1583 | union sctp_addr to; | 1585 | union sctp_addr to; |
1584 | struct sockaddr *msg_name = NULL; | 1586 | struct sockaddr *msg_name = NULL; |
1585 | struct sctp_sndrcvinfo default_sinfo; | 1587 | struct sctp_sndrcvinfo default_sinfo; |
1586 | struct sctp_sndrcvinfo *sinfo; | 1588 | struct sctp_sndrcvinfo *sinfo; |
1587 | struct sctp_initmsg *sinit; | 1589 | struct sctp_initmsg *sinit; |
1588 | sctp_assoc_t associd = 0; | 1590 | sctp_assoc_t associd = 0; |
1589 | sctp_cmsgs_t cmsgs = { NULL }; | 1591 | sctp_cmsgs_t cmsgs = { NULL }; |
1590 | int err; | 1592 | int err; |
1591 | sctp_scope_t scope; | 1593 | sctp_scope_t scope; |
1592 | long timeo; | 1594 | long timeo; |
1593 | __u16 sinfo_flags = 0; | 1595 | __u16 sinfo_flags = 0; |
1594 | struct sctp_datamsg *datamsg; | 1596 | struct sctp_datamsg *datamsg; |
1595 | int msg_flags = msg->msg_flags; | 1597 | int msg_flags = msg->msg_flags; |
1596 | 1598 | ||
1597 | SCTP_DEBUG_PRINTK("sctp_sendmsg(sk: %p, msg: %p, msg_len: %zu)\n", | 1599 | SCTP_DEBUG_PRINTK("sctp_sendmsg(sk: %p, msg: %p, msg_len: %zu)\n", |
1598 | sk, msg, msg_len); | 1600 | sk, msg, msg_len); |
1599 | 1601 | ||
1600 | err = 0; | 1602 | err = 0; |
1601 | sp = sctp_sk(sk); | 1603 | sp = sctp_sk(sk); |
1602 | ep = sp->ep; | 1604 | ep = sp->ep; |
1603 | 1605 | ||
1604 | SCTP_DEBUG_PRINTK("Using endpoint: %p.\n", ep); | 1606 | SCTP_DEBUG_PRINTK("Using endpoint: %p.\n", ep); |
1605 | 1607 | ||
1606 | /* We cannot send a message over a TCP-style listening socket. */ | 1608 | /* We cannot send a message over a TCP-style listening socket. */ |
1607 | if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING)) { | 1609 | if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING)) { |
1608 | err = -EPIPE; | 1610 | err = -EPIPE; |
1609 | goto out_nounlock; | 1611 | goto out_nounlock; |
1610 | } | 1612 | } |
1611 | 1613 | ||
1612 | /* Parse out the SCTP CMSGs. */ | 1614 | /* Parse out the SCTP CMSGs. */ |
1613 | err = sctp_msghdr_parse(msg, &cmsgs); | 1615 | err = sctp_msghdr_parse(msg, &cmsgs); |
1614 | 1616 | ||
1615 | if (err) { | 1617 | if (err) { |
1616 | SCTP_DEBUG_PRINTK("msghdr parse err = %x\n", err); | 1618 | SCTP_DEBUG_PRINTK("msghdr parse err = %x\n", err); |
1617 | goto out_nounlock; | 1619 | goto out_nounlock; |
1618 | } | 1620 | } |
1619 | 1621 | ||
1620 | /* Fetch the destination address for this packet. This | 1622 | /* Fetch the destination address for this packet. This |
1621 | * address only selects the association--it is not necessarily | 1623 | * address only selects the association--it is not necessarily |
1622 | * the address we will send to. | 1624 | * the address we will send to. |
1623 | * For a peeled-off socket, msg_name is ignored. | 1625 | * For a peeled-off socket, msg_name is ignored. |
1624 | */ | 1626 | */ |
1625 | if (!sctp_style(sk, UDP_HIGH_BANDWIDTH) && msg->msg_name) { | 1627 | if (!sctp_style(sk, UDP_HIGH_BANDWIDTH) && msg->msg_name) { |
1626 | int msg_namelen = msg->msg_namelen; | 1628 | int msg_namelen = msg->msg_namelen; |
1627 | 1629 | ||
1628 | err = sctp_verify_addr(sk, (union sctp_addr *)msg->msg_name, | 1630 | err = sctp_verify_addr(sk, (union sctp_addr *)msg->msg_name, |
1629 | msg_namelen); | 1631 | msg_namelen); |
1630 | if (err) | 1632 | if (err) |
1631 | return err; | 1633 | return err; |
1632 | 1634 | ||
1633 | if (msg_namelen > sizeof(to)) | 1635 | if (msg_namelen > sizeof(to)) |
1634 | msg_namelen = sizeof(to); | 1636 | msg_namelen = sizeof(to); |
1635 | memcpy(&to, msg->msg_name, msg_namelen); | 1637 | memcpy(&to, msg->msg_name, msg_namelen); |
1636 | msg_name = msg->msg_name; | 1638 | msg_name = msg->msg_name; |
1637 | } | 1639 | } |
1638 | 1640 | ||
1639 | sinfo = cmsgs.info; | 1641 | sinfo = cmsgs.info; |
1640 | sinit = cmsgs.init; | 1642 | sinit = cmsgs.init; |
1641 | 1643 | ||
1642 | /* Did the user specify SNDRCVINFO? */ | 1644 | /* Did the user specify SNDRCVINFO? */ |
1643 | if (sinfo) { | 1645 | if (sinfo) { |
1644 | sinfo_flags = sinfo->sinfo_flags; | 1646 | sinfo_flags = sinfo->sinfo_flags; |
1645 | associd = sinfo->sinfo_assoc_id; | 1647 | associd = sinfo->sinfo_assoc_id; |
1646 | } | 1648 | } |
1647 | 1649 | ||
1648 | SCTP_DEBUG_PRINTK("msg_len: %zu, sinfo_flags: 0x%x\n", | 1650 | SCTP_DEBUG_PRINTK("msg_len: %zu, sinfo_flags: 0x%x\n", |
1649 | msg_len, sinfo_flags); | 1651 | msg_len, sinfo_flags); |
1650 | 1652 | ||
1651 | /* SCTP_EOF or SCTP_ABORT cannot be set on a TCP-style socket. */ | 1653 | /* SCTP_EOF or SCTP_ABORT cannot be set on a TCP-style socket. */ |
1652 | if (sctp_style(sk, TCP) && (sinfo_flags & (SCTP_EOF | SCTP_ABORT))) { | 1654 | if (sctp_style(sk, TCP) && (sinfo_flags & (SCTP_EOF | SCTP_ABORT))) { |
1653 | err = -EINVAL; | 1655 | err = -EINVAL; |
1654 | goto out_nounlock; | 1656 | goto out_nounlock; |
1655 | } | 1657 | } |
1656 | 1658 | ||
1657 | /* If SCTP_EOF is set, no data can be sent. Disallow sending zero | 1659 | /* If SCTP_EOF is set, no data can be sent. Disallow sending zero |
1658 | * length messages when SCTP_EOF|SCTP_ABORT is not set. | 1660 | * length messages when SCTP_EOF|SCTP_ABORT is not set. |
1659 | * If SCTP_ABORT is set, the message length could be non zero with | 1661 | * If SCTP_ABORT is set, the message length could be non zero with |
1660 | * the msg_iov set to the user abort reason. | 1662 | * the msg_iov set to the user abort reason. |
1661 | */ | 1663 | */ |
1662 | if (((sinfo_flags & SCTP_EOF) && (msg_len > 0)) || | 1664 | if (((sinfo_flags & SCTP_EOF) && (msg_len > 0)) || |
1663 | (!(sinfo_flags & (SCTP_EOF|SCTP_ABORT)) && (msg_len == 0))) { | 1665 | (!(sinfo_flags & (SCTP_EOF|SCTP_ABORT)) && (msg_len == 0))) { |
1664 | err = -EINVAL; | 1666 | err = -EINVAL; |
1665 | goto out_nounlock; | 1667 | goto out_nounlock; |
1666 | } | 1668 | } |
1667 | 1669 | ||
1668 | /* If SCTP_ADDR_OVER is set, there must be an address | 1670 | /* If SCTP_ADDR_OVER is set, there must be an address |
1669 | * specified in msg_name. | 1671 | * specified in msg_name. |
1670 | */ | 1672 | */ |
1671 | if ((sinfo_flags & SCTP_ADDR_OVER) && (!msg->msg_name)) { | 1673 | if ((sinfo_flags & SCTP_ADDR_OVER) && (!msg->msg_name)) { |
1672 | err = -EINVAL; | 1674 | err = -EINVAL; |
1673 | goto out_nounlock; | 1675 | goto out_nounlock; |
1674 | } | 1676 | } |
1675 | 1677 | ||
1676 | transport = NULL; | 1678 | transport = NULL; |
1677 | 1679 | ||
1678 | SCTP_DEBUG_PRINTK("About to look up association.\n"); | 1680 | SCTP_DEBUG_PRINTK("About to look up association.\n"); |
1679 | 1681 | ||
1680 | sctp_lock_sock(sk); | 1682 | sctp_lock_sock(sk); |
1681 | 1683 | ||
1682 | /* If a msg_name has been specified, assume this is to be used. */ | 1684 | /* If a msg_name has been specified, assume this is to be used. */ |
1683 | if (msg_name) { | 1685 | if (msg_name) { |
1684 | /* Look for a matching association on the endpoint. */ | 1686 | /* Look for a matching association on the endpoint. */ |
1685 | asoc = sctp_endpoint_lookup_assoc(ep, &to, &transport); | 1687 | asoc = sctp_endpoint_lookup_assoc(ep, &to, &transport); |
1686 | if (!asoc) { | 1688 | if (!asoc) { |
1687 | /* If we could not find a matching association on the | 1689 | /* If we could not find a matching association on the |
1688 | * endpoint, make sure that it is not a TCP-style | 1690 | * endpoint, make sure that it is not a TCP-style |
1689 | * socket that already has an association or there is | 1691 | * socket that already has an association or there is |
1690 | * no peeled-off association on another socket. | 1692 | * no peeled-off association on another socket. |
1691 | */ | 1693 | */ |
1692 | if ((sctp_style(sk, TCP) && | 1694 | if ((sctp_style(sk, TCP) && |
1693 | sctp_sstate(sk, ESTABLISHED)) || | 1695 | sctp_sstate(sk, ESTABLISHED)) || |
1694 | sctp_endpoint_is_peeled_off(ep, &to)) { | 1696 | sctp_endpoint_is_peeled_off(ep, &to)) { |
1695 | err = -EADDRNOTAVAIL; | 1697 | err = -EADDRNOTAVAIL; |
1696 | goto out_unlock; | 1698 | goto out_unlock; |
1697 | } | 1699 | } |
1698 | } | 1700 | } |
1699 | } else { | 1701 | } else { |
1700 | asoc = sctp_id2assoc(sk, associd); | 1702 | asoc = sctp_id2assoc(sk, associd); |
1701 | if (!asoc) { | 1703 | if (!asoc) { |
1702 | err = -EPIPE; | 1704 | err = -EPIPE; |
1703 | goto out_unlock; | 1705 | goto out_unlock; |
1704 | } | 1706 | } |
1705 | } | 1707 | } |
1706 | 1708 | ||
1707 | if (asoc) { | 1709 | if (asoc) { |
1708 | SCTP_DEBUG_PRINTK("Just looked up association: %p.\n", asoc); | 1710 | SCTP_DEBUG_PRINTK("Just looked up association: %p.\n", asoc); |
1709 | 1711 | ||
1710 | /* We cannot send a message on a TCP-style SCTP_SS_ESTABLISHED | 1712 | /* We cannot send a message on a TCP-style SCTP_SS_ESTABLISHED |
1711 | * socket that has an association in CLOSED state. This can | 1713 | * socket that has an association in CLOSED state. This can |
1712 | * happen when an accepted socket has an association that is | 1714 | * happen when an accepted socket has an association that is |
1713 | * already CLOSED. | 1715 | * already CLOSED. |
1714 | */ | 1716 | */ |
1715 | if (sctp_state(asoc, CLOSED) && sctp_style(sk, TCP)) { | 1717 | if (sctp_state(asoc, CLOSED) && sctp_style(sk, TCP)) { |
1716 | err = -EPIPE; | 1718 | err = -EPIPE; |
1717 | goto out_unlock; | 1719 | goto out_unlock; |
1718 | } | 1720 | } |
1719 | 1721 | ||
1720 | if (sinfo_flags & SCTP_EOF) { | 1722 | if (sinfo_flags & SCTP_EOF) { |
1721 | SCTP_DEBUG_PRINTK("Shutting down association: %p\n", | 1723 | SCTP_DEBUG_PRINTK("Shutting down association: %p\n", |
1722 | asoc); | 1724 | asoc); |
1723 | sctp_primitive_SHUTDOWN(net, asoc, NULL); | 1725 | sctp_primitive_SHUTDOWN(net, asoc, NULL); |
1724 | err = 0; | 1726 | err = 0; |
1725 | goto out_unlock; | 1727 | goto out_unlock; |
1726 | } | 1728 | } |
1727 | if (sinfo_flags & SCTP_ABORT) { | 1729 | if (sinfo_flags & SCTP_ABORT) { |
1728 | 1730 | ||
1729 | chunk = sctp_make_abort_user(asoc, msg, msg_len); | 1731 | chunk = sctp_make_abort_user(asoc, msg, msg_len); |
1730 | if (!chunk) { | 1732 | if (!chunk) { |
1731 | err = -ENOMEM; | 1733 | err = -ENOMEM; |
1732 | goto out_unlock; | 1734 | goto out_unlock; |
1733 | } | 1735 | } |
1734 | 1736 | ||
1735 | SCTP_DEBUG_PRINTK("Aborting association: %p\n", asoc); | 1737 | SCTP_DEBUG_PRINTK("Aborting association: %p\n", asoc); |
1736 | sctp_primitive_ABORT(net, asoc, chunk); | 1738 | sctp_primitive_ABORT(net, asoc, chunk); |
1737 | err = 0; | 1739 | err = 0; |
1738 | goto out_unlock; | 1740 | goto out_unlock; |
1739 | } | 1741 | } |
1740 | } | 1742 | } |
1741 | 1743 | ||
1742 | /* Do we need to create the association? */ | 1744 | /* Do we need to create the association? */ |
1743 | if (!asoc) { | 1745 | if (!asoc) { |
1744 | SCTP_DEBUG_PRINTK("There is no association yet.\n"); | 1746 | SCTP_DEBUG_PRINTK("There is no association yet.\n"); |
1745 | 1747 | ||
1746 | if (sinfo_flags & (SCTP_EOF | SCTP_ABORT)) { | 1748 | if (sinfo_flags & (SCTP_EOF | SCTP_ABORT)) { |
1747 | err = -EINVAL; | 1749 | err = -EINVAL; |
1748 | goto out_unlock; | 1750 | goto out_unlock; |
1749 | } | 1751 | } |
1750 | 1752 | ||
1751 | /* Check for invalid stream against the stream counts, | 1753 | /* Check for invalid stream against the stream counts, |
1752 | * either the default or the user specified stream counts. | 1754 | * either the default or the user specified stream counts. |
1753 | */ | 1755 | */ |
1754 | if (sinfo) { | 1756 | if (sinfo) { |
1755 | if (!sinit || (sinit && !sinit->sinit_num_ostreams)) { | 1757 | if (!sinit || (sinit && !sinit->sinit_num_ostreams)) { |
1756 | /* Check against the defaults. */ | 1758 | /* Check against the defaults. */ |
1757 | if (sinfo->sinfo_stream >= | 1759 | if (sinfo->sinfo_stream >= |
1758 | sp->initmsg.sinit_num_ostreams) { | 1760 | sp->initmsg.sinit_num_ostreams) { |
1759 | err = -EINVAL; | 1761 | err = -EINVAL; |
1760 | goto out_unlock; | 1762 | goto out_unlock; |
1761 | } | 1763 | } |
1762 | } else { | 1764 | } else { |
1763 | /* Check against the requested. */ | 1765 | /* Check against the requested. */ |
1764 | if (sinfo->sinfo_stream >= | 1766 | if (sinfo->sinfo_stream >= |
1765 | sinit->sinit_num_ostreams) { | 1767 | sinit->sinit_num_ostreams) { |
1766 | err = -EINVAL; | 1768 | err = -EINVAL; |
1767 | goto out_unlock; | 1769 | goto out_unlock; |
1768 | } | 1770 | } |
1769 | } | 1771 | } |
1770 | } | 1772 | } |
1771 | 1773 | ||
1772 | /* | 1774 | /* |
1773 | * API 3.1.2 bind() - UDP Style Syntax | 1775 | * API 3.1.2 bind() - UDP Style Syntax |
1774 | * If a bind() or sctp_bindx() is not called prior to a | 1776 | * If a bind() or sctp_bindx() is not called prior to a |
1775 | * sendmsg() call that initiates a new association, the | 1777 | * sendmsg() call that initiates a new association, the |
1776 | * system picks an ephemeral port and will choose an address | 1778 | * system picks an ephemeral port and will choose an address |
1777 | * set equivalent to binding with a wildcard address. | 1779 | * set equivalent to binding with a wildcard address. |
1778 | */ | 1780 | */ |
1779 | if (!ep->base.bind_addr.port) { | 1781 | if (!ep->base.bind_addr.port) { |
1780 | if (sctp_autobind(sk)) { | 1782 | if (sctp_autobind(sk)) { |
1781 | err = -EAGAIN; | 1783 | err = -EAGAIN; |
1782 | goto out_unlock; | 1784 | goto out_unlock; |
1783 | } | 1785 | } |
1784 | } else { | 1786 | } else { |
1785 | /* | 1787 | /* |
1786 | * If an unprivileged user inherits a one-to-many | 1788 | * If an unprivileged user inherits a one-to-many |
1787 | * style socket with open associations on a privileged | 1789 | * style socket with open associations on a privileged |
1788 | * port, it MAY be permitted to accept new associations, | 1790 | * port, it MAY be permitted to accept new associations, |
1789 | * but it SHOULD NOT be permitted to open new | 1791 | * but it SHOULD NOT be permitted to open new |
1790 | * associations. | 1792 | * associations. |
1791 | */ | 1793 | */ |
1792 | if (ep->base.bind_addr.port < PROT_SOCK && | 1794 | if (ep->base.bind_addr.port < PROT_SOCK && |
1793 | !capable(CAP_NET_BIND_SERVICE)) { | 1795 | !ns_capable(net->user_ns, CAP_NET_BIND_SERVICE)) { |
1794 | err = -EACCES; | 1796 | err = -EACCES; |
1795 | goto out_unlock; | 1797 | goto out_unlock; |
1796 | } | 1798 | } |
1797 | } | 1799 | } |
1798 | 1800 | ||
1799 | scope = sctp_scope(&to); | 1801 | scope = sctp_scope(&to); |
1800 | new_asoc = sctp_association_new(ep, sk, scope, GFP_KERNEL); | 1802 | new_asoc = sctp_association_new(ep, sk, scope, GFP_KERNEL); |
1801 | if (!new_asoc) { | 1803 | if (!new_asoc) { |
1802 | err = -ENOMEM; | 1804 | err = -ENOMEM; |
1803 | goto out_unlock; | 1805 | goto out_unlock; |
1804 | } | 1806 | } |
1805 | asoc = new_asoc; | 1807 | asoc = new_asoc; |
1806 | err = sctp_assoc_set_bind_addr_from_ep(asoc, scope, GFP_KERNEL); | 1808 | err = sctp_assoc_set_bind_addr_from_ep(asoc, scope, GFP_KERNEL); |
1807 | if (err < 0) { | 1809 | if (err < 0) { |
1808 | err = -ENOMEM; | 1810 | err = -ENOMEM; |
1809 | goto out_free; | 1811 | goto out_free; |
1810 | } | 1812 | } |
1811 | 1813 | ||
1812 | /* If the SCTP_INIT ancillary data is specified, set all | 1814 | /* If the SCTP_INIT ancillary data is specified, set all |
1813 | * the association init values accordingly. | 1815 | * the association init values accordingly. |
1814 | */ | 1816 | */ |
1815 | if (sinit) { | 1817 | if (sinit) { |
1816 | if (sinit->sinit_num_ostreams) { | 1818 | if (sinit->sinit_num_ostreams) { |
1817 | asoc->c.sinit_num_ostreams = | 1819 | asoc->c.sinit_num_ostreams = |
1818 | sinit->sinit_num_ostreams; | 1820 | sinit->sinit_num_ostreams; |
1819 | } | 1821 | } |
1820 | if (sinit->sinit_max_instreams) { | 1822 | if (sinit->sinit_max_instreams) { |
1821 | asoc->c.sinit_max_instreams = | 1823 | asoc->c.sinit_max_instreams = |
1822 | sinit->sinit_max_instreams; | 1824 | sinit->sinit_max_instreams; |
1823 | } | 1825 | } |
1824 | if (sinit->sinit_max_attempts) { | 1826 | if (sinit->sinit_max_attempts) { |
1825 | asoc->max_init_attempts | 1827 | asoc->max_init_attempts |
1826 | = sinit->sinit_max_attempts; | 1828 | = sinit->sinit_max_attempts; |
1827 | } | 1829 | } |
1828 | if (sinit->sinit_max_init_timeo) { | 1830 | if (sinit->sinit_max_init_timeo) { |
1829 | asoc->max_init_timeo = | 1831 | asoc->max_init_timeo = |
1830 | msecs_to_jiffies(sinit->sinit_max_init_timeo); | 1832 | msecs_to_jiffies(sinit->sinit_max_init_timeo); |
1831 | } | 1833 | } |
1832 | } | 1834 | } |
1833 | 1835 | ||
1834 | /* Prime the peer's transport structures. */ | 1836 | /* Prime the peer's transport structures. */ |
1835 | transport = sctp_assoc_add_peer(asoc, &to, GFP_KERNEL, SCTP_UNKNOWN); | 1837 | transport = sctp_assoc_add_peer(asoc, &to, GFP_KERNEL, SCTP_UNKNOWN); |
1836 | if (!transport) { | 1838 | if (!transport) { |
1837 | err = -ENOMEM; | 1839 | err = -ENOMEM; |
1838 | goto out_free; | 1840 | goto out_free; |
1839 | } | 1841 | } |
1840 | } | 1842 | } |
1841 | 1843 | ||
1842 | /* ASSERT: we have a valid association at this point. */ | 1844 | /* ASSERT: we have a valid association at this point. */ |
1843 | SCTP_DEBUG_PRINTK("We have a valid association.\n"); | 1845 | SCTP_DEBUG_PRINTK("We have a valid association.\n"); |
1844 | 1846 | ||
1845 | if (!sinfo) { | 1847 | if (!sinfo) { |
1846 | /* If the user didn't specify SNDRCVINFO, make up one with | 1848 | /* If the user didn't specify SNDRCVINFO, make up one with |
1847 | * some defaults. | 1849 | * some defaults. |
1848 | */ | 1850 | */ |
1849 | memset(&default_sinfo, 0, sizeof(default_sinfo)); | 1851 | memset(&default_sinfo, 0, sizeof(default_sinfo)); |
1850 | default_sinfo.sinfo_stream = asoc->default_stream; | 1852 | default_sinfo.sinfo_stream = asoc->default_stream; |
1851 | default_sinfo.sinfo_flags = asoc->default_flags; | 1853 | default_sinfo.sinfo_flags = asoc->default_flags; |
1852 | default_sinfo.sinfo_ppid = asoc->default_ppid; | 1854 | default_sinfo.sinfo_ppid = asoc->default_ppid; |
1853 | default_sinfo.sinfo_context = asoc->default_context; | 1855 | default_sinfo.sinfo_context = asoc->default_context; |
1854 | default_sinfo.sinfo_timetolive = asoc->default_timetolive; | 1856 | default_sinfo.sinfo_timetolive = asoc->default_timetolive; |
1855 | default_sinfo.sinfo_assoc_id = sctp_assoc2id(asoc); | 1857 | default_sinfo.sinfo_assoc_id = sctp_assoc2id(asoc); |
1856 | sinfo = &default_sinfo; | 1858 | sinfo = &default_sinfo; |
1857 | } | 1859 | } |
1858 | 1860 | ||
1859 | /* API 7.1.7, the sndbuf size per association bounds the | 1861 | /* API 7.1.7, the sndbuf size per association bounds the |
1860 | * maximum size of data that can be sent in a single send call. | 1862 | * maximum size of data that can be sent in a single send call. |
1861 | */ | 1863 | */ |
1862 | if (msg_len > sk->sk_sndbuf) { | 1864 | if (msg_len > sk->sk_sndbuf) { |
1863 | err = -EMSGSIZE; | 1865 | err = -EMSGSIZE; |
1864 | goto out_free; | 1866 | goto out_free; |
1865 | } | 1867 | } |
1866 | 1868 | ||
1867 | if (asoc->pmtu_pending) | 1869 | if (asoc->pmtu_pending) |
1868 | sctp_assoc_pending_pmtu(sk, asoc); | 1870 | sctp_assoc_pending_pmtu(sk, asoc); |
1869 | 1871 | ||
1870 | /* If fragmentation is disabled and the message length exceeds the | 1872 | /* If fragmentation is disabled and the message length exceeds the |
1871 | * association fragmentation point, return EMSGSIZE. The I-D | 1873 | * association fragmentation point, return EMSGSIZE. The I-D |
1872 | * does not specify what this error is, but this looks like | 1874 | * does not specify what this error is, but this looks like |
1873 | * a great fit. | 1875 | * a great fit. |
1874 | */ | 1876 | */ |
1875 | if (sctp_sk(sk)->disable_fragments && (msg_len > asoc->frag_point)) { | 1877 | if (sctp_sk(sk)->disable_fragments && (msg_len > asoc->frag_point)) { |
1876 | err = -EMSGSIZE; | 1878 | err = -EMSGSIZE; |
1877 | goto out_free; | 1879 | goto out_free; |
1878 | } | 1880 | } |
1879 | 1881 | ||
1880 | /* Check for invalid stream. */ | 1882 | /* Check for invalid stream. */ |
1881 | if (sinfo->sinfo_stream >= asoc->c.sinit_num_ostreams) { | 1883 | if (sinfo->sinfo_stream >= asoc->c.sinit_num_ostreams) { |
1882 | err = -EINVAL; | 1884 | err = -EINVAL; |
1883 | goto out_free; | 1885 | goto out_free; |
1884 | } | 1886 | } |
1885 | 1887 | ||
1886 | timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT); | 1888 | timeo = sock_sndtimeo(sk, msg->msg_flags & MSG_DONTWAIT); |
1887 | if (!sctp_wspace(asoc)) { | 1889 | if (!sctp_wspace(asoc)) { |
1888 | err = sctp_wait_for_sndbuf(asoc, &timeo, msg_len); | 1890 | err = sctp_wait_for_sndbuf(asoc, &timeo, msg_len); |
1889 | if (err) | 1891 | if (err) |
1890 | goto out_free; | 1892 | goto out_free; |
1891 | } | 1893 | } |
1892 | 1894 | ||
1893 | /* If an address is passed with the sendto/sendmsg call, it is used | 1895 | /* If an address is passed with the sendto/sendmsg call, it is used |
1894 | * to override the primary destination address in the TCP model, or | 1896 | * to override the primary destination address in the TCP model, or |
1895 | * when SCTP_ADDR_OVER flag is set in the UDP model. | 1897 | * when SCTP_ADDR_OVER flag is set in the UDP model. |
1896 | */ | 1898 | */ |
1897 | if ((sctp_style(sk, TCP) && msg_name) || | 1899 | if ((sctp_style(sk, TCP) && msg_name) || |
1898 | (sinfo_flags & SCTP_ADDR_OVER)) { | 1900 | (sinfo_flags & SCTP_ADDR_OVER)) { |
1899 | chunk_tp = sctp_assoc_lookup_paddr(asoc, &to); | 1901 | chunk_tp = sctp_assoc_lookup_paddr(asoc, &to); |
1900 | if (!chunk_tp) { | 1902 | if (!chunk_tp) { |
1901 | err = -EINVAL; | 1903 | err = -EINVAL; |
1902 | goto out_free; | 1904 | goto out_free; |
1903 | } | 1905 | } |
1904 | } else | 1906 | } else |
1905 | chunk_tp = NULL; | 1907 | chunk_tp = NULL; |
1906 | 1908 | ||
1907 | /* Auto-connect, if we aren't connected already. */ | 1909 | /* Auto-connect, if we aren't connected already. */ |
1908 | if (sctp_state(asoc, CLOSED)) { | 1910 | if (sctp_state(asoc, CLOSED)) { |
1909 | err = sctp_primitive_ASSOCIATE(net, asoc, NULL); | 1911 | err = sctp_primitive_ASSOCIATE(net, asoc, NULL); |
1910 | if (err < 0) | 1912 | if (err < 0) |
1911 | goto out_free; | 1913 | goto out_free; |
1912 | SCTP_DEBUG_PRINTK("We associated primitively.\n"); | 1914 | SCTP_DEBUG_PRINTK("We associated primitively.\n"); |
1913 | } | 1915 | } |
1914 | 1916 | ||
1915 | /* Break the message into multiple chunks of maximum size. */ | 1917 | /* Break the message into multiple chunks of maximum size. */ |
1916 | datamsg = sctp_datamsg_from_user(asoc, sinfo, msg, msg_len); | 1918 | datamsg = sctp_datamsg_from_user(asoc, sinfo, msg, msg_len); |
1917 | if (!datamsg) { | 1919 | if (!datamsg) { |
1918 | err = -ENOMEM; | 1920 | err = -ENOMEM; |
1919 | goto out_free; | 1921 | goto out_free; |
1920 | } | 1922 | } |
1921 | 1923 | ||
1922 | /* Now send the (possibly) fragmented message. */ | 1924 | /* Now send the (possibly) fragmented message. */ |
1923 | list_for_each_entry(chunk, &datamsg->chunks, frag_list) { | 1925 | list_for_each_entry(chunk, &datamsg->chunks, frag_list) { |
1924 | sctp_chunk_hold(chunk); | 1926 | sctp_chunk_hold(chunk); |
1925 | 1927 | ||
1926 | /* Do accounting for the write space. */ | 1928 | /* Do accounting for the write space. */ |
1927 | sctp_set_owner_w(chunk); | 1929 | sctp_set_owner_w(chunk); |
1928 | 1930 | ||
1929 | chunk->transport = chunk_tp; | 1931 | chunk->transport = chunk_tp; |
1930 | } | 1932 | } |
1931 | 1933 | ||
1932 | /* Send it to the lower layers. Note: all chunks | 1934 | /* Send it to the lower layers. Note: all chunks |
1933 | * must either fail or succeed. The lower layer | 1935 | * must either fail or succeed. The lower layer |
1934 | * works that way today. Keep it that way or this | 1936 | * works that way today. Keep it that way or this |
1935 | * breaks. | 1937 | * breaks. |
1936 | */ | 1938 | */ |
1937 | err = sctp_primitive_SEND(net, asoc, datamsg); | 1939 | err = sctp_primitive_SEND(net, asoc, datamsg); |
1938 | /* Did the lower layer accept the chunk? */ | 1940 | /* Did the lower layer accept the chunk? */ |
1939 | if (err) | 1941 | if (err) |
1940 | sctp_datamsg_free(datamsg); | 1942 | sctp_datamsg_free(datamsg); |
1941 | else | 1943 | else |
1942 | sctp_datamsg_put(datamsg); | 1944 | sctp_datamsg_put(datamsg); |
1943 | 1945 | ||
1944 | SCTP_DEBUG_PRINTK("We sent primitively.\n"); | 1946 | SCTP_DEBUG_PRINTK("We sent primitively.\n"); |
1945 | 1947 | ||
1946 | if (err) | 1948 | if (err) |
1947 | goto out_free; | 1949 | goto out_free; |
1948 | else | 1950 | else |
1949 | err = msg_len; | 1951 | err = msg_len; |
1950 | 1952 | ||
1951 | /* If we are already past ASSOCIATE, the lower | 1953 | /* If we are already past ASSOCIATE, the lower |
1952 | * layers are responsible for association cleanup. | 1954 | * layers are responsible for association cleanup. |
1953 | */ | 1955 | */ |
1954 | goto out_unlock; | 1956 | goto out_unlock; |
1955 | 1957 | ||
1956 | out_free: | 1958 | out_free: |
1957 | if (new_asoc) { | 1959 | if (new_asoc) { |
1958 | sctp_unhash_established(asoc); | 1960 | sctp_unhash_established(asoc); |
1959 | sctp_association_free(asoc); | 1961 | sctp_association_free(asoc); |
1960 | } | 1962 | } |
1961 | out_unlock: | 1963 | out_unlock: |
1962 | sctp_release_sock(sk); | 1964 | sctp_release_sock(sk); |
1963 | 1965 | ||
1964 | out_nounlock: | 1966 | out_nounlock: |
1965 | return sctp_error(sk, msg_flags, err); | 1967 | return sctp_error(sk, msg_flags, err); |
1966 | 1968 | ||
1967 | #if 0 | 1969 | #if 0 |
1968 | do_sock_err: | 1970 | do_sock_err: |
1969 | if (msg_len) | 1971 | if (msg_len) |
1970 | err = msg_len; | 1972 | err = msg_len; |
1971 | else | 1973 | else |
1972 | err = sock_error(sk); | 1974 | err = sock_error(sk); |
1973 | goto out; | 1975 | goto out; |
1974 | 1976 | ||
1975 | do_interrupted: | 1977 | do_interrupted: |
1976 | if (msg_len) | 1978 | if (msg_len) |
1977 | err = msg_len; | 1979 | err = msg_len; |
1978 | goto out; | 1980 | goto out; |
1979 | #endif /* 0 */ | 1981 | #endif /* 0 */ |
1980 | } | 1982 | } |
1981 | 1983 | ||
1982 | /* This is an extended version of skb_pull() that removes the data from the | 1984 | /* This is an extended version of skb_pull() that removes the data from the |
1983 | * start of a skb even when data is spread across the list of skb's in the | 1985 | * start of a skb even when data is spread across the list of skb's in the |
1984 | * frag_list. len specifies the total amount of data that needs to be removed. | 1986 | * frag_list. len specifies the total amount of data that needs to be removed. |
1985 | * when 'len' bytes could be removed from the skb, it returns 0. | 1987 | * when 'len' bytes could be removed from the skb, it returns 0. |
1986 | * If 'len' exceeds the total skb length, it returns the no. of bytes that | 1988 | * If 'len' exceeds the total skb length, it returns the no. of bytes that |
1987 | * could not be removed. | 1989 | * could not be removed. |
1988 | */ | 1990 | */ |
1989 | static int sctp_skb_pull(struct sk_buff *skb, int len) | 1991 | static int sctp_skb_pull(struct sk_buff *skb, int len) |
1990 | { | 1992 | { |
1991 | struct sk_buff *list; | 1993 | struct sk_buff *list; |
1992 | int skb_len = skb_headlen(skb); | 1994 | int skb_len = skb_headlen(skb); |
1993 | int rlen; | 1995 | int rlen; |
1994 | 1996 | ||
1995 | if (len <= skb_len) { | 1997 | if (len <= skb_len) { |
1996 | __skb_pull(skb, len); | 1998 | __skb_pull(skb, len); |
1997 | return 0; | 1999 | return 0; |
1998 | } | 2000 | } |
1999 | len -= skb_len; | 2001 | len -= skb_len; |
2000 | __skb_pull(skb, skb_len); | 2002 | __skb_pull(skb, skb_len); |
2001 | 2003 | ||
2002 | skb_walk_frags(skb, list) { | 2004 | skb_walk_frags(skb, list) { |
2003 | rlen = sctp_skb_pull(list, len); | 2005 | rlen = sctp_skb_pull(list, len); |
2004 | skb->len -= (len-rlen); | 2006 | skb->len -= (len-rlen); |
2005 | skb->data_len -= (len-rlen); | 2007 | skb->data_len -= (len-rlen); |
2006 | 2008 | ||
2007 | if (!rlen) | 2009 | if (!rlen) |
2008 | return 0; | 2010 | return 0; |
2009 | 2011 | ||
2010 | len = rlen; | 2012 | len = rlen; |
2011 | } | 2013 | } |
2012 | 2014 | ||
2013 | return len; | 2015 | return len; |
2014 | } | 2016 | } |
2015 | 2017 | ||
2016 | /* API 3.1.3 recvmsg() - UDP Style Syntax | 2018 | /* API 3.1.3 recvmsg() - UDP Style Syntax |
2017 | * | 2019 | * |
2018 | * ssize_t recvmsg(int socket, struct msghdr *message, | 2020 | * ssize_t recvmsg(int socket, struct msghdr *message, |
2019 | * int flags); | 2021 | * int flags); |
2020 | * | 2022 | * |
2021 | * socket - the socket descriptor of the endpoint. | 2023 | * socket - the socket descriptor of the endpoint. |
2022 | * message - pointer to the msghdr structure which contains a single | 2024 | * message - pointer to the msghdr structure which contains a single |
2023 | * user message and possibly some ancillary data. | 2025 | * user message and possibly some ancillary data. |
2024 | * | 2026 | * |
2025 | * See Section 5 for complete description of the data | 2027 | * See Section 5 for complete description of the data |
2026 | * structures. | 2028 | * structures. |
2027 | * | 2029 | * |
2028 | * flags - flags sent or received with the user message, see Section | 2030 | * flags - flags sent or received with the user message, see Section |
2029 | * 5 for complete description of the flags. | 2031 | * 5 for complete description of the flags. |
2030 | */ | 2032 | */ |
2031 | static struct sk_buff *sctp_skb_recv_datagram(struct sock *, int, int, int *); | 2033 | static struct sk_buff *sctp_skb_recv_datagram(struct sock *, int, int, int *); |
2032 | 2034 | ||
2033 | SCTP_STATIC int sctp_recvmsg(struct kiocb *iocb, struct sock *sk, | 2035 | SCTP_STATIC int sctp_recvmsg(struct kiocb *iocb, struct sock *sk, |
2034 | struct msghdr *msg, size_t len, int noblock, | 2036 | struct msghdr *msg, size_t len, int noblock, |
2035 | int flags, int *addr_len) | 2037 | int flags, int *addr_len) |
2036 | { | 2038 | { |
2037 | struct sctp_ulpevent *event = NULL; | 2039 | struct sctp_ulpevent *event = NULL; |
2038 | struct sctp_sock *sp = sctp_sk(sk); | 2040 | struct sctp_sock *sp = sctp_sk(sk); |
2039 | struct sk_buff *skb; | 2041 | struct sk_buff *skb; |
2040 | int copied; | 2042 | int copied; |
2041 | int err = 0; | 2043 | int err = 0; |
2042 | int skb_len; | 2044 | int skb_len; |
2043 | 2045 | ||
2044 | SCTP_DEBUG_PRINTK("sctp_recvmsg(%s: %p, %s: %p, %s: %zd, %s: %d, %s: " | 2046 | SCTP_DEBUG_PRINTK("sctp_recvmsg(%s: %p, %s: %p, %s: %zd, %s: %d, %s: " |
2045 | "0x%x, %s: %p)\n", "sk", sk, "msghdr", msg, | 2047 | "0x%x, %s: %p)\n", "sk", sk, "msghdr", msg, |
2046 | "len", len, "knoblauch", noblock, | 2048 | "len", len, "knoblauch", noblock, |
2047 | "flags", flags, "addr_len", addr_len); | 2049 | "flags", flags, "addr_len", addr_len); |
2048 | 2050 | ||
2049 | sctp_lock_sock(sk); | 2051 | sctp_lock_sock(sk); |
2050 | 2052 | ||
2051 | if (sctp_style(sk, TCP) && !sctp_sstate(sk, ESTABLISHED)) { | 2053 | if (sctp_style(sk, TCP) && !sctp_sstate(sk, ESTABLISHED)) { |
2052 | err = -ENOTCONN; | 2054 | err = -ENOTCONN; |
2053 | goto out; | 2055 | goto out; |
2054 | } | 2056 | } |
2055 | 2057 | ||
2056 | skb = sctp_skb_recv_datagram(sk, flags, noblock, &err); | 2058 | skb = sctp_skb_recv_datagram(sk, flags, noblock, &err); |
2057 | if (!skb) | 2059 | if (!skb) |
2058 | goto out; | 2060 | goto out; |
2059 | 2061 | ||
2060 | /* Get the total length of the skb including any skb's in the | 2062 | /* Get the total length of the skb including any skb's in the |
2061 | * frag_list. | 2063 | * frag_list. |
2062 | */ | 2064 | */ |
2063 | skb_len = skb->len; | 2065 | skb_len = skb->len; |
2064 | 2066 | ||
2065 | copied = skb_len; | 2067 | copied = skb_len; |
2066 | if (copied > len) | 2068 | if (copied > len) |
2067 | copied = len; | 2069 | copied = len; |
2068 | 2070 | ||
2069 | err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied); | 2071 | err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied); |
2070 | 2072 | ||
2071 | event = sctp_skb2event(skb); | 2073 | event = sctp_skb2event(skb); |
2072 | 2074 | ||
2073 | if (err) | 2075 | if (err) |
2074 | goto out_free; | 2076 | goto out_free; |
2075 | 2077 | ||
2076 | sock_recv_ts_and_drops(msg, sk, skb); | 2078 | sock_recv_ts_and_drops(msg, sk, skb); |
2077 | if (sctp_ulpevent_is_notification(event)) { | 2079 | if (sctp_ulpevent_is_notification(event)) { |
2078 | msg->msg_flags |= MSG_NOTIFICATION; | 2080 | msg->msg_flags |= MSG_NOTIFICATION; |
2079 | sp->pf->event_msgname(event, msg->msg_name, addr_len); | 2081 | sp->pf->event_msgname(event, msg->msg_name, addr_len); |
2080 | } else { | 2082 | } else { |
2081 | sp->pf->skb_msgname(skb, msg->msg_name, addr_len); | 2083 | sp->pf->skb_msgname(skb, msg->msg_name, addr_len); |
2082 | } | 2084 | } |
2083 | 2085 | ||
2084 | /* Check if we allow SCTP_SNDRCVINFO. */ | 2086 | /* Check if we allow SCTP_SNDRCVINFO. */ |
2085 | if (sp->subscribe.sctp_data_io_event) | 2087 | if (sp->subscribe.sctp_data_io_event) |
2086 | sctp_ulpevent_read_sndrcvinfo(event, msg); | 2088 | sctp_ulpevent_read_sndrcvinfo(event, msg); |
2087 | #if 0 | 2089 | #if 0 |
2088 | /* FIXME: we should be calling IP/IPv6 layers. */ | 2090 | /* FIXME: we should be calling IP/IPv6 layers. */ |
2089 | if (sk->sk_protinfo.af_inet.cmsg_flags) | 2091 | if (sk->sk_protinfo.af_inet.cmsg_flags) |
2090 | ip_cmsg_recv(msg, skb); | 2092 | ip_cmsg_recv(msg, skb); |
2091 | #endif | 2093 | #endif |
2092 | 2094 | ||
2093 | err = copied; | 2095 | err = copied; |
2094 | 2096 | ||
2095 | /* If skb's length exceeds the user's buffer, update the skb and | 2097 | /* If skb's length exceeds the user's buffer, update the skb and |
2096 | * push it back to the receive_queue so that the next call to | 2098 | * push it back to the receive_queue so that the next call to |
2097 | * recvmsg() will return the remaining data. Don't set MSG_EOR. | 2099 | * recvmsg() will return the remaining data. Don't set MSG_EOR. |
2098 | */ | 2100 | */ |
2099 | if (skb_len > copied) { | 2101 | if (skb_len > copied) { |
2100 | msg->msg_flags &= ~MSG_EOR; | 2102 | msg->msg_flags &= ~MSG_EOR; |
2101 | if (flags & MSG_PEEK) | 2103 | if (flags & MSG_PEEK) |
2102 | goto out_free; | 2104 | goto out_free; |
2103 | sctp_skb_pull(skb, copied); | 2105 | sctp_skb_pull(skb, copied); |
2104 | skb_queue_head(&sk->sk_receive_queue, skb); | 2106 | skb_queue_head(&sk->sk_receive_queue, skb); |
2105 | 2107 | ||
2106 | /* When only partial message is copied to the user, increase | 2108 | /* When only partial message is copied to the user, increase |
2107 | * rwnd by that amount. If all the data in the skb is read, | 2109 | * rwnd by that amount. If all the data in the skb is read, |
2108 | * rwnd is updated when the event is freed. | 2110 | * rwnd is updated when the event is freed. |
2109 | */ | 2111 | */ |
2110 | if (!sctp_ulpevent_is_notification(event)) | 2112 | if (!sctp_ulpevent_is_notification(event)) |
2111 | sctp_assoc_rwnd_increase(event->asoc, copied); | 2113 | sctp_assoc_rwnd_increase(event->asoc, copied); |
2112 | goto out; | 2114 | goto out; |
2113 | } else if ((event->msg_flags & MSG_NOTIFICATION) || | 2115 | } else if ((event->msg_flags & MSG_NOTIFICATION) || |
2114 | (event->msg_flags & MSG_EOR)) | 2116 | (event->msg_flags & MSG_EOR)) |
2115 | msg->msg_flags |= MSG_EOR; | 2117 | msg->msg_flags |= MSG_EOR; |
2116 | else | 2118 | else |
2117 | msg->msg_flags &= ~MSG_EOR; | 2119 | msg->msg_flags &= ~MSG_EOR; |
2118 | 2120 | ||
2119 | out_free: | 2121 | out_free: |
2120 | if (flags & MSG_PEEK) { | 2122 | if (flags & MSG_PEEK) { |
2121 | /* Release the skb reference acquired after peeking the skb in | 2123 | /* Release the skb reference acquired after peeking the skb in |
2122 | * sctp_skb_recv_datagram(). | 2124 | * sctp_skb_recv_datagram(). |
2123 | */ | 2125 | */ |
2124 | kfree_skb(skb); | 2126 | kfree_skb(skb); |
2125 | } else { | 2127 | } else { |
2126 | /* Free the event which includes releasing the reference to | 2128 | /* Free the event which includes releasing the reference to |
2127 | * the owner of the skb, freeing the skb and updating the | 2129 | * the owner of the skb, freeing the skb and updating the |
2128 | * rwnd. | 2130 | * rwnd. |
2129 | */ | 2131 | */ |
2130 | sctp_ulpevent_free(event); | 2132 | sctp_ulpevent_free(event); |
2131 | } | 2133 | } |
2132 | out: | 2134 | out: |
2133 | sctp_release_sock(sk); | 2135 | sctp_release_sock(sk); |
2134 | return err; | 2136 | return err; |
2135 | } | 2137 | } |
2136 | 2138 | ||
2137 | /* 7.1.12 Enable/Disable message fragmentation (SCTP_DISABLE_FRAGMENTS) | 2139 | /* 7.1.12 Enable/Disable message fragmentation (SCTP_DISABLE_FRAGMENTS) |
2138 | * | 2140 | * |
2139 | * This option is a on/off flag. If enabled no SCTP message | 2141 | * This option is a on/off flag. If enabled no SCTP message |
2140 | * fragmentation will be performed. Instead if a message being sent | 2142 | * fragmentation will be performed. Instead if a message being sent |
2141 | * exceeds the current PMTU size, the message will NOT be sent and | 2143 | * exceeds the current PMTU size, the message will NOT be sent and |
2142 | * instead a error will be indicated to the user. | 2144 | * instead a error will be indicated to the user. |
2143 | */ | 2145 | */ |
2144 | static int sctp_setsockopt_disable_fragments(struct sock *sk, | 2146 | static int sctp_setsockopt_disable_fragments(struct sock *sk, |
2145 | char __user *optval, | 2147 | char __user *optval, |
2146 | unsigned int optlen) | 2148 | unsigned int optlen) |
2147 | { | 2149 | { |
2148 | int val; | 2150 | int val; |
2149 | 2151 | ||
2150 | if (optlen < sizeof(int)) | 2152 | if (optlen < sizeof(int)) |
2151 | return -EINVAL; | 2153 | return -EINVAL; |
2152 | 2154 | ||
2153 | if (get_user(val, (int __user *)optval)) | 2155 | if (get_user(val, (int __user *)optval)) |
2154 | return -EFAULT; | 2156 | return -EFAULT; |
2155 | 2157 | ||
2156 | sctp_sk(sk)->disable_fragments = (val == 0) ? 0 : 1; | 2158 | sctp_sk(sk)->disable_fragments = (val == 0) ? 0 : 1; |
2157 | 2159 | ||
2158 | return 0; | 2160 | return 0; |
2159 | } | 2161 | } |
2160 | 2162 | ||
2161 | static int sctp_setsockopt_events(struct sock *sk, char __user *optval, | 2163 | static int sctp_setsockopt_events(struct sock *sk, char __user *optval, |
2162 | unsigned int optlen) | 2164 | unsigned int optlen) |
2163 | { | 2165 | { |
2164 | struct sctp_association *asoc; | 2166 | struct sctp_association *asoc; |
2165 | struct sctp_ulpevent *event; | 2167 | struct sctp_ulpevent *event; |
2166 | 2168 | ||
2167 | if (optlen > sizeof(struct sctp_event_subscribe)) | 2169 | if (optlen > sizeof(struct sctp_event_subscribe)) |
2168 | return -EINVAL; | 2170 | return -EINVAL; |
2169 | if (copy_from_user(&sctp_sk(sk)->subscribe, optval, optlen)) | 2171 | if (copy_from_user(&sctp_sk(sk)->subscribe, optval, optlen)) |
2170 | return -EFAULT; | 2172 | return -EFAULT; |
2171 | 2173 | ||
2172 | /* | 2174 | /* |
2173 | * At the time when a user app subscribes to SCTP_SENDER_DRY_EVENT, | 2175 | * At the time when a user app subscribes to SCTP_SENDER_DRY_EVENT, |
2174 | * if there is no data to be sent or retransmit, the stack will | 2176 | * if there is no data to be sent or retransmit, the stack will |
2175 | * immediately send up this notification. | 2177 | * immediately send up this notification. |
2176 | */ | 2178 | */ |
2177 | if (sctp_ulpevent_type_enabled(SCTP_SENDER_DRY_EVENT, | 2179 | if (sctp_ulpevent_type_enabled(SCTP_SENDER_DRY_EVENT, |
2178 | &sctp_sk(sk)->subscribe)) { | 2180 | &sctp_sk(sk)->subscribe)) { |
2179 | asoc = sctp_id2assoc(sk, 0); | 2181 | asoc = sctp_id2assoc(sk, 0); |
2180 | 2182 | ||
2181 | if (asoc && sctp_outq_is_empty(&asoc->outqueue)) { | 2183 | if (asoc && sctp_outq_is_empty(&asoc->outqueue)) { |
2182 | event = sctp_ulpevent_make_sender_dry_event(asoc, | 2184 | event = sctp_ulpevent_make_sender_dry_event(asoc, |
2183 | GFP_ATOMIC); | 2185 | GFP_ATOMIC); |
2184 | if (!event) | 2186 | if (!event) |
2185 | return -ENOMEM; | 2187 | return -ENOMEM; |
2186 | 2188 | ||
2187 | sctp_ulpq_tail_event(&asoc->ulpq, event); | 2189 | sctp_ulpq_tail_event(&asoc->ulpq, event); |
2188 | } | 2190 | } |
2189 | } | 2191 | } |
2190 | 2192 | ||
2191 | return 0; | 2193 | return 0; |
2192 | } | 2194 | } |
2193 | 2195 | ||
2194 | /* 7.1.8 Automatic Close of associations (SCTP_AUTOCLOSE) | 2196 | /* 7.1.8 Automatic Close of associations (SCTP_AUTOCLOSE) |
2195 | * | 2197 | * |
2196 | * This socket option is applicable to the UDP-style socket only. When | 2198 | * This socket option is applicable to the UDP-style socket only. When |
2197 | * set it will cause associations that are idle for more than the | 2199 | * set it will cause associations that are idle for more than the |
2198 | * specified number of seconds to automatically close. An association | 2200 | * specified number of seconds to automatically close. An association |
2199 | * being idle is defined an association that has NOT sent or received | 2201 | * being idle is defined an association that has NOT sent or received |
2200 | * user data. The special value of '0' indicates that no automatic | 2202 | * user data. The special value of '0' indicates that no automatic |
2201 | * close of any associations should be performed. The option expects an | 2203 | * close of any associations should be performed. The option expects an |
2202 | * integer defining the number of seconds of idle time before an | 2204 | * integer defining the number of seconds of idle time before an |
2203 | * association is closed. | 2205 | * association is closed. |
2204 | */ | 2206 | */ |
2205 | static int sctp_setsockopt_autoclose(struct sock *sk, char __user *optval, | 2207 | static int sctp_setsockopt_autoclose(struct sock *sk, char __user *optval, |
2206 | unsigned int optlen) | 2208 | unsigned int optlen) |
2207 | { | 2209 | { |
2208 | struct sctp_sock *sp = sctp_sk(sk); | 2210 | struct sctp_sock *sp = sctp_sk(sk); |
2209 | 2211 | ||
2210 | /* Applicable to UDP-style socket only */ | 2212 | /* Applicable to UDP-style socket only */ |
2211 | if (sctp_style(sk, TCP)) | 2213 | if (sctp_style(sk, TCP)) |
2212 | return -EOPNOTSUPP; | 2214 | return -EOPNOTSUPP; |
2213 | if (optlen != sizeof(int)) | 2215 | if (optlen != sizeof(int)) |
2214 | return -EINVAL; | 2216 | return -EINVAL; |
2215 | if (copy_from_user(&sp->autoclose, optval, optlen)) | 2217 | if (copy_from_user(&sp->autoclose, optval, optlen)) |
2216 | return -EFAULT; | 2218 | return -EFAULT; |
2217 | 2219 | ||
2218 | return 0; | 2220 | return 0; |
2219 | } | 2221 | } |
2220 | 2222 | ||
2221 | /* 7.1.13 Peer Address Parameters (SCTP_PEER_ADDR_PARAMS) | 2223 | /* 7.1.13 Peer Address Parameters (SCTP_PEER_ADDR_PARAMS) |
2222 | * | 2224 | * |
2223 | * Applications can enable or disable heartbeats for any peer address of | 2225 | * Applications can enable or disable heartbeats for any peer address of |
2224 | * an association, modify an address's heartbeat interval, force a | 2226 | * an association, modify an address's heartbeat interval, force a |
2225 | * heartbeat to be sent immediately, and adjust the address's maximum | 2227 | * heartbeat to be sent immediately, and adjust the address's maximum |
2226 | * number of retransmissions sent before an address is considered | 2228 | * number of retransmissions sent before an address is considered |
2227 | * unreachable. The following structure is used to access and modify an | 2229 | * unreachable. The following structure is used to access and modify an |
2228 | * address's parameters: | 2230 | * address's parameters: |
2229 | * | 2231 | * |
2230 | * struct sctp_paddrparams { | 2232 | * struct sctp_paddrparams { |
2231 | * sctp_assoc_t spp_assoc_id; | 2233 | * sctp_assoc_t spp_assoc_id; |
2232 | * struct sockaddr_storage spp_address; | 2234 | * struct sockaddr_storage spp_address; |
2233 | * uint32_t spp_hbinterval; | 2235 | * uint32_t spp_hbinterval; |
2234 | * uint16_t spp_pathmaxrxt; | 2236 | * uint16_t spp_pathmaxrxt; |
2235 | * uint32_t spp_pathmtu; | 2237 | * uint32_t spp_pathmtu; |
2236 | * uint32_t spp_sackdelay; | 2238 | * uint32_t spp_sackdelay; |
2237 | * uint32_t spp_flags; | 2239 | * uint32_t spp_flags; |
2238 | * }; | 2240 | * }; |
2239 | * | 2241 | * |
2240 | * spp_assoc_id - (one-to-many style socket) This is filled in the | 2242 | * spp_assoc_id - (one-to-many style socket) This is filled in the |
2241 | * application, and identifies the association for | 2243 | * application, and identifies the association for |
2242 | * this query. | 2244 | * this query. |
2243 | * spp_address - This specifies which address is of interest. | 2245 | * spp_address - This specifies which address is of interest. |
2244 | * spp_hbinterval - This contains the value of the heartbeat interval, | 2246 | * spp_hbinterval - This contains the value of the heartbeat interval, |
2245 | * in milliseconds. If a value of zero | 2247 | * in milliseconds. If a value of zero |
2246 | * is present in this field then no changes are to | 2248 | * is present in this field then no changes are to |
2247 | * be made to this parameter. | 2249 | * be made to this parameter. |
2248 | * spp_pathmaxrxt - This contains the maximum number of | 2250 | * spp_pathmaxrxt - This contains the maximum number of |
2249 | * retransmissions before this address shall be | 2251 | * retransmissions before this address shall be |
2250 | * considered unreachable. If a value of zero | 2252 | * considered unreachable. If a value of zero |
2251 | * is present in this field then no changes are to | 2253 | * is present in this field then no changes are to |
2252 | * be made to this parameter. | 2254 | * be made to this parameter. |
2253 | * spp_pathmtu - When Path MTU discovery is disabled the value | 2255 | * spp_pathmtu - When Path MTU discovery is disabled the value |
2254 | * specified here will be the "fixed" path mtu. | 2256 | * specified here will be the "fixed" path mtu. |
2255 | * Note that if the spp_address field is empty | 2257 | * Note that if the spp_address field is empty |
2256 | * then all associations on this address will | 2258 | * then all associations on this address will |
2257 | * have this fixed path mtu set upon them. | 2259 | * have this fixed path mtu set upon them. |
2258 | * | 2260 | * |
2259 | * spp_sackdelay - When delayed sack is enabled, this value specifies | 2261 | * spp_sackdelay - When delayed sack is enabled, this value specifies |
2260 | * the number of milliseconds that sacks will be delayed | 2262 | * the number of milliseconds that sacks will be delayed |
2261 | * for. This value will apply to all addresses of an | 2263 | * for. This value will apply to all addresses of an |
2262 | * association if the spp_address field is empty. Note | 2264 | * association if the spp_address field is empty. Note |
2263 | * also, that if delayed sack is enabled and this | 2265 | * also, that if delayed sack is enabled and this |
2264 | * value is set to 0, no change is made to the last | 2266 | * value is set to 0, no change is made to the last |
2265 | * recorded delayed sack timer value. | 2267 | * recorded delayed sack timer value. |
2266 | * | 2268 | * |
2267 | * spp_flags - These flags are used to control various features | 2269 | * spp_flags - These flags are used to control various features |
2268 | * on an association. The flag field may contain | 2270 | * on an association. The flag field may contain |
2269 | * zero or more of the following options. | 2271 | * zero or more of the following options. |
2270 | * | 2272 | * |
2271 | * SPP_HB_ENABLE - Enable heartbeats on the | 2273 | * SPP_HB_ENABLE - Enable heartbeats on the |
2272 | * specified address. Note that if the address | 2274 | * specified address. Note that if the address |
2273 | * field is empty all addresses for the association | 2275 | * field is empty all addresses for the association |
2274 | * have heartbeats enabled upon them. | 2276 | * have heartbeats enabled upon them. |
2275 | * | 2277 | * |
2276 | * SPP_HB_DISABLE - Disable heartbeats on the | 2278 | * SPP_HB_DISABLE - Disable heartbeats on the |
2277 | * speicifed address. Note that if the address | 2279 | * speicifed address. Note that if the address |
2278 | * field is empty all addresses for the association | 2280 | * field is empty all addresses for the association |
2279 | * will have their heartbeats disabled. Note also | 2281 | * will have their heartbeats disabled. Note also |
2280 | * that SPP_HB_ENABLE and SPP_HB_DISABLE are | 2282 | * that SPP_HB_ENABLE and SPP_HB_DISABLE are |
2281 | * mutually exclusive, only one of these two should | 2283 | * mutually exclusive, only one of these two should |
2282 | * be specified. Enabling both fields will have | 2284 | * be specified. Enabling both fields will have |
2283 | * undetermined results. | 2285 | * undetermined results. |
2284 | * | 2286 | * |
2285 | * SPP_HB_DEMAND - Request a user initiated heartbeat | 2287 | * SPP_HB_DEMAND - Request a user initiated heartbeat |
2286 | * to be made immediately. | 2288 | * to be made immediately. |
2287 | * | 2289 | * |
2288 | * SPP_HB_TIME_IS_ZERO - Specify's that the time for | 2290 | * SPP_HB_TIME_IS_ZERO - Specify's that the time for |
2289 | * heartbeat delayis to be set to the value of 0 | 2291 | * heartbeat delayis to be set to the value of 0 |
2290 | * milliseconds. | 2292 | * milliseconds. |
2291 | * | 2293 | * |
2292 | * SPP_PMTUD_ENABLE - This field will enable PMTU | 2294 | * SPP_PMTUD_ENABLE - This field will enable PMTU |
2293 | * discovery upon the specified address. Note that | 2295 | * discovery upon the specified address. Note that |
2294 | * if the address feild is empty then all addresses | 2296 | * if the address feild is empty then all addresses |
2295 | * on the association are effected. | 2297 | * on the association are effected. |
2296 | * | 2298 | * |
2297 | * SPP_PMTUD_DISABLE - This field will disable PMTU | 2299 | * SPP_PMTUD_DISABLE - This field will disable PMTU |
2298 | * discovery upon the specified address. Note that | 2300 | * discovery upon the specified address. Note that |
2299 | * if the address feild is empty then all addresses | 2301 | * if the address feild is empty then all addresses |
2300 | * on the association are effected. Not also that | 2302 | * on the association are effected. Not also that |
2301 | * SPP_PMTUD_ENABLE and SPP_PMTUD_DISABLE are mutually | 2303 | * SPP_PMTUD_ENABLE and SPP_PMTUD_DISABLE are mutually |
2302 | * exclusive. Enabling both will have undetermined | 2304 | * exclusive. Enabling both will have undetermined |
2303 | * results. | 2305 | * results. |
2304 | * | 2306 | * |
2305 | * SPP_SACKDELAY_ENABLE - Setting this flag turns | 2307 | * SPP_SACKDELAY_ENABLE - Setting this flag turns |
2306 | * on delayed sack. The time specified in spp_sackdelay | 2308 | * on delayed sack. The time specified in spp_sackdelay |
2307 | * is used to specify the sack delay for this address. Note | 2309 | * is used to specify the sack delay for this address. Note |
2308 | * that if spp_address is empty then all addresses will | 2310 | * that if spp_address is empty then all addresses will |
2309 | * enable delayed sack and take on the sack delay | 2311 | * enable delayed sack and take on the sack delay |
2310 | * value specified in spp_sackdelay. | 2312 | * value specified in spp_sackdelay. |
2311 | * SPP_SACKDELAY_DISABLE - Setting this flag turns | 2313 | * SPP_SACKDELAY_DISABLE - Setting this flag turns |
2312 | * off delayed sack. If the spp_address field is blank then | 2314 | * off delayed sack. If the spp_address field is blank then |
2313 | * delayed sack is disabled for the entire association. Note | 2315 | * delayed sack is disabled for the entire association. Note |
2314 | * also that this field is mutually exclusive to | 2316 | * also that this field is mutually exclusive to |
2315 | * SPP_SACKDELAY_ENABLE, setting both will have undefined | 2317 | * SPP_SACKDELAY_ENABLE, setting both will have undefined |
2316 | * results. | 2318 | * results. |
2317 | */ | 2319 | */ |
2318 | static int sctp_apply_peer_addr_params(struct sctp_paddrparams *params, | 2320 | static int sctp_apply_peer_addr_params(struct sctp_paddrparams *params, |
2319 | struct sctp_transport *trans, | 2321 | struct sctp_transport *trans, |
2320 | struct sctp_association *asoc, | 2322 | struct sctp_association *asoc, |
2321 | struct sctp_sock *sp, | 2323 | struct sctp_sock *sp, |
2322 | int hb_change, | 2324 | int hb_change, |
2323 | int pmtud_change, | 2325 | int pmtud_change, |
2324 | int sackdelay_change) | 2326 | int sackdelay_change) |
2325 | { | 2327 | { |
2326 | int error; | 2328 | int error; |
2327 | 2329 | ||
2328 | if (params->spp_flags & SPP_HB_DEMAND && trans) { | 2330 | if (params->spp_flags & SPP_HB_DEMAND && trans) { |
2329 | struct net *net = sock_net(trans->asoc->base.sk); | 2331 | struct net *net = sock_net(trans->asoc->base.sk); |
2330 | 2332 | ||
2331 | error = sctp_primitive_REQUESTHEARTBEAT(net, trans->asoc, trans); | 2333 | error = sctp_primitive_REQUESTHEARTBEAT(net, trans->asoc, trans); |
2332 | if (error) | 2334 | if (error) |
2333 | return error; | 2335 | return error; |
2334 | } | 2336 | } |
2335 | 2337 | ||
2336 | /* Note that unless the spp_flag is set to SPP_HB_ENABLE the value of | 2338 | /* Note that unless the spp_flag is set to SPP_HB_ENABLE the value of |
2337 | * this field is ignored. Note also that a value of zero indicates | 2339 | * this field is ignored. Note also that a value of zero indicates |
2338 | * the current setting should be left unchanged. | 2340 | * the current setting should be left unchanged. |
2339 | */ | 2341 | */ |
2340 | if (params->spp_flags & SPP_HB_ENABLE) { | 2342 | if (params->spp_flags & SPP_HB_ENABLE) { |
2341 | 2343 | ||
2342 | /* Re-zero the interval if the SPP_HB_TIME_IS_ZERO is | 2344 | /* Re-zero the interval if the SPP_HB_TIME_IS_ZERO is |
2343 | * set. This lets us use 0 value when this flag | 2345 | * set. This lets us use 0 value when this flag |
2344 | * is set. | 2346 | * is set. |
2345 | */ | 2347 | */ |
2346 | if (params->spp_flags & SPP_HB_TIME_IS_ZERO) | 2348 | if (params->spp_flags & SPP_HB_TIME_IS_ZERO) |
2347 | params->spp_hbinterval = 0; | 2349 | params->spp_hbinterval = 0; |
2348 | 2350 | ||
2349 | if (params->spp_hbinterval || | 2351 | if (params->spp_hbinterval || |
2350 | (params->spp_flags & SPP_HB_TIME_IS_ZERO)) { | 2352 | (params->spp_flags & SPP_HB_TIME_IS_ZERO)) { |
2351 | if (trans) { | 2353 | if (trans) { |
2352 | trans->hbinterval = | 2354 | trans->hbinterval = |
2353 | msecs_to_jiffies(params->spp_hbinterval); | 2355 | msecs_to_jiffies(params->spp_hbinterval); |
2354 | } else if (asoc) { | 2356 | } else if (asoc) { |
2355 | asoc->hbinterval = | 2357 | asoc->hbinterval = |
2356 | msecs_to_jiffies(params->spp_hbinterval); | 2358 | msecs_to_jiffies(params->spp_hbinterval); |
2357 | } else { | 2359 | } else { |
2358 | sp->hbinterval = params->spp_hbinterval; | 2360 | sp->hbinterval = params->spp_hbinterval; |
2359 | } | 2361 | } |
2360 | } | 2362 | } |
2361 | } | 2363 | } |
2362 | 2364 | ||
2363 | if (hb_change) { | 2365 | if (hb_change) { |
2364 | if (trans) { | 2366 | if (trans) { |
2365 | trans->param_flags = | 2367 | trans->param_flags = |
2366 | (trans->param_flags & ~SPP_HB) | hb_change; | 2368 | (trans->param_flags & ~SPP_HB) | hb_change; |
2367 | } else if (asoc) { | 2369 | } else if (asoc) { |
2368 | asoc->param_flags = | 2370 | asoc->param_flags = |
2369 | (asoc->param_flags & ~SPP_HB) | hb_change; | 2371 | (asoc->param_flags & ~SPP_HB) | hb_change; |
2370 | } else { | 2372 | } else { |
2371 | sp->param_flags = | 2373 | sp->param_flags = |
2372 | (sp->param_flags & ~SPP_HB) | hb_change; | 2374 | (sp->param_flags & ~SPP_HB) | hb_change; |
2373 | } | 2375 | } |
2374 | } | 2376 | } |
2375 | 2377 | ||
2376 | /* When Path MTU discovery is disabled the value specified here will | 2378 | /* When Path MTU discovery is disabled the value specified here will |
2377 | * be the "fixed" path mtu (i.e. the value of the spp_flags field must | 2379 | * be the "fixed" path mtu (i.e. the value of the spp_flags field must |
2378 | * include the flag SPP_PMTUD_DISABLE for this field to have any | 2380 | * include the flag SPP_PMTUD_DISABLE for this field to have any |
2379 | * effect). | 2381 | * effect). |
2380 | */ | 2382 | */ |
2381 | if ((params->spp_flags & SPP_PMTUD_DISABLE) && params->spp_pathmtu) { | 2383 | if ((params->spp_flags & SPP_PMTUD_DISABLE) && params->spp_pathmtu) { |
2382 | if (trans) { | 2384 | if (trans) { |
2383 | trans->pathmtu = params->spp_pathmtu; | 2385 | trans->pathmtu = params->spp_pathmtu; |
2384 | sctp_assoc_sync_pmtu(sctp_opt2sk(sp), asoc); | 2386 | sctp_assoc_sync_pmtu(sctp_opt2sk(sp), asoc); |
2385 | } else if (asoc) { | 2387 | } else if (asoc) { |
2386 | asoc->pathmtu = params->spp_pathmtu; | 2388 | asoc->pathmtu = params->spp_pathmtu; |
2387 | sctp_frag_point(asoc, params->spp_pathmtu); | 2389 | sctp_frag_point(asoc, params->spp_pathmtu); |
2388 | } else { | 2390 | } else { |
2389 | sp->pathmtu = params->spp_pathmtu; | 2391 | sp->pathmtu = params->spp_pathmtu; |
2390 | } | 2392 | } |
2391 | } | 2393 | } |
2392 | 2394 | ||
2393 | if (pmtud_change) { | 2395 | if (pmtud_change) { |
2394 | if (trans) { | 2396 | if (trans) { |
2395 | int update = (trans->param_flags & SPP_PMTUD_DISABLE) && | 2397 | int update = (trans->param_flags & SPP_PMTUD_DISABLE) && |
2396 | (params->spp_flags & SPP_PMTUD_ENABLE); | 2398 | (params->spp_flags & SPP_PMTUD_ENABLE); |
2397 | trans->param_flags = | 2399 | trans->param_flags = |
2398 | (trans->param_flags & ~SPP_PMTUD) | pmtud_change; | 2400 | (trans->param_flags & ~SPP_PMTUD) | pmtud_change; |
2399 | if (update) { | 2401 | if (update) { |
2400 | sctp_transport_pmtu(trans, sctp_opt2sk(sp)); | 2402 | sctp_transport_pmtu(trans, sctp_opt2sk(sp)); |
2401 | sctp_assoc_sync_pmtu(sctp_opt2sk(sp), asoc); | 2403 | sctp_assoc_sync_pmtu(sctp_opt2sk(sp), asoc); |
2402 | } | 2404 | } |
2403 | } else if (asoc) { | 2405 | } else if (asoc) { |
2404 | asoc->param_flags = | 2406 | asoc->param_flags = |
2405 | (asoc->param_flags & ~SPP_PMTUD) | pmtud_change; | 2407 | (asoc->param_flags & ~SPP_PMTUD) | pmtud_change; |
2406 | } else { | 2408 | } else { |
2407 | sp->param_flags = | 2409 | sp->param_flags = |
2408 | (sp->param_flags & ~SPP_PMTUD) | pmtud_change; | 2410 | (sp->param_flags & ~SPP_PMTUD) | pmtud_change; |
2409 | } | 2411 | } |
2410 | } | 2412 | } |
2411 | 2413 | ||
2412 | /* Note that unless the spp_flag is set to SPP_SACKDELAY_ENABLE the | 2414 | /* Note that unless the spp_flag is set to SPP_SACKDELAY_ENABLE the |
2413 | * value of this field is ignored. Note also that a value of zero | 2415 | * value of this field is ignored. Note also that a value of zero |
2414 | * indicates the current setting should be left unchanged. | 2416 | * indicates the current setting should be left unchanged. |
2415 | */ | 2417 | */ |
2416 | if ((params->spp_flags & SPP_SACKDELAY_ENABLE) && params->spp_sackdelay) { | 2418 | if ((params->spp_flags & SPP_SACKDELAY_ENABLE) && params->spp_sackdelay) { |
2417 | if (trans) { | 2419 | if (trans) { |
2418 | trans->sackdelay = | 2420 | trans->sackdelay = |
2419 | msecs_to_jiffies(params->spp_sackdelay); | 2421 | msecs_to_jiffies(params->spp_sackdelay); |
2420 | } else if (asoc) { | 2422 | } else if (asoc) { |
2421 | asoc->sackdelay = | 2423 | asoc->sackdelay = |
2422 | msecs_to_jiffies(params->spp_sackdelay); | 2424 | msecs_to_jiffies(params->spp_sackdelay); |
2423 | } else { | 2425 | } else { |
2424 | sp->sackdelay = params->spp_sackdelay; | 2426 | sp->sackdelay = params->spp_sackdelay; |
2425 | } | 2427 | } |
2426 | } | 2428 | } |
2427 | 2429 | ||
2428 | if (sackdelay_change) { | 2430 | if (sackdelay_change) { |
2429 | if (trans) { | 2431 | if (trans) { |
2430 | trans->param_flags = | 2432 | trans->param_flags = |
2431 | (trans->param_flags & ~SPP_SACKDELAY) | | 2433 | (trans->param_flags & ~SPP_SACKDELAY) | |
2432 | sackdelay_change; | 2434 | sackdelay_change; |
2433 | } else if (asoc) { | 2435 | } else if (asoc) { |
2434 | asoc->param_flags = | 2436 | asoc->param_flags = |
2435 | (asoc->param_flags & ~SPP_SACKDELAY) | | 2437 | (asoc->param_flags & ~SPP_SACKDELAY) | |
2436 | sackdelay_change; | 2438 | sackdelay_change; |
2437 | } else { | 2439 | } else { |
2438 | sp->param_flags = | 2440 | sp->param_flags = |
2439 | (sp->param_flags & ~SPP_SACKDELAY) | | 2441 | (sp->param_flags & ~SPP_SACKDELAY) | |
2440 | sackdelay_change; | 2442 | sackdelay_change; |
2441 | } | 2443 | } |
2442 | } | 2444 | } |
2443 | 2445 | ||
2444 | /* Note that a value of zero indicates the current setting should be | 2446 | /* Note that a value of zero indicates the current setting should be |
2445 | left unchanged. | 2447 | left unchanged. |
2446 | */ | 2448 | */ |
2447 | if (params->spp_pathmaxrxt) { | 2449 | if (params->spp_pathmaxrxt) { |
2448 | if (trans) { | 2450 | if (trans) { |
2449 | trans->pathmaxrxt = params->spp_pathmaxrxt; | 2451 | trans->pathmaxrxt = params->spp_pathmaxrxt; |
2450 | } else if (asoc) { | 2452 | } else if (asoc) { |
2451 | asoc->pathmaxrxt = params->spp_pathmaxrxt; | 2453 | asoc->pathmaxrxt = params->spp_pathmaxrxt; |
2452 | } else { | 2454 | } else { |
2453 | sp->pathmaxrxt = params->spp_pathmaxrxt; | 2455 | sp->pathmaxrxt = params->spp_pathmaxrxt; |
2454 | } | 2456 | } |
2455 | } | 2457 | } |
2456 | 2458 | ||
2457 | return 0; | 2459 | return 0; |
2458 | } | 2460 | } |
2459 | 2461 | ||
2460 | static int sctp_setsockopt_peer_addr_params(struct sock *sk, | 2462 | static int sctp_setsockopt_peer_addr_params(struct sock *sk, |
2461 | char __user *optval, | 2463 | char __user *optval, |
2462 | unsigned int optlen) | 2464 | unsigned int optlen) |
2463 | { | 2465 | { |
2464 | struct sctp_paddrparams params; | 2466 | struct sctp_paddrparams params; |
2465 | struct sctp_transport *trans = NULL; | 2467 | struct sctp_transport *trans = NULL; |
2466 | struct sctp_association *asoc = NULL; | 2468 | struct sctp_association *asoc = NULL; |
2467 | struct sctp_sock *sp = sctp_sk(sk); | 2469 | struct sctp_sock *sp = sctp_sk(sk); |
2468 | int error; | 2470 | int error; |
2469 | int hb_change, pmtud_change, sackdelay_change; | 2471 | int hb_change, pmtud_change, sackdelay_change; |
2470 | 2472 | ||
2471 | if (optlen != sizeof(struct sctp_paddrparams)) | 2473 | if (optlen != sizeof(struct sctp_paddrparams)) |
2472 | return - EINVAL; | 2474 | return - EINVAL; |
2473 | 2475 | ||
2474 | if (copy_from_user(¶ms, optval, optlen)) | 2476 | if (copy_from_user(¶ms, optval, optlen)) |
2475 | return -EFAULT; | 2477 | return -EFAULT; |
2476 | 2478 | ||
2477 | /* Validate flags and value parameters. */ | 2479 | /* Validate flags and value parameters. */ |
2478 | hb_change = params.spp_flags & SPP_HB; | 2480 | hb_change = params.spp_flags & SPP_HB; |
2479 | pmtud_change = params.spp_flags & SPP_PMTUD; | 2481 | pmtud_change = params.spp_flags & SPP_PMTUD; |
2480 | sackdelay_change = params.spp_flags & SPP_SACKDELAY; | 2482 | sackdelay_change = params.spp_flags & SPP_SACKDELAY; |
2481 | 2483 | ||
2482 | if (hb_change == SPP_HB || | 2484 | if (hb_change == SPP_HB || |
2483 | pmtud_change == SPP_PMTUD || | 2485 | pmtud_change == SPP_PMTUD || |
2484 | sackdelay_change == SPP_SACKDELAY || | 2486 | sackdelay_change == SPP_SACKDELAY || |
2485 | params.spp_sackdelay > 500 || | 2487 | params.spp_sackdelay > 500 || |
2486 | (params.spp_pathmtu && | 2488 | (params.spp_pathmtu && |
2487 | params.spp_pathmtu < SCTP_DEFAULT_MINSEGMENT)) | 2489 | params.spp_pathmtu < SCTP_DEFAULT_MINSEGMENT)) |
2488 | return -EINVAL; | 2490 | return -EINVAL; |
2489 | 2491 | ||
2490 | /* If an address other than INADDR_ANY is specified, and | 2492 | /* If an address other than INADDR_ANY is specified, and |
2491 | * no transport is found, then the request is invalid. | 2493 | * no transport is found, then the request is invalid. |
2492 | */ | 2494 | */ |
2493 | if (!sctp_is_any(sk, ( union sctp_addr *)¶ms.spp_address)) { | 2495 | if (!sctp_is_any(sk, ( union sctp_addr *)¶ms.spp_address)) { |
2494 | trans = sctp_addr_id2transport(sk, ¶ms.spp_address, | 2496 | trans = sctp_addr_id2transport(sk, ¶ms.spp_address, |
2495 | params.spp_assoc_id); | 2497 | params.spp_assoc_id); |
2496 | if (!trans) | 2498 | if (!trans) |
2497 | return -EINVAL; | 2499 | return -EINVAL; |
2498 | } | 2500 | } |
2499 | 2501 | ||
2500 | /* Get association, if assoc_id != 0 and the socket is a one | 2502 | /* Get association, if assoc_id != 0 and the socket is a one |
2501 | * to many style socket, and an association was not found, then | 2503 | * to many style socket, and an association was not found, then |
2502 | * the id was invalid. | 2504 | * the id was invalid. |
2503 | */ | 2505 | */ |
2504 | asoc = sctp_id2assoc(sk, params.spp_assoc_id); | 2506 | asoc = sctp_id2assoc(sk, params.spp_assoc_id); |
2505 | if (!asoc && params.spp_assoc_id && sctp_style(sk, UDP)) | 2507 | if (!asoc && params.spp_assoc_id && sctp_style(sk, UDP)) |
2506 | return -EINVAL; | 2508 | return -EINVAL; |
2507 | 2509 | ||
2508 | /* Heartbeat demand can only be sent on a transport or | 2510 | /* Heartbeat demand can only be sent on a transport or |
2509 | * association, but not a socket. | 2511 | * association, but not a socket. |
2510 | */ | 2512 | */ |
2511 | if (params.spp_flags & SPP_HB_DEMAND && !trans && !asoc) | 2513 | if (params.spp_flags & SPP_HB_DEMAND && !trans && !asoc) |
2512 | return -EINVAL; | 2514 | return -EINVAL; |
2513 | 2515 | ||
2514 | /* Process parameters. */ | 2516 | /* Process parameters. */ |
2515 | error = sctp_apply_peer_addr_params(¶ms, trans, asoc, sp, | 2517 | error = sctp_apply_peer_addr_params(¶ms, trans, asoc, sp, |
2516 | hb_change, pmtud_change, | 2518 | hb_change, pmtud_change, |
2517 | sackdelay_change); | 2519 | sackdelay_change); |
2518 | 2520 | ||
2519 | if (error) | 2521 | if (error) |
2520 | return error; | 2522 | return error; |
2521 | 2523 | ||
2522 | /* If changes are for association, also apply parameters to each | 2524 | /* If changes are for association, also apply parameters to each |
2523 | * transport. | 2525 | * transport. |
2524 | */ | 2526 | */ |
2525 | if (!trans && asoc) { | 2527 | if (!trans && asoc) { |
2526 | list_for_each_entry(trans, &asoc->peer.transport_addr_list, | 2528 | list_for_each_entry(trans, &asoc->peer.transport_addr_list, |
2527 | transports) { | 2529 | transports) { |
2528 | sctp_apply_peer_addr_params(¶ms, trans, asoc, sp, | 2530 | sctp_apply_peer_addr_params(¶ms, trans, asoc, sp, |
2529 | hb_change, pmtud_change, | 2531 | hb_change, pmtud_change, |
2530 | sackdelay_change); | 2532 | sackdelay_change); |
2531 | } | 2533 | } |
2532 | } | 2534 | } |
2533 | 2535 | ||
2534 | return 0; | 2536 | return 0; |
2535 | } | 2537 | } |
2536 | 2538 | ||
2537 | /* | 2539 | /* |
2538 | * 7.1.23. Get or set delayed ack timer (SCTP_DELAYED_SACK) | 2540 | * 7.1.23. Get or set delayed ack timer (SCTP_DELAYED_SACK) |
2539 | * | 2541 | * |
2540 | * This option will effect the way delayed acks are performed. This | 2542 | * This option will effect the way delayed acks are performed. This |
2541 | * option allows you to get or set the delayed ack time, in | 2543 | * option allows you to get or set the delayed ack time, in |
2542 | * milliseconds. It also allows changing the delayed ack frequency. | 2544 | * milliseconds. It also allows changing the delayed ack frequency. |
2543 | * Changing the frequency to 1 disables the delayed sack algorithm. If | 2545 | * Changing the frequency to 1 disables the delayed sack algorithm. If |
2544 | * the assoc_id is 0, then this sets or gets the endpoints default | 2546 | * the assoc_id is 0, then this sets or gets the endpoints default |
2545 | * values. If the assoc_id field is non-zero, then the set or get | 2547 | * values. If the assoc_id field is non-zero, then the set or get |
2546 | * effects the specified association for the one to many model (the | 2548 | * effects the specified association for the one to many model (the |
2547 | * assoc_id field is ignored by the one to one model). Note that if | 2549 | * assoc_id field is ignored by the one to one model). Note that if |
2548 | * sack_delay or sack_freq are 0 when setting this option, then the | 2550 | * sack_delay or sack_freq are 0 when setting this option, then the |
2549 | * current values will remain unchanged. | 2551 | * current values will remain unchanged. |
2550 | * | 2552 | * |
2551 | * struct sctp_sack_info { | 2553 | * struct sctp_sack_info { |
2552 | * sctp_assoc_t sack_assoc_id; | 2554 | * sctp_assoc_t sack_assoc_id; |
2553 | * uint32_t sack_delay; | 2555 | * uint32_t sack_delay; |
2554 | * uint32_t sack_freq; | 2556 | * uint32_t sack_freq; |
2555 | * }; | 2557 | * }; |
2556 | * | 2558 | * |
2557 | * sack_assoc_id - This parameter, indicates which association the user | 2559 | * sack_assoc_id - This parameter, indicates which association the user |
2558 | * is performing an action upon. Note that if this field's value is | 2560 | * is performing an action upon. Note that if this field's value is |
2559 | * zero then the endpoints default value is changed (effecting future | 2561 | * zero then the endpoints default value is changed (effecting future |
2560 | * associations only). | 2562 | * associations only). |
2561 | * | 2563 | * |
2562 | * sack_delay - This parameter contains the number of milliseconds that | 2564 | * sack_delay - This parameter contains the number of milliseconds that |
2563 | * the user is requesting the delayed ACK timer be set to. Note that | 2565 | * the user is requesting the delayed ACK timer be set to. Note that |
2564 | * this value is defined in the standard to be between 200 and 500 | 2566 | * this value is defined in the standard to be between 200 and 500 |
2565 | * milliseconds. | 2567 | * milliseconds. |
2566 | * | 2568 | * |
2567 | * sack_freq - This parameter contains the number of packets that must | 2569 | * sack_freq - This parameter contains the number of packets that must |
2568 | * be received before a sack is sent without waiting for the delay | 2570 | * be received before a sack is sent without waiting for the delay |
2569 | * timer to expire. The default value for this is 2, setting this | 2571 | * timer to expire. The default value for this is 2, setting this |
2570 | * value to 1 will disable the delayed sack algorithm. | 2572 | * value to 1 will disable the delayed sack algorithm. |
2571 | */ | 2573 | */ |
2572 | 2574 | ||
2573 | static int sctp_setsockopt_delayed_ack(struct sock *sk, | 2575 | static int sctp_setsockopt_delayed_ack(struct sock *sk, |
2574 | char __user *optval, unsigned int optlen) | 2576 | char __user *optval, unsigned int optlen) |
2575 | { | 2577 | { |
2576 | struct sctp_sack_info params; | 2578 | struct sctp_sack_info params; |
2577 | struct sctp_transport *trans = NULL; | 2579 | struct sctp_transport *trans = NULL; |
2578 | struct sctp_association *asoc = NULL; | 2580 | struct sctp_association *asoc = NULL; |
2579 | struct sctp_sock *sp = sctp_sk(sk); | 2581 | struct sctp_sock *sp = sctp_sk(sk); |
2580 | 2582 | ||
2581 | if (optlen == sizeof(struct sctp_sack_info)) { | 2583 | if (optlen == sizeof(struct sctp_sack_info)) { |
2582 | if (copy_from_user(¶ms, optval, optlen)) | 2584 | if (copy_from_user(¶ms, optval, optlen)) |
2583 | return -EFAULT; | 2585 | return -EFAULT; |
2584 | 2586 | ||
2585 | if (params.sack_delay == 0 && params.sack_freq == 0) | 2587 | if (params.sack_delay == 0 && params.sack_freq == 0) |
2586 | return 0; | 2588 | return 0; |
2587 | } else if (optlen == sizeof(struct sctp_assoc_value)) { | 2589 | } else if (optlen == sizeof(struct sctp_assoc_value)) { |
2588 | pr_warn("Use of struct sctp_assoc_value in delayed_ack socket option deprecated\n"); | 2590 | pr_warn("Use of struct sctp_assoc_value in delayed_ack socket option deprecated\n"); |
2589 | pr_warn("Use struct sctp_sack_info instead\n"); | 2591 | pr_warn("Use struct sctp_sack_info instead\n"); |
2590 | if (copy_from_user(¶ms, optval, optlen)) | 2592 | if (copy_from_user(¶ms, optval, optlen)) |
2591 | return -EFAULT; | 2593 | return -EFAULT; |
2592 | 2594 | ||
2593 | if (params.sack_delay == 0) | 2595 | if (params.sack_delay == 0) |
2594 | params.sack_freq = 1; | 2596 | params.sack_freq = 1; |
2595 | else | 2597 | else |
2596 | params.sack_freq = 0; | 2598 | params.sack_freq = 0; |
2597 | } else | 2599 | } else |
2598 | return - EINVAL; | 2600 | return - EINVAL; |
2599 | 2601 | ||
2600 | /* Validate value parameter. */ | 2602 | /* Validate value parameter. */ |
2601 | if (params.sack_delay > 500) | 2603 | if (params.sack_delay > 500) |
2602 | return -EINVAL; | 2604 | return -EINVAL; |
2603 | 2605 | ||
2604 | /* Get association, if sack_assoc_id != 0 and the socket is a one | 2606 | /* Get association, if sack_assoc_id != 0 and the socket is a one |
2605 | * to many style socket, and an association was not found, then | 2607 | * to many style socket, and an association was not found, then |
2606 | * the id was invalid. | 2608 | * the id was invalid. |
2607 | */ | 2609 | */ |
2608 | asoc = sctp_id2assoc(sk, params.sack_assoc_id); | 2610 | asoc = sctp_id2assoc(sk, params.sack_assoc_id); |
2609 | if (!asoc && params.sack_assoc_id && sctp_style(sk, UDP)) | 2611 | if (!asoc && params.sack_assoc_id && sctp_style(sk, UDP)) |
2610 | return -EINVAL; | 2612 | return -EINVAL; |
2611 | 2613 | ||
2612 | if (params.sack_delay) { | 2614 | if (params.sack_delay) { |
2613 | if (asoc) { | 2615 | if (asoc) { |
2614 | asoc->sackdelay = | 2616 | asoc->sackdelay = |
2615 | msecs_to_jiffies(params.sack_delay); | 2617 | msecs_to_jiffies(params.sack_delay); |
2616 | asoc->param_flags = | 2618 | asoc->param_flags = |
2617 | (asoc->param_flags & ~SPP_SACKDELAY) | | 2619 | (asoc->param_flags & ~SPP_SACKDELAY) | |
2618 | SPP_SACKDELAY_ENABLE; | 2620 | SPP_SACKDELAY_ENABLE; |
2619 | } else { | 2621 | } else { |
2620 | sp->sackdelay = params.sack_delay; | 2622 | sp->sackdelay = params.sack_delay; |
2621 | sp->param_flags = | 2623 | sp->param_flags = |
2622 | (sp->param_flags & ~SPP_SACKDELAY) | | 2624 | (sp->param_flags & ~SPP_SACKDELAY) | |
2623 | SPP_SACKDELAY_ENABLE; | 2625 | SPP_SACKDELAY_ENABLE; |
2624 | } | 2626 | } |
2625 | } | 2627 | } |
2626 | 2628 | ||
2627 | if (params.sack_freq == 1) { | 2629 | if (params.sack_freq == 1) { |
2628 | if (asoc) { | 2630 | if (asoc) { |
2629 | asoc->param_flags = | 2631 | asoc->param_flags = |
2630 | (asoc->param_flags & ~SPP_SACKDELAY) | | 2632 | (asoc->param_flags & ~SPP_SACKDELAY) | |
2631 | SPP_SACKDELAY_DISABLE; | 2633 | SPP_SACKDELAY_DISABLE; |
2632 | } else { | 2634 | } else { |
2633 | sp->param_flags = | 2635 | sp->param_flags = |
2634 | (sp->param_flags & ~SPP_SACKDELAY) | | 2636 | (sp->param_flags & ~SPP_SACKDELAY) | |
2635 | SPP_SACKDELAY_DISABLE; | 2637 | SPP_SACKDELAY_DISABLE; |
2636 | } | 2638 | } |
2637 | } else if (params.sack_freq > 1) { | 2639 | } else if (params.sack_freq > 1) { |
2638 | if (asoc) { | 2640 | if (asoc) { |
2639 | asoc->sackfreq = params.sack_freq; | 2641 | asoc->sackfreq = params.sack_freq; |
2640 | asoc->param_flags = | 2642 | asoc->param_flags = |
2641 | (asoc->param_flags & ~SPP_SACKDELAY) | | 2643 | (asoc->param_flags & ~SPP_SACKDELAY) | |
2642 | SPP_SACKDELAY_ENABLE; | 2644 | SPP_SACKDELAY_ENABLE; |
2643 | } else { | 2645 | } else { |
2644 | sp->sackfreq = params.sack_freq; | 2646 | sp->sackfreq = params.sack_freq; |
2645 | sp->param_flags = | 2647 | sp->param_flags = |
2646 | (sp->param_flags & ~SPP_SACKDELAY) | | 2648 | (sp->param_flags & ~SPP_SACKDELAY) | |
2647 | SPP_SACKDELAY_ENABLE; | 2649 | SPP_SACKDELAY_ENABLE; |
2648 | } | 2650 | } |
2649 | } | 2651 | } |
2650 | 2652 | ||
2651 | /* If change is for association, also apply to each transport. */ | 2653 | /* If change is for association, also apply to each transport. */ |
2652 | if (asoc) { | 2654 | if (asoc) { |
2653 | list_for_each_entry(trans, &asoc->peer.transport_addr_list, | 2655 | list_for_each_entry(trans, &asoc->peer.transport_addr_list, |
2654 | transports) { | 2656 | transports) { |
2655 | if (params.sack_delay) { | 2657 | if (params.sack_delay) { |
2656 | trans->sackdelay = | 2658 | trans->sackdelay = |
2657 | msecs_to_jiffies(params.sack_delay); | 2659 | msecs_to_jiffies(params.sack_delay); |
2658 | trans->param_flags = | 2660 | trans->param_flags = |
2659 | (trans->param_flags & ~SPP_SACKDELAY) | | 2661 | (trans->param_flags & ~SPP_SACKDELAY) | |
2660 | SPP_SACKDELAY_ENABLE; | 2662 | SPP_SACKDELAY_ENABLE; |
2661 | } | 2663 | } |
2662 | if (params.sack_freq == 1) { | 2664 | if (params.sack_freq == 1) { |
2663 | trans->param_flags = | 2665 | trans->param_flags = |
2664 | (trans->param_flags & ~SPP_SACKDELAY) | | 2666 | (trans->param_flags & ~SPP_SACKDELAY) | |
2665 | SPP_SACKDELAY_DISABLE; | 2667 | SPP_SACKDELAY_DISABLE; |
2666 | } else if (params.sack_freq > 1) { | 2668 | } else if (params.sack_freq > 1) { |
2667 | trans->sackfreq = params.sack_freq; | 2669 | trans->sackfreq = params.sack_freq; |
2668 | trans->param_flags = | 2670 | trans->param_flags = |
2669 | (trans->param_flags & ~SPP_SACKDELAY) | | 2671 | (trans->param_flags & ~SPP_SACKDELAY) | |
2670 | SPP_SACKDELAY_ENABLE; | 2672 | SPP_SACKDELAY_ENABLE; |
2671 | } | 2673 | } |
2672 | } | 2674 | } |
2673 | } | 2675 | } |
2674 | 2676 | ||
2675 | return 0; | 2677 | return 0; |
2676 | } | 2678 | } |
2677 | 2679 | ||
2678 | /* 7.1.3 Initialization Parameters (SCTP_INITMSG) | 2680 | /* 7.1.3 Initialization Parameters (SCTP_INITMSG) |
2679 | * | 2681 | * |
2680 | * Applications can specify protocol parameters for the default association | 2682 | * Applications can specify protocol parameters for the default association |
2681 | * initialization. The option name argument to setsockopt() and getsockopt() | 2683 | * initialization. The option name argument to setsockopt() and getsockopt() |
2682 | * is SCTP_INITMSG. | 2684 | * is SCTP_INITMSG. |
2683 | * | 2685 | * |
2684 | * Setting initialization parameters is effective only on an unconnected | 2686 | * Setting initialization parameters is effective only on an unconnected |
2685 | * socket (for UDP-style sockets only future associations are effected | 2687 | * socket (for UDP-style sockets only future associations are effected |
2686 | * by the change). With TCP-style sockets, this option is inherited by | 2688 | * by the change). With TCP-style sockets, this option is inherited by |
2687 | * sockets derived from a listener socket. | 2689 | * sockets derived from a listener socket. |
2688 | */ | 2690 | */ |
2689 | static int sctp_setsockopt_initmsg(struct sock *sk, char __user *optval, unsigned int optlen) | 2691 | static int sctp_setsockopt_initmsg(struct sock *sk, char __user *optval, unsigned int optlen) |
2690 | { | 2692 | { |
2691 | struct sctp_initmsg sinit; | 2693 | struct sctp_initmsg sinit; |
2692 | struct sctp_sock *sp = sctp_sk(sk); | 2694 | struct sctp_sock *sp = sctp_sk(sk); |
2693 | 2695 | ||
2694 | if (optlen != sizeof(struct sctp_initmsg)) | 2696 | if (optlen != sizeof(struct sctp_initmsg)) |
2695 | return -EINVAL; | 2697 | return -EINVAL; |
2696 | if (copy_from_user(&sinit, optval, optlen)) | 2698 | if (copy_from_user(&sinit, optval, optlen)) |
2697 | return -EFAULT; | 2699 | return -EFAULT; |
2698 | 2700 | ||
2699 | if (sinit.sinit_num_ostreams) | 2701 | if (sinit.sinit_num_ostreams) |
2700 | sp->initmsg.sinit_num_ostreams = sinit.sinit_num_ostreams; | 2702 | sp->initmsg.sinit_num_ostreams = sinit.sinit_num_ostreams; |
2701 | if (sinit.sinit_max_instreams) | 2703 | if (sinit.sinit_max_instreams) |
2702 | sp->initmsg.sinit_max_instreams = sinit.sinit_max_instreams; | 2704 | sp->initmsg.sinit_max_instreams = sinit.sinit_max_instreams; |
2703 | if (sinit.sinit_max_attempts) | 2705 | if (sinit.sinit_max_attempts) |
2704 | sp->initmsg.sinit_max_attempts = sinit.sinit_max_attempts; | 2706 | sp->initmsg.sinit_max_attempts = sinit.sinit_max_attempts; |
2705 | if (sinit.sinit_max_init_timeo) | 2707 | if (sinit.sinit_max_init_timeo) |
2706 | sp->initmsg.sinit_max_init_timeo = sinit.sinit_max_init_timeo; | 2708 | sp->initmsg.sinit_max_init_timeo = sinit.sinit_max_init_timeo; |
2707 | 2709 | ||
2708 | return 0; | 2710 | return 0; |
2709 | } | 2711 | } |
2710 | 2712 | ||
2711 | /* | 2713 | /* |
2712 | * 7.1.14 Set default send parameters (SCTP_DEFAULT_SEND_PARAM) | 2714 | * 7.1.14 Set default send parameters (SCTP_DEFAULT_SEND_PARAM) |
2713 | * | 2715 | * |
2714 | * Applications that wish to use the sendto() system call may wish to | 2716 | * Applications that wish to use the sendto() system call may wish to |
2715 | * specify a default set of parameters that would normally be supplied | 2717 | * specify a default set of parameters that would normally be supplied |
2716 | * through the inclusion of ancillary data. This socket option allows | 2718 | * through the inclusion of ancillary data. This socket option allows |
2717 | * such an application to set the default sctp_sndrcvinfo structure. | 2719 | * such an application to set the default sctp_sndrcvinfo structure. |
2718 | * The application that wishes to use this socket option simply passes | 2720 | * The application that wishes to use this socket option simply passes |
2719 | * in to this call the sctp_sndrcvinfo structure defined in Section | 2721 | * in to this call the sctp_sndrcvinfo structure defined in Section |
2720 | * 5.2.2) The input parameters accepted by this call include | 2722 | * 5.2.2) The input parameters accepted by this call include |
2721 | * sinfo_stream, sinfo_flags, sinfo_ppid, sinfo_context, | 2723 | * sinfo_stream, sinfo_flags, sinfo_ppid, sinfo_context, |
2722 | * sinfo_timetolive. The user must provide the sinfo_assoc_id field in | 2724 | * sinfo_timetolive. The user must provide the sinfo_assoc_id field in |
2723 | * to this call if the caller is using the UDP model. | 2725 | * to this call if the caller is using the UDP model. |
2724 | */ | 2726 | */ |
2725 | static int sctp_setsockopt_default_send_param(struct sock *sk, | 2727 | static int sctp_setsockopt_default_send_param(struct sock *sk, |
2726 | char __user *optval, | 2728 | char __user *optval, |
2727 | unsigned int optlen) | 2729 | unsigned int optlen) |
2728 | { | 2730 | { |
2729 | struct sctp_sndrcvinfo info; | 2731 | struct sctp_sndrcvinfo info; |
2730 | struct sctp_association *asoc; | 2732 | struct sctp_association *asoc; |
2731 | struct sctp_sock *sp = sctp_sk(sk); | 2733 | struct sctp_sock *sp = sctp_sk(sk); |
2732 | 2734 | ||
2733 | if (optlen != sizeof(struct sctp_sndrcvinfo)) | 2735 | if (optlen != sizeof(struct sctp_sndrcvinfo)) |
2734 | return -EINVAL; | 2736 | return -EINVAL; |
2735 | if (copy_from_user(&info, optval, optlen)) | 2737 | if (copy_from_user(&info, optval, optlen)) |
2736 | return -EFAULT; | 2738 | return -EFAULT; |
2737 | 2739 | ||
2738 | asoc = sctp_id2assoc(sk, info.sinfo_assoc_id); | 2740 | asoc = sctp_id2assoc(sk, info.sinfo_assoc_id); |
2739 | if (!asoc && info.sinfo_assoc_id && sctp_style(sk, UDP)) | 2741 | if (!asoc && info.sinfo_assoc_id && sctp_style(sk, UDP)) |
2740 | return -EINVAL; | 2742 | return -EINVAL; |
2741 | 2743 | ||
2742 | if (asoc) { | 2744 | if (asoc) { |
2743 | asoc->default_stream = info.sinfo_stream; | 2745 | asoc->default_stream = info.sinfo_stream; |
2744 | asoc->default_flags = info.sinfo_flags; | 2746 | asoc->default_flags = info.sinfo_flags; |
2745 | asoc->default_ppid = info.sinfo_ppid; | 2747 | asoc->default_ppid = info.sinfo_ppid; |
2746 | asoc->default_context = info.sinfo_context; | 2748 | asoc->default_context = info.sinfo_context; |
2747 | asoc->default_timetolive = info.sinfo_timetolive; | 2749 | asoc->default_timetolive = info.sinfo_timetolive; |
2748 | } else { | 2750 | } else { |
2749 | sp->default_stream = info.sinfo_stream; | 2751 | sp->default_stream = info.sinfo_stream; |
2750 | sp->default_flags = info.sinfo_flags; | 2752 | sp->default_flags = info.sinfo_flags; |
2751 | sp->default_ppid = info.sinfo_ppid; | 2753 | sp->default_ppid = info.sinfo_ppid; |
2752 | sp->default_context = info.sinfo_context; | 2754 | sp->default_context = info.sinfo_context; |
2753 | sp->default_timetolive = info.sinfo_timetolive; | 2755 | sp->default_timetolive = info.sinfo_timetolive; |
2754 | } | 2756 | } |
2755 | 2757 | ||
2756 | return 0; | 2758 | return 0; |
2757 | } | 2759 | } |
2758 | 2760 | ||
2759 | /* 7.1.10 Set Primary Address (SCTP_PRIMARY_ADDR) | 2761 | /* 7.1.10 Set Primary Address (SCTP_PRIMARY_ADDR) |
2760 | * | 2762 | * |
2761 | * Requests that the local SCTP stack use the enclosed peer address as | 2763 | * Requests that the local SCTP stack use the enclosed peer address as |
2762 | * the association primary. The enclosed address must be one of the | 2764 | * the association primary. The enclosed address must be one of the |
2763 | * association peer's addresses. | 2765 | * association peer's addresses. |
2764 | */ | 2766 | */ |
2765 | static int sctp_setsockopt_primary_addr(struct sock *sk, char __user *optval, | 2767 | static int sctp_setsockopt_primary_addr(struct sock *sk, char __user *optval, |
2766 | unsigned int optlen) | 2768 | unsigned int optlen) |
2767 | { | 2769 | { |
2768 | struct sctp_prim prim; | 2770 | struct sctp_prim prim; |
2769 | struct sctp_transport *trans; | 2771 | struct sctp_transport *trans; |
2770 | 2772 | ||
2771 | if (optlen != sizeof(struct sctp_prim)) | 2773 | if (optlen != sizeof(struct sctp_prim)) |
2772 | return -EINVAL; | 2774 | return -EINVAL; |
2773 | 2775 | ||
2774 | if (copy_from_user(&prim, optval, sizeof(struct sctp_prim))) | 2776 | if (copy_from_user(&prim, optval, sizeof(struct sctp_prim))) |
2775 | return -EFAULT; | 2777 | return -EFAULT; |
2776 | 2778 | ||
2777 | trans = sctp_addr_id2transport(sk, &prim.ssp_addr, prim.ssp_assoc_id); | 2779 | trans = sctp_addr_id2transport(sk, &prim.ssp_addr, prim.ssp_assoc_id); |
2778 | if (!trans) | 2780 | if (!trans) |
2779 | return -EINVAL; | 2781 | return -EINVAL; |
2780 | 2782 | ||
2781 | sctp_assoc_set_primary(trans->asoc, trans); | 2783 | sctp_assoc_set_primary(trans->asoc, trans); |
2782 | 2784 | ||
2783 | return 0; | 2785 | return 0; |
2784 | } | 2786 | } |
2785 | 2787 | ||
2786 | /* | 2788 | /* |
2787 | * 7.1.5 SCTP_NODELAY | 2789 | * 7.1.5 SCTP_NODELAY |
2788 | * | 2790 | * |
2789 | * Turn on/off any Nagle-like algorithm. This means that packets are | 2791 | * Turn on/off any Nagle-like algorithm. This means that packets are |
2790 | * generally sent as soon as possible and no unnecessary delays are | 2792 | * generally sent as soon as possible and no unnecessary delays are |
2791 | * introduced, at the cost of more packets in the network. Expects an | 2793 | * introduced, at the cost of more packets in the network. Expects an |
2792 | * integer boolean flag. | 2794 | * integer boolean flag. |
2793 | */ | 2795 | */ |
2794 | static int sctp_setsockopt_nodelay(struct sock *sk, char __user *optval, | 2796 | static int sctp_setsockopt_nodelay(struct sock *sk, char __user *optval, |
2795 | unsigned int optlen) | 2797 | unsigned int optlen) |
2796 | { | 2798 | { |
2797 | int val; | 2799 | int val; |
2798 | 2800 | ||
2799 | if (optlen < sizeof(int)) | 2801 | if (optlen < sizeof(int)) |
2800 | return -EINVAL; | 2802 | return -EINVAL; |
2801 | if (get_user(val, (int __user *)optval)) | 2803 | if (get_user(val, (int __user *)optval)) |
2802 | return -EFAULT; | 2804 | return -EFAULT; |
2803 | 2805 | ||
2804 | sctp_sk(sk)->nodelay = (val == 0) ? 0 : 1; | 2806 | sctp_sk(sk)->nodelay = (val == 0) ? 0 : 1; |
2805 | return 0; | 2807 | return 0; |
2806 | } | 2808 | } |
2807 | 2809 | ||
2808 | /* | 2810 | /* |
2809 | * | 2811 | * |
2810 | * 7.1.1 SCTP_RTOINFO | 2812 | * 7.1.1 SCTP_RTOINFO |
2811 | * | 2813 | * |
2812 | * The protocol parameters used to initialize and bound retransmission | 2814 | * The protocol parameters used to initialize and bound retransmission |
2813 | * timeout (RTO) are tunable. sctp_rtoinfo structure is used to access | 2815 | * timeout (RTO) are tunable. sctp_rtoinfo structure is used to access |
2814 | * and modify these parameters. | 2816 | * and modify these parameters. |
2815 | * All parameters are time values, in milliseconds. A value of 0, when | 2817 | * All parameters are time values, in milliseconds. A value of 0, when |
2816 | * modifying the parameters, indicates that the current value should not | 2818 | * modifying the parameters, indicates that the current value should not |
2817 | * be changed. | 2819 | * be changed. |
2818 | * | 2820 | * |
2819 | */ | 2821 | */ |
2820 | static int sctp_setsockopt_rtoinfo(struct sock *sk, char __user *optval, unsigned int optlen) | 2822 | static int sctp_setsockopt_rtoinfo(struct sock *sk, char __user *optval, unsigned int optlen) |
2821 | { | 2823 | { |
2822 | struct sctp_rtoinfo rtoinfo; | 2824 | struct sctp_rtoinfo rtoinfo; |
2823 | struct sctp_association *asoc; | 2825 | struct sctp_association *asoc; |
2824 | 2826 | ||
2825 | if (optlen != sizeof (struct sctp_rtoinfo)) | 2827 | if (optlen != sizeof (struct sctp_rtoinfo)) |
2826 | return -EINVAL; | 2828 | return -EINVAL; |
2827 | 2829 | ||
2828 | if (copy_from_user(&rtoinfo, optval, optlen)) | 2830 | if (copy_from_user(&rtoinfo, optval, optlen)) |
2829 | return -EFAULT; | 2831 | return -EFAULT; |
2830 | 2832 | ||
2831 | asoc = sctp_id2assoc(sk, rtoinfo.srto_assoc_id); | 2833 | asoc = sctp_id2assoc(sk, rtoinfo.srto_assoc_id); |
2832 | 2834 | ||
2833 | /* Set the values to the specific association */ | 2835 | /* Set the values to the specific association */ |
2834 | if (!asoc && rtoinfo.srto_assoc_id && sctp_style(sk, UDP)) | 2836 | if (!asoc && rtoinfo.srto_assoc_id && sctp_style(sk, UDP)) |
2835 | return -EINVAL; | 2837 | return -EINVAL; |
2836 | 2838 | ||
2837 | if (asoc) { | 2839 | if (asoc) { |
2838 | if (rtoinfo.srto_initial != 0) | 2840 | if (rtoinfo.srto_initial != 0) |
2839 | asoc->rto_initial = | 2841 | asoc->rto_initial = |
2840 | msecs_to_jiffies(rtoinfo.srto_initial); | 2842 | msecs_to_jiffies(rtoinfo.srto_initial); |
2841 | if (rtoinfo.srto_max != 0) | 2843 | if (rtoinfo.srto_max != 0) |
2842 | asoc->rto_max = msecs_to_jiffies(rtoinfo.srto_max); | 2844 | asoc->rto_max = msecs_to_jiffies(rtoinfo.srto_max); |
2843 | if (rtoinfo.srto_min != 0) | 2845 | if (rtoinfo.srto_min != 0) |
2844 | asoc->rto_min = msecs_to_jiffies(rtoinfo.srto_min); | 2846 | asoc->rto_min = msecs_to_jiffies(rtoinfo.srto_min); |
2845 | } else { | 2847 | } else { |
2846 | /* If there is no association or the association-id = 0 | 2848 | /* If there is no association or the association-id = 0 |
2847 | * set the values to the endpoint. | 2849 | * set the values to the endpoint. |
2848 | */ | 2850 | */ |
2849 | struct sctp_sock *sp = sctp_sk(sk); | 2851 | struct sctp_sock *sp = sctp_sk(sk); |
2850 | 2852 | ||
2851 | if (rtoinfo.srto_initial != 0) | 2853 | if (rtoinfo.srto_initial != 0) |
2852 | sp->rtoinfo.srto_initial = rtoinfo.srto_initial; | 2854 | sp->rtoinfo.srto_initial = rtoinfo.srto_initial; |
2853 | if (rtoinfo.srto_max != 0) | 2855 | if (rtoinfo.srto_max != 0) |
2854 | sp->rtoinfo.srto_max = rtoinfo.srto_max; | 2856 | sp->rtoinfo.srto_max = rtoinfo.srto_max; |
2855 | if (rtoinfo.srto_min != 0) | 2857 | if (rtoinfo.srto_min != 0) |
2856 | sp->rtoinfo.srto_min = rtoinfo.srto_min; | 2858 | sp->rtoinfo.srto_min = rtoinfo.srto_min; |
2857 | } | 2859 | } |
2858 | 2860 | ||
2859 | return 0; | 2861 | return 0; |
2860 | } | 2862 | } |
2861 | 2863 | ||
2862 | /* | 2864 | /* |
2863 | * | 2865 | * |
2864 | * 7.1.2 SCTP_ASSOCINFO | 2866 | * 7.1.2 SCTP_ASSOCINFO |
2865 | * | 2867 | * |
2866 | * This option is used to tune the maximum retransmission attempts | 2868 | * This option is used to tune the maximum retransmission attempts |
2867 | * of the association. | 2869 | * of the association. |
2868 | * Returns an error if the new association retransmission value is | 2870 | * Returns an error if the new association retransmission value is |
2869 | * greater than the sum of the retransmission value of the peer. | 2871 | * greater than the sum of the retransmission value of the peer. |
2870 | * See [SCTP] for more information. | 2872 | * See [SCTP] for more information. |
2871 | * | 2873 | * |
2872 | */ | 2874 | */ |
2873 | static int sctp_setsockopt_associnfo(struct sock *sk, char __user *optval, unsigned int optlen) | 2875 | static int sctp_setsockopt_associnfo(struct sock *sk, char __user *optval, unsigned int optlen) |
2874 | { | 2876 | { |
2875 | 2877 | ||
2876 | struct sctp_assocparams assocparams; | 2878 | struct sctp_assocparams assocparams; |
2877 | struct sctp_association *asoc; | 2879 | struct sctp_association *asoc; |
2878 | 2880 | ||
2879 | if (optlen != sizeof(struct sctp_assocparams)) | 2881 | if (optlen != sizeof(struct sctp_assocparams)) |
2880 | return -EINVAL; | 2882 | return -EINVAL; |
2881 | if (copy_from_user(&assocparams, optval, optlen)) | 2883 | if (copy_from_user(&assocparams, optval, optlen)) |
2882 | return -EFAULT; | 2884 | return -EFAULT; |
2883 | 2885 | ||
2884 | asoc = sctp_id2assoc(sk, assocparams.sasoc_assoc_id); | 2886 | asoc = sctp_id2assoc(sk, assocparams.sasoc_assoc_id); |
2885 | 2887 | ||
2886 | if (!asoc && assocparams.sasoc_assoc_id && sctp_style(sk, UDP)) | 2888 | if (!asoc && assocparams.sasoc_assoc_id && sctp_style(sk, UDP)) |
2887 | return -EINVAL; | 2889 | return -EINVAL; |
2888 | 2890 | ||
2889 | /* Set the values to the specific association */ | 2891 | /* Set the values to the specific association */ |
2890 | if (asoc) { | 2892 | if (asoc) { |
2891 | if (assocparams.sasoc_asocmaxrxt != 0) { | 2893 | if (assocparams.sasoc_asocmaxrxt != 0) { |
2892 | __u32 path_sum = 0; | 2894 | __u32 path_sum = 0; |
2893 | int paths = 0; | 2895 | int paths = 0; |
2894 | struct sctp_transport *peer_addr; | 2896 | struct sctp_transport *peer_addr; |
2895 | 2897 | ||
2896 | list_for_each_entry(peer_addr, &asoc->peer.transport_addr_list, | 2898 | list_for_each_entry(peer_addr, &asoc->peer.transport_addr_list, |
2897 | transports) { | 2899 | transports) { |
2898 | path_sum += peer_addr->pathmaxrxt; | 2900 | path_sum += peer_addr->pathmaxrxt; |
2899 | paths++; | 2901 | paths++; |
2900 | } | 2902 | } |
2901 | 2903 | ||
2902 | /* Only validate asocmaxrxt if we have more than | 2904 | /* Only validate asocmaxrxt if we have more than |
2903 | * one path/transport. We do this because path | 2905 | * one path/transport. We do this because path |
2904 | * retransmissions are only counted when we have more | 2906 | * retransmissions are only counted when we have more |
2905 | * then one path. | 2907 | * then one path. |
2906 | */ | 2908 | */ |
2907 | if (paths > 1 && | 2909 | if (paths > 1 && |
2908 | assocparams.sasoc_asocmaxrxt > path_sum) | 2910 | assocparams.sasoc_asocmaxrxt > path_sum) |
2909 | return -EINVAL; | 2911 | return -EINVAL; |
2910 | 2912 | ||
2911 | asoc->max_retrans = assocparams.sasoc_asocmaxrxt; | 2913 | asoc->max_retrans = assocparams.sasoc_asocmaxrxt; |
2912 | } | 2914 | } |
2913 | 2915 | ||
2914 | if (assocparams.sasoc_cookie_life != 0) { | 2916 | if (assocparams.sasoc_cookie_life != 0) { |
2915 | asoc->cookie_life.tv_sec = | 2917 | asoc->cookie_life.tv_sec = |
2916 | assocparams.sasoc_cookie_life / 1000; | 2918 | assocparams.sasoc_cookie_life / 1000; |
2917 | asoc->cookie_life.tv_usec = | 2919 | asoc->cookie_life.tv_usec = |
2918 | (assocparams.sasoc_cookie_life % 1000) | 2920 | (assocparams.sasoc_cookie_life % 1000) |
2919 | * 1000; | 2921 | * 1000; |
2920 | } | 2922 | } |
2921 | } else { | 2923 | } else { |
2922 | /* Set the values to the endpoint */ | 2924 | /* Set the values to the endpoint */ |
2923 | struct sctp_sock *sp = sctp_sk(sk); | 2925 | struct sctp_sock *sp = sctp_sk(sk); |
2924 | 2926 | ||
2925 | if (assocparams.sasoc_asocmaxrxt != 0) | 2927 | if (assocparams.sasoc_asocmaxrxt != 0) |
2926 | sp->assocparams.sasoc_asocmaxrxt = | 2928 | sp->assocparams.sasoc_asocmaxrxt = |
2927 | assocparams.sasoc_asocmaxrxt; | 2929 | assocparams.sasoc_asocmaxrxt; |
2928 | if (assocparams.sasoc_cookie_life != 0) | 2930 | if (assocparams.sasoc_cookie_life != 0) |
2929 | sp->assocparams.sasoc_cookie_life = | 2931 | sp->assocparams.sasoc_cookie_life = |
2930 | assocparams.sasoc_cookie_life; | 2932 | assocparams.sasoc_cookie_life; |
2931 | } | 2933 | } |
2932 | return 0; | 2934 | return 0; |
2933 | } | 2935 | } |
2934 | 2936 | ||
2935 | /* | 2937 | /* |
2936 | * 7.1.16 Set/clear IPv4 mapped addresses (SCTP_I_WANT_MAPPED_V4_ADDR) | 2938 | * 7.1.16 Set/clear IPv4 mapped addresses (SCTP_I_WANT_MAPPED_V4_ADDR) |
2937 | * | 2939 | * |
2938 | * This socket option is a boolean flag which turns on or off mapped V4 | 2940 | * This socket option is a boolean flag which turns on or off mapped V4 |
2939 | * addresses. If this option is turned on and the socket is type | 2941 | * addresses. If this option is turned on and the socket is type |
2940 | * PF_INET6, then IPv4 addresses will be mapped to V6 representation. | 2942 | * PF_INET6, then IPv4 addresses will be mapped to V6 representation. |
2941 | * If this option is turned off, then no mapping will be done of V4 | 2943 | * If this option is turned off, then no mapping will be done of V4 |
2942 | * addresses and a user will receive both PF_INET6 and PF_INET type | 2944 | * addresses and a user will receive both PF_INET6 and PF_INET type |
2943 | * addresses on the socket. | 2945 | * addresses on the socket. |
2944 | */ | 2946 | */ |
2945 | static int sctp_setsockopt_mappedv4(struct sock *sk, char __user *optval, unsigned int optlen) | 2947 | static int sctp_setsockopt_mappedv4(struct sock *sk, char __user *optval, unsigned int optlen) |
2946 | { | 2948 | { |
2947 | int val; | 2949 | int val; |
2948 | struct sctp_sock *sp = sctp_sk(sk); | 2950 | struct sctp_sock *sp = sctp_sk(sk); |
2949 | 2951 | ||
2950 | if (optlen < sizeof(int)) | 2952 | if (optlen < sizeof(int)) |
2951 | return -EINVAL; | 2953 | return -EINVAL; |
2952 | if (get_user(val, (int __user *)optval)) | 2954 | if (get_user(val, (int __user *)optval)) |
2953 | return -EFAULT; | 2955 | return -EFAULT; |
2954 | if (val) | 2956 | if (val) |
2955 | sp->v4mapped = 1; | 2957 | sp->v4mapped = 1; |
2956 | else | 2958 | else |
2957 | sp->v4mapped = 0; | 2959 | sp->v4mapped = 0; |
2958 | 2960 | ||
2959 | return 0; | 2961 | return 0; |
2960 | } | 2962 | } |
2961 | 2963 | ||
2962 | /* | 2964 | /* |
2963 | * 8.1.16. Get or Set the Maximum Fragmentation Size (SCTP_MAXSEG) | 2965 | * 8.1.16. Get or Set the Maximum Fragmentation Size (SCTP_MAXSEG) |
2964 | * This option will get or set the maximum size to put in any outgoing | 2966 | * This option will get or set the maximum size to put in any outgoing |
2965 | * SCTP DATA chunk. If a message is larger than this size it will be | 2967 | * SCTP DATA chunk. If a message is larger than this size it will be |
2966 | * fragmented by SCTP into the specified size. Note that the underlying | 2968 | * fragmented by SCTP into the specified size. Note that the underlying |
2967 | * SCTP implementation may fragment into smaller sized chunks when the | 2969 | * SCTP implementation may fragment into smaller sized chunks when the |
2968 | * PMTU of the underlying association is smaller than the value set by | 2970 | * PMTU of the underlying association is smaller than the value set by |
2969 | * the user. The default value for this option is '0' which indicates | 2971 | * the user. The default value for this option is '0' which indicates |
2970 | * the user is NOT limiting fragmentation and only the PMTU will effect | 2972 | * the user is NOT limiting fragmentation and only the PMTU will effect |
2971 | * SCTP's choice of DATA chunk size. Note also that values set larger | 2973 | * SCTP's choice of DATA chunk size. Note also that values set larger |
2972 | * than the maximum size of an IP datagram will effectively let SCTP | 2974 | * than the maximum size of an IP datagram will effectively let SCTP |
2973 | * control fragmentation (i.e. the same as setting this option to 0). | 2975 | * control fragmentation (i.e. the same as setting this option to 0). |
2974 | * | 2976 | * |
2975 | * The following structure is used to access and modify this parameter: | 2977 | * The following structure is used to access and modify this parameter: |
2976 | * | 2978 | * |
2977 | * struct sctp_assoc_value { | 2979 | * struct sctp_assoc_value { |
2978 | * sctp_assoc_t assoc_id; | 2980 | * sctp_assoc_t assoc_id; |
2979 | * uint32_t assoc_value; | 2981 | * uint32_t assoc_value; |
2980 | * }; | 2982 | * }; |
2981 | * | 2983 | * |
2982 | * assoc_id: This parameter is ignored for one-to-one style sockets. | 2984 | * assoc_id: This parameter is ignored for one-to-one style sockets. |
2983 | * For one-to-many style sockets this parameter indicates which | 2985 | * For one-to-many style sockets this parameter indicates which |
2984 | * association the user is performing an action upon. Note that if | 2986 | * association the user is performing an action upon. Note that if |
2985 | * this field's value is zero then the endpoints default value is | 2987 | * this field's value is zero then the endpoints default value is |
2986 | * changed (effecting future associations only). | 2988 | * changed (effecting future associations only). |
2987 | * assoc_value: This parameter specifies the maximum size in bytes. | 2989 | * assoc_value: This parameter specifies the maximum size in bytes. |
2988 | */ | 2990 | */ |
2989 | static int sctp_setsockopt_maxseg(struct sock *sk, char __user *optval, unsigned int optlen) | 2991 | static int sctp_setsockopt_maxseg(struct sock *sk, char __user *optval, unsigned int optlen) |
2990 | { | 2992 | { |
2991 | struct sctp_assoc_value params; | 2993 | struct sctp_assoc_value params; |
2992 | struct sctp_association *asoc; | 2994 | struct sctp_association *asoc; |
2993 | struct sctp_sock *sp = sctp_sk(sk); | 2995 | struct sctp_sock *sp = sctp_sk(sk); |
2994 | int val; | 2996 | int val; |
2995 | 2997 | ||
2996 | if (optlen == sizeof(int)) { | 2998 | if (optlen == sizeof(int)) { |
2997 | pr_warn("Use of int in maxseg socket option deprecated\n"); | 2999 | pr_warn("Use of int in maxseg socket option deprecated\n"); |
2998 | pr_warn("Use struct sctp_assoc_value instead\n"); | 3000 | pr_warn("Use struct sctp_assoc_value instead\n"); |
2999 | if (copy_from_user(&val, optval, optlen)) | 3001 | if (copy_from_user(&val, optval, optlen)) |
3000 | return -EFAULT; | 3002 | return -EFAULT; |
3001 | params.assoc_id = 0; | 3003 | params.assoc_id = 0; |
3002 | } else if (optlen == sizeof(struct sctp_assoc_value)) { | 3004 | } else if (optlen == sizeof(struct sctp_assoc_value)) { |
3003 | if (copy_from_user(¶ms, optval, optlen)) | 3005 | if (copy_from_user(¶ms, optval, optlen)) |
3004 | return -EFAULT; | 3006 | return -EFAULT; |
3005 | val = params.assoc_value; | 3007 | val = params.assoc_value; |
3006 | } else | 3008 | } else |
3007 | return -EINVAL; | 3009 | return -EINVAL; |
3008 | 3010 | ||
3009 | if ((val != 0) && ((val < 8) || (val > SCTP_MAX_CHUNK_LEN))) | 3011 | if ((val != 0) && ((val < 8) || (val > SCTP_MAX_CHUNK_LEN))) |
3010 | return -EINVAL; | 3012 | return -EINVAL; |
3011 | 3013 | ||
3012 | asoc = sctp_id2assoc(sk, params.assoc_id); | 3014 | asoc = sctp_id2assoc(sk, params.assoc_id); |
3013 | if (!asoc && params.assoc_id && sctp_style(sk, UDP)) | 3015 | if (!asoc && params.assoc_id && sctp_style(sk, UDP)) |
3014 | return -EINVAL; | 3016 | return -EINVAL; |
3015 | 3017 | ||
3016 | if (asoc) { | 3018 | if (asoc) { |
3017 | if (val == 0) { | 3019 | if (val == 0) { |
3018 | val = asoc->pathmtu; | 3020 | val = asoc->pathmtu; |
3019 | val -= sp->pf->af->net_header_len; | 3021 | val -= sp->pf->af->net_header_len; |
3020 | val -= sizeof(struct sctphdr) + | 3022 | val -= sizeof(struct sctphdr) + |
3021 | sizeof(struct sctp_data_chunk); | 3023 | sizeof(struct sctp_data_chunk); |
3022 | } | 3024 | } |
3023 | asoc->user_frag = val; | 3025 | asoc->user_frag = val; |
3024 | asoc->frag_point = sctp_frag_point(asoc, asoc->pathmtu); | 3026 | asoc->frag_point = sctp_frag_point(asoc, asoc->pathmtu); |
3025 | } else { | 3027 | } else { |
3026 | sp->user_frag = val; | 3028 | sp->user_frag = val; |
3027 | } | 3029 | } |
3028 | 3030 | ||
3029 | return 0; | 3031 | return 0; |
3030 | } | 3032 | } |
3031 | 3033 | ||
3032 | 3034 | ||
3033 | /* | 3035 | /* |
3034 | * 7.1.9 Set Peer Primary Address (SCTP_SET_PEER_PRIMARY_ADDR) | 3036 | * 7.1.9 Set Peer Primary Address (SCTP_SET_PEER_PRIMARY_ADDR) |
3035 | * | 3037 | * |
3036 | * Requests that the peer mark the enclosed address as the association | 3038 | * Requests that the peer mark the enclosed address as the association |
3037 | * primary. The enclosed address must be one of the association's | 3039 | * primary. The enclosed address must be one of the association's |
3038 | * locally bound addresses. The following structure is used to make a | 3040 | * locally bound addresses. The following structure is used to make a |
3039 | * set primary request: | 3041 | * set primary request: |
3040 | */ | 3042 | */ |
3041 | static int sctp_setsockopt_peer_primary_addr(struct sock *sk, char __user *optval, | 3043 | static int sctp_setsockopt_peer_primary_addr(struct sock *sk, char __user *optval, |
3042 | unsigned int optlen) | 3044 | unsigned int optlen) |
3043 | { | 3045 | { |
3044 | struct net *net = sock_net(sk); | 3046 | struct net *net = sock_net(sk); |
3045 | struct sctp_sock *sp; | 3047 | struct sctp_sock *sp; |
3046 | struct sctp_association *asoc = NULL; | 3048 | struct sctp_association *asoc = NULL; |
3047 | struct sctp_setpeerprim prim; | 3049 | struct sctp_setpeerprim prim; |
3048 | struct sctp_chunk *chunk; | 3050 | struct sctp_chunk *chunk; |
3049 | struct sctp_af *af; | 3051 | struct sctp_af *af; |
3050 | int err; | 3052 | int err; |
3051 | 3053 | ||
3052 | sp = sctp_sk(sk); | 3054 | sp = sctp_sk(sk); |
3053 | 3055 | ||
3054 | if (!net->sctp.addip_enable) | 3056 | if (!net->sctp.addip_enable) |
3055 | return -EPERM; | 3057 | return -EPERM; |
3056 | 3058 | ||
3057 | if (optlen != sizeof(struct sctp_setpeerprim)) | 3059 | if (optlen != sizeof(struct sctp_setpeerprim)) |
3058 | return -EINVAL; | 3060 | return -EINVAL; |
3059 | 3061 | ||
3060 | if (copy_from_user(&prim, optval, optlen)) | 3062 | if (copy_from_user(&prim, optval, optlen)) |
3061 | return -EFAULT; | 3063 | return -EFAULT; |
3062 | 3064 | ||
3063 | asoc = sctp_id2assoc(sk, prim.sspp_assoc_id); | 3065 | asoc = sctp_id2assoc(sk, prim.sspp_assoc_id); |
3064 | if (!asoc) | 3066 | if (!asoc) |
3065 | return -EINVAL; | 3067 | return -EINVAL; |
3066 | 3068 | ||
3067 | if (!asoc->peer.asconf_capable) | 3069 | if (!asoc->peer.asconf_capable) |
3068 | return -EPERM; | 3070 | return -EPERM; |
3069 | 3071 | ||
3070 | if (asoc->peer.addip_disabled_mask & SCTP_PARAM_SET_PRIMARY) | 3072 | if (asoc->peer.addip_disabled_mask & SCTP_PARAM_SET_PRIMARY) |
3071 | return -EPERM; | 3073 | return -EPERM; |
3072 | 3074 | ||
3073 | if (!sctp_state(asoc, ESTABLISHED)) | 3075 | if (!sctp_state(asoc, ESTABLISHED)) |
3074 | return -ENOTCONN; | 3076 | return -ENOTCONN; |
3075 | 3077 | ||
3076 | af = sctp_get_af_specific(prim.sspp_addr.ss_family); | 3078 | af = sctp_get_af_specific(prim.sspp_addr.ss_family); |
3077 | if (!af) | 3079 | if (!af) |
3078 | return -EINVAL; | 3080 | return -EINVAL; |
3079 | 3081 | ||
3080 | if (!af->addr_valid((union sctp_addr *)&prim.sspp_addr, sp, NULL)) | 3082 | if (!af->addr_valid((union sctp_addr *)&prim.sspp_addr, sp, NULL)) |
3081 | return -EADDRNOTAVAIL; | 3083 | return -EADDRNOTAVAIL; |
3082 | 3084 | ||
3083 | if (!sctp_assoc_lookup_laddr(asoc, (union sctp_addr *)&prim.sspp_addr)) | 3085 | if (!sctp_assoc_lookup_laddr(asoc, (union sctp_addr *)&prim.sspp_addr)) |
3084 | return -EADDRNOTAVAIL; | 3086 | return -EADDRNOTAVAIL; |
3085 | 3087 | ||
3086 | /* Create an ASCONF chunk with SET_PRIMARY parameter */ | 3088 | /* Create an ASCONF chunk with SET_PRIMARY parameter */ |
3087 | chunk = sctp_make_asconf_set_prim(asoc, | 3089 | chunk = sctp_make_asconf_set_prim(asoc, |
3088 | (union sctp_addr *)&prim.sspp_addr); | 3090 | (union sctp_addr *)&prim.sspp_addr); |
3089 | if (!chunk) | 3091 | if (!chunk) |
3090 | return -ENOMEM; | 3092 | return -ENOMEM; |
3091 | 3093 | ||
3092 | err = sctp_send_asconf(asoc, chunk); | 3094 | err = sctp_send_asconf(asoc, chunk); |
3093 | 3095 | ||
3094 | SCTP_DEBUG_PRINTK("We set peer primary addr primitively.\n"); | 3096 | SCTP_DEBUG_PRINTK("We set peer primary addr primitively.\n"); |
3095 | 3097 | ||
3096 | return err; | 3098 | return err; |
3097 | } | 3099 | } |
3098 | 3100 | ||
3099 | static int sctp_setsockopt_adaptation_layer(struct sock *sk, char __user *optval, | 3101 | static int sctp_setsockopt_adaptation_layer(struct sock *sk, char __user *optval, |
3100 | unsigned int optlen) | 3102 | unsigned int optlen) |
3101 | { | 3103 | { |
3102 | struct sctp_setadaptation adaptation; | 3104 | struct sctp_setadaptation adaptation; |
3103 | 3105 | ||
3104 | if (optlen != sizeof(struct sctp_setadaptation)) | 3106 | if (optlen != sizeof(struct sctp_setadaptation)) |
3105 | return -EINVAL; | 3107 | return -EINVAL; |
3106 | if (copy_from_user(&adaptation, optval, optlen)) | 3108 | if (copy_from_user(&adaptation, optval, optlen)) |
3107 | return -EFAULT; | 3109 | return -EFAULT; |
3108 | 3110 | ||
3109 | sctp_sk(sk)->adaptation_ind = adaptation.ssb_adaptation_ind; | 3111 | sctp_sk(sk)->adaptation_ind = adaptation.ssb_adaptation_ind; |
3110 | 3112 | ||
3111 | return 0; | 3113 | return 0; |
3112 | } | 3114 | } |
3113 | 3115 | ||
3114 | /* | 3116 | /* |
3115 | * 7.1.29. Set or Get the default context (SCTP_CONTEXT) | 3117 | * 7.1.29. Set or Get the default context (SCTP_CONTEXT) |
3116 | * | 3118 | * |
3117 | * The context field in the sctp_sndrcvinfo structure is normally only | 3119 | * The context field in the sctp_sndrcvinfo structure is normally only |
3118 | * used when a failed message is retrieved holding the value that was | 3120 | * used when a failed message is retrieved holding the value that was |
3119 | * sent down on the actual send call. This option allows the setting of | 3121 | * sent down on the actual send call. This option allows the setting of |
3120 | * a default context on an association basis that will be received on | 3122 | * a default context on an association basis that will be received on |
3121 | * reading messages from the peer. This is especially helpful in the | 3123 | * reading messages from the peer. This is especially helpful in the |
3122 | * one-2-many model for an application to keep some reference to an | 3124 | * one-2-many model for an application to keep some reference to an |
3123 | * internal state machine that is processing messages on the | 3125 | * internal state machine that is processing messages on the |
3124 | * association. Note that the setting of this value only effects | 3126 | * association. Note that the setting of this value only effects |
3125 | * received messages from the peer and does not effect the value that is | 3127 | * received messages from the peer and does not effect the value that is |
3126 | * saved with outbound messages. | 3128 | * saved with outbound messages. |
3127 | */ | 3129 | */ |
3128 | static int sctp_setsockopt_context(struct sock *sk, char __user *optval, | 3130 | static int sctp_setsockopt_context(struct sock *sk, char __user *optval, |
3129 | unsigned int optlen) | 3131 | unsigned int optlen) |
3130 | { | 3132 | { |
3131 | struct sctp_assoc_value params; | 3133 | struct sctp_assoc_value params; |
3132 | struct sctp_sock *sp; | 3134 | struct sctp_sock *sp; |
3133 | struct sctp_association *asoc; | 3135 | struct sctp_association *asoc; |
3134 | 3136 | ||
3135 | if (optlen != sizeof(struct sctp_assoc_value)) | 3137 | if (optlen != sizeof(struct sctp_assoc_value)) |
3136 | return -EINVAL; | 3138 | return -EINVAL; |
3137 | if (copy_from_user(¶ms, optval, optlen)) | 3139 | if (copy_from_user(¶ms, optval, optlen)) |
3138 | return -EFAULT; | 3140 | return -EFAULT; |
3139 | 3141 | ||
3140 | sp = sctp_sk(sk); | 3142 | sp = sctp_sk(sk); |
3141 | 3143 | ||
3142 | if (params.assoc_id != 0) { | 3144 | if (params.assoc_id != 0) { |
3143 | asoc = sctp_id2assoc(sk, params.assoc_id); | 3145 | asoc = sctp_id2assoc(sk, params.assoc_id); |
3144 | if (!asoc) | 3146 | if (!asoc) |
3145 | return -EINVAL; | 3147 | return -EINVAL; |
3146 | asoc->default_rcv_context = params.assoc_value; | 3148 | asoc->default_rcv_context = params.assoc_value; |
3147 | } else { | 3149 | } else { |
3148 | sp->default_rcv_context = params.assoc_value; | 3150 | sp->default_rcv_context = params.assoc_value; |
3149 | } | 3151 | } |
3150 | 3152 | ||
3151 | return 0; | 3153 | return 0; |
3152 | } | 3154 | } |
3153 | 3155 | ||
3154 | /* | 3156 | /* |
3155 | * 7.1.24. Get or set fragmented interleave (SCTP_FRAGMENT_INTERLEAVE) | 3157 | * 7.1.24. Get or set fragmented interleave (SCTP_FRAGMENT_INTERLEAVE) |
3156 | * | 3158 | * |
3157 | * This options will at a minimum specify if the implementation is doing | 3159 | * This options will at a minimum specify if the implementation is doing |
3158 | * fragmented interleave. Fragmented interleave, for a one to many | 3160 | * fragmented interleave. Fragmented interleave, for a one to many |
3159 | * socket, is when subsequent calls to receive a message may return | 3161 | * socket, is when subsequent calls to receive a message may return |
3160 | * parts of messages from different associations. Some implementations | 3162 | * parts of messages from different associations. Some implementations |
3161 | * may allow you to turn this value on or off. If so, when turned off, | 3163 | * may allow you to turn this value on or off. If so, when turned off, |
3162 | * no fragment interleave will occur (which will cause a head of line | 3164 | * no fragment interleave will occur (which will cause a head of line |
3163 | * blocking amongst multiple associations sharing the same one to many | 3165 | * blocking amongst multiple associations sharing the same one to many |
3164 | * socket). When this option is turned on, then each receive call may | 3166 | * socket). When this option is turned on, then each receive call may |
3165 | * come from a different association (thus the user must receive data | 3167 | * come from a different association (thus the user must receive data |
3166 | * with the extended calls (e.g. sctp_recvmsg) to keep track of which | 3168 | * with the extended calls (e.g. sctp_recvmsg) to keep track of which |
3167 | * association each receive belongs to. | 3169 | * association each receive belongs to. |
3168 | * | 3170 | * |
3169 | * This option takes a boolean value. A non-zero value indicates that | 3171 | * This option takes a boolean value. A non-zero value indicates that |
3170 | * fragmented interleave is on. A value of zero indicates that | 3172 | * fragmented interleave is on. A value of zero indicates that |
3171 | * fragmented interleave is off. | 3173 | * fragmented interleave is off. |
3172 | * | 3174 | * |
3173 | * Note that it is important that an implementation that allows this | 3175 | * Note that it is important that an implementation that allows this |
3174 | * option to be turned on, have it off by default. Otherwise an unaware | 3176 | * option to be turned on, have it off by default. Otherwise an unaware |
3175 | * application using the one to many model may become confused and act | 3177 | * application using the one to many model may become confused and act |
3176 | * incorrectly. | 3178 | * incorrectly. |
3177 | */ | 3179 | */ |
3178 | static int sctp_setsockopt_fragment_interleave(struct sock *sk, | 3180 | static int sctp_setsockopt_fragment_interleave(struct sock *sk, |
3179 | char __user *optval, | 3181 | char __user *optval, |
3180 | unsigned int optlen) | 3182 | unsigned int optlen) |
3181 | { | 3183 | { |
3182 | int val; | 3184 | int val; |
3183 | 3185 | ||
3184 | if (optlen != sizeof(int)) | 3186 | if (optlen != sizeof(int)) |
3185 | return -EINVAL; | 3187 | return -EINVAL; |
3186 | if (get_user(val, (int __user *)optval)) | 3188 | if (get_user(val, (int __user *)optval)) |
3187 | return -EFAULT; | 3189 | return -EFAULT; |
3188 | 3190 | ||
3189 | sctp_sk(sk)->frag_interleave = (val == 0) ? 0 : 1; | 3191 | sctp_sk(sk)->frag_interleave = (val == 0) ? 0 : 1; |
3190 | 3192 | ||
3191 | return 0; | 3193 | return 0; |
3192 | } | 3194 | } |
3193 | 3195 | ||
3194 | /* | 3196 | /* |
3195 | * 8.1.21. Set or Get the SCTP Partial Delivery Point | 3197 | * 8.1.21. Set or Get the SCTP Partial Delivery Point |
3196 | * (SCTP_PARTIAL_DELIVERY_POINT) | 3198 | * (SCTP_PARTIAL_DELIVERY_POINT) |
3197 | * | 3199 | * |
3198 | * This option will set or get the SCTP partial delivery point. This | 3200 | * This option will set or get the SCTP partial delivery point. This |
3199 | * point is the size of a message where the partial delivery API will be | 3201 | * point is the size of a message where the partial delivery API will be |
3200 | * invoked to help free up rwnd space for the peer. Setting this to a | 3202 | * invoked to help free up rwnd space for the peer. Setting this to a |
3201 | * lower value will cause partial deliveries to happen more often. The | 3203 | * lower value will cause partial deliveries to happen more often. The |
3202 | * calls argument is an integer that sets or gets the partial delivery | 3204 | * calls argument is an integer that sets or gets the partial delivery |
3203 | * point. Note also that the call will fail if the user attempts to set | 3205 | * point. Note also that the call will fail if the user attempts to set |
3204 | * this value larger than the socket receive buffer size. | 3206 | * this value larger than the socket receive buffer size. |
3205 | * | 3207 | * |
3206 | * Note that any single message having a length smaller than or equal to | 3208 | * Note that any single message having a length smaller than or equal to |
3207 | * the SCTP partial delivery point will be delivered in one single read | 3209 | * the SCTP partial delivery point will be delivered in one single read |
3208 | * call as long as the user provided buffer is large enough to hold the | 3210 | * call as long as the user provided buffer is large enough to hold the |
3209 | * message. | 3211 | * message. |
3210 | */ | 3212 | */ |
3211 | static int sctp_setsockopt_partial_delivery_point(struct sock *sk, | 3213 | static int sctp_setsockopt_partial_delivery_point(struct sock *sk, |
3212 | char __user *optval, | 3214 | char __user *optval, |
3213 | unsigned int optlen) | 3215 | unsigned int optlen) |
3214 | { | 3216 | { |
3215 | u32 val; | 3217 | u32 val; |
3216 | 3218 | ||
3217 | if (optlen != sizeof(u32)) | 3219 | if (optlen != sizeof(u32)) |
3218 | return -EINVAL; | 3220 | return -EINVAL; |
3219 | if (get_user(val, (int __user *)optval)) | 3221 | if (get_user(val, (int __user *)optval)) |
3220 | return -EFAULT; | 3222 | return -EFAULT; |
3221 | 3223 | ||
3222 | /* Note: We double the receive buffer from what the user sets | 3224 | /* Note: We double the receive buffer from what the user sets |
3223 | * it to be, also initial rwnd is based on rcvbuf/2. | 3225 | * it to be, also initial rwnd is based on rcvbuf/2. |
3224 | */ | 3226 | */ |
3225 | if (val > (sk->sk_rcvbuf >> 1)) | 3227 | if (val > (sk->sk_rcvbuf >> 1)) |
3226 | return -EINVAL; | 3228 | return -EINVAL; |
3227 | 3229 | ||
3228 | sctp_sk(sk)->pd_point = val; | 3230 | sctp_sk(sk)->pd_point = val; |
3229 | 3231 | ||
3230 | return 0; /* is this the right error code? */ | 3232 | return 0; /* is this the right error code? */ |
3231 | } | 3233 | } |
3232 | 3234 | ||
3233 | /* | 3235 | /* |
3234 | * 7.1.28. Set or Get the maximum burst (SCTP_MAX_BURST) | 3236 | * 7.1.28. Set or Get the maximum burst (SCTP_MAX_BURST) |
3235 | * | 3237 | * |
3236 | * This option will allow a user to change the maximum burst of packets | 3238 | * This option will allow a user to change the maximum burst of packets |
3237 | * that can be emitted by this association. Note that the default value | 3239 | * that can be emitted by this association. Note that the default value |
3238 | * is 4, and some implementations may restrict this setting so that it | 3240 | * is 4, and some implementations may restrict this setting so that it |
3239 | * can only be lowered. | 3241 | * can only be lowered. |
3240 | * | 3242 | * |
3241 | * NOTE: This text doesn't seem right. Do this on a socket basis with | 3243 | * NOTE: This text doesn't seem right. Do this on a socket basis with |
3242 | * future associations inheriting the socket value. | 3244 | * future associations inheriting the socket value. |
3243 | */ | 3245 | */ |
3244 | static int sctp_setsockopt_maxburst(struct sock *sk, | 3246 | static int sctp_setsockopt_maxburst(struct sock *sk, |
3245 | char __user *optval, | 3247 | char __user *optval, |
3246 | unsigned int optlen) | 3248 | unsigned int optlen) |
3247 | { | 3249 | { |
3248 | struct sctp_assoc_value params; | 3250 | struct sctp_assoc_value params; |
3249 | struct sctp_sock *sp; | 3251 | struct sctp_sock *sp; |
3250 | struct sctp_association *asoc; | 3252 | struct sctp_association *asoc; |
3251 | int val; | 3253 | int val; |
3252 | int assoc_id = 0; | 3254 | int assoc_id = 0; |
3253 | 3255 | ||
3254 | if (optlen == sizeof(int)) { | 3256 | if (optlen == sizeof(int)) { |
3255 | pr_warn("Use of int in max_burst socket option deprecated\n"); | 3257 | pr_warn("Use of int in max_burst socket option deprecated\n"); |
3256 | pr_warn("Use struct sctp_assoc_value instead\n"); | 3258 | pr_warn("Use struct sctp_assoc_value instead\n"); |
3257 | if (copy_from_user(&val, optval, optlen)) | 3259 | if (copy_from_user(&val, optval, optlen)) |
3258 | return -EFAULT; | 3260 | return -EFAULT; |
3259 | } else if (optlen == sizeof(struct sctp_assoc_value)) { | 3261 | } else if (optlen == sizeof(struct sctp_assoc_value)) { |
3260 | if (copy_from_user(¶ms, optval, optlen)) | 3262 | if (copy_from_user(¶ms, optval, optlen)) |
3261 | return -EFAULT; | 3263 | return -EFAULT; |
3262 | val = params.assoc_value; | 3264 | val = params.assoc_value; |
3263 | assoc_id = params.assoc_id; | 3265 | assoc_id = params.assoc_id; |
3264 | } else | 3266 | } else |
3265 | return -EINVAL; | 3267 | return -EINVAL; |
3266 | 3268 | ||
3267 | sp = sctp_sk(sk); | 3269 | sp = sctp_sk(sk); |
3268 | 3270 | ||
3269 | if (assoc_id != 0) { | 3271 | if (assoc_id != 0) { |
3270 | asoc = sctp_id2assoc(sk, assoc_id); | 3272 | asoc = sctp_id2assoc(sk, assoc_id); |
3271 | if (!asoc) | 3273 | if (!asoc) |
3272 | return -EINVAL; | 3274 | return -EINVAL; |
3273 | asoc->max_burst = val; | 3275 | asoc->max_burst = val; |
3274 | } else | 3276 | } else |
3275 | sp->max_burst = val; | 3277 | sp->max_burst = val; |
3276 | 3278 | ||
3277 | return 0; | 3279 | return 0; |
3278 | } | 3280 | } |
3279 | 3281 | ||
3280 | /* | 3282 | /* |
3281 | * 7.1.18. Add a chunk that must be authenticated (SCTP_AUTH_CHUNK) | 3283 | * 7.1.18. Add a chunk that must be authenticated (SCTP_AUTH_CHUNK) |
3282 | * | 3284 | * |
3283 | * This set option adds a chunk type that the user is requesting to be | 3285 | * This set option adds a chunk type that the user is requesting to be |
3284 | * received only in an authenticated way. Changes to the list of chunks | 3286 | * received only in an authenticated way. Changes to the list of chunks |
3285 | * will only effect future associations on the socket. | 3287 | * will only effect future associations on the socket. |
3286 | */ | 3288 | */ |
3287 | static int sctp_setsockopt_auth_chunk(struct sock *sk, | 3289 | static int sctp_setsockopt_auth_chunk(struct sock *sk, |
3288 | char __user *optval, | 3290 | char __user *optval, |
3289 | unsigned int optlen) | 3291 | unsigned int optlen) |
3290 | { | 3292 | { |
3291 | struct net *net = sock_net(sk); | 3293 | struct net *net = sock_net(sk); |
3292 | struct sctp_authchunk val; | 3294 | struct sctp_authchunk val; |
3293 | 3295 | ||
3294 | if (!net->sctp.auth_enable) | 3296 | if (!net->sctp.auth_enable) |
3295 | return -EACCES; | 3297 | return -EACCES; |
3296 | 3298 | ||
3297 | if (optlen != sizeof(struct sctp_authchunk)) | 3299 | if (optlen != sizeof(struct sctp_authchunk)) |
3298 | return -EINVAL; | 3300 | return -EINVAL; |
3299 | if (copy_from_user(&val, optval, optlen)) | 3301 | if (copy_from_user(&val, optval, optlen)) |
3300 | return -EFAULT; | 3302 | return -EFAULT; |
3301 | 3303 | ||
3302 | switch (val.sauth_chunk) { | 3304 | switch (val.sauth_chunk) { |
3303 | case SCTP_CID_INIT: | 3305 | case SCTP_CID_INIT: |
3304 | case SCTP_CID_INIT_ACK: | 3306 | case SCTP_CID_INIT_ACK: |
3305 | case SCTP_CID_SHUTDOWN_COMPLETE: | 3307 | case SCTP_CID_SHUTDOWN_COMPLETE: |
3306 | case SCTP_CID_AUTH: | 3308 | case SCTP_CID_AUTH: |
3307 | return -EINVAL; | 3309 | return -EINVAL; |
3308 | } | 3310 | } |
3309 | 3311 | ||
3310 | /* add this chunk id to the endpoint */ | 3312 | /* add this chunk id to the endpoint */ |
3311 | return sctp_auth_ep_add_chunkid(sctp_sk(sk)->ep, val.sauth_chunk); | 3313 | return sctp_auth_ep_add_chunkid(sctp_sk(sk)->ep, val.sauth_chunk); |
3312 | } | 3314 | } |
3313 | 3315 | ||
3314 | /* | 3316 | /* |
3315 | * 7.1.19. Get or set the list of supported HMAC Identifiers (SCTP_HMAC_IDENT) | 3317 | * 7.1.19. Get or set the list of supported HMAC Identifiers (SCTP_HMAC_IDENT) |
3316 | * | 3318 | * |
3317 | * This option gets or sets the list of HMAC algorithms that the local | 3319 | * This option gets or sets the list of HMAC algorithms that the local |
3318 | * endpoint requires the peer to use. | 3320 | * endpoint requires the peer to use. |
3319 | */ | 3321 | */ |
3320 | static int sctp_setsockopt_hmac_ident(struct sock *sk, | 3322 | static int sctp_setsockopt_hmac_ident(struct sock *sk, |
3321 | char __user *optval, | 3323 | char __user *optval, |
3322 | unsigned int optlen) | 3324 | unsigned int optlen) |
3323 | { | 3325 | { |
3324 | struct net *net = sock_net(sk); | 3326 | struct net *net = sock_net(sk); |
3325 | struct sctp_hmacalgo *hmacs; | 3327 | struct sctp_hmacalgo *hmacs; |
3326 | u32 idents; | 3328 | u32 idents; |
3327 | int err; | 3329 | int err; |
3328 | 3330 | ||
3329 | if (!net->sctp.auth_enable) | 3331 | if (!net->sctp.auth_enable) |
3330 | return -EACCES; | 3332 | return -EACCES; |
3331 | 3333 | ||
3332 | if (optlen < sizeof(struct sctp_hmacalgo)) | 3334 | if (optlen < sizeof(struct sctp_hmacalgo)) |
3333 | return -EINVAL; | 3335 | return -EINVAL; |
3334 | 3336 | ||
3335 | hmacs= memdup_user(optval, optlen); | 3337 | hmacs= memdup_user(optval, optlen); |
3336 | if (IS_ERR(hmacs)) | 3338 | if (IS_ERR(hmacs)) |
3337 | return PTR_ERR(hmacs); | 3339 | return PTR_ERR(hmacs); |
3338 | 3340 | ||
3339 | idents = hmacs->shmac_num_idents; | 3341 | idents = hmacs->shmac_num_idents; |
3340 | if (idents == 0 || idents > SCTP_AUTH_NUM_HMACS || | 3342 | if (idents == 0 || idents > SCTP_AUTH_NUM_HMACS || |
3341 | (idents * sizeof(u16)) > (optlen - sizeof(struct sctp_hmacalgo))) { | 3343 | (idents * sizeof(u16)) > (optlen - sizeof(struct sctp_hmacalgo))) { |
3342 | err = -EINVAL; | 3344 | err = -EINVAL; |
3343 | goto out; | 3345 | goto out; |
3344 | } | 3346 | } |
3345 | 3347 | ||
3346 | err = sctp_auth_ep_set_hmacs(sctp_sk(sk)->ep, hmacs); | 3348 | err = sctp_auth_ep_set_hmacs(sctp_sk(sk)->ep, hmacs); |
3347 | out: | 3349 | out: |
3348 | kfree(hmacs); | 3350 | kfree(hmacs); |
3349 | return err; | 3351 | return err; |
3350 | } | 3352 | } |
3351 | 3353 | ||
3352 | /* | 3354 | /* |
3353 | * 7.1.20. Set a shared key (SCTP_AUTH_KEY) | 3355 | * 7.1.20. Set a shared key (SCTP_AUTH_KEY) |
3354 | * | 3356 | * |
3355 | * This option will set a shared secret key which is used to build an | 3357 | * This option will set a shared secret key which is used to build an |
3356 | * association shared key. | 3358 | * association shared key. |
3357 | */ | 3359 | */ |
3358 | static int sctp_setsockopt_auth_key(struct sock *sk, | 3360 | static int sctp_setsockopt_auth_key(struct sock *sk, |
3359 | char __user *optval, | 3361 | char __user *optval, |
3360 | unsigned int optlen) | 3362 | unsigned int optlen) |
3361 | { | 3363 | { |
3362 | struct net *net = sock_net(sk); | 3364 | struct net *net = sock_net(sk); |
3363 | struct sctp_authkey *authkey; | 3365 | struct sctp_authkey *authkey; |
3364 | struct sctp_association *asoc; | 3366 | struct sctp_association *asoc; |
3365 | int ret; | 3367 | int ret; |
3366 | 3368 | ||
3367 | if (!net->sctp.auth_enable) | 3369 | if (!net->sctp.auth_enable) |
3368 | return -EACCES; | 3370 | return -EACCES; |
3369 | 3371 | ||
3370 | if (optlen <= sizeof(struct sctp_authkey)) | 3372 | if (optlen <= sizeof(struct sctp_authkey)) |
3371 | return -EINVAL; | 3373 | return -EINVAL; |
3372 | 3374 | ||
3373 | authkey= memdup_user(optval, optlen); | 3375 | authkey= memdup_user(optval, optlen); |
3374 | if (IS_ERR(authkey)) | 3376 | if (IS_ERR(authkey)) |
3375 | return PTR_ERR(authkey); | 3377 | return PTR_ERR(authkey); |
3376 | 3378 | ||
3377 | if (authkey->sca_keylength > optlen - sizeof(struct sctp_authkey)) { | 3379 | if (authkey->sca_keylength > optlen - sizeof(struct sctp_authkey)) { |
3378 | ret = -EINVAL; | 3380 | ret = -EINVAL; |
3379 | goto out; | 3381 | goto out; |
3380 | } | 3382 | } |
3381 | 3383 | ||
3382 | asoc = sctp_id2assoc(sk, authkey->sca_assoc_id); | 3384 | asoc = sctp_id2assoc(sk, authkey->sca_assoc_id); |
3383 | if (!asoc && authkey->sca_assoc_id && sctp_style(sk, UDP)) { | 3385 | if (!asoc && authkey->sca_assoc_id && sctp_style(sk, UDP)) { |
3384 | ret = -EINVAL; | 3386 | ret = -EINVAL; |
3385 | goto out; | 3387 | goto out; |
3386 | } | 3388 | } |
3387 | 3389 | ||
3388 | ret = sctp_auth_set_key(sctp_sk(sk)->ep, asoc, authkey); | 3390 | ret = sctp_auth_set_key(sctp_sk(sk)->ep, asoc, authkey); |
3389 | out: | 3391 | out: |
3390 | kfree(authkey); | 3392 | kfree(authkey); |
3391 | return ret; | 3393 | return ret; |
3392 | } | 3394 | } |
3393 | 3395 | ||
3394 | /* | 3396 | /* |
3395 | * 7.1.21. Get or set the active shared key (SCTP_AUTH_ACTIVE_KEY) | 3397 | * 7.1.21. Get or set the active shared key (SCTP_AUTH_ACTIVE_KEY) |
3396 | * | 3398 | * |
3397 | * This option will get or set the active shared key to be used to build | 3399 | * This option will get or set the active shared key to be used to build |
3398 | * the association shared key. | 3400 | * the association shared key. |
3399 | */ | 3401 | */ |
3400 | static int sctp_setsockopt_active_key(struct sock *sk, | 3402 | static int sctp_setsockopt_active_key(struct sock *sk, |
3401 | char __user *optval, | 3403 | char __user *optval, |
3402 | unsigned int optlen) | 3404 | unsigned int optlen) |
3403 | { | 3405 | { |
3404 | struct net *net = sock_net(sk); | 3406 | struct net *net = sock_net(sk); |
3405 | struct sctp_authkeyid val; | 3407 | struct sctp_authkeyid val; |
3406 | struct sctp_association *asoc; | 3408 | struct sctp_association *asoc; |
3407 | 3409 | ||
3408 | if (!net->sctp.auth_enable) | 3410 | if (!net->sctp.auth_enable) |
3409 | return -EACCES; | 3411 | return -EACCES; |
3410 | 3412 | ||
3411 | if (optlen != sizeof(struct sctp_authkeyid)) | 3413 | if (optlen != sizeof(struct sctp_authkeyid)) |
3412 | return -EINVAL; | 3414 | return -EINVAL; |
3413 | if (copy_from_user(&val, optval, optlen)) | 3415 | if (copy_from_user(&val, optval, optlen)) |
3414 | return -EFAULT; | 3416 | return -EFAULT; |
3415 | 3417 | ||
3416 | asoc = sctp_id2assoc(sk, val.scact_assoc_id); | 3418 | asoc = sctp_id2assoc(sk, val.scact_assoc_id); |
3417 | if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP)) | 3419 | if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP)) |
3418 | return -EINVAL; | 3420 | return -EINVAL; |
3419 | 3421 | ||
3420 | return sctp_auth_set_active_key(sctp_sk(sk)->ep, asoc, | 3422 | return sctp_auth_set_active_key(sctp_sk(sk)->ep, asoc, |
3421 | val.scact_keynumber); | 3423 | val.scact_keynumber); |
3422 | } | 3424 | } |
3423 | 3425 | ||
3424 | /* | 3426 | /* |
3425 | * 7.1.22. Delete a shared key (SCTP_AUTH_DELETE_KEY) | 3427 | * 7.1.22. Delete a shared key (SCTP_AUTH_DELETE_KEY) |
3426 | * | 3428 | * |
3427 | * This set option will delete a shared secret key from use. | 3429 | * This set option will delete a shared secret key from use. |
3428 | */ | 3430 | */ |
3429 | static int sctp_setsockopt_del_key(struct sock *sk, | 3431 | static int sctp_setsockopt_del_key(struct sock *sk, |
3430 | char __user *optval, | 3432 | char __user *optval, |
3431 | unsigned int optlen) | 3433 | unsigned int optlen) |
3432 | { | 3434 | { |
3433 | struct net *net = sock_net(sk); | 3435 | struct net *net = sock_net(sk); |
3434 | struct sctp_authkeyid val; | 3436 | struct sctp_authkeyid val; |
3435 | struct sctp_association *asoc; | 3437 | struct sctp_association *asoc; |
3436 | 3438 | ||
3437 | if (!net->sctp.auth_enable) | 3439 | if (!net->sctp.auth_enable) |
3438 | return -EACCES; | 3440 | return -EACCES; |
3439 | 3441 | ||
3440 | if (optlen != sizeof(struct sctp_authkeyid)) | 3442 | if (optlen != sizeof(struct sctp_authkeyid)) |
3441 | return -EINVAL; | 3443 | return -EINVAL; |
3442 | if (copy_from_user(&val, optval, optlen)) | 3444 | if (copy_from_user(&val, optval, optlen)) |
3443 | return -EFAULT; | 3445 | return -EFAULT; |
3444 | 3446 | ||
3445 | asoc = sctp_id2assoc(sk, val.scact_assoc_id); | 3447 | asoc = sctp_id2assoc(sk, val.scact_assoc_id); |
3446 | if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP)) | 3448 | if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP)) |
3447 | return -EINVAL; | 3449 | return -EINVAL; |
3448 | 3450 | ||
3449 | return sctp_auth_del_key_id(sctp_sk(sk)->ep, asoc, | 3451 | return sctp_auth_del_key_id(sctp_sk(sk)->ep, asoc, |
3450 | val.scact_keynumber); | 3452 | val.scact_keynumber); |
3451 | 3453 | ||
3452 | } | 3454 | } |
3453 | 3455 | ||
3454 | /* | 3456 | /* |
3455 | * 8.1.23 SCTP_AUTO_ASCONF | 3457 | * 8.1.23 SCTP_AUTO_ASCONF |
3456 | * | 3458 | * |
3457 | * This option will enable or disable the use of the automatic generation of | 3459 | * This option will enable or disable the use of the automatic generation of |
3458 | * ASCONF chunks to add and delete addresses to an existing association. Note | 3460 | * ASCONF chunks to add and delete addresses to an existing association. Note |
3459 | * that this option has two caveats namely: a) it only affects sockets that | 3461 | * that this option has two caveats namely: a) it only affects sockets that |
3460 | * are bound to all addresses available to the SCTP stack, and b) the system | 3462 | * are bound to all addresses available to the SCTP stack, and b) the system |
3461 | * administrator may have an overriding control that turns the ASCONF feature | 3463 | * administrator may have an overriding control that turns the ASCONF feature |
3462 | * off no matter what setting the socket option may have. | 3464 | * off no matter what setting the socket option may have. |
3463 | * This option expects an integer boolean flag, where a non-zero value turns on | 3465 | * This option expects an integer boolean flag, where a non-zero value turns on |
3464 | * the option, and a zero value turns off the option. | 3466 | * the option, and a zero value turns off the option. |
3465 | * Note. In this implementation, socket operation overrides default parameter | 3467 | * Note. In this implementation, socket operation overrides default parameter |
3466 | * being set by sysctl as well as FreeBSD implementation | 3468 | * being set by sysctl as well as FreeBSD implementation |
3467 | */ | 3469 | */ |
3468 | static int sctp_setsockopt_auto_asconf(struct sock *sk, char __user *optval, | 3470 | static int sctp_setsockopt_auto_asconf(struct sock *sk, char __user *optval, |
3469 | unsigned int optlen) | 3471 | unsigned int optlen) |
3470 | { | 3472 | { |
3471 | int val; | 3473 | int val; |
3472 | struct sctp_sock *sp = sctp_sk(sk); | 3474 | struct sctp_sock *sp = sctp_sk(sk); |
3473 | 3475 | ||
3474 | if (optlen < sizeof(int)) | 3476 | if (optlen < sizeof(int)) |
3475 | return -EINVAL; | 3477 | return -EINVAL; |
3476 | if (get_user(val, (int __user *)optval)) | 3478 | if (get_user(val, (int __user *)optval)) |
3477 | return -EFAULT; | 3479 | return -EFAULT; |
3478 | if (!sctp_is_ep_boundall(sk) && val) | 3480 | if (!sctp_is_ep_boundall(sk) && val) |
3479 | return -EINVAL; | 3481 | return -EINVAL; |
3480 | if ((val && sp->do_auto_asconf) || (!val && !sp->do_auto_asconf)) | 3482 | if ((val && sp->do_auto_asconf) || (!val && !sp->do_auto_asconf)) |
3481 | return 0; | 3483 | return 0; |
3482 | 3484 | ||
3483 | if (val == 0 && sp->do_auto_asconf) { | 3485 | if (val == 0 && sp->do_auto_asconf) { |
3484 | list_del(&sp->auto_asconf_list); | 3486 | list_del(&sp->auto_asconf_list); |
3485 | sp->do_auto_asconf = 0; | 3487 | sp->do_auto_asconf = 0; |
3486 | } else if (val && !sp->do_auto_asconf) { | 3488 | } else if (val && !sp->do_auto_asconf) { |
3487 | list_add_tail(&sp->auto_asconf_list, | 3489 | list_add_tail(&sp->auto_asconf_list, |
3488 | &sock_net(sk)->sctp.auto_asconf_splist); | 3490 | &sock_net(sk)->sctp.auto_asconf_splist); |
3489 | sp->do_auto_asconf = 1; | 3491 | sp->do_auto_asconf = 1; |
3490 | } | 3492 | } |
3491 | return 0; | 3493 | return 0; |
3492 | } | 3494 | } |
3493 | 3495 | ||
3494 | 3496 | ||
3495 | /* | 3497 | /* |
3496 | * SCTP_PEER_ADDR_THLDS | 3498 | * SCTP_PEER_ADDR_THLDS |
3497 | * | 3499 | * |
3498 | * This option allows us to alter the partially failed threshold for one or all | 3500 | * This option allows us to alter the partially failed threshold for one or all |
3499 | * transports in an association. See Section 6.1 of: | 3501 | * transports in an association. See Section 6.1 of: |
3500 | * http://www.ietf.org/id/draft-nishida-tsvwg-sctp-failover-05.txt | 3502 | * http://www.ietf.org/id/draft-nishida-tsvwg-sctp-failover-05.txt |
3501 | */ | 3503 | */ |
3502 | static int sctp_setsockopt_paddr_thresholds(struct sock *sk, | 3504 | static int sctp_setsockopt_paddr_thresholds(struct sock *sk, |
3503 | char __user *optval, | 3505 | char __user *optval, |
3504 | unsigned int optlen) | 3506 | unsigned int optlen) |
3505 | { | 3507 | { |
3506 | struct sctp_paddrthlds val; | 3508 | struct sctp_paddrthlds val; |
3507 | struct sctp_transport *trans; | 3509 | struct sctp_transport *trans; |
3508 | struct sctp_association *asoc; | 3510 | struct sctp_association *asoc; |
3509 | 3511 | ||
3510 | if (optlen < sizeof(struct sctp_paddrthlds)) | 3512 | if (optlen < sizeof(struct sctp_paddrthlds)) |
3511 | return -EINVAL; | 3513 | return -EINVAL; |
3512 | if (copy_from_user(&val, (struct sctp_paddrthlds __user *)optval, | 3514 | if (copy_from_user(&val, (struct sctp_paddrthlds __user *)optval, |
3513 | sizeof(struct sctp_paddrthlds))) | 3515 | sizeof(struct sctp_paddrthlds))) |
3514 | return -EFAULT; | 3516 | return -EFAULT; |
3515 | 3517 | ||
3516 | 3518 | ||
3517 | if (sctp_is_any(sk, (const union sctp_addr *)&val.spt_address)) { | 3519 | if (sctp_is_any(sk, (const union sctp_addr *)&val.spt_address)) { |
3518 | asoc = sctp_id2assoc(sk, val.spt_assoc_id); | 3520 | asoc = sctp_id2assoc(sk, val.spt_assoc_id); |
3519 | if (!asoc) | 3521 | if (!asoc) |
3520 | return -ENOENT; | 3522 | return -ENOENT; |
3521 | list_for_each_entry(trans, &asoc->peer.transport_addr_list, | 3523 | list_for_each_entry(trans, &asoc->peer.transport_addr_list, |
3522 | transports) { | 3524 | transports) { |
3523 | if (val.spt_pathmaxrxt) | 3525 | if (val.spt_pathmaxrxt) |
3524 | trans->pathmaxrxt = val.spt_pathmaxrxt; | 3526 | trans->pathmaxrxt = val.spt_pathmaxrxt; |
3525 | trans->pf_retrans = val.spt_pathpfthld; | 3527 | trans->pf_retrans = val.spt_pathpfthld; |
3526 | } | 3528 | } |
3527 | 3529 | ||
3528 | if (val.spt_pathmaxrxt) | 3530 | if (val.spt_pathmaxrxt) |
3529 | asoc->pathmaxrxt = val.spt_pathmaxrxt; | 3531 | asoc->pathmaxrxt = val.spt_pathmaxrxt; |
3530 | asoc->pf_retrans = val.spt_pathpfthld; | 3532 | asoc->pf_retrans = val.spt_pathpfthld; |
3531 | } else { | 3533 | } else { |
3532 | trans = sctp_addr_id2transport(sk, &val.spt_address, | 3534 | trans = sctp_addr_id2transport(sk, &val.spt_address, |
3533 | val.spt_assoc_id); | 3535 | val.spt_assoc_id); |
3534 | if (!trans) | 3536 | if (!trans) |
3535 | return -ENOENT; | 3537 | return -ENOENT; |
3536 | 3538 | ||
3537 | if (val.spt_pathmaxrxt) | 3539 | if (val.spt_pathmaxrxt) |
3538 | trans->pathmaxrxt = val.spt_pathmaxrxt; | 3540 | trans->pathmaxrxt = val.spt_pathmaxrxt; |
3539 | trans->pf_retrans = val.spt_pathpfthld; | 3541 | trans->pf_retrans = val.spt_pathpfthld; |
3540 | } | 3542 | } |
3541 | 3543 | ||
3542 | return 0; | 3544 | return 0; |
3543 | } | 3545 | } |
3544 | 3546 | ||
3545 | /* API 6.2 setsockopt(), getsockopt() | 3547 | /* API 6.2 setsockopt(), getsockopt() |
3546 | * | 3548 | * |
3547 | * Applications use setsockopt() and getsockopt() to set or retrieve | 3549 | * Applications use setsockopt() and getsockopt() to set or retrieve |
3548 | * socket options. Socket options are used to change the default | 3550 | * socket options. Socket options are used to change the default |
3549 | * behavior of sockets calls. They are described in Section 7. | 3551 | * behavior of sockets calls. They are described in Section 7. |
3550 | * | 3552 | * |
3551 | * The syntax is: | 3553 | * The syntax is: |
3552 | * | 3554 | * |
3553 | * ret = getsockopt(int sd, int level, int optname, void __user *optval, | 3555 | * ret = getsockopt(int sd, int level, int optname, void __user *optval, |
3554 | * int __user *optlen); | 3556 | * int __user *optlen); |
3555 | * ret = setsockopt(int sd, int level, int optname, const void __user *optval, | 3557 | * ret = setsockopt(int sd, int level, int optname, const void __user *optval, |
3556 | * int optlen); | 3558 | * int optlen); |
3557 | * | 3559 | * |
3558 | * sd - the socket descript. | 3560 | * sd - the socket descript. |
3559 | * level - set to IPPROTO_SCTP for all SCTP options. | 3561 | * level - set to IPPROTO_SCTP for all SCTP options. |
3560 | * optname - the option name. | 3562 | * optname - the option name. |
3561 | * optval - the buffer to store the value of the option. | 3563 | * optval - the buffer to store the value of the option. |
3562 | * optlen - the size of the buffer. | 3564 | * optlen - the size of the buffer. |
3563 | */ | 3565 | */ |
3564 | SCTP_STATIC int sctp_setsockopt(struct sock *sk, int level, int optname, | 3566 | SCTP_STATIC int sctp_setsockopt(struct sock *sk, int level, int optname, |
3565 | char __user *optval, unsigned int optlen) | 3567 | char __user *optval, unsigned int optlen) |
3566 | { | 3568 | { |
3567 | int retval = 0; | 3569 | int retval = 0; |
3568 | 3570 | ||
3569 | SCTP_DEBUG_PRINTK("sctp_setsockopt(sk: %p... optname: %d)\n", | 3571 | SCTP_DEBUG_PRINTK("sctp_setsockopt(sk: %p... optname: %d)\n", |
3570 | sk, optname); | 3572 | sk, optname); |
3571 | 3573 | ||
3572 | /* I can hardly begin to describe how wrong this is. This is | 3574 | /* I can hardly begin to describe how wrong this is. This is |
3573 | * so broken as to be worse than useless. The API draft | 3575 | * so broken as to be worse than useless. The API draft |
3574 | * REALLY is NOT helpful here... I am not convinced that the | 3576 | * REALLY is NOT helpful here... I am not convinced that the |
3575 | * semantics of setsockopt() with a level OTHER THAN SOL_SCTP | 3577 | * semantics of setsockopt() with a level OTHER THAN SOL_SCTP |
3576 | * are at all well-founded. | 3578 | * are at all well-founded. |
3577 | */ | 3579 | */ |
3578 | if (level != SOL_SCTP) { | 3580 | if (level != SOL_SCTP) { |
3579 | struct sctp_af *af = sctp_sk(sk)->pf->af; | 3581 | struct sctp_af *af = sctp_sk(sk)->pf->af; |
3580 | retval = af->setsockopt(sk, level, optname, optval, optlen); | 3582 | retval = af->setsockopt(sk, level, optname, optval, optlen); |
3581 | goto out_nounlock; | 3583 | goto out_nounlock; |
3582 | } | 3584 | } |
3583 | 3585 | ||
3584 | sctp_lock_sock(sk); | 3586 | sctp_lock_sock(sk); |
3585 | 3587 | ||
3586 | switch (optname) { | 3588 | switch (optname) { |
3587 | case SCTP_SOCKOPT_BINDX_ADD: | 3589 | case SCTP_SOCKOPT_BINDX_ADD: |
3588 | /* 'optlen' is the size of the addresses buffer. */ | 3590 | /* 'optlen' is the size of the addresses buffer. */ |
3589 | retval = sctp_setsockopt_bindx(sk, (struct sockaddr __user *)optval, | 3591 | retval = sctp_setsockopt_bindx(sk, (struct sockaddr __user *)optval, |
3590 | optlen, SCTP_BINDX_ADD_ADDR); | 3592 | optlen, SCTP_BINDX_ADD_ADDR); |
3591 | break; | 3593 | break; |
3592 | 3594 | ||
3593 | case SCTP_SOCKOPT_BINDX_REM: | 3595 | case SCTP_SOCKOPT_BINDX_REM: |
3594 | /* 'optlen' is the size of the addresses buffer. */ | 3596 | /* 'optlen' is the size of the addresses buffer. */ |
3595 | retval = sctp_setsockopt_bindx(sk, (struct sockaddr __user *)optval, | 3597 | retval = sctp_setsockopt_bindx(sk, (struct sockaddr __user *)optval, |
3596 | optlen, SCTP_BINDX_REM_ADDR); | 3598 | optlen, SCTP_BINDX_REM_ADDR); |
3597 | break; | 3599 | break; |
3598 | 3600 | ||
3599 | case SCTP_SOCKOPT_CONNECTX_OLD: | 3601 | case SCTP_SOCKOPT_CONNECTX_OLD: |
3600 | /* 'optlen' is the size of the addresses buffer. */ | 3602 | /* 'optlen' is the size of the addresses buffer. */ |
3601 | retval = sctp_setsockopt_connectx_old(sk, | 3603 | retval = sctp_setsockopt_connectx_old(sk, |
3602 | (struct sockaddr __user *)optval, | 3604 | (struct sockaddr __user *)optval, |
3603 | optlen); | 3605 | optlen); |
3604 | break; | 3606 | break; |
3605 | 3607 | ||
3606 | case SCTP_SOCKOPT_CONNECTX: | 3608 | case SCTP_SOCKOPT_CONNECTX: |
3607 | /* 'optlen' is the size of the addresses buffer. */ | 3609 | /* 'optlen' is the size of the addresses buffer. */ |
3608 | retval = sctp_setsockopt_connectx(sk, | 3610 | retval = sctp_setsockopt_connectx(sk, |
3609 | (struct sockaddr __user *)optval, | 3611 | (struct sockaddr __user *)optval, |
3610 | optlen); | 3612 | optlen); |
3611 | break; | 3613 | break; |
3612 | 3614 | ||
3613 | case SCTP_DISABLE_FRAGMENTS: | 3615 | case SCTP_DISABLE_FRAGMENTS: |
3614 | retval = sctp_setsockopt_disable_fragments(sk, optval, optlen); | 3616 | retval = sctp_setsockopt_disable_fragments(sk, optval, optlen); |
3615 | break; | 3617 | break; |
3616 | 3618 | ||
3617 | case SCTP_EVENTS: | 3619 | case SCTP_EVENTS: |
3618 | retval = sctp_setsockopt_events(sk, optval, optlen); | 3620 | retval = sctp_setsockopt_events(sk, optval, optlen); |
3619 | break; | 3621 | break; |
3620 | 3622 | ||
3621 | case SCTP_AUTOCLOSE: | 3623 | case SCTP_AUTOCLOSE: |
3622 | retval = sctp_setsockopt_autoclose(sk, optval, optlen); | 3624 | retval = sctp_setsockopt_autoclose(sk, optval, optlen); |
3623 | break; | 3625 | break; |
3624 | 3626 | ||
3625 | case SCTP_PEER_ADDR_PARAMS: | 3627 | case SCTP_PEER_ADDR_PARAMS: |
3626 | retval = sctp_setsockopt_peer_addr_params(sk, optval, optlen); | 3628 | retval = sctp_setsockopt_peer_addr_params(sk, optval, optlen); |
3627 | break; | 3629 | break; |
3628 | 3630 | ||
3629 | case SCTP_DELAYED_SACK: | 3631 | case SCTP_DELAYED_SACK: |
3630 | retval = sctp_setsockopt_delayed_ack(sk, optval, optlen); | 3632 | retval = sctp_setsockopt_delayed_ack(sk, optval, optlen); |
3631 | break; | 3633 | break; |
3632 | case SCTP_PARTIAL_DELIVERY_POINT: | 3634 | case SCTP_PARTIAL_DELIVERY_POINT: |
3633 | retval = sctp_setsockopt_partial_delivery_point(sk, optval, optlen); | 3635 | retval = sctp_setsockopt_partial_delivery_point(sk, optval, optlen); |
3634 | break; | 3636 | break; |
3635 | 3637 | ||
3636 | case SCTP_INITMSG: | 3638 | case SCTP_INITMSG: |
3637 | retval = sctp_setsockopt_initmsg(sk, optval, optlen); | 3639 | retval = sctp_setsockopt_initmsg(sk, optval, optlen); |
3638 | break; | 3640 | break; |
3639 | case SCTP_DEFAULT_SEND_PARAM: | 3641 | case SCTP_DEFAULT_SEND_PARAM: |
3640 | retval = sctp_setsockopt_default_send_param(sk, optval, | 3642 | retval = sctp_setsockopt_default_send_param(sk, optval, |
3641 | optlen); | 3643 | optlen); |
3642 | break; | 3644 | break; |
3643 | case SCTP_PRIMARY_ADDR: | 3645 | case SCTP_PRIMARY_ADDR: |
3644 | retval = sctp_setsockopt_primary_addr(sk, optval, optlen); | 3646 | retval = sctp_setsockopt_primary_addr(sk, optval, optlen); |
3645 | break; | 3647 | break; |
3646 | case SCTP_SET_PEER_PRIMARY_ADDR: | 3648 | case SCTP_SET_PEER_PRIMARY_ADDR: |
3647 | retval = sctp_setsockopt_peer_primary_addr(sk, optval, optlen); | 3649 | retval = sctp_setsockopt_peer_primary_addr(sk, optval, optlen); |
3648 | break; | 3650 | break; |
3649 | case SCTP_NODELAY: | 3651 | case SCTP_NODELAY: |
3650 | retval = sctp_setsockopt_nodelay(sk, optval, optlen); | 3652 | retval = sctp_setsockopt_nodelay(sk, optval, optlen); |
3651 | break; | 3653 | break; |
3652 | case SCTP_RTOINFO: | 3654 | case SCTP_RTOINFO: |
3653 | retval = sctp_setsockopt_rtoinfo(sk, optval, optlen); | 3655 | retval = sctp_setsockopt_rtoinfo(sk, optval, optlen); |
3654 | break; | 3656 | break; |
3655 | case SCTP_ASSOCINFO: | 3657 | case SCTP_ASSOCINFO: |
3656 | retval = sctp_setsockopt_associnfo(sk, optval, optlen); | 3658 | retval = sctp_setsockopt_associnfo(sk, optval, optlen); |
3657 | break; | 3659 | break; |
3658 | case SCTP_I_WANT_MAPPED_V4_ADDR: | 3660 | case SCTP_I_WANT_MAPPED_V4_ADDR: |
3659 | retval = sctp_setsockopt_mappedv4(sk, optval, optlen); | 3661 | retval = sctp_setsockopt_mappedv4(sk, optval, optlen); |
3660 | break; | 3662 | break; |
3661 | case SCTP_MAXSEG: | 3663 | case SCTP_MAXSEG: |
3662 | retval = sctp_setsockopt_maxseg(sk, optval, optlen); | 3664 | retval = sctp_setsockopt_maxseg(sk, optval, optlen); |
3663 | break; | 3665 | break; |
3664 | case SCTP_ADAPTATION_LAYER: | 3666 | case SCTP_ADAPTATION_LAYER: |
3665 | retval = sctp_setsockopt_adaptation_layer(sk, optval, optlen); | 3667 | retval = sctp_setsockopt_adaptation_layer(sk, optval, optlen); |
3666 | break; | 3668 | break; |
3667 | case SCTP_CONTEXT: | 3669 | case SCTP_CONTEXT: |
3668 | retval = sctp_setsockopt_context(sk, optval, optlen); | 3670 | retval = sctp_setsockopt_context(sk, optval, optlen); |
3669 | break; | 3671 | break; |
3670 | case SCTP_FRAGMENT_INTERLEAVE: | 3672 | case SCTP_FRAGMENT_INTERLEAVE: |
3671 | retval = sctp_setsockopt_fragment_interleave(sk, optval, optlen); | 3673 | retval = sctp_setsockopt_fragment_interleave(sk, optval, optlen); |
3672 | break; | 3674 | break; |
3673 | case SCTP_MAX_BURST: | 3675 | case SCTP_MAX_BURST: |
3674 | retval = sctp_setsockopt_maxburst(sk, optval, optlen); | 3676 | retval = sctp_setsockopt_maxburst(sk, optval, optlen); |
3675 | break; | 3677 | break; |
3676 | case SCTP_AUTH_CHUNK: | 3678 | case SCTP_AUTH_CHUNK: |
3677 | retval = sctp_setsockopt_auth_chunk(sk, optval, optlen); | 3679 | retval = sctp_setsockopt_auth_chunk(sk, optval, optlen); |
3678 | break; | 3680 | break; |
3679 | case SCTP_HMAC_IDENT: | 3681 | case SCTP_HMAC_IDENT: |
3680 | retval = sctp_setsockopt_hmac_ident(sk, optval, optlen); | 3682 | retval = sctp_setsockopt_hmac_ident(sk, optval, optlen); |
3681 | break; | 3683 | break; |
3682 | case SCTP_AUTH_KEY: | 3684 | case SCTP_AUTH_KEY: |
3683 | retval = sctp_setsockopt_auth_key(sk, optval, optlen); | 3685 | retval = sctp_setsockopt_auth_key(sk, optval, optlen); |
3684 | break; | 3686 | break; |
3685 | case SCTP_AUTH_ACTIVE_KEY: | 3687 | case SCTP_AUTH_ACTIVE_KEY: |
3686 | retval = sctp_setsockopt_active_key(sk, optval, optlen); | 3688 | retval = sctp_setsockopt_active_key(sk, optval, optlen); |
3687 | break; | 3689 | break; |
3688 | case SCTP_AUTH_DELETE_KEY: | 3690 | case SCTP_AUTH_DELETE_KEY: |
3689 | retval = sctp_setsockopt_del_key(sk, optval, optlen); | 3691 | retval = sctp_setsockopt_del_key(sk, optval, optlen); |
3690 | break; | 3692 | break; |
3691 | case SCTP_AUTO_ASCONF: | 3693 | case SCTP_AUTO_ASCONF: |
3692 | retval = sctp_setsockopt_auto_asconf(sk, optval, optlen); | 3694 | retval = sctp_setsockopt_auto_asconf(sk, optval, optlen); |
3693 | break; | 3695 | break; |
3694 | case SCTP_PEER_ADDR_THLDS: | 3696 | case SCTP_PEER_ADDR_THLDS: |
3695 | retval = sctp_setsockopt_paddr_thresholds(sk, optval, optlen); | 3697 | retval = sctp_setsockopt_paddr_thresholds(sk, optval, optlen); |
3696 | break; | 3698 | break; |
3697 | default: | 3699 | default: |
3698 | retval = -ENOPROTOOPT; | 3700 | retval = -ENOPROTOOPT; |
3699 | break; | 3701 | break; |
3700 | } | 3702 | } |
3701 | 3703 | ||
3702 | sctp_release_sock(sk); | 3704 | sctp_release_sock(sk); |
3703 | 3705 | ||
3704 | out_nounlock: | 3706 | out_nounlock: |
3705 | return retval; | 3707 | return retval; |
3706 | } | 3708 | } |
3707 | 3709 | ||
3708 | /* API 3.1.6 connect() - UDP Style Syntax | 3710 | /* API 3.1.6 connect() - UDP Style Syntax |
3709 | * | 3711 | * |
3710 | * An application may use the connect() call in the UDP model to initiate an | 3712 | * An application may use the connect() call in the UDP model to initiate an |
3711 | * association without sending data. | 3713 | * association without sending data. |
3712 | * | 3714 | * |
3713 | * The syntax is: | 3715 | * The syntax is: |
3714 | * | 3716 | * |
3715 | * ret = connect(int sd, const struct sockaddr *nam, socklen_t len); | 3717 | * ret = connect(int sd, const struct sockaddr *nam, socklen_t len); |
3716 | * | 3718 | * |
3717 | * sd: the socket descriptor to have a new association added to. | 3719 | * sd: the socket descriptor to have a new association added to. |
3718 | * | 3720 | * |
3719 | * nam: the address structure (either struct sockaddr_in or struct | 3721 | * nam: the address structure (either struct sockaddr_in or struct |
3720 | * sockaddr_in6 defined in RFC2553 [7]). | 3722 | * sockaddr_in6 defined in RFC2553 [7]). |
3721 | * | 3723 | * |
3722 | * len: the size of the address. | 3724 | * len: the size of the address. |
3723 | */ | 3725 | */ |
3724 | SCTP_STATIC int sctp_connect(struct sock *sk, struct sockaddr *addr, | 3726 | SCTP_STATIC int sctp_connect(struct sock *sk, struct sockaddr *addr, |
3725 | int addr_len) | 3727 | int addr_len) |
3726 | { | 3728 | { |
3727 | int err = 0; | 3729 | int err = 0; |
3728 | struct sctp_af *af; | 3730 | struct sctp_af *af; |
3729 | 3731 | ||
3730 | sctp_lock_sock(sk); | 3732 | sctp_lock_sock(sk); |
3731 | 3733 | ||
3732 | SCTP_DEBUG_PRINTK("%s - sk: %p, sockaddr: %p, addr_len: %d\n", | 3734 | SCTP_DEBUG_PRINTK("%s - sk: %p, sockaddr: %p, addr_len: %d\n", |
3733 | __func__, sk, addr, addr_len); | 3735 | __func__, sk, addr, addr_len); |
3734 | 3736 | ||
3735 | /* Validate addr_len before calling common connect/connectx routine. */ | 3737 | /* Validate addr_len before calling common connect/connectx routine. */ |
3736 | af = sctp_get_af_specific(addr->sa_family); | 3738 | af = sctp_get_af_specific(addr->sa_family); |
3737 | if (!af || addr_len < af->sockaddr_len) { | 3739 | if (!af || addr_len < af->sockaddr_len) { |
3738 | err = -EINVAL; | 3740 | err = -EINVAL; |
3739 | } else { | 3741 | } else { |
3740 | /* Pass correct addr len to common routine (so it knows there | 3742 | /* Pass correct addr len to common routine (so it knows there |
3741 | * is only one address being passed. | 3743 | * is only one address being passed. |
3742 | */ | 3744 | */ |
3743 | err = __sctp_connect(sk, addr, af->sockaddr_len, NULL); | 3745 | err = __sctp_connect(sk, addr, af->sockaddr_len, NULL); |
3744 | } | 3746 | } |
3745 | 3747 | ||
3746 | sctp_release_sock(sk); | 3748 | sctp_release_sock(sk); |
3747 | return err; | 3749 | return err; |
3748 | } | 3750 | } |
3749 | 3751 | ||
3750 | /* FIXME: Write comments. */ | 3752 | /* FIXME: Write comments. */ |
3751 | SCTP_STATIC int sctp_disconnect(struct sock *sk, int flags) | 3753 | SCTP_STATIC int sctp_disconnect(struct sock *sk, int flags) |
3752 | { | 3754 | { |
3753 | return -EOPNOTSUPP; /* STUB */ | 3755 | return -EOPNOTSUPP; /* STUB */ |
3754 | } | 3756 | } |
3755 | 3757 | ||
3756 | /* 4.1.4 accept() - TCP Style Syntax | 3758 | /* 4.1.4 accept() - TCP Style Syntax |
3757 | * | 3759 | * |
3758 | * Applications use accept() call to remove an established SCTP | 3760 | * Applications use accept() call to remove an established SCTP |
3759 | * association from the accept queue of the endpoint. A new socket | 3761 | * association from the accept queue of the endpoint. A new socket |
3760 | * descriptor will be returned from accept() to represent the newly | 3762 | * descriptor will be returned from accept() to represent the newly |
3761 | * formed association. | 3763 | * formed association. |
3762 | */ | 3764 | */ |
3763 | SCTP_STATIC struct sock *sctp_accept(struct sock *sk, int flags, int *err) | 3765 | SCTP_STATIC struct sock *sctp_accept(struct sock *sk, int flags, int *err) |
3764 | { | 3766 | { |
3765 | struct sctp_sock *sp; | 3767 | struct sctp_sock *sp; |
3766 | struct sctp_endpoint *ep; | 3768 | struct sctp_endpoint *ep; |
3767 | struct sock *newsk = NULL; | 3769 | struct sock *newsk = NULL; |
3768 | struct sctp_association *asoc; | 3770 | struct sctp_association *asoc; |
3769 | long timeo; | 3771 | long timeo; |
3770 | int error = 0; | 3772 | int error = 0; |
3771 | 3773 | ||
3772 | sctp_lock_sock(sk); | 3774 | sctp_lock_sock(sk); |
3773 | 3775 | ||
3774 | sp = sctp_sk(sk); | 3776 | sp = sctp_sk(sk); |
3775 | ep = sp->ep; | 3777 | ep = sp->ep; |
3776 | 3778 | ||
3777 | if (!sctp_style(sk, TCP)) { | 3779 | if (!sctp_style(sk, TCP)) { |
3778 | error = -EOPNOTSUPP; | 3780 | error = -EOPNOTSUPP; |
3779 | goto out; | 3781 | goto out; |
3780 | } | 3782 | } |
3781 | 3783 | ||
3782 | if (!sctp_sstate(sk, LISTENING)) { | 3784 | if (!sctp_sstate(sk, LISTENING)) { |
3783 | error = -EINVAL; | 3785 | error = -EINVAL; |
3784 | goto out; | 3786 | goto out; |
3785 | } | 3787 | } |
3786 | 3788 | ||
3787 | timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK); | 3789 | timeo = sock_rcvtimeo(sk, flags & O_NONBLOCK); |
3788 | 3790 | ||
3789 | error = sctp_wait_for_accept(sk, timeo); | 3791 | error = sctp_wait_for_accept(sk, timeo); |
3790 | if (error) | 3792 | if (error) |
3791 | goto out; | 3793 | goto out; |
3792 | 3794 | ||
3793 | /* We treat the list of associations on the endpoint as the accept | 3795 | /* We treat the list of associations on the endpoint as the accept |
3794 | * queue and pick the first association on the list. | 3796 | * queue and pick the first association on the list. |
3795 | */ | 3797 | */ |
3796 | asoc = list_entry(ep->asocs.next, struct sctp_association, asocs); | 3798 | asoc = list_entry(ep->asocs.next, struct sctp_association, asocs); |
3797 | 3799 | ||
3798 | newsk = sp->pf->create_accept_sk(sk, asoc); | 3800 | newsk = sp->pf->create_accept_sk(sk, asoc); |
3799 | if (!newsk) { | 3801 | if (!newsk) { |
3800 | error = -ENOMEM; | 3802 | error = -ENOMEM; |
3801 | goto out; | 3803 | goto out; |
3802 | } | 3804 | } |
3803 | 3805 | ||
3804 | /* Populate the fields of the newsk from the oldsk and migrate the | 3806 | /* Populate the fields of the newsk from the oldsk and migrate the |
3805 | * asoc to the newsk. | 3807 | * asoc to the newsk. |
3806 | */ | 3808 | */ |
3807 | sctp_sock_migrate(sk, newsk, asoc, SCTP_SOCKET_TCP); | 3809 | sctp_sock_migrate(sk, newsk, asoc, SCTP_SOCKET_TCP); |
3808 | 3810 | ||
3809 | out: | 3811 | out: |
3810 | sctp_release_sock(sk); | 3812 | sctp_release_sock(sk); |
3811 | *err = error; | 3813 | *err = error; |
3812 | return newsk; | 3814 | return newsk; |
3813 | } | 3815 | } |
3814 | 3816 | ||
3815 | /* The SCTP ioctl handler. */ | 3817 | /* The SCTP ioctl handler. */ |
3816 | SCTP_STATIC int sctp_ioctl(struct sock *sk, int cmd, unsigned long arg) | 3818 | SCTP_STATIC int sctp_ioctl(struct sock *sk, int cmd, unsigned long arg) |
3817 | { | 3819 | { |
3818 | int rc = -ENOTCONN; | 3820 | int rc = -ENOTCONN; |
3819 | 3821 | ||
3820 | sctp_lock_sock(sk); | 3822 | sctp_lock_sock(sk); |
3821 | 3823 | ||
3822 | /* | 3824 | /* |
3823 | * SEQPACKET-style sockets in LISTENING state are valid, for | 3825 | * SEQPACKET-style sockets in LISTENING state are valid, for |
3824 | * SCTP, so only discard TCP-style sockets in LISTENING state. | 3826 | * SCTP, so only discard TCP-style sockets in LISTENING state. |
3825 | */ | 3827 | */ |
3826 | if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING)) | 3828 | if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING)) |
3827 | goto out; | 3829 | goto out; |
3828 | 3830 | ||
3829 | switch (cmd) { | 3831 | switch (cmd) { |
3830 | case SIOCINQ: { | 3832 | case SIOCINQ: { |
3831 | struct sk_buff *skb; | 3833 | struct sk_buff *skb; |
3832 | unsigned int amount = 0; | 3834 | unsigned int amount = 0; |
3833 | 3835 | ||
3834 | skb = skb_peek(&sk->sk_receive_queue); | 3836 | skb = skb_peek(&sk->sk_receive_queue); |
3835 | if (skb != NULL) { | 3837 | if (skb != NULL) { |
3836 | /* | 3838 | /* |
3837 | * We will only return the amount of this packet since | 3839 | * We will only return the amount of this packet since |
3838 | * that is all that will be read. | 3840 | * that is all that will be read. |
3839 | */ | 3841 | */ |
3840 | amount = skb->len; | 3842 | amount = skb->len; |
3841 | } | 3843 | } |
3842 | rc = put_user(amount, (int __user *)arg); | 3844 | rc = put_user(amount, (int __user *)arg); |
3843 | break; | 3845 | break; |
3844 | } | 3846 | } |
3845 | default: | 3847 | default: |
3846 | rc = -ENOIOCTLCMD; | 3848 | rc = -ENOIOCTLCMD; |
3847 | break; | 3849 | break; |
3848 | } | 3850 | } |
3849 | out: | 3851 | out: |
3850 | sctp_release_sock(sk); | 3852 | sctp_release_sock(sk); |
3851 | return rc; | 3853 | return rc; |
3852 | } | 3854 | } |
3853 | 3855 | ||
3854 | /* This is the function which gets called during socket creation to | 3856 | /* This is the function which gets called during socket creation to |
3855 | * initialized the SCTP-specific portion of the sock. | 3857 | * initialized the SCTP-specific portion of the sock. |
3856 | * The sock structure should already be zero-filled memory. | 3858 | * The sock structure should already be zero-filled memory. |
3857 | */ | 3859 | */ |
3858 | SCTP_STATIC int sctp_init_sock(struct sock *sk) | 3860 | SCTP_STATIC int sctp_init_sock(struct sock *sk) |
3859 | { | 3861 | { |
3860 | struct net *net = sock_net(sk); | 3862 | struct net *net = sock_net(sk); |
3861 | struct sctp_endpoint *ep; | 3863 | struct sctp_endpoint *ep; |
3862 | struct sctp_sock *sp; | 3864 | struct sctp_sock *sp; |
3863 | 3865 | ||
3864 | SCTP_DEBUG_PRINTK("sctp_init_sock(sk: %p)\n", sk); | 3866 | SCTP_DEBUG_PRINTK("sctp_init_sock(sk: %p)\n", sk); |
3865 | 3867 | ||
3866 | sp = sctp_sk(sk); | 3868 | sp = sctp_sk(sk); |
3867 | 3869 | ||
3868 | /* Initialize the SCTP per socket area. */ | 3870 | /* Initialize the SCTP per socket area. */ |
3869 | switch (sk->sk_type) { | 3871 | switch (sk->sk_type) { |
3870 | case SOCK_SEQPACKET: | 3872 | case SOCK_SEQPACKET: |
3871 | sp->type = SCTP_SOCKET_UDP; | 3873 | sp->type = SCTP_SOCKET_UDP; |
3872 | break; | 3874 | break; |
3873 | case SOCK_STREAM: | 3875 | case SOCK_STREAM: |
3874 | sp->type = SCTP_SOCKET_TCP; | 3876 | sp->type = SCTP_SOCKET_TCP; |
3875 | break; | 3877 | break; |
3876 | default: | 3878 | default: |
3877 | return -ESOCKTNOSUPPORT; | 3879 | return -ESOCKTNOSUPPORT; |
3878 | } | 3880 | } |
3879 | 3881 | ||
3880 | /* Initialize default send parameters. These parameters can be | 3882 | /* Initialize default send parameters. These parameters can be |
3881 | * modified with the SCTP_DEFAULT_SEND_PARAM socket option. | 3883 | * modified with the SCTP_DEFAULT_SEND_PARAM socket option. |
3882 | */ | 3884 | */ |
3883 | sp->default_stream = 0; | 3885 | sp->default_stream = 0; |
3884 | sp->default_ppid = 0; | 3886 | sp->default_ppid = 0; |
3885 | sp->default_flags = 0; | 3887 | sp->default_flags = 0; |
3886 | sp->default_context = 0; | 3888 | sp->default_context = 0; |
3887 | sp->default_timetolive = 0; | 3889 | sp->default_timetolive = 0; |
3888 | 3890 | ||
3889 | sp->default_rcv_context = 0; | 3891 | sp->default_rcv_context = 0; |
3890 | sp->max_burst = net->sctp.max_burst; | 3892 | sp->max_burst = net->sctp.max_burst; |
3891 | 3893 | ||
3892 | sp->sctp_hmac_alg = net->sctp.sctp_hmac_alg; | 3894 | sp->sctp_hmac_alg = net->sctp.sctp_hmac_alg; |
3893 | 3895 | ||
3894 | /* Initialize default setup parameters. These parameters | 3896 | /* Initialize default setup parameters. These parameters |
3895 | * can be modified with the SCTP_INITMSG socket option or | 3897 | * can be modified with the SCTP_INITMSG socket option or |
3896 | * overridden by the SCTP_INIT CMSG. | 3898 | * overridden by the SCTP_INIT CMSG. |
3897 | */ | 3899 | */ |
3898 | sp->initmsg.sinit_num_ostreams = sctp_max_outstreams; | 3900 | sp->initmsg.sinit_num_ostreams = sctp_max_outstreams; |
3899 | sp->initmsg.sinit_max_instreams = sctp_max_instreams; | 3901 | sp->initmsg.sinit_max_instreams = sctp_max_instreams; |
3900 | sp->initmsg.sinit_max_attempts = net->sctp.max_retrans_init; | 3902 | sp->initmsg.sinit_max_attempts = net->sctp.max_retrans_init; |
3901 | sp->initmsg.sinit_max_init_timeo = net->sctp.rto_max; | 3903 | sp->initmsg.sinit_max_init_timeo = net->sctp.rto_max; |
3902 | 3904 | ||
3903 | /* Initialize default RTO related parameters. These parameters can | 3905 | /* Initialize default RTO related parameters. These parameters can |
3904 | * be modified for with the SCTP_RTOINFO socket option. | 3906 | * be modified for with the SCTP_RTOINFO socket option. |
3905 | */ | 3907 | */ |
3906 | sp->rtoinfo.srto_initial = net->sctp.rto_initial; | 3908 | sp->rtoinfo.srto_initial = net->sctp.rto_initial; |
3907 | sp->rtoinfo.srto_max = net->sctp.rto_max; | 3909 | sp->rtoinfo.srto_max = net->sctp.rto_max; |
3908 | sp->rtoinfo.srto_min = net->sctp.rto_min; | 3910 | sp->rtoinfo.srto_min = net->sctp.rto_min; |
3909 | 3911 | ||
3910 | /* Initialize default association related parameters. These parameters | 3912 | /* Initialize default association related parameters. These parameters |
3911 | * can be modified with the SCTP_ASSOCINFO socket option. | 3913 | * can be modified with the SCTP_ASSOCINFO socket option. |
3912 | */ | 3914 | */ |
3913 | sp->assocparams.sasoc_asocmaxrxt = net->sctp.max_retrans_association; | 3915 | sp->assocparams.sasoc_asocmaxrxt = net->sctp.max_retrans_association; |
3914 | sp->assocparams.sasoc_number_peer_destinations = 0; | 3916 | sp->assocparams.sasoc_number_peer_destinations = 0; |
3915 | sp->assocparams.sasoc_peer_rwnd = 0; | 3917 | sp->assocparams.sasoc_peer_rwnd = 0; |
3916 | sp->assocparams.sasoc_local_rwnd = 0; | 3918 | sp->assocparams.sasoc_local_rwnd = 0; |
3917 | sp->assocparams.sasoc_cookie_life = net->sctp.valid_cookie_life; | 3919 | sp->assocparams.sasoc_cookie_life = net->sctp.valid_cookie_life; |
3918 | 3920 | ||
3919 | /* Initialize default event subscriptions. By default, all the | 3921 | /* Initialize default event subscriptions. By default, all the |
3920 | * options are off. | 3922 | * options are off. |
3921 | */ | 3923 | */ |
3922 | memset(&sp->subscribe, 0, sizeof(struct sctp_event_subscribe)); | 3924 | memset(&sp->subscribe, 0, sizeof(struct sctp_event_subscribe)); |
3923 | 3925 | ||
3924 | /* Default Peer Address Parameters. These defaults can | 3926 | /* Default Peer Address Parameters. These defaults can |
3925 | * be modified via SCTP_PEER_ADDR_PARAMS | 3927 | * be modified via SCTP_PEER_ADDR_PARAMS |
3926 | */ | 3928 | */ |
3927 | sp->hbinterval = net->sctp.hb_interval; | 3929 | sp->hbinterval = net->sctp.hb_interval; |
3928 | sp->pathmaxrxt = net->sctp.max_retrans_path; | 3930 | sp->pathmaxrxt = net->sctp.max_retrans_path; |
3929 | sp->pathmtu = 0; // allow default discovery | 3931 | sp->pathmtu = 0; // allow default discovery |
3930 | sp->sackdelay = net->sctp.sack_timeout; | 3932 | sp->sackdelay = net->sctp.sack_timeout; |
3931 | sp->sackfreq = 2; | 3933 | sp->sackfreq = 2; |
3932 | sp->param_flags = SPP_HB_ENABLE | | 3934 | sp->param_flags = SPP_HB_ENABLE | |
3933 | SPP_PMTUD_ENABLE | | 3935 | SPP_PMTUD_ENABLE | |
3934 | SPP_SACKDELAY_ENABLE; | 3936 | SPP_SACKDELAY_ENABLE; |
3935 | 3937 | ||
3936 | /* If enabled no SCTP message fragmentation will be performed. | 3938 | /* If enabled no SCTP message fragmentation will be performed. |
3937 | * Configure through SCTP_DISABLE_FRAGMENTS socket option. | 3939 | * Configure through SCTP_DISABLE_FRAGMENTS socket option. |
3938 | */ | 3940 | */ |
3939 | sp->disable_fragments = 0; | 3941 | sp->disable_fragments = 0; |
3940 | 3942 | ||
3941 | /* Enable Nagle algorithm by default. */ | 3943 | /* Enable Nagle algorithm by default. */ |
3942 | sp->nodelay = 0; | 3944 | sp->nodelay = 0; |
3943 | 3945 | ||
3944 | /* Enable by default. */ | 3946 | /* Enable by default. */ |
3945 | sp->v4mapped = 1; | 3947 | sp->v4mapped = 1; |
3946 | 3948 | ||
3947 | /* Auto-close idle associations after the configured | 3949 | /* Auto-close idle associations after the configured |
3948 | * number of seconds. A value of 0 disables this | 3950 | * number of seconds. A value of 0 disables this |
3949 | * feature. Configure through the SCTP_AUTOCLOSE socket option, | 3951 | * feature. Configure through the SCTP_AUTOCLOSE socket option, |
3950 | * for UDP-style sockets only. | 3952 | * for UDP-style sockets only. |
3951 | */ | 3953 | */ |
3952 | sp->autoclose = 0; | 3954 | sp->autoclose = 0; |
3953 | 3955 | ||
3954 | /* User specified fragmentation limit. */ | 3956 | /* User specified fragmentation limit. */ |
3955 | sp->user_frag = 0; | 3957 | sp->user_frag = 0; |
3956 | 3958 | ||
3957 | sp->adaptation_ind = 0; | 3959 | sp->adaptation_ind = 0; |
3958 | 3960 | ||
3959 | sp->pf = sctp_get_pf_specific(sk->sk_family); | 3961 | sp->pf = sctp_get_pf_specific(sk->sk_family); |
3960 | 3962 | ||
3961 | /* Control variables for partial data delivery. */ | 3963 | /* Control variables for partial data delivery. */ |
3962 | atomic_set(&sp->pd_mode, 0); | 3964 | atomic_set(&sp->pd_mode, 0); |
3963 | skb_queue_head_init(&sp->pd_lobby); | 3965 | skb_queue_head_init(&sp->pd_lobby); |
3964 | sp->frag_interleave = 0; | 3966 | sp->frag_interleave = 0; |
3965 | 3967 | ||
3966 | /* Create a per socket endpoint structure. Even if we | 3968 | /* Create a per socket endpoint structure. Even if we |
3967 | * change the data structure relationships, this may still | 3969 | * change the data structure relationships, this may still |
3968 | * be useful for storing pre-connect address information. | 3970 | * be useful for storing pre-connect address information. |
3969 | */ | 3971 | */ |
3970 | ep = sctp_endpoint_new(sk, GFP_KERNEL); | 3972 | ep = sctp_endpoint_new(sk, GFP_KERNEL); |
3971 | if (!ep) | 3973 | if (!ep) |
3972 | return -ENOMEM; | 3974 | return -ENOMEM; |
3973 | 3975 | ||
3974 | sp->ep = ep; | 3976 | sp->ep = ep; |
3975 | sp->hmac = NULL; | 3977 | sp->hmac = NULL; |
3976 | 3978 | ||
3977 | SCTP_DBG_OBJCNT_INC(sock); | 3979 | SCTP_DBG_OBJCNT_INC(sock); |
3978 | 3980 | ||
3979 | local_bh_disable(); | 3981 | local_bh_disable(); |
3980 | percpu_counter_inc(&sctp_sockets_allocated); | 3982 | percpu_counter_inc(&sctp_sockets_allocated); |
3981 | sock_prot_inuse_add(net, sk->sk_prot, 1); | 3983 | sock_prot_inuse_add(net, sk->sk_prot, 1); |
3982 | if (net->sctp.default_auto_asconf) { | 3984 | if (net->sctp.default_auto_asconf) { |
3983 | list_add_tail(&sp->auto_asconf_list, | 3985 | list_add_tail(&sp->auto_asconf_list, |
3984 | &net->sctp.auto_asconf_splist); | 3986 | &net->sctp.auto_asconf_splist); |
3985 | sp->do_auto_asconf = 1; | 3987 | sp->do_auto_asconf = 1; |
3986 | } else | 3988 | } else |
3987 | sp->do_auto_asconf = 0; | 3989 | sp->do_auto_asconf = 0; |
3988 | local_bh_enable(); | 3990 | local_bh_enable(); |
3989 | 3991 | ||
3990 | return 0; | 3992 | return 0; |
3991 | } | 3993 | } |
3992 | 3994 | ||
3993 | /* Cleanup any SCTP per socket resources. */ | 3995 | /* Cleanup any SCTP per socket resources. */ |
3994 | SCTP_STATIC void sctp_destroy_sock(struct sock *sk) | 3996 | SCTP_STATIC void sctp_destroy_sock(struct sock *sk) |
3995 | { | 3997 | { |
3996 | struct sctp_sock *sp; | 3998 | struct sctp_sock *sp; |
3997 | 3999 | ||
3998 | SCTP_DEBUG_PRINTK("sctp_destroy_sock(sk: %p)\n", sk); | 4000 | SCTP_DEBUG_PRINTK("sctp_destroy_sock(sk: %p)\n", sk); |
3999 | 4001 | ||
4000 | /* Release our hold on the endpoint. */ | 4002 | /* Release our hold on the endpoint. */ |
4001 | sp = sctp_sk(sk); | 4003 | sp = sctp_sk(sk); |
4002 | if (sp->do_auto_asconf) { | 4004 | if (sp->do_auto_asconf) { |
4003 | sp->do_auto_asconf = 0; | 4005 | sp->do_auto_asconf = 0; |
4004 | list_del(&sp->auto_asconf_list); | 4006 | list_del(&sp->auto_asconf_list); |
4005 | } | 4007 | } |
4006 | sctp_endpoint_free(sp->ep); | 4008 | sctp_endpoint_free(sp->ep); |
4007 | local_bh_disable(); | 4009 | local_bh_disable(); |
4008 | percpu_counter_dec(&sctp_sockets_allocated); | 4010 | percpu_counter_dec(&sctp_sockets_allocated); |
4009 | sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1); | 4011 | sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1); |
4010 | local_bh_enable(); | 4012 | local_bh_enable(); |
4011 | } | 4013 | } |
4012 | 4014 | ||
4013 | /* API 4.1.7 shutdown() - TCP Style Syntax | 4015 | /* API 4.1.7 shutdown() - TCP Style Syntax |
4014 | * int shutdown(int socket, int how); | 4016 | * int shutdown(int socket, int how); |
4015 | * | 4017 | * |
4016 | * sd - the socket descriptor of the association to be closed. | 4018 | * sd - the socket descriptor of the association to be closed. |
4017 | * how - Specifies the type of shutdown. The values are | 4019 | * how - Specifies the type of shutdown. The values are |
4018 | * as follows: | 4020 | * as follows: |
4019 | * SHUT_RD | 4021 | * SHUT_RD |
4020 | * Disables further receive operations. No SCTP | 4022 | * Disables further receive operations. No SCTP |
4021 | * protocol action is taken. | 4023 | * protocol action is taken. |
4022 | * SHUT_WR | 4024 | * SHUT_WR |
4023 | * Disables further send operations, and initiates | 4025 | * Disables further send operations, and initiates |
4024 | * the SCTP shutdown sequence. | 4026 | * the SCTP shutdown sequence. |
4025 | * SHUT_RDWR | 4027 | * SHUT_RDWR |
4026 | * Disables further send and receive operations | 4028 | * Disables further send and receive operations |
4027 | * and initiates the SCTP shutdown sequence. | 4029 | * and initiates the SCTP shutdown sequence. |
4028 | */ | 4030 | */ |
4029 | SCTP_STATIC void sctp_shutdown(struct sock *sk, int how) | 4031 | SCTP_STATIC void sctp_shutdown(struct sock *sk, int how) |
4030 | { | 4032 | { |
4031 | struct net *net = sock_net(sk); | 4033 | struct net *net = sock_net(sk); |
4032 | struct sctp_endpoint *ep; | 4034 | struct sctp_endpoint *ep; |
4033 | struct sctp_association *asoc; | 4035 | struct sctp_association *asoc; |
4034 | 4036 | ||
4035 | if (!sctp_style(sk, TCP)) | 4037 | if (!sctp_style(sk, TCP)) |
4036 | return; | 4038 | return; |
4037 | 4039 | ||
4038 | if (how & SEND_SHUTDOWN) { | 4040 | if (how & SEND_SHUTDOWN) { |
4039 | ep = sctp_sk(sk)->ep; | 4041 | ep = sctp_sk(sk)->ep; |
4040 | if (!list_empty(&ep->asocs)) { | 4042 | if (!list_empty(&ep->asocs)) { |
4041 | asoc = list_entry(ep->asocs.next, | 4043 | asoc = list_entry(ep->asocs.next, |
4042 | struct sctp_association, asocs); | 4044 | struct sctp_association, asocs); |
4043 | sctp_primitive_SHUTDOWN(net, asoc, NULL); | 4045 | sctp_primitive_SHUTDOWN(net, asoc, NULL); |
4044 | } | 4046 | } |
4045 | } | 4047 | } |
4046 | } | 4048 | } |
4047 | 4049 | ||
4048 | /* 7.2.1 Association Status (SCTP_STATUS) | 4050 | /* 7.2.1 Association Status (SCTP_STATUS) |
4049 | 4051 | ||
4050 | * Applications can retrieve current status information about an | 4052 | * Applications can retrieve current status information about an |
4051 | * association, including association state, peer receiver window size, | 4053 | * association, including association state, peer receiver window size, |
4052 | * number of unacked data chunks, and number of data chunks pending | 4054 | * number of unacked data chunks, and number of data chunks pending |
4053 | * receipt. This information is read-only. | 4055 | * receipt. This information is read-only. |
4054 | */ | 4056 | */ |
4055 | static int sctp_getsockopt_sctp_status(struct sock *sk, int len, | 4057 | static int sctp_getsockopt_sctp_status(struct sock *sk, int len, |
4056 | char __user *optval, | 4058 | char __user *optval, |
4057 | int __user *optlen) | 4059 | int __user *optlen) |
4058 | { | 4060 | { |
4059 | struct sctp_status status; | 4061 | struct sctp_status status; |
4060 | struct sctp_association *asoc = NULL; | 4062 | struct sctp_association *asoc = NULL; |
4061 | struct sctp_transport *transport; | 4063 | struct sctp_transport *transport; |
4062 | sctp_assoc_t associd; | 4064 | sctp_assoc_t associd; |
4063 | int retval = 0; | 4065 | int retval = 0; |
4064 | 4066 | ||
4065 | if (len < sizeof(status)) { | 4067 | if (len < sizeof(status)) { |
4066 | retval = -EINVAL; | 4068 | retval = -EINVAL; |
4067 | goto out; | 4069 | goto out; |
4068 | } | 4070 | } |
4069 | 4071 | ||
4070 | len = sizeof(status); | 4072 | len = sizeof(status); |
4071 | if (copy_from_user(&status, optval, len)) { | 4073 | if (copy_from_user(&status, optval, len)) { |
4072 | retval = -EFAULT; | 4074 | retval = -EFAULT; |
4073 | goto out; | 4075 | goto out; |
4074 | } | 4076 | } |
4075 | 4077 | ||
4076 | associd = status.sstat_assoc_id; | 4078 | associd = status.sstat_assoc_id; |
4077 | asoc = sctp_id2assoc(sk, associd); | 4079 | asoc = sctp_id2assoc(sk, associd); |
4078 | if (!asoc) { | 4080 | if (!asoc) { |
4079 | retval = -EINVAL; | 4081 | retval = -EINVAL; |
4080 | goto out; | 4082 | goto out; |
4081 | } | 4083 | } |
4082 | 4084 | ||
4083 | transport = asoc->peer.primary_path; | 4085 | transport = asoc->peer.primary_path; |
4084 | 4086 | ||
4085 | status.sstat_assoc_id = sctp_assoc2id(asoc); | 4087 | status.sstat_assoc_id = sctp_assoc2id(asoc); |
4086 | status.sstat_state = asoc->state; | 4088 | status.sstat_state = asoc->state; |
4087 | status.sstat_rwnd = asoc->peer.rwnd; | 4089 | status.sstat_rwnd = asoc->peer.rwnd; |
4088 | status.sstat_unackdata = asoc->unack_data; | 4090 | status.sstat_unackdata = asoc->unack_data; |
4089 | 4091 | ||
4090 | status.sstat_penddata = sctp_tsnmap_pending(&asoc->peer.tsn_map); | 4092 | status.sstat_penddata = sctp_tsnmap_pending(&asoc->peer.tsn_map); |
4091 | status.sstat_instrms = asoc->c.sinit_max_instreams; | 4093 | status.sstat_instrms = asoc->c.sinit_max_instreams; |
4092 | status.sstat_outstrms = asoc->c.sinit_num_ostreams; | 4094 | status.sstat_outstrms = asoc->c.sinit_num_ostreams; |
4093 | status.sstat_fragmentation_point = asoc->frag_point; | 4095 | status.sstat_fragmentation_point = asoc->frag_point; |
4094 | status.sstat_primary.spinfo_assoc_id = sctp_assoc2id(transport->asoc); | 4096 | status.sstat_primary.spinfo_assoc_id = sctp_assoc2id(transport->asoc); |
4095 | memcpy(&status.sstat_primary.spinfo_address, &transport->ipaddr, | 4097 | memcpy(&status.sstat_primary.spinfo_address, &transport->ipaddr, |
4096 | transport->af_specific->sockaddr_len); | 4098 | transport->af_specific->sockaddr_len); |
4097 | /* Map ipv4 address into v4-mapped-on-v6 address. */ | 4099 | /* Map ipv4 address into v4-mapped-on-v6 address. */ |
4098 | sctp_get_pf_specific(sk->sk_family)->addr_v4map(sctp_sk(sk), | 4100 | sctp_get_pf_specific(sk->sk_family)->addr_v4map(sctp_sk(sk), |
4099 | (union sctp_addr *)&status.sstat_primary.spinfo_address); | 4101 | (union sctp_addr *)&status.sstat_primary.spinfo_address); |
4100 | status.sstat_primary.spinfo_state = transport->state; | 4102 | status.sstat_primary.spinfo_state = transport->state; |
4101 | status.sstat_primary.spinfo_cwnd = transport->cwnd; | 4103 | status.sstat_primary.spinfo_cwnd = transport->cwnd; |
4102 | status.sstat_primary.spinfo_srtt = transport->srtt; | 4104 | status.sstat_primary.spinfo_srtt = transport->srtt; |
4103 | status.sstat_primary.spinfo_rto = jiffies_to_msecs(transport->rto); | 4105 | status.sstat_primary.spinfo_rto = jiffies_to_msecs(transport->rto); |
4104 | status.sstat_primary.spinfo_mtu = transport->pathmtu; | 4106 | status.sstat_primary.spinfo_mtu = transport->pathmtu; |
4105 | 4107 | ||
4106 | if (status.sstat_primary.spinfo_state == SCTP_UNKNOWN) | 4108 | if (status.sstat_primary.spinfo_state == SCTP_UNKNOWN) |
4107 | status.sstat_primary.spinfo_state = SCTP_ACTIVE; | 4109 | status.sstat_primary.spinfo_state = SCTP_ACTIVE; |
4108 | 4110 | ||
4109 | if (put_user(len, optlen)) { | 4111 | if (put_user(len, optlen)) { |
4110 | retval = -EFAULT; | 4112 | retval = -EFAULT; |
4111 | goto out; | 4113 | goto out; |
4112 | } | 4114 | } |
4113 | 4115 | ||
4114 | SCTP_DEBUG_PRINTK("sctp_getsockopt_sctp_status(%d): %d %d %d\n", | 4116 | SCTP_DEBUG_PRINTK("sctp_getsockopt_sctp_status(%d): %d %d %d\n", |
4115 | len, status.sstat_state, status.sstat_rwnd, | 4117 | len, status.sstat_state, status.sstat_rwnd, |
4116 | status.sstat_assoc_id); | 4118 | status.sstat_assoc_id); |
4117 | 4119 | ||
4118 | if (copy_to_user(optval, &status, len)) { | 4120 | if (copy_to_user(optval, &status, len)) { |
4119 | retval = -EFAULT; | 4121 | retval = -EFAULT; |
4120 | goto out; | 4122 | goto out; |
4121 | } | 4123 | } |
4122 | 4124 | ||
4123 | out: | 4125 | out: |
4124 | return retval; | 4126 | return retval; |
4125 | } | 4127 | } |
4126 | 4128 | ||
4127 | 4129 | ||
4128 | /* 7.2.2 Peer Address Information (SCTP_GET_PEER_ADDR_INFO) | 4130 | /* 7.2.2 Peer Address Information (SCTP_GET_PEER_ADDR_INFO) |
4129 | * | 4131 | * |
4130 | * Applications can retrieve information about a specific peer address | 4132 | * Applications can retrieve information about a specific peer address |
4131 | * of an association, including its reachability state, congestion | 4133 | * of an association, including its reachability state, congestion |
4132 | * window, and retransmission timer values. This information is | 4134 | * window, and retransmission timer values. This information is |
4133 | * read-only. | 4135 | * read-only. |
4134 | */ | 4136 | */ |
4135 | static int sctp_getsockopt_peer_addr_info(struct sock *sk, int len, | 4137 | static int sctp_getsockopt_peer_addr_info(struct sock *sk, int len, |
4136 | char __user *optval, | 4138 | char __user *optval, |
4137 | int __user *optlen) | 4139 | int __user *optlen) |
4138 | { | 4140 | { |
4139 | struct sctp_paddrinfo pinfo; | 4141 | struct sctp_paddrinfo pinfo; |
4140 | struct sctp_transport *transport; | 4142 | struct sctp_transport *transport; |
4141 | int retval = 0; | 4143 | int retval = 0; |
4142 | 4144 | ||
4143 | if (len < sizeof(pinfo)) { | 4145 | if (len < sizeof(pinfo)) { |
4144 | retval = -EINVAL; | 4146 | retval = -EINVAL; |
4145 | goto out; | 4147 | goto out; |
4146 | } | 4148 | } |
4147 | 4149 | ||
4148 | len = sizeof(pinfo); | 4150 | len = sizeof(pinfo); |
4149 | if (copy_from_user(&pinfo, optval, len)) { | 4151 | if (copy_from_user(&pinfo, optval, len)) { |
4150 | retval = -EFAULT; | 4152 | retval = -EFAULT; |
4151 | goto out; | 4153 | goto out; |
4152 | } | 4154 | } |
4153 | 4155 | ||
4154 | transport = sctp_addr_id2transport(sk, &pinfo.spinfo_address, | 4156 | transport = sctp_addr_id2transport(sk, &pinfo.spinfo_address, |
4155 | pinfo.spinfo_assoc_id); | 4157 | pinfo.spinfo_assoc_id); |
4156 | if (!transport) | 4158 | if (!transport) |
4157 | return -EINVAL; | 4159 | return -EINVAL; |
4158 | 4160 | ||
4159 | pinfo.spinfo_assoc_id = sctp_assoc2id(transport->asoc); | 4161 | pinfo.spinfo_assoc_id = sctp_assoc2id(transport->asoc); |
4160 | pinfo.spinfo_state = transport->state; | 4162 | pinfo.spinfo_state = transport->state; |
4161 | pinfo.spinfo_cwnd = transport->cwnd; | 4163 | pinfo.spinfo_cwnd = transport->cwnd; |
4162 | pinfo.spinfo_srtt = transport->srtt; | 4164 | pinfo.spinfo_srtt = transport->srtt; |
4163 | pinfo.spinfo_rto = jiffies_to_msecs(transport->rto); | 4165 | pinfo.spinfo_rto = jiffies_to_msecs(transport->rto); |
4164 | pinfo.spinfo_mtu = transport->pathmtu; | 4166 | pinfo.spinfo_mtu = transport->pathmtu; |
4165 | 4167 | ||
4166 | if (pinfo.spinfo_state == SCTP_UNKNOWN) | 4168 | if (pinfo.spinfo_state == SCTP_UNKNOWN) |
4167 | pinfo.spinfo_state = SCTP_ACTIVE; | 4169 | pinfo.spinfo_state = SCTP_ACTIVE; |
4168 | 4170 | ||
4169 | if (put_user(len, optlen)) { | 4171 | if (put_user(len, optlen)) { |
4170 | retval = -EFAULT; | 4172 | retval = -EFAULT; |
4171 | goto out; | 4173 | goto out; |
4172 | } | 4174 | } |
4173 | 4175 | ||
4174 | if (copy_to_user(optval, &pinfo, len)) { | 4176 | if (copy_to_user(optval, &pinfo, len)) { |
4175 | retval = -EFAULT; | 4177 | retval = -EFAULT; |
4176 | goto out; | 4178 | goto out; |
4177 | } | 4179 | } |
4178 | 4180 | ||
4179 | out: | 4181 | out: |
4180 | return retval; | 4182 | return retval; |
4181 | } | 4183 | } |
4182 | 4184 | ||
4183 | /* 7.1.12 Enable/Disable message fragmentation (SCTP_DISABLE_FRAGMENTS) | 4185 | /* 7.1.12 Enable/Disable message fragmentation (SCTP_DISABLE_FRAGMENTS) |
4184 | * | 4186 | * |
4185 | * This option is a on/off flag. If enabled no SCTP message | 4187 | * This option is a on/off flag. If enabled no SCTP message |
4186 | * fragmentation will be performed. Instead if a message being sent | 4188 | * fragmentation will be performed. Instead if a message being sent |
4187 | * exceeds the current PMTU size, the message will NOT be sent and | 4189 | * exceeds the current PMTU size, the message will NOT be sent and |
4188 | * instead a error will be indicated to the user. | 4190 | * instead a error will be indicated to the user. |
4189 | */ | 4191 | */ |
4190 | static int sctp_getsockopt_disable_fragments(struct sock *sk, int len, | 4192 | static int sctp_getsockopt_disable_fragments(struct sock *sk, int len, |
4191 | char __user *optval, int __user *optlen) | 4193 | char __user *optval, int __user *optlen) |
4192 | { | 4194 | { |
4193 | int val; | 4195 | int val; |
4194 | 4196 | ||
4195 | if (len < sizeof(int)) | 4197 | if (len < sizeof(int)) |
4196 | return -EINVAL; | 4198 | return -EINVAL; |
4197 | 4199 | ||
4198 | len = sizeof(int); | 4200 | len = sizeof(int); |
4199 | val = (sctp_sk(sk)->disable_fragments == 1); | 4201 | val = (sctp_sk(sk)->disable_fragments == 1); |
4200 | if (put_user(len, optlen)) | 4202 | if (put_user(len, optlen)) |
4201 | return -EFAULT; | 4203 | return -EFAULT; |
4202 | if (copy_to_user(optval, &val, len)) | 4204 | if (copy_to_user(optval, &val, len)) |
4203 | return -EFAULT; | 4205 | return -EFAULT; |
4204 | return 0; | 4206 | return 0; |
4205 | } | 4207 | } |
4206 | 4208 | ||
4207 | /* 7.1.15 Set notification and ancillary events (SCTP_EVENTS) | 4209 | /* 7.1.15 Set notification and ancillary events (SCTP_EVENTS) |
4208 | * | 4210 | * |
4209 | * This socket option is used to specify various notifications and | 4211 | * This socket option is used to specify various notifications and |
4210 | * ancillary data the user wishes to receive. | 4212 | * ancillary data the user wishes to receive. |
4211 | */ | 4213 | */ |
4212 | static int sctp_getsockopt_events(struct sock *sk, int len, char __user *optval, | 4214 | static int sctp_getsockopt_events(struct sock *sk, int len, char __user *optval, |
4213 | int __user *optlen) | 4215 | int __user *optlen) |
4214 | { | 4216 | { |
4215 | if (len <= 0) | 4217 | if (len <= 0) |
4216 | return -EINVAL; | 4218 | return -EINVAL; |
4217 | if (len > sizeof(struct sctp_event_subscribe)) | 4219 | if (len > sizeof(struct sctp_event_subscribe)) |
4218 | len = sizeof(struct sctp_event_subscribe); | 4220 | len = sizeof(struct sctp_event_subscribe); |
4219 | if (put_user(len, optlen)) | 4221 | if (put_user(len, optlen)) |
4220 | return -EFAULT; | 4222 | return -EFAULT; |
4221 | if (copy_to_user(optval, &sctp_sk(sk)->subscribe, len)) | 4223 | if (copy_to_user(optval, &sctp_sk(sk)->subscribe, len)) |
4222 | return -EFAULT; | 4224 | return -EFAULT; |
4223 | return 0; | 4225 | return 0; |
4224 | } | 4226 | } |
4225 | 4227 | ||
4226 | /* 7.1.8 Automatic Close of associations (SCTP_AUTOCLOSE) | 4228 | /* 7.1.8 Automatic Close of associations (SCTP_AUTOCLOSE) |
4227 | * | 4229 | * |
4228 | * This socket option is applicable to the UDP-style socket only. When | 4230 | * This socket option is applicable to the UDP-style socket only. When |
4229 | * set it will cause associations that are idle for more than the | 4231 | * set it will cause associations that are idle for more than the |
4230 | * specified number of seconds to automatically close. An association | 4232 | * specified number of seconds to automatically close. An association |
4231 | * being idle is defined an association that has NOT sent or received | 4233 | * being idle is defined an association that has NOT sent or received |
4232 | * user data. The special value of '0' indicates that no automatic | 4234 | * user data. The special value of '0' indicates that no automatic |
4233 | * close of any associations should be performed. The option expects an | 4235 | * close of any associations should be performed. The option expects an |
4234 | * integer defining the number of seconds of idle time before an | 4236 | * integer defining the number of seconds of idle time before an |
4235 | * association is closed. | 4237 | * association is closed. |
4236 | */ | 4238 | */ |
4237 | static int sctp_getsockopt_autoclose(struct sock *sk, int len, char __user *optval, int __user *optlen) | 4239 | static int sctp_getsockopt_autoclose(struct sock *sk, int len, char __user *optval, int __user *optlen) |
4238 | { | 4240 | { |
4239 | /* Applicable to UDP-style socket only */ | 4241 | /* Applicable to UDP-style socket only */ |
4240 | if (sctp_style(sk, TCP)) | 4242 | if (sctp_style(sk, TCP)) |
4241 | return -EOPNOTSUPP; | 4243 | return -EOPNOTSUPP; |
4242 | if (len < sizeof(int)) | 4244 | if (len < sizeof(int)) |
4243 | return -EINVAL; | 4245 | return -EINVAL; |
4244 | len = sizeof(int); | 4246 | len = sizeof(int); |
4245 | if (put_user(len, optlen)) | 4247 | if (put_user(len, optlen)) |
4246 | return -EFAULT; | 4248 | return -EFAULT; |
4247 | if (copy_to_user(optval, &sctp_sk(sk)->autoclose, sizeof(int))) | 4249 | if (copy_to_user(optval, &sctp_sk(sk)->autoclose, sizeof(int))) |
4248 | return -EFAULT; | 4250 | return -EFAULT; |
4249 | return 0; | 4251 | return 0; |
4250 | } | 4252 | } |
4251 | 4253 | ||
4252 | /* Helper routine to branch off an association to a new socket. */ | 4254 | /* Helper routine to branch off an association to a new socket. */ |
4253 | int sctp_do_peeloff(struct sock *sk, sctp_assoc_t id, struct socket **sockp) | 4255 | int sctp_do_peeloff(struct sock *sk, sctp_assoc_t id, struct socket **sockp) |
4254 | { | 4256 | { |
4255 | struct sctp_association *asoc = sctp_id2assoc(sk, id); | 4257 | struct sctp_association *asoc = sctp_id2assoc(sk, id); |
4256 | struct socket *sock; | 4258 | struct socket *sock; |
4257 | struct sctp_af *af; | 4259 | struct sctp_af *af; |
4258 | int err = 0; | 4260 | int err = 0; |
4259 | 4261 | ||
4260 | if (!asoc) | 4262 | if (!asoc) |
4261 | return -EINVAL; | 4263 | return -EINVAL; |
4262 | 4264 | ||
4263 | /* An association cannot be branched off from an already peeled-off | 4265 | /* An association cannot be branched off from an already peeled-off |
4264 | * socket, nor is this supported for tcp style sockets. | 4266 | * socket, nor is this supported for tcp style sockets. |
4265 | */ | 4267 | */ |
4266 | if (!sctp_style(sk, UDP)) | 4268 | if (!sctp_style(sk, UDP)) |
4267 | return -EINVAL; | 4269 | return -EINVAL; |
4268 | 4270 | ||
4269 | /* Create a new socket. */ | 4271 | /* Create a new socket. */ |
4270 | err = sock_create(sk->sk_family, SOCK_SEQPACKET, IPPROTO_SCTP, &sock); | 4272 | err = sock_create(sk->sk_family, SOCK_SEQPACKET, IPPROTO_SCTP, &sock); |
4271 | if (err < 0) | 4273 | if (err < 0) |
4272 | return err; | 4274 | return err; |
4273 | 4275 | ||
4274 | sctp_copy_sock(sock->sk, sk, asoc); | 4276 | sctp_copy_sock(sock->sk, sk, asoc); |
4275 | 4277 | ||
4276 | /* Make peeled-off sockets more like 1-1 accepted sockets. | 4278 | /* Make peeled-off sockets more like 1-1 accepted sockets. |
4277 | * Set the daddr and initialize id to something more random | 4279 | * Set the daddr and initialize id to something more random |
4278 | */ | 4280 | */ |
4279 | af = sctp_get_af_specific(asoc->peer.primary_addr.sa.sa_family); | 4281 | af = sctp_get_af_specific(asoc->peer.primary_addr.sa.sa_family); |
4280 | af->to_sk_daddr(&asoc->peer.primary_addr, sk); | 4282 | af->to_sk_daddr(&asoc->peer.primary_addr, sk); |
4281 | 4283 | ||
4282 | /* Populate the fields of the newsk from the oldsk and migrate the | 4284 | /* Populate the fields of the newsk from the oldsk and migrate the |
4283 | * asoc to the newsk. | 4285 | * asoc to the newsk. |
4284 | */ | 4286 | */ |
4285 | sctp_sock_migrate(sk, sock->sk, asoc, SCTP_SOCKET_UDP_HIGH_BANDWIDTH); | 4287 | sctp_sock_migrate(sk, sock->sk, asoc, SCTP_SOCKET_UDP_HIGH_BANDWIDTH); |
4286 | 4288 | ||
4287 | *sockp = sock; | 4289 | *sockp = sock; |
4288 | 4290 | ||
4289 | return err; | 4291 | return err; |
4290 | } | 4292 | } |
4291 | EXPORT_SYMBOL(sctp_do_peeloff); | 4293 | EXPORT_SYMBOL(sctp_do_peeloff); |
4292 | 4294 | ||
4293 | static int sctp_getsockopt_peeloff(struct sock *sk, int len, char __user *optval, int __user *optlen) | 4295 | static int sctp_getsockopt_peeloff(struct sock *sk, int len, char __user *optval, int __user *optlen) |
4294 | { | 4296 | { |
4295 | sctp_peeloff_arg_t peeloff; | 4297 | sctp_peeloff_arg_t peeloff; |
4296 | struct socket *newsock; | 4298 | struct socket *newsock; |
4297 | struct file *newfile; | 4299 | struct file *newfile; |
4298 | int retval = 0; | 4300 | int retval = 0; |
4299 | 4301 | ||
4300 | if (len < sizeof(sctp_peeloff_arg_t)) | 4302 | if (len < sizeof(sctp_peeloff_arg_t)) |
4301 | return -EINVAL; | 4303 | return -EINVAL; |
4302 | len = sizeof(sctp_peeloff_arg_t); | 4304 | len = sizeof(sctp_peeloff_arg_t); |
4303 | if (copy_from_user(&peeloff, optval, len)) | 4305 | if (copy_from_user(&peeloff, optval, len)) |
4304 | return -EFAULT; | 4306 | return -EFAULT; |
4305 | 4307 | ||
4306 | retval = sctp_do_peeloff(sk, peeloff.associd, &newsock); | 4308 | retval = sctp_do_peeloff(sk, peeloff.associd, &newsock); |
4307 | if (retval < 0) | 4309 | if (retval < 0) |
4308 | goto out; | 4310 | goto out; |
4309 | 4311 | ||
4310 | /* Map the socket to an unused fd that can be returned to the user. */ | 4312 | /* Map the socket to an unused fd that can be returned to the user. */ |
4311 | retval = get_unused_fd(); | 4313 | retval = get_unused_fd(); |
4312 | if (retval < 0) { | 4314 | if (retval < 0) { |
4313 | sock_release(newsock); | 4315 | sock_release(newsock); |
4314 | goto out; | 4316 | goto out; |
4315 | } | 4317 | } |
4316 | 4318 | ||
4317 | newfile = sock_alloc_file(newsock, 0, NULL); | 4319 | newfile = sock_alloc_file(newsock, 0, NULL); |
4318 | if (unlikely(IS_ERR(newfile))) { | 4320 | if (unlikely(IS_ERR(newfile))) { |
4319 | put_unused_fd(retval); | 4321 | put_unused_fd(retval); |
4320 | sock_release(newsock); | 4322 | sock_release(newsock); |
4321 | return PTR_ERR(newfile); | 4323 | return PTR_ERR(newfile); |
4322 | } | 4324 | } |
4323 | 4325 | ||
4324 | SCTP_DEBUG_PRINTK("%s: sk: %p newsk: %p sd: %d\n", | 4326 | SCTP_DEBUG_PRINTK("%s: sk: %p newsk: %p sd: %d\n", |
4325 | __func__, sk, newsock->sk, retval); | 4327 | __func__, sk, newsock->sk, retval); |
4326 | 4328 | ||
4327 | /* Return the fd mapped to the new socket. */ | 4329 | /* Return the fd mapped to the new socket. */ |
4328 | if (put_user(len, optlen)) { | 4330 | if (put_user(len, optlen)) { |
4329 | fput(newfile); | 4331 | fput(newfile); |
4330 | put_unused_fd(retval); | 4332 | put_unused_fd(retval); |
4331 | return -EFAULT; | 4333 | return -EFAULT; |
4332 | } | 4334 | } |
4333 | peeloff.sd = retval; | 4335 | peeloff.sd = retval; |
4334 | if (copy_to_user(optval, &peeloff, len)) { | 4336 | if (copy_to_user(optval, &peeloff, len)) { |
4335 | fput(newfile); | 4337 | fput(newfile); |
4336 | put_unused_fd(retval); | 4338 | put_unused_fd(retval); |
4337 | return -EFAULT; | 4339 | return -EFAULT; |
4338 | } | 4340 | } |
4339 | fd_install(retval, newfile); | 4341 | fd_install(retval, newfile); |
4340 | out: | 4342 | out: |
4341 | return retval; | 4343 | return retval; |
4342 | } | 4344 | } |
4343 | 4345 | ||
4344 | /* 7.1.13 Peer Address Parameters (SCTP_PEER_ADDR_PARAMS) | 4346 | /* 7.1.13 Peer Address Parameters (SCTP_PEER_ADDR_PARAMS) |
4345 | * | 4347 | * |
4346 | * Applications can enable or disable heartbeats for any peer address of | 4348 | * Applications can enable or disable heartbeats for any peer address of |
4347 | * an association, modify an address's heartbeat interval, force a | 4349 | * an association, modify an address's heartbeat interval, force a |
4348 | * heartbeat to be sent immediately, and adjust the address's maximum | 4350 | * heartbeat to be sent immediately, and adjust the address's maximum |
4349 | * number of retransmissions sent before an address is considered | 4351 | * number of retransmissions sent before an address is considered |
4350 | * unreachable. The following structure is used to access and modify an | 4352 | * unreachable. The following structure is used to access and modify an |
4351 | * address's parameters: | 4353 | * address's parameters: |
4352 | * | 4354 | * |
4353 | * struct sctp_paddrparams { | 4355 | * struct sctp_paddrparams { |
4354 | * sctp_assoc_t spp_assoc_id; | 4356 | * sctp_assoc_t spp_assoc_id; |
4355 | * struct sockaddr_storage spp_address; | 4357 | * struct sockaddr_storage spp_address; |
4356 | * uint32_t spp_hbinterval; | 4358 | * uint32_t spp_hbinterval; |
4357 | * uint16_t spp_pathmaxrxt; | 4359 | * uint16_t spp_pathmaxrxt; |
4358 | * uint32_t spp_pathmtu; | 4360 | * uint32_t spp_pathmtu; |
4359 | * uint32_t spp_sackdelay; | 4361 | * uint32_t spp_sackdelay; |
4360 | * uint32_t spp_flags; | 4362 | * uint32_t spp_flags; |
4361 | * }; | 4363 | * }; |
4362 | * | 4364 | * |
4363 | * spp_assoc_id - (one-to-many style socket) This is filled in the | 4365 | * spp_assoc_id - (one-to-many style socket) This is filled in the |
4364 | * application, and identifies the association for | 4366 | * application, and identifies the association for |
4365 | * this query. | 4367 | * this query. |
4366 | * spp_address - This specifies which address is of interest. | 4368 | * spp_address - This specifies which address is of interest. |
4367 | * spp_hbinterval - This contains the value of the heartbeat interval, | 4369 | * spp_hbinterval - This contains the value of the heartbeat interval, |
4368 | * in milliseconds. If a value of zero | 4370 | * in milliseconds. If a value of zero |
4369 | * is present in this field then no changes are to | 4371 | * is present in this field then no changes are to |
4370 | * be made to this parameter. | 4372 | * be made to this parameter. |
4371 | * spp_pathmaxrxt - This contains the maximum number of | 4373 | * spp_pathmaxrxt - This contains the maximum number of |
4372 | * retransmissions before this address shall be | 4374 | * retransmissions before this address shall be |
4373 | * considered unreachable. If a value of zero | 4375 | * considered unreachable. If a value of zero |
4374 | * is present in this field then no changes are to | 4376 | * is present in this field then no changes are to |
4375 | * be made to this parameter. | 4377 | * be made to this parameter. |
4376 | * spp_pathmtu - When Path MTU discovery is disabled the value | 4378 | * spp_pathmtu - When Path MTU discovery is disabled the value |
4377 | * specified here will be the "fixed" path mtu. | 4379 | * specified here will be the "fixed" path mtu. |
4378 | * Note that if the spp_address field is empty | 4380 | * Note that if the spp_address field is empty |
4379 | * then all associations on this address will | 4381 | * then all associations on this address will |
4380 | * have this fixed path mtu set upon them. | 4382 | * have this fixed path mtu set upon them. |
4381 | * | 4383 | * |
4382 | * spp_sackdelay - When delayed sack is enabled, this value specifies | 4384 | * spp_sackdelay - When delayed sack is enabled, this value specifies |
4383 | * the number of milliseconds that sacks will be delayed | 4385 | * the number of milliseconds that sacks will be delayed |
4384 | * for. This value will apply to all addresses of an | 4386 | * for. This value will apply to all addresses of an |
4385 | * association if the spp_address field is empty. Note | 4387 | * association if the spp_address field is empty. Note |
4386 | * also, that if delayed sack is enabled and this | 4388 | * also, that if delayed sack is enabled and this |
4387 | * value is set to 0, no change is made to the last | 4389 | * value is set to 0, no change is made to the last |
4388 | * recorded delayed sack timer value. | 4390 | * recorded delayed sack timer value. |
4389 | * | 4391 | * |
4390 | * spp_flags - These flags are used to control various features | 4392 | * spp_flags - These flags are used to control various features |
4391 | * on an association. The flag field may contain | 4393 | * on an association. The flag field may contain |
4392 | * zero or more of the following options. | 4394 | * zero or more of the following options. |
4393 | * | 4395 | * |
4394 | * SPP_HB_ENABLE - Enable heartbeats on the | 4396 | * SPP_HB_ENABLE - Enable heartbeats on the |
4395 | * specified address. Note that if the address | 4397 | * specified address. Note that if the address |
4396 | * field is empty all addresses for the association | 4398 | * field is empty all addresses for the association |
4397 | * have heartbeats enabled upon them. | 4399 | * have heartbeats enabled upon them. |
4398 | * | 4400 | * |
4399 | * SPP_HB_DISABLE - Disable heartbeats on the | 4401 | * SPP_HB_DISABLE - Disable heartbeats on the |
4400 | * speicifed address. Note that if the address | 4402 | * speicifed address. Note that if the address |
4401 | * field is empty all addresses for the association | 4403 | * field is empty all addresses for the association |
4402 | * will have their heartbeats disabled. Note also | 4404 | * will have their heartbeats disabled. Note also |
4403 | * that SPP_HB_ENABLE and SPP_HB_DISABLE are | 4405 | * that SPP_HB_ENABLE and SPP_HB_DISABLE are |
4404 | * mutually exclusive, only one of these two should | 4406 | * mutually exclusive, only one of these two should |
4405 | * be specified. Enabling both fields will have | 4407 | * be specified. Enabling both fields will have |
4406 | * undetermined results. | 4408 | * undetermined results. |
4407 | * | 4409 | * |
4408 | * SPP_HB_DEMAND - Request a user initiated heartbeat | 4410 | * SPP_HB_DEMAND - Request a user initiated heartbeat |
4409 | * to be made immediately. | 4411 | * to be made immediately. |
4410 | * | 4412 | * |
4411 | * SPP_PMTUD_ENABLE - This field will enable PMTU | 4413 | * SPP_PMTUD_ENABLE - This field will enable PMTU |
4412 | * discovery upon the specified address. Note that | 4414 | * discovery upon the specified address. Note that |
4413 | * if the address feild is empty then all addresses | 4415 | * if the address feild is empty then all addresses |
4414 | * on the association are effected. | 4416 | * on the association are effected. |
4415 | * | 4417 | * |
4416 | * SPP_PMTUD_DISABLE - This field will disable PMTU | 4418 | * SPP_PMTUD_DISABLE - This field will disable PMTU |
4417 | * discovery upon the specified address. Note that | 4419 | * discovery upon the specified address. Note that |
4418 | * if the address feild is empty then all addresses | 4420 | * if the address feild is empty then all addresses |
4419 | * on the association are effected. Not also that | 4421 | * on the association are effected. Not also that |
4420 | * SPP_PMTUD_ENABLE and SPP_PMTUD_DISABLE are mutually | 4422 | * SPP_PMTUD_ENABLE and SPP_PMTUD_DISABLE are mutually |
4421 | * exclusive. Enabling both will have undetermined | 4423 | * exclusive. Enabling both will have undetermined |
4422 | * results. | 4424 | * results. |
4423 | * | 4425 | * |
4424 | * SPP_SACKDELAY_ENABLE - Setting this flag turns | 4426 | * SPP_SACKDELAY_ENABLE - Setting this flag turns |
4425 | * on delayed sack. The time specified in spp_sackdelay | 4427 | * on delayed sack. The time specified in spp_sackdelay |
4426 | * is used to specify the sack delay for this address. Note | 4428 | * is used to specify the sack delay for this address. Note |
4427 | * that if spp_address is empty then all addresses will | 4429 | * that if spp_address is empty then all addresses will |
4428 | * enable delayed sack and take on the sack delay | 4430 | * enable delayed sack and take on the sack delay |
4429 | * value specified in spp_sackdelay. | 4431 | * value specified in spp_sackdelay. |
4430 | * SPP_SACKDELAY_DISABLE - Setting this flag turns | 4432 | * SPP_SACKDELAY_DISABLE - Setting this flag turns |
4431 | * off delayed sack. If the spp_address field is blank then | 4433 | * off delayed sack. If the spp_address field is blank then |
4432 | * delayed sack is disabled for the entire association. Note | 4434 | * delayed sack is disabled for the entire association. Note |
4433 | * also that this field is mutually exclusive to | 4435 | * also that this field is mutually exclusive to |
4434 | * SPP_SACKDELAY_ENABLE, setting both will have undefined | 4436 | * SPP_SACKDELAY_ENABLE, setting both will have undefined |
4435 | * results. | 4437 | * results. |
4436 | */ | 4438 | */ |
4437 | static int sctp_getsockopt_peer_addr_params(struct sock *sk, int len, | 4439 | static int sctp_getsockopt_peer_addr_params(struct sock *sk, int len, |
4438 | char __user *optval, int __user *optlen) | 4440 | char __user *optval, int __user *optlen) |
4439 | { | 4441 | { |
4440 | struct sctp_paddrparams params; | 4442 | struct sctp_paddrparams params; |
4441 | struct sctp_transport *trans = NULL; | 4443 | struct sctp_transport *trans = NULL; |
4442 | struct sctp_association *asoc = NULL; | 4444 | struct sctp_association *asoc = NULL; |
4443 | struct sctp_sock *sp = sctp_sk(sk); | 4445 | struct sctp_sock *sp = sctp_sk(sk); |
4444 | 4446 | ||
4445 | if (len < sizeof(struct sctp_paddrparams)) | 4447 | if (len < sizeof(struct sctp_paddrparams)) |
4446 | return -EINVAL; | 4448 | return -EINVAL; |
4447 | len = sizeof(struct sctp_paddrparams); | 4449 | len = sizeof(struct sctp_paddrparams); |
4448 | if (copy_from_user(¶ms, optval, len)) | 4450 | if (copy_from_user(¶ms, optval, len)) |
4449 | return -EFAULT; | 4451 | return -EFAULT; |
4450 | 4452 | ||
4451 | /* If an address other than INADDR_ANY is specified, and | 4453 | /* If an address other than INADDR_ANY is specified, and |
4452 | * no transport is found, then the request is invalid. | 4454 | * no transport is found, then the request is invalid. |
4453 | */ | 4455 | */ |
4454 | if (!sctp_is_any(sk, ( union sctp_addr *)¶ms.spp_address)) { | 4456 | if (!sctp_is_any(sk, ( union sctp_addr *)¶ms.spp_address)) { |
4455 | trans = sctp_addr_id2transport(sk, ¶ms.spp_address, | 4457 | trans = sctp_addr_id2transport(sk, ¶ms.spp_address, |
4456 | params.spp_assoc_id); | 4458 | params.spp_assoc_id); |
4457 | if (!trans) { | 4459 | if (!trans) { |
4458 | SCTP_DEBUG_PRINTK("Failed no transport\n"); | 4460 | SCTP_DEBUG_PRINTK("Failed no transport\n"); |
4459 | return -EINVAL; | 4461 | return -EINVAL; |
4460 | } | 4462 | } |
4461 | } | 4463 | } |
4462 | 4464 | ||
4463 | /* Get association, if assoc_id != 0 and the socket is a one | 4465 | /* Get association, if assoc_id != 0 and the socket is a one |
4464 | * to many style socket, and an association was not found, then | 4466 | * to many style socket, and an association was not found, then |
4465 | * the id was invalid. | 4467 | * the id was invalid. |
4466 | */ | 4468 | */ |
4467 | asoc = sctp_id2assoc(sk, params.spp_assoc_id); | 4469 | asoc = sctp_id2assoc(sk, params.spp_assoc_id); |
4468 | if (!asoc && params.spp_assoc_id && sctp_style(sk, UDP)) { | 4470 | if (!asoc && params.spp_assoc_id && sctp_style(sk, UDP)) { |
4469 | SCTP_DEBUG_PRINTK("Failed no association\n"); | 4471 | SCTP_DEBUG_PRINTK("Failed no association\n"); |
4470 | return -EINVAL; | 4472 | return -EINVAL; |
4471 | } | 4473 | } |
4472 | 4474 | ||
4473 | if (trans) { | 4475 | if (trans) { |
4474 | /* Fetch transport values. */ | 4476 | /* Fetch transport values. */ |
4475 | params.spp_hbinterval = jiffies_to_msecs(trans->hbinterval); | 4477 | params.spp_hbinterval = jiffies_to_msecs(trans->hbinterval); |
4476 | params.spp_pathmtu = trans->pathmtu; | 4478 | params.spp_pathmtu = trans->pathmtu; |
4477 | params.spp_pathmaxrxt = trans->pathmaxrxt; | 4479 | params.spp_pathmaxrxt = trans->pathmaxrxt; |
4478 | params.spp_sackdelay = jiffies_to_msecs(trans->sackdelay); | 4480 | params.spp_sackdelay = jiffies_to_msecs(trans->sackdelay); |
4479 | 4481 | ||
4480 | /*draft-11 doesn't say what to return in spp_flags*/ | 4482 | /*draft-11 doesn't say what to return in spp_flags*/ |
4481 | params.spp_flags = trans->param_flags; | 4483 | params.spp_flags = trans->param_flags; |
4482 | } else if (asoc) { | 4484 | } else if (asoc) { |
4483 | /* Fetch association values. */ | 4485 | /* Fetch association values. */ |
4484 | params.spp_hbinterval = jiffies_to_msecs(asoc->hbinterval); | 4486 | params.spp_hbinterval = jiffies_to_msecs(asoc->hbinterval); |
4485 | params.spp_pathmtu = asoc->pathmtu; | 4487 | params.spp_pathmtu = asoc->pathmtu; |
4486 | params.spp_pathmaxrxt = asoc->pathmaxrxt; | 4488 | params.spp_pathmaxrxt = asoc->pathmaxrxt; |
4487 | params.spp_sackdelay = jiffies_to_msecs(asoc->sackdelay); | 4489 | params.spp_sackdelay = jiffies_to_msecs(asoc->sackdelay); |
4488 | 4490 | ||
4489 | /*draft-11 doesn't say what to return in spp_flags*/ | 4491 | /*draft-11 doesn't say what to return in spp_flags*/ |
4490 | params.spp_flags = asoc->param_flags; | 4492 | params.spp_flags = asoc->param_flags; |
4491 | } else { | 4493 | } else { |
4492 | /* Fetch socket values. */ | 4494 | /* Fetch socket values. */ |
4493 | params.spp_hbinterval = sp->hbinterval; | 4495 | params.spp_hbinterval = sp->hbinterval; |
4494 | params.spp_pathmtu = sp->pathmtu; | 4496 | params.spp_pathmtu = sp->pathmtu; |
4495 | params.spp_sackdelay = sp->sackdelay; | 4497 | params.spp_sackdelay = sp->sackdelay; |
4496 | params.spp_pathmaxrxt = sp->pathmaxrxt; | 4498 | params.spp_pathmaxrxt = sp->pathmaxrxt; |
4497 | 4499 | ||
4498 | /*draft-11 doesn't say what to return in spp_flags*/ | 4500 | /*draft-11 doesn't say what to return in spp_flags*/ |
4499 | params.spp_flags = sp->param_flags; | 4501 | params.spp_flags = sp->param_flags; |
4500 | } | 4502 | } |
4501 | 4503 | ||
4502 | if (copy_to_user(optval, ¶ms, len)) | 4504 | if (copy_to_user(optval, ¶ms, len)) |
4503 | return -EFAULT; | 4505 | return -EFAULT; |
4504 | 4506 | ||
4505 | if (put_user(len, optlen)) | 4507 | if (put_user(len, optlen)) |
4506 | return -EFAULT; | 4508 | return -EFAULT; |
4507 | 4509 | ||
4508 | return 0; | 4510 | return 0; |
4509 | } | 4511 | } |
4510 | 4512 | ||
4511 | /* | 4513 | /* |
4512 | * 7.1.23. Get or set delayed ack timer (SCTP_DELAYED_SACK) | 4514 | * 7.1.23. Get or set delayed ack timer (SCTP_DELAYED_SACK) |
4513 | * | 4515 | * |
4514 | * This option will effect the way delayed acks are performed. This | 4516 | * This option will effect the way delayed acks are performed. This |
4515 | * option allows you to get or set the delayed ack time, in | 4517 | * option allows you to get or set the delayed ack time, in |
4516 | * milliseconds. It also allows changing the delayed ack frequency. | 4518 | * milliseconds. It also allows changing the delayed ack frequency. |
4517 | * Changing the frequency to 1 disables the delayed sack algorithm. If | 4519 | * Changing the frequency to 1 disables the delayed sack algorithm. If |
4518 | * the assoc_id is 0, then this sets or gets the endpoints default | 4520 | * the assoc_id is 0, then this sets or gets the endpoints default |
4519 | * values. If the assoc_id field is non-zero, then the set or get | 4521 | * values. If the assoc_id field is non-zero, then the set or get |
4520 | * effects the specified association for the one to many model (the | 4522 | * effects the specified association for the one to many model (the |
4521 | * assoc_id field is ignored by the one to one model). Note that if | 4523 | * assoc_id field is ignored by the one to one model). Note that if |
4522 | * sack_delay or sack_freq are 0 when setting this option, then the | 4524 | * sack_delay or sack_freq are 0 when setting this option, then the |
4523 | * current values will remain unchanged. | 4525 | * current values will remain unchanged. |
4524 | * | 4526 | * |
4525 | * struct sctp_sack_info { | 4527 | * struct sctp_sack_info { |
4526 | * sctp_assoc_t sack_assoc_id; | 4528 | * sctp_assoc_t sack_assoc_id; |
4527 | * uint32_t sack_delay; | 4529 | * uint32_t sack_delay; |
4528 | * uint32_t sack_freq; | 4530 | * uint32_t sack_freq; |
4529 | * }; | 4531 | * }; |
4530 | * | 4532 | * |
4531 | * sack_assoc_id - This parameter, indicates which association the user | 4533 | * sack_assoc_id - This parameter, indicates which association the user |
4532 | * is performing an action upon. Note that if this field's value is | 4534 | * is performing an action upon. Note that if this field's value is |
4533 | * zero then the endpoints default value is changed (effecting future | 4535 | * zero then the endpoints default value is changed (effecting future |
4534 | * associations only). | 4536 | * associations only). |
4535 | * | 4537 | * |
4536 | * sack_delay - This parameter contains the number of milliseconds that | 4538 | * sack_delay - This parameter contains the number of milliseconds that |
4537 | * the user is requesting the delayed ACK timer be set to. Note that | 4539 | * the user is requesting the delayed ACK timer be set to. Note that |
4538 | * this value is defined in the standard to be between 200 and 500 | 4540 | * this value is defined in the standard to be between 200 and 500 |
4539 | * milliseconds. | 4541 | * milliseconds. |
4540 | * | 4542 | * |
4541 | * sack_freq - This parameter contains the number of packets that must | 4543 | * sack_freq - This parameter contains the number of packets that must |
4542 | * be received before a sack is sent without waiting for the delay | 4544 | * be received before a sack is sent without waiting for the delay |
4543 | * timer to expire. The default value for this is 2, setting this | 4545 | * timer to expire. The default value for this is 2, setting this |
4544 | * value to 1 will disable the delayed sack algorithm. | 4546 | * value to 1 will disable the delayed sack algorithm. |
4545 | */ | 4547 | */ |
4546 | static int sctp_getsockopt_delayed_ack(struct sock *sk, int len, | 4548 | static int sctp_getsockopt_delayed_ack(struct sock *sk, int len, |
4547 | char __user *optval, | 4549 | char __user *optval, |
4548 | int __user *optlen) | 4550 | int __user *optlen) |
4549 | { | 4551 | { |
4550 | struct sctp_sack_info params; | 4552 | struct sctp_sack_info params; |
4551 | struct sctp_association *asoc = NULL; | 4553 | struct sctp_association *asoc = NULL; |
4552 | struct sctp_sock *sp = sctp_sk(sk); | 4554 | struct sctp_sock *sp = sctp_sk(sk); |
4553 | 4555 | ||
4554 | if (len >= sizeof(struct sctp_sack_info)) { | 4556 | if (len >= sizeof(struct sctp_sack_info)) { |
4555 | len = sizeof(struct sctp_sack_info); | 4557 | len = sizeof(struct sctp_sack_info); |
4556 | 4558 | ||
4557 | if (copy_from_user(¶ms, optval, len)) | 4559 | if (copy_from_user(¶ms, optval, len)) |
4558 | return -EFAULT; | 4560 | return -EFAULT; |
4559 | } else if (len == sizeof(struct sctp_assoc_value)) { | 4561 | } else if (len == sizeof(struct sctp_assoc_value)) { |
4560 | pr_warn("Use of struct sctp_assoc_value in delayed_ack socket option deprecated\n"); | 4562 | pr_warn("Use of struct sctp_assoc_value in delayed_ack socket option deprecated\n"); |
4561 | pr_warn("Use struct sctp_sack_info instead\n"); | 4563 | pr_warn("Use struct sctp_sack_info instead\n"); |
4562 | if (copy_from_user(¶ms, optval, len)) | 4564 | if (copy_from_user(¶ms, optval, len)) |
4563 | return -EFAULT; | 4565 | return -EFAULT; |
4564 | } else | 4566 | } else |
4565 | return - EINVAL; | 4567 | return - EINVAL; |
4566 | 4568 | ||
4567 | /* Get association, if sack_assoc_id != 0 and the socket is a one | 4569 | /* Get association, if sack_assoc_id != 0 and the socket is a one |
4568 | * to many style socket, and an association was not found, then | 4570 | * to many style socket, and an association was not found, then |
4569 | * the id was invalid. | 4571 | * the id was invalid. |
4570 | */ | 4572 | */ |
4571 | asoc = sctp_id2assoc(sk, params.sack_assoc_id); | 4573 | asoc = sctp_id2assoc(sk, params.sack_assoc_id); |
4572 | if (!asoc && params.sack_assoc_id && sctp_style(sk, UDP)) | 4574 | if (!asoc && params.sack_assoc_id && sctp_style(sk, UDP)) |
4573 | return -EINVAL; | 4575 | return -EINVAL; |
4574 | 4576 | ||
4575 | if (asoc) { | 4577 | if (asoc) { |
4576 | /* Fetch association values. */ | 4578 | /* Fetch association values. */ |
4577 | if (asoc->param_flags & SPP_SACKDELAY_ENABLE) { | 4579 | if (asoc->param_flags & SPP_SACKDELAY_ENABLE) { |
4578 | params.sack_delay = jiffies_to_msecs( | 4580 | params.sack_delay = jiffies_to_msecs( |
4579 | asoc->sackdelay); | 4581 | asoc->sackdelay); |
4580 | params.sack_freq = asoc->sackfreq; | 4582 | params.sack_freq = asoc->sackfreq; |
4581 | 4583 | ||
4582 | } else { | 4584 | } else { |
4583 | params.sack_delay = 0; | 4585 | params.sack_delay = 0; |
4584 | params.sack_freq = 1; | 4586 | params.sack_freq = 1; |
4585 | } | 4587 | } |
4586 | } else { | 4588 | } else { |
4587 | /* Fetch socket values. */ | 4589 | /* Fetch socket values. */ |
4588 | if (sp->param_flags & SPP_SACKDELAY_ENABLE) { | 4590 | if (sp->param_flags & SPP_SACKDELAY_ENABLE) { |
4589 | params.sack_delay = sp->sackdelay; | 4591 | params.sack_delay = sp->sackdelay; |
4590 | params.sack_freq = sp->sackfreq; | 4592 | params.sack_freq = sp->sackfreq; |
4591 | } else { | 4593 | } else { |
4592 | params.sack_delay = 0; | 4594 | params.sack_delay = 0; |
4593 | params.sack_freq = 1; | 4595 | params.sack_freq = 1; |
4594 | } | 4596 | } |
4595 | } | 4597 | } |
4596 | 4598 | ||
4597 | if (copy_to_user(optval, ¶ms, len)) | 4599 | if (copy_to_user(optval, ¶ms, len)) |
4598 | return -EFAULT; | 4600 | return -EFAULT; |
4599 | 4601 | ||
4600 | if (put_user(len, optlen)) | 4602 | if (put_user(len, optlen)) |
4601 | return -EFAULT; | 4603 | return -EFAULT; |
4602 | 4604 | ||
4603 | return 0; | 4605 | return 0; |
4604 | } | 4606 | } |
4605 | 4607 | ||
4606 | /* 7.1.3 Initialization Parameters (SCTP_INITMSG) | 4608 | /* 7.1.3 Initialization Parameters (SCTP_INITMSG) |
4607 | * | 4609 | * |
4608 | * Applications can specify protocol parameters for the default association | 4610 | * Applications can specify protocol parameters for the default association |
4609 | * initialization. The option name argument to setsockopt() and getsockopt() | 4611 | * initialization. The option name argument to setsockopt() and getsockopt() |
4610 | * is SCTP_INITMSG. | 4612 | * is SCTP_INITMSG. |
4611 | * | 4613 | * |
4612 | * Setting initialization parameters is effective only on an unconnected | 4614 | * Setting initialization parameters is effective only on an unconnected |
4613 | * socket (for UDP-style sockets only future associations are effected | 4615 | * socket (for UDP-style sockets only future associations are effected |
4614 | * by the change). With TCP-style sockets, this option is inherited by | 4616 | * by the change). With TCP-style sockets, this option is inherited by |
4615 | * sockets derived from a listener socket. | 4617 | * sockets derived from a listener socket. |
4616 | */ | 4618 | */ |
4617 | static int sctp_getsockopt_initmsg(struct sock *sk, int len, char __user *optval, int __user *optlen) | 4619 | static int sctp_getsockopt_initmsg(struct sock *sk, int len, char __user *optval, int __user *optlen) |
4618 | { | 4620 | { |
4619 | if (len < sizeof(struct sctp_initmsg)) | 4621 | if (len < sizeof(struct sctp_initmsg)) |
4620 | return -EINVAL; | 4622 | return -EINVAL; |
4621 | len = sizeof(struct sctp_initmsg); | 4623 | len = sizeof(struct sctp_initmsg); |
4622 | if (put_user(len, optlen)) | 4624 | if (put_user(len, optlen)) |
4623 | return -EFAULT; | 4625 | return -EFAULT; |
4624 | if (copy_to_user(optval, &sctp_sk(sk)->initmsg, len)) | 4626 | if (copy_to_user(optval, &sctp_sk(sk)->initmsg, len)) |
4625 | return -EFAULT; | 4627 | return -EFAULT; |
4626 | return 0; | 4628 | return 0; |
4627 | } | 4629 | } |
4628 | 4630 | ||
4629 | 4631 | ||
4630 | static int sctp_getsockopt_peer_addrs(struct sock *sk, int len, | 4632 | static int sctp_getsockopt_peer_addrs(struct sock *sk, int len, |
4631 | char __user *optval, int __user *optlen) | 4633 | char __user *optval, int __user *optlen) |
4632 | { | 4634 | { |
4633 | struct sctp_association *asoc; | 4635 | struct sctp_association *asoc; |
4634 | int cnt = 0; | 4636 | int cnt = 0; |
4635 | struct sctp_getaddrs getaddrs; | 4637 | struct sctp_getaddrs getaddrs; |
4636 | struct sctp_transport *from; | 4638 | struct sctp_transport *from; |
4637 | void __user *to; | 4639 | void __user *to; |
4638 | union sctp_addr temp; | 4640 | union sctp_addr temp; |
4639 | struct sctp_sock *sp = sctp_sk(sk); | 4641 | struct sctp_sock *sp = sctp_sk(sk); |
4640 | int addrlen; | 4642 | int addrlen; |
4641 | size_t space_left; | 4643 | size_t space_left; |
4642 | int bytes_copied; | 4644 | int bytes_copied; |
4643 | 4645 | ||
4644 | if (len < sizeof(struct sctp_getaddrs)) | 4646 | if (len < sizeof(struct sctp_getaddrs)) |
4645 | return -EINVAL; | 4647 | return -EINVAL; |
4646 | 4648 | ||
4647 | if (copy_from_user(&getaddrs, optval, sizeof(struct sctp_getaddrs))) | 4649 | if (copy_from_user(&getaddrs, optval, sizeof(struct sctp_getaddrs))) |
4648 | return -EFAULT; | 4650 | return -EFAULT; |
4649 | 4651 | ||
4650 | /* For UDP-style sockets, id specifies the association to query. */ | 4652 | /* For UDP-style sockets, id specifies the association to query. */ |
4651 | asoc = sctp_id2assoc(sk, getaddrs.assoc_id); | 4653 | asoc = sctp_id2assoc(sk, getaddrs.assoc_id); |
4652 | if (!asoc) | 4654 | if (!asoc) |
4653 | return -EINVAL; | 4655 | return -EINVAL; |
4654 | 4656 | ||
4655 | to = optval + offsetof(struct sctp_getaddrs,addrs); | 4657 | to = optval + offsetof(struct sctp_getaddrs,addrs); |
4656 | space_left = len - offsetof(struct sctp_getaddrs,addrs); | 4658 | space_left = len - offsetof(struct sctp_getaddrs,addrs); |
4657 | 4659 | ||
4658 | list_for_each_entry(from, &asoc->peer.transport_addr_list, | 4660 | list_for_each_entry(from, &asoc->peer.transport_addr_list, |
4659 | transports) { | 4661 | transports) { |
4660 | memcpy(&temp, &from->ipaddr, sizeof(temp)); | 4662 | memcpy(&temp, &from->ipaddr, sizeof(temp)); |
4661 | sctp_get_pf_specific(sk->sk_family)->addr_v4map(sp, &temp); | 4663 | sctp_get_pf_specific(sk->sk_family)->addr_v4map(sp, &temp); |
4662 | addrlen = sctp_get_af_specific(temp.sa.sa_family)->sockaddr_len; | 4664 | addrlen = sctp_get_af_specific(temp.sa.sa_family)->sockaddr_len; |
4663 | if (space_left < addrlen) | 4665 | if (space_left < addrlen) |
4664 | return -ENOMEM; | 4666 | return -ENOMEM; |
4665 | if (copy_to_user(to, &temp, addrlen)) | 4667 | if (copy_to_user(to, &temp, addrlen)) |
4666 | return -EFAULT; | 4668 | return -EFAULT; |
4667 | to += addrlen; | 4669 | to += addrlen; |
4668 | cnt++; | 4670 | cnt++; |
4669 | space_left -= addrlen; | 4671 | space_left -= addrlen; |
4670 | } | 4672 | } |
4671 | 4673 | ||
4672 | if (put_user(cnt, &((struct sctp_getaddrs __user *)optval)->addr_num)) | 4674 | if (put_user(cnt, &((struct sctp_getaddrs __user *)optval)->addr_num)) |
4673 | return -EFAULT; | 4675 | return -EFAULT; |
4674 | bytes_copied = ((char __user *)to) - optval; | 4676 | bytes_copied = ((char __user *)to) - optval; |
4675 | if (put_user(bytes_copied, optlen)) | 4677 | if (put_user(bytes_copied, optlen)) |
4676 | return -EFAULT; | 4678 | return -EFAULT; |
4677 | 4679 | ||
4678 | return 0; | 4680 | return 0; |
4679 | } | 4681 | } |
4680 | 4682 | ||
4681 | static int sctp_copy_laddrs(struct sock *sk, __u16 port, void *to, | 4683 | static int sctp_copy_laddrs(struct sock *sk, __u16 port, void *to, |
4682 | size_t space_left, int *bytes_copied) | 4684 | size_t space_left, int *bytes_copied) |
4683 | { | 4685 | { |
4684 | struct sctp_sockaddr_entry *addr; | 4686 | struct sctp_sockaddr_entry *addr; |
4685 | union sctp_addr temp; | 4687 | union sctp_addr temp; |
4686 | int cnt = 0; | 4688 | int cnt = 0; |
4687 | int addrlen; | 4689 | int addrlen; |
4688 | struct net *net = sock_net(sk); | 4690 | struct net *net = sock_net(sk); |
4689 | 4691 | ||
4690 | rcu_read_lock(); | 4692 | rcu_read_lock(); |
4691 | list_for_each_entry_rcu(addr, &net->sctp.local_addr_list, list) { | 4693 | list_for_each_entry_rcu(addr, &net->sctp.local_addr_list, list) { |
4692 | if (!addr->valid) | 4694 | if (!addr->valid) |
4693 | continue; | 4695 | continue; |
4694 | 4696 | ||
4695 | if ((PF_INET == sk->sk_family) && | 4697 | if ((PF_INET == sk->sk_family) && |
4696 | (AF_INET6 == addr->a.sa.sa_family)) | 4698 | (AF_INET6 == addr->a.sa.sa_family)) |
4697 | continue; | 4699 | continue; |
4698 | if ((PF_INET6 == sk->sk_family) && | 4700 | if ((PF_INET6 == sk->sk_family) && |
4699 | inet_v6_ipv6only(sk) && | 4701 | inet_v6_ipv6only(sk) && |
4700 | (AF_INET == addr->a.sa.sa_family)) | 4702 | (AF_INET == addr->a.sa.sa_family)) |
4701 | continue; | 4703 | continue; |
4702 | memcpy(&temp, &addr->a, sizeof(temp)); | 4704 | memcpy(&temp, &addr->a, sizeof(temp)); |
4703 | if (!temp.v4.sin_port) | 4705 | if (!temp.v4.sin_port) |
4704 | temp.v4.sin_port = htons(port); | 4706 | temp.v4.sin_port = htons(port); |
4705 | 4707 | ||
4706 | sctp_get_pf_specific(sk->sk_family)->addr_v4map(sctp_sk(sk), | 4708 | sctp_get_pf_specific(sk->sk_family)->addr_v4map(sctp_sk(sk), |
4707 | &temp); | 4709 | &temp); |
4708 | addrlen = sctp_get_af_specific(temp.sa.sa_family)->sockaddr_len; | 4710 | addrlen = sctp_get_af_specific(temp.sa.sa_family)->sockaddr_len; |
4709 | if (space_left < addrlen) { | 4711 | if (space_left < addrlen) { |
4710 | cnt = -ENOMEM; | 4712 | cnt = -ENOMEM; |
4711 | break; | 4713 | break; |
4712 | } | 4714 | } |
4713 | memcpy(to, &temp, addrlen); | 4715 | memcpy(to, &temp, addrlen); |
4714 | 4716 | ||
4715 | to += addrlen; | 4717 | to += addrlen; |
4716 | cnt ++; | 4718 | cnt ++; |
4717 | space_left -= addrlen; | 4719 | space_left -= addrlen; |
4718 | *bytes_copied += addrlen; | 4720 | *bytes_copied += addrlen; |
4719 | } | 4721 | } |
4720 | rcu_read_unlock(); | 4722 | rcu_read_unlock(); |
4721 | 4723 | ||
4722 | return cnt; | 4724 | return cnt; |
4723 | } | 4725 | } |
4724 | 4726 | ||
4725 | 4727 | ||
4726 | static int sctp_getsockopt_local_addrs(struct sock *sk, int len, | 4728 | static int sctp_getsockopt_local_addrs(struct sock *sk, int len, |
4727 | char __user *optval, int __user *optlen) | 4729 | char __user *optval, int __user *optlen) |
4728 | { | 4730 | { |
4729 | struct sctp_bind_addr *bp; | 4731 | struct sctp_bind_addr *bp; |
4730 | struct sctp_association *asoc; | 4732 | struct sctp_association *asoc; |
4731 | int cnt = 0; | 4733 | int cnt = 0; |
4732 | struct sctp_getaddrs getaddrs; | 4734 | struct sctp_getaddrs getaddrs; |
4733 | struct sctp_sockaddr_entry *addr; | 4735 | struct sctp_sockaddr_entry *addr; |
4734 | void __user *to; | 4736 | void __user *to; |
4735 | union sctp_addr temp; | 4737 | union sctp_addr temp; |
4736 | struct sctp_sock *sp = sctp_sk(sk); | 4738 | struct sctp_sock *sp = sctp_sk(sk); |
4737 | int addrlen; | 4739 | int addrlen; |
4738 | int err = 0; | 4740 | int err = 0; |
4739 | size_t space_left; | 4741 | size_t space_left; |
4740 | int bytes_copied = 0; | 4742 | int bytes_copied = 0; |
4741 | void *addrs; | 4743 | void *addrs; |
4742 | void *buf; | 4744 | void *buf; |
4743 | 4745 | ||
4744 | if (len < sizeof(struct sctp_getaddrs)) | 4746 | if (len < sizeof(struct sctp_getaddrs)) |
4745 | return -EINVAL; | 4747 | return -EINVAL; |
4746 | 4748 | ||
4747 | if (copy_from_user(&getaddrs, optval, sizeof(struct sctp_getaddrs))) | 4749 | if (copy_from_user(&getaddrs, optval, sizeof(struct sctp_getaddrs))) |
4748 | return -EFAULT; | 4750 | return -EFAULT; |
4749 | 4751 | ||
4750 | /* | 4752 | /* |
4751 | * For UDP-style sockets, id specifies the association to query. | 4753 | * For UDP-style sockets, id specifies the association to query. |
4752 | * If the id field is set to the value '0' then the locally bound | 4754 | * If the id field is set to the value '0' then the locally bound |
4753 | * addresses are returned without regard to any particular | 4755 | * addresses are returned without regard to any particular |
4754 | * association. | 4756 | * association. |
4755 | */ | 4757 | */ |
4756 | if (0 == getaddrs.assoc_id) { | 4758 | if (0 == getaddrs.assoc_id) { |
4757 | bp = &sctp_sk(sk)->ep->base.bind_addr; | 4759 | bp = &sctp_sk(sk)->ep->base.bind_addr; |
4758 | } else { | 4760 | } else { |
4759 | asoc = sctp_id2assoc(sk, getaddrs.assoc_id); | 4761 | asoc = sctp_id2assoc(sk, getaddrs.assoc_id); |
4760 | if (!asoc) | 4762 | if (!asoc) |
4761 | return -EINVAL; | 4763 | return -EINVAL; |
4762 | bp = &asoc->base.bind_addr; | 4764 | bp = &asoc->base.bind_addr; |
4763 | } | 4765 | } |
4764 | 4766 | ||
4765 | to = optval + offsetof(struct sctp_getaddrs,addrs); | 4767 | to = optval + offsetof(struct sctp_getaddrs,addrs); |
4766 | space_left = len - offsetof(struct sctp_getaddrs,addrs); | 4768 | space_left = len - offsetof(struct sctp_getaddrs,addrs); |
4767 | 4769 | ||
4768 | addrs = kmalloc(space_left, GFP_KERNEL); | 4770 | addrs = kmalloc(space_left, GFP_KERNEL); |
4769 | if (!addrs) | 4771 | if (!addrs) |
4770 | return -ENOMEM; | 4772 | return -ENOMEM; |
4771 | 4773 | ||
4772 | /* If the endpoint is bound to 0.0.0.0 or ::0, get the valid | 4774 | /* If the endpoint is bound to 0.0.0.0 or ::0, get the valid |
4773 | * addresses from the global local address list. | 4775 | * addresses from the global local address list. |
4774 | */ | 4776 | */ |
4775 | if (sctp_list_single_entry(&bp->address_list)) { | 4777 | if (sctp_list_single_entry(&bp->address_list)) { |
4776 | addr = list_entry(bp->address_list.next, | 4778 | addr = list_entry(bp->address_list.next, |
4777 | struct sctp_sockaddr_entry, list); | 4779 | struct sctp_sockaddr_entry, list); |
4778 | if (sctp_is_any(sk, &addr->a)) { | 4780 | if (sctp_is_any(sk, &addr->a)) { |
4779 | cnt = sctp_copy_laddrs(sk, bp->port, addrs, | 4781 | cnt = sctp_copy_laddrs(sk, bp->port, addrs, |
4780 | space_left, &bytes_copied); | 4782 | space_left, &bytes_copied); |
4781 | if (cnt < 0) { | 4783 | if (cnt < 0) { |
4782 | err = cnt; | 4784 | err = cnt; |
4783 | goto out; | 4785 | goto out; |
4784 | } | 4786 | } |
4785 | goto copy_getaddrs; | 4787 | goto copy_getaddrs; |
4786 | } | 4788 | } |
4787 | } | 4789 | } |
4788 | 4790 | ||
4789 | buf = addrs; | 4791 | buf = addrs; |
4790 | /* Protection on the bound address list is not needed since | 4792 | /* Protection on the bound address list is not needed since |
4791 | * in the socket option context we hold a socket lock and | 4793 | * in the socket option context we hold a socket lock and |
4792 | * thus the bound address list can't change. | 4794 | * thus the bound address list can't change. |
4793 | */ | 4795 | */ |
4794 | list_for_each_entry(addr, &bp->address_list, list) { | 4796 | list_for_each_entry(addr, &bp->address_list, list) { |
4795 | memcpy(&temp, &addr->a, sizeof(temp)); | 4797 | memcpy(&temp, &addr->a, sizeof(temp)); |
4796 | sctp_get_pf_specific(sk->sk_family)->addr_v4map(sp, &temp); | 4798 | sctp_get_pf_specific(sk->sk_family)->addr_v4map(sp, &temp); |
4797 | addrlen = sctp_get_af_specific(temp.sa.sa_family)->sockaddr_len; | 4799 | addrlen = sctp_get_af_specific(temp.sa.sa_family)->sockaddr_len; |
4798 | if (space_left < addrlen) { | 4800 | if (space_left < addrlen) { |
4799 | err = -ENOMEM; /*fixme: right error?*/ | 4801 | err = -ENOMEM; /*fixme: right error?*/ |
4800 | goto out; | 4802 | goto out; |
4801 | } | 4803 | } |
4802 | memcpy(buf, &temp, addrlen); | 4804 | memcpy(buf, &temp, addrlen); |
4803 | buf += addrlen; | 4805 | buf += addrlen; |
4804 | bytes_copied += addrlen; | 4806 | bytes_copied += addrlen; |
4805 | cnt ++; | 4807 | cnt ++; |
4806 | space_left -= addrlen; | 4808 | space_left -= addrlen; |
4807 | } | 4809 | } |
4808 | 4810 | ||
4809 | copy_getaddrs: | 4811 | copy_getaddrs: |
4810 | if (copy_to_user(to, addrs, bytes_copied)) { | 4812 | if (copy_to_user(to, addrs, bytes_copied)) { |
4811 | err = -EFAULT; | 4813 | err = -EFAULT; |
4812 | goto out; | 4814 | goto out; |
4813 | } | 4815 | } |
4814 | if (put_user(cnt, &((struct sctp_getaddrs __user *)optval)->addr_num)) { | 4816 | if (put_user(cnt, &((struct sctp_getaddrs __user *)optval)->addr_num)) { |
4815 | err = -EFAULT; | 4817 | err = -EFAULT; |
4816 | goto out; | 4818 | goto out; |
4817 | } | 4819 | } |
4818 | if (put_user(bytes_copied, optlen)) | 4820 | if (put_user(bytes_copied, optlen)) |
4819 | err = -EFAULT; | 4821 | err = -EFAULT; |
4820 | out: | 4822 | out: |
4821 | kfree(addrs); | 4823 | kfree(addrs); |
4822 | return err; | 4824 | return err; |
4823 | } | 4825 | } |
4824 | 4826 | ||
4825 | /* 7.1.10 Set Primary Address (SCTP_PRIMARY_ADDR) | 4827 | /* 7.1.10 Set Primary Address (SCTP_PRIMARY_ADDR) |
4826 | * | 4828 | * |
4827 | * Requests that the local SCTP stack use the enclosed peer address as | 4829 | * Requests that the local SCTP stack use the enclosed peer address as |
4828 | * the association primary. The enclosed address must be one of the | 4830 | * the association primary. The enclosed address must be one of the |
4829 | * association peer's addresses. | 4831 | * association peer's addresses. |
4830 | */ | 4832 | */ |
4831 | static int sctp_getsockopt_primary_addr(struct sock *sk, int len, | 4833 | static int sctp_getsockopt_primary_addr(struct sock *sk, int len, |
4832 | char __user *optval, int __user *optlen) | 4834 | char __user *optval, int __user *optlen) |
4833 | { | 4835 | { |
4834 | struct sctp_prim prim; | 4836 | struct sctp_prim prim; |
4835 | struct sctp_association *asoc; | 4837 | struct sctp_association *asoc; |
4836 | struct sctp_sock *sp = sctp_sk(sk); | 4838 | struct sctp_sock *sp = sctp_sk(sk); |
4837 | 4839 | ||
4838 | if (len < sizeof(struct sctp_prim)) | 4840 | if (len < sizeof(struct sctp_prim)) |
4839 | return -EINVAL; | 4841 | return -EINVAL; |
4840 | 4842 | ||
4841 | len = sizeof(struct sctp_prim); | 4843 | len = sizeof(struct sctp_prim); |
4842 | 4844 | ||
4843 | if (copy_from_user(&prim, optval, len)) | 4845 | if (copy_from_user(&prim, optval, len)) |
4844 | return -EFAULT; | 4846 | return -EFAULT; |
4845 | 4847 | ||
4846 | asoc = sctp_id2assoc(sk, prim.ssp_assoc_id); | 4848 | asoc = sctp_id2assoc(sk, prim.ssp_assoc_id); |
4847 | if (!asoc) | 4849 | if (!asoc) |
4848 | return -EINVAL; | 4850 | return -EINVAL; |
4849 | 4851 | ||
4850 | if (!asoc->peer.primary_path) | 4852 | if (!asoc->peer.primary_path) |
4851 | return -ENOTCONN; | 4853 | return -ENOTCONN; |
4852 | 4854 | ||
4853 | memcpy(&prim.ssp_addr, &asoc->peer.primary_path->ipaddr, | 4855 | memcpy(&prim.ssp_addr, &asoc->peer.primary_path->ipaddr, |
4854 | asoc->peer.primary_path->af_specific->sockaddr_len); | 4856 | asoc->peer.primary_path->af_specific->sockaddr_len); |
4855 | 4857 | ||
4856 | sctp_get_pf_specific(sk->sk_family)->addr_v4map(sp, | 4858 | sctp_get_pf_specific(sk->sk_family)->addr_v4map(sp, |
4857 | (union sctp_addr *)&prim.ssp_addr); | 4859 | (union sctp_addr *)&prim.ssp_addr); |
4858 | 4860 | ||
4859 | if (put_user(len, optlen)) | 4861 | if (put_user(len, optlen)) |
4860 | return -EFAULT; | 4862 | return -EFAULT; |
4861 | if (copy_to_user(optval, &prim, len)) | 4863 | if (copy_to_user(optval, &prim, len)) |
4862 | return -EFAULT; | 4864 | return -EFAULT; |
4863 | 4865 | ||
4864 | return 0; | 4866 | return 0; |
4865 | } | 4867 | } |
4866 | 4868 | ||
4867 | /* | 4869 | /* |
4868 | * 7.1.11 Set Adaptation Layer Indicator (SCTP_ADAPTATION_LAYER) | 4870 | * 7.1.11 Set Adaptation Layer Indicator (SCTP_ADAPTATION_LAYER) |
4869 | * | 4871 | * |
4870 | * Requests that the local endpoint set the specified Adaptation Layer | 4872 | * Requests that the local endpoint set the specified Adaptation Layer |
4871 | * Indication parameter for all future INIT and INIT-ACK exchanges. | 4873 | * Indication parameter for all future INIT and INIT-ACK exchanges. |
4872 | */ | 4874 | */ |
4873 | static int sctp_getsockopt_adaptation_layer(struct sock *sk, int len, | 4875 | static int sctp_getsockopt_adaptation_layer(struct sock *sk, int len, |
4874 | char __user *optval, int __user *optlen) | 4876 | char __user *optval, int __user *optlen) |
4875 | { | 4877 | { |
4876 | struct sctp_setadaptation adaptation; | 4878 | struct sctp_setadaptation adaptation; |
4877 | 4879 | ||
4878 | if (len < sizeof(struct sctp_setadaptation)) | 4880 | if (len < sizeof(struct sctp_setadaptation)) |
4879 | return -EINVAL; | 4881 | return -EINVAL; |
4880 | 4882 | ||
4881 | len = sizeof(struct sctp_setadaptation); | 4883 | len = sizeof(struct sctp_setadaptation); |
4882 | 4884 | ||
4883 | adaptation.ssb_adaptation_ind = sctp_sk(sk)->adaptation_ind; | 4885 | adaptation.ssb_adaptation_ind = sctp_sk(sk)->adaptation_ind; |
4884 | 4886 | ||
4885 | if (put_user(len, optlen)) | 4887 | if (put_user(len, optlen)) |
4886 | return -EFAULT; | 4888 | return -EFAULT; |
4887 | if (copy_to_user(optval, &adaptation, len)) | 4889 | if (copy_to_user(optval, &adaptation, len)) |
4888 | return -EFAULT; | 4890 | return -EFAULT; |
4889 | 4891 | ||
4890 | return 0; | 4892 | return 0; |
4891 | } | 4893 | } |
4892 | 4894 | ||
4893 | /* | 4895 | /* |
4894 | * | 4896 | * |
4895 | * 7.1.14 Set default send parameters (SCTP_DEFAULT_SEND_PARAM) | 4897 | * 7.1.14 Set default send parameters (SCTP_DEFAULT_SEND_PARAM) |
4896 | * | 4898 | * |
4897 | * Applications that wish to use the sendto() system call may wish to | 4899 | * Applications that wish to use the sendto() system call may wish to |
4898 | * specify a default set of parameters that would normally be supplied | 4900 | * specify a default set of parameters that would normally be supplied |
4899 | * through the inclusion of ancillary data. This socket option allows | 4901 | * through the inclusion of ancillary data. This socket option allows |
4900 | * such an application to set the default sctp_sndrcvinfo structure. | 4902 | * such an application to set the default sctp_sndrcvinfo structure. |
4901 | 4903 | ||
4902 | 4904 | ||
4903 | * The application that wishes to use this socket option simply passes | 4905 | * The application that wishes to use this socket option simply passes |
4904 | * in to this call the sctp_sndrcvinfo structure defined in Section | 4906 | * in to this call the sctp_sndrcvinfo structure defined in Section |
4905 | * 5.2.2) The input parameters accepted by this call include | 4907 | * 5.2.2) The input parameters accepted by this call include |
4906 | * sinfo_stream, sinfo_flags, sinfo_ppid, sinfo_context, | 4908 | * sinfo_stream, sinfo_flags, sinfo_ppid, sinfo_context, |
4907 | * sinfo_timetolive. The user must provide the sinfo_assoc_id field in | 4909 | * sinfo_timetolive. The user must provide the sinfo_assoc_id field in |
4908 | * to this call if the caller is using the UDP model. | 4910 | * to this call if the caller is using the UDP model. |
4909 | * | 4911 | * |
4910 | * For getsockopt, it get the default sctp_sndrcvinfo structure. | 4912 | * For getsockopt, it get the default sctp_sndrcvinfo structure. |
4911 | */ | 4913 | */ |
4912 | static int sctp_getsockopt_default_send_param(struct sock *sk, | 4914 | static int sctp_getsockopt_default_send_param(struct sock *sk, |
4913 | int len, char __user *optval, | 4915 | int len, char __user *optval, |
4914 | int __user *optlen) | 4916 | int __user *optlen) |
4915 | { | 4917 | { |
4916 | struct sctp_sndrcvinfo info; | 4918 | struct sctp_sndrcvinfo info; |
4917 | struct sctp_association *asoc; | 4919 | struct sctp_association *asoc; |
4918 | struct sctp_sock *sp = sctp_sk(sk); | 4920 | struct sctp_sock *sp = sctp_sk(sk); |
4919 | 4921 | ||
4920 | if (len < sizeof(struct sctp_sndrcvinfo)) | 4922 | if (len < sizeof(struct sctp_sndrcvinfo)) |
4921 | return -EINVAL; | 4923 | return -EINVAL; |
4922 | 4924 | ||
4923 | len = sizeof(struct sctp_sndrcvinfo); | 4925 | len = sizeof(struct sctp_sndrcvinfo); |
4924 | 4926 | ||
4925 | if (copy_from_user(&info, optval, len)) | 4927 | if (copy_from_user(&info, optval, len)) |
4926 | return -EFAULT; | 4928 | return -EFAULT; |
4927 | 4929 | ||
4928 | asoc = sctp_id2assoc(sk, info.sinfo_assoc_id); | 4930 | asoc = sctp_id2assoc(sk, info.sinfo_assoc_id); |
4929 | if (!asoc && info.sinfo_assoc_id && sctp_style(sk, UDP)) | 4931 | if (!asoc && info.sinfo_assoc_id && sctp_style(sk, UDP)) |
4930 | return -EINVAL; | 4932 | return -EINVAL; |
4931 | 4933 | ||
4932 | if (asoc) { | 4934 | if (asoc) { |
4933 | info.sinfo_stream = asoc->default_stream; | 4935 | info.sinfo_stream = asoc->default_stream; |
4934 | info.sinfo_flags = asoc->default_flags; | 4936 | info.sinfo_flags = asoc->default_flags; |
4935 | info.sinfo_ppid = asoc->default_ppid; | 4937 | info.sinfo_ppid = asoc->default_ppid; |
4936 | info.sinfo_context = asoc->default_context; | 4938 | info.sinfo_context = asoc->default_context; |
4937 | info.sinfo_timetolive = asoc->default_timetolive; | 4939 | info.sinfo_timetolive = asoc->default_timetolive; |
4938 | } else { | 4940 | } else { |
4939 | info.sinfo_stream = sp->default_stream; | 4941 | info.sinfo_stream = sp->default_stream; |
4940 | info.sinfo_flags = sp->default_flags; | 4942 | info.sinfo_flags = sp->default_flags; |
4941 | info.sinfo_ppid = sp->default_ppid; | 4943 | info.sinfo_ppid = sp->default_ppid; |
4942 | info.sinfo_context = sp->default_context; | 4944 | info.sinfo_context = sp->default_context; |
4943 | info.sinfo_timetolive = sp->default_timetolive; | 4945 | info.sinfo_timetolive = sp->default_timetolive; |
4944 | } | 4946 | } |
4945 | 4947 | ||
4946 | if (put_user(len, optlen)) | 4948 | if (put_user(len, optlen)) |
4947 | return -EFAULT; | 4949 | return -EFAULT; |
4948 | if (copy_to_user(optval, &info, len)) | 4950 | if (copy_to_user(optval, &info, len)) |
4949 | return -EFAULT; | 4951 | return -EFAULT; |
4950 | 4952 | ||
4951 | return 0; | 4953 | return 0; |
4952 | } | 4954 | } |
4953 | 4955 | ||
4954 | /* | 4956 | /* |
4955 | * | 4957 | * |
4956 | * 7.1.5 SCTP_NODELAY | 4958 | * 7.1.5 SCTP_NODELAY |
4957 | * | 4959 | * |
4958 | * Turn on/off any Nagle-like algorithm. This means that packets are | 4960 | * Turn on/off any Nagle-like algorithm. This means that packets are |
4959 | * generally sent as soon as possible and no unnecessary delays are | 4961 | * generally sent as soon as possible and no unnecessary delays are |
4960 | * introduced, at the cost of more packets in the network. Expects an | 4962 | * introduced, at the cost of more packets in the network. Expects an |
4961 | * integer boolean flag. | 4963 | * integer boolean flag. |
4962 | */ | 4964 | */ |
4963 | 4965 | ||
4964 | static int sctp_getsockopt_nodelay(struct sock *sk, int len, | 4966 | static int sctp_getsockopt_nodelay(struct sock *sk, int len, |
4965 | char __user *optval, int __user *optlen) | 4967 | char __user *optval, int __user *optlen) |
4966 | { | 4968 | { |
4967 | int val; | 4969 | int val; |
4968 | 4970 | ||
4969 | if (len < sizeof(int)) | 4971 | if (len < sizeof(int)) |
4970 | return -EINVAL; | 4972 | return -EINVAL; |
4971 | 4973 | ||
4972 | len = sizeof(int); | 4974 | len = sizeof(int); |
4973 | val = (sctp_sk(sk)->nodelay == 1); | 4975 | val = (sctp_sk(sk)->nodelay == 1); |
4974 | if (put_user(len, optlen)) | 4976 | if (put_user(len, optlen)) |
4975 | return -EFAULT; | 4977 | return -EFAULT; |
4976 | if (copy_to_user(optval, &val, len)) | 4978 | if (copy_to_user(optval, &val, len)) |
4977 | return -EFAULT; | 4979 | return -EFAULT; |
4978 | return 0; | 4980 | return 0; |
4979 | } | 4981 | } |
4980 | 4982 | ||
4981 | /* | 4983 | /* |
4982 | * | 4984 | * |
4983 | * 7.1.1 SCTP_RTOINFO | 4985 | * 7.1.1 SCTP_RTOINFO |
4984 | * | 4986 | * |
4985 | * The protocol parameters used to initialize and bound retransmission | 4987 | * The protocol parameters used to initialize and bound retransmission |
4986 | * timeout (RTO) are tunable. sctp_rtoinfo structure is used to access | 4988 | * timeout (RTO) are tunable. sctp_rtoinfo structure is used to access |
4987 | * and modify these parameters. | 4989 | * and modify these parameters. |
4988 | * All parameters are time values, in milliseconds. A value of 0, when | 4990 | * All parameters are time values, in milliseconds. A value of 0, when |
4989 | * modifying the parameters, indicates that the current value should not | 4991 | * modifying the parameters, indicates that the current value should not |
4990 | * be changed. | 4992 | * be changed. |
4991 | * | 4993 | * |
4992 | */ | 4994 | */ |
4993 | static int sctp_getsockopt_rtoinfo(struct sock *sk, int len, | 4995 | static int sctp_getsockopt_rtoinfo(struct sock *sk, int len, |
4994 | char __user *optval, | 4996 | char __user *optval, |
4995 | int __user *optlen) { | 4997 | int __user *optlen) { |
4996 | struct sctp_rtoinfo rtoinfo; | 4998 | struct sctp_rtoinfo rtoinfo; |
4997 | struct sctp_association *asoc; | 4999 | struct sctp_association *asoc; |
4998 | 5000 | ||
4999 | if (len < sizeof (struct sctp_rtoinfo)) | 5001 | if (len < sizeof (struct sctp_rtoinfo)) |
5000 | return -EINVAL; | 5002 | return -EINVAL; |
5001 | 5003 | ||
5002 | len = sizeof(struct sctp_rtoinfo); | 5004 | len = sizeof(struct sctp_rtoinfo); |
5003 | 5005 | ||
5004 | if (copy_from_user(&rtoinfo, optval, len)) | 5006 | if (copy_from_user(&rtoinfo, optval, len)) |
5005 | return -EFAULT; | 5007 | return -EFAULT; |
5006 | 5008 | ||
5007 | asoc = sctp_id2assoc(sk, rtoinfo.srto_assoc_id); | 5009 | asoc = sctp_id2assoc(sk, rtoinfo.srto_assoc_id); |
5008 | 5010 | ||
5009 | if (!asoc && rtoinfo.srto_assoc_id && sctp_style(sk, UDP)) | 5011 | if (!asoc && rtoinfo.srto_assoc_id && sctp_style(sk, UDP)) |
5010 | return -EINVAL; | 5012 | return -EINVAL; |
5011 | 5013 | ||
5012 | /* Values corresponding to the specific association. */ | 5014 | /* Values corresponding to the specific association. */ |
5013 | if (asoc) { | 5015 | if (asoc) { |
5014 | rtoinfo.srto_initial = jiffies_to_msecs(asoc->rto_initial); | 5016 | rtoinfo.srto_initial = jiffies_to_msecs(asoc->rto_initial); |
5015 | rtoinfo.srto_max = jiffies_to_msecs(asoc->rto_max); | 5017 | rtoinfo.srto_max = jiffies_to_msecs(asoc->rto_max); |
5016 | rtoinfo.srto_min = jiffies_to_msecs(asoc->rto_min); | 5018 | rtoinfo.srto_min = jiffies_to_msecs(asoc->rto_min); |
5017 | } else { | 5019 | } else { |
5018 | /* Values corresponding to the endpoint. */ | 5020 | /* Values corresponding to the endpoint. */ |
5019 | struct sctp_sock *sp = sctp_sk(sk); | 5021 | struct sctp_sock *sp = sctp_sk(sk); |
5020 | 5022 | ||
5021 | rtoinfo.srto_initial = sp->rtoinfo.srto_initial; | 5023 | rtoinfo.srto_initial = sp->rtoinfo.srto_initial; |
5022 | rtoinfo.srto_max = sp->rtoinfo.srto_max; | 5024 | rtoinfo.srto_max = sp->rtoinfo.srto_max; |
5023 | rtoinfo.srto_min = sp->rtoinfo.srto_min; | 5025 | rtoinfo.srto_min = sp->rtoinfo.srto_min; |
5024 | } | 5026 | } |
5025 | 5027 | ||
5026 | if (put_user(len, optlen)) | 5028 | if (put_user(len, optlen)) |
5027 | return -EFAULT; | 5029 | return -EFAULT; |
5028 | 5030 | ||
5029 | if (copy_to_user(optval, &rtoinfo, len)) | 5031 | if (copy_to_user(optval, &rtoinfo, len)) |
5030 | return -EFAULT; | 5032 | return -EFAULT; |
5031 | 5033 | ||
5032 | return 0; | 5034 | return 0; |
5033 | } | 5035 | } |
5034 | 5036 | ||
5035 | /* | 5037 | /* |
5036 | * | 5038 | * |
5037 | * 7.1.2 SCTP_ASSOCINFO | 5039 | * 7.1.2 SCTP_ASSOCINFO |
5038 | * | 5040 | * |
5039 | * This option is used to tune the maximum retransmission attempts | 5041 | * This option is used to tune the maximum retransmission attempts |
5040 | * of the association. | 5042 | * of the association. |
5041 | * Returns an error if the new association retransmission value is | 5043 | * Returns an error if the new association retransmission value is |
5042 | * greater than the sum of the retransmission value of the peer. | 5044 | * greater than the sum of the retransmission value of the peer. |
5043 | * See [SCTP] for more information. | 5045 | * See [SCTP] for more information. |
5044 | * | 5046 | * |
5045 | */ | 5047 | */ |
5046 | static int sctp_getsockopt_associnfo(struct sock *sk, int len, | 5048 | static int sctp_getsockopt_associnfo(struct sock *sk, int len, |
5047 | char __user *optval, | 5049 | char __user *optval, |
5048 | int __user *optlen) | 5050 | int __user *optlen) |
5049 | { | 5051 | { |
5050 | 5052 | ||
5051 | struct sctp_assocparams assocparams; | 5053 | struct sctp_assocparams assocparams; |
5052 | struct sctp_association *asoc; | 5054 | struct sctp_association *asoc; |
5053 | struct list_head *pos; | 5055 | struct list_head *pos; |
5054 | int cnt = 0; | 5056 | int cnt = 0; |
5055 | 5057 | ||
5056 | if (len < sizeof (struct sctp_assocparams)) | 5058 | if (len < sizeof (struct sctp_assocparams)) |
5057 | return -EINVAL; | 5059 | return -EINVAL; |
5058 | 5060 | ||
5059 | len = sizeof(struct sctp_assocparams); | 5061 | len = sizeof(struct sctp_assocparams); |
5060 | 5062 | ||
5061 | if (copy_from_user(&assocparams, optval, len)) | 5063 | if (copy_from_user(&assocparams, optval, len)) |
5062 | return -EFAULT; | 5064 | return -EFAULT; |
5063 | 5065 | ||
5064 | asoc = sctp_id2assoc(sk, assocparams.sasoc_assoc_id); | 5066 | asoc = sctp_id2assoc(sk, assocparams.sasoc_assoc_id); |
5065 | 5067 | ||
5066 | if (!asoc && assocparams.sasoc_assoc_id && sctp_style(sk, UDP)) | 5068 | if (!asoc && assocparams.sasoc_assoc_id && sctp_style(sk, UDP)) |
5067 | return -EINVAL; | 5069 | return -EINVAL; |
5068 | 5070 | ||
5069 | /* Values correspoinding to the specific association */ | 5071 | /* Values correspoinding to the specific association */ |
5070 | if (asoc) { | 5072 | if (asoc) { |
5071 | assocparams.sasoc_asocmaxrxt = asoc->max_retrans; | 5073 | assocparams.sasoc_asocmaxrxt = asoc->max_retrans; |
5072 | assocparams.sasoc_peer_rwnd = asoc->peer.rwnd; | 5074 | assocparams.sasoc_peer_rwnd = asoc->peer.rwnd; |
5073 | assocparams.sasoc_local_rwnd = asoc->a_rwnd; | 5075 | assocparams.sasoc_local_rwnd = asoc->a_rwnd; |
5074 | assocparams.sasoc_cookie_life = (asoc->cookie_life.tv_sec | 5076 | assocparams.sasoc_cookie_life = (asoc->cookie_life.tv_sec |
5075 | * 1000) + | 5077 | * 1000) + |
5076 | (asoc->cookie_life.tv_usec | 5078 | (asoc->cookie_life.tv_usec |
5077 | / 1000); | 5079 | / 1000); |
5078 | 5080 | ||
5079 | list_for_each(pos, &asoc->peer.transport_addr_list) { | 5081 | list_for_each(pos, &asoc->peer.transport_addr_list) { |
5080 | cnt ++; | 5082 | cnt ++; |
5081 | } | 5083 | } |
5082 | 5084 | ||
5083 | assocparams.sasoc_number_peer_destinations = cnt; | 5085 | assocparams.sasoc_number_peer_destinations = cnt; |
5084 | } else { | 5086 | } else { |
5085 | /* Values corresponding to the endpoint */ | 5087 | /* Values corresponding to the endpoint */ |
5086 | struct sctp_sock *sp = sctp_sk(sk); | 5088 | struct sctp_sock *sp = sctp_sk(sk); |
5087 | 5089 | ||
5088 | assocparams.sasoc_asocmaxrxt = sp->assocparams.sasoc_asocmaxrxt; | 5090 | assocparams.sasoc_asocmaxrxt = sp->assocparams.sasoc_asocmaxrxt; |
5089 | assocparams.sasoc_peer_rwnd = sp->assocparams.sasoc_peer_rwnd; | 5091 | assocparams.sasoc_peer_rwnd = sp->assocparams.sasoc_peer_rwnd; |
5090 | assocparams.sasoc_local_rwnd = sp->assocparams.sasoc_local_rwnd; | 5092 | assocparams.sasoc_local_rwnd = sp->assocparams.sasoc_local_rwnd; |
5091 | assocparams.sasoc_cookie_life = | 5093 | assocparams.sasoc_cookie_life = |
5092 | sp->assocparams.sasoc_cookie_life; | 5094 | sp->assocparams.sasoc_cookie_life; |
5093 | assocparams.sasoc_number_peer_destinations = | 5095 | assocparams.sasoc_number_peer_destinations = |
5094 | sp->assocparams. | 5096 | sp->assocparams. |
5095 | sasoc_number_peer_destinations; | 5097 | sasoc_number_peer_destinations; |
5096 | } | 5098 | } |
5097 | 5099 | ||
5098 | if (put_user(len, optlen)) | 5100 | if (put_user(len, optlen)) |
5099 | return -EFAULT; | 5101 | return -EFAULT; |
5100 | 5102 | ||
5101 | if (copy_to_user(optval, &assocparams, len)) | 5103 | if (copy_to_user(optval, &assocparams, len)) |
5102 | return -EFAULT; | 5104 | return -EFAULT; |
5103 | 5105 | ||
5104 | return 0; | 5106 | return 0; |
5105 | } | 5107 | } |
5106 | 5108 | ||
5107 | /* | 5109 | /* |
5108 | * 7.1.16 Set/clear IPv4 mapped addresses (SCTP_I_WANT_MAPPED_V4_ADDR) | 5110 | * 7.1.16 Set/clear IPv4 mapped addresses (SCTP_I_WANT_MAPPED_V4_ADDR) |
5109 | * | 5111 | * |
5110 | * This socket option is a boolean flag which turns on or off mapped V4 | 5112 | * This socket option is a boolean flag which turns on or off mapped V4 |
5111 | * addresses. If this option is turned on and the socket is type | 5113 | * addresses. If this option is turned on and the socket is type |
5112 | * PF_INET6, then IPv4 addresses will be mapped to V6 representation. | 5114 | * PF_INET6, then IPv4 addresses will be mapped to V6 representation. |
5113 | * If this option is turned off, then no mapping will be done of V4 | 5115 | * If this option is turned off, then no mapping will be done of V4 |
5114 | * addresses and a user will receive both PF_INET6 and PF_INET type | 5116 | * addresses and a user will receive both PF_INET6 and PF_INET type |
5115 | * addresses on the socket. | 5117 | * addresses on the socket. |
5116 | */ | 5118 | */ |
5117 | static int sctp_getsockopt_mappedv4(struct sock *sk, int len, | 5119 | static int sctp_getsockopt_mappedv4(struct sock *sk, int len, |
5118 | char __user *optval, int __user *optlen) | 5120 | char __user *optval, int __user *optlen) |
5119 | { | 5121 | { |
5120 | int val; | 5122 | int val; |
5121 | struct sctp_sock *sp = sctp_sk(sk); | 5123 | struct sctp_sock *sp = sctp_sk(sk); |
5122 | 5124 | ||
5123 | if (len < sizeof(int)) | 5125 | if (len < sizeof(int)) |
5124 | return -EINVAL; | 5126 | return -EINVAL; |
5125 | 5127 | ||
5126 | len = sizeof(int); | 5128 | len = sizeof(int); |
5127 | val = sp->v4mapped; | 5129 | val = sp->v4mapped; |
5128 | if (put_user(len, optlen)) | 5130 | if (put_user(len, optlen)) |
5129 | return -EFAULT; | 5131 | return -EFAULT; |
5130 | if (copy_to_user(optval, &val, len)) | 5132 | if (copy_to_user(optval, &val, len)) |
5131 | return -EFAULT; | 5133 | return -EFAULT; |
5132 | 5134 | ||
5133 | return 0; | 5135 | return 0; |
5134 | } | 5136 | } |
5135 | 5137 | ||
5136 | /* | 5138 | /* |
5137 | * 7.1.29. Set or Get the default context (SCTP_CONTEXT) | 5139 | * 7.1.29. Set or Get the default context (SCTP_CONTEXT) |
5138 | * (chapter and verse is quoted at sctp_setsockopt_context()) | 5140 | * (chapter and verse is quoted at sctp_setsockopt_context()) |
5139 | */ | 5141 | */ |
5140 | static int sctp_getsockopt_context(struct sock *sk, int len, | 5142 | static int sctp_getsockopt_context(struct sock *sk, int len, |
5141 | char __user *optval, int __user *optlen) | 5143 | char __user *optval, int __user *optlen) |
5142 | { | 5144 | { |
5143 | struct sctp_assoc_value params; | 5145 | struct sctp_assoc_value params; |
5144 | struct sctp_sock *sp; | 5146 | struct sctp_sock *sp; |
5145 | struct sctp_association *asoc; | 5147 | struct sctp_association *asoc; |
5146 | 5148 | ||
5147 | if (len < sizeof(struct sctp_assoc_value)) | 5149 | if (len < sizeof(struct sctp_assoc_value)) |
5148 | return -EINVAL; | 5150 | return -EINVAL; |
5149 | 5151 | ||
5150 | len = sizeof(struct sctp_assoc_value); | 5152 | len = sizeof(struct sctp_assoc_value); |
5151 | 5153 | ||
5152 | if (copy_from_user(¶ms, optval, len)) | 5154 | if (copy_from_user(¶ms, optval, len)) |
5153 | return -EFAULT; | 5155 | return -EFAULT; |
5154 | 5156 | ||
5155 | sp = sctp_sk(sk); | 5157 | sp = sctp_sk(sk); |
5156 | 5158 | ||
5157 | if (params.assoc_id != 0) { | 5159 | if (params.assoc_id != 0) { |
5158 | asoc = sctp_id2assoc(sk, params.assoc_id); | 5160 | asoc = sctp_id2assoc(sk, params.assoc_id); |
5159 | if (!asoc) | 5161 | if (!asoc) |
5160 | return -EINVAL; | 5162 | return -EINVAL; |
5161 | params.assoc_value = asoc->default_rcv_context; | 5163 | params.assoc_value = asoc->default_rcv_context; |
5162 | } else { | 5164 | } else { |
5163 | params.assoc_value = sp->default_rcv_context; | 5165 | params.assoc_value = sp->default_rcv_context; |
5164 | } | 5166 | } |
5165 | 5167 | ||
5166 | if (put_user(len, optlen)) | 5168 | if (put_user(len, optlen)) |
5167 | return -EFAULT; | 5169 | return -EFAULT; |
5168 | if (copy_to_user(optval, ¶ms, len)) | 5170 | if (copy_to_user(optval, ¶ms, len)) |
5169 | return -EFAULT; | 5171 | return -EFAULT; |
5170 | 5172 | ||
5171 | return 0; | 5173 | return 0; |
5172 | } | 5174 | } |
5173 | 5175 | ||
5174 | /* | 5176 | /* |
5175 | * 8.1.16. Get or Set the Maximum Fragmentation Size (SCTP_MAXSEG) | 5177 | * 8.1.16. Get or Set the Maximum Fragmentation Size (SCTP_MAXSEG) |
5176 | * This option will get or set the maximum size to put in any outgoing | 5178 | * This option will get or set the maximum size to put in any outgoing |
5177 | * SCTP DATA chunk. If a message is larger than this size it will be | 5179 | * SCTP DATA chunk. If a message is larger than this size it will be |
5178 | * fragmented by SCTP into the specified size. Note that the underlying | 5180 | * fragmented by SCTP into the specified size. Note that the underlying |
5179 | * SCTP implementation may fragment into smaller sized chunks when the | 5181 | * SCTP implementation may fragment into smaller sized chunks when the |
5180 | * PMTU of the underlying association is smaller than the value set by | 5182 | * PMTU of the underlying association is smaller than the value set by |
5181 | * the user. The default value for this option is '0' which indicates | 5183 | * the user. The default value for this option is '0' which indicates |
5182 | * the user is NOT limiting fragmentation and only the PMTU will effect | 5184 | * the user is NOT limiting fragmentation and only the PMTU will effect |
5183 | * SCTP's choice of DATA chunk size. Note also that values set larger | 5185 | * SCTP's choice of DATA chunk size. Note also that values set larger |
5184 | * than the maximum size of an IP datagram will effectively let SCTP | 5186 | * than the maximum size of an IP datagram will effectively let SCTP |
5185 | * control fragmentation (i.e. the same as setting this option to 0). | 5187 | * control fragmentation (i.e. the same as setting this option to 0). |
5186 | * | 5188 | * |
5187 | * The following structure is used to access and modify this parameter: | 5189 | * The following structure is used to access and modify this parameter: |
5188 | * | 5190 | * |
5189 | * struct sctp_assoc_value { | 5191 | * struct sctp_assoc_value { |
5190 | * sctp_assoc_t assoc_id; | 5192 | * sctp_assoc_t assoc_id; |
5191 | * uint32_t assoc_value; | 5193 | * uint32_t assoc_value; |
5192 | * }; | 5194 | * }; |
5193 | * | 5195 | * |
5194 | * assoc_id: This parameter is ignored for one-to-one style sockets. | 5196 | * assoc_id: This parameter is ignored for one-to-one style sockets. |
5195 | * For one-to-many style sockets this parameter indicates which | 5197 | * For one-to-many style sockets this parameter indicates which |
5196 | * association the user is performing an action upon. Note that if | 5198 | * association the user is performing an action upon. Note that if |
5197 | * this field's value is zero then the endpoints default value is | 5199 | * this field's value is zero then the endpoints default value is |
5198 | * changed (effecting future associations only). | 5200 | * changed (effecting future associations only). |
5199 | * assoc_value: This parameter specifies the maximum size in bytes. | 5201 | * assoc_value: This parameter specifies the maximum size in bytes. |
5200 | */ | 5202 | */ |
5201 | static int sctp_getsockopt_maxseg(struct sock *sk, int len, | 5203 | static int sctp_getsockopt_maxseg(struct sock *sk, int len, |
5202 | char __user *optval, int __user *optlen) | 5204 | char __user *optval, int __user *optlen) |
5203 | { | 5205 | { |
5204 | struct sctp_assoc_value params; | 5206 | struct sctp_assoc_value params; |
5205 | struct sctp_association *asoc; | 5207 | struct sctp_association *asoc; |
5206 | 5208 | ||
5207 | if (len == sizeof(int)) { | 5209 | if (len == sizeof(int)) { |
5208 | pr_warn("Use of int in maxseg socket option deprecated\n"); | 5210 | pr_warn("Use of int in maxseg socket option deprecated\n"); |
5209 | pr_warn("Use struct sctp_assoc_value instead\n"); | 5211 | pr_warn("Use struct sctp_assoc_value instead\n"); |
5210 | params.assoc_id = 0; | 5212 | params.assoc_id = 0; |
5211 | } else if (len >= sizeof(struct sctp_assoc_value)) { | 5213 | } else if (len >= sizeof(struct sctp_assoc_value)) { |
5212 | len = sizeof(struct sctp_assoc_value); | 5214 | len = sizeof(struct sctp_assoc_value); |
5213 | if (copy_from_user(¶ms, optval, sizeof(params))) | 5215 | if (copy_from_user(¶ms, optval, sizeof(params))) |
5214 | return -EFAULT; | 5216 | return -EFAULT; |
5215 | } else | 5217 | } else |
5216 | return -EINVAL; | 5218 | return -EINVAL; |
5217 | 5219 | ||
5218 | asoc = sctp_id2assoc(sk, params.assoc_id); | 5220 | asoc = sctp_id2assoc(sk, params.assoc_id); |
5219 | if (!asoc && params.assoc_id && sctp_style(sk, UDP)) | 5221 | if (!asoc && params.assoc_id && sctp_style(sk, UDP)) |
5220 | return -EINVAL; | 5222 | return -EINVAL; |
5221 | 5223 | ||
5222 | if (asoc) | 5224 | if (asoc) |
5223 | params.assoc_value = asoc->frag_point; | 5225 | params.assoc_value = asoc->frag_point; |
5224 | else | 5226 | else |
5225 | params.assoc_value = sctp_sk(sk)->user_frag; | 5227 | params.assoc_value = sctp_sk(sk)->user_frag; |
5226 | 5228 | ||
5227 | if (put_user(len, optlen)) | 5229 | if (put_user(len, optlen)) |
5228 | return -EFAULT; | 5230 | return -EFAULT; |
5229 | if (len == sizeof(int)) { | 5231 | if (len == sizeof(int)) { |
5230 | if (copy_to_user(optval, ¶ms.assoc_value, len)) | 5232 | if (copy_to_user(optval, ¶ms.assoc_value, len)) |
5231 | return -EFAULT; | 5233 | return -EFAULT; |
5232 | } else { | 5234 | } else { |
5233 | if (copy_to_user(optval, ¶ms, len)) | 5235 | if (copy_to_user(optval, ¶ms, len)) |
5234 | return -EFAULT; | 5236 | return -EFAULT; |
5235 | } | 5237 | } |
5236 | 5238 | ||
5237 | return 0; | 5239 | return 0; |
5238 | } | 5240 | } |
5239 | 5241 | ||
5240 | /* | 5242 | /* |
5241 | * 7.1.24. Get or set fragmented interleave (SCTP_FRAGMENT_INTERLEAVE) | 5243 | * 7.1.24. Get or set fragmented interleave (SCTP_FRAGMENT_INTERLEAVE) |
5242 | * (chapter and verse is quoted at sctp_setsockopt_fragment_interleave()) | 5244 | * (chapter and verse is quoted at sctp_setsockopt_fragment_interleave()) |
5243 | */ | 5245 | */ |
5244 | static int sctp_getsockopt_fragment_interleave(struct sock *sk, int len, | 5246 | static int sctp_getsockopt_fragment_interleave(struct sock *sk, int len, |
5245 | char __user *optval, int __user *optlen) | 5247 | char __user *optval, int __user *optlen) |
5246 | { | 5248 | { |
5247 | int val; | 5249 | int val; |
5248 | 5250 | ||
5249 | if (len < sizeof(int)) | 5251 | if (len < sizeof(int)) |
5250 | return -EINVAL; | 5252 | return -EINVAL; |
5251 | 5253 | ||
5252 | len = sizeof(int); | 5254 | len = sizeof(int); |
5253 | 5255 | ||
5254 | val = sctp_sk(sk)->frag_interleave; | 5256 | val = sctp_sk(sk)->frag_interleave; |
5255 | if (put_user(len, optlen)) | 5257 | if (put_user(len, optlen)) |
5256 | return -EFAULT; | 5258 | return -EFAULT; |
5257 | if (copy_to_user(optval, &val, len)) | 5259 | if (copy_to_user(optval, &val, len)) |
5258 | return -EFAULT; | 5260 | return -EFAULT; |
5259 | 5261 | ||
5260 | return 0; | 5262 | return 0; |
5261 | } | 5263 | } |
5262 | 5264 | ||
5263 | /* | 5265 | /* |
5264 | * 7.1.25. Set or Get the sctp partial delivery point | 5266 | * 7.1.25. Set or Get the sctp partial delivery point |
5265 | * (chapter and verse is quoted at sctp_setsockopt_partial_delivery_point()) | 5267 | * (chapter and verse is quoted at sctp_setsockopt_partial_delivery_point()) |
5266 | */ | 5268 | */ |
5267 | static int sctp_getsockopt_partial_delivery_point(struct sock *sk, int len, | 5269 | static int sctp_getsockopt_partial_delivery_point(struct sock *sk, int len, |
5268 | char __user *optval, | 5270 | char __user *optval, |
5269 | int __user *optlen) | 5271 | int __user *optlen) |
5270 | { | 5272 | { |
5271 | u32 val; | 5273 | u32 val; |
5272 | 5274 | ||
5273 | if (len < sizeof(u32)) | 5275 | if (len < sizeof(u32)) |
5274 | return -EINVAL; | 5276 | return -EINVAL; |
5275 | 5277 | ||
5276 | len = sizeof(u32); | 5278 | len = sizeof(u32); |
5277 | 5279 | ||
5278 | val = sctp_sk(sk)->pd_point; | 5280 | val = sctp_sk(sk)->pd_point; |
5279 | if (put_user(len, optlen)) | 5281 | if (put_user(len, optlen)) |
5280 | return -EFAULT; | 5282 | return -EFAULT; |
5281 | if (copy_to_user(optval, &val, len)) | 5283 | if (copy_to_user(optval, &val, len)) |
5282 | return -EFAULT; | 5284 | return -EFAULT; |
5283 | 5285 | ||
5284 | return 0; | 5286 | return 0; |
5285 | } | 5287 | } |
5286 | 5288 | ||
5287 | /* | 5289 | /* |
5288 | * 7.1.28. Set or Get the maximum burst (SCTP_MAX_BURST) | 5290 | * 7.1.28. Set or Get the maximum burst (SCTP_MAX_BURST) |
5289 | * (chapter and verse is quoted at sctp_setsockopt_maxburst()) | 5291 | * (chapter and verse is quoted at sctp_setsockopt_maxburst()) |
5290 | */ | 5292 | */ |
5291 | static int sctp_getsockopt_maxburst(struct sock *sk, int len, | 5293 | static int sctp_getsockopt_maxburst(struct sock *sk, int len, |
5292 | char __user *optval, | 5294 | char __user *optval, |
5293 | int __user *optlen) | 5295 | int __user *optlen) |
5294 | { | 5296 | { |
5295 | struct sctp_assoc_value params; | 5297 | struct sctp_assoc_value params; |
5296 | struct sctp_sock *sp; | 5298 | struct sctp_sock *sp; |
5297 | struct sctp_association *asoc; | 5299 | struct sctp_association *asoc; |
5298 | 5300 | ||
5299 | if (len == sizeof(int)) { | 5301 | if (len == sizeof(int)) { |
5300 | pr_warn("Use of int in max_burst socket option deprecated\n"); | 5302 | pr_warn("Use of int in max_burst socket option deprecated\n"); |
5301 | pr_warn("Use struct sctp_assoc_value instead\n"); | 5303 | pr_warn("Use struct sctp_assoc_value instead\n"); |
5302 | params.assoc_id = 0; | 5304 | params.assoc_id = 0; |
5303 | } else if (len >= sizeof(struct sctp_assoc_value)) { | 5305 | } else if (len >= sizeof(struct sctp_assoc_value)) { |
5304 | len = sizeof(struct sctp_assoc_value); | 5306 | len = sizeof(struct sctp_assoc_value); |
5305 | if (copy_from_user(¶ms, optval, len)) | 5307 | if (copy_from_user(¶ms, optval, len)) |
5306 | return -EFAULT; | 5308 | return -EFAULT; |
5307 | } else | 5309 | } else |
5308 | return -EINVAL; | 5310 | return -EINVAL; |
5309 | 5311 | ||
5310 | sp = sctp_sk(sk); | 5312 | sp = sctp_sk(sk); |
5311 | 5313 | ||
5312 | if (params.assoc_id != 0) { | 5314 | if (params.assoc_id != 0) { |
5313 | asoc = sctp_id2assoc(sk, params.assoc_id); | 5315 | asoc = sctp_id2assoc(sk, params.assoc_id); |
5314 | if (!asoc) | 5316 | if (!asoc) |
5315 | return -EINVAL; | 5317 | return -EINVAL; |
5316 | params.assoc_value = asoc->max_burst; | 5318 | params.assoc_value = asoc->max_burst; |
5317 | } else | 5319 | } else |
5318 | params.assoc_value = sp->max_burst; | 5320 | params.assoc_value = sp->max_burst; |
5319 | 5321 | ||
5320 | if (len == sizeof(int)) { | 5322 | if (len == sizeof(int)) { |
5321 | if (copy_to_user(optval, ¶ms.assoc_value, len)) | 5323 | if (copy_to_user(optval, ¶ms.assoc_value, len)) |
5322 | return -EFAULT; | 5324 | return -EFAULT; |
5323 | } else { | 5325 | } else { |
5324 | if (copy_to_user(optval, ¶ms, len)) | 5326 | if (copy_to_user(optval, ¶ms, len)) |
5325 | return -EFAULT; | 5327 | return -EFAULT; |
5326 | } | 5328 | } |
5327 | 5329 | ||
5328 | return 0; | 5330 | return 0; |
5329 | 5331 | ||
5330 | } | 5332 | } |
5331 | 5333 | ||
5332 | static int sctp_getsockopt_hmac_ident(struct sock *sk, int len, | 5334 | static int sctp_getsockopt_hmac_ident(struct sock *sk, int len, |
5333 | char __user *optval, int __user *optlen) | 5335 | char __user *optval, int __user *optlen) |
5334 | { | 5336 | { |
5335 | struct net *net = sock_net(sk); | 5337 | struct net *net = sock_net(sk); |
5336 | struct sctp_hmacalgo __user *p = (void __user *)optval; | 5338 | struct sctp_hmacalgo __user *p = (void __user *)optval; |
5337 | struct sctp_hmac_algo_param *hmacs; | 5339 | struct sctp_hmac_algo_param *hmacs; |
5338 | __u16 data_len = 0; | 5340 | __u16 data_len = 0; |
5339 | u32 num_idents; | 5341 | u32 num_idents; |
5340 | 5342 | ||
5341 | if (!net->sctp.auth_enable) | 5343 | if (!net->sctp.auth_enable) |
5342 | return -EACCES; | 5344 | return -EACCES; |
5343 | 5345 | ||
5344 | hmacs = sctp_sk(sk)->ep->auth_hmacs_list; | 5346 | hmacs = sctp_sk(sk)->ep->auth_hmacs_list; |
5345 | data_len = ntohs(hmacs->param_hdr.length) - sizeof(sctp_paramhdr_t); | 5347 | data_len = ntohs(hmacs->param_hdr.length) - sizeof(sctp_paramhdr_t); |
5346 | 5348 | ||
5347 | if (len < sizeof(struct sctp_hmacalgo) + data_len) | 5349 | if (len < sizeof(struct sctp_hmacalgo) + data_len) |
5348 | return -EINVAL; | 5350 | return -EINVAL; |
5349 | 5351 | ||
5350 | len = sizeof(struct sctp_hmacalgo) + data_len; | 5352 | len = sizeof(struct sctp_hmacalgo) + data_len; |
5351 | num_idents = data_len / sizeof(u16); | 5353 | num_idents = data_len / sizeof(u16); |
5352 | 5354 | ||
5353 | if (put_user(len, optlen)) | 5355 | if (put_user(len, optlen)) |
5354 | return -EFAULT; | 5356 | return -EFAULT; |
5355 | if (put_user(num_idents, &p->shmac_num_idents)) | 5357 | if (put_user(num_idents, &p->shmac_num_idents)) |
5356 | return -EFAULT; | 5358 | return -EFAULT; |
5357 | if (copy_to_user(p->shmac_idents, hmacs->hmac_ids, data_len)) | 5359 | if (copy_to_user(p->shmac_idents, hmacs->hmac_ids, data_len)) |
5358 | return -EFAULT; | 5360 | return -EFAULT; |
5359 | return 0; | 5361 | return 0; |
5360 | } | 5362 | } |
5361 | 5363 | ||
5362 | static int sctp_getsockopt_active_key(struct sock *sk, int len, | 5364 | static int sctp_getsockopt_active_key(struct sock *sk, int len, |
5363 | char __user *optval, int __user *optlen) | 5365 | char __user *optval, int __user *optlen) |
5364 | { | 5366 | { |
5365 | struct net *net = sock_net(sk); | 5367 | struct net *net = sock_net(sk); |
5366 | struct sctp_authkeyid val; | 5368 | struct sctp_authkeyid val; |
5367 | struct sctp_association *asoc; | 5369 | struct sctp_association *asoc; |
5368 | 5370 | ||
5369 | if (!net->sctp.auth_enable) | 5371 | if (!net->sctp.auth_enable) |
5370 | return -EACCES; | 5372 | return -EACCES; |
5371 | 5373 | ||
5372 | if (len < sizeof(struct sctp_authkeyid)) | 5374 | if (len < sizeof(struct sctp_authkeyid)) |
5373 | return -EINVAL; | 5375 | return -EINVAL; |
5374 | if (copy_from_user(&val, optval, sizeof(struct sctp_authkeyid))) | 5376 | if (copy_from_user(&val, optval, sizeof(struct sctp_authkeyid))) |
5375 | return -EFAULT; | 5377 | return -EFAULT; |
5376 | 5378 | ||
5377 | asoc = sctp_id2assoc(sk, val.scact_assoc_id); | 5379 | asoc = sctp_id2assoc(sk, val.scact_assoc_id); |
5378 | if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP)) | 5380 | if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP)) |
5379 | return -EINVAL; | 5381 | return -EINVAL; |
5380 | 5382 | ||
5381 | if (asoc) | 5383 | if (asoc) |
5382 | val.scact_keynumber = asoc->active_key_id; | 5384 | val.scact_keynumber = asoc->active_key_id; |
5383 | else | 5385 | else |
5384 | val.scact_keynumber = sctp_sk(sk)->ep->active_key_id; | 5386 | val.scact_keynumber = sctp_sk(sk)->ep->active_key_id; |
5385 | 5387 | ||
5386 | len = sizeof(struct sctp_authkeyid); | 5388 | len = sizeof(struct sctp_authkeyid); |
5387 | if (put_user(len, optlen)) | 5389 | if (put_user(len, optlen)) |
5388 | return -EFAULT; | 5390 | return -EFAULT; |
5389 | if (copy_to_user(optval, &val, len)) | 5391 | if (copy_to_user(optval, &val, len)) |
5390 | return -EFAULT; | 5392 | return -EFAULT; |
5391 | 5393 | ||
5392 | return 0; | 5394 | return 0; |
5393 | } | 5395 | } |
5394 | 5396 | ||
5395 | static int sctp_getsockopt_peer_auth_chunks(struct sock *sk, int len, | 5397 | static int sctp_getsockopt_peer_auth_chunks(struct sock *sk, int len, |
5396 | char __user *optval, int __user *optlen) | 5398 | char __user *optval, int __user *optlen) |
5397 | { | 5399 | { |
5398 | struct net *net = sock_net(sk); | 5400 | struct net *net = sock_net(sk); |
5399 | struct sctp_authchunks __user *p = (void __user *)optval; | 5401 | struct sctp_authchunks __user *p = (void __user *)optval; |
5400 | struct sctp_authchunks val; | 5402 | struct sctp_authchunks val; |
5401 | struct sctp_association *asoc; | 5403 | struct sctp_association *asoc; |
5402 | struct sctp_chunks_param *ch; | 5404 | struct sctp_chunks_param *ch; |
5403 | u32 num_chunks = 0; | 5405 | u32 num_chunks = 0; |
5404 | char __user *to; | 5406 | char __user *to; |
5405 | 5407 | ||
5406 | if (!net->sctp.auth_enable) | 5408 | if (!net->sctp.auth_enable) |
5407 | return -EACCES; | 5409 | return -EACCES; |
5408 | 5410 | ||
5409 | if (len < sizeof(struct sctp_authchunks)) | 5411 | if (len < sizeof(struct sctp_authchunks)) |
5410 | return -EINVAL; | 5412 | return -EINVAL; |
5411 | 5413 | ||
5412 | if (copy_from_user(&val, optval, sizeof(struct sctp_authchunks))) | 5414 | if (copy_from_user(&val, optval, sizeof(struct sctp_authchunks))) |
5413 | return -EFAULT; | 5415 | return -EFAULT; |
5414 | 5416 | ||
5415 | to = p->gauth_chunks; | 5417 | to = p->gauth_chunks; |
5416 | asoc = sctp_id2assoc(sk, val.gauth_assoc_id); | 5418 | asoc = sctp_id2assoc(sk, val.gauth_assoc_id); |
5417 | if (!asoc) | 5419 | if (!asoc) |
5418 | return -EINVAL; | 5420 | return -EINVAL; |
5419 | 5421 | ||
5420 | ch = asoc->peer.peer_chunks; | 5422 | ch = asoc->peer.peer_chunks; |
5421 | if (!ch) | 5423 | if (!ch) |
5422 | goto num; | 5424 | goto num; |
5423 | 5425 | ||
5424 | /* See if the user provided enough room for all the data */ | 5426 | /* See if the user provided enough room for all the data */ |
5425 | num_chunks = ntohs(ch->param_hdr.length) - sizeof(sctp_paramhdr_t); | 5427 | num_chunks = ntohs(ch->param_hdr.length) - sizeof(sctp_paramhdr_t); |
5426 | if (len < num_chunks) | 5428 | if (len < num_chunks) |
5427 | return -EINVAL; | 5429 | return -EINVAL; |
5428 | 5430 | ||
5429 | if (copy_to_user(to, ch->chunks, num_chunks)) | 5431 | if (copy_to_user(to, ch->chunks, num_chunks)) |
5430 | return -EFAULT; | 5432 | return -EFAULT; |
5431 | num: | 5433 | num: |
5432 | len = sizeof(struct sctp_authchunks) + num_chunks; | 5434 | len = sizeof(struct sctp_authchunks) + num_chunks; |
5433 | if (put_user(len, optlen)) return -EFAULT; | 5435 | if (put_user(len, optlen)) return -EFAULT; |
5434 | if (put_user(num_chunks, &p->gauth_number_of_chunks)) | 5436 | if (put_user(num_chunks, &p->gauth_number_of_chunks)) |
5435 | return -EFAULT; | 5437 | return -EFAULT; |
5436 | return 0; | 5438 | return 0; |
5437 | } | 5439 | } |
5438 | 5440 | ||
5439 | static int sctp_getsockopt_local_auth_chunks(struct sock *sk, int len, | 5441 | static int sctp_getsockopt_local_auth_chunks(struct sock *sk, int len, |
5440 | char __user *optval, int __user *optlen) | 5442 | char __user *optval, int __user *optlen) |
5441 | { | 5443 | { |
5442 | struct net *net = sock_net(sk); | 5444 | struct net *net = sock_net(sk); |
5443 | struct sctp_authchunks __user *p = (void __user *)optval; | 5445 | struct sctp_authchunks __user *p = (void __user *)optval; |
5444 | struct sctp_authchunks val; | 5446 | struct sctp_authchunks val; |
5445 | struct sctp_association *asoc; | 5447 | struct sctp_association *asoc; |
5446 | struct sctp_chunks_param *ch; | 5448 | struct sctp_chunks_param *ch; |
5447 | u32 num_chunks = 0; | 5449 | u32 num_chunks = 0; |
5448 | char __user *to; | 5450 | char __user *to; |
5449 | 5451 | ||
5450 | if (!net->sctp.auth_enable) | 5452 | if (!net->sctp.auth_enable) |
5451 | return -EACCES; | 5453 | return -EACCES; |
5452 | 5454 | ||
5453 | if (len < sizeof(struct sctp_authchunks)) | 5455 | if (len < sizeof(struct sctp_authchunks)) |
5454 | return -EINVAL; | 5456 | return -EINVAL; |
5455 | 5457 | ||
5456 | if (copy_from_user(&val, optval, sizeof(struct sctp_authchunks))) | 5458 | if (copy_from_user(&val, optval, sizeof(struct sctp_authchunks))) |
5457 | return -EFAULT; | 5459 | return -EFAULT; |
5458 | 5460 | ||
5459 | to = p->gauth_chunks; | 5461 | to = p->gauth_chunks; |
5460 | asoc = sctp_id2assoc(sk, val.gauth_assoc_id); | 5462 | asoc = sctp_id2assoc(sk, val.gauth_assoc_id); |
5461 | if (!asoc && val.gauth_assoc_id && sctp_style(sk, UDP)) | 5463 | if (!asoc && val.gauth_assoc_id && sctp_style(sk, UDP)) |
5462 | return -EINVAL; | 5464 | return -EINVAL; |
5463 | 5465 | ||
5464 | if (asoc) | 5466 | if (asoc) |
5465 | ch = (struct sctp_chunks_param*)asoc->c.auth_chunks; | 5467 | ch = (struct sctp_chunks_param*)asoc->c.auth_chunks; |
5466 | else | 5468 | else |
5467 | ch = sctp_sk(sk)->ep->auth_chunk_list; | 5469 | ch = sctp_sk(sk)->ep->auth_chunk_list; |
5468 | 5470 | ||
5469 | if (!ch) | 5471 | if (!ch) |
5470 | goto num; | 5472 | goto num; |
5471 | 5473 | ||
5472 | num_chunks = ntohs(ch->param_hdr.length) - sizeof(sctp_paramhdr_t); | 5474 | num_chunks = ntohs(ch->param_hdr.length) - sizeof(sctp_paramhdr_t); |
5473 | if (len < sizeof(struct sctp_authchunks) + num_chunks) | 5475 | if (len < sizeof(struct sctp_authchunks) + num_chunks) |
5474 | return -EINVAL; | 5476 | return -EINVAL; |
5475 | 5477 | ||
5476 | if (copy_to_user(to, ch->chunks, num_chunks)) | 5478 | if (copy_to_user(to, ch->chunks, num_chunks)) |
5477 | return -EFAULT; | 5479 | return -EFAULT; |
5478 | num: | 5480 | num: |
5479 | len = sizeof(struct sctp_authchunks) + num_chunks; | 5481 | len = sizeof(struct sctp_authchunks) + num_chunks; |
5480 | if (put_user(len, optlen)) | 5482 | if (put_user(len, optlen)) |
5481 | return -EFAULT; | 5483 | return -EFAULT; |
5482 | if (put_user(num_chunks, &p->gauth_number_of_chunks)) | 5484 | if (put_user(num_chunks, &p->gauth_number_of_chunks)) |
5483 | return -EFAULT; | 5485 | return -EFAULT; |
5484 | 5486 | ||
5485 | return 0; | 5487 | return 0; |
5486 | } | 5488 | } |
5487 | 5489 | ||
5488 | /* | 5490 | /* |
5489 | * 8.2.5. Get the Current Number of Associations (SCTP_GET_ASSOC_NUMBER) | 5491 | * 8.2.5. Get the Current Number of Associations (SCTP_GET_ASSOC_NUMBER) |
5490 | * This option gets the current number of associations that are attached | 5492 | * This option gets the current number of associations that are attached |
5491 | * to a one-to-many style socket. The option value is an uint32_t. | 5493 | * to a one-to-many style socket. The option value is an uint32_t. |
5492 | */ | 5494 | */ |
5493 | static int sctp_getsockopt_assoc_number(struct sock *sk, int len, | 5495 | static int sctp_getsockopt_assoc_number(struct sock *sk, int len, |
5494 | char __user *optval, int __user *optlen) | 5496 | char __user *optval, int __user *optlen) |
5495 | { | 5497 | { |
5496 | struct sctp_sock *sp = sctp_sk(sk); | 5498 | struct sctp_sock *sp = sctp_sk(sk); |
5497 | struct sctp_association *asoc; | 5499 | struct sctp_association *asoc; |
5498 | u32 val = 0; | 5500 | u32 val = 0; |
5499 | 5501 | ||
5500 | if (sctp_style(sk, TCP)) | 5502 | if (sctp_style(sk, TCP)) |
5501 | return -EOPNOTSUPP; | 5503 | return -EOPNOTSUPP; |
5502 | 5504 | ||
5503 | if (len < sizeof(u32)) | 5505 | if (len < sizeof(u32)) |
5504 | return -EINVAL; | 5506 | return -EINVAL; |
5505 | 5507 | ||
5506 | len = sizeof(u32); | 5508 | len = sizeof(u32); |
5507 | 5509 | ||
5508 | list_for_each_entry(asoc, &(sp->ep->asocs), asocs) { | 5510 | list_for_each_entry(asoc, &(sp->ep->asocs), asocs) { |
5509 | val++; | 5511 | val++; |
5510 | } | 5512 | } |
5511 | 5513 | ||
5512 | if (put_user(len, optlen)) | 5514 | if (put_user(len, optlen)) |
5513 | return -EFAULT; | 5515 | return -EFAULT; |
5514 | if (copy_to_user(optval, &val, len)) | 5516 | if (copy_to_user(optval, &val, len)) |
5515 | return -EFAULT; | 5517 | return -EFAULT; |
5516 | 5518 | ||
5517 | return 0; | 5519 | return 0; |
5518 | } | 5520 | } |
5519 | 5521 | ||
5520 | /* | 5522 | /* |
5521 | * 8.1.23 SCTP_AUTO_ASCONF | 5523 | * 8.1.23 SCTP_AUTO_ASCONF |
5522 | * See the corresponding setsockopt entry as description | 5524 | * See the corresponding setsockopt entry as description |
5523 | */ | 5525 | */ |
5524 | static int sctp_getsockopt_auto_asconf(struct sock *sk, int len, | 5526 | static int sctp_getsockopt_auto_asconf(struct sock *sk, int len, |
5525 | char __user *optval, int __user *optlen) | 5527 | char __user *optval, int __user *optlen) |
5526 | { | 5528 | { |
5527 | int val = 0; | 5529 | int val = 0; |
5528 | 5530 | ||
5529 | if (len < sizeof(int)) | 5531 | if (len < sizeof(int)) |
5530 | return -EINVAL; | 5532 | return -EINVAL; |
5531 | 5533 | ||
5532 | len = sizeof(int); | 5534 | len = sizeof(int); |
5533 | if (sctp_sk(sk)->do_auto_asconf && sctp_is_ep_boundall(sk)) | 5535 | if (sctp_sk(sk)->do_auto_asconf && sctp_is_ep_boundall(sk)) |
5534 | val = 1; | 5536 | val = 1; |
5535 | if (put_user(len, optlen)) | 5537 | if (put_user(len, optlen)) |
5536 | return -EFAULT; | 5538 | return -EFAULT; |
5537 | if (copy_to_user(optval, &val, len)) | 5539 | if (copy_to_user(optval, &val, len)) |
5538 | return -EFAULT; | 5540 | return -EFAULT; |
5539 | return 0; | 5541 | return 0; |
5540 | } | 5542 | } |
5541 | 5543 | ||
5542 | /* | 5544 | /* |
5543 | * 8.2.6. Get the Current Identifiers of Associations | 5545 | * 8.2.6. Get the Current Identifiers of Associations |
5544 | * (SCTP_GET_ASSOC_ID_LIST) | 5546 | * (SCTP_GET_ASSOC_ID_LIST) |
5545 | * | 5547 | * |
5546 | * This option gets the current list of SCTP association identifiers of | 5548 | * This option gets the current list of SCTP association identifiers of |
5547 | * the SCTP associations handled by a one-to-many style socket. | 5549 | * the SCTP associations handled by a one-to-many style socket. |
5548 | */ | 5550 | */ |
5549 | static int sctp_getsockopt_assoc_ids(struct sock *sk, int len, | 5551 | static int sctp_getsockopt_assoc_ids(struct sock *sk, int len, |
5550 | char __user *optval, int __user *optlen) | 5552 | char __user *optval, int __user *optlen) |
5551 | { | 5553 | { |
5552 | struct sctp_sock *sp = sctp_sk(sk); | 5554 | struct sctp_sock *sp = sctp_sk(sk); |
5553 | struct sctp_association *asoc; | 5555 | struct sctp_association *asoc; |
5554 | struct sctp_assoc_ids *ids; | 5556 | struct sctp_assoc_ids *ids; |
5555 | u32 num = 0; | 5557 | u32 num = 0; |
5556 | 5558 | ||
5557 | if (sctp_style(sk, TCP)) | 5559 | if (sctp_style(sk, TCP)) |
5558 | return -EOPNOTSUPP; | 5560 | return -EOPNOTSUPP; |
5559 | 5561 | ||
5560 | if (len < sizeof(struct sctp_assoc_ids)) | 5562 | if (len < sizeof(struct sctp_assoc_ids)) |
5561 | return -EINVAL; | 5563 | return -EINVAL; |
5562 | 5564 | ||
5563 | list_for_each_entry(asoc, &(sp->ep->asocs), asocs) { | 5565 | list_for_each_entry(asoc, &(sp->ep->asocs), asocs) { |
5564 | num++; | 5566 | num++; |
5565 | } | 5567 | } |
5566 | 5568 | ||
5567 | if (len < sizeof(struct sctp_assoc_ids) + sizeof(sctp_assoc_t) * num) | 5569 | if (len < sizeof(struct sctp_assoc_ids) + sizeof(sctp_assoc_t) * num) |
5568 | return -EINVAL; | 5570 | return -EINVAL; |
5569 | 5571 | ||
5570 | len = sizeof(struct sctp_assoc_ids) + sizeof(sctp_assoc_t) * num; | 5572 | len = sizeof(struct sctp_assoc_ids) + sizeof(sctp_assoc_t) * num; |
5571 | 5573 | ||
5572 | ids = kmalloc(len, GFP_KERNEL); | 5574 | ids = kmalloc(len, GFP_KERNEL); |
5573 | if (unlikely(!ids)) | 5575 | if (unlikely(!ids)) |
5574 | return -ENOMEM; | 5576 | return -ENOMEM; |
5575 | 5577 | ||
5576 | ids->gaids_number_of_ids = num; | 5578 | ids->gaids_number_of_ids = num; |
5577 | num = 0; | 5579 | num = 0; |
5578 | list_for_each_entry(asoc, &(sp->ep->asocs), asocs) { | 5580 | list_for_each_entry(asoc, &(sp->ep->asocs), asocs) { |
5579 | ids->gaids_assoc_id[num++] = asoc->assoc_id; | 5581 | ids->gaids_assoc_id[num++] = asoc->assoc_id; |
5580 | } | 5582 | } |
5581 | 5583 | ||
5582 | if (put_user(len, optlen) || copy_to_user(optval, ids, len)) { | 5584 | if (put_user(len, optlen) || copy_to_user(optval, ids, len)) { |
5583 | kfree(ids); | 5585 | kfree(ids); |
5584 | return -EFAULT; | 5586 | return -EFAULT; |
5585 | } | 5587 | } |
5586 | 5588 | ||
5587 | kfree(ids); | 5589 | kfree(ids); |
5588 | return 0; | 5590 | return 0; |
5589 | } | 5591 | } |
5590 | 5592 | ||
5591 | /* | 5593 | /* |
5592 | * SCTP_PEER_ADDR_THLDS | 5594 | * SCTP_PEER_ADDR_THLDS |
5593 | * | 5595 | * |
5594 | * This option allows us to fetch the partially failed threshold for one or all | 5596 | * This option allows us to fetch the partially failed threshold for one or all |
5595 | * transports in an association. See Section 6.1 of: | 5597 | * transports in an association. See Section 6.1 of: |
5596 | * http://www.ietf.org/id/draft-nishida-tsvwg-sctp-failover-05.txt | 5598 | * http://www.ietf.org/id/draft-nishida-tsvwg-sctp-failover-05.txt |
5597 | */ | 5599 | */ |
5598 | static int sctp_getsockopt_paddr_thresholds(struct sock *sk, | 5600 | static int sctp_getsockopt_paddr_thresholds(struct sock *sk, |
5599 | char __user *optval, | 5601 | char __user *optval, |
5600 | int len, | 5602 | int len, |
5601 | int __user *optlen) | 5603 | int __user *optlen) |
5602 | { | 5604 | { |
5603 | struct sctp_paddrthlds val; | 5605 | struct sctp_paddrthlds val; |
5604 | struct sctp_transport *trans; | 5606 | struct sctp_transport *trans; |
5605 | struct sctp_association *asoc; | 5607 | struct sctp_association *asoc; |
5606 | 5608 | ||
5607 | if (len < sizeof(struct sctp_paddrthlds)) | 5609 | if (len < sizeof(struct sctp_paddrthlds)) |
5608 | return -EINVAL; | 5610 | return -EINVAL; |
5609 | len = sizeof(struct sctp_paddrthlds); | 5611 | len = sizeof(struct sctp_paddrthlds); |
5610 | if (copy_from_user(&val, (struct sctp_paddrthlds __user *)optval, len)) | 5612 | if (copy_from_user(&val, (struct sctp_paddrthlds __user *)optval, len)) |
5611 | return -EFAULT; | 5613 | return -EFAULT; |
5612 | 5614 | ||
5613 | if (sctp_is_any(sk, (const union sctp_addr *)&val.spt_address)) { | 5615 | if (sctp_is_any(sk, (const union sctp_addr *)&val.spt_address)) { |
5614 | asoc = sctp_id2assoc(sk, val.spt_assoc_id); | 5616 | asoc = sctp_id2assoc(sk, val.spt_assoc_id); |
5615 | if (!asoc) | 5617 | if (!asoc) |
5616 | return -ENOENT; | 5618 | return -ENOENT; |
5617 | 5619 | ||
5618 | val.spt_pathpfthld = asoc->pf_retrans; | 5620 | val.spt_pathpfthld = asoc->pf_retrans; |
5619 | val.spt_pathmaxrxt = asoc->pathmaxrxt; | 5621 | val.spt_pathmaxrxt = asoc->pathmaxrxt; |
5620 | } else { | 5622 | } else { |
5621 | trans = sctp_addr_id2transport(sk, &val.spt_address, | 5623 | trans = sctp_addr_id2transport(sk, &val.spt_address, |
5622 | val.spt_assoc_id); | 5624 | val.spt_assoc_id); |
5623 | if (!trans) | 5625 | if (!trans) |
5624 | return -ENOENT; | 5626 | return -ENOENT; |
5625 | 5627 | ||
5626 | val.spt_pathmaxrxt = trans->pathmaxrxt; | 5628 | val.spt_pathmaxrxt = trans->pathmaxrxt; |
5627 | val.spt_pathpfthld = trans->pf_retrans; | 5629 | val.spt_pathpfthld = trans->pf_retrans; |
5628 | } | 5630 | } |
5629 | 5631 | ||
5630 | if (put_user(len, optlen) || copy_to_user(optval, &val, len)) | 5632 | if (put_user(len, optlen) || copy_to_user(optval, &val, len)) |
5631 | return -EFAULT; | 5633 | return -EFAULT; |
5632 | 5634 | ||
5633 | return 0; | 5635 | return 0; |
5634 | } | 5636 | } |
5635 | 5637 | ||
5636 | SCTP_STATIC int sctp_getsockopt(struct sock *sk, int level, int optname, | 5638 | SCTP_STATIC int sctp_getsockopt(struct sock *sk, int level, int optname, |
5637 | char __user *optval, int __user *optlen) | 5639 | char __user *optval, int __user *optlen) |
5638 | { | 5640 | { |
5639 | int retval = 0; | 5641 | int retval = 0; |
5640 | int len; | 5642 | int len; |
5641 | 5643 | ||
5642 | SCTP_DEBUG_PRINTK("sctp_getsockopt(sk: %p... optname: %d)\n", | 5644 | SCTP_DEBUG_PRINTK("sctp_getsockopt(sk: %p... optname: %d)\n", |
5643 | sk, optname); | 5645 | sk, optname); |
5644 | 5646 | ||
5645 | /* I can hardly begin to describe how wrong this is. This is | 5647 | /* I can hardly begin to describe how wrong this is. This is |
5646 | * so broken as to be worse than useless. The API draft | 5648 | * so broken as to be worse than useless. The API draft |
5647 | * REALLY is NOT helpful here... I am not convinced that the | 5649 | * REALLY is NOT helpful here... I am not convinced that the |
5648 | * semantics of getsockopt() with a level OTHER THAN SOL_SCTP | 5650 | * semantics of getsockopt() with a level OTHER THAN SOL_SCTP |
5649 | * are at all well-founded. | 5651 | * are at all well-founded. |
5650 | */ | 5652 | */ |
5651 | if (level != SOL_SCTP) { | 5653 | if (level != SOL_SCTP) { |
5652 | struct sctp_af *af = sctp_sk(sk)->pf->af; | 5654 | struct sctp_af *af = sctp_sk(sk)->pf->af; |
5653 | 5655 | ||
5654 | retval = af->getsockopt(sk, level, optname, optval, optlen); | 5656 | retval = af->getsockopt(sk, level, optname, optval, optlen); |
5655 | return retval; | 5657 | return retval; |
5656 | } | 5658 | } |
5657 | 5659 | ||
5658 | if (get_user(len, optlen)) | 5660 | if (get_user(len, optlen)) |
5659 | return -EFAULT; | 5661 | return -EFAULT; |
5660 | 5662 | ||
5661 | sctp_lock_sock(sk); | 5663 | sctp_lock_sock(sk); |
5662 | 5664 | ||
5663 | switch (optname) { | 5665 | switch (optname) { |
5664 | case SCTP_STATUS: | 5666 | case SCTP_STATUS: |
5665 | retval = sctp_getsockopt_sctp_status(sk, len, optval, optlen); | 5667 | retval = sctp_getsockopt_sctp_status(sk, len, optval, optlen); |
5666 | break; | 5668 | break; |
5667 | case SCTP_DISABLE_FRAGMENTS: | 5669 | case SCTP_DISABLE_FRAGMENTS: |
5668 | retval = sctp_getsockopt_disable_fragments(sk, len, optval, | 5670 | retval = sctp_getsockopt_disable_fragments(sk, len, optval, |
5669 | optlen); | 5671 | optlen); |
5670 | break; | 5672 | break; |
5671 | case SCTP_EVENTS: | 5673 | case SCTP_EVENTS: |
5672 | retval = sctp_getsockopt_events(sk, len, optval, optlen); | 5674 | retval = sctp_getsockopt_events(sk, len, optval, optlen); |
5673 | break; | 5675 | break; |
5674 | case SCTP_AUTOCLOSE: | 5676 | case SCTP_AUTOCLOSE: |
5675 | retval = sctp_getsockopt_autoclose(sk, len, optval, optlen); | 5677 | retval = sctp_getsockopt_autoclose(sk, len, optval, optlen); |
5676 | break; | 5678 | break; |
5677 | case SCTP_SOCKOPT_PEELOFF: | 5679 | case SCTP_SOCKOPT_PEELOFF: |
5678 | retval = sctp_getsockopt_peeloff(sk, len, optval, optlen); | 5680 | retval = sctp_getsockopt_peeloff(sk, len, optval, optlen); |
5679 | break; | 5681 | break; |
5680 | case SCTP_PEER_ADDR_PARAMS: | 5682 | case SCTP_PEER_ADDR_PARAMS: |
5681 | retval = sctp_getsockopt_peer_addr_params(sk, len, optval, | 5683 | retval = sctp_getsockopt_peer_addr_params(sk, len, optval, |
5682 | optlen); | 5684 | optlen); |
5683 | break; | 5685 | break; |
5684 | case SCTP_DELAYED_SACK: | 5686 | case SCTP_DELAYED_SACK: |
5685 | retval = sctp_getsockopt_delayed_ack(sk, len, optval, | 5687 | retval = sctp_getsockopt_delayed_ack(sk, len, optval, |
5686 | optlen); | 5688 | optlen); |
5687 | break; | 5689 | break; |
5688 | case SCTP_INITMSG: | 5690 | case SCTP_INITMSG: |
5689 | retval = sctp_getsockopt_initmsg(sk, len, optval, optlen); | 5691 | retval = sctp_getsockopt_initmsg(sk, len, optval, optlen); |
5690 | break; | 5692 | break; |
5691 | case SCTP_GET_PEER_ADDRS: | 5693 | case SCTP_GET_PEER_ADDRS: |
5692 | retval = sctp_getsockopt_peer_addrs(sk, len, optval, | 5694 | retval = sctp_getsockopt_peer_addrs(sk, len, optval, |
5693 | optlen); | 5695 | optlen); |
5694 | break; | 5696 | break; |
5695 | case SCTP_GET_LOCAL_ADDRS: | 5697 | case SCTP_GET_LOCAL_ADDRS: |
5696 | retval = sctp_getsockopt_local_addrs(sk, len, optval, | 5698 | retval = sctp_getsockopt_local_addrs(sk, len, optval, |
5697 | optlen); | 5699 | optlen); |
5698 | break; | 5700 | break; |
5699 | case SCTP_SOCKOPT_CONNECTX3: | 5701 | case SCTP_SOCKOPT_CONNECTX3: |
5700 | retval = sctp_getsockopt_connectx3(sk, len, optval, optlen); | 5702 | retval = sctp_getsockopt_connectx3(sk, len, optval, optlen); |
5701 | break; | 5703 | break; |
5702 | case SCTP_DEFAULT_SEND_PARAM: | 5704 | case SCTP_DEFAULT_SEND_PARAM: |
5703 | retval = sctp_getsockopt_default_send_param(sk, len, | 5705 | retval = sctp_getsockopt_default_send_param(sk, len, |
5704 | optval, optlen); | 5706 | optval, optlen); |
5705 | break; | 5707 | break; |
5706 | case SCTP_PRIMARY_ADDR: | 5708 | case SCTP_PRIMARY_ADDR: |
5707 | retval = sctp_getsockopt_primary_addr(sk, len, optval, optlen); | 5709 | retval = sctp_getsockopt_primary_addr(sk, len, optval, optlen); |
5708 | break; | 5710 | break; |
5709 | case SCTP_NODELAY: | 5711 | case SCTP_NODELAY: |
5710 | retval = sctp_getsockopt_nodelay(sk, len, optval, optlen); | 5712 | retval = sctp_getsockopt_nodelay(sk, len, optval, optlen); |
5711 | break; | 5713 | break; |
5712 | case SCTP_RTOINFO: | 5714 | case SCTP_RTOINFO: |
5713 | retval = sctp_getsockopt_rtoinfo(sk, len, optval, optlen); | 5715 | retval = sctp_getsockopt_rtoinfo(sk, len, optval, optlen); |
5714 | break; | 5716 | break; |
5715 | case SCTP_ASSOCINFO: | 5717 | case SCTP_ASSOCINFO: |
5716 | retval = sctp_getsockopt_associnfo(sk, len, optval, optlen); | 5718 | retval = sctp_getsockopt_associnfo(sk, len, optval, optlen); |
5717 | break; | 5719 | break; |
5718 | case SCTP_I_WANT_MAPPED_V4_ADDR: | 5720 | case SCTP_I_WANT_MAPPED_V4_ADDR: |
5719 | retval = sctp_getsockopt_mappedv4(sk, len, optval, optlen); | 5721 | retval = sctp_getsockopt_mappedv4(sk, len, optval, optlen); |
5720 | break; | 5722 | break; |
5721 | case SCTP_MAXSEG: | 5723 | case SCTP_MAXSEG: |
5722 | retval = sctp_getsockopt_maxseg(sk, len, optval, optlen); | 5724 | retval = sctp_getsockopt_maxseg(sk, len, optval, optlen); |
5723 | break; | 5725 | break; |
5724 | case SCTP_GET_PEER_ADDR_INFO: | 5726 | case SCTP_GET_PEER_ADDR_INFO: |
5725 | retval = sctp_getsockopt_peer_addr_info(sk, len, optval, | 5727 | retval = sctp_getsockopt_peer_addr_info(sk, len, optval, |
5726 | optlen); | 5728 | optlen); |
5727 | break; | 5729 | break; |
5728 | case SCTP_ADAPTATION_LAYER: | 5730 | case SCTP_ADAPTATION_LAYER: |
5729 | retval = sctp_getsockopt_adaptation_layer(sk, len, optval, | 5731 | retval = sctp_getsockopt_adaptation_layer(sk, len, optval, |
5730 | optlen); | 5732 | optlen); |
5731 | break; | 5733 | break; |
5732 | case SCTP_CONTEXT: | 5734 | case SCTP_CONTEXT: |
5733 | retval = sctp_getsockopt_context(sk, len, optval, optlen); | 5735 | retval = sctp_getsockopt_context(sk, len, optval, optlen); |
5734 | break; | 5736 | break; |
5735 | case SCTP_FRAGMENT_INTERLEAVE: | 5737 | case SCTP_FRAGMENT_INTERLEAVE: |
5736 | retval = sctp_getsockopt_fragment_interleave(sk, len, optval, | 5738 | retval = sctp_getsockopt_fragment_interleave(sk, len, optval, |
5737 | optlen); | 5739 | optlen); |
5738 | break; | 5740 | break; |
5739 | case SCTP_PARTIAL_DELIVERY_POINT: | 5741 | case SCTP_PARTIAL_DELIVERY_POINT: |
5740 | retval = sctp_getsockopt_partial_delivery_point(sk, len, optval, | 5742 | retval = sctp_getsockopt_partial_delivery_point(sk, len, optval, |
5741 | optlen); | 5743 | optlen); |
5742 | break; | 5744 | break; |
5743 | case SCTP_MAX_BURST: | 5745 | case SCTP_MAX_BURST: |
5744 | retval = sctp_getsockopt_maxburst(sk, len, optval, optlen); | 5746 | retval = sctp_getsockopt_maxburst(sk, len, optval, optlen); |
5745 | break; | 5747 | break; |
5746 | case SCTP_AUTH_KEY: | 5748 | case SCTP_AUTH_KEY: |
5747 | case SCTP_AUTH_CHUNK: | 5749 | case SCTP_AUTH_CHUNK: |
5748 | case SCTP_AUTH_DELETE_KEY: | 5750 | case SCTP_AUTH_DELETE_KEY: |
5749 | retval = -EOPNOTSUPP; | 5751 | retval = -EOPNOTSUPP; |
5750 | break; | 5752 | break; |
5751 | case SCTP_HMAC_IDENT: | 5753 | case SCTP_HMAC_IDENT: |
5752 | retval = sctp_getsockopt_hmac_ident(sk, len, optval, optlen); | 5754 | retval = sctp_getsockopt_hmac_ident(sk, len, optval, optlen); |
5753 | break; | 5755 | break; |
5754 | case SCTP_AUTH_ACTIVE_KEY: | 5756 | case SCTP_AUTH_ACTIVE_KEY: |
5755 | retval = sctp_getsockopt_active_key(sk, len, optval, optlen); | 5757 | retval = sctp_getsockopt_active_key(sk, len, optval, optlen); |
5756 | break; | 5758 | break; |
5757 | case SCTP_PEER_AUTH_CHUNKS: | 5759 | case SCTP_PEER_AUTH_CHUNKS: |
5758 | retval = sctp_getsockopt_peer_auth_chunks(sk, len, optval, | 5760 | retval = sctp_getsockopt_peer_auth_chunks(sk, len, optval, |
5759 | optlen); | 5761 | optlen); |
5760 | break; | 5762 | break; |
5761 | case SCTP_LOCAL_AUTH_CHUNKS: | 5763 | case SCTP_LOCAL_AUTH_CHUNKS: |
5762 | retval = sctp_getsockopt_local_auth_chunks(sk, len, optval, | 5764 | retval = sctp_getsockopt_local_auth_chunks(sk, len, optval, |
5763 | optlen); | 5765 | optlen); |
5764 | break; | 5766 | break; |
5765 | case SCTP_GET_ASSOC_NUMBER: | 5767 | case SCTP_GET_ASSOC_NUMBER: |
5766 | retval = sctp_getsockopt_assoc_number(sk, len, optval, optlen); | 5768 | retval = sctp_getsockopt_assoc_number(sk, len, optval, optlen); |
5767 | break; | 5769 | break; |
5768 | case SCTP_GET_ASSOC_ID_LIST: | 5770 | case SCTP_GET_ASSOC_ID_LIST: |
5769 | retval = sctp_getsockopt_assoc_ids(sk, len, optval, optlen); | 5771 | retval = sctp_getsockopt_assoc_ids(sk, len, optval, optlen); |
5770 | break; | 5772 | break; |
5771 | case SCTP_AUTO_ASCONF: | 5773 | case SCTP_AUTO_ASCONF: |
5772 | retval = sctp_getsockopt_auto_asconf(sk, len, optval, optlen); | 5774 | retval = sctp_getsockopt_auto_asconf(sk, len, optval, optlen); |
5773 | break; | 5775 | break; |
5774 | case SCTP_PEER_ADDR_THLDS: | 5776 | case SCTP_PEER_ADDR_THLDS: |
5775 | retval = sctp_getsockopt_paddr_thresholds(sk, optval, len, optlen); | 5777 | retval = sctp_getsockopt_paddr_thresholds(sk, optval, len, optlen); |
5776 | break; | 5778 | break; |
5777 | default: | 5779 | default: |
5778 | retval = -ENOPROTOOPT; | 5780 | retval = -ENOPROTOOPT; |
5779 | break; | 5781 | break; |
5780 | } | 5782 | } |
5781 | 5783 | ||
5782 | sctp_release_sock(sk); | 5784 | sctp_release_sock(sk); |
5783 | return retval; | 5785 | return retval; |
5784 | } | 5786 | } |
5785 | 5787 | ||
5786 | static void sctp_hash(struct sock *sk) | 5788 | static void sctp_hash(struct sock *sk) |
5787 | { | 5789 | { |
5788 | /* STUB */ | 5790 | /* STUB */ |
5789 | } | 5791 | } |
5790 | 5792 | ||
5791 | static void sctp_unhash(struct sock *sk) | 5793 | static void sctp_unhash(struct sock *sk) |
5792 | { | 5794 | { |
5793 | /* STUB */ | 5795 | /* STUB */ |
5794 | } | 5796 | } |
5795 | 5797 | ||
5796 | /* Check if port is acceptable. Possibly find first available port. | 5798 | /* Check if port is acceptable. Possibly find first available port. |
5797 | * | 5799 | * |
5798 | * The port hash table (contained in the 'global' SCTP protocol storage | 5800 | * The port hash table (contained in the 'global' SCTP protocol storage |
5799 | * returned by struct sctp_protocol *sctp_get_protocol()). The hash | 5801 | * returned by struct sctp_protocol *sctp_get_protocol()). The hash |
5800 | * table is an array of 4096 lists (sctp_bind_hashbucket). Each | 5802 | * table is an array of 4096 lists (sctp_bind_hashbucket). Each |
5801 | * list (the list number is the port number hashed out, so as you | 5803 | * list (the list number is the port number hashed out, so as you |
5802 | * would expect from a hash function, all the ports in a given list have | 5804 | * would expect from a hash function, all the ports in a given list have |
5803 | * such a number that hashes out to the same list number; you were | 5805 | * such a number that hashes out to the same list number; you were |
5804 | * expecting that, right?); so each list has a set of ports, with a | 5806 | * expecting that, right?); so each list has a set of ports, with a |
5805 | * link to the socket (struct sock) that uses it, the port number and | 5807 | * link to the socket (struct sock) that uses it, the port number and |
5806 | * a fastreuse flag (FIXME: NPI ipg). | 5808 | * a fastreuse flag (FIXME: NPI ipg). |
5807 | */ | 5809 | */ |
5808 | static struct sctp_bind_bucket *sctp_bucket_create( | 5810 | static struct sctp_bind_bucket *sctp_bucket_create( |
5809 | struct sctp_bind_hashbucket *head, struct net *, unsigned short snum); | 5811 | struct sctp_bind_hashbucket *head, struct net *, unsigned short snum); |
5810 | 5812 | ||
5811 | static long sctp_get_port_local(struct sock *sk, union sctp_addr *addr) | 5813 | static long sctp_get_port_local(struct sock *sk, union sctp_addr *addr) |
5812 | { | 5814 | { |
5813 | struct sctp_bind_hashbucket *head; /* hash list */ | 5815 | struct sctp_bind_hashbucket *head; /* hash list */ |
5814 | struct sctp_bind_bucket *pp; /* hash list port iterator */ | 5816 | struct sctp_bind_bucket *pp; /* hash list port iterator */ |
5815 | struct hlist_node *node; | 5817 | struct hlist_node *node; |
5816 | unsigned short snum; | 5818 | unsigned short snum; |
5817 | int ret; | 5819 | int ret; |
5818 | 5820 | ||
5819 | snum = ntohs(addr->v4.sin_port); | 5821 | snum = ntohs(addr->v4.sin_port); |
5820 | 5822 | ||
5821 | SCTP_DEBUG_PRINTK("sctp_get_port() begins, snum=%d\n", snum); | 5823 | SCTP_DEBUG_PRINTK("sctp_get_port() begins, snum=%d\n", snum); |
5822 | sctp_local_bh_disable(); | 5824 | sctp_local_bh_disable(); |
5823 | 5825 | ||
5824 | if (snum == 0) { | 5826 | if (snum == 0) { |
5825 | /* Search for an available port. */ | 5827 | /* Search for an available port. */ |
5826 | int low, high, remaining, index; | 5828 | int low, high, remaining, index; |
5827 | unsigned int rover; | 5829 | unsigned int rover; |
5828 | 5830 | ||
5829 | inet_get_local_port_range(&low, &high); | 5831 | inet_get_local_port_range(&low, &high); |
5830 | remaining = (high - low) + 1; | 5832 | remaining = (high - low) + 1; |
5831 | rover = net_random() % remaining + low; | 5833 | rover = net_random() % remaining + low; |
5832 | 5834 | ||
5833 | do { | 5835 | do { |
5834 | rover++; | 5836 | rover++; |
5835 | if ((rover < low) || (rover > high)) | 5837 | if ((rover < low) || (rover > high)) |
5836 | rover = low; | 5838 | rover = low; |
5837 | if (inet_is_reserved_local_port(rover)) | 5839 | if (inet_is_reserved_local_port(rover)) |
5838 | continue; | 5840 | continue; |
5839 | index = sctp_phashfn(sock_net(sk), rover); | 5841 | index = sctp_phashfn(sock_net(sk), rover); |
5840 | head = &sctp_port_hashtable[index]; | 5842 | head = &sctp_port_hashtable[index]; |
5841 | sctp_spin_lock(&head->lock); | 5843 | sctp_spin_lock(&head->lock); |
5842 | sctp_for_each_hentry(pp, node, &head->chain) | 5844 | sctp_for_each_hentry(pp, node, &head->chain) |
5843 | if ((pp->port == rover) && | 5845 | if ((pp->port == rover) && |
5844 | net_eq(sock_net(sk), pp->net)) | 5846 | net_eq(sock_net(sk), pp->net)) |
5845 | goto next; | 5847 | goto next; |
5846 | break; | 5848 | break; |
5847 | next: | 5849 | next: |
5848 | sctp_spin_unlock(&head->lock); | 5850 | sctp_spin_unlock(&head->lock); |
5849 | } while (--remaining > 0); | 5851 | } while (--remaining > 0); |
5850 | 5852 | ||
5851 | /* Exhausted local port range during search? */ | 5853 | /* Exhausted local port range during search? */ |
5852 | ret = 1; | 5854 | ret = 1; |
5853 | if (remaining <= 0) | 5855 | if (remaining <= 0) |
5854 | goto fail; | 5856 | goto fail; |
5855 | 5857 | ||
5856 | /* OK, here is the one we will use. HEAD (the port | 5858 | /* OK, here is the one we will use. HEAD (the port |
5857 | * hash table list entry) is non-NULL and we hold it's | 5859 | * hash table list entry) is non-NULL and we hold it's |
5858 | * mutex. | 5860 | * mutex. |
5859 | */ | 5861 | */ |
5860 | snum = rover; | 5862 | snum = rover; |
5861 | } else { | 5863 | } else { |
5862 | /* We are given an specific port number; we verify | 5864 | /* We are given an specific port number; we verify |
5863 | * that it is not being used. If it is used, we will | 5865 | * that it is not being used. If it is used, we will |
5864 | * exahust the search in the hash list corresponding | 5866 | * exahust the search in the hash list corresponding |
5865 | * to the port number (snum) - we detect that with the | 5867 | * to the port number (snum) - we detect that with the |
5866 | * port iterator, pp being NULL. | 5868 | * port iterator, pp being NULL. |
5867 | */ | 5869 | */ |
5868 | head = &sctp_port_hashtable[sctp_phashfn(sock_net(sk), snum)]; | 5870 | head = &sctp_port_hashtable[sctp_phashfn(sock_net(sk), snum)]; |
5869 | sctp_spin_lock(&head->lock); | 5871 | sctp_spin_lock(&head->lock); |
5870 | sctp_for_each_hentry(pp, node, &head->chain) { | 5872 | sctp_for_each_hentry(pp, node, &head->chain) { |
5871 | if ((pp->port == snum) && net_eq(pp->net, sock_net(sk))) | 5873 | if ((pp->port == snum) && net_eq(pp->net, sock_net(sk))) |
5872 | goto pp_found; | 5874 | goto pp_found; |
5873 | } | 5875 | } |
5874 | } | 5876 | } |
5875 | pp = NULL; | 5877 | pp = NULL; |
5876 | goto pp_not_found; | 5878 | goto pp_not_found; |
5877 | pp_found: | 5879 | pp_found: |
5878 | if (!hlist_empty(&pp->owner)) { | 5880 | if (!hlist_empty(&pp->owner)) { |
5879 | /* We had a port hash table hit - there is an | 5881 | /* We had a port hash table hit - there is an |
5880 | * available port (pp != NULL) and it is being | 5882 | * available port (pp != NULL) and it is being |
5881 | * used by other socket (pp->owner not empty); that other | 5883 | * used by other socket (pp->owner not empty); that other |
5882 | * socket is going to be sk2. | 5884 | * socket is going to be sk2. |
5883 | */ | 5885 | */ |
5884 | int reuse = sk->sk_reuse; | 5886 | int reuse = sk->sk_reuse; |
5885 | struct sock *sk2; | 5887 | struct sock *sk2; |
5886 | 5888 | ||
5887 | SCTP_DEBUG_PRINTK("sctp_get_port() found a possible match\n"); | 5889 | SCTP_DEBUG_PRINTK("sctp_get_port() found a possible match\n"); |
5888 | if (pp->fastreuse && sk->sk_reuse && | 5890 | if (pp->fastreuse && sk->sk_reuse && |
5889 | sk->sk_state != SCTP_SS_LISTENING) | 5891 | sk->sk_state != SCTP_SS_LISTENING) |
5890 | goto success; | 5892 | goto success; |
5891 | 5893 | ||
5892 | /* Run through the list of sockets bound to the port | 5894 | /* Run through the list of sockets bound to the port |
5893 | * (pp->port) [via the pointers bind_next and | 5895 | * (pp->port) [via the pointers bind_next and |
5894 | * bind_pprev in the struct sock *sk2 (pp->sk)]. On each one, | 5896 | * bind_pprev in the struct sock *sk2 (pp->sk)]. On each one, |
5895 | * we get the endpoint they describe and run through | 5897 | * we get the endpoint they describe and run through |
5896 | * the endpoint's list of IP (v4 or v6) addresses, | 5898 | * the endpoint's list of IP (v4 or v6) addresses, |
5897 | * comparing each of the addresses with the address of | 5899 | * comparing each of the addresses with the address of |
5898 | * the socket sk. If we find a match, then that means | 5900 | * the socket sk. If we find a match, then that means |
5899 | * that this port/socket (sk) combination are already | 5901 | * that this port/socket (sk) combination are already |
5900 | * in an endpoint. | 5902 | * in an endpoint. |
5901 | */ | 5903 | */ |
5902 | sk_for_each_bound(sk2, node, &pp->owner) { | 5904 | sk_for_each_bound(sk2, node, &pp->owner) { |
5903 | struct sctp_endpoint *ep2; | 5905 | struct sctp_endpoint *ep2; |
5904 | ep2 = sctp_sk(sk2)->ep; | 5906 | ep2 = sctp_sk(sk2)->ep; |
5905 | 5907 | ||
5906 | if (sk == sk2 || | 5908 | if (sk == sk2 || |
5907 | (reuse && sk2->sk_reuse && | 5909 | (reuse && sk2->sk_reuse && |
5908 | sk2->sk_state != SCTP_SS_LISTENING)) | 5910 | sk2->sk_state != SCTP_SS_LISTENING)) |
5909 | continue; | 5911 | continue; |
5910 | 5912 | ||
5911 | if (sctp_bind_addr_conflict(&ep2->base.bind_addr, addr, | 5913 | if (sctp_bind_addr_conflict(&ep2->base.bind_addr, addr, |
5912 | sctp_sk(sk2), sctp_sk(sk))) { | 5914 | sctp_sk(sk2), sctp_sk(sk))) { |
5913 | ret = (long)sk2; | 5915 | ret = (long)sk2; |
5914 | goto fail_unlock; | 5916 | goto fail_unlock; |
5915 | } | 5917 | } |
5916 | } | 5918 | } |
5917 | SCTP_DEBUG_PRINTK("sctp_get_port(): Found a match\n"); | 5919 | SCTP_DEBUG_PRINTK("sctp_get_port(): Found a match\n"); |
5918 | } | 5920 | } |
5919 | pp_not_found: | 5921 | pp_not_found: |
5920 | /* If there was a hash table miss, create a new port. */ | 5922 | /* If there was a hash table miss, create a new port. */ |
5921 | ret = 1; | 5923 | ret = 1; |
5922 | if (!pp && !(pp = sctp_bucket_create(head, sock_net(sk), snum))) | 5924 | if (!pp && !(pp = sctp_bucket_create(head, sock_net(sk), snum))) |
5923 | goto fail_unlock; | 5925 | goto fail_unlock; |
5924 | 5926 | ||
5925 | /* In either case (hit or miss), make sure fastreuse is 1 only | 5927 | /* In either case (hit or miss), make sure fastreuse is 1 only |
5926 | * if sk->sk_reuse is too (that is, if the caller requested | 5928 | * if sk->sk_reuse is too (that is, if the caller requested |
5927 | * SO_REUSEADDR on this socket -sk-). | 5929 | * SO_REUSEADDR on this socket -sk-). |
5928 | */ | 5930 | */ |
5929 | if (hlist_empty(&pp->owner)) { | 5931 | if (hlist_empty(&pp->owner)) { |
5930 | if (sk->sk_reuse && sk->sk_state != SCTP_SS_LISTENING) | 5932 | if (sk->sk_reuse && sk->sk_state != SCTP_SS_LISTENING) |
5931 | pp->fastreuse = 1; | 5933 | pp->fastreuse = 1; |
5932 | else | 5934 | else |
5933 | pp->fastreuse = 0; | 5935 | pp->fastreuse = 0; |
5934 | } else if (pp->fastreuse && | 5936 | } else if (pp->fastreuse && |
5935 | (!sk->sk_reuse || sk->sk_state == SCTP_SS_LISTENING)) | 5937 | (!sk->sk_reuse || sk->sk_state == SCTP_SS_LISTENING)) |
5936 | pp->fastreuse = 0; | 5938 | pp->fastreuse = 0; |
5937 | 5939 | ||
5938 | /* We are set, so fill up all the data in the hash table | 5940 | /* We are set, so fill up all the data in the hash table |
5939 | * entry, tie the socket list information with the rest of the | 5941 | * entry, tie the socket list information with the rest of the |
5940 | * sockets FIXME: Blurry, NPI (ipg). | 5942 | * sockets FIXME: Blurry, NPI (ipg). |
5941 | */ | 5943 | */ |
5942 | success: | 5944 | success: |
5943 | if (!sctp_sk(sk)->bind_hash) { | 5945 | if (!sctp_sk(sk)->bind_hash) { |
5944 | inet_sk(sk)->inet_num = snum; | 5946 | inet_sk(sk)->inet_num = snum; |
5945 | sk_add_bind_node(sk, &pp->owner); | 5947 | sk_add_bind_node(sk, &pp->owner); |
5946 | sctp_sk(sk)->bind_hash = pp; | 5948 | sctp_sk(sk)->bind_hash = pp; |
5947 | } | 5949 | } |
5948 | ret = 0; | 5950 | ret = 0; |
5949 | 5951 | ||
5950 | fail_unlock: | 5952 | fail_unlock: |
5951 | sctp_spin_unlock(&head->lock); | 5953 | sctp_spin_unlock(&head->lock); |
5952 | 5954 | ||
5953 | fail: | 5955 | fail: |
5954 | sctp_local_bh_enable(); | 5956 | sctp_local_bh_enable(); |
5955 | return ret; | 5957 | return ret; |
5956 | } | 5958 | } |
5957 | 5959 | ||
5958 | /* Assign a 'snum' port to the socket. If snum == 0, an ephemeral | 5960 | /* Assign a 'snum' port to the socket. If snum == 0, an ephemeral |
5959 | * port is requested. | 5961 | * port is requested. |
5960 | */ | 5962 | */ |
5961 | static int sctp_get_port(struct sock *sk, unsigned short snum) | 5963 | static int sctp_get_port(struct sock *sk, unsigned short snum) |
5962 | { | 5964 | { |
5963 | long ret; | 5965 | long ret; |
5964 | union sctp_addr addr; | 5966 | union sctp_addr addr; |
5965 | struct sctp_af *af = sctp_sk(sk)->pf->af; | 5967 | struct sctp_af *af = sctp_sk(sk)->pf->af; |
5966 | 5968 | ||
5967 | /* Set up a dummy address struct from the sk. */ | 5969 | /* Set up a dummy address struct from the sk. */ |
5968 | af->from_sk(&addr, sk); | 5970 | af->from_sk(&addr, sk); |
5969 | addr.v4.sin_port = htons(snum); | 5971 | addr.v4.sin_port = htons(snum); |
5970 | 5972 | ||
5971 | /* Note: sk->sk_num gets filled in if ephemeral port request. */ | 5973 | /* Note: sk->sk_num gets filled in if ephemeral port request. */ |
5972 | ret = sctp_get_port_local(sk, &addr); | 5974 | ret = sctp_get_port_local(sk, &addr); |
5973 | 5975 | ||
5974 | return ret ? 1 : 0; | 5976 | return ret ? 1 : 0; |
5975 | } | 5977 | } |
5976 | 5978 | ||
5977 | /* | 5979 | /* |
5978 | * Move a socket to LISTENING state. | 5980 | * Move a socket to LISTENING state. |
5979 | */ | 5981 | */ |
5980 | SCTP_STATIC int sctp_listen_start(struct sock *sk, int backlog) | 5982 | SCTP_STATIC int sctp_listen_start(struct sock *sk, int backlog) |
5981 | { | 5983 | { |
5982 | struct sctp_sock *sp = sctp_sk(sk); | 5984 | struct sctp_sock *sp = sctp_sk(sk); |
5983 | struct sctp_endpoint *ep = sp->ep; | 5985 | struct sctp_endpoint *ep = sp->ep; |
5984 | struct crypto_hash *tfm = NULL; | 5986 | struct crypto_hash *tfm = NULL; |
5985 | char alg[32]; | 5987 | char alg[32]; |
5986 | 5988 | ||
5987 | /* Allocate HMAC for generating cookie. */ | 5989 | /* Allocate HMAC for generating cookie. */ |
5988 | if (!sp->hmac && sp->sctp_hmac_alg) { | 5990 | if (!sp->hmac && sp->sctp_hmac_alg) { |
5989 | sprintf(alg, "hmac(%s)", sp->sctp_hmac_alg); | 5991 | sprintf(alg, "hmac(%s)", sp->sctp_hmac_alg); |
5990 | tfm = crypto_alloc_hash(alg, 0, CRYPTO_ALG_ASYNC); | 5992 | tfm = crypto_alloc_hash(alg, 0, CRYPTO_ALG_ASYNC); |
5991 | if (IS_ERR(tfm)) { | 5993 | if (IS_ERR(tfm)) { |
5992 | net_info_ratelimited("failed to load transform for %s: %ld\n", | 5994 | net_info_ratelimited("failed to load transform for %s: %ld\n", |
5993 | sp->sctp_hmac_alg, PTR_ERR(tfm)); | 5995 | sp->sctp_hmac_alg, PTR_ERR(tfm)); |
5994 | return -ENOSYS; | 5996 | return -ENOSYS; |
5995 | } | 5997 | } |
5996 | sctp_sk(sk)->hmac = tfm; | 5998 | sctp_sk(sk)->hmac = tfm; |
5997 | } | 5999 | } |
5998 | 6000 | ||
5999 | /* | 6001 | /* |
6000 | * If a bind() or sctp_bindx() is not called prior to a listen() | 6002 | * If a bind() or sctp_bindx() is not called prior to a listen() |
6001 | * call that allows new associations to be accepted, the system | 6003 | * call that allows new associations to be accepted, the system |
6002 | * picks an ephemeral port and will choose an address set equivalent | 6004 | * picks an ephemeral port and will choose an address set equivalent |
6003 | * to binding with a wildcard address. | 6005 | * to binding with a wildcard address. |
6004 | * | 6006 | * |
6005 | * This is not currently spelled out in the SCTP sockets | 6007 | * This is not currently spelled out in the SCTP sockets |
6006 | * extensions draft, but follows the practice as seen in TCP | 6008 | * extensions draft, but follows the practice as seen in TCP |
6007 | * sockets. | 6009 | * sockets. |
6008 | * | 6010 | * |
6009 | */ | 6011 | */ |
6010 | sk->sk_state = SCTP_SS_LISTENING; | 6012 | sk->sk_state = SCTP_SS_LISTENING; |
6011 | if (!ep->base.bind_addr.port) { | 6013 | if (!ep->base.bind_addr.port) { |
6012 | if (sctp_autobind(sk)) | 6014 | if (sctp_autobind(sk)) |
6013 | return -EAGAIN; | 6015 | return -EAGAIN; |
6014 | } else { | 6016 | } else { |
6015 | if (sctp_get_port(sk, inet_sk(sk)->inet_num)) { | 6017 | if (sctp_get_port(sk, inet_sk(sk)->inet_num)) { |
6016 | sk->sk_state = SCTP_SS_CLOSED; | 6018 | sk->sk_state = SCTP_SS_CLOSED; |
6017 | return -EADDRINUSE; | 6019 | return -EADDRINUSE; |
6018 | } | 6020 | } |
6019 | } | 6021 | } |
6020 | 6022 | ||
6021 | sk->sk_max_ack_backlog = backlog; | 6023 | sk->sk_max_ack_backlog = backlog; |
6022 | sctp_hash_endpoint(ep); | 6024 | sctp_hash_endpoint(ep); |
6023 | return 0; | 6025 | return 0; |
6024 | } | 6026 | } |
6025 | 6027 | ||
6026 | /* | 6028 | /* |
6027 | * 4.1.3 / 5.1.3 listen() | 6029 | * 4.1.3 / 5.1.3 listen() |
6028 | * | 6030 | * |
6029 | * By default, new associations are not accepted for UDP style sockets. | 6031 | * By default, new associations are not accepted for UDP style sockets. |
6030 | * An application uses listen() to mark a socket as being able to | 6032 | * An application uses listen() to mark a socket as being able to |
6031 | * accept new associations. | 6033 | * accept new associations. |
6032 | * | 6034 | * |
6033 | * On TCP style sockets, applications use listen() to ready the SCTP | 6035 | * On TCP style sockets, applications use listen() to ready the SCTP |
6034 | * endpoint for accepting inbound associations. | 6036 | * endpoint for accepting inbound associations. |
6035 | * | 6037 | * |
6036 | * On both types of endpoints a backlog of '0' disables listening. | 6038 | * On both types of endpoints a backlog of '0' disables listening. |
6037 | * | 6039 | * |
6038 | * Move a socket to LISTENING state. | 6040 | * Move a socket to LISTENING state. |
6039 | */ | 6041 | */ |
6040 | int sctp_inet_listen(struct socket *sock, int backlog) | 6042 | int sctp_inet_listen(struct socket *sock, int backlog) |
6041 | { | 6043 | { |
6042 | struct sock *sk = sock->sk; | 6044 | struct sock *sk = sock->sk; |
6043 | struct sctp_endpoint *ep = sctp_sk(sk)->ep; | 6045 | struct sctp_endpoint *ep = sctp_sk(sk)->ep; |
6044 | int err = -EINVAL; | 6046 | int err = -EINVAL; |
6045 | 6047 | ||
6046 | if (unlikely(backlog < 0)) | 6048 | if (unlikely(backlog < 0)) |
6047 | return err; | 6049 | return err; |
6048 | 6050 | ||
6049 | sctp_lock_sock(sk); | 6051 | sctp_lock_sock(sk); |
6050 | 6052 | ||
6051 | /* Peeled-off sockets are not allowed to listen(). */ | 6053 | /* Peeled-off sockets are not allowed to listen(). */ |
6052 | if (sctp_style(sk, UDP_HIGH_BANDWIDTH)) | 6054 | if (sctp_style(sk, UDP_HIGH_BANDWIDTH)) |
6053 | goto out; | 6055 | goto out; |
6054 | 6056 | ||
6055 | if (sock->state != SS_UNCONNECTED) | 6057 | if (sock->state != SS_UNCONNECTED) |
6056 | goto out; | 6058 | goto out; |
6057 | 6059 | ||
6058 | /* If backlog is zero, disable listening. */ | 6060 | /* If backlog is zero, disable listening. */ |
6059 | if (!backlog) { | 6061 | if (!backlog) { |
6060 | if (sctp_sstate(sk, CLOSED)) | 6062 | if (sctp_sstate(sk, CLOSED)) |
6061 | goto out; | 6063 | goto out; |
6062 | 6064 | ||
6063 | err = 0; | 6065 | err = 0; |
6064 | sctp_unhash_endpoint(ep); | 6066 | sctp_unhash_endpoint(ep); |
6065 | sk->sk_state = SCTP_SS_CLOSED; | 6067 | sk->sk_state = SCTP_SS_CLOSED; |
6066 | if (sk->sk_reuse) | 6068 | if (sk->sk_reuse) |
6067 | sctp_sk(sk)->bind_hash->fastreuse = 1; | 6069 | sctp_sk(sk)->bind_hash->fastreuse = 1; |
6068 | goto out; | 6070 | goto out; |
6069 | } | 6071 | } |
6070 | 6072 | ||
6071 | /* If we are already listening, just update the backlog */ | 6073 | /* If we are already listening, just update the backlog */ |
6072 | if (sctp_sstate(sk, LISTENING)) | 6074 | if (sctp_sstate(sk, LISTENING)) |
6073 | sk->sk_max_ack_backlog = backlog; | 6075 | sk->sk_max_ack_backlog = backlog; |
6074 | else { | 6076 | else { |
6075 | err = sctp_listen_start(sk, backlog); | 6077 | err = sctp_listen_start(sk, backlog); |
6076 | if (err) | 6078 | if (err) |
6077 | goto out; | 6079 | goto out; |
6078 | } | 6080 | } |
6079 | 6081 | ||
6080 | err = 0; | 6082 | err = 0; |
6081 | out: | 6083 | out: |
6082 | sctp_release_sock(sk); | 6084 | sctp_release_sock(sk); |
6083 | return err; | 6085 | return err; |
6084 | } | 6086 | } |
6085 | 6087 | ||
6086 | /* | 6088 | /* |
6087 | * This function is done by modeling the current datagram_poll() and the | 6089 | * This function is done by modeling the current datagram_poll() and the |
6088 | * tcp_poll(). Note that, based on these implementations, we don't | 6090 | * tcp_poll(). Note that, based on these implementations, we don't |
6089 | * lock the socket in this function, even though it seems that, | 6091 | * lock the socket in this function, even though it seems that, |
6090 | * ideally, locking or some other mechanisms can be used to ensure | 6092 | * ideally, locking or some other mechanisms can be used to ensure |
6091 | * the integrity of the counters (sndbuf and wmem_alloc) used | 6093 | * the integrity of the counters (sndbuf and wmem_alloc) used |
6092 | * in this place. We assume that we don't need locks either until proven | 6094 | * in this place. We assume that we don't need locks either until proven |
6093 | * otherwise. | 6095 | * otherwise. |
6094 | * | 6096 | * |
6095 | * Another thing to note is that we include the Async I/O support | 6097 | * Another thing to note is that we include the Async I/O support |
6096 | * here, again, by modeling the current TCP/UDP code. We don't have | 6098 | * here, again, by modeling the current TCP/UDP code. We don't have |
6097 | * a good way to test with it yet. | 6099 | * a good way to test with it yet. |
6098 | */ | 6100 | */ |
6099 | unsigned int sctp_poll(struct file *file, struct socket *sock, poll_table *wait) | 6101 | unsigned int sctp_poll(struct file *file, struct socket *sock, poll_table *wait) |
6100 | { | 6102 | { |
6101 | struct sock *sk = sock->sk; | 6103 | struct sock *sk = sock->sk; |
6102 | struct sctp_sock *sp = sctp_sk(sk); | 6104 | struct sctp_sock *sp = sctp_sk(sk); |
6103 | unsigned int mask; | 6105 | unsigned int mask; |
6104 | 6106 | ||
6105 | poll_wait(file, sk_sleep(sk), wait); | 6107 | poll_wait(file, sk_sleep(sk), wait); |
6106 | 6108 | ||
6107 | /* A TCP-style listening socket becomes readable when the accept queue | 6109 | /* A TCP-style listening socket becomes readable when the accept queue |
6108 | * is not empty. | 6110 | * is not empty. |
6109 | */ | 6111 | */ |
6110 | if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING)) | 6112 | if (sctp_style(sk, TCP) && sctp_sstate(sk, LISTENING)) |
6111 | return (!list_empty(&sp->ep->asocs)) ? | 6113 | return (!list_empty(&sp->ep->asocs)) ? |
6112 | (POLLIN | POLLRDNORM) : 0; | 6114 | (POLLIN | POLLRDNORM) : 0; |
6113 | 6115 | ||
6114 | mask = 0; | 6116 | mask = 0; |
6115 | 6117 | ||
6116 | /* Is there any exceptional events? */ | 6118 | /* Is there any exceptional events? */ |
6117 | if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue)) | 6119 | if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue)) |
6118 | mask |= POLLERR; | 6120 | mask |= POLLERR; |
6119 | if (sk->sk_shutdown & RCV_SHUTDOWN) | 6121 | if (sk->sk_shutdown & RCV_SHUTDOWN) |
6120 | mask |= POLLRDHUP | POLLIN | POLLRDNORM; | 6122 | mask |= POLLRDHUP | POLLIN | POLLRDNORM; |
6121 | if (sk->sk_shutdown == SHUTDOWN_MASK) | 6123 | if (sk->sk_shutdown == SHUTDOWN_MASK) |
6122 | mask |= POLLHUP; | 6124 | mask |= POLLHUP; |
6123 | 6125 | ||
6124 | /* Is it readable? Reconsider this code with TCP-style support. */ | 6126 | /* Is it readable? Reconsider this code with TCP-style support. */ |
6125 | if (!skb_queue_empty(&sk->sk_receive_queue)) | 6127 | if (!skb_queue_empty(&sk->sk_receive_queue)) |
6126 | mask |= POLLIN | POLLRDNORM; | 6128 | mask |= POLLIN | POLLRDNORM; |
6127 | 6129 | ||
6128 | /* The association is either gone or not ready. */ | 6130 | /* The association is either gone or not ready. */ |
6129 | if (!sctp_style(sk, UDP) && sctp_sstate(sk, CLOSED)) | 6131 | if (!sctp_style(sk, UDP) && sctp_sstate(sk, CLOSED)) |
6130 | return mask; | 6132 | return mask; |
6131 | 6133 | ||
6132 | /* Is it writable? */ | 6134 | /* Is it writable? */ |
6133 | if (sctp_writeable(sk)) { | 6135 | if (sctp_writeable(sk)) { |
6134 | mask |= POLLOUT | POLLWRNORM; | 6136 | mask |= POLLOUT | POLLWRNORM; |
6135 | } else { | 6137 | } else { |
6136 | set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags); | 6138 | set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags); |
6137 | /* | 6139 | /* |
6138 | * Since the socket is not locked, the buffer | 6140 | * Since the socket is not locked, the buffer |
6139 | * might be made available after the writeable check and | 6141 | * might be made available after the writeable check and |
6140 | * before the bit is set. This could cause a lost I/O | 6142 | * before the bit is set. This could cause a lost I/O |
6141 | * signal. tcp_poll() has a race breaker for this race | 6143 | * signal. tcp_poll() has a race breaker for this race |
6142 | * condition. Based on their implementation, we put | 6144 | * condition. Based on their implementation, we put |
6143 | * in the following code to cover it as well. | 6145 | * in the following code to cover it as well. |
6144 | */ | 6146 | */ |
6145 | if (sctp_writeable(sk)) | 6147 | if (sctp_writeable(sk)) |
6146 | mask |= POLLOUT | POLLWRNORM; | 6148 | mask |= POLLOUT | POLLWRNORM; |
6147 | } | 6149 | } |
6148 | return mask; | 6150 | return mask; |
6149 | } | 6151 | } |
6150 | 6152 | ||
6151 | /******************************************************************** | 6153 | /******************************************************************** |
6152 | * 2nd Level Abstractions | 6154 | * 2nd Level Abstractions |
6153 | ********************************************************************/ | 6155 | ********************************************************************/ |
6154 | 6156 | ||
6155 | static struct sctp_bind_bucket *sctp_bucket_create( | 6157 | static struct sctp_bind_bucket *sctp_bucket_create( |
6156 | struct sctp_bind_hashbucket *head, struct net *net, unsigned short snum) | 6158 | struct sctp_bind_hashbucket *head, struct net *net, unsigned short snum) |
6157 | { | 6159 | { |
6158 | struct sctp_bind_bucket *pp; | 6160 | struct sctp_bind_bucket *pp; |
6159 | 6161 | ||
6160 | pp = kmem_cache_alloc(sctp_bucket_cachep, GFP_ATOMIC); | 6162 | pp = kmem_cache_alloc(sctp_bucket_cachep, GFP_ATOMIC); |
6161 | if (pp) { | 6163 | if (pp) { |
6162 | SCTP_DBG_OBJCNT_INC(bind_bucket); | 6164 | SCTP_DBG_OBJCNT_INC(bind_bucket); |
6163 | pp->port = snum; | 6165 | pp->port = snum; |
6164 | pp->fastreuse = 0; | 6166 | pp->fastreuse = 0; |
6165 | INIT_HLIST_HEAD(&pp->owner); | 6167 | INIT_HLIST_HEAD(&pp->owner); |
6166 | pp->net = net; | 6168 | pp->net = net; |
6167 | hlist_add_head(&pp->node, &head->chain); | 6169 | hlist_add_head(&pp->node, &head->chain); |
6168 | } | 6170 | } |
6169 | return pp; | 6171 | return pp; |
6170 | } | 6172 | } |
6171 | 6173 | ||
6172 | /* Caller must hold hashbucket lock for this tb with local BH disabled */ | 6174 | /* Caller must hold hashbucket lock for this tb with local BH disabled */ |
6173 | static void sctp_bucket_destroy(struct sctp_bind_bucket *pp) | 6175 | static void sctp_bucket_destroy(struct sctp_bind_bucket *pp) |
6174 | { | 6176 | { |
6175 | if (pp && hlist_empty(&pp->owner)) { | 6177 | if (pp && hlist_empty(&pp->owner)) { |
6176 | __hlist_del(&pp->node); | 6178 | __hlist_del(&pp->node); |
6177 | kmem_cache_free(sctp_bucket_cachep, pp); | 6179 | kmem_cache_free(sctp_bucket_cachep, pp); |
6178 | SCTP_DBG_OBJCNT_DEC(bind_bucket); | 6180 | SCTP_DBG_OBJCNT_DEC(bind_bucket); |
6179 | } | 6181 | } |
6180 | } | 6182 | } |
6181 | 6183 | ||
6182 | /* Release this socket's reference to a local port. */ | 6184 | /* Release this socket's reference to a local port. */ |
6183 | static inline void __sctp_put_port(struct sock *sk) | 6185 | static inline void __sctp_put_port(struct sock *sk) |
6184 | { | 6186 | { |
6185 | struct sctp_bind_hashbucket *head = | 6187 | struct sctp_bind_hashbucket *head = |
6186 | &sctp_port_hashtable[sctp_phashfn(sock_net(sk), | 6188 | &sctp_port_hashtable[sctp_phashfn(sock_net(sk), |
6187 | inet_sk(sk)->inet_num)]; | 6189 | inet_sk(sk)->inet_num)]; |
6188 | struct sctp_bind_bucket *pp; | 6190 | struct sctp_bind_bucket *pp; |
6189 | 6191 | ||
6190 | sctp_spin_lock(&head->lock); | 6192 | sctp_spin_lock(&head->lock); |
6191 | pp = sctp_sk(sk)->bind_hash; | 6193 | pp = sctp_sk(sk)->bind_hash; |
6192 | __sk_del_bind_node(sk); | 6194 | __sk_del_bind_node(sk); |
6193 | sctp_sk(sk)->bind_hash = NULL; | 6195 | sctp_sk(sk)->bind_hash = NULL; |
6194 | inet_sk(sk)->inet_num = 0; | 6196 | inet_sk(sk)->inet_num = 0; |
6195 | sctp_bucket_destroy(pp); | 6197 | sctp_bucket_destroy(pp); |
6196 | sctp_spin_unlock(&head->lock); | 6198 | sctp_spin_unlock(&head->lock); |
6197 | } | 6199 | } |
6198 | 6200 | ||
6199 | void sctp_put_port(struct sock *sk) | 6201 | void sctp_put_port(struct sock *sk) |
6200 | { | 6202 | { |
6201 | sctp_local_bh_disable(); | 6203 | sctp_local_bh_disable(); |
6202 | __sctp_put_port(sk); | 6204 | __sctp_put_port(sk); |
6203 | sctp_local_bh_enable(); | 6205 | sctp_local_bh_enable(); |
6204 | } | 6206 | } |
6205 | 6207 | ||
6206 | /* | 6208 | /* |
6207 | * The system picks an ephemeral port and choose an address set equivalent | 6209 | * The system picks an ephemeral port and choose an address set equivalent |
6208 | * to binding with a wildcard address. | 6210 | * to binding with a wildcard address. |
6209 | * One of those addresses will be the primary address for the association. | 6211 | * One of those addresses will be the primary address for the association. |
6210 | * This automatically enables the multihoming capability of SCTP. | 6212 | * This automatically enables the multihoming capability of SCTP. |
6211 | */ | 6213 | */ |
6212 | static int sctp_autobind(struct sock *sk) | 6214 | static int sctp_autobind(struct sock *sk) |
6213 | { | 6215 | { |
6214 | union sctp_addr autoaddr; | 6216 | union sctp_addr autoaddr; |
6215 | struct sctp_af *af; | 6217 | struct sctp_af *af; |
6216 | __be16 port; | 6218 | __be16 port; |
6217 | 6219 | ||
6218 | /* Initialize a local sockaddr structure to INADDR_ANY. */ | 6220 | /* Initialize a local sockaddr structure to INADDR_ANY. */ |
6219 | af = sctp_sk(sk)->pf->af; | 6221 | af = sctp_sk(sk)->pf->af; |
6220 | 6222 | ||
6221 | port = htons(inet_sk(sk)->inet_num); | 6223 | port = htons(inet_sk(sk)->inet_num); |
6222 | af->inaddr_any(&autoaddr, port); | 6224 | af->inaddr_any(&autoaddr, port); |
6223 | 6225 | ||
6224 | return sctp_do_bind(sk, &autoaddr, af->sockaddr_len); | 6226 | return sctp_do_bind(sk, &autoaddr, af->sockaddr_len); |
6225 | } | 6227 | } |
6226 | 6228 | ||
6227 | /* Parse out IPPROTO_SCTP CMSG headers. Perform only minimal validation. | 6229 | /* Parse out IPPROTO_SCTP CMSG headers. Perform only minimal validation. |
6228 | * | 6230 | * |
6229 | * From RFC 2292 | 6231 | * From RFC 2292 |
6230 | * 4.2 The cmsghdr Structure * | 6232 | * 4.2 The cmsghdr Structure * |
6231 | * | 6233 | * |
6232 | * When ancillary data is sent or received, any number of ancillary data | 6234 | * When ancillary data is sent or received, any number of ancillary data |
6233 | * objects can be specified by the msg_control and msg_controllen members of | 6235 | * objects can be specified by the msg_control and msg_controllen members of |
6234 | * the msghdr structure, because each object is preceded by | 6236 | * the msghdr structure, because each object is preceded by |
6235 | * a cmsghdr structure defining the object's length (the cmsg_len member). | 6237 | * a cmsghdr structure defining the object's length (the cmsg_len member). |
6236 | * Historically Berkeley-derived implementations have passed only one object | 6238 | * Historically Berkeley-derived implementations have passed only one object |
6237 | * at a time, but this API allows multiple objects to be | 6239 | * at a time, but this API allows multiple objects to be |
6238 | * passed in a single call to sendmsg() or recvmsg(). The following example | 6240 | * passed in a single call to sendmsg() or recvmsg(). The following example |
6239 | * shows two ancillary data objects in a control buffer. | 6241 | * shows two ancillary data objects in a control buffer. |
6240 | * | 6242 | * |
6241 | * |<--------------------------- msg_controllen -------------------------->| | 6243 | * |<--------------------------- msg_controllen -------------------------->| |
6242 | * | | | 6244 | * | | |
6243 | * | 6245 | * |
6244 | * |<----- ancillary data object ----->|<----- ancillary data object ----->| | 6246 | * |<----- ancillary data object ----->|<----- ancillary data object ----->| |
6245 | * | 6247 | * |
6246 | * |<---------- CMSG_SPACE() --------->|<---------- CMSG_SPACE() --------->| | 6248 | * |<---------- CMSG_SPACE() --------->|<---------- CMSG_SPACE() --------->| |
6247 | * | | | | 6249 | * | | | |
6248 | * | 6250 | * |
6249 | * |<---------- cmsg_len ---------->| |<--------- cmsg_len ----------->| | | 6251 | * |<---------- cmsg_len ---------->| |<--------- cmsg_len ----------->| | |
6250 | * | 6252 | * |
6251 | * |<--------- CMSG_LEN() --------->| |<-------- CMSG_LEN() ---------->| | | 6253 | * |<--------- CMSG_LEN() --------->| |<-------- CMSG_LEN() ---------->| | |
6252 | * | | | | | | 6254 | * | | | | | |
6253 | * | 6255 | * |
6254 | * +-----+-----+-----+--+-----------+--+-----+-----+-----+--+-----------+--+ | 6256 | * +-----+-----+-----+--+-----------+--+-----+-----+-----+--+-----------+--+ |
6255 | * |cmsg_|cmsg_|cmsg_|XX| |XX|cmsg_|cmsg_|cmsg_|XX| |XX| | 6257 | * |cmsg_|cmsg_|cmsg_|XX| |XX|cmsg_|cmsg_|cmsg_|XX| |XX| |
6256 | * | 6258 | * |
6257 | * |len |level|type |XX|cmsg_data[]|XX|len |level|type |XX|cmsg_data[]|XX| | 6259 | * |len |level|type |XX|cmsg_data[]|XX|len |level|type |XX|cmsg_data[]|XX| |
6258 | * | 6260 | * |
6259 | * +-----+-----+-----+--+-----------+--+-----+-----+-----+--+-----------+--+ | 6261 | * +-----+-----+-----+--+-----------+--+-----+-----+-----+--+-----------+--+ |
6260 | * ^ | 6262 | * ^ |
6261 | * | | 6263 | * | |
6262 | * | 6264 | * |
6263 | * msg_control | 6265 | * msg_control |
6264 | * points here | 6266 | * points here |
6265 | */ | 6267 | */ |
6266 | SCTP_STATIC int sctp_msghdr_parse(const struct msghdr *msg, | 6268 | SCTP_STATIC int sctp_msghdr_parse(const struct msghdr *msg, |
6267 | sctp_cmsgs_t *cmsgs) | 6269 | sctp_cmsgs_t *cmsgs) |
6268 | { | 6270 | { |
6269 | struct cmsghdr *cmsg; | 6271 | struct cmsghdr *cmsg; |
6270 | struct msghdr *my_msg = (struct msghdr *)msg; | 6272 | struct msghdr *my_msg = (struct msghdr *)msg; |
6271 | 6273 | ||
6272 | for (cmsg = CMSG_FIRSTHDR(msg); | 6274 | for (cmsg = CMSG_FIRSTHDR(msg); |
6273 | cmsg != NULL; | 6275 | cmsg != NULL; |
6274 | cmsg = CMSG_NXTHDR(my_msg, cmsg)) { | 6276 | cmsg = CMSG_NXTHDR(my_msg, cmsg)) { |
6275 | if (!CMSG_OK(my_msg, cmsg)) | 6277 | if (!CMSG_OK(my_msg, cmsg)) |
6276 | return -EINVAL; | 6278 | return -EINVAL; |
6277 | 6279 | ||
6278 | /* Should we parse this header or ignore? */ | 6280 | /* Should we parse this header or ignore? */ |
6279 | if (cmsg->cmsg_level != IPPROTO_SCTP) | 6281 | if (cmsg->cmsg_level != IPPROTO_SCTP) |
6280 | continue; | 6282 | continue; |
6281 | 6283 | ||
6282 | /* Strictly check lengths following example in SCM code. */ | 6284 | /* Strictly check lengths following example in SCM code. */ |
6283 | switch (cmsg->cmsg_type) { | 6285 | switch (cmsg->cmsg_type) { |
6284 | case SCTP_INIT: | 6286 | case SCTP_INIT: |
6285 | /* SCTP Socket API Extension | 6287 | /* SCTP Socket API Extension |
6286 | * 5.2.1 SCTP Initiation Structure (SCTP_INIT) | 6288 | * 5.2.1 SCTP Initiation Structure (SCTP_INIT) |
6287 | * | 6289 | * |
6288 | * This cmsghdr structure provides information for | 6290 | * This cmsghdr structure provides information for |
6289 | * initializing new SCTP associations with sendmsg(). | 6291 | * initializing new SCTP associations with sendmsg(). |
6290 | * The SCTP_INITMSG socket option uses this same data | 6292 | * The SCTP_INITMSG socket option uses this same data |
6291 | * structure. This structure is not used for | 6293 | * structure. This structure is not used for |
6292 | * recvmsg(). | 6294 | * recvmsg(). |
6293 | * | 6295 | * |
6294 | * cmsg_level cmsg_type cmsg_data[] | 6296 | * cmsg_level cmsg_type cmsg_data[] |
6295 | * ------------ ------------ ---------------------- | 6297 | * ------------ ------------ ---------------------- |
6296 | * IPPROTO_SCTP SCTP_INIT struct sctp_initmsg | 6298 | * IPPROTO_SCTP SCTP_INIT struct sctp_initmsg |
6297 | */ | 6299 | */ |
6298 | if (cmsg->cmsg_len != | 6300 | if (cmsg->cmsg_len != |
6299 | CMSG_LEN(sizeof(struct sctp_initmsg))) | 6301 | CMSG_LEN(sizeof(struct sctp_initmsg))) |
6300 | return -EINVAL; | 6302 | return -EINVAL; |
6301 | cmsgs->init = (struct sctp_initmsg *)CMSG_DATA(cmsg); | 6303 | cmsgs->init = (struct sctp_initmsg *)CMSG_DATA(cmsg); |
6302 | break; | 6304 | break; |
6303 | 6305 | ||
6304 | case SCTP_SNDRCV: | 6306 | case SCTP_SNDRCV: |
6305 | /* SCTP Socket API Extension | 6307 | /* SCTP Socket API Extension |
6306 | * 5.2.2 SCTP Header Information Structure(SCTP_SNDRCV) | 6308 | * 5.2.2 SCTP Header Information Structure(SCTP_SNDRCV) |
6307 | * | 6309 | * |
6308 | * This cmsghdr structure specifies SCTP options for | 6310 | * This cmsghdr structure specifies SCTP options for |
6309 | * sendmsg() and describes SCTP header information | 6311 | * sendmsg() and describes SCTP header information |
6310 | * about a received message through recvmsg(). | 6312 | * about a received message through recvmsg(). |
6311 | * | 6313 | * |
6312 | * cmsg_level cmsg_type cmsg_data[] | 6314 | * cmsg_level cmsg_type cmsg_data[] |
6313 | * ------------ ------------ ---------------------- | 6315 | * ------------ ------------ ---------------------- |
6314 | * IPPROTO_SCTP SCTP_SNDRCV struct sctp_sndrcvinfo | 6316 | * IPPROTO_SCTP SCTP_SNDRCV struct sctp_sndrcvinfo |
6315 | */ | 6317 | */ |
6316 | if (cmsg->cmsg_len != | 6318 | if (cmsg->cmsg_len != |
6317 | CMSG_LEN(sizeof(struct sctp_sndrcvinfo))) | 6319 | CMSG_LEN(sizeof(struct sctp_sndrcvinfo))) |
6318 | return -EINVAL; | 6320 | return -EINVAL; |
6319 | 6321 | ||
6320 | cmsgs->info = | 6322 | cmsgs->info = |
6321 | (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg); | 6323 | (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg); |
6322 | 6324 | ||
6323 | /* Minimally, validate the sinfo_flags. */ | 6325 | /* Minimally, validate the sinfo_flags. */ |
6324 | if (cmsgs->info->sinfo_flags & | 6326 | if (cmsgs->info->sinfo_flags & |
6325 | ~(SCTP_UNORDERED | SCTP_ADDR_OVER | | 6327 | ~(SCTP_UNORDERED | SCTP_ADDR_OVER | |
6326 | SCTP_ABORT | SCTP_EOF)) | 6328 | SCTP_ABORT | SCTP_EOF)) |
6327 | return -EINVAL; | 6329 | return -EINVAL; |
6328 | break; | 6330 | break; |
6329 | 6331 | ||
6330 | default: | 6332 | default: |
6331 | return -EINVAL; | 6333 | return -EINVAL; |
6332 | } | 6334 | } |
6333 | } | 6335 | } |
6334 | return 0; | 6336 | return 0; |
6335 | } | 6337 | } |
6336 | 6338 | ||
6337 | /* | 6339 | /* |
6338 | * Wait for a packet.. | 6340 | * Wait for a packet.. |
6339 | * Note: This function is the same function as in core/datagram.c | 6341 | * Note: This function is the same function as in core/datagram.c |
6340 | * with a few modifications to make lksctp work. | 6342 | * with a few modifications to make lksctp work. |
6341 | */ | 6343 | */ |
6342 | static int sctp_wait_for_packet(struct sock * sk, int *err, long *timeo_p) | 6344 | static int sctp_wait_for_packet(struct sock * sk, int *err, long *timeo_p) |
6343 | { | 6345 | { |
6344 | int error; | 6346 | int error; |
6345 | DEFINE_WAIT(wait); | 6347 | DEFINE_WAIT(wait); |
6346 | 6348 | ||
6347 | prepare_to_wait_exclusive(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); | 6349 | prepare_to_wait_exclusive(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); |
6348 | 6350 | ||
6349 | /* Socket errors? */ | 6351 | /* Socket errors? */ |
6350 | error = sock_error(sk); | 6352 | error = sock_error(sk); |
6351 | if (error) | 6353 | if (error) |
6352 | goto out; | 6354 | goto out; |
6353 | 6355 | ||
6354 | if (!skb_queue_empty(&sk->sk_receive_queue)) | 6356 | if (!skb_queue_empty(&sk->sk_receive_queue)) |
6355 | goto ready; | 6357 | goto ready; |
6356 | 6358 | ||
6357 | /* Socket shut down? */ | 6359 | /* Socket shut down? */ |
6358 | if (sk->sk_shutdown & RCV_SHUTDOWN) | 6360 | if (sk->sk_shutdown & RCV_SHUTDOWN) |
6359 | goto out; | 6361 | goto out; |
6360 | 6362 | ||
6361 | /* Sequenced packets can come disconnected. If so we report the | 6363 | /* Sequenced packets can come disconnected. If so we report the |
6362 | * problem. | 6364 | * problem. |
6363 | */ | 6365 | */ |
6364 | error = -ENOTCONN; | 6366 | error = -ENOTCONN; |
6365 | 6367 | ||
6366 | /* Is there a good reason to think that we may receive some data? */ | 6368 | /* Is there a good reason to think that we may receive some data? */ |
6367 | if (list_empty(&sctp_sk(sk)->ep->asocs) && !sctp_sstate(sk, LISTENING)) | 6369 | if (list_empty(&sctp_sk(sk)->ep->asocs) && !sctp_sstate(sk, LISTENING)) |
6368 | goto out; | 6370 | goto out; |
6369 | 6371 | ||
6370 | /* Handle signals. */ | 6372 | /* Handle signals. */ |
6371 | if (signal_pending(current)) | 6373 | if (signal_pending(current)) |
6372 | goto interrupted; | 6374 | goto interrupted; |
6373 | 6375 | ||
6374 | /* Let another process have a go. Since we are going to sleep | 6376 | /* Let another process have a go. Since we are going to sleep |
6375 | * anyway. Note: This may cause odd behaviors if the message | 6377 | * anyway. Note: This may cause odd behaviors if the message |
6376 | * does not fit in the user's buffer, but this seems to be the | 6378 | * does not fit in the user's buffer, but this seems to be the |
6377 | * only way to honor MSG_DONTWAIT realistically. | 6379 | * only way to honor MSG_DONTWAIT realistically. |
6378 | */ | 6380 | */ |
6379 | sctp_release_sock(sk); | 6381 | sctp_release_sock(sk); |
6380 | *timeo_p = schedule_timeout(*timeo_p); | 6382 | *timeo_p = schedule_timeout(*timeo_p); |
6381 | sctp_lock_sock(sk); | 6383 | sctp_lock_sock(sk); |
6382 | 6384 | ||
6383 | ready: | 6385 | ready: |
6384 | finish_wait(sk_sleep(sk), &wait); | 6386 | finish_wait(sk_sleep(sk), &wait); |
6385 | return 0; | 6387 | return 0; |
6386 | 6388 | ||
6387 | interrupted: | 6389 | interrupted: |
6388 | error = sock_intr_errno(*timeo_p); | 6390 | error = sock_intr_errno(*timeo_p); |
6389 | 6391 | ||
6390 | out: | 6392 | out: |
6391 | finish_wait(sk_sleep(sk), &wait); | 6393 | finish_wait(sk_sleep(sk), &wait); |
6392 | *err = error; | 6394 | *err = error; |
6393 | return error; | 6395 | return error; |
6394 | } | 6396 | } |
6395 | 6397 | ||
6396 | /* Receive a datagram. | 6398 | /* Receive a datagram. |
6397 | * Note: This is pretty much the same routine as in core/datagram.c | 6399 | * Note: This is pretty much the same routine as in core/datagram.c |
6398 | * with a few changes to make lksctp work. | 6400 | * with a few changes to make lksctp work. |
6399 | */ | 6401 | */ |
6400 | static struct sk_buff *sctp_skb_recv_datagram(struct sock *sk, int flags, | 6402 | static struct sk_buff *sctp_skb_recv_datagram(struct sock *sk, int flags, |
6401 | int noblock, int *err) | 6403 | int noblock, int *err) |
6402 | { | 6404 | { |
6403 | int error; | 6405 | int error; |
6404 | struct sk_buff *skb; | 6406 | struct sk_buff *skb; |
6405 | long timeo; | 6407 | long timeo; |
6406 | 6408 | ||
6407 | timeo = sock_rcvtimeo(sk, noblock); | 6409 | timeo = sock_rcvtimeo(sk, noblock); |
6408 | 6410 | ||
6409 | SCTP_DEBUG_PRINTK("Timeout: timeo: %ld, MAX: %ld.\n", | 6411 | SCTP_DEBUG_PRINTK("Timeout: timeo: %ld, MAX: %ld.\n", |
6410 | timeo, MAX_SCHEDULE_TIMEOUT); | 6412 | timeo, MAX_SCHEDULE_TIMEOUT); |
6411 | 6413 | ||
6412 | do { | 6414 | do { |
6413 | /* Again only user level code calls this function, | 6415 | /* Again only user level code calls this function, |
6414 | * so nothing interrupt level | 6416 | * so nothing interrupt level |
6415 | * will suddenly eat the receive_queue. | 6417 | * will suddenly eat the receive_queue. |
6416 | * | 6418 | * |
6417 | * Look at current nfs client by the way... | 6419 | * Look at current nfs client by the way... |
6418 | * However, this function was correct in any case. 8) | 6420 | * However, this function was correct in any case. 8) |
6419 | */ | 6421 | */ |
6420 | if (flags & MSG_PEEK) { | 6422 | if (flags & MSG_PEEK) { |
6421 | spin_lock_bh(&sk->sk_receive_queue.lock); | 6423 | spin_lock_bh(&sk->sk_receive_queue.lock); |
6422 | skb = skb_peek(&sk->sk_receive_queue); | 6424 | skb = skb_peek(&sk->sk_receive_queue); |
6423 | if (skb) | 6425 | if (skb) |
6424 | atomic_inc(&skb->users); | 6426 | atomic_inc(&skb->users); |
6425 | spin_unlock_bh(&sk->sk_receive_queue.lock); | 6427 | spin_unlock_bh(&sk->sk_receive_queue.lock); |
6426 | } else { | 6428 | } else { |
6427 | skb = skb_dequeue(&sk->sk_receive_queue); | 6429 | skb = skb_dequeue(&sk->sk_receive_queue); |
6428 | } | 6430 | } |
6429 | 6431 | ||
6430 | if (skb) | 6432 | if (skb) |
6431 | return skb; | 6433 | return skb; |
6432 | 6434 | ||
6433 | /* Caller is allowed not to check sk->sk_err before calling. */ | 6435 | /* Caller is allowed not to check sk->sk_err before calling. */ |
6434 | error = sock_error(sk); | 6436 | error = sock_error(sk); |
6435 | if (error) | 6437 | if (error) |
6436 | goto no_packet; | 6438 | goto no_packet; |
6437 | 6439 | ||
6438 | if (sk->sk_shutdown & RCV_SHUTDOWN) | 6440 | if (sk->sk_shutdown & RCV_SHUTDOWN) |
6439 | break; | 6441 | break; |
6440 | 6442 | ||
6441 | /* User doesn't want to wait. */ | 6443 | /* User doesn't want to wait. */ |
6442 | error = -EAGAIN; | 6444 | error = -EAGAIN; |
6443 | if (!timeo) | 6445 | if (!timeo) |
6444 | goto no_packet; | 6446 | goto no_packet; |
6445 | } while (sctp_wait_for_packet(sk, err, &timeo) == 0); | 6447 | } while (sctp_wait_for_packet(sk, err, &timeo) == 0); |
6446 | 6448 | ||
6447 | return NULL; | 6449 | return NULL; |
6448 | 6450 | ||
6449 | no_packet: | 6451 | no_packet: |
6450 | *err = error; | 6452 | *err = error; |
6451 | return NULL; | 6453 | return NULL; |
6452 | } | 6454 | } |
6453 | 6455 | ||
6454 | /* If sndbuf has changed, wake up per association sndbuf waiters. */ | 6456 | /* If sndbuf has changed, wake up per association sndbuf waiters. */ |
6455 | static void __sctp_write_space(struct sctp_association *asoc) | 6457 | static void __sctp_write_space(struct sctp_association *asoc) |
6456 | { | 6458 | { |
6457 | struct sock *sk = asoc->base.sk; | 6459 | struct sock *sk = asoc->base.sk; |
6458 | struct socket *sock = sk->sk_socket; | 6460 | struct socket *sock = sk->sk_socket; |
6459 | 6461 | ||
6460 | if ((sctp_wspace(asoc) > 0) && sock) { | 6462 | if ((sctp_wspace(asoc) > 0) && sock) { |
6461 | if (waitqueue_active(&asoc->wait)) | 6463 | if (waitqueue_active(&asoc->wait)) |
6462 | wake_up_interruptible(&asoc->wait); | 6464 | wake_up_interruptible(&asoc->wait); |
6463 | 6465 | ||
6464 | if (sctp_writeable(sk)) { | 6466 | if (sctp_writeable(sk)) { |
6465 | wait_queue_head_t *wq = sk_sleep(sk); | 6467 | wait_queue_head_t *wq = sk_sleep(sk); |
6466 | 6468 | ||
6467 | if (wq && waitqueue_active(wq)) | 6469 | if (wq && waitqueue_active(wq)) |
6468 | wake_up_interruptible(wq); | 6470 | wake_up_interruptible(wq); |
6469 | 6471 | ||
6470 | /* Note that we try to include the Async I/O support | 6472 | /* Note that we try to include the Async I/O support |
6471 | * here by modeling from the current TCP/UDP code. | 6473 | * here by modeling from the current TCP/UDP code. |
6472 | * We have not tested with it yet. | 6474 | * We have not tested with it yet. |
6473 | */ | 6475 | */ |
6474 | if (!(sk->sk_shutdown & SEND_SHUTDOWN)) | 6476 | if (!(sk->sk_shutdown & SEND_SHUTDOWN)) |
6475 | sock_wake_async(sock, | 6477 | sock_wake_async(sock, |
6476 | SOCK_WAKE_SPACE, POLL_OUT); | 6478 | SOCK_WAKE_SPACE, POLL_OUT); |
6477 | } | 6479 | } |
6478 | } | 6480 | } |
6479 | } | 6481 | } |
6480 | 6482 | ||
6481 | /* Do accounting for the sndbuf space. | 6483 | /* Do accounting for the sndbuf space. |
6482 | * Decrement the used sndbuf space of the corresponding association by the | 6484 | * Decrement the used sndbuf space of the corresponding association by the |
6483 | * data size which was just transmitted(freed). | 6485 | * data size which was just transmitted(freed). |
6484 | */ | 6486 | */ |
6485 | static void sctp_wfree(struct sk_buff *skb) | 6487 | static void sctp_wfree(struct sk_buff *skb) |
6486 | { | 6488 | { |
6487 | struct sctp_association *asoc; | 6489 | struct sctp_association *asoc; |
6488 | struct sctp_chunk *chunk; | 6490 | struct sctp_chunk *chunk; |
6489 | struct sock *sk; | 6491 | struct sock *sk; |
6490 | 6492 | ||
6491 | /* Get the saved chunk pointer. */ | 6493 | /* Get the saved chunk pointer. */ |
6492 | chunk = *((struct sctp_chunk **)(skb->cb)); | 6494 | chunk = *((struct sctp_chunk **)(skb->cb)); |
6493 | asoc = chunk->asoc; | 6495 | asoc = chunk->asoc; |
6494 | sk = asoc->base.sk; | 6496 | sk = asoc->base.sk; |
6495 | asoc->sndbuf_used -= SCTP_DATA_SNDSIZE(chunk) + | 6497 | asoc->sndbuf_used -= SCTP_DATA_SNDSIZE(chunk) + |
6496 | sizeof(struct sk_buff) + | 6498 | sizeof(struct sk_buff) + |
6497 | sizeof(struct sctp_chunk); | 6499 | sizeof(struct sctp_chunk); |
6498 | 6500 | ||
6499 | atomic_sub(sizeof(struct sctp_chunk), &sk->sk_wmem_alloc); | 6501 | atomic_sub(sizeof(struct sctp_chunk), &sk->sk_wmem_alloc); |
6500 | 6502 | ||
6501 | /* | 6503 | /* |
6502 | * This undoes what is done via sctp_set_owner_w and sk_mem_charge | 6504 | * This undoes what is done via sctp_set_owner_w and sk_mem_charge |
6503 | */ | 6505 | */ |
6504 | sk->sk_wmem_queued -= skb->truesize; | 6506 | sk->sk_wmem_queued -= skb->truesize; |
6505 | sk_mem_uncharge(sk, skb->truesize); | 6507 | sk_mem_uncharge(sk, skb->truesize); |
6506 | 6508 | ||
6507 | sock_wfree(skb); | 6509 | sock_wfree(skb); |
6508 | __sctp_write_space(asoc); | 6510 | __sctp_write_space(asoc); |
6509 | 6511 | ||
6510 | sctp_association_put(asoc); | 6512 | sctp_association_put(asoc); |
6511 | } | 6513 | } |
6512 | 6514 | ||
6513 | /* Do accounting for the receive space on the socket. | 6515 | /* Do accounting for the receive space on the socket. |
6514 | * Accounting for the association is done in ulpevent.c | 6516 | * Accounting for the association is done in ulpevent.c |
6515 | * We set this as a destructor for the cloned data skbs so that | 6517 | * We set this as a destructor for the cloned data skbs so that |
6516 | * accounting is done at the correct time. | 6518 | * accounting is done at the correct time. |
6517 | */ | 6519 | */ |
6518 | void sctp_sock_rfree(struct sk_buff *skb) | 6520 | void sctp_sock_rfree(struct sk_buff *skb) |
6519 | { | 6521 | { |
6520 | struct sock *sk = skb->sk; | 6522 | struct sock *sk = skb->sk; |
6521 | struct sctp_ulpevent *event = sctp_skb2event(skb); | 6523 | struct sctp_ulpevent *event = sctp_skb2event(skb); |
6522 | 6524 | ||
6523 | atomic_sub(event->rmem_len, &sk->sk_rmem_alloc); | 6525 | atomic_sub(event->rmem_len, &sk->sk_rmem_alloc); |
6524 | 6526 | ||
6525 | /* | 6527 | /* |
6526 | * Mimic the behavior of sock_rfree | 6528 | * Mimic the behavior of sock_rfree |
6527 | */ | 6529 | */ |
6528 | sk_mem_uncharge(sk, event->rmem_len); | 6530 | sk_mem_uncharge(sk, event->rmem_len); |
6529 | } | 6531 | } |
6530 | 6532 | ||
6531 | 6533 | ||
6532 | /* Helper function to wait for space in the sndbuf. */ | 6534 | /* Helper function to wait for space in the sndbuf. */ |
6533 | static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p, | 6535 | static int sctp_wait_for_sndbuf(struct sctp_association *asoc, long *timeo_p, |
6534 | size_t msg_len) | 6536 | size_t msg_len) |
6535 | { | 6537 | { |
6536 | struct sock *sk = asoc->base.sk; | 6538 | struct sock *sk = asoc->base.sk; |
6537 | int err = 0; | 6539 | int err = 0; |
6538 | long current_timeo = *timeo_p; | 6540 | long current_timeo = *timeo_p; |
6539 | DEFINE_WAIT(wait); | 6541 | DEFINE_WAIT(wait); |
6540 | 6542 | ||
6541 | SCTP_DEBUG_PRINTK("wait_for_sndbuf: asoc=%p, timeo=%ld, msg_len=%zu\n", | 6543 | SCTP_DEBUG_PRINTK("wait_for_sndbuf: asoc=%p, timeo=%ld, msg_len=%zu\n", |
6542 | asoc, (long)(*timeo_p), msg_len); | 6544 | asoc, (long)(*timeo_p), msg_len); |
6543 | 6545 | ||
6544 | /* Increment the association's refcnt. */ | 6546 | /* Increment the association's refcnt. */ |
6545 | sctp_association_hold(asoc); | 6547 | sctp_association_hold(asoc); |
6546 | 6548 | ||
6547 | /* Wait on the association specific sndbuf space. */ | 6549 | /* Wait on the association specific sndbuf space. */ |
6548 | for (;;) { | 6550 | for (;;) { |
6549 | prepare_to_wait_exclusive(&asoc->wait, &wait, | 6551 | prepare_to_wait_exclusive(&asoc->wait, &wait, |
6550 | TASK_INTERRUPTIBLE); | 6552 | TASK_INTERRUPTIBLE); |
6551 | if (!*timeo_p) | 6553 | if (!*timeo_p) |
6552 | goto do_nonblock; | 6554 | goto do_nonblock; |
6553 | if (sk->sk_err || asoc->state >= SCTP_STATE_SHUTDOWN_PENDING || | 6555 | if (sk->sk_err || asoc->state >= SCTP_STATE_SHUTDOWN_PENDING || |
6554 | asoc->base.dead) | 6556 | asoc->base.dead) |
6555 | goto do_error; | 6557 | goto do_error; |
6556 | if (signal_pending(current)) | 6558 | if (signal_pending(current)) |
6557 | goto do_interrupted; | 6559 | goto do_interrupted; |
6558 | if (msg_len <= sctp_wspace(asoc)) | 6560 | if (msg_len <= sctp_wspace(asoc)) |
6559 | break; | 6561 | break; |
6560 | 6562 | ||
6561 | /* Let another process have a go. Since we are going | 6563 | /* Let another process have a go. Since we are going |
6562 | * to sleep anyway. | 6564 | * to sleep anyway. |
6563 | */ | 6565 | */ |
6564 | sctp_release_sock(sk); | 6566 | sctp_release_sock(sk); |
6565 | current_timeo = schedule_timeout(current_timeo); | 6567 | current_timeo = schedule_timeout(current_timeo); |
6566 | BUG_ON(sk != asoc->base.sk); | 6568 | BUG_ON(sk != asoc->base.sk); |
6567 | sctp_lock_sock(sk); | 6569 | sctp_lock_sock(sk); |
6568 | 6570 | ||
6569 | *timeo_p = current_timeo; | 6571 | *timeo_p = current_timeo; |
6570 | } | 6572 | } |
6571 | 6573 | ||
6572 | out: | 6574 | out: |
6573 | finish_wait(&asoc->wait, &wait); | 6575 | finish_wait(&asoc->wait, &wait); |
6574 | 6576 | ||
6575 | /* Release the association's refcnt. */ | 6577 | /* Release the association's refcnt. */ |
6576 | sctp_association_put(asoc); | 6578 | sctp_association_put(asoc); |
6577 | 6579 | ||
6578 | return err; | 6580 | return err; |
6579 | 6581 | ||
6580 | do_error: | 6582 | do_error: |
6581 | err = -EPIPE; | 6583 | err = -EPIPE; |
6582 | goto out; | 6584 | goto out; |
6583 | 6585 | ||
6584 | do_interrupted: | 6586 | do_interrupted: |
6585 | err = sock_intr_errno(*timeo_p); | 6587 | err = sock_intr_errno(*timeo_p); |
6586 | goto out; | 6588 | goto out; |
6587 | 6589 | ||
6588 | do_nonblock: | 6590 | do_nonblock: |
6589 | err = -EAGAIN; | 6591 | err = -EAGAIN; |
6590 | goto out; | 6592 | goto out; |
6591 | } | 6593 | } |
6592 | 6594 | ||
6593 | void sctp_data_ready(struct sock *sk, int len) | 6595 | void sctp_data_ready(struct sock *sk, int len) |
6594 | { | 6596 | { |
6595 | struct socket_wq *wq; | 6597 | struct socket_wq *wq; |
6596 | 6598 | ||
6597 | rcu_read_lock(); | 6599 | rcu_read_lock(); |
6598 | wq = rcu_dereference(sk->sk_wq); | 6600 | wq = rcu_dereference(sk->sk_wq); |
6599 | if (wq_has_sleeper(wq)) | 6601 | if (wq_has_sleeper(wq)) |
6600 | wake_up_interruptible_sync_poll(&wq->wait, POLLIN | | 6602 | wake_up_interruptible_sync_poll(&wq->wait, POLLIN | |
6601 | POLLRDNORM | POLLRDBAND); | 6603 | POLLRDNORM | POLLRDBAND); |
6602 | sk_wake_async(sk, SOCK_WAKE_WAITD, POLL_IN); | 6604 | sk_wake_async(sk, SOCK_WAKE_WAITD, POLL_IN); |
6603 | rcu_read_unlock(); | 6605 | rcu_read_unlock(); |
6604 | } | 6606 | } |
6605 | 6607 | ||
6606 | /* If socket sndbuf has changed, wake up all per association waiters. */ | 6608 | /* If socket sndbuf has changed, wake up all per association waiters. */ |
6607 | void sctp_write_space(struct sock *sk) | 6609 | void sctp_write_space(struct sock *sk) |
6608 | { | 6610 | { |
6609 | struct sctp_association *asoc; | 6611 | struct sctp_association *asoc; |
6610 | 6612 | ||
6611 | /* Wake up the tasks in each wait queue. */ | 6613 | /* Wake up the tasks in each wait queue. */ |
6612 | list_for_each_entry(asoc, &((sctp_sk(sk))->ep->asocs), asocs) { | 6614 | list_for_each_entry(asoc, &((sctp_sk(sk))->ep->asocs), asocs) { |
6613 | __sctp_write_space(asoc); | 6615 | __sctp_write_space(asoc); |
6614 | } | 6616 | } |
6615 | } | 6617 | } |
6616 | 6618 | ||
6617 | /* Is there any sndbuf space available on the socket? | 6619 | /* Is there any sndbuf space available on the socket? |
6618 | * | 6620 | * |
6619 | * Note that sk_wmem_alloc is the sum of the send buffers on all of the | 6621 | * Note that sk_wmem_alloc is the sum of the send buffers on all of the |
6620 | * associations on the same socket. For a UDP-style socket with | 6622 | * associations on the same socket. For a UDP-style socket with |
6621 | * multiple associations, it is possible for it to be "unwriteable" | 6623 | * multiple associations, it is possible for it to be "unwriteable" |
6622 | * prematurely. I assume that this is acceptable because | 6624 | * prematurely. I assume that this is acceptable because |
6623 | * a premature "unwriteable" is better than an accidental "writeable" which | 6625 | * a premature "unwriteable" is better than an accidental "writeable" which |
6624 | * would cause an unwanted block under certain circumstances. For the 1-1 | 6626 | * would cause an unwanted block under certain circumstances. For the 1-1 |
6625 | * UDP-style sockets or TCP-style sockets, this code should work. | 6627 | * UDP-style sockets or TCP-style sockets, this code should work. |
6626 | * - Daisy | 6628 | * - Daisy |
6627 | */ | 6629 | */ |
6628 | static int sctp_writeable(struct sock *sk) | 6630 | static int sctp_writeable(struct sock *sk) |
6629 | { | 6631 | { |
6630 | int amt = 0; | 6632 | int amt = 0; |
6631 | 6633 | ||
6632 | amt = sk->sk_sndbuf - sk_wmem_alloc_get(sk); | 6634 | amt = sk->sk_sndbuf - sk_wmem_alloc_get(sk); |
6633 | if (amt < 0) | 6635 | if (amt < 0) |
6634 | amt = 0; | 6636 | amt = 0; |
6635 | return amt; | 6637 | return amt; |
6636 | } | 6638 | } |
6637 | 6639 | ||
6638 | /* Wait for an association to go into ESTABLISHED state. If timeout is 0, | 6640 | /* Wait for an association to go into ESTABLISHED state. If timeout is 0, |
6639 | * returns immediately with EINPROGRESS. | 6641 | * returns immediately with EINPROGRESS. |
6640 | */ | 6642 | */ |
6641 | static int sctp_wait_for_connect(struct sctp_association *asoc, long *timeo_p) | 6643 | static int sctp_wait_for_connect(struct sctp_association *asoc, long *timeo_p) |
6642 | { | 6644 | { |
6643 | struct sock *sk = asoc->base.sk; | 6645 | struct sock *sk = asoc->base.sk; |
6644 | int err = 0; | 6646 | int err = 0; |
6645 | long current_timeo = *timeo_p; | 6647 | long current_timeo = *timeo_p; |
6646 | DEFINE_WAIT(wait); | 6648 | DEFINE_WAIT(wait); |
6647 | 6649 | ||
6648 | SCTP_DEBUG_PRINTK("%s: asoc=%p, timeo=%ld\n", __func__, asoc, | 6650 | SCTP_DEBUG_PRINTK("%s: asoc=%p, timeo=%ld\n", __func__, asoc, |
6649 | (long)(*timeo_p)); | 6651 | (long)(*timeo_p)); |
6650 | 6652 | ||
6651 | /* Increment the association's refcnt. */ | 6653 | /* Increment the association's refcnt. */ |
6652 | sctp_association_hold(asoc); | 6654 | sctp_association_hold(asoc); |
6653 | 6655 | ||
6654 | for (;;) { | 6656 | for (;;) { |
6655 | prepare_to_wait_exclusive(&asoc->wait, &wait, | 6657 | prepare_to_wait_exclusive(&asoc->wait, &wait, |
6656 | TASK_INTERRUPTIBLE); | 6658 | TASK_INTERRUPTIBLE); |
6657 | if (!*timeo_p) | 6659 | if (!*timeo_p) |
6658 | goto do_nonblock; | 6660 | goto do_nonblock; |
6659 | if (sk->sk_shutdown & RCV_SHUTDOWN) | 6661 | if (sk->sk_shutdown & RCV_SHUTDOWN) |
6660 | break; | 6662 | break; |
6661 | if (sk->sk_err || asoc->state >= SCTP_STATE_SHUTDOWN_PENDING || | 6663 | if (sk->sk_err || asoc->state >= SCTP_STATE_SHUTDOWN_PENDING || |
6662 | asoc->base.dead) | 6664 | asoc->base.dead) |
6663 | goto do_error; | 6665 | goto do_error; |
6664 | if (signal_pending(current)) | 6666 | if (signal_pending(current)) |
6665 | goto do_interrupted; | 6667 | goto do_interrupted; |
6666 | 6668 | ||
6667 | if (sctp_state(asoc, ESTABLISHED)) | 6669 | if (sctp_state(asoc, ESTABLISHED)) |
6668 | break; | 6670 | break; |
6669 | 6671 | ||
6670 | /* Let another process have a go. Since we are going | 6672 | /* Let another process have a go. Since we are going |
6671 | * to sleep anyway. | 6673 | * to sleep anyway. |
6672 | */ | 6674 | */ |
6673 | sctp_release_sock(sk); | 6675 | sctp_release_sock(sk); |
6674 | current_timeo = schedule_timeout(current_timeo); | 6676 | current_timeo = schedule_timeout(current_timeo); |
6675 | sctp_lock_sock(sk); | 6677 | sctp_lock_sock(sk); |
6676 | 6678 | ||
6677 | *timeo_p = current_timeo; | 6679 | *timeo_p = current_timeo; |
6678 | } | 6680 | } |
6679 | 6681 | ||
6680 | out: | 6682 | out: |
6681 | finish_wait(&asoc->wait, &wait); | 6683 | finish_wait(&asoc->wait, &wait); |
6682 | 6684 | ||
6683 | /* Release the association's refcnt. */ | 6685 | /* Release the association's refcnt. */ |
6684 | sctp_association_put(asoc); | 6686 | sctp_association_put(asoc); |
6685 | 6687 | ||
6686 | return err; | 6688 | return err; |
6687 | 6689 | ||
6688 | do_error: | 6690 | do_error: |
6689 | if (asoc->init_err_counter + 1 > asoc->max_init_attempts) | 6691 | if (asoc->init_err_counter + 1 > asoc->max_init_attempts) |
6690 | err = -ETIMEDOUT; | 6692 | err = -ETIMEDOUT; |
6691 | else | 6693 | else |
6692 | err = -ECONNREFUSED; | 6694 | err = -ECONNREFUSED; |
6693 | goto out; | 6695 | goto out; |
6694 | 6696 | ||
6695 | do_interrupted: | 6697 | do_interrupted: |
6696 | err = sock_intr_errno(*timeo_p); | 6698 | err = sock_intr_errno(*timeo_p); |
6697 | goto out; | 6699 | goto out; |
6698 | 6700 | ||
6699 | do_nonblock: | 6701 | do_nonblock: |
6700 | err = -EINPROGRESS; | 6702 | err = -EINPROGRESS; |
6701 | goto out; | 6703 | goto out; |
6702 | } | 6704 | } |
6703 | 6705 | ||
6704 | static int sctp_wait_for_accept(struct sock *sk, long timeo) | 6706 | static int sctp_wait_for_accept(struct sock *sk, long timeo) |
6705 | { | 6707 | { |
6706 | struct sctp_endpoint *ep; | 6708 | struct sctp_endpoint *ep; |
6707 | int err = 0; | 6709 | int err = 0; |
6708 | DEFINE_WAIT(wait); | 6710 | DEFINE_WAIT(wait); |
6709 | 6711 | ||
6710 | ep = sctp_sk(sk)->ep; | 6712 | ep = sctp_sk(sk)->ep; |
6711 | 6713 | ||
6712 | 6714 | ||
6713 | for (;;) { | 6715 | for (;;) { |
6714 | prepare_to_wait_exclusive(sk_sleep(sk), &wait, | 6716 | prepare_to_wait_exclusive(sk_sleep(sk), &wait, |
6715 | TASK_INTERRUPTIBLE); | 6717 | TASK_INTERRUPTIBLE); |
6716 | 6718 | ||
6717 | if (list_empty(&ep->asocs)) { | 6719 | if (list_empty(&ep->asocs)) { |
6718 | sctp_release_sock(sk); | 6720 | sctp_release_sock(sk); |
6719 | timeo = schedule_timeout(timeo); | 6721 | timeo = schedule_timeout(timeo); |
6720 | sctp_lock_sock(sk); | 6722 | sctp_lock_sock(sk); |
6721 | } | 6723 | } |
6722 | 6724 | ||
6723 | err = -EINVAL; | 6725 | err = -EINVAL; |
6724 | if (!sctp_sstate(sk, LISTENING)) | 6726 | if (!sctp_sstate(sk, LISTENING)) |
6725 | break; | 6727 | break; |
6726 | 6728 | ||
6727 | err = 0; | 6729 | err = 0; |
6728 | if (!list_empty(&ep->asocs)) | 6730 | if (!list_empty(&ep->asocs)) |
6729 | break; | 6731 | break; |
6730 | 6732 | ||
6731 | err = sock_intr_errno(timeo); | 6733 | err = sock_intr_errno(timeo); |
6732 | if (signal_pending(current)) | 6734 | if (signal_pending(current)) |
6733 | break; | 6735 | break; |
6734 | 6736 | ||
6735 | err = -EAGAIN; | 6737 | err = -EAGAIN; |
6736 | if (!timeo) | 6738 | if (!timeo) |
6737 | break; | 6739 | break; |
6738 | } | 6740 | } |
6739 | 6741 | ||
6740 | finish_wait(sk_sleep(sk), &wait); | 6742 | finish_wait(sk_sleep(sk), &wait); |
6741 | 6743 | ||
6742 | return err; | 6744 | return err; |
6743 | } | 6745 | } |
6744 | 6746 | ||
6745 | static void sctp_wait_for_close(struct sock *sk, long timeout) | 6747 | static void sctp_wait_for_close(struct sock *sk, long timeout) |
6746 | { | 6748 | { |
6747 | DEFINE_WAIT(wait); | 6749 | DEFINE_WAIT(wait); |
6748 | 6750 | ||
6749 | do { | 6751 | do { |
6750 | prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); | 6752 | prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); |
6751 | if (list_empty(&sctp_sk(sk)->ep->asocs)) | 6753 | if (list_empty(&sctp_sk(sk)->ep->asocs)) |
6752 | break; | 6754 | break; |
6753 | sctp_release_sock(sk); | 6755 | sctp_release_sock(sk); |
6754 | timeout = schedule_timeout(timeout); | 6756 | timeout = schedule_timeout(timeout); |
6755 | sctp_lock_sock(sk); | 6757 | sctp_lock_sock(sk); |
6756 | } while (!signal_pending(current) && timeout); | 6758 | } while (!signal_pending(current) && timeout); |
6757 | 6759 | ||
6758 | finish_wait(sk_sleep(sk), &wait); | 6760 | finish_wait(sk_sleep(sk), &wait); |
6759 | } | 6761 | } |
6760 | 6762 | ||
6761 | static void sctp_skb_set_owner_r_frag(struct sk_buff *skb, struct sock *sk) | 6763 | static void sctp_skb_set_owner_r_frag(struct sk_buff *skb, struct sock *sk) |
6762 | { | 6764 | { |
6763 | struct sk_buff *frag; | 6765 | struct sk_buff *frag; |
6764 | 6766 | ||
6765 | if (!skb->data_len) | 6767 | if (!skb->data_len) |
6766 | goto done; | 6768 | goto done; |
6767 | 6769 | ||
6768 | /* Don't forget the fragments. */ | 6770 | /* Don't forget the fragments. */ |
6769 | skb_walk_frags(skb, frag) | 6771 | skb_walk_frags(skb, frag) |
6770 | sctp_skb_set_owner_r_frag(frag, sk); | 6772 | sctp_skb_set_owner_r_frag(frag, sk); |
6771 | 6773 | ||
6772 | done: | 6774 | done: |
6773 | sctp_skb_set_owner_r(skb, sk); | 6775 | sctp_skb_set_owner_r(skb, sk); |
6774 | } | 6776 | } |
6775 | 6777 | ||
6776 | void sctp_copy_sock(struct sock *newsk, struct sock *sk, | 6778 | void sctp_copy_sock(struct sock *newsk, struct sock *sk, |
6777 | struct sctp_association *asoc) | 6779 | struct sctp_association *asoc) |
6778 | { | 6780 | { |
6779 | struct inet_sock *inet = inet_sk(sk); | 6781 | struct inet_sock *inet = inet_sk(sk); |
6780 | struct inet_sock *newinet; | 6782 | struct inet_sock *newinet; |
6781 | 6783 | ||
6782 | newsk->sk_type = sk->sk_type; | 6784 | newsk->sk_type = sk->sk_type; |
6783 | newsk->sk_bound_dev_if = sk->sk_bound_dev_if; | 6785 | newsk->sk_bound_dev_if = sk->sk_bound_dev_if; |
6784 | newsk->sk_flags = sk->sk_flags; | 6786 | newsk->sk_flags = sk->sk_flags; |
6785 | newsk->sk_no_check = sk->sk_no_check; | 6787 | newsk->sk_no_check = sk->sk_no_check; |
6786 | newsk->sk_reuse = sk->sk_reuse; | 6788 | newsk->sk_reuse = sk->sk_reuse; |
6787 | 6789 | ||
6788 | newsk->sk_shutdown = sk->sk_shutdown; | 6790 | newsk->sk_shutdown = sk->sk_shutdown; |
6789 | newsk->sk_destruct = inet_sock_destruct; | 6791 | newsk->sk_destruct = inet_sock_destruct; |
6790 | newsk->sk_family = sk->sk_family; | 6792 | newsk->sk_family = sk->sk_family; |
6791 | newsk->sk_protocol = IPPROTO_SCTP; | 6793 | newsk->sk_protocol = IPPROTO_SCTP; |
6792 | newsk->sk_backlog_rcv = sk->sk_prot->backlog_rcv; | 6794 | newsk->sk_backlog_rcv = sk->sk_prot->backlog_rcv; |
6793 | newsk->sk_sndbuf = sk->sk_sndbuf; | 6795 | newsk->sk_sndbuf = sk->sk_sndbuf; |
6794 | newsk->sk_rcvbuf = sk->sk_rcvbuf; | 6796 | newsk->sk_rcvbuf = sk->sk_rcvbuf; |
6795 | newsk->sk_lingertime = sk->sk_lingertime; | 6797 | newsk->sk_lingertime = sk->sk_lingertime; |
6796 | newsk->sk_rcvtimeo = sk->sk_rcvtimeo; | 6798 | newsk->sk_rcvtimeo = sk->sk_rcvtimeo; |
6797 | newsk->sk_sndtimeo = sk->sk_sndtimeo; | 6799 | newsk->sk_sndtimeo = sk->sk_sndtimeo; |
6798 | 6800 | ||
6799 | newinet = inet_sk(newsk); | 6801 | newinet = inet_sk(newsk); |
6800 | 6802 | ||
6801 | /* Initialize sk's sport, dport, rcv_saddr and daddr for | 6803 | /* Initialize sk's sport, dport, rcv_saddr and daddr for |
6802 | * getsockname() and getpeername() | 6804 | * getsockname() and getpeername() |
6803 | */ | 6805 | */ |
6804 | newinet->inet_sport = inet->inet_sport; | 6806 | newinet->inet_sport = inet->inet_sport; |
6805 | newinet->inet_saddr = inet->inet_saddr; | 6807 | newinet->inet_saddr = inet->inet_saddr; |
6806 | newinet->inet_rcv_saddr = inet->inet_rcv_saddr; | 6808 | newinet->inet_rcv_saddr = inet->inet_rcv_saddr; |
6807 | newinet->inet_dport = htons(asoc->peer.port); | 6809 | newinet->inet_dport = htons(asoc->peer.port); |
6808 | newinet->pmtudisc = inet->pmtudisc; | 6810 | newinet->pmtudisc = inet->pmtudisc; |
6809 | newinet->inet_id = asoc->next_tsn ^ jiffies; | 6811 | newinet->inet_id = asoc->next_tsn ^ jiffies; |
6810 | 6812 | ||
6811 | newinet->uc_ttl = inet->uc_ttl; | 6813 | newinet->uc_ttl = inet->uc_ttl; |
6812 | newinet->mc_loop = 1; | 6814 | newinet->mc_loop = 1; |
6813 | newinet->mc_ttl = 1; | 6815 | newinet->mc_ttl = 1; |
6814 | newinet->mc_index = 0; | 6816 | newinet->mc_index = 0; |
6815 | newinet->mc_list = NULL; | 6817 | newinet->mc_list = NULL; |
6816 | } | 6818 | } |
6817 | 6819 | ||
6818 | /* Populate the fields of the newsk from the oldsk and migrate the assoc | 6820 | /* Populate the fields of the newsk from the oldsk and migrate the assoc |
6819 | * and its messages to the newsk. | 6821 | * and its messages to the newsk. |
6820 | */ | 6822 | */ |
6821 | static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk, | 6823 | static void sctp_sock_migrate(struct sock *oldsk, struct sock *newsk, |
6822 | struct sctp_association *assoc, | 6824 | struct sctp_association *assoc, |
6823 | sctp_socket_type_t type) | 6825 | sctp_socket_type_t type) |
6824 | { | 6826 | { |
6825 | struct sctp_sock *oldsp = sctp_sk(oldsk); | 6827 | struct sctp_sock *oldsp = sctp_sk(oldsk); |
6826 | struct sctp_sock *newsp = sctp_sk(newsk); | 6828 | struct sctp_sock *newsp = sctp_sk(newsk); |
6827 | struct sctp_bind_bucket *pp; /* hash list port iterator */ | 6829 | struct sctp_bind_bucket *pp; /* hash list port iterator */ |
6828 | struct sctp_endpoint *newep = newsp->ep; | 6830 | struct sctp_endpoint *newep = newsp->ep; |
6829 | struct sk_buff *skb, *tmp; | 6831 | struct sk_buff *skb, *tmp; |
6830 | struct sctp_ulpevent *event; | 6832 | struct sctp_ulpevent *event; |
6831 | struct sctp_bind_hashbucket *head; | 6833 | struct sctp_bind_hashbucket *head; |
6832 | struct list_head tmplist; | 6834 | struct list_head tmplist; |
6833 | 6835 | ||
6834 | /* Migrate socket buffer sizes and all the socket level options to the | 6836 | /* Migrate socket buffer sizes and all the socket level options to the |
6835 | * new socket. | 6837 | * new socket. |
6836 | */ | 6838 | */ |
6837 | newsk->sk_sndbuf = oldsk->sk_sndbuf; | 6839 | newsk->sk_sndbuf = oldsk->sk_sndbuf; |
6838 | newsk->sk_rcvbuf = oldsk->sk_rcvbuf; | 6840 | newsk->sk_rcvbuf = oldsk->sk_rcvbuf; |
6839 | /* Brute force copy old sctp opt. */ | 6841 | /* Brute force copy old sctp opt. */ |
6840 | if (oldsp->do_auto_asconf) { | 6842 | if (oldsp->do_auto_asconf) { |
6841 | memcpy(&tmplist, &newsp->auto_asconf_list, sizeof(tmplist)); | 6843 | memcpy(&tmplist, &newsp->auto_asconf_list, sizeof(tmplist)); |
6842 | inet_sk_copy_descendant(newsk, oldsk); | 6844 | inet_sk_copy_descendant(newsk, oldsk); |
6843 | memcpy(&newsp->auto_asconf_list, &tmplist, sizeof(tmplist)); | 6845 | memcpy(&newsp->auto_asconf_list, &tmplist, sizeof(tmplist)); |
6844 | } else | 6846 | } else |
6845 | inet_sk_copy_descendant(newsk, oldsk); | 6847 | inet_sk_copy_descendant(newsk, oldsk); |
6846 | 6848 | ||
6847 | /* Restore the ep value that was overwritten with the above structure | 6849 | /* Restore the ep value that was overwritten with the above structure |
6848 | * copy. | 6850 | * copy. |
6849 | */ | 6851 | */ |
6850 | newsp->ep = newep; | 6852 | newsp->ep = newep; |
6851 | newsp->hmac = NULL; | 6853 | newsp->hmac = NULL; |
6852 | 6854 | ||
6853 | /* Hook this new socket in to the bind_hash list. */ | 6855 | /* Hook this new socket in to the bind_hash list. */ |
6854 | head = &sctp_port_hashtable[sctp_phashfn(sock_net(oldsk), | 6856 | head = &sctp_port_hashtable[sctp_phashfn(sock_net(oldsk), |
6855 | inet_sk(oldsk)->inet_num)]; | 6857 | inet_sk(oldsk)->inet_num)]; |
6856 | sctp_local_bh_disable(); | 6858 | sctp_local_bh_disable(); |
6857 | sctp_spin_lock(&head->lock); | 6859 | sctp_spin_lock(&head->lock); |
6858 | pp = sctp_sk(oldsk)->bind_hash; | 6860 | pp = sctp_sk(oldsk)->bind_hash; |
6859 | sk_add_bind_node(newsk, &pp->owner); | 6861 | sk_add_bind_node(newsk, &pp->owner); |
6860 | sctp_sk(newsk)->bind_hash = pp; | 6862 | sctp_sk(newsk)->bind_hash = pp; |
6861 | inet_sk(newsk)->inet_num = inet_sk(oldsk)->inet_num; | 6863 | inet_sk(newsk)->inet_num = inet_sk(oldsk)->inet_num; |
6862 | sctp_spin_unlock(&head->lock); | 6864 | sctp_spin_unlock(&head->lock); |
6863 | sctp_local_bh_enable(); | 6865 | sctp_local_bh_enable(); |
6864 | 6866 | ||
6865 | /* Copy the bind_addr list from the original endpoint to the new | 6867 | /* Copy the bind_addr list from the original endpoint to the new |
6866 | * endpoint so that we can handle restarts properly | 6868 | * endpoint so that we can handle restarts properly |
6867 | */ | 6869 | */ |
6868 | sctp_bind_addr_dup(&newsp->ep->base.bind_addr, | 6870 | sctp_bind_addr_dup(&newsp->ep->base.bind_addr, |
6869 | &oldsp->ep->base.bind_addr, GFP_KERNEL); | 6871 | &oldsp->ep->base.bind_addr, GFP_KERNEL); |
6870 | 6872 | ||
6871 | /* Move any messages in the old socket's receive queue that are for the | 6873 | /* Move any messages in the old socket's receive queue that are for the |
6872 | * peeled off association to the new socket's receive queue. | 6874 | * peeled off association to the new socket's receive queue. |
6873 | */ | 6875 | */ |
6874 | sctp_skb_for_each(skb, &oldsk->sk_receive_queue, tmp) { | 6876 | sctp_skb_for_each(skb, &oldsk->sk_receive_queue, tmp) { |
6875 | event = sctp_skb2event(skb); | 6877 | event = sctp_skb2event(skb); |
6876 | if (event->asoc == assoc) { | 6878 | if (event->asoc == assoc) { |
6877 | __skb_unlink(skb, &oldsk->sk_receive_queue); | 6879 | __skb_unlink(skb, &oldsk->sk_receive_queue); |
6878 | __skb_queue_tail(&newsk->sk_receive_queue, skb); | 6880 | __skb_queue_tail(&newsk->sk_receive_queue, skb); |
6879 | sctp_skb_set_owner_r_frag(skb, newsk); | 6881 | sctp_skb_set_owner_r_frag(skb, newsk); |
6880 | } | 6882 | } |
6881 | } | 6883 | } |
6882 | 6884 | ||
6883 | /* Clean up any messages pending delivery due to partial | 6885 | /* Clean up any messages pending delivery due to partial |
6884 | * delivery. Three cases: | 6886 | * delivery. Three cases: |
6885 | * 1) No partial deliver; no work. | 6887 | * 1) No partial deliver; no work. |
6886 | * 2) Peeling off partial delivery; keep pd_lobby in new pd_lobby. | 6888 | * 2) Peeling off partial delivery; keep pd_lobby in new pd_lobby. |
6887 | * 3) Peeling off non-partial delivery; move pd_lobby to receive_queue. | 6889 | * 3) Peeling off non-partial delivery; move pd_lobby to receive_queue. |
6888 | */ | 6890 | */ |
6889 | skb_queue_head_init(&newsp->pd_lobby); | 6891 | skb_queue_head_init(&newsp->pd_lobby); |
6890 | atomic_set(&sctp_sk(newsk)->pd_mode, assoc->ulpq.pd_mode); | 6892 | atomic_set(&sctp_sk(newsk)->pd_mode, assoc->ulpq.pd_mode); |
6891 | 6893 | ||
6892 | if (atomic_read(&sctp_sk(oldsk)->pd_mode)) { | 6894 | if (atomic_read(&sctp_sk(oldsk)->pd_mode)) { |
6893 | struct sk_buff_head *queue; | 6895 | struct sk_buff_head *queue; |
6894 | 6896 | ||
6895 | /* Decide which queue to move pd_lobby skbs to. */ | 6897 | /* Decide which queue to move pd_lobby skbs to. */ |
6896 | if (assoc->ulpq.pd_mode) { | 6898 | if (assoc->ulpq.pd_mode) { |
6897 | queue = &newsp->pd_lobby; | 6899 | queue = &newsp->pd_lobby; |
6898 | } else | 6900 | } else |
6899 | queue = &newsk->sk_receive_queue; | 6901 | queue = &newsk->sk_receive_queue; |
6900 | 6902 | ||
6901 | /* Walk through the pd_lobby, looking for skbs that | 6903 | /* Walk through the pd_lobby, looking for skbs that |
6902 | * need moved to the new socket. | 6904 | * need moved to the new socket. |
6903 | */ | 6905 | */ |
6904 | sctp_skb_for_each(skb, &oldsp->pd_lobby, tmp) { | 6906 | sctp_skb_for_each(skb, &oldsp->pd_lobby, tmp) { |
6905 | event = sctp_skb2event(skb); | 6907 | event = sctp_skb2event(skb); |
6906 | if (event->asoc == assoc) { | 6908 | if (event->asoc == assoc) { |
6907 | __skb_unlink(skb, &oldsp->pd_lobby); | 6909 | __skb_unlink(skb, &oldsp->pd_lobby); |
6908 | __skb_queue_tail(queue, skb); | 6910 | __skb_queue_tail(queue, skb); |
6909 | sctp_skb_set_owner_r_frag(skb, newsk); | 6911 | sctp_skb_set_owner_r_frag(skb, newsk); |
6910 | } | 6912 | } |
6911 | } | 6913 | } |
6912 | 6914 | ||
6913 | /* Clear up any skbs waiting for the partial | 6915 | /* Clear up any skbs waiting for the partial |
6914 | * delivery to finish. | 6916 | * delivery to finish. |
6915 | */ | 6917 | */ |
6916 | if (assoc->ulpq.pd_mode) | 6918 | if (assoc->ulpq.pd_mode) |
6917 | sctp_clear_pd(oldsk, NULL); | 6919 | sctp_clear_pd(oldsk, NULL); |
6918 | 6920 | ||
6919 | } | 6921 | } |
6920 | 6922 | ||
6921 | sctp_skb_for_each(skb, &assoc->ulpq.reasm, tmp) | 6923 | sctp_skb_for_each(skb, &assoc->ulpq.reasm, tmp) |
6922 | sctp_skb_set_owner_r_frag(skb, newsk); | 6924 | sctp_skb_set_owner_r_frag(skb, newsk); |
6923 | 6925 | ||
6924 | sctp_skb_for_each(skb, &assoc->ulpq.lobby, tmp) | 6926 | sctp_skb_for_each(skb, &assoc->ulpq.lobby, tmp) |
6925 | sctp_skb_set_owner_r_frag(skb, newsk); | 6927 | sctp_skb_set_owner_r_frag(skb, newsk); |
6926 | 6928 | ||
6927 | /* Set the type of socket to indicate that it is peeled off from the | 6929 | /* Set the type of socket to indicate that it is peeled off from the |
6928 | * original UDP-style socket or created with the accept() call on a | 6930 | * original UDP-style socket or created with the accept() call on a |
6929 | * TCP-style socket.. | 6931 | * TCP-style socket.. |
6930 | */ | 6932 | */ |
6931 | newsp->type = type; | 6933 | newsp->type = type; |
6932 | 6934 | ||
6933 | /* Mark the new socket "in-use" by the user so that any packets | 6935 | /* Mark the new socket "in-use" by the user so that any packets |
6934 | * that may arrive on the association after we've moved it are | 6936 | * that may arrive on the association after we've moved it are |
6935 | * queued to the backlog. This prevents a potential race between | 6937 | * queued to the backlog. This prevents a potential race between |
6936 | * backlog processing on the old socket and new-packet processing | 6938 | * backlog processing on the old socket and new-packet processing |
6937 | * on the new socket. | 6939 | * on the new socket. |
6938 | * | 6940 | * |
6939 | * The caller has just allocated newsk so we can guarantee that other | 6941 | * The caller has just allocated newsk so we can guarantee that other |
6940 | * paths won't try to lock it and then oldsk. | 6942 | * paths won't try to lock it and then oldsk. |
6941 | */ | 6943 | */ |
6942 | lock_sock_nested(newsk, SINGLE_DEPTH_NESTING); | 6944 | lock_sock_nested(newsk, SINGLE_DEPTH_NESTING); |
6943 | sctp_assoc_migrate(assoc, newsk); | 6945 | sctp_assoc_migrate(assoc, newsk); |
6944 | 6946 | ||
6945 | /* If the association on the newsk is already closed before accept() | 6947 | /* If the association on the newsk is already closed before accept() |
6946 | * is called, set RCV_SHUTDOWN flag. | 6948 | * is called, set RCV_SHUTDOWN flag. |
6947 | */ | 6949 | */ |
6948 | if (sctp_state(assoc, CLOSED) && sctp_style(newsk, TCP)) | 6950 | if (sctp_state(assoc, CLOSED) && sctp_style(newsk, TCP)) |
6949 | newsk->sk_shutdown |= RCV_SHUTDOWN; | 6951 | newsk->sk_shutdown |= RCV_SHUTDOWN; |
6950 | 6952 | ||
6951 | newsk->sk_state = SCTP_SS_ESTABLISHED; | 6953 | newsk->sk_state = SCTP_SS_ESTABLISHED; |
6952 | sctp_release_sock(newsk); | 6954 | sctp_release_sock(newsk); |
6953 | } | 6955 | } |
6954 | 6956 | ||
6955 | 6957 | ||
6956 | /* This proto struct describes the ULP interface for SCTP. */ | 6958 | /* This proto struct describes the ULP interface for SCTP. */ |
6957 | struct proto sctp_prot = { | 6959 | struct proto sctp_prot = { |
6958 | .name = "SCTP", | 6960 | .name = "SCTP", |
6959 | .owner = THIS_MODULE, | 6961 | .owner = THIS_MODULE, |
6960 | .close = sctp_close, | 6962 | .close = sctp_close, |
6961 | .connect = sctp_connect, | 6963 | .connect = sctp_connect, |
6962 | .disconnect = sctp_disconnect, | 6964 | .disconnect = sctp_disconnect, |
6963 | .accept = sctp_accept, | 6965 | .accept = sctp_accept, |
6964 | .ioctl = sctp_ioctl, | 6966 | .ioctl = sctp_ioctl, |
6965 | .init = sctp_init_sock, | 6967 | .init = sctp_init_sock, |
6966 | .destroy = sctp_destroy_sock, | 6968 | .destroy = sctp_destroy_sock, |
6967 | .shutdown = sctp_shutdown, | 6969 | .shutdown = sctp_shutdown, |
6968 | .setsockopt = sctp_setsockopt, | 6970 | .setsockopt = sctp_setsockopt, |
6969 | .getsockopt = sctp_getsockopt, | 6971 | .getsockopt = sctp_getsockopt, |
6970 | .sendmsg = sctp_sendmsg, | 6972 | .sendmsg = sctp_sendmsg, |
6971 | .recvmsg = sctp_recvmsg, | 6973 | .recvmsg = sctp_recvmsg, |
6972 | .bind = sctp_bind, | 6974 | .bind = sctp_bind, |
6973 | .backlog_rcv = sctp_backlog_rcv, | 6975 | .backlog_rcv = sctp_backlog_rcv, |
6974 | .hash = sctp_hash, | 6976 | .hash = sctp_hash, |
6975 | .unhash = sctp_unhash, | 6977 | .unhash = sctp_unhash, |
6976 | .get_port = sctp_get_port, | 6978 | .get_port = sctp_get_port, |
6977 | .obj_size = sizeof(struct sctp_sock), | 6979 | .obj_size = sizeof(struct sctp_sock), |
6978 | .sysctl_mem = sysctl_sctp_mem, | 6980 | .sysctl_mem = sysctl_sctp_mem, |
6979 | .sysctl_rmem = sysctl_sctp_rmem, | 6981 | .sysctl_rmem = sysctl_sctp_rmem, |
6980 | .sysctl_wmem = sysctl_sctp_wmem, | 6982 | .sysctl_wmem = sysctl_sctp_wmem, |
6981 | .memory_pressure = &sctp_memory_pressure, | 6983 | .memory_pressure = &sctp_memory_pressure, |
6982 | .enter_memory_pressure = sctp_enter_memory_pressure, | 6984 | .enter_memory_pressure = sctp_enter_memory_pressure, |
6983 | .memory_allocated = &sctp_memory_allocated, | 6985 | .memory_allocated = &sctp_memory_allocated, |
6984 | .sockets_allocated = &sctp_sockets_allocated, | 6986 | .sockets_allocated = &sctp_sockets_allocated, |
6985 | }; | 6987 | }; |
6986 | 6988 | ||
6987 | #if IS_ENABLED(CONFIG_IPV6) | 6989 | #if IS_ENABLED(CONFIG_IPV6) |
6988 | 6990 | ||
6989 | struct proto sctpv6_prot = { | 6991 | struct proto sctpv6_prot = { |
6990 | .name = "SCTPv6", | 6992 | .name = "SCTPv6", |
6991 | .owner = THIS_MODULE, | 6993 | .owner = THIS_MODULE, |
6992 | .close = sctp_close, | 6994 | .close = sctp_close, |
6993 | .connect = sctp_connect, | 6995 | .connect = sctp_connect, |
6994 | .disconnect = sctp_disconnect, | 6996 | .disconnect = sctp_disconnect, |
6995 | .accept = sctp_accept, | 6997 | .accept = sctp_accept, |
6996 | .ioctl = sctp_ioctl, | 6998 | .ioctl = sctp_ioctl, |
6997 | .init = sctp_init_sock, | 6999 | .init = sctp_init_sock, |
6998 | .destroy = sctp_destroy_sock, | 7000 | .destroy = sctp_destroy_sock, |
6999 | .shutdown = sctp_shutdown, | 7001 | .shutdown = sctp_shutdown, |
7000 | .setsockopt = sctp_setsockopt, | 7002 | .setsockopt = sctp_setsockopt, |
7001 | .getsockopt = sctp_getsockopt, | 7003 | .getsockopt = sctp_getsockopt, |
7002 | .sendmsg = sctp_sendmsg, | 7004 | .sendmsg = sctp_sendmsg, |
7003 | .recvmsg = sctp_recvmsg, | 7005 | .recvmsg = sctp_recvmsg, |
7004 | .bind = sctp_bind, | 7006 | .bind = sctp_bind, |
7005 | .backlog_rcv = sctp_backlog_rcv, | 7007 | .backlog_rcv = sctp_backlog_rcv, |
7006 | .hash = sctp_hash, | 7008 | .hash = sctp_hash, |
7007 | .unhash = sctp_unhash, | 7009 | .unhash = sctp_unhash, |
7008 | .get_port = sctp_get_port, | 7010 | .get_port = sctp_get_port, |
7009 | .obj_size = sizeof(struct sctp6_sock), | 7011 | .obj_size = sizeof(struct sctp6_sock), |
7010 | .sysctl_mem = sysctl_sctp_mem, | 7012 | .sysctl_mem = sysctl_sctp_mem, |
7011 | .sysctl_rmem = sysctl_sctp_rmem, | 7013 | .sysctl_rmem = sysctl_sctp_rmem, |
7012 | .sysctl_wmem = sysctl_sctp_wmem, | 7014 | .sysctl_wmem = sysctl_sctp_wmem, |
7013 | .memory_pressure = &sctp_memory_pressure, | 7015 | .memory_pressure = &sctp_memory_pressure, |
7014 | .enter_memory_pressure = sctp_enter_memory_pressure, | 7016 | .enter_memory_pressure = sctp_enter_memory_pressure, |
7015 | .memory_allocated = &sctp_memory_allocated, | 7017 | .memory_allocated = &sctp_memory_allocated, |
7016 | .sockets_allocated = &sctp_sockets_allocated, | 7018 | .sockets_allocated = &sctp_sockets_allocated, |
7017 | }; | 7019 | }; |
7018 | #endif /* IS_ENABLED(CONFIG_IPV6) */ | 7020 | #endif /* IS_ENABLED(CONFIG_IPV6) */ |
7019 | 7021 |