Commit b0573dea1fb32ebc72ffa05980fd840df1d80860

Authored by Patrick McHardy
Committed by David S. Miller
1 parent f9e815b376

[NET]: Introduce SO_{SND,RCV}BUFFORCE socket options

Allows overriding of sysctl_{wmem,rmrm}_max

Signed-off-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>

Showing 22 changed files with 58 additions and 2 deletions Inline Diff

include/asm-alpha/socket.h
1 #ifndef _ASM_SOCKET_H 1 #ifndef _ASM_SOCKET_H
2 #define _ASM_SOCKET_H 2 #define _ASM_SOCKET_H
3 3
4 #include <asm/sockios.h> 4 #include <asm/sockios.h>
5 5
6 /* For setsockopt(2) */ 6 /* For setsockopt(2) */
7 /* 7 /*
8 * Note: we only bother about making the SOL_SOCKET options 8 * Note: we only bother about making the SOL_SOCKET options
9 * same as OSF/1, as that's all that "normal" programs are 9 * same as OSF/1, as that's all that "normal" programs are
10 * likely to set. We don't necessarily want to be binary 10 * likely to set. We don't necessarily want to be binary
11 * compatible with _everything_. 11 * compatible with _everything_.
12 */ 12 */
13 #define SOL_SOCKET 0xffff 13 #define SOL_SOCKET 0xffff
14 14
15 #define SO_DEBUG 0x0001 15 #define SO_DEBUG 0x0001
16 #define SO_REUSEADDR 0x0004 16 #define SO_REUSEADDR 0x0004
17 #define SO_KEEPALIVE 0x0008 17 #define SO_KEEPALIVE 0x0008
18 #define SO_DONTROUTE 0x0010 18 #define SO_DONTROUTE 0x0010
19 #define SO_BROADCAST 0x0020 19 #define SO_BROADCAST 0x0020
20 #define SO_LINGER 0x0080 20 #define SO_LINGER 0x0080
21 #define SO_OOBINLINE 0x0100 21 #define SO_OOBINLINE 0x0100
22 /* To add :#define SO_REUSEPORT 0x0200 */ 22 /* To add :#define SO_REUSEPORT 0x0200 */
23 23
24 #define SO_TYPE 0x1008 24 #define SO_TYPE 0x1008
25 #define SO_ERROR 0x1007 25 #define SO_ERROR 0x1007
26 #define SO_SNDBUF 0x1001 26 #define SO_SNDBUF 0x1001
27 #define SO_RCVBUF 0x1002 27 #define SO_RCVBUF 0x1002
28 #define SO_SNDBUFFORCE 0x100a
29 #define SO_RCVBUFFORCE 0x100b
28 #define SO_RCVLOWAT 0x1010 30 #define SO_RCVLOWAT 0x1010
29 #define SO_SNDLOWAT 0x1011 31 #define SO_SNDLOWAT 0x1011
30 #define SO_RCVTIMEO 0x1012 32 #define SO_RCVTIMEO 0x1012
31 #define SO_SNDTIMEO 0x1013 33 #define SO_SNDTIMEO 0x1013
32 #define SO_ACCEPTCONN 0x1014 34 #define SO_ACCEPTCONN 0x1014
33 35
34 /* linux-specific, might as well be the same as on i386 */ 36 /* linux-specific, might as well be the same as on i386 */
35 #define SO_NO_CHECK 11 37 #define SO_NO_CHECK 11
36 #define SO_PRIORITY 12 38 #define SO_PRIORITY 12
37 #define SO_BSDCOMPAT 14 39 #define SO_BSDCOMPAT 14
38 40
39 #define SO_PASSCRED 17 41 #define SO_PASSCRED 17
40 #define SO_PEERCRED 18 42 #define SO_PEERCRED 18
41 #define SO_BINDTODEVICE 25 43 #define SO_BINDTODEVICE 25
42 44
43 /* Socket filtering */ 45 /* Socket filtering */
44 #define SO_ATTACH_FILTER 26 46 #define SO_ATTACH_FILTER 26
45 #define SO_DETACH_FILTER 27 47 #define SO_DETACH_FILTER 27
46 48
47 #define SO_PEERNAME 28 49 #define SO_PEERNAME 28
48 #define SO_TIMESTAMP 29 50 #define SO_TIMESTAMP 29
49 #define SCM_TIMESTAMP SO_TIMESTAMP 51 #define SCM_TIMESTAMP SO_TIMESTAMP
50 52
51 #define SO_PEERSEC 30 53 #define SO_PEERSEC 30
52 54
53 /* Security levels - as per NRL IPv6 - don't actually do anything */ 55 /* Security levels - as per NRL IPv6 - don't actually do anything */
54 #define SO_SECURITY_AUTHENTICATION 19 56 #define SO_SECURITY_AUTHENTICATION 19
55 #define SO_SECURITY_ENCRYPTION_TRANSPORT 20 57 #define SO_SECURITY_ENCRYPTION_TRANSPORT 20
56 #define SO_SECURITY_ENCRYPTION_NETWORK 21 58 #define SO_SECURITY_ENCRYPTION_NETWORK 21
57 59
58 #endif /* _ASM_SOCKET_H */ 60 #endif /* _ASM_SOCKET_H */
59 61
include/asm-arm/socket.h
1 #ifndef _ASMARM_SOCKET_H 1 #ifndef _ASMARM_SOCKET_H
2 #define _ASMARM_SOCKET_H 2 #define _ASMARM_SOCKET_H
3 3
4 #include <asm/sockios.h> 4 #include <asm/sockios.h>
5 5
6 /* For setsockopt(2) */ 6 /* For setsockopt(2) */
7 #define SOL_SOCKET 1 7 #define SOL_SOCKET 1
8 8
9 #define SO_DEBUG 1 9 #define SO_DEBUG 1
10 #define SO_REUSEADDR 2 10 #define SO_REUSEADDR 2
11 #define SO_TYPE 3 11 #define SO_TYPE 3
12 #define SO_ERROR 4 12 #define SO_ERROR 4
13 #define SO_DONTROUTE 5 13 #define SO_DONTROUTE 5
14 #define SO_BROADCAST 6 14 #define SO_BROADCAST 6
15 #define SO_SNDBUF 7 15 #define SO_SNDBUF 7
16 #define SO_RCVBUF 8 16 #define SO_RCVBUF 8
17 #define SO_SNDBUFFORCE 32
18 #define SO_RCVBUFFORCE 33
17 #define SO_KEEPALIVE 9 19 #define SO_KEEPALIVE 9
18 #define SO_OOBINLINE 10 20 #define SO_OOBINLINE 10
19 #define SO_NO_CHECK 11 21 #define SO_NO_CHECK 11
20 #define SO_PRIORITY 12 22 #define SO_PRIORITY 12
21 #define SO_LINGER 13 23 #define SO_LINGER 13
22 #define SO_BSDCOMPAT 14 24 #define SO_BSDCOMPAT 14
23 /* To add :#define SO_REUSEPORT 15 */ 25 /* To add :#define SO_REUSEPORT 15 */
24 #define SO_PASSCRED 16 26 #define SO_PASSCRED 16
25 #define SO_PEERCRED 17 27 #define SO_PEERCRED 17
26 #define SO_RCVLOWAT 18 28 #define SO_RCVLOWAT 18
27 #define SO_SNDLOWAT 19 29 #define SO_SNDLOWAT 19
28 #define SO_RCVTIMEO 20 30 #define SO_RCVTIMEO 20
29 #define SO_SNDTIMEO 21 31 #define SO_SNDTIMEO 21
30 32
31 /* Security levels - as per NRL IPv6 - don't actually do anything */ 33 /* Security levels - as per NRL IPv6 - don't actually do anything */
32 #define SO_SECURITY_AUTHENTICATION 22 34 #define SO_SECURITY_AUTHENTICATION 22
33 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23 35 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23
34 #define SO_SECURITY_ENCRYPTION_NETWORK 24 36 #define SO_SECURITY_ENCRYPTION_NETWORK 24
35 37
36 #define SO_BINDTODEVICE 25 38 #define SO_BINDTODEVICE 25
37 39
38 /* Socket filtering */ 40 /* Socket filtering */
39 #define SO_ATTACH_FILTER 26 41 #define SO_ATTACH_FILTER 26
40 #define SO_DETACH_FILTER 27 42 #define SO_DETACH_FILTER 27
41 43
42 #define SO_PEERNAME 28 44 #define SO_PEERNAME 28
43 #define SO_TIMESTAMP 29 45 #define SO_TIMESTAMP 29
44 #define SCM_TIMESTAMP SO_TIMESTAMP 46 #define SCM_TIMESTAMP SO_TIMESTAMP
45 47
46 #define SO_ACCEPTCONN 30 48 #define SO_ACCEPTCONN 30
47 49
48 #define SO_PEERSEC 31 50 #define SO_PEERSEC 31
49 51
50 #endif /* _ASM_SOCKET_H */ 52 #endif /* _ASM_SOCKET_H */
51 53
include/asm-arm26/socket.h
1 #ifndef _ASMARM_SOCKET_H 1 #ifndef _ASMARM_SOCKET_H
2 #define _ASMARM_SOCKET_H 2 #define _ASMARM_SOCKET_H
3 3
4 #include <asm/sockios.h> 4 #include <asm/sockios.h>
5 5
6 /* For setsockopt(2) */ 6 /* For setsockopt(2) */
7 #define SOL_SOCKET 1 7 #define SOL_SOCKET 1
8 8
9 #define SO_DEBUG 1 9 #define SO_DEBUG 1
10 #define SO_REUSEADDR 2 10 #define SO_REUSEADDR 2
11 #define SO_TYPE 3 11 #define SO_TYPE 3
12 #define SO_ERROR 4 12 #define SO_ERROR 4
13 #define SO_DONTROUTE 5 13 #define SO_DONTROUTE 5
14 #define SO_BROADCAST 6 14 #define SO_BROADCAST 6
15 #define SO_SNDBUF 7 15 #define SO_SNDBUF 7
16 #define SO_RCVBUF 8 16 #define SO_RCVBUF 8
17 #define SO_SNDBUFFORCE 32
18 #define SO_RCVBUFFORCE 33
17 #define SO_KEEPALIVE 9 19 #define SO_KEEPALIVE 9
18 #define SO_OOBINLINE 10 20 #define SO_OOBINLINE 10
19 #define SO_NO_CHECK 11 21 #define SO_NO_CHECK 11
20 #define SO_PRIORITY 12 22 #define SO_PRIORITY 12
21 #define SO_LINGER 13 23 #define SO_LINGER 13
22 #define SO_BSDCOMPAT 14 24 #define SO_BSDCOMPAT 14
23 /* To add :#define SO_REUSEPORT 15 */ 25 /* To add :#define SO_REUSEPORT 15 */
24 #define SO_PASSCRED 16 26 #define SO_PASSCRED 16
25 #define SO_PEERCRED 17 27 #define SO_PEERCRED 17
26 #define SO_RCVLOWAT 18 28 #define SO_RCVLOWAT 18
27 #define SO_SNDLOWAT 19 29 #define SO_SNDLOWAT 19
28 #define SO_RCVTIMEO 20 30 #define SO_RCVTIMEO 20
29 #define SO_SNDTIMEO 21 31 #define SO_SNDTIMEO 21
30 32
31 /* Security levels - as per NRL IPv6 - don't actually do anything */ 33 /* Security levels - as per NRL IPv6 - don't actually do anything */
32 #define SO_SECURITY_AUTHENTICATION 22 34 #define SO_SECURITY_AUTHENTICATION 22
33 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23 35 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23
34 #define SO_SECURITY_ENCRYPTION_NETWORK 24 36 #define SO_SECURITY_ENCRYPTION_NETWORK 24
35 37
36 #define SO_BINDTODEVICE 25 38 #define SO_BINDTODEVICE 25
37 39
38 /* Socket filtering */ 40 /* Socket filtering */
39 #define SO_ATTACH_FILTER 26 41 #define SO_ATTACH_FILTER 26
40 #define SO_DETACH_FILTER 27 42 #define SO_DETACH_FILTER 27
41 43
42 #define SO_PEERNAME 28 44 #define SO_PEERNAME 28
43 #define SO_TIMESTAMP 29 45 #define SO_TIMESTAMP 29
44 #define SCM_TIMESTAMP SO_TIMESTAMP 46 #define SCM_TIMESTAMP SO_TIMESTAMP
45 47
46 #define SO_ACCEPTCONN 30 48 #define SO_ACCEPTCONN 30
47 49
48 #define SO_PEERSEC 31 50 #define SO_PEERSEC 31
49 51
50 #endif /* _ASM_SOCKET_H */ 52 #endif /* _ASM_SOCKET_H */
51 53
include/asm-cris/socket.h
1 #ifndef _ASM_SOCKET_H 1 #ifndef _ASM_SOCKET_H
2 #define _ASM_SOCKET_H 2 #define _ASM_SOCKET_H
3 3
4 /* almost the same as asm-i386/socket.h */ 4 /* almost the same as asm-i386/socket.h */
5 5
6 #include <asm/sockios.h> 6 #include <asm/sockios.h>
7 7
8 /* For setsockoptions(2) */ 8 /* For setsockoptions(2) */
9 #define SOL_SOCKET 1 9 #define SOL_SOCKET 1
10 10
11 #define SO_DEBUG 1 11 #define SO_DEBUG 1
12 #define SO_REUSEADDR 2 12 #define SO_REUSEADDR 2
13 #define SO_TYPE 3 13 #define SO_TYPE 3
14 #define SO_ERROR 4 14 #define SO_ERROR 4
15 #define SO_DONTROUTE 5 15 #define SO_DONTROUTE 5
16 #define SO_BROADCAST 6 16 #define SO_BROADCAST 6
17 #define SO_SNDBUF 7 17 #define SO_SNDBUF 7
18 #define SO_RCVBUF 8 18 #define SO_RCVBUF 8
19 #define SO_SNDBUFFORCE 32
20 #define SO_RCVBUFFORCE 33
19 #define SO_KEEPALIVE 9 21 #define SO_KEEPALIVE 9
20 #define SO_OOBINLINE 10 22 #define SO_OOBINLINE 10
21 #define SO_NO_CHECK 11 23 #define SO_NO_CHECK 11
22 #define SO_PRIORITY 12 24 #define SO_PRIORITY 12
23 #define SO_LINGER 13 25 #define SO_LINGER 13
24 #define SO_BSDCOMPAT 14 26 #define SO_BSDCOMPAT 14
25 /* To add :#define SO_REUSEPORT 15 */ 27 /* To add :#define SO_REUSEPORT 15 */
26 #define SO_PASSCRED 16 28 #define SO_PASSCRED 16
27 #define SO_PEERCRED 17 29 #define SO_PEERCRED 17
28 #define SO_RCVLOWAT 18 30 #define SO_RCVLOWAT 18
29 #define SO_SNDLOWAT 19 31 #define SO_SNDLOWAT 19
30 #define SO_RCVTIMEO 20 32 #define SO_RCVTIMEO 20
31 #define SO_SNDTIMEO 21 33 #define SO_SNDTIMEO 21
32 34
33 /* Security levels - as per NRL IPv6 - don't actually do anything */ 35 /* Security levels - as per NRL IPv6 - don't actually do anything */
34 #define SO_SECURITY_AUTHENTICATION 22 36 #define SO_SECURITY_AUTHENTICATION 22
35 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23 37 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23
36 #define SO_SECURITY_ENCRYPTION_NETWORK 24 38 #define SO_SECURITY_ENCRYPTION_NETWORK 24
37 39
38 #define SO_BINDTODEVICE 25 40 #define SO_BINDTODEVICE 25
39 41
40 /* Socket filtering */ 42 /* Socket filtering */
41 #define SO_ATTACH_FILTER 26 43 #define SO_ATTACH_FILTER 26
42 #define SO_DETACH_FILTER 27 44 #define SO_DETACH_FILTER 27
43 45
44 #define SO_PEERNAME 28 46 #define SO_PEERNAME 28
45 #define SO_TIMESTAMP 29 47 #define SO_TIMESTAMP 29
46 #define SCM_TIMESTAMP SO_TIMESTAMP 48 #define SCM_TIMESTAMP SO_TIMESTAMP
47 49
48 #define SO_ACCEPTCONN 30 50 #define SO_ACCEPTCONN 30
49 51
50 #define SO_PEERSEC 31 52 #define SO_PEERSEC 31
51 53
52 #endif /* _ASM_SOCKET_H */ 54 #endif /* _ASM_SOCKET_H */
53 55
54 56
55 57
include/asm-frv/socket.h
1 #ifndef _ASM_SOCKET_H 1 #ifndef _ASM_SOCKET_H
2 #define _ASM_SOCKET_H 2 #define _ASM_SOCKET_H
3 3
4 #include <asm/sockios.h> 4 #include <asm/sockios.h>
5 5
6 /* For setsockopt(2) */ 6 /* For setsockopt(2) */
7 #define SOL_SOCKET 1 7 #define SOL_SOCKET 1
8 8
9 #define SO_DEBUG 1 9 #define SO_DEBUG 1
10 #define SO_REUSEADDR 2 10 #define SO_REUSEADDR 2
11 #define SO_TYPE 3 11 #define SO_TYPE 3
12 #define SO_ERROR 4 12 #define SO_ERROR 4
13 #define SO_DONTROUTE 5 13 #define SO_DONTROUTE 5
14 #define SO_BROADCAST 6 14 #define SO_BROADCAST 6
15 #define SO_SNDBUF 7 15 #define SO_SNDBUF 7
16 #define SO_RCVBUF 8 16 #define SO_RCVBUF 8
17 #define SO_SNDBUFFORCE 32
18 #define SO_RCVBUFFORCE 33
17 #define SO_KEEPALIVE 9 19 #define SO_KEEPALIVE 9
18 #define SO_OOBINLINE 10 20 #define SO_OOBINLINE 10
19 #define SO_NO_CHECK 11 21 #define SO_NO_CHECK 11
20 #define SO_PRIORITY 12 22 #define SO_PRIORITY 12
21 #define SO_LINGER 13 23 #define SO_LINGER 13
22 #define SO_BSDCOMPAT 14 24 #define SO_BSDCOMPAT 14
23 /* To add :#define SO_REUSEPORT 15 */ 25 /* To add :#define SO_REUSEPORT 15 */
24 #define SO_PASSCRED 16 26 #define SO_PASSCRED 16
25 #define SO_PEERCRED 17 27 #define SO_PEERCRED 17
26 #define SO_RCVLOWAT 18 28 #define SO_RCVLOWAT 18
27 #define SO_SNDLOWAT 19 29 #define SO_SNDLOWAT 19
28 #define SO_RCVTIMEO 20 30 #define SO_RCVTIMEO 20
29 #define SO_SNDTIMEO 21 31 #define SO_SNDTIMEO 21
30 32
31 /* Security levels - as per NRL IPv6 - don't actually do anything */ 33 /* Security levels - as per NRL IPv6 - don't actually do anything */
32 #define SO_SECURITY_AUTHENTICATION 22 34 #define SO_SECURITY_AUTHENTICATION 22
33 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23 35 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23
34 #define SO_SECURITY_ENCRYPTION_NETWORK 24 36 #define SO_SECURITY_ENCRYPTION_NETWORK 24
35 37
36 #define SO_BINDTODEVICE 25 38 #define SO_BINDTODEVICE 25
37 39
38 /* Socket filtering */ 40 /* Socket filtering */
39 #define SO_ATTACH_FILTER 26 41 #define SO_ATTACH_FILTER 26
40 #define SO_DETACH_FILTER 27 42 #define SO_DETACH_FILTER 27
41 43
42 #define SO_PEERNAME 28 44 #define SO_PEERNAME 28
43 #define SO_TIMESTAMP 29 45 #define SO_TIMESTAMP 29
44 #define SCM_TIMESTAMP SO_TIMESTAMP 46 #define SCM_TIMESTAMP SO_TIMESTAMP
45 47
46 #define SO_ACCEPTCONN 30 48 #define SO_ACCEPTCONN 30
47 49
48 #define SO_PEERSEC 31 50 #define SO_PEERSEC 31
49 51
50 #endif /* _ASM_SOCKET_H */ 52 #endif /* _ASM_SOCKET_H */
51 53
52 54
include/asm-h8300/socket.h
1 #ifndef _ASM_SOCKET_H 1 #ifndef _ASM_SOCKET_H
2 #define _ASM_SOCKET_H 2 #define _ASM_SOCKET_H
3 3
4 #include <asm/sockios.h> 4 #include <asm/sockios.h>
5 5
6 /* For setsockoptions(2) */ 6 /* For setsockoptions(2) */
7 #define SOL_SOCKET 1 7 #define SOL_SOCKET 1
8 8
9 #define SO_DEBUG 1 9 #define SO_DEBUG 1
10 #define SO_REUSEADDR 2 10 #define SO_REUSEADDR 2
11 #define SO_TYPE 3 11 #define SO_TYPE 3
12 #define SO_ERROR 4 12 #define SO_ERROR 4
13 #define SO_DONTROUTE 5 13 #define SO_DONTROUTE 5
14 #define SO_BROADCAST 6 14 #define SO_BROADCAST 6
15 #define SO_SNDBUF 7 15 #define SO_SNDBUF 7
16 #define SO_RCVBUF 8 16 #define SO_RCVBUF 8
17 #define SO_SNDBUFFORCE 32
18 #define SO_RCVBUFFORCE 33
17 #define SO_KEEPALIVE 9 19 #define SO_KEEPALIVE 9
18 #define SO_OOBINLINE 10 20 #define SO_OOBINLINE 10
19 #define SO_NO_CHECK 11 21 #define SO_NO_CHECK 11
20 #define SO_PRIORITY 12 22 #define SO_PRIORITY 12
21 #define SO_LINGER 13 23 #define SO_LINGER 13
22 #define SO_BSDCOMPAT 14 24 #define SO_BSDCOMPAT 14
23 /* To add :#define SO_REUSEPORT 15 */ 25 /* To add :#define SO_REUSEPORT 15 */
24 #define SO_PASSCRED 16 26 #define SO_PASSCRED 16
25 #define SO_PEERCRED 17 27 #define SO_PEERCRED 17
26 #define SO_RCVLOWAT 18 28 #define SO_RCVLOWAT 18
27 #define SO_SNDLOWAT 19 29 #define SO_SNDLOWAT 19
28 #define SO_RCVTIMEO 20 30 #define SO_RCVTIMEO 20
29 #define SO_SNDTIMEO 21 31 #define SO_SNDTIMEO 21
30 32
31 /* Security levels - as per NRL IPv6 - don't actually do anything */ 33 /* Security levels - as per NRL IPv6 - don't actually do anything */
32 #define SO_SECURITY_AUTHENTICATION 22 34 #define SO_SECURITY_AUTHENTICATION 22
33 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23 35 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23
34 #define SO_SECURITY_ENCRYPTION_NETWORK 24 36 #define SO_SECURITY_ENCRYPTION_NETWORK 24
35 37
36 #define SO_BINDTODEVICE 25 38 #define SO_BINDTODEVICE 25
37 39
38 /* Socket filtering */ 40 /* Socket filtering */
39 #define SO_ATTACH_FILTER 26 41 #define SO_ATTACH_FILTER 26
40 #define SO_DETACH_FILTER 27 42 #define SO_DETACH_FILTER 27
41 43
42 #define SO_PEERNAME 28 44 #define SO_PEERNAME 28
43 #define SO_TIMESTAMP 29 45 #define SO_TIMESTAMP 29
44 #define SCM_TIMESTAMP SO_TIMESTAMP 46 #define SCM_TIMESTAMP SO_TIMESTAMP
45 47
46 #define SO_ACCEPTCONN 30 48 #define SO_ACCEPTCONN 30
47 49
48 #define SO_PEERSEC 31 50 #define SO_PEERSEC 31
49 51
50 #endif /* _ASM_SOCKET_H */ 52 #endif /* _ASM_SOCKET_H */
51 53
include/asm-i386/socket.h
1 #ifndef _ASM_SOCKET_H 1 #ifndef _ASM_SOCKET_H
2 #define _ASM_SOCKET_H 2 #define _ASM_SOCKET_H
3 3
4 #include <asm/sockios.h> 4 #include <asm/sockios.h>
5 5
6 /* For setsockopt(2) */ 6 /* For setsockopt(2) */
7 #define SOL_SOCKET 1 7 #define SOL_SOCKET 1
8 8
9 #define SO_DEBUG 1 9 #define SO_DEBUG 1
10 #define SO_REUSEADDR 2 10 #define SO_REUSEADDR 2
11 #define SO_TYPE 3 11 #define SO_TYPE 3
12 #define SO_ERROR 4 12 #define SO_ERROR 4
13 #define SO_DONTROUTE 5 13 #define SO_DONTROUTE 5
14 #define SO_BROADCAST 6 14 #define SO_BROADCAST 6
15 #define SO_SNDBUF 7 15 #define SO_SNDBUF 7
16 #define SO_RCVBUF 8 16 #define SO_RCVBUF 8
17 #define SO_SNDBUFFORCE 32
18 #define SO_RCVBUFFORCE 33
17 #define SO_KEEPALIVE 9 19 #define SO_KEEPALIVE 9
18 #define SO_OOBINLINE 10 20 #define SO_OOBINLINE 10
19 #define SO_NO_CHECK 11 21 #define SO_NO_CHECK 11
20 #define SO_PRIORITY 12 22 #define SO_PRIORITY 12
21 #define SO_LINGER 13 23 #define SO_LINGER 13
22 #define SO_BSDCOMPAT 14 24 #define SO_BSDCOMPAT 14
23 /* To add :#define SO_REUSEPORT 15 */ 25 /* To add :#define SO_REUSEPORT 15 */
24 #define SO_PASSCRED 16 26 #define SO_PASSCRED 16
25 #define SO_PEERCRED 17 27 #define SO_PEERCRED 17
26 #define SO_RCVLOWAT 18 28 #define SO_RCVLOWAT 18
27 #define SO_SNDLOWAT 19 29 #define SO_SNDLOWAT 19
28 #define SO_RCVTIMEO 20 30 #define SO_RCVTIMEO 20
29 #define SO_SNDTIMEO 21 31 #define SO_SNDTIMEO 21
30 32
31 /* Security levels - as per NRL IPv6 - don't actually do anything */ 33 /* Security levels - as per NRL IPv6 - don't actually do anything */
32 #define SO_SECURITY_AUTHENTICATION 22 34 #define SO_SECURITY_AUTHENTICATION 22
33 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23 35 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23
34 #define SO_SECURITY_ENCRYPTION_NETWORK 24 36 #define SO_SECURITY_ENCRYPTION_NETWORK 24
35 37
36 #define SO_BINDTODEVICE 25 38 #define SO_BINDTODEVICE 25
37 39
38 /* Socket filtering */ 40 /* Socket filtering */
39 #define SO_ATTACH_FILTER 26 41 #define SO_ATTACH_FILTER 26
40 #define SO_DETACH_FILTER 27 42 #define SO_DETACH_FILTER 27
41 43
42 #define SO_PEERNAME 28 44 #define SO_PEERNAME 28
43 #define SO_TIMESTAMP 29 45 #define SO_TIMESTAMP 29
44 #define SCM_TIMESTAMP SO_TIMESTAMP 46 #define SCM_TIMESTAMP SO_TIMESTAMP
45 47
46 #define SO_ACCEPTCONN 30 48 #define SO_ACCEPTCONN 30
47 49
48 #define SO_PEERSEC 31 50 #define SO_PEERSEC 31
49 51
50 #endif /* _ASM_SOCKET_H */ 52 #endif /* _ASM_SOCKET_H */
51 53
include/asm-ia64/socket.h
1 #ifndef _ASM_IA64_SOCKET_H 1 #ifndef _ASM_IA64_SOCKET_H
2 #define _ASM_IA64_SOCKET_H 2 #define _ASM_IA64_SOCKET_H
3 3
4 /* 4 /*
5 * Socket related defines. 5 * Socket related defines.
6 * 6 *
7 * Based on <asm-i386/socket.h>. 7 * Based on <asm-i386/socket.h>.
8 * 8 *
9 * Modified 1998-2000 9 * Modified 1998-2000
10 * David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co 10 * David Mosberger-Tang <davidm@hpl.hp.com>, Hewlett-Packard Co
11 */ 11 */
12 12
13 #include <asm/sockios.h> 13 #include <asm/sockios.h>
14 14
15 /* For setsockopt(2) */ 15 /* For setsockopt(2) */
16 #define SOL_SOCKET 1 16 #define SOL_SOCKET 1
17 17
18 #define SO_DEBUG 1 18 #define SO_DEBUG 1
19 #define SO_REUSEADDR 2 19 #define SO_REUSEADDR 2
20 #define SO_TYPE 3 20 #define SO_TYPE 3
21 #define SO_ERROR 4 21 #define SO_ERROR 4
22 #define SO_DONTROUTE 5 22 #define SO_DONTROUTE 5
23 #define SO_BROADCAST 6 23 #define SO_BROADCAST 6
24 #define SO_SNDBUF 7 24 #define SO_SNDBUF 7
25 #define SO_RCVBUF 8 25 #define SO_RCVBUF 8
26 #define SO_SNDBUFFORCE 32
27 #define SO_RCVBUFFORCE 33
26 #define SO_KEEPALIVE 9 28 #define SO_KEEPALIVE 9
27 #define SO_OOBINLINE 10 29 #define SO_OOBINLINE 10
28 #define SO_NO_CHECK 11 30 #define SO_NO_CHECK 11
29 #define SO_PRIORITY 12 31 #define SO_PRIORITY 12
30 #define SO_LINGER 13 32 #define SO_LINGER 13
31 #define SO_BSDCOMPAT 14 33 #define SO_BSDCOMPAT 14
32 /* To add :#define SO_REUSEPORT 15 */ 34 /* To add :#define SO_REUSEPORT 15 */
33 #define SO_PASSCRED 16 35 #define SO_PASSCRED 16
34 #define SO_PEERCRED 17 36 #define SO_PEERCRED 17
35 #define SO_RCVLOWAT 18 37 #define SO_RCVLOWAT 18
36 #define SO_SNDLOWAT 19 38 #define SO_SNDLOWAT 19
37 #define SO_RCVTIMEO 20 39 #define SO_RCVTIMEO 20
38 #define SO_SNDTIMEO 21 40 #define SO_SNDTIMEO 21
39 41
40 /* Security levels - as per NRL IPv6 - don't actually do anything */ 42 /* Security levels - as per NRL IPv6 - don't actually do anything */
41 #define SO_SECURITY_AUTHENTICATION 22 43 #define SO_SECURITY_AUTHENTICATION 22
42 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23 44 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23
43 #define SO_SECURITY_ENCRYPTION_NETWORK 24 45 #define SO_SECURITY_ENCRYPTION_NETWORK 24
44 46
45 #define SO_BINDTODEVICE 25 47 #define SO_BINDTODEVICE 25
46 48
47 /* Socket filtering */ 49 /* Socket filtering */
48 #define SO_ATTACH_FILTER 26 50 #define SO_ATTACH_FILTER 26
49 #define SO_DETACH_FILTER 27 51 #define SO_DETACH_FILTER 27
50 52
51 #define SO_PEERNAME 28 53 #define SO_PEERNAME 28
52 #define SO_TIMESTAMP 29 54 #define SO_TIMESTAMP 29
53 #define SCM_TIMESTAMP SO_TIMESTAMP 55 #define SCM_TIMESTAMP SO_TIMESTAMP
54 56
55 #define SO_ACCEPTCONN 30 57 #define SO_ACCEPTCONN 30
56 58
57 #define SO_PEERSEC 31 59 #define SO_PEERSEC 31
58 60
59 #endif /* _ASM_IA64_SOCKET_H */ 61 #endif /* _ASM_IA64_SOCKET_H */
60 62
include/asm-m32r/socket.h
1 #ifndef _ASM_M32R_SOCKET_H 1 #ifndef _ASM_M32R_SOCKET_H
2 #define _ASM_M32R_SOCKET_H 2 #define _ASM_M32R_SOCKET_H
3 3
4 #include <asm/sockios.h> 4 #include <asm/sockios.h>
5 5
6 /* For setsockoptions(2) */ 6 /* For setsockoptions(2) */
7 #define SOL_SOCKET 1 7 #define SOL_SOCKET 1
8 8
9 #define SO_DEBUG 1 9 #define SO_DEBUG 1
10 #define SO_REUSEADDR 2 10 #define SO_REUSEADDR 2
11 #define SO_TYPE 3 11 #define SO_TYPE 3
12 #define SO_ERROR 4 12 #define SO_ERROR 4
13 #define SO_DONTROUTE 5 13 #define SO_DONTROUTE 5
14 #define SO_BROADCAST 6 14 #define SO_BROADCAST 6
15 #define SO_SNDBUF 7 15 #define SO_SNDBUF 7
16 #define SO_RCVBUF 8 16 #define SO_RCVBUF 8
17 #define SO_SNDBUFFORCE 32
18 #define SO_RCVBUFFORCE 33
17 #define SO_KEEPALIVE 9 19 #define SO_KEEPALIVE 9
18 #define SO_OOBINLINE 10 20 #define SO_OOBINLINE 10
19 #define SO_NO_CHECK 11 21 #define SO_NO_CHECK 11
20 #define SO_PRIORITY 12 22 #define SO_PRIORITY 12
21 #define SO_LINGER 13 23 #define SO_LINGER 13
22 #define SO_BSDCOMPAT 14 24 #define SO_BSDCOMPAT 14
23 /* To add :#define SO_REUSEPORT 15 */ 25 /* To add :#define SO_REUSEPORT 15 */
24 #define SO_PASSCRED 16 26 #define SO_PASSCRED 16
25 #define SO_PEERCRED 17 27 #define SO_PEERCRED 17
26 #define SO_RCVLOWAT 18 28 #define SO_RCVLOWAT 18
27 #define SO_SNDLOWAT 19 29 #define SO_SNDLOWAT 19
28 #define SO_RCVTIMEO 20 30 #define SO_RCVTIMEO 20
29 #define SO_SNDTIMEO 21 31 #define SO_SNDTIMEO 21
30 32
31 /* Security levels - as per NRL IPv6 - don't actually do anything */ 33 /* Security levels - as per NRL IPv6 - don't actually do anything */
32 #define SO_SECURITY_AUTHENTICATION 22 34 #define SO_SECURITY_AUTHENTICATION 22
33 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23 35 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23
34 #define SO_SECURITY_ENCRYPTION_NETWORK 24 36 #define SO_SECURITY_ENCRYPTION_NETWORK 24
35 37
36 #define SO_BINDTODEVICE 25 38 #define SO_BINDTODEVICE 25
37 39
38 /* Socket filtering */ 40 /* Socket filtering */
39 #define SO_ATTACH_FILTER 26 41 #define SO_ATTACH_FILTER 26
40 #define SO_DETACH_FILTER 27 42 #define SO_DETACH_FILTER 27
41 43
42 #define SO_PEERNAME 28 44 #define SO_PEERNAME 28
43 #define SO_TIMESTAMP 29 45 #define SO_TIMESTAMP 29
44 #define SCM_TIMESTAMP SO_TIMESTAMP 46 #define SCM_TIMESTAMP SO_TIMESTAMP
45 47
46 #define SO_ACCEPTCONN 30 48 #define SO_ACCEPTCONN 30
47 49
48 #define SO_PEERSEC 31 50 #define SO_PEERSEC 31
49 51
50 #endif /* _ASM_M32R_SOCKET_H */ 52 #endif /* _ASM_M32R_SOCKET_H */
51 53
include/asm-m68k/socket.h
1 #ifndef _ASM_SOCKET_H 1 #ifndef _ASM_SOCKET_H
2 #define _ASM_SOCKET_H 2 #define _ASM_SOCKET_H
3 3
4 #include <asm/sockios.h> 4 #include <asm/sockios.h>
5 5
6 /* For setsockopt(2) */ 6 /* For setsockopt(2) */
7 #define SOL_SOCKET 1 7 #define SOL_SOCKET 1
8 8
9 #define SO_DEBUG 1 9 #define SO_DEBUG 1
10 #define SO_REUSEADDR 2 10 #define SO_REUSEADDR 2
11 #define SO_TYPE 3 11 #define SO_TYPE 3
12 #define SO_ERROR 4 12 #define SO_ERROR 4
13 #define SO_DONTROUTE 5 13 #define SO_DONTROUTE 5
14 #define SO_BROADCAST 6 14 #define SO_BROADCAST 6
15 #define SO_SNDBUF 7 15 #define SO_SNDBUF 7
16 #define SO_RCVBUF 8 16 #define SO_RCVBUF 8
17 #define SO_SNDBUFFORCE 32
18 #define SO_RCVBUFFORCE 33
17 #define SO_KEEPALIVE 9 19 #define SO_KEEPALIVE 9
18 #define SO_OOBINLINE 10 20 #define SO_OOBINLINE 10
19 #define SO_NO_CHECK 11 21 #define SO_NO_CHECK 11
20 #define SO_PRIORITY 12 22 #define SO_PRIORITY 12
21 #define SO_LINGER 13 23 #define SO_LINGER 13
22 #define SO_BSDCOMPAT 14 24 #define SO_BSDCOMPAT 14
23 /* To add :#define SO_REUSEPORT 15 */ 25 /* To add :#define SO_REUSEPORT 15 */
24 #define SO_PASSCRED 16 26 #define SO_PASSCRED 16
25 #define SO_PEERCRED 17 27 #define SO_PEERCRED 17
26 #define SO_RCVLOWAT 18 28 #define SO_RCVLOWAT 18
27 #define SO_SNDLOWAT 19 29 #define SO_SNDLOWAT 19
28 #define SO_RCVTIMEO 20 30 #define SO_RCVTIMEO 20
29 #define SO_SNDTIMEO 21 31 #define SO_SNDTIMEO 21
30 32
31 /* Security levels - as per NRL IPv6 - don't actually do anything */ 33 /* Security levels - as per NRL IPv6 - don't actually do anything */
32 #define SO_SECURITY_AUTHENTICATION 22 34 #define SO_SECURITY_AUTHENTICATION 22
33 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23 35 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23
34 #define SO_SECURITY_ENCRYPTION_NETWORK 24 36 #define SO_SECURITY_ENCRYPTION_NETWORK 24
35 37
36 #define SO_BINDTODEVICE 25 38 #define SO_BINDTODEVICE 25
37 39
38 /* Socket filtering */ 40 /* Socket filtering */
39 #define SO_ATTACH_FILTER 26 41 #define SO_ATTACH_FILTER 26
40 #define SO_DETACH_FILTER 27 42 #define SO_DETACH_FILTER 27
41 43
42 #define SO_PEERNAME 28 44 #define SO_PEERNAME 28
43 #define SO_TIMESTAMP 29 45 #define SO_TIMESTAMP 29
44 #define SCM_TIMESTAMP SO_TIMESTAMP 46 #define SCM_TIMESTAMP SO_TIMESTAMP
45 47
46 #define SO_ACCEPTCONN 30 48 #define SO_ACCEPTCONN 30
47 49
48 #define SO_PEERSEC 31 50 #define SO_PEERSEC 31
49 51
50 #endif /* _ASM_SOCKET_H */ 52 #endif /* _ASM_SOCKET_H */
51 53
include/asm-mips/socket.h
1 /* 1 /*
2 * This file is subject to the terms and conditions of the GNU General Public 2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive 3 * License. See the file "COPYING" in the main directory of this archive
4 * for more details. 4 * for more details.
5 * 5 *
6 * Copyright (C) 1997, 1999, 2000, 2001 Ralf Baechle 6 * Copyright (C) 1997, 1999, 2000, 2001 Ralf Baechle
7 * Copyright (C) 2000, 2001 Silicon Graphics, Inc. 7 * Copyright (C) 2000, 2001 Silicon Graphics, Inc.
8 */ 8 */
9 #ifndef _ASM_SOCKET_H 9 #ifndef _ASM_SOCKET_H
10 #define _ASM_SOCKET_H 10 #define _ASM_SOCKET_H
11 11
12 #include <asm/sockios.h> 12 #include <asm/sockios.h>
13 13
14 /* 14 /*
15 * For setsockopt(2) 15 * For setsockopt(2)
16 * 16 *
17 * This defines are ABI conformant as far as Linux supports these ... 17 * This defines are ABI conformant as far as Linux supports these ...
18 */ 18 */
19 #define SOL_SOCKET 0xffff 19 #define SOL_SOCKET 0xffff
20 20
21 #define SO_DEBUG 0x0001 /* Record debugging information. */ 21 #define SO_DEBUG 0x0001 /* Record debugging information. */
22 #define SO_REUSEADDR 0x0004 /* Allow reuse of local addresses. */ 22 #define SO_REUSEADDR 0x0004 /* Allow reuse of local addresses. */
23 #define SO_KEEPALIVE 0x0008 /* Keep connections alive and send 23 #define SO_KEEPALIVE 0x0008 /* Keep connections alive and send
24 SIGPIPE when they die. */ 24 SIGPIPE when they die. */
25 #define SO_DONTROUTE 0x0010 /* Don't do local routing. */ 25 #define SO_DONTROUTE 0x0010 /* Don't do local routing. */
26 #define SO_BROADCAST 0x0020 /* Allow transmission of 26 #define SO_BROADCAST 0x0020 /* Allow transmission of
27 broadcast messages. */ 27 broadcast messages. */
28 #define SO_LINGER 0x0080 /* Block on close of a reliable 28 #define SO_LINGER 0x0080 /* Block on close of a reliable
29 socket to transmit pending data. */ 29 socket to transmit pending data. */
30 #define SO_OOBINLINE 0x0100 /* Receive out-of-band data in-band. */ 30 #define SO_OOBINLINE 0x0100 /* Receive out-of-band data in-band. */
31 #if 0 31 #if 0
32 To add: #define SO_REUSEPORT 0x0200 /* Allow local address and port reuse. */ 32 To add: #define SO_REUSEPORT 0x0200 /* Allow local address and port reuse. */
33 #endif 33 #endif
34 34
35 #define SO_TYPE 0x1008 /* Compatible name for SO_STYLE. */ 35 #define SO_TYPE 0x1008 /* Compatible name for SO_STYLE. */
36 #define SO_STYLE SO_TYPE /* Synonym */ 36 #define SO_STYLE SO_TYPE /* Synonym */
37 #define SO_ERROR 0x1007 /* get error status and clear */ 37 #define SO_ERROR 0x1007 /* get error status and clear */
38 #define SO_SNDBUF 0x1001 /* Send buffer size. */ 38 #define SO_SNDBUF 0x1001 /* Send buffer size. */
39 #define SO_RCVBUF 0x1002 /* Receive buffer. */ 39 #define SO_RCVBUF 0x1002 /* Receive buffer. */
40 #define SO_SNDBUFFORCE 0x100a
41 #define SO_RCVBUFFORCE 0x100b
40 #define SO_SNDLOWAT 0x1003 /* send low-water mark */ 42 #define SO_SNDLOWAT 0x1003 /* send low-water mark */
41 #define SO_RCVLOWAT 0x1004 /* receive low-water mark */ 43 #define SO_RCVLOWAT 0x1004 /* receive low-water mark */
42 #define SO_SNDTIMEO 0x1005 /* send timeout */ 44 #define SO_SNDTIMEO 0x1005 /* send timeout */
43 #define SO_RCVTIMEO 0x1006 /* receive timeout */ 45 #define SO_RCVTIMEO 0x1006 /* receive timeout */
44 #define SO_ACCEPTCONN 0x1009 46 #define SO_ACCEPTCONN 0x1009
45 47
46 /* linux-specific, might as well be the same as on i386 */ 48 /* linux-specific, might as well be the same as on i386 */
47 #define SO_NO_CHECK 11 49 #define SO_NO_CHECK 11
48 #define SO_PRIORITY 12 50 #define SO_PRIORITY 12
49 #define SO_BSDCOMPAT 14 51 #define SO_BSDCOMPAT 14
50 52
51 #define SO_PASSCRED 17 53 #define SO_PASSCRED 17
52 #define SO_PEERCRED 18 54 #define SO_PEERCRED 18
53 55
54 /* Security levels - as per NRL IPv6 - don't actually do anything */ 56 /* Security levels - as per NRL IPv6 - don't actually do anything */
55 #define SO_SECURITY_AUTHENTICATION 22 57 #define SO_SECURITY_AUTHENTICATION 22
56 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23 58 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23
57 #define SO_SECURITY_ENCRYPTION_NETWORK 24 59 #define SO_SECURITY_ENCRYPTION_NETWORK 24
58 60
59 #define SO_BINDTODEVICE 25 61 #define SO_BINDTODEVICE 25
60 62
61 /* Socket filtering */ 63 /* Socket filtering */
62 #define SO_ATTACH_FILTER 26 64 #define SO_ATTACH_FILTER 26
63 #define SO_DETACH_FILTER 27 65 #define SO_DETACH_FILTER 27
64 66
65 #define SO_PEERNAME 28 67 #define SO_PEERNAME 28
66 #define SO_TIMESTAMP 29 68 #define SO_TIMESTAMP 29
67 #define SCM_TIMESTAMP SO_TIMESTAMP 69 #define SCM_TIMESTAMP SO_TIMESTAMP
68 70
69 #define SO_PEERSEC 30 71 #define SO_PEERSEC 30
70 72
71 #ifdef __KERNEL__ 73 #ifdef __KERNEL__
72 74
73 /** sock_type - Socket types 75 /** sock_type - Socket types
74 * 76 *
75 * Please notice that for binary compat reasons MIPS has to 77 * Please notice that for binary compat reasons MIPS has to
76 * override the enum sock_type in include/linux/net.h, so 78 * override the enum sock_type in include/linux/net.h, so
77 * we define ARCH_HAS_SOCKET_TYPES here. 79 * we define ARCH_HAS_SOCKET_TYPES here.
78 * 80 *
79 * @SOCK_DGRAM - datagram (conn.less) socket 81 * @SOCK_DGRAM - datagram (conn.less) socket
80 * @SOCK_STREAM - stream (connection) socket 82 * @SOCK_STREAM - stream (connection) socket
81 * @SOCK_RAW - raw socket 83 * @SOCK_RAW - raw socket
82 * @SOCK_RDM - reliably-delivered message 84 * @SOCK_RDM - reliably-delivered message
83 * @SOCK_SEQPACKET - sequential packet socket 85 * @SOCK_SEQPACKET - sequential packet socket
84 * @SOCK_PACKET - linux specific way of getting packets at the dev level. 86 * @SOCK_PACKET - linux specific way of getting packets at the dev level.
85 * For writing rarp and other similar things on the user level. 87 * For writing rarp and other similar things on the user level.
86 */ 88 */
87 enum sock_type { 89 enum sock_type {
88 SOCK_DGRAM = 1, 90 SOCK_DGRAM = 1,
89 SOCK_STREAM = 2, 91 SOCK_STREAM = 2,
90 SOCK_RAW = 3, 92 SOCK_RAW = 3,
91 SOCK_RDM = 4, 93 SOCK_RDM = 4,
92 SOCK_SEQPACKET = 5, 94 SOCK_SEQPACKET = 5,
93 SOCK_PACKET = 10, 95 SOCK_PACKET = 10,
94 }; 96 };
95 97
96 #define SOCK_MAX (SOCK_PACKET + 1) 98 #define SOCK_MAX (SOCK_PACKET + 1)
97 99
98 #define ARCH_HAS_SOCKET_TYPES 1 100 #define ARCH_HAS_SOCKET_TYPES 1
99 101
100 #endif /* __KERNEL__ */ 102 #endif /* __KERNEL__ */
101 103
102 #endif /* _ASM_SOCKET_H */ 104 #endif /* _ASM_SOCKET_H */
103 105
include/asm-parisc/socket.h
1 #ifndef _ASM_SOCKET_H 1 #ifndef _ASM_SOCKET_H
2 #define _ASM_SOCKET_H 2 #define _ASM_SOCKET_H
3 3
4 #include <asm/sockios.h> 4 #include <asm/sockios.h>
5 5
6 /* For setsockopt(2) */ 6 /* For setsockopt(2) */
7 #define SOL_SOCKET 0xffff 7 #define SOL_SOCKET 0xffff
8 8
9 #define SO_DEBUG 0x0001 9 #define SO_DEBUG 0x0001
10 #define SO_REUSEADDR 0x0004 10 #define SO_REUSEADDR 0x0004
11 #define SO_KEEPALIVE 0x0008 11 #define SO_KEEPALIVE 0x0008
12 #define SO_DONTROUTE 0x0010 12 #define SO_DONTROUTE 0x0010
13 #define SO_BROADCAST 0x0020 13 #define SO_BROADCAST 0x0020
14 #define SO_LINGER 0x0080 14 #define SO_LINGER 0x0080
15 #define SO_OOBINLINE 0x0100 15 #define SO_OOBINLINE 0x0100
16 /* To add :#define SO_REUSEPORT 0x0200 */ 16 /* To add :#define SO_REUSEPORT 0x0200 */
17 #define SO_SNDBUF 0x1001 17 #define SO_SNDBUF 0x1001
18 #define SO_RCVBUF 0x1002 18 #define SO_RCVBUF 0x1002
19 #define SO_SNDBUFFORCE 0x100a
20 #define SO_RCVBUFFORCE 0x100b
19 #define SO_SNDLOWAT 0x1003 21 #define SO_SNDLOWAT 0x1003
20 #define SO_RCVLOWAT 0x1004 22 #define SO_RCVLOWAT 0x1004
21 #define SO_SNDTIMEO 0x1005 23 #define SO_SNDTIMEO 0x1005
22 #define SO_RCVTIMEO 0x1006 24 #define SO_RCVTIMEO 0x1006
23 #define SO_ERROR 0x1007 25 #define SO_ERROR 0x1007
24 #define SO_TYPE 0x1008 26 #define SO_TYPE 0x1008
25 #define SO_PEERNAME 0x2000 27 #define SO_PEERNAME 0x2000
26 28
27 #define SO_NO_CHECK 0x400b 29 #define SO_NO_CHECK 0x400b
28 #define SO_PRIORITY 0x400c 30 #define SO_PRIORITY 0x400c
29 #define SO_BSDCOMPAT 0x400e 31 #define SO_BSDCOMPAT 0x400e
30 #define SO_PASSCRED 0x4010 32 #define SO_PASSCRED 0x4010
31 #define SO_PEERCRED 0x4011 33 #define SO_PEERCRED 0x4011
32 #define SO_TIMESTAMP 0x4012 34 #define SO_TIMESTAMP 0x4012
33 #define SCM_TIMESTAMP SO_TIMESTAMP 35 #define SCM_TIMESTAMP SO_TIMESTAMP
34 36
35 /* Security levels - as per NRL IPv6 - don't actually do anything */ 37 /* Security levels - as per NRL IPv6 - don't actually do anything */
36 #define SO_SECURITY_AUTHENTICATION 0x4016 38 #define SO_SECURITY_AUTHENTICATION 0x4016
37 #define SO_SECURITY_ENCRYPTION_TRANSPORT 0x4017 39 #define SO_SECURITY_ENCRYPTION_TRANSPORT 0x4017
38 #define SO_SECURITY_ENCRYPTION_NETWORK 0x4018 40 #define SO_SECURITY_ENCRYPTION_NETWORK 0x4018
39 41
40 #define SO_BINDTODEVICE 0x4019 42 #define SO_BINDTODEVICE 0x4019
41 43
42 /* Socket filtering */ 44 /* Socket filtering */
43 #define SO_ATTACH_FILTER 0x401a 45 #define SO_ATTACH_FILTER 0x401a
44 #define SO_DETACH_FILTER 0x401b 46 #define SO_DETACH_FILTER 0x401b
45 47
46 #define SO_ACCEPTCONN 0x401c 48 #define SO_ACCEPTCONN 0x401c
47 49
48 #define SO_PEERSEC 0x401d 50 #define SO_PEERSEC 0x401d
49 51
50 #endif /* _ASM_SOCKET_H */ 52 #endif /* _ASM_SOCKET_H */
51 53
include/asm-ppc/socket.h
1 #ifndef _ASM_SOCKET_H 1 #ifndef _ASM_SOCKET_H
2 #define _ASM_SOCKET_H 2 #define _ASM_SOCKET_H
3 3
4 /* Socket-level I/O control calls. */ 4 /* Socket-level I/O control calls. */
5 #define FIOSETOWN 0x8901 5 #define FIOSETOWN 0x8901
6 #define SIOCSPGRP 0x8902 6 #define SIOCSPGRP 0x8902
7 #define FIOGETOWN 0x8903 7 #define FIOGETOWN 0x8903
8 #define SIOCGPGRP 0x8904 8 #define SIOCGPGRP 0x8904
9 #define SIOCATMARK 0x8905 9 #define SIOCATMARK 0x8905
10 #define SIOCGSTAMP 0x8906 /* Get stamp */ 10 #define SIOCGSTAMP 0x8906 /* Get stamp */
11 11
12 /* For setsockopt(2) */ 12 /* For setsockopt(2) */
13 #define SOL_SOCKET 1 13 #define SOL_SOCKET 1
14 14
15 #define SO_DEBUG 1 15 #define SO_DEBUG 1
16 #define SO_REUSEADDR 2 16 #define SO_REUSEADDR 2
17 #define SO_TYPE 3 17 #define SO_TYPE 3
18 #define SO_ERROR 4 18 #define SO_ERROR 4
19 #define SO_DONTROUTE 5 19 #define SO_DONTROUTE 5
20 #define SO_BROADCAST 6 20 #define SO_BROADCAST 6
21 #define SO_SNDBUF 7 21 #define SO_SNDBUF 7
22 #define SO_RCVBUF 8 22 #define SO_RCVBUF 8
23 #define SO_SNDBUFFORCE 32
24 #define SO_RCVBUFFORCE 33
23 #define SO_KEEPALIVE 9 25 #define SO_KEEPALIVE 9
24 #define SO_OOBINLINE 10 26 #define SO_OOBINLINE 10
25 #define SO_NO_CHECK 11 27 #define SO_NO_CHECK 11
26 #define SO_PRIORITY 12 28 #define SO_PRIORITY 12
27 #define SO_LINGER 13 29 #define SO_LINGER 13
28 #define SO_BSDCOMPAT 14 30 #define SO_BSDCOMPAT 14
29 /* To add :#define SO_REUSEPORT 15 */ 31 /* To add :#define SO_REUSEPORT 15 */
30 #define SO_RCVLOWAT 16 32 #define SO_RCVLOWAT 16
31 #define SO_SNDLOWAT 17 33 #define SO_SNDLOWAT 17
32 #define SO_RCVTIMEO 18 34 #define SO_RCVTIMEO 18
33 #define SO_SNDTIMEO 19 35 #define SO_SNDTIMEO 19
34 #define SO_PASSCRED 20 36 #define SO_PASSCRED 20
35 #define SO_PEERCRED 21 37 #define SO_PEERCRED 21
36 38
37 /* Security levels - as per NRL IPv6 - don't actually do anything */ 39 /* Security levels - as per NRL IPv6 - don't actually do anything */
38 #define SO_SECURITY_AUTHENTICATION 22 40 #define SO_SECURITY_AUTHENTICATION 22
39 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23 41 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23
40 #define SO_SECURITY_ENCRYPTION_NETWORK 24 42 #define SO_SECURITY_ENCRYPTION_NETWORK 24
41 43
42 #define SO_BINDTODEVICE 25 44 #define SO_BINDTODEVICE 25
43 45
44 /* Socket filtering */ 46 /* Socket filtering */
45 #define SO_ATTACH_FILTER 26 47 #define SO_ATTACH_FILTER 26
46 #define SO_DETACH_FILTER 27 48 #define SO_DETACH_FILTER 27
47 49
48 #define SO_PEERNAME 28 50 #define SO_PEERNAME 28
49 #define SO_TIMESTAMP 29 51 #define SO_TIMESTAMP 29
50 #define SCM_TIMESTAMP SO_TIMESTAMP 52 #define SCM_TIMESTAMP SO_TIMESTAMP
51 53
52 #define SO_ACCEPTCONN 30 54 #define SO_ACCEPTCONN 30
53 55
54 #define SO_PEERSEC 31 56 #define SO_PEERSEC 31
55 57
56 #endif /* _ASM_SOCKET_H */ 58 #endif /* _ASM_SOCKET_H */
57 59
include/asm-ppc64/socket.h
1 #ifndef _ASM_SOCKET_H 1 #ifndef _ASM_SOCKET_H
2 #define _ASM_SOCKET_H 2 #define _ASM_SOCKET_H
3 3
4 /* 4 /*
5 * This program is free software; you can redistribute it and/or 5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License 6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 7 * as published by the Free Software Foundation; either version
8 * 2 of the License, or (at your option) any later version. 8 * 2 of the License, or (at your option) any later version.
9 */ 9 */
10 10
11 #include <asm/sockios.h> 11 #include <asm/sockios.h>
12 12
13 /* For setsockoptions(2) */ 13 /* For setsockoptions(2) */
14 #define SOL_SOCKET 1 14 #define SOL_SOCKET 1
15 15
16 #define SO_DEBUG 1 16 #define SO_DEBUG 1
17 #define SO_REUSEADDR 2 17 #define SO_REUSEADDR 2
18 #define SO_TYPE 3 18 #define SO_TYPE 3
19 #define SO_ERROR 4 19 #define SO_ERROR 4
20 #define SO_DONTROUTE 5 20 #define SO_DONTROUTE 5
21 #define SO_BROADCAST 6 21 #define SO_BROADCAST 6
22 #define SO_SNDBUF 7 22 #define SO_SNDBUF 7
23 #define SO_RCVBUF 8 23 #define SO_RCVBUF 8
24 #define SO_SNDBUFFORCE 32
25 #define SO_RCVBUFFORCE 33
24 #define SO_KEEPALIVE 9 26 #define SO_KEEPALIVE 9
25 #define SO_OOBINLINE 10 27 #define SO_OOBINLINE 10
26 #define SO_NO_CHECK 11 28 #define SO_NO_CHECK 11
27 #define SO_PRIORITY 12 29 #define SO_PRIORITY 12
28 #define SO_LINGER 13 30 #define SO_LINGER 13
29 #define SO_BSDCOMPAT 14 31 #define SO_BSDCOMPAT 14
30 /* To add :#define SO_REUSEPORT 15 */ 32 /* To add :#define SO_REUSEPORT 15 */
31 #define SO_RCVLOWAT 16 33 #define SO_RCVLOWAT 16
32 #define SO_SNDLOWAT 17 34 #define SO_SNDLOWAT 17
33 #define SO_RCVTIMEO 18 35 #define SO_RCVTIMEO 18
34 #define SO_SNDTIMEO 19 36 #define SO_SNDTIMEO 19
35 #define SO_PASSCRED 20 37 #define SO_PASSCRED 20
36 #define SO_PEERCRED 21 38 #define SO_PEERCRED 21
37 39
38 /* Security levels - as per NRL IPv6 - don't actually do anything */ 40 /* Security levels - as per NRL IPv6 - don't actually do anything */
39 #define SO_SECURITY_AUTHENTICATION 22 41 #define SO_SECURITY_AUTHENTICATION 22
40 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23 42 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23
41 #define SO_SECURITY_ENCRYPTION_NETWORK 24 43 #define SO_SECURITY_ENCRYPTION_NETWORK 24
42 44
43 #define SO_BINDTODEVICE 25 45 #define SO_BINDTODEVICE 25
44 46
45 /* Socket filtering */ 47 /* Socket filtering */
46 #define SO_ATTACH_FILTER 26 48 #define SO_ATTACH_FILTER 26
47 #define SO_DETACH_FILTER 27 49 #define SO_DETACH_FILTER 27
48 50
49 #define SO_PEERNAME 28 51 #define SO_PEERNAME 28
50 #define SO_TIMESTAMP 29 52 #define SO_TIMESTAMP 29
51 #define SCM_TIMESTAMP SO_TIMESTAMP 53 #define SCM_TIMESTAMP SO_TIMESTAMP
52 54
53 #define SO_ACCEPTCONN 30 55 #define SO_ACCEPTCONN 30
54 56
55 #define SO_PEERSEC 31 57 #define SO_PEERSEC 31
56 58
57 #endif /* _ASM_SOCKET_H */ 59 #endif /* _ASM_SOCKET_H */
58 60
include/asm-s390/socket.h
1 /* 1 /*
2 * include/asm-s390/socket.h 2 * include/asm-s390/socket.h
3 * 3 *
4 * S390 version 4 * S390 version
5 * 5 *
6 * Derived from "include/asm-i386/socket.h" 6 * Derived from "include/asm-i386/socket.h"
7 */ 7 */
8 8
9 #ifndef _ASM_SOCKET_H 9 #ifndef _ASM_SOCKET_H
10 #define _ASM_SOCKET_H 10 #define _ASM_SOCKET_H
11 11
12 #include <asm/sockios.h> 12 #include <asm/sockios.h>
13 13
14 /* For setsockopt(2) */ 14 /* For setsockopt(2) */
15 #define SOL_SOCKET 1 15 #define SOL_SOCKET 1
16 16
17 #define SO_DEBUG 1 17 #define SO_DEBUG 1
18 #define SO_REUSEADDR 2 18 #define SO_REUSEADDR 2
19 #define SO_TYPE 3 19 #define SO_TYPE 3
20 #define SO_ERROR 4 20 #define SO_ERROR 4
21 #define SO_DONTROUTE 5 21 #define SO_DONTROUTE 5
22 #define SO_BROADCAST 6 22 #define SO_BROADCAST 6
23 #define SO_SNDBUF 7 23 #define SO_SNDBUF 7
24 #define SO_RCVBUF 8 24 #define SO_RCVBUF 8
25 #define SO_SNDBUFFORCE 32
26 #define SO_RCVBUFFORCE 33
25 #define SO_KEEPALIVE 9 27 #define SO_KEEPALIVE 9
26 #define SO_OOBINLINE 10 28 #define SO_OOBINLINE 10
27 #define SO_NO_CHECK 11 29 #define SO_NO_CHECK 11
28 #define SO_PRIORITY 12 30 #define SO_PRIORITY 12
29 #define SO_LINGER 13 31 #define SO_LINGER 13
30 #define SO_BSDCOMPAT 14 32 #define SO_BSDCOMPAT 14
31 /* To add :#define SO_REUSEPORT 15 */ 33 /* To add :#define SO_REUSEPORT 15 */
32 #define SO_PASSCRED 16 34 #define SO_PASSCRED 16
33 #define SO_PEERCRED 17 35 #define SO_PEERCRED 17
34 #define SO_RCVLOWAT 18 36 #define SO_RCVLOWAT 18
35 #define SO_SNDLOWAT 19 37 #define SO_SNDLOWAT 19
36 #define SO_RCVTIMEO 20 38 #define SO_RCVTIMEO 20
37 #define SO_SNDTIMEO 21 39 #define SO_SNDTIMEO 21
38 40
39 /* Security levels - as per NRL IPv6 - don't actually do anything */ 41 /* Security levels - as per NRL IPv6 - don't actually do anything */
40 #define SO_SECURITY_AUTHENTICATION 22 42 #define SO_SECURITY_AUTHENTICATION 22
41 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23 43 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23
42 #define SO_SECURITY_ENCRYPTION_NETWORK 24 44 #define SO_SECURITY_ENCRYPTION_NETWORK 24
43 45
44 #define SO_BINDTODEVICE 25 46 #define SO_BINDTODEVICE 25
45 47
46 /* Socket filtering */ 48 /* Socket filtering */
47 #define SO_ATTACH_FILTER 26 49 #define SO_ATTACH_FILTER 26
48 #define SO_DETACH_FILTER 27 50 #define SO_DETACH_FILTER 27
49 51
50 #define SO_PEERNAME 28 52 #define SO_PEERNAME 28
51 #define SO_TIMESTAMP 29 53 #define SO_TIMESTAMP 29
52 #define SCM_TIMESTAMP SO_TIMESTAMP 54 #define SCM_TIMESTAMP SO_TIMESTAMP
53 55
54 #define SO_ACCEPTCONN 30 56 #define SO_ACCEPTCONN 30
55 57
56 #define SO_PEERSEC 31 58 #define SO_PEERSEC 31
57 59
58 #endif /* _ASM_SOCKET_H */ 60 #endif /* _ASM_SOCKET_H */
59 61
include/asm-sh/socket.h
1 #ifndef __ASM_SH_SOCKET_H 1 #ifndef __ASM_SH_SOCKET_H
2 #define __ASM_SH_SOCKET_H 2 #define __ASM_SH_SOCKET_H
3 3
4 #include <asm/sockios.h> 4 #include <asm/sockios.h>
5 5
6 /* For setsockopt(2) */ 6 /* For setsockopt(2) */
7 #define SOL_SOCKET 1 7 #define SOL_SOCKET 1
8 8
9 #define SO_DEBUG 1 9 #define SO_DEBUG 1
10 #define SO_REUSEADDR 2 10 #define SO_REUSEADDR 2
11 #define SO_TYPE 3 11 #define SO_TYPE 3
12 #define SO_ERROR 4 12 #define SO_ERROR 4
13 #define SO_DONTROUTE 5 13 #define SO_DONTROUTE 5
14 #define SO_BROADCAST 6 14 #define SO_BROADCAST 6
15 #define SO_SNDBUF 7 15 #define SO_SNDBUF 7
16 #define SO_RCVBUF 8 16 #define SO_RCVBUF 8
17 #define SO_RCVBUFFORCE 32
18 #define SO_SNDBUFFORCE 33
17 #define SO_KEEPALIVE 9 19 #define SO_KEEPALIVE 9
18 #define SO_OOBINLINE 10 20 #define SO_OOBINLINE 10
19 #define SO_NO_CHECK 11 21 #define SO_NO_CHECK 11
20 #define SO_PRIORITY 12 22 #define SO_PRIORITY 12
21 #define SO_LINGER 13 23 #define SO_LINGER 13
22 #define SO_BSDCOMPAT 14 24 #define SO_BSDCOMPAT 14
23 /* To add :#define SO_REUSEPORT 15 */ 25 /* To add :#define SO_REUSEPORT 15 */
24 #define SO_PASSCRED 16 26 #define SO_PASSCRED 16
25 #define SO_PEERCRED 17 27 #define SO_PEERCRED 17
26 #define SO_RCVLOWAT 18 28 #define SO_RCVLOWAT 18
27 #define SO_SNDLOWAT 19 29 #define SO_SNDLOWAT 19
28 #define SO_RCVTIMEO 20 30 #define SO_RCVTIMEO 20
29 #define SO_SNDTIMEO 21 31 #define SO_SNDTIMEO 21
30 32
31 /* Security levels - as per NRL IPv6 - don't actually do anything */ 33 /* Security levels - as per NRL IPv6 - don't actually do anything */
32 #define SO_SECURITY_AUTHENTICATION 22 34 #define SO_SECURITY_AUTHENTICATION 22
33 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23 35 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23
34 #define SO_SECURITY_ENCRYPTION_NETWORK 24 36 #define SO_SECURITY_ENCRYPTION_NETWORK 24
35 37
36 #define SO_BINDTODEVICE 25 38 #define SO_BINDTODEVICE 25
37 39
38 /* Socket filtering */ 40 /* Socket filtering */
39 #define SO_ATTACH_FILTER 26 41 #define SO_ATTACH_FILTER 26
40 #define SO_DETACH_FILTER 27 42 #define SO_DETACH_FILTER 27
41 43
42 #define SO_PEERNAME 28 44 #define SO_PEERNAME 28
43 #define SO_TIMESTAMP 29 45 #define SO_TIMESTAMP 29
44 #define SCM_TIMESTAMP SO_TIMESTAMP 46 #define SCM_TIMESTAMP SO_TIMESTAMP
45 47
46 #define SO_ACCEPTCONN 30 48 #define SO_ACCEPTCONN 30
47 49
48 #define SO_PEERSEC 31 50 #define SO_PEERSEC 31
49 51
50 #endif /* __ASM_SH_SOCKET_H */ 52 #endif /* __ASM_SH_SOCKET_H */
51 53
include/asm-sparc/socket.h
1 /* $Id: socket.h,v 1.17 2001/06/13 16:25:03 davem Exp $ */ 1 /* $Id: socket.h,v 1.17 2001/06/13 16:25:03 davem Exp $ */
2 #ifndef _ASM_SOCKET_H 2 #ifndef _ASM_SOCKET_H
3 #define _ASM_SOCKET_H 3 #define _ASM_SOCKET_H
4 4
5 #include <asm/sockios.h> 5 #include <asm/sockios.h>
6 6
7 /* For setsockopt(2) */ 7 /* For setsockopt(2) */
8 #define SOL_SOCKET 0xffff 8 #define SOL_SOCKET 0xffff
9 9
10 #define SO_DEBUG 0x0001 10 #define SO_DEBUG 0x0001
11 #define SO_PASSCRED 0x0002 11 #define SO_PASSCRED 0x0002
12 #define SO_REUSEADDR 0x0004 12 #define SO_REUSEADDR 0x0004
13 #define SO_KEEPALIVE 0x0008 13 #define SO_KEEPALIVE 0x0008
14 #define SO_DONTROUTE 0x0010 14 #define SO_DONTROUTE 0x0010
15 #define SO_BROADCAST 0x0020 15 #define SO_BROADCAST 0x0020
16 #define SO_PEERCRED 0x0040 16 #define SO_PEERCRED 0x0040
17 #define SO_LINGER 0x0080 17 #define SO_LINGER 0x0080
18 #define SO_OOBINLINE 0x0100 18 #define SO_OOBINLINE 0x0100
19 /* To add :#define SO_REUSEPORT 0x0200 */ 19 /* To add :#define SO_REUSEPORT 0x0200 */
20 #define SO_BSDCOMPAT 0x0400 20 #define SO_BSDCOMPAT 0x0400
21 #define SO_RCVLOWAT 0x0800 21 #define SO_RCVLOWAT 0x0800
22 #define SO_SNDLOWAT 0x1000 22 #define SO_SNDLOWAT 0x1000
23 #define SO_RCVTIMEO 0x2000 23 #define SO_RCVTIMEO 0x2000
24 #define SO_SNDTIMEO 0x4000 24 #define SO_SNDTIMEO 0x4000
25 #define SO_ACCEPTCONN 0x8000 25 #define SO_ACCEPTCONN 0x8000
26 26
27 /* wha!??? */ 27 /* wha!??? */
28 #define SO_DONTLINGER (~SO_LINGER) /* Older SunOS compat. hack */ 28 #define SO_DONTLINGER (~SO_LINGER) /* Older SunOS compat. hack */
29 29
30 #define SO_SNDBUF 0x1001 30 #define SO_SNDBUF 0x1001
31 #define SO_RCVBUF 0x1002 31 #define SO_RCVBUF 0x1002
32 #define SO_SNDBUFFORCE 0x100a
33 #define SO_RCVBUFFORCE 0x100b
32 #define SO_ERROR 0x1007 34 #define SO_ERROR 0x1007
33 #define SO_TYPE 0x1008 35 #define SO_TYPE 0x1008
34 36
35 /* Linux specific, keep the same. */ 37 /* Linux specific, keep the same. */
36 #define SO_NO_CHECK 0x000b 38 #define SO_NO_CHECK 0x000b
37 #define SO_PRIORITY 0x000c 39 #define SO_PRIORITY 0x000c
38 40
39 #define SO_BINDTODEVICE 0x000d 41 #define SO_BINDTODEVICE 0x000d
40 42
41 #define SO_ATTACH_FILTER 0x001a 43 #define SO_ATTACH_FILTER 0x001a
42 #define SO_DETACH_FILTER 0x001b 44 #define SO_DETACH_FILTER 0x001b
43 45
44 #define SO_PEERNAME 0x001c 46 #define SO_PEERNAME 0x001c
45 #define SO_TIMESTAMP 0x001d 47 #define SO_TIMESTAMP 0x001d
46 #define SCM_TIMESTAMP SO_TIMESTAMP 48 #define SCM_TIMESTAMP SO_TIMESTAMP
47 49
48 #define SO_PEERSEC 0x100e 50 #define SO_PEERSEC 0x100e
49 51
50 /* Security levels - as per NRL IPv6 - don't actually do anything */ 52 /* Security levels - as per NRL IPv6 - don't actually do anything */
51 #define SO_SECURITY_AUTHENTICATION 0x5001 53 #define SO_SECURITY_AUTHENTICATION 0x5001
52 #define SO_SECURITY_ENCRYPTION_TRANSPORT 0x5002 54 #define SO_SECURITY_ENCRYPTION_TRANSPORT 0x5002
53 #define SO_SECURITY_ENCRYPTION_NETWORK 0x5004 55 #define SO_SECURITY_ENCRYPTION_NETWORK 0x5004
54 56
55 #endif /* _ASM_SOCKET_H */ 57 #endif /* _ASM_SOCKET_H */
56 58
include/asm-sparc64/socket.h
1 /* $Id: socket.h,v 1.10 2001/06/13 16:25:03 davem Exp $ */ 1 /* $Id: socket.h,v 1.10 2001/06/13 16:25:03 davem Exp $ */
2 #ifndef _ASM_SOCKET_H 2 #ifndef _ASM_SOCKET_H
3 #define _ASM_SOCKET_H 3 #define _ASM_SOCKET_H
4 4
5 #include <asm/sockios.h> 5 #include <asm/sockios.h>
6 6
7 /* For setsockopt(2) */ 7 /* For setsockopt(2) */
8 #define SOL_SOCKET 0xffff 8 #define SOL_SOCKET 0xffff
9 9
10 #define SO_DEBUG 0x0001 10 #define SO_DEBUG 0x0001
11 #define SO_PASSCRED 0x0002 11 #define SO_PASSCRED 0x0002
12 #define SO_REUSEADDR 0x0004 12 #define SO_REUSEADDR 0x0004
13 #define SO_KEEPALIVE 0x0008 13 #define SO_KEEPALIVE 0x0008
14 #define SO_DONTROUTE 0x0010 14 #define SO_DONTROUTE 0x0010
15 #define SO_BROADCAST 0x0020 15 #define SO_BROADCAST 0x0020
16 #define SO_PEERCRED 0x0040 16 #define SO_PEERCRED 0x0040
17 #define SO_LINGER 0x0080 17 #define SO_LINGER 0x0080
18 #define SO_OOBINLINE 0x0100 18 #define SO_OOBINLINE 0x0100
19 /* To add :#define SO_REUSEPORT 0x0200 */ 19 /* To add :#define SO_REUSEPORT 0x0200 */
20 #define SO_BSDCOMPAT 0x0400 20 #define SO_BSDCOMPAT 0x0400
21 #define SO_RCVLOWAT 0x0800 21 #define SO_RCVLOWAT 0x0800
22 #define SO_SNDLOWAT 0x1000 22 #define SO_SNDLOWAT 0x1000
23 #define SO_RCVTIMEO 0x2000 23 #define SO_RCVTIMEO 0x2000
24 #define SO_SNDTIMEO 0x4000 24 #define SO_SNDTIMEO 0x4000
25 #define SO_ACCEPTCONN 0x8000 25 #define SO_ACCEPTCONN 0x8000
26 26
27 /* wha!??? */ 27 /* wha!??? */
28 #define SO_DONTLINGER (~SO_LINGER) /* Older SunOS compat. hack */ 28 #define SO_DONTLINGER (~SO_LINGER) /* Older SunOS compat. hack */
29 29
30 #define SO_SNDBUF 0x1001 30 #define SO_SNDBUF 0x1001
31 #define SO_RCVBUF 0x1002 31 #define SO_RCVBUF 0x1002
32 #define SO_SNDBUFFORCE 0x100a
33 #define SO_RCVBUFFORCE 0x100b
32 #define SO_ERROR 0x1007 34 #define SO_ERROR 0x1007
33 #define SO_TYPE 0x1008 35 #define SO_TYPE 0x1008
34 36
35 /* Linux specific, keep the same. */ 37 /* Linux specific, keep the same. */
36 #define SO_NO_CHECK 0x000b 38 #define SO_NO_CHECK 0x000b
37 #define SO_PRIORITY 0x000c 39 #define SO_PRIORITY 0x000c
38 40
39 #define SO_BINDTODEVICE 0x000d 41 #define SO_BINDTODEVICE 0x000d
40 42
41 #define SO_ATTACH_FILTER 0x001a 43 #define SO_ATTACH_FILTER 0x001a
42 #define SO_DETACH_FILTER 0x001b 44 #define SO_DETACH_FILTER 0x001b
43 45
44 #define SO_PEERNAME 0x001c 46 #define SO_PEERNAME 0x001c
45 #define SO_TIMESTAMP 0x001d 47 #define SO_TIMESTAMP 0x001d
46 #define SCM_TIMESTAMP SO_TIMESTAMP 48 #define SCM_TIMESTAMP SO_TIMESTAMP
47 49
48 #define SO_PEERSEC 0x001e 50 #define SO_PEERSEC 0x001e
49 51
50 /* Security levels - as per NRL IPv6 - don't actually do anything */ 52 /* Security levels - as per NRL IPv6 - don't actually do anything */
51 #define SO_SECURITY_AUTHENTICATION 0x5001 53 #define SO_SECURITY_AUTHENTICATION 0x5001
52 #define SO_SECURITY_ENCRYPTION_TRANSPORT 0x5002 54 #define SO_SECURITY_ENCRYPTION_TRANSPORT 0x5002
53 #define SO_SECURITY_ENCRYPTION_NETWORK 0x5004 55 #define SO_SECURITY_ENCRYPTION_NETWORK 0x5004
54 56
55 #endif /* _ASM_SOCKET_H */ 57 #endif /* _ASM_SOCKET_H */
56 58
include/asm-v850/socket.h
1 #ifndef __V850_SOCKET_H__ 1 #ifndef __V850_SOCKET_H__
2 #define __V850_SOCKET_H__ 2 #define __V850_SOCKET_H__
3 3
4 #include <asm/sockios.h> 4 #include <asm/sockios.h>
5 5
6 /* For setsockoptions(2) */ 6 /* For setsockoptions(2) */
7 #define SOL_SOCKET 1 7 #define SOL_SOCKET 1
8 8
9 #define SO_DEBUG 1 9 #define SO_DEBUG 1
10 #define SO_REUSEADDR 2 10 #define SO_REUSEADDR 2
11 #define SO_TYPE 3 11 #define SO_TYPE 3
12 #define SO_ERROR 4 12 #define SO_ERROR 4
13 #define SO_DONTROUTE 5 13 #define SO_DONTROUTE 5
14 #define SO_BROADCAST 6 14 #define SO_BROADCAST 6
15 #define SO_SNDBUF 7 15 #define SO_SNDBUF 7
16 #define SO_RCVBUF 8 16 #define SO_RCVBUF 8
17 #define SO_SNDBUFFORCE 32
18 #define SO_RCVBUFFORCE 33
17 #define SO_KEEPALIVE 9 19 #define SO_KEEPALIVE 9
18 #define SO_OOBINLINE 10 20 #define SO_OOBINLINE 10
19 #define SO_NO_CHECK 11 21 #define SO_NO_CHECK 11
20 #define SO_PRIORITY 12 22 #define SO_PRIORITY 12
21 #define SO_LINGER 13 23 #define SO_LINGER 13
22 #define SO_BSDCOMPAT 14 24 #define SO_BSDCOMPAT 14
23 /* To add :#define SO_REUSEPORT 15 */ 25 /* To add :#define SO_REUSEPORT 15 */
24 #define SO_PASSCRED 16 26 #define SO_PASSCRED 16
25 #define SO_PEERCRED 17 27 #define SO_PEERCRED 17
26 #define SO_RCVLOWAT 18 28 #define SO_RCVLOWAT 18
27 #define SO_SNDLOWAT 19 29 #define SO_SNDLOWAT 19
28 #define SO_RCVTIMEO 20 30 #define SO_RCVTIMEO 20
29 #define SO_SNDTIMEO 21 31 #define SO_SNDTIMEO 21
30 32
31 /* Security levels - as per NRL IPv6 - don't actually do anything */ 33 /* Security levels - as per NRL IPv6 - don't actually do anything */
32 #define SO_SECURITY_AUTHENTICATION 22 34 #define SO_SECURITY_AUTHENTICATION 22
33 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23 35 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23
34 #define SO_SECURITY_ENCRYPTION_NETWORK 24 36 #define SO_SECURITY_ENCRYPTION_NETWORK 24
35 37
36 #define SO_BINDTODEVICE 25 38 #define SO_BINDTODEVICE 25
37 39
38 /* Socket filtering */ 40 /* Socket filtering */
39 #define SO_ATTACH_FILTER 26 41 #define SO_ATTACH_FILTER 26
40 #define SO_DETACH_FILTER 27 42 #define SO_DETACH_FILTER 27
41 43
42 #define SO_PEERNAME 28 44 #define SO_PEERNAME 28
43 #define SO_TIMESTAMP 29 45 #define SO_TIMESTAMP 29
44 #define SCM_TIMESTAMP SO_TIMESTAMP 46 #define SCM_TIMESTAMP SO_TIMESTAMP
45 47
46 #define SO_ACCEPTCONN 30 48 #define SO_ACCEPTCONN 30
47 49
48 #define SO_PEERSEC 31 50 #define SO_PEERSEC 31
49 51
50 #endif /* __V850_SOCKET_H__ */ 52 #endif /* __V850_SOCKET_H__ */
51 53
include/asm-x86_64/socket.h
1 #ifndef _ASM_SOCKET_H 1 #ifndef _ASM_SOCKET_H
2 #define _ASM_SOCKET_H 2 #define _ASM_SOCKET_H
3 3
4 #include <asm/sockios.h> 4 #include <asm/sockios.h>
5 5
6 /* For setsockopt(2) */ 6 /* For setsockopt(2) */
7 #define SOL_SOCKET 1 7 #define SOL_SOCKET 1
8 8
9 #define SO_DEBUG 1 9 #define SO_DEBUG 1
10 #define SO_REUSEADDR 2 10 #define SO_REUSEADDR 2
11 #define SO_TYPE 3 11 #define SO_TYPE 3
12 #define SO_ERROR 4 12 #define SO_ERROR 4
13 #define SO_DONTROUTE 5 13 #define SO_DONTROUTE 5
14 #define SO_BROADCAST 6 14 #define SO_BROADCAST 6
15 #define SO_SNDBUF 7 15 #define SO_SNDBUF 7
16 #define SO_RCVBUF 8 16 #define SO_RCVBUF 8
17 #define SO_SNDBUFFORCE 32
18 #define SO_RCVBUFFORCE 33
17 #define SO_KEEPALIVE 9 19 #define SO_KEEPALIVE 9
18 #define SO_OOBINLINE 10 20 #define SO_OOBINLINE 10
19 #define SO_NO_CHECK 11 21 #define SO_NO_CHECK 11
20 #define SO_PRIORITY 12 22 #define SO_PRIORITY 12
21 #define SO_LINGER 13 23 #define SO_LINGER 13
22 #define SO_BSDCOMPAT 14 24 #define SO_BSDCOMPAT 14
23 /* To add :#define SO_REUSEPORT 15 */ 25 /* To add :#define SO_REUSEPORT 15 */
24 #define SO_PASSCRED 16 26 #define SO_PASSCRED 16
25 #define SO_PEERCRED 17 27 #define SO_PEERCRED 17
26 #define SO_RCVLOWAT 18 28 #define SO_RCVLOWAT 18
27 #define SO_SNDLOWAT 19 29 #define SO_SNDLOWAT 19
28 #define SO_RCVTIMEO 20 30 #define SO_RCVTIMEO 20
29 #define SO_SNDTIMEO 21 31 #define SO_SNDTIMEO 21
30 32
31 /* Security levels - as per NRL IPv6 - don't actually do anything */ 33 /* Security levels - as per NRL IPv6 - don't actually do anything */
32 #define SO_SECURITY_AUTHENTICATION 22 34 #define SO_SECURITY_AUTHENTICATION 22
33 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23 35 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23
34 #define SO_SECURITY_ENCRYPTION_NETWORK 24 36 #define SO_SECURITY_ENCRYPTION_NETWORK 24
35 37
36 #define SO_BINDTODEVICE 25 38 #define SO_BINDTODEVICE 25
37 39
38 /* Socket filtering */ 40 /* Socket filtering */
39 #define SO_ATTACH_FILTER 26 41 #define SO_ATTACH_FILTER 26
40 #define SO_DETACH_FILTER 27 42 #define SO_DETACH_FILTER 27
41 43
42 #define SO_PEERNAME 28 44 #define SO_PEERNAME 28
43 #define SO_TIMESTAMP 29 45 #define SO_TIMESTAMP 29
44 #define SCM_TIMESTAMP SO_TIMESTAMP 46 #define SCM_TIMESTAMP SO_TIMESTAMP
45 47
46 #define SO_ACCEPTCONN 30 48 #define SO_ACCEPTCONN 30
47 49
48 #define SO_PEERSEC 31 50 #define SO_PEERSEC 31
49 51
50 #endif /* _ASM_SOCKET_H */ 52 #endif /* _ASM_SOCKET_H */
51 53
include/asm-xtensa/socket.h
1 /* 1 /*
2 * include/asm-xtensa/socket.h 2 * include/asm-xtensa/socket.h
3 * 3 *
4 * Copied from i386. 4 * Copied from i386.
5 * 5 *
6 * This file is subject to the terms and conditions of the GNU General Public 6 * This file is subject to the terms and conditions of the GNU General Public
7 * License. See the file "COPYING" in the main directory of this archive 7 * License. See the file "COPYING" in the main directory of this archive
8 * for more details. 8 * for more details.
9 */ 9 */
10 10
11 #ifndef _XTENSA_SOCKET_H 11 #ifndef _XTENSA_SOCKET_H
12 #define _XTENSA_SOCKET_H 12 #define _XTENSA_SOCKET_H
13 13
14 #include <asm/sockios.h> 14 #include <asm/sockios.h>
15 15
16 /* For setsockoptions(2) */ 16 /* For setsockoptions(2) */
17 #define SOL_SOCKET 1 17 #define SOL_SOCKET 1
18 18
19 #define SO_DEBUG 1 19 #define SO_DEBUG 1
20 #define SO_REUSEADDR 2 20 #define SO_REUSEADDR 2
21 #define SO_TYPE 3 21 #define SO_TYPE 3
22 #define SO_ERROR 4 22 #define SO_ERROR 4
23 #define SO_DONTROUTE 5 23 #define SO_DONTROUTE 5
24 #define SO_BROADCAST 6 24 #define SO_BROADCAST 6
25 #define SO_SNDBUF 7 25 #define SO_SNDBUF 7
26 #define SO_RCVBUF 8 26 #define SO_RCVBUF 8
27 #define SO_SNDBUFFORCE 32
28 #define SO_RCVBUFFORCE 33
27 #define SO_KEEPALIVE 9 29 #define SO_KEEPALIVE 9
28 #define SO_OOBINLINE 10 30 #define SO_OOBINLINE 10
29 #define SO_NO_CHECK 11 31 #define SO_NO_CHECK 11
30 #define SO_PRIORITY 12 32 #define SO_PRIORITY 12
31 #define SO_LINGER 13 33 #define SO_LINGER 13
32 #define SO_BSDCOMPAT 14 34 #define SO_BSDCOMPAT 14
33 /* To add :#define SO_REUSEPORT 15 */ 35 /* To add :#define SO_REUSEPORT 15 */
34 #define SO_PASSCRED 16 36 #define SO_PASSCRED 16
35 #define SO_PEERCRED 17 37 #define SO_PEERCRED 17
36 #define SO_RCVLOWAT 18 38 #define SO_RCVLOWAT 18
37 #define SO_SNDLOWAT 19 39 #define SO_SNDLOWAT 19
38 #define SO_RCVTIMEO 20 40 #define SO_RCVTIMEO 20
39 #define SO_SNDTIMEO 21 41 #define SO_SNDTIMEO 21
40 42
41 /* Security levels - as per NRL IPv6 - don't actually do anything */ 43 /* Security levels - as per NRL IPv6 - don't actually do anything */
42 44
43 #define SO_SECURITY_AUTHENTICATION 22 45 #define SO_SECURITY_AUTHENTICATION 22
44 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23 46 #define SO_SECURITY_ENCRYPTION_TRANSPORT 23
45 #define SO_SECURITY_ENCRYPTION_NETWORK 24 47 #define SO_SECURITY_ENCRYPTION_NETWORK 24
46 48
47 #define SO_BINDTODEVICE 25 49 #define SO_BINDTODEVICE 25
48 50
49 /* Socket filtering */ 51 /* Socket filtering */
50 52
51 #define SO_ATTACH_FILTER 26 53 #define SO_ATTACH_FILTER 26
52 #define SO_DETACH_FILTER 27 54 #define SO_DETACH_FILTER 27
53 55
54 #define SO_PEERNAME 28 56 #define SO_PEERNAME 28
55 #define SO_TIMESTAMP 29 57 #define SO_TIMESTAMP 29
56 #define SCM_TIMESTAMP SO_TIMESTAMP 58 #define SCM_TIMESTAMP SO_TIMESTAMP
57 59
58 #define SO_ACCEPTCONN 30 60 #define SO_ACCEPTCONN 30
59 #define SO_PEERSEC 31 61 #define SO_PEERSEC 31
60 62
61 #endif /* _XTENSA_SOCKET_H */ 63 #endif /* _XTENSA_SOCKET_H */
62 64
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 * Generic socket support routines. Memory allocators, socket lock/release 6 * Generic socket support routines. Memory allocators, socket lock/release
7 * handler for protocols to use and generic option handler. 7 * handler for protocols to use and generic option handler.
8 * 8 *
9 * 9 *
10 * Version: $Id: sock.c,v 1.117 2002/02/01 22:01:03 davem Exp $ 10 * Version: $Id: sock.c,v 1.117 2002/02/01 22:01:03 davem Exp $
11 * 11 *
12 * Authors: Ross Biro 12 * Authors: Ross Biro
13 * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG> 13 * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
14 * Florian La Roche, <flla@stud.uni-sb.de> 14 * Florian La Roche, <flla@stud.uni-sb.de>
15 * Alan Cox, <A.Cox@swansea.ac.uk> 15 * Alan Cox, <A.Cox@swansea.ac.uk>
16 * 16 *
17 * Fixes: 17 * Fixes:
18 * Alan Cox : Numerous verify_area() problems 18 * Alan Cox : Numerous verify_area() problems
19 * Alan Cox : Connecting on a connecting socket 19 * Alan Cox : Connecting on a connecting socket
20 * now returns an error for tcp. 20 * now returns an error for tcp.
21 * Alan Cox : sock->protocol is set correctly. 21 * Alan Cox : sock->protocol is set correctly.
22 * and is not sometimes left as 0. 22 * and is not sometimes left as 0.
23 * Alan Cox : connect handles icmp errors on a 23 * Alan Cox : connect handles icmp errors on a
24 * connect properly. Unfortunately there 24 * connect properly. Unfortunately there
25 * is a restart syscall nasty there. I 25 * is a restart syscall nasty there. I
26 * can't match BSD without hacking the C 26 * can't match BSD without hacking the C
27 * library. Ideas urgently sought! 27 * library. Ideas urgently sought!
28 * Alan Cox : Disallow bind() to addresses that are 28 * Alan Cox : Disallow bind() to addresses that are
29 * not ours - especially broadcast ones!! 29 * not ours - especially broadcast ones!!
30 * Alan Cox : Socket 1024 _IS_ ok for users. (fencepost) 30 * Alan Cox : Socket 1024 _IS_ ok for users. (fencepost)
31 * Alan Cox : sock_wfree/sock_rfree don't destroy sockets, 31 * Alan Cox : sock_wfree/sock_rfree don't destroy sockets,
32 * instead they leave that for the DESTROY timer. 32 * instead they leave that for the DESTROY timer.
33 * Alan Cox : Clean up error flag in accept 33 * Alan Cox : Clean up error flag in accept
34 * Alan Cox : TCP ack handling is buggy, the DESTROY timer 34 * Alan Cox : TCP ack handling is buggy, the DESTROY timer
35 * was buggy. Put a remove_sock() in the handler 35 * was buggy. Put a remove_sock() in the handler
36 * for memory when we hit 0. Also altered the timer 36 * for memory when we hit 0. Also altered the timer
37 * code. The ACK stuff can wait and needs major 37 * code. The ACK stuff can wait and needs major
38 * TCP layer surgery. 38 * TCP layer surgery.
39 * Alan Cox : Fixed TCP ack bug, removed remove sock 39 * Alan Cox : Fixed TCP ack bug, removed remove sock
40 * and fixed timer/inet_bh race. 40 * and fixed timer/inet_bh race.
41 * Alan Cox : Added zapped flag for TCP 41 * Alan Cox : Added zapped flag for TCP
42 * Alan Cox : Move kfree_skb into skbuff.c and tidied up surplus code 42 * Alan Cox : Move kfree_skb into skbuff.c and tidied up surplus code
43 * Alan Cox : for new sk_buff allocations wmalloc/rmalloc now call alloc_skb 43 * Alan Cox : for new sk_buff allocations wmalloc/rmalloc now call alloc_skb
44 * Alan Cox : kfree_s calls now are kfree_skbmem so we can track skb resources 44 * Alan Cox : kfree_s calls now are kfree_skbmem so we can track skb resources
45 * Alan Cox : Supports socket option broadcast now as does udp. Packet and raw need fixing. 45 * Alan Cox : Supports socket option broadcast now as does udp. Packet and raw need fixing.
46 * Alan Cox : Added RCVBUF,SNDBUF size setting. It suddenly occurred to me how easy it was so... 46 * Alan Cox : Added RCVBUF,SNDBUF size setting. It suddenly occurred to me how easy it was so...
47 * Rick Sladkey : Relaxed UDP rules for matching packets. 47 * Rick Sladkey : Relaxed UDP rules for matching packets.
48 * C.E.Hawkins : IFF_PROMISC/SIOCGHWADDR support 48 * C.E.Hawkins : IFF_PROMISC/SIOCGHWADDR support
49 * Pauline Middelink : identd support 49 * Pauline Middelink : identd support
50 * Alan Cox : Fixed connect() taking signals I think. 50 * Alan Cox : Fixed connect() taking signals I think.
51 * Alan Cox : SO_LINGER supported 51 * Alan Cox : SO_LINGER supported
52 * Alan Cox : Error reporting fixes 52 * Alan Cox : Error reporting fixes
53 * Anonymous : inet_create tidied up (sk->reuse setting) 53 * Anonymous : inet_create tidied up (sk->reuse setting)
54 * Alan Cox : inet sockets don't set sk->type! 54 * Alan Cox : inet sockets don't set sk->type!
55 * Alan Cox : Split socket option code 55 * Alan Cox : Split socket option code
56 * Alan Cox : Callbacks 56 * Alan Cox : Callbacks
57 * Alan Cox : Nagle flag for Charles & Johannes stuff 57 * Alan Cox : Nagle flag for Charles & Johannes stuff
58 * Alex : Removed restriction on inet fioctl 58 * Alex : Removed restriction on inet fioctl
59 * Alan Cox : Splitting INET from NET core 59 * Alan Cox : Splitting INET from NET core
60 * Alan Cox : Fixed bogus SO_TYPE handling in getsockopt() 60 * Alan Cox : Fixed bogus SO_TYPE handling in getsockopt()
61 * Adam Caldwell : Missing return in SO_DONTROUTE/SO_DEBUG code 61 * Adam Caldwell : Missing return in SO_DONTROUTE/SO_DEBUG code
62 * Alan Cox : Split IP from generic code 62 * Alan Cox : Split IP from generic code
63 * Alan Cox : New kfree_skbmem() 63 * Alan Cox : New kfree_skbmem()
64 * Alan Cox : Make SO_DEBUG superuser only. 64 * Alan Cox : Make SO_DEBUG superuser only.
65 * Alan Cox : Allow anyone to clear SO_DEBUG 65 * Alan Cox : Allow anyone to clear SO_DEBUG
66 * (compatibility fix) 66 * (compatibility fix)
67 * Alan Cox : Added optimistic memory grabbing for AF_UNIX throughput. 67 * Alan Cox : Added optimistic memory grabbing for AF_UNIX throughput.
68 * Alan Cox : Allocator for a socket is settable. 68 * Alan Cox : Allocator for a socket is settable.
69 * Alan Cox : SO_ERROR includes soft errors. 69 * Alan Cox : SO_ERROR includes soft errors.
70 * Alan Cox : Allow NULL arguments on some SO_ opts 70 * Alan Cox : Allow NULL arguments on some SO_ opts
71 * Alan Cox : Generic socket allocation to make hooks 71 * Alan Cox : Generic socket allocation to make hooks
72 * easier (suggested by Craig Metz). 72 * easier (suggested by Craig Metz).
73 * Michael Pall : SO_ERROR returns positive errno again 73 * Michael Pall : SO_ERROR returns positive errno again
74 * Steve Whitehouse: Added default destructor to free 74 * Steve Whitehouse: Added default destructor to free
75 * protocol private data. 75 * protocol private data.
76 * Steve Whitehouse: Added various other default routines 76 * Steve Whitehouse: Added various other default routines
77 * common to several socket families. 77 * common to several socket families.
78 * Chris Evans : Call suser() check last on F_SETOWN 78 * Chris Evans : Call suser() check last on F_SETOWN
79 * Jay Schulist : Added SO_ATTACH_FILTER and SO_DETACH_FILTER. 79 * Jay Schulist : Added SO_ATTACH_FILTER and SO_DETACH_FILTER.
80 * Andi Kleen : Add sock_kmalloc()/sock_kfree_s() 80 * Andi Kleen : Add sock_kmalloc()/sock_kfree_s()
81 * Andi Kleen : Fix write_space callback 81 * Andi Kleen : Fix write_space callback
82 * Chris Evans : Security fixes - signedness again 82 * Chris Evans : Security fixes - signedness again
83 * Arnaldo C. Melo : cleanups, use skb_queue_purge 83 * Arnaldo C. Melo : cleanups, use skb_queue_purge
84 * 84 *
85 * To Fix: 85 * To Fix:
86 * 86 *
87 * 87 *
88 * This program is free software; you can redistribute it and/or 88 * This program is free software; you can redistribute it and/or
89 * modify it under the terms of the GNU General Public License 89 * modify it under the terms of the GNU General Public License
90 * as published by the Free Software Foundation; either version 90 * as published by the Free Software Foundation; either version
91 * 2 of the License, or (at your option) any later version. 91 * 2 of the License, or (at your option) any later version.
92 */ 92 */
93 93
94 #include <linux/config.h> 94 #include <linux/config.h>
95 #include <linux/errno.h> 95 #include <linux/errno.h>
96 #include <linux/types.h> 96 #include <linux/types.h>
97 #include <linux/socket.h> 97 #include <linux/socket.h>
98 #include <linux/in.h> 98 #include <linux/in.h>
99 #include <linux/kernel.h> 99 #include <linux/kernel.h>
100 #include <linux/module.h> 100 #include <linux/module.h>
101 #include <linux/proc_fs.h> 101 #include <linux/proc_fs.h>
102 #include <linux/seq_file.h> 102 #include <linux/seq_file.h>
103 #include <linux/sched.h> 103 #include <linux/sched.h>
104 #include <linux/timer.h> 104 #include <linux/timer.h>
105 #include <linux/string.h> 105 #include <linux/string.h>
106 #include <linux/sockios.h> 106 #include <linux/sockios.h>
107 #include <linux/net.h> 107 #include <linux/net.h>
108 #include <linux/mm.h> 108 #include <linux/mm.h>
109 #include <linux/slab.h> 109 #include <linux/slab.h>
110 #include <linux/interrupt.h> 110 #include <linux/interrupt.h>
111 #include <linux/poll.h> 111 #include <linux/poll.h>
112 #include <linux/tcp.h> 112 #include <linux/tcp.h>
113 #include <linux/init.h> 113 #include <linux/init.h>
114 114
115 #include <asm/uaccess.h> 115 #include <asm/uaccess.h>
116 #include <asm/system.h> 116 #include <asm/system.h>
117 117
118 #include <linux/netdevice.h> 118 #include <linux/netdevice.h>
119 #include <net/protocol.h> 119 #include <net/protocol.h>
120 #include <linux/skbuff.h> 120 #include <linux/skbuff.h>
121 #include <net/request_sock.h> 121 #include <net/request_sock.h>
122 #include <net/sock.h> 122 #include <net/sock.h>
123 #include <net/xfrm.h> 123 #include <net/xfrm.h>
124 #include <linux/ipsec.h> 124 #include <linux/ipsec.h>
125 125
126 #include <linux/filter.h> 126 #include <linux/filter.h>
127 127
128 #ifdef CONFIG_INET 128 #ifdef CONFIG_INET
129 #include <net/tcp.h> 129 #include <net/tcp.h>
130 #endif 130 #endif
131 131
132 /* Take into consideration the size of the struct sk_buff overhead in the 132 /* Take into consideration the size of the struct sk_buff overhead in the
133 * determination of these values, since that is non-constant across 133 * determination of these values, since that is non-constant across
134 * platforms. This makes socket queueing behavior and performance 134 * platforms. This makes socket queueing behavior and performance
135 * not depend upon such differences. 135 * not depend upon such differences.
136 */ 136 */
137 #define _SK_MEM_PACKETS 256 137 #define _SK_MEM_PACKETS 256
138 #define _SK_MEM_OVERHEAD (sizeof(struct sk_buff) + 256) 138 #define _SK_MEM_OVERHEAD (sizeof(struct sk_buff) + 256)
139 #define SK_WMEM_MAX (_SK_MEM_OVERHEAD * _SK_MEM_PACKETS) 139 #define SK_WMEM_MAX (_SK_MEM_OVERHEAD * _SK_MEM_PACKETS)
140 #define SK_RMEM_MAX (_SK_MEM_OVERHEAD * _SK_MEM_PACKETS) 140 #define SK_RMEM_MAX (_SK_MEM_OVERHEAD * _SK_MEM_PACKETS)
141 141
142 /* Run time adjustable parameters. */ 142 /* Run time adjustable parameters. */
143 __u32 sysctl_wmem_max = SK_WMEM_MAX; 143 __u32 sysctl_wmem_max = SK_WMEM_MAX;
144 __u32 sysctl_rmem_max = SK_RMEM_MAX; 144 __u32 sysctl_rmem_max = SK_RMEM_MAX;
145 __u32 sysctl_wmem_default = SK_WMEM_MAX; 145 __u32 sysctl_wmem_default = SK_WMEM_MAX;
146 __u32 sysctl_rmem_default = SK_RMEM_MAX; 146 __u32 sysctl_rmem_default = SK_RMEM_MAX;
147 147
148 /* Maximal space eaten by iovec or ancilliary data plus some space */ 148 /* Maximal space eaten by iovec or ancilliary data plus some space */
149 int sysctl_optmem_max = sizeof(unsigned long)*(2*UIO_MAXIOV + 512); 149 int sysctl_optmem_max = sizeof(unsigned long)*(2*UIO_MAXIOV + 512);
150 150
151 static int sock_set_timeout(long *timeo_p, char __user *optval, int optlen) 151 static int sock_set_timeout(long *timeo_p, char __user *optval, int optlen)
152 { 152 {
153 struct timeval tv; 153 struct timeval tv;
154 154
155 if (optlen < sizeof(tv)) 155 if (optlen < sizeof(tv))
156 return -EINVAL; 156 return -EINVAL;
157 if (copy_from_user(&tv, optval, sizeof(tv))) 157 if (copy_from_user(&tv, optval, sizeof(tv)))
158 return -EFAULT; 158 return -EFAULT;
159 159
160 *timeo_p = MAX_SCHEDULE_TIMEOUT; 160 *timeo_p = MAX_SCHEDULE_TIMEOUT;
161 if (tv.tv_sec == 0 && tv.tv_usec == 0) 161 if (tv.tv_sec == 0 && tv.tv_usec == 0)
162 return 0; 162 return 0;
163 if (tv.tv_sec < (MAX_SCHEDULE_TIMEOUT/HZ - 1)) 163 if (tv.tv_sec < (MAX_SCHEDULE_TIMEOUT/HZ - 1))
164 *timeo_p = tv.tv_sec*HZ + (tv.tv_usec+(1000000/HZ-1))/(1000000/HZ); 164 *timeo_p = tv.tv_sec*HZ + (tv.tv_usec+(1000000/HZ-1))/(1000000/HZ);
165 return 0; 165 return 0;
166 } 166 }
167 167
168 static void sock_warn_obsolete_bsdism(const char *name) 168 static void sock_warn_obsolete_bsdism(const char *name)
169 { 169 {
170 static int warned; 170 static int warned;
171 static char warncomm[TASK_COMM_LEN]; 171 static char warncomm[TASK_COMM_LEN];
172 if (strcmp(warncomm, current->comm) && warned < 5) { 172 if (strcmp(warncomm, current->comm) && warned < 5) {
173 strcpy(warncomm, current->comm); 173 strcpy(warncomm, current->comm);
174 printk(KERN_WARNING "process `%s' is using obsolete " 174 printk(KERN_WARNING "process `%s' is using obsolete "
175 "%s SO_BSDCOMPAT\n", warncomm, name); 175 "%s SO_BSDCOMPAT\n", warncomm, name);
176 warned++; 176 warned++;
177 } 177 }
178 } 178 }
179 179
180 static void sock_disable_timestamp(struct sock *sk) 180 static void sock_disable_timestamp(struct sock *sk)
181 { 181 {
182 if (sock_flag(sk, SOCK_TIMESTAMP)) { 182 if (sock_flag(sk, SOCK_TIMESTAMP)) {
183 sock_reset_flag(sk, SOCK_TIMESTAMP); 183 sock_reset_flag(sk, SOCK_TIMESTAMP);
184 net_disable_timestamp(); 184 net_disable_timestamp();
185 } 185 }
186 } 186 }
187 187
188 188
189 /* 189 /*
190 * This is meant for all protocols to use and covers goings on 190 * This is meant for all protocols to use and covers goings on
191 * at the socket level. Everything here is generic. 191 * at the socket level. Everything here is generic.
192 */ 192 */
193 193
194 int sock_setsockopt(struct socket *sock, int level, int optname, 194 int sock_setsockopt(struct socket *sock, int level, int optname,
195 char __user *optval, int optlen) 195 char __user *optval, int optlen)
196 { 196 {
197 struct sock *sk=sock->sk; 197 struct sock *sk=sock->sk;
198 struct sk_filter *filter; 198 struct sk_filter *filter;
199 int val; 199 int val;
200 int valbool; 200 int valbool;
201 struct linger ling; 201 struct linger ling;
202 int ret = 0; 202 int ret = 0;
203 203
204 /* 204 /*
205 * Options without arguments 205 * Options without arguments
206 */ 206 */
207 207
208 #ifdef SO_DONTLINGER /* Compatibility item... */ 208 #ifdef SO_DONTLINGER /* Compatibility item... */
209 if (optname == SO_DONTLINGER) { 209 if (optname == SO_DONTLINGER) {
210 lock_sock(sk); 210 lock_sock(sk);
211 sock_reset_flag(sk, SOCK_LINGER); 211 sock_reset_flag(sk, SOCK_LINGER);
212 release_sock(sk); 212 release_sock(sk);
213 return 0; 213 return 0;
214 } 214 }
215 #endif 215 #endif
216 216
217 if(optlen<sizeof(int)) 217 if(optlen<sizeof(int))
218 return(-EINVAL); 218 return(-EINVAL);
219 219
220 if (get_user(val, (int __user *)optval)) 220 if (get_user(val, (int __user *)optval))
221 return -EFAULT; 221 return -EFAULT;
222 222
223 valbool = val?1:0; 223 valbool = val?1:0;
224 224
225 lock_sock(sk); 225 lock_sock(sk);
226 226
227 switch(optname) 227 switch(optname)
228 { 228 {
229 case SO_DEBUG: 229 case SO_DEBUG:
230 if(val && !capable(CAP_NET_ADMIN)) 230 if(val && !capable(CAP_NET_ADMIN))
231 { 231 {
232 ret = -EACCES; 232 ret = -EACCES;
233 } 233 }
234 else if (valbool) 234 else if (valbool)
235 sock_set_flag(sk, SOCK_DBG); 235 sock_set_flag(sk, SOCK_DBG);
236 else 236 else
237 sock_reset_flag(sk, SOCK_DBG); 237 sock_reset_flag(sk, SOCK_DBG);
238 break; 238 break;
239 case SO_REUSEADDR: 239 case SO_REUSEADDR:
240 sk->sk_reuse = valbool; 240 sk->sk_reuse = valbool;
241 break; 241 break;
242 case SO_TYPE: 242 case SO_TYPE:
243 case SO_ERROR: 243 case SO_ERROR:
244 ret = -ENOPROTOOPT; 244 ret = -ENOPROTOOPT;
245 break; 245 break;
246 case SO_DONTROUTE: 246 case SO_DONTROUTE:
247 if (valbool) 247 if (valbool)
248 sock_set_flag(sk, SOCK_LOCALROUTE); 248 sock_set_flag(sk, SOCK_LOCALROUTE);
249 else 249 else
250 sock_reset_flag(sk, SOCK_LOCALROUTE); 250 sock_reset_flag(sk, SOCK_LOCALROUTE);
251 break; 251 break;
252 case SO_BROADCAST: 252 case SO_BROADCAST:
253 sock_valbool_flag(sk, SOCK_BROADCAST, valbool); 253 sock_valbool_flag(sk, SOCK_BROADCAST, valbool);
254 break; 254 break;
255 case SO_SNDBUF: 255 case SO_SNDBUF:
256 /* Don't error on this BSD doesn't and if you think 256 /* Don't error on this BSD doesn't and if you think
257 about it this is right. Otherwise apps have to 257 about it this is right. Otherwise apps have to
258 play 'guess the biggest size' games. RCVBUF/SNDBUF 258 play 'guess the biggest size' games. RCVBUF/SNDBUF
259 are treated in BSD as hints */ 259 are treated in BSD as hints */
260 260
261 if (val > sysctl_wmem_max) 261 if (val > sysctl_wmem_max)
262 val = sysctl_wmem_max; 262 val = sysctl_wmem_max;
263 263 set_sndbuf:
264 sk->sk_userlocks |= SOCK_SNDBUF_LOCK; 264 sk->sk_userlocks |= SOCK_SNDBUF_LOCK;
265 if ((val * 2) < SOCK_MIN_SNDBUF) 265 if ((val * 2) < SOCK_MIN_SNDBUF)
266 sk->sk_sndbuf = SOCK_MIN_SNDBUF; 266 sk->sk_sndbuf = SOCK_MIN_SNDBUF;
267 else 267 else
268 sk->sk_sndbuf = val * 2; 268 sk->sk_sndbuf = val * 2;
269 269
270 /* 270 /*
271 * Wake up sending tasks if we 271 * Wake up sending tasks if we
272 * upped the value. 272 * upped the value.
273 */ 273 */
274 sk->sk_write_space(sk); 274 sk->sk_write_space(sk);
275 break; 275 break;
276 276
277 case SO_SNDBUFFORCE:
278 if (!capable(CAP_NET_ADMIN)) {
279 ret = -EPERM;
280 break;
281 }
282 goto set_sndbuf;
283
277 case SO_RCVBUF: 284 case SO_RCVBUF:
278 /* Don't error on this BSD doesn't and if you think 285 /* Don't error on this BSD doesn't and if you think
279 about it this is right. Otherwise apps have to 286 about it this is right. Otherwise apps have to
280 play 'guess the biggest size' games. RCVBUF/SNDBUF 287 play 'guess the biggest size' games. RCVBUF/SNDBUF
281 are treated in BSD as hints */ 288 are treated in BSD as hints */
282 289
283 if (val > sysctl_rmem_max) 290 if (val > sysctl_rmem_max)
284 val = sysctl_rmem_max; 291 val = sysctl_rmem_max;
285 292 set_rcvbuf:
286 sk->sk_userlocks |= SOCK_RCVBUF_LOCK; 293 sk->sk_userlocks |= SOCK_RCVBUF_LOCK;
287 /* FIXME: is this lower bound the right one? */ 294 /* FIXME: is this lower bound the right one? */
288 if ((val * 2) < SOCK_MIN_RCVBUF) 295 if ((val * 2) < SOCK_MIN_RCVBUF)
289 sk->sk_rcvbuf = SOCK_MIN_RCVBUF; 296 sk->sk_rcvbuf = SOCK_MIN_RCVBUF;
290 else 297 else
291 sk->sk_rcvbuf = val * 2; 298 sk->sk_rcvbuf = val * 2;
292 break; 299 break;
300
301 case SO_RCVBUFFORCE:
302 if (!capable(CAP_NET_ADMIN)) {
303 ret = -EPERM;
304 break;
305 }
306 goto set_rcvbuf;
293 307
294 case SO_KEEPALIVE: 308 case SO_KEEPALIVE:
295 #ifdef CONFIG_INET 309 #ifdef CONFIG_INET
296 if (sk->sk_protocol == IPPROTO_TCP) 310 if (sk->sk_protocol == IPPROTO_TCP)
297 tcp_set_keepalive(sk, valbool); 311 tcp_set_keepalive(sk, valbool);
298 #endif 312 #endif
299 sock_valbool_flag(sk, SOCK_KEEPOPEN, valbool); 313 sock_valbool_flag(sk, SOCK_KEEPOPEN, valbool);
300 break; 314 break;
301 315
302 case SO_OOBINLINE: 316 case SO_OOBINLINE:
303 sock_valbool_flag(sk, SOCK_URGINLINE, valbool); 317 sock_valbool_flag(sk, SOCK_URGINLINE, valbool);
304 break; 318 break;
305 319
306 case SO_NO_CHECK: 320 case SO_NO_CHECK:
307 sk->sk_no_check = valbool; 321 sk->sk_no_check = valbool;
308 break; 322 break;
309 323
310 case SO_PRIORITY: 324 case SO_PRIORITY:
311 if ((val >= 0 && val <= 6) || capable(CAP_NET_ADMIN)) 325 if ((val >= 0 && val <= 6) || capable(CAP_NET_ADMIN))
312 sk->sk_priority = val; 326 sk->sk_priority = val;
313 else 327 else
314 ret = -EPERM; 328 ret = -EPERM;
315 break; 329 break;
316 330
317 case SO_LINGER: 331 case SO_LINGER:
318 if(optlen<sizeof(ling)) { 332 if(optlen<sizeof(ling)) {
319 ret = -EINVAL; /* 1003.1g */ 333 ret = -EINVAL; /* 1003.1g */
320 break; 334 break;
321 } 335 }
322 if (copy_from_user(&ling,optval,sizeof(ling))) { 336 if (copy_from_user(&ling,optval,sizeof(ling))) {
323 ret = -EFAULT; 337 ret = -EFAULT;
324 break; 338 break;
325 } 339 }
326 if (!ling.l_onoff) 340 if (!ling.l_onoff)
327 sock_reset_flag(sk, SOCK_LINGER); 341 sock_reset_flag(sk, SOCK_LINGER);
328 else { 342 else {
329 #if (BITS_PER_LONG == 32) 343 #if (BITS_PER_LONG == 32)
330 if (ling.l_linger >= MAX_SCHEDULE_TIMEOUT/HZ) 344 if (ling.l_linger >= MAX_SCHEDULE_TIMEOUT/HZ)
331 sk->sk_lingertime = MAX_SCHEDULE_TIMEOUT; 345 sk->sk_lingertime = MAX_SCHEDULE_TIMEOUT;
332 else 346 else
333 #endif 347 #endif
334 sk->sk_lingertime = ling.l_linger * HZ; 348 sk->sk_lingertime = ling.l_linger * HZ;
335 sock_set_flag(sk, SOCK_LINGER); 349 sock_set_flag(sk, SOCK_LINGER);
336 } 350 }
337 break; 351 break;
338 352
339 case SO_BSDCOMPAT: 353 case SO_BSDCOMPAT:
340 sock_warn_obsolete_bsdism("setsockopt"); 354 sock_warn_obsolete_bsdism("setsockopt");
341 break; 355 break;
342 356
343 case SO_PASSCRED: 357 case SO_PASSCRED:
344 if (valbool) 358 if (valbool)
345 set_bit(SOCK_PASSCRED, &sock->flags); 359 set_bit(SOCK_PASSCRED, &sock->flags);
346 else 360 else
347 clear_bit(SOCK_PASSCRED, &sock->flags); 361 clear_bit(SOCK_PASSCRED, &sock->flags);
348 break; 362 break;
349 363
350 case SO_TIMESTAMP: 364 case SO_TIMESTAMP:
351 if (valbool) { 365 if (valbool) {
352 sock_set_flag(sk, SOCK_RCVTSTAMP); 366 sock_set_flag(sk, SOCK_RCVTSTAMP);
353 sock_enable_timestamp(sk); 367 sock_enable_timestamp(sk);
354 } else 368 } else
355 sock_reset_flag(sk, SOCK_RCVTSTAMP); 369 sock_reset_flag(sk, SOCK_RCVTSTAMP);
356 break; 370 break;
357 371
358 case SO_RCVLOWAT: 372 case SO_RCVLOWAT:
359 if (val < 0) 373 if (val < 0)
360 val = INT_MAX; 374 val = INT_MAX;
361 sk->sk_rcvlowat = val ? : 1; 375 sk->sk_rcvlowat = val ? : 1;
362 break; 376 break;
363 377
364 case SO_RCVTIMEO: 378 case SO_RCVTIMEO:
365 ret = sock_set_timeout(&sk->sk_rcvtimeo, optval, optlen); 379 ret = sock_set_timeout(&sk->sk_rcvtimeo, optval, optlen);
366 break; 380 break;
367 381
368 case SO_SNDTIMEO: 382 case SO_SNDTIMEO:
369 ret = sock_set_timeout(&sk->sk_sndtimeo, optval, optlen); 383 ret = sock_set_timeout(&sk->sk_sndtimeo, optval, optlen);
370 break; 384 break;
371 385
372 #ifdef CONFIG_NETDEVICES 386 #ifdef CONFIG_NETDEVICES
373 case SO_BINDTODEVICE: 387 case SO_BINDTODEVICE:
374 { 388 {
375 char devname[IFNAMSIZ]; 389 char devname[IFNAMSIZ];
376 390
377 /* Sorry... */ 391 /* Sorry... */
378 if (!capable(CAP_NET_RAW)) { 392 if (!capable(CAP_NET_RAW)) {
379 ret = -EPERM; 393 ret = -EPERM;
380 break; 394 break;
381 } 395 }
382 396
383 /* Bind this socket to a particular device like "eth0", 397 /* Bind this socket to a particular device like "eth0",
384 * as specified in the passed interface name. If the 398 * as specified in the passed interface name. If the
385 * name is "" or the option length is zero the socket 399 * name is "" or the option length is zero the socket
386 * is not bound. 400 * is not bound.
387 */ 401 */
388 402
389 if (!valbool) { 403 if (!valbool) {
390 sk->sk_bound_dev_if = 0; 404 sk->sk_bound_dev_if = 0;
391 } else { 405 } else {
392 if (optlen > IFNAMSIZ) 406 if (optlen > IFNAMSIZ)
393 optlen = IFNAMSIZ; 407 optlen = IFNAMSIZ;
394 if (copy_from_user(devname, optval, optlen)) { 408 if (copy_from_user(devname, optval, optlen)) {
395 ret = -EFAULT; 409 ret = -EFAULT;
396 break; 410 break;
397 } 411 }
398 412
399 /* Remove any cached route for this socket. */ 413 /* Remove any cached route for this socket. */
400 sk_dst_reset(sk); 414 sk_dst_reset(sk);
401 415
402 if (devname[0] == '\0') { 416 if (devname[0] == '\0') {
403 sk->sk_bound_dev_if = 0; 417 sk->sk_bound_dev_if = 0;
404 } else { 418 } else {
405 struct net_device *dev = dev_get_by_name(devname); 419 struct net_device *dev = dev_get_by_name(devname);
406 if (!dev) { 420 if (!dev) {
407 ret = -ENODEV; 421 ret = -ENODEV;
408 break; 422 break;
409 } 423 }
410 sk->sk_bound_dev_if = dev->ifindex; 424 sk->sk_bound_dev_if = dev->ifindex;
411 dev_put(dev); 425 dev_put(dev);
412 } 426 }
413 } 427 }
414 break; 428 break;
415 } 429 }
416 #endif 430 #endif
417 431
418 432
419 case SO_ATTACH_FILTER: 433 case SO_ATTACH_FILTER:
420 ret = -EINVAL; 434 ret = -EINVAL;
421 if (optlen == sizeof(struct sock_fprog)) { 435 if (optlen == sizeof(struct sock_fprog)) {
422 struct sock_fprog fprog; 436 struct sock_fprog fprog;
423 437
424 ret = -EFAULT; 438 ret = -EFAULT;
425 if (copy_from_user(&fprog, optval, sizeof(fprog))) 439 if (copy_from_user(&fprog, optval, sizeof(fprog)))
426 break; 440 break;
427 441
428 ret = sk_attach_filter(&fprog, sk); 442 ret = sk_attach_filter(&fprog, sk);
429 } 443 }
430 break; 444 break;
431 445
432 case SO_DETACH_FILTER: 446 case SO_DETACH_FILTER:
433 spin_lock_bh(&sk->sk_lock.slock); 447 spin_lock_bh(&sk->sk_lock.slock);
434 filter = sk->sk_filter; 448 filter = sk->sk_filter;
435 if (filter) { 449 if (filter) {
436 sk->sk_filter = NULL; 450 sk->sk_filter = NULL;
437 spin_unlock_bh(&sk->sk_lock.slock); 451 spin_unlock_bh(&sk->sk_lock.slock);
438 sk_filter_release(sk, filter); 452 sk_filter_release(sk, filter);
439 break; 453 break;
440 } 454 }
441 spin_unlock_bh(&sk->sk_lock.slock); 455 spin_unlock_bh(&sk->sk_lock.slock);
442 ret = -ENONET; 456 ret = -ENONET;
443 break; 457 break;
444 458
445 /* We implement the SO_SNDLOWAT etc to 459 /* We implement the SO_SNDLOWAT etc to
446 not be settable (1003.1g 5.3) */ 460 not be settable (1003.1g 5.3) */
447 default: 461 default:
448 ret = -ENOPROTOOPT; 462 ret = -ENOPROTOOPT;
449 break; 463 break;
450 } 464 }
451 release_sock(sk); 465 release_sock(sk);
452 return ret; 466 return ret;
453 } 467 }
454 468
455 469
456 int sock_getsockopt(struct socket *sock, int level, int optname, 470 int sock_getsockopt(struct socket *sock, int level, int optname,
457 char __user *optval, int __user *optlen) 471 char __user *optval, int __user *optlen)
458 { 472 {
459 struct sock *sk = sock->sk; 473 struct sock *sk = sock->sk;
460 474
461 union 475 union
462 { 476 {
463 int val; 477 int val;
464 struct linger ling; 478 struct linger ling;
465 struct timeval tm; 479 struct timeval tm;
466 } v; 480 } v;
467 481
468 unsigned int lv = sizeof(int); 482 unsigned int lv = sizeof(int);
469 int len; 483 int len;
470 484
471 if(get_user(len,optlen)) 485 if(get_user(len,optlen))
472 return -EFAULT; 486 return -EFAULT;
473 if(len < 0) 487 if(len < 0)
474 return -EINVAL; 488 return -EINVAL;
475 489
476 switch(optname) 490 switch(optname)
477 { 491 {
478 case SO_DEBUG: 492 case SO_DEBUG:
479 v.val = sock_flag(sk, SOCK_DBG); 493 v.val = sock_flag(sk, SOCK_DBG);
480 break; 494 break;
481 495
482 case SO_DONTROUTE: 496 case SO_DONTROUTE:
483 v.val = sock_flag(sk, SOCK_LOCALROUTE); 497 v.val = sock_flag(sk, SOCK_LOCALROUTE);
484 break; 498 break;
485 499
486 case SO_BROADCAST: 500 case SO_BROADCAST:
487 v.val = !!sock_flag(sk, SOCK_BROADCAST); 501 v.val = !!sock_flag(sk, SOCK_BROADCAST);
488 break; 502 break;
489 503
490 case SO_SNDBUF: 504 case SO_SNDBUF:
491 v.val = sk->sk_sndbuf; 505 v.val = sk->sk_sndbuf;
492 break; 506 break;
493 507
494 case SO_RCVBUF: 508 case SO_RCVBUF:
495 v.val = sk->sk_rcvbuf; 509 v.val = sk->sk_rcvbuf;
496 break; 510 break;
497 511
498 case SO_REUSEADDR: 512 case SO_REUSEADDR:
499 v.val = sk->sk_reuse; 513 v.val = sk->sk_reuse;
500 break; 514 break;
501 515
502 case SO_KEEPALIVE: 516 case SO_KEEPALIVE:
503 v.val = !!sock_flag(sk, SOCK_KEEPOPEN); 517 v.val = !!sock_flag(sk, SOCK_KEEPOPEN);
504 break; 518 break;
505 519
506 case SO_TYPE: 520 case SO_TYPE:
507 v.val = sk->sk_type; 521 v.val = sk->sk_type;
508 break; 522 break;
509 523
510 case SO_ERROR: 524 case SO_ERROR:
511 v.val = -sock_error(sk); 525 v.val = -sock_error(sk);
512 if(v.val==0) 526 if(v.val==0)
513 v.val = xchg(&sk->sk_err_soft, 0); 527 v.val = xchg(&sk->sk_err_soft, 0);
514 break; 528 break;
515 529
516 case SO_OOBINLINE: 530 case SO_OOBINLINE:
517 v.val = !!sock_flag(sk, SOCK_URGINLINE); 531 v.val = !!sock_flag(sk, SOCK_URGINLINE);
518 break; 532 break;
519 533
520 case SO_NO_CHECK: 534 case SO_NO_CHECK:
521 v.val = sk->sk_no_check; 535 v.val = sk->sk_no_check;
522 break; 536 break;
523 537
524 case SO_PRIORITY: 538 case SO_PRIORITY:
525 v.val = sk->sk_priority; 539 v.val = sk->sk_priority;
526 break; 540 break;
527 541
528 case SO_LINGER: 542 case SO_LINGER:
529 lv = sizeof(v.ling); 543 lv = sizeof(v.ling);
530 v.ling.l_onoff = !!sock_flag(sk, SOCK_LINGER); 544 v.ling.l_onoff = !!sock_flag(sk, SOCK_LINGER);
531 v.ling.l_linger = sk->sk_lingertime / HZ; 545 v.ling.l_linger = sk->sk_lingertime / HZ;
532 break; 546 break;
533 547
534 case SO_BSDCOMPAT: 548 case SO_BSDCOMPAT:
535 sock_warn_obsolete_bsdism("getsockopt"); 549 sock_warn_obsolete_bsdism("getsockopt");
536 break; 550 break;
537 551
538 case SO_TIMESTAMP: 552 case SO_TIMESTAMP:
539 v.val = sock_flag(sk, SOCK_RCVTSTAMP); 553 v.val = sock_flag(sk, SOCK_RCVTSTAMP);
540 break; 554 break;
541 555
542 case SO_RCVTIMEO: 556 case SO_RCVTIMEO:
543 lv=sizeof(struct timeval); 557 lv=sizeof(struct timeval);
544 if (sk->sk_rcvtimeo == MAX_SCHEDULE_TIMEOUT) { 558 if (sk->sk_rcvtimeo == MAX_SCHEDULE_TIMEOUT) {
545 v.tm.tv_sec = 0; 559 v.tm.tv_sec = 0;
546 v.tm.tv_usec = 0; 560 v.tm.tv_usec = 0;
547 } else { 561 } else {
548 v.tm.tv_sec = sk->sk_rcvtimeo / HZ; 562 v.tm.tv_sec = sk->sk_rcvtimeo / HZ;
549 v.tm.tv_usec = ((sk->sk_rcvtimeo % HZ) * 1000000) / HZ; 563 v.tm.tv_usec = ((sk->sk_rcvtimeo % HZ) * 1000000) / HZ;
550 } 564 }
551 break; 565 break;
552 566
553 case SO_SNDTIMEO: 567 case SO_SNDTIMEO:
554 lv=sizeof(struct timeval); 568 lv=sizeof(struct timeval);
555 if (sk->sk_sndtimeo == MAX_SCHEDULE_TIMEOUT) { 569 if (sk->sk_sndtimeo == MAX_SCHEDULE_TIMEOUT) {
556 v.tm.tv_sec = 0; 570 v.tm.tv_sec = 0;
557 v.tm.tv_usec = 0; 571 v.tm.tv_usec = 0;
558 } else { 572 } else {
559 v.tm.tv_sec = sk->sk_sndtimeo / HZ; 573 v.tm.tv_sec = sk->sk_sndtimeo / HZ;
560 v.tm.tv_usec = ((sk->sk_sndtimeo % HZ) * 1000000) / HZ; 574 v.tm.tv_usec = ((sk->sk_sndtimeo % HZ) * 1000000) / HZ;
561 } 575 }
562 break; 576 break;
563 577
564 case SO_RCVLOWAT: 578 case SO_RCVLOWAT:
565 v.val = sk->sk_rcvlowat; 579 v.val = sk->sk_rcvlowat;
566 break; 580 break;
567 581
568 case SO_SNDLOWAT: 582 case SO_SNDLOWAT:
569 v.val=1; 583 v.val=1;
570 break; 584 break;
571 585
572 case SO_PASSCRED: 586 case SO_PASSCRED:
573 v.val = test_bit(SOCK_PASSCRED, &sock->flags) ? 1 : 0; 587 v.val = test_bit(SOCK_PASSCRED, &sock->flags) ? 1 : 0;
574 break; 588 break;
575 589
576 case SO_PEERCRED: 590 case SO_PEERCRED:
577 if (len > sizeof(sk->sk_peercred)) 591 if (len > sizeof(sk->sk_peercred))
578 len = sizeof(sk->sk_peercred); 592 len = sizeof(sk->sk_peercred);
579 if (copy_to_user(optval, &sk->sk_peercred, len)) 593 if (copy_to_user(optval, &sk->sk_peercred, len))
580 return -EFAULT; 594 return -EFAULT;
581 goto lenout; 595 goto lenout;
582 596
583 case SO_PEERNAME: 597 case SO_PEERNAME:
584 { 598 {
585 char address[128]; 599 char address[128];
586 600
587 if (sock->ops->getname(sock, (struct sockaddr *)address, &lv, 2)) 601 if (sock->ops->getname(sock, (struct sockaddr *)address, &lv, 2))
588 return -ENOTCONN; 602 return -ENOTCONN;
589 if (lv < len) 603 if (lv < len)
590 return -EINVAL; 604 return -EINVAL;
591 if (copy_to_user(optval, address, len)) 605 if (copy_to_user(optval, address, len))
592 return -EFAULT; 606 return -EFAULT;
593 goto lenout; 607 goto lenout;
594 } 608 }
595 609
596 /* Dubious BSD thing... Probably nobody even uses it, but 610 /* Dubious BSD thing... Probably nobody even uses it, but
597 * the UNIX standard wants it for whatever reason... -DaveM 611 * the UNIX standard wants it for whatever reason... -DaveM
598 */ 612 */
599 case SO_ACCEPTCONN: 613 case SO_ACCEPTCONN:
600 v.val = sk->sk_state == TCP_LISTEN; 614 v.val = sk->sk_state == TCP_LISTEN;
601 break; 615 break;
602 616
603 case SO_PEERSEC: 617 case SO_PEERSEC:
604 return security_socket_getpeersec(sock, optval, optlen, len); 618 return security_socket_getpeersec(sock, optval, optlen, len);
605 619
606 default: 620 default:
607 return(-ENOPROTOOPT); 621 return(-ENOPROTOOPT);
608 } 622 }
609 if (len > lv) 623 if (len > lv)
610 len = lv; 624 len = lv;
611 if (copy_to_user(optval, &v, len)) 625 if (copy_to_user(optval, &v, len))
612 return -EFAULT; 626 return -EFAULT;
613 lenout: 627 lenout:
614 if (put_user(len, optlen)) 628 if (put_user(len, optlen))
615 return -EFAULT; 629 return -EFAULT;
616 return 0; 630 return 0;
617 } 631 }
618 632
619 /** 633 /**
620 * sk_alloc - All socket objects are allocated here 634 * sk_alloc - All socket objects are allocated here
621 * @family: protocol family 635 * @family: protocol family
622 * @priority: for allocation (%GFP_KERNEL, %GFP_ATOMIC, etc) 636 * @priority: for allocation (%GFP_KERNEL, %GFP_ATOMIC, etc)
623 * @prot: struct proto associated with this new sock instance 637 * @prot: struct proto associated with this new sock instance
624 * @zero_it: if we should zero the newly allocated sock 638 * @zero_it: if we should zero the newly allocated sock
625 */ 639 */
626 struct sock *sk_alloc(int family, unsigned int __nocast priority, 640 struct sock *sk_alloc(int family, unsigned int __nocast priority,
627 struct proto *prot, int zero_it) 641 struct proto *prot, int zero_it)
628 { 642 {
629 struct sock *sk = NULL; 643 struct sock *sk = NULL;
630 kmem_cache_t *slab = prot->slab; 644 kmem_cache_t *slab = prot->slab;
631 645
632 if (slab != NULL) 646 if (slab != NULL)
633 sk = kmem_cache_alloc(slab, priority); 647 sk = kmem_cache_alloc(slab, priority);
634 else 648 else
635 sk = kmalloc(prot->obj_size, priority); 649 sk = kmalloc(prot->obj_size, priority);
636 650
637 if (sk) { 651 if (sk) {
638 if (zero_it) { 652 if (zero_it) {
639 memset(sk, 0, prot->obj_size); 653 memset(sk, 0, prot->obj_size);
640 sk->sk_family = family; 654 sk->sk_family = family;
641 /* 655 /*
642 * See comment in struct sock definition to understand 656 * See comment in struct sock definition to understand
643 * why we need sk_prot_creator -acme 657 * why we need sk_prot_creator -acme
644 */ 658 */
645 sk->sk_prot = sk->sk_prot_creator = prot; 659 sk->sk_prot = sk->sk_prot_creator = prot;
646 sock_lock_init(sk); 660 sock_lock_init(sk);
647 } 661 }
648 662
649 if (security_sk_alloc(sk, family, priority)) { 663 if (security_sk_alloc(sk, family, priority)) {
650 if (slab != NULL) 664 if (slab != NULL)
651 kmem_cache_free(slab, sk); 665 kmem_cache_free(slab, sk);
652 else 666 else
653 kfree(sk); 667 kfree(sk);
654 sk = NULL; 668 sk = NULL;
655 } else 669 } else
656 __module_get(prot->owner); 670 __module_get(prot->owner);
657 } 671 }
658 return sk; 672 return sk;
659 } 673 }
660 674
661 void sk_free(struct sock *sk) 675 void sk_free(struct sock *sk)
662 { 676 {
663 struct sk_filter *filter; 677 struct sk_filter *filter;
664 struct module *owner = sk->sk_prot_creator->owner; 678 struct module *owner = sk->sk_prot_creator->owner;
665 679
666 if (sk->sk_destruct) 680 if (sk->sk_destruct)
667 sk->sk_destruct(sk); 681 sk->sk_destruct(sk);
668 682
669 filter = sk->sk_filter; 683 filter = sk->sk_filter;
670 if (filter) { 684 if (filter) {
671 sk_filter_release(sk, filter); 685 sk_filter_release(sk, filter);
672 sk->sk_filter = NULL; 686 sk->sk_filter = NULL;
673 } 687 }
674 688
675 sock_disable_timestamp(sk); 689 sock_disable_timestamp(sk);
676 690
677 if (atomic_read(&sk->sk_omem_alloc)) 691 if (atomic_read(&sk->sk_omem_alloc))
678 printk(KERN_DEBUG "%s: optmem leakage (%d bytes) detected.\n", 692 printk(KERN_DEBUG "%s: optmem leakage (%d bytes) detected.\n",
679 __FUNCTION__, atomic_read(&sk->sk_omem_alloc)); 693 __FUNCTION__, atomic_read(&sk->sk_omem_alloc));
680 694
681 security_sk_free(sk); 695 security_sk_free(sk);
682 if (sk->sk_prot_creator->slab != NULL) 696 if (sk->sk_prot_creator->slab != NULL)
683 kmem_cache_free(sk->sk_prot_creator->slab, sk); 697 kmem_cache_free(sk->sk_prot_creator->slab, sk);
684 else 698 else
685 kfree(sk); 699 kfree(sk);
686 module_put(owner); 700 module_put(owner);
687 } 701 }
688 702
689 void __init sk_init(void) 703 void __init sk_init(void)
690 { 704 {
691 if (num_physpages <= 4096) { 705 if (num_physpages <= 4096) {
692 sysctl_wmem_max = 32767; 706 sysctl_wmem_max = 32767;
693 sysctl_rmem_max = 32767; 707 sysctl_rmem_max = 32767;
694 sysctl_wmem_default = 32767; 708 sysctl_wmem_default = 32767;
695 sysctl_rmem_default = 32767; 709 sysctl_rmem_default = 32767;
696 } else if (num_physpages >= 131072) { 710 } else if (num_physpages >= 131072) {
697 sysctl_wmem_max = 131071; 711 sysctl_wmem_max = 131071;
698 sysctl_rmem_max = 131071; 712 sysctl_rmem_max = 131071;
699 } 713 }
700 } 714 }
701 715
702 /* 716 /*
703 * Simple resource managers for sockets. 717 * Simple resource managers for sockets.
704 */ 718 */
705 719
706 720
707 /* 721 /*
708 * Write buffer destructor automatically called from kfree_skb. 722 * Write buffer destructor automatically called from kfree_skb.
709 */ 723 */
710 void sock_wfree(struct sk_buff *skb) 724 void sock_wfree(struct sk_buff *skb)
711 { 725 {
712 struct sock *sk = skb->sk; 726 struct sock *sk = skb->sk;
713 727
714 /* In case it might be waiting for more memory. */ 728 /* In case it might be waiting for more memory. */
715 atomic_sub(skb->truesize, &sk->sk_wmem_alloc); 729 atomic_sub(skb->truesize, &sk->sk_wmem_alloc);
716 if (!sock_flag(sk, SOCK_USE_WRITE_QUEUE)) 730 if (!sock_flag(sk, SOCK_USE_WRITE_QUEUE))
717 sk->sk_write_space(sk); 731 sk->sk_write_space(sk);
718 sock_put(sk); 732 sock_put(sk);
719 } 733 }
720 734
721 /* 735 /*
722 * Read buffer destructor automatically called from kfree_skb. 736 * Read buffer destructor automatically called from kfree_skb.
723 */ 737 */
724 void sock_rfree(struct sk_buff *skb) 738 void sock_rfree(struct sk_buff *skb)
725 { 739 {
726 struct sock *sk = skb->sk; 740 struct sock *sk = skb->sk;
727 741
728 atomic_sub(skb->truesize, &sk->sk_rmem_alloc); 742 atomic_sub(skb->truesize, &sk->sk_rmem_alloc);
729 } 743 }
730 744
731 745
732 int sock_i_uid(struct sock *sk) 746 int sock_i_uid(struct sock *sk)
733 { 747 {
734 int uid; 748 int uid;
735 749
736 read_lock(&sk->sk_callback_lock); 750 read_lock(&sk->sk_callback_lock);
737 uid = sk->sk_socket ? SOCK_INODE(sk->sk_socket)->i_uid : 0; 751 uid = sk->sk_socket ? SOCK_INODE(sk->sk_socket)->i_uid : 0;
738 read_unlock(&sk->sk_callback_lock); 752 read_unlock(&sk->sk_callback_lock);
739 return uid; 753 return uid;
740 } 754 }
741 755
742 unsigned long sock_i_ino(struct sock *sk) 756 unsigned long sock_i_ino(struct sock *sk)
743 { 757 {
744 unsigned long ino; 758 unsigned long ino;
745 759
746 read_lock(&sk->sk_callback_lock); 760 read_lock(&sk->sk_callback_lock);
747 ino = sk->sk_socket ? SOCK_INODE(sk->sk_socket)->i_ino : 0; 761 ino = sk->sk_socket ? SOCK_INODE(sk->sk_socket)->i_ino : 0;
748 read_unlock(&sk->sk_callback_lock); 762 read_unlock(&sk->sk_callback_lock);
749 return ino; 763 return ino;
750 } 764 }
751 765
752 /* 766 /*
753 * Allocate a skb from the socket's send buffer. 767 * Allocate a skb from the socket's send buffer.
754 */ 768 */
755 struct sk_buff *sock_wmalloc(struct sock *sk, unsigned long size, int force, 769 struct sk_buff *sock_wmalloc(struct sock *sk, unsigned long size, int force,
756 unsigned int __nocast priority) 770 unsigned int __nocast priority)
757 { 771 {
758 if (force || atomic_read(&sk->sk_wmem_alloc) < sk->sk_sndbuf) { 772 if (force || atomic_read(&sk->sk_wmem_alloc) < sk->sk_sndbuf) {
759 struct sk_buff * skb = alloc_skb(size, priority); 773 struct sk_buff * skb = alloc_skb(size, priority);
760 if (skb) { 774 if (skb) {
761 skb_set_owner_w(skb, sk); 775 skb_set_owner_w(skb, sk);
762 return skb; 776 return skb;
763 } 777 }
764 } 778 }
765 return NULL; 779 return NULL;
766 } 780 }
767 781
768 /* 782 /*
769 * Allocate a skb from the socket's receive buffer. 783 * Allocate a skb from the socket's receive buffer.
770 */ 784 */
771 struct sk_buff *sock_rmalloc(struct sock *sk, unsigned long size, int force, 785 struct sk_buff *sock_rmalloc(struct sock *sk, unsigned long size, int force,
772 unsigned int __nocast priority) 786 unsigned int __nocast priority)
773 { 787 {
774 if (force || atomic_read(&sk->sk_rmem_alloc) < sk->sk_rcvbuf) { 788 if (force || atomic_read(&sk->sk_rmem_alloc) < sk->sk_rcvbuf) {
775 struct sk_buff *skb = alloc_skb(size, priority); 789 struct sk_buff *skb = alloc_skb(size, priority);
776 if (skb) { 790 if (skb) {
777 skb_set_owner_r(skb, sk); 791 skb_set_owner_r(skb, sk);
778 return skb; 792 return skb;
779 } 793 }
780 } 794 }
781 return NULL; 795 return NULL;
782 } 796 }
783 797
784 /* 798 /*
785 * Allocate a memory block from the socket's option memory buffer. 799 * Allocate a memory block from the socket's option memory buffer.
786 */ 800 */
787 void *sock_kmalloc(struct sock *sk, int size, unsigned int __nocast priority) 801 void *sock_kmalloc(struct sock *sk, int size, unsigned int __nocast priority)
788 { 802 {
789 if ((unsigned)size <= sysctl_optmem_max && 803 if ((unsigned)size <= sysctl_optmem_max &&
790 atomic_read(&sk->sk_omem_alloc) + size < sysctl_optmem_max) { 804 atomic_read(&sk->sk_omem_alloc) + size < sysctl_optmem_max) {
791 void *mem; 805 void *mem;
792 /* First do the add, to avoid the race if kmalloc 806 /* First do the add, to avoid the race if kmalloc
793 * might sleep. 807 * might sleep.
794 */ 808 */
795 atomic_add(size, &sk->sk_omem_alloc); 809 atomic_add(size, &sk->sk_omem_alloc);
796 mem = kmalloc(size, priority); 810 mem = kmalloc(size, priority);
797 if (mem) 811 if (mem)
798 return mem; 812 return mem;
799 atomic_sub(size, &sk->sk_omem_alloc); 813 atomic_sub(size, &sk->sk_omem_alloc);
800 } 814 }
801 return NULL; 815 return NULL;
802 } 816 }
803 817
804 /* 818 /*
805 * Free an option memory block. 819 * Free an option memory block.
806 */ 820 */
807 void sock_kfree_s(struct sock *sk, void *mem, int size) 821 void sock_kfree_s(struct sock *sk, void *mem, int size)
808 { 822 {
809 kfree(mem); 823 kfree(mem);
810 atomic_sub(size, &sk->sk_omem_alloc); 824 atomic_sub(size, &sk->sk_omem_alloc);
811 } 825 }
812 826
813 /* It is almost wait_for_tcp_memory minus release_sock/lock_sock. 827 /* It is almost wait_for_tcp_memory minus release_sock/lock_sock.
814 I think, these locks should be removed for datagram sockets. 828 I think, these locks should be removed for datagram sockets.
815 */ 829 */
816 static long sock_wait_for_wmem(struct sock * sk, long timeo) 830 static long sock_wait_for_wmem(struct sock * sk, long timeo)
817 { 831 {
818 DEFINE_WAIT(wait); 832 DEFINE_WAIT(wait);
819 833
820 clear_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags); 834 clear_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags);
821 for (;;) { 835 for (;;) {
822 if (!timeo) 836 if (!timeo)
823 break; 837 break;
824 if (signal_pending(current)) 838 if (signal_pending(current))
825 break; 839 break;
826 set_bit(SOCK_NOSPACE, &sk->sk_socket->flags); 840 set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
827 prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); 841 prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
828 if (atomic_read(&sk->sk_wmem_alloc) < sk->sk_sndbuf) 842 if (atomic_read(&sk->sk_wmem_alloc) < sk->sk_sndbuf)
829 break; 843 break;
830 if (sk->sk_shutdown & SEND_SHUTDOWN) 844 if (sk->sk_shutdown & SEND_SHUTDOWN)
831 break; 845 break;
832 if (sk->sk_err) 846 if (sk->sk_err)
833 break; 847 break;
834 timeo = schedule_timeout(timeo); 848 timeo = schedule_timeout(timeo);
835 } 849 }
836 finish_wait(sk->sk_sleep, &wait); 850 finish_wait(sk->sk_sleep, &wait);
837 return timeo; 851 return timeo;
838 } 852 }
839 853
840 854
841 /* 855 /*
842 * Generic send/receive buffer handlers 856 * Generic send/receive buffer handlers
843 */ 857 */
844 858
845 static struct sk_buff *sock_alloc_send_pskb(struct sock *sk, 859 static struct sk_buff *sock_alloc_send_pskb(struct sock *sk,
846 unsigned long header_len, 860 unsigned long header_len,
847 unsigned long data_len, 861 unsigned long data_len,
848 int noblock, int *errcode) 862 int noblock, int *errcode)
849 { 863 {
850 struct sk_buff *skb; 864 struct sk_buff *skb;
851 unsigned int gfp_mask; 865 unsigned int gfp_mask;
852 long timeo; 866 long timeo;
853 int err; 867 int err;
854 868
855 gfp_mask = sk->sk_allocation; 869 gfp_mask = sk->sk_allocation;
856 if (gfp_mask & __GFP_WAIT) 870 if (gfp_mask & __GFP_WAIT)
857 gfp_mask |= __GFP_REPEAT; 871 gfp_mask |= __GFP_REPEAT;
858 872
859 timeo = sock_sndtimeo(sk, noblock); 873 timeo = sock_sndtimeo(sk, noblock);
860 while (1) { 874 while (1) {
861 err = sock_error(sk); 875 err = sock_error(sk);
862 if (err != 0) 876 if (err != 0)
863 goto failure; 877 goto failure;
864 878
865 err = -EPIPE; 879 err = -EPIPE;
866 if (sk->sk_shutdown & SEND_SHUTDOWN) 880 if (sk->sk_shutdown & SEND_SHUTDOWN)
867 goto failure; 881 goto failure;
868 882
869 if (atomic_read(&sk->sk_wmem_alloc) < sk->sk_sndbuf) { 883 if (atomic_read(&sk->sk_wmem_alloc) < sk->sk_sndbuf) {
870 skb = alloc_skb(header_len, sk->sk_allocation); 884 skb = alloc_skb(header_len, sk->sk_allocation);
871 if (skb) { 885 if (skb) {
872 int npages; 886 int npages;
873 int i; 887 int i;
874 888
875 /* No pages, we're done... */ 889 /* No pages, we're done... */
876 if (!data_len) 890 if (!data_len)
877 break; 891 break;
878 892
879 npages = (data_len + (PAGE_SIZE - 1)) >> PAGE_SHIFT; 893 npages = (data_len + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
880 skb->truesize += data_len; 894 skb->truesize += data_len;
881 skb_shinfo(skb)->nr_frags = npages; 895 skb_shinfo(skb)->nr_frags = npages;
882 for (i = 0; i < npages; i++) { 896 for (i = 0; i < npages; i++) {
883 struct page *page; 897 struct page *page;
884 skb_frag_t *frag; 898 skb_frag_t *frag;
885 899
886 page = alloc_pages(sk->sk_allocation, 0); 900 page = alloc_pages(sk->sk_allocation, 0);
887 if (!page) { 901 if (!page) {
888 err = -ENOBUFS; 902 err = -ENOBUFS;
889 skb_shinfo(skb)->nr_frags = i; 903 skb_shinfo(skb)->nr_frags = i;
890 kfree_skb(skb); 904 kfree_skb(skb);
891 goto failure; 905 goto failure;
892 } 906 }
893 907
894 frag = &skb_shinfo(skb)->frags[i]; 908 frag = &skb_shinfo(skb)->frags[i];
895 frag->page = page; 909 frag->page = page;
896 frag->page_offset = 0; 910 frag->page_offset = 0;
897 frag->size = (data_len >= PAGE_SIZE ? 911 frag->size = (data_len >= PAGE_SIZE ?
898 PAGE_SIZE : 912 PAGE_SIZE :
899 data_len); 913 data_len);
900 data_len -= PAGE_SIZE; 914 data_len -= PAGE_SIZE;
901 } 915 }
902 916
903 /* Full success... */ 917 /* Full success... */
904 break; 918 break;
905 } 919 }
906 err = -ENOBUFS; 920 err = -ENOBUFS;
907 goto failure; 921 goto failure;
908 } 922 }
909 set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags); 923 set_bit(SOCK_ASYNC_NOSPACE, &sk->sk_socket->flags);
910 set_bit(SOCK_NOSPACE, &sk->sk_socket->flags); 924 set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
911 err = -EAGAIN; 925 err = -EAGAIN;
912 if (!timeo) 926 if (!timeo)
913 goto failure; 927 goto failure;
914 if (signal_pending(current)) 928 if (signal_pending(current))
915 goto interrupted; 929 goto interrupted;
916 timeo = sock_wait_for_wmem(sk, timeo); 930 timeo = sock_wait_for_wmem(sk, timeo);
917 } 931 }
918 932
919 skb_set_owner_w(skb, sk); 933 skb_set_owner_w(skb, sk);
920 return skb; 934 return skb;
921 935
922 interrupted: 936 interrupted:
923 err = sock_intr_errno(timeo); 937 err = sock_intr_errno(timeo);
924 failure: 938 failure:
925 *errcode = err; 939 *errcode = err;
926 return NULL; 940 return NULL;
927 } 941 }
928 942
929 struct sk_buff *sock_alloc_send_skb(struct sock *sk, unsigned long size, 943 struct sk_buff *sock_alloc_send_skb(struct sock *sk, unsigned long size,
930 int noblock, int *errcode) 944 int noblock, int *errcode)
931 { 945 {
932 return sock_alloc_send_pskb(sk, size, 0, noblock, errcode); 946 return sock_alloc_send_pskb(sk, size, 0, noblock, errcode);
933 } 947 }
934 948
935 static void __lock_sock(struct sock *sk) 949 static void __lock_sock(struct sock *sk)
936 { 950 {
937 DEFINE_WAIT(wait); 951 DEFINE_WAIT(wait);
938 952
939 for(;;) { 953 for(;;) {
940 prepare_to_wait_exclusive(&sk->sk_lock.wq, &wait, 954 prepare_to_wait_exclusive(&sk->sk_lock.wq, &wait,
941 TASK_UNINTERRUPTIBLE); 955 TASK_UNINTERRUPTIBLE);
942 spin_unlock_bh(&sk->sk_lock.slock); 956 spin_unlock_bh(&sk->sk_lock.slock);
943 schedule(); 957 schedule();
944 spin_lock_bh(&sk->sk_lock.slock); 958 spin_lock_bh(&sk->sk_lock.slock);
945 if(!sock_owned_by_user(sk)) 959 if(!sock_owned_by_user(sk))
946 break; 960 break;
947 } 961 }
948 finish_wait(&sk->sk_lock.wq, &wait); 962 finish_wait(&sk->sk_lock.wq, &wait);
949 } 963 }
950 964
951 static void __release_sock(struct sock *sk) 965 static void __release_sock(struct sock *sk)
952 { 966 {
953 struct sk_buff *skb = sk->sk_backlog.head; 967 struct sk_buff *skb = sk->sk_backlog.head;
954 968
955 do { 969 do {
956 sk->sk_backlog.head = sk->sk_backlog.tail = NULL; 970 sk->sk_backlog.head = sk->sk_backlog.tail = NULL;
957 bh_unlock_sock(sk); 971 bh_unlock_sock(sk);
958 972
959 do { 973 do {
960 struct sk_buff *next = skb->next; 974 struct sk_buff *next = skb->next;
961 975
962 skb->next = NULL; 976 skb->next = NULL;
963 sk->sk_backlog_rcv(sk, skb); 977 sk->sk_backlog_rcv(sk, skb);
964 978
965 /* 979 /*
966 * We are in process context here with softirqs 980 * We are in process context here with softirqs
967 * disabled, use cond_resched_softirq() to preempt. 981 * disabled, use cond_resched_softirq() to preempt.
968 * This is safe to do because we've taken the backlog 982 * This is safe to do because we've taken the backlog
969 * queue private: 983 * queue private:
970 */ 984 */
971 cond_resched_softirq(); 985 cond_resched_softirq();
972 986
973 skb = next; 987 skb = next;
974 } while (skb != NULL); 988 } while (skb != NULL);
975 989
976 bh_lock_sock(sk); 990 bh_lock_sock(sk);
977 } while((skb = sk->sk_backlog.head) != NULL); 991 } while((skb = sk->sk_backlog.head) != NULL);
978 } 992 }
979 993
980 /** 994 /**
981 * sk_wait_data - wait for data to arrive at sk_receive_queue 995 * sk_wait_data - wait for data to arrive at sk_receive_queue
982 * @sk: sock to wait on 996 * @sk: sock to wait on
983 * @timeo: for how long 997 * @timeo: for how long
984 * 998 *
985 * Now socket state including sk->sk_err is changed only under lock, 999 * Now socket state including sk->sk_err is changed only under lock,
986 * hence we may omit checks after joining wait queue. 1000 * hence we may omit checks after joining wait queue.
987 * We check receive queue before schedule() only as optimization; 1001 * We check receive queue before schedule() only as optimization;
988 * it is very likely that release_sock() added new data. 1002 * it is very likely that release_sock() added new data.
989 */ 1003 */
990 int sk_wait_data(struct sock *sk, long *timeo) 1004 int sk_wait_data(struct sock *sk, long *timeo)
991 { 1005 {
992 int rc; 1006 int rc;
993 DEFINE_WAIT(wait); 1007 DEFINE_WAIT(wait);
994 1008
995 prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE); 1009 prepare_to_wait(sk->sk_sleep, &wait, TASK_INTERRUPTIBLE);
996 set_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags); 1010 set_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags);
997 rc = sk_wait_event(sk, timeo, !skb_queue_empty(&sk->sk_receive_queue)); 1011 rc = sk_wait_event(sk, timeo, !skb_queue_empty(&sk->sk_receive_queue));
998 clear_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags); 1012 clear_bit(SOCK_ASYNC_WAITDATA, &sk->sk_socket->flags);
999 finish_wait(sk->sk_sleep, &wait); 1013 finish_wait(sk->sk_sleep, &wait);
1000 return rc; 1014 return rc;
1001 } 1015 }
1002 1016
1003 EXPORT_SYMBOL(sk_wait_data); 1017 EXPORT_SYMBOL(sk_wait_data);
1004 1018
1005 /* 1019 /*
1006 * Set of default routines for initialising struct proto_ops when 1020 * Set of default routines for initialising struct proto_ops when
1007 * the protocol does not support a particular function. In certain 1021 * the protocol does not support a particular function. In certain
1008 * cases where it makes no sense for a protocol to have a "do nothing" 1022 * cases where it makes no sense for a protocol to have a "do nothing"
1009 * function, some default processing is provided. 1023 * function, some default processing is provided.
1010 */ 1024 */
1011 1025
1012 int sock_no_bind(struct socket *sock, struct sockaddr *saddr, int len) 1026 int sock_no_bind(struct socket *sock, struct sockaddr *saddr, int len)
1013 { 1027 {
1014 return -EOPNOTSUPP; 1028 return -EOPNOTSUPP;
1015 } 1029 }
1016 1030
1017 int sock_no_connect(struct socket *sock, struct sockaddr *saddr, 1031 int sock_no_connect(struct socket *sock, struct sockaddr *saddr,
1018 int len, int flags) 1032 int len, int flags)
1019 { 1033 {
1020 return -EOPNOTSUPP; 1034 return -EOPNOTSUPP;
1021 } 1035 }
1022 1036
1023 int sock_no_socketpair(struct socket *sock1, struct socket *sock2) 1037 int sock_no_socketpair(struct socket *sock1, struct socket *sock2)
1024 { 1038 {
1025 return -EOPNOTSUPP; 1039 return -EOPNOTSUPP;
1026 } 1040 }
1027 1041
1028 int sock_no_accept(struct socket *sock, struct socket *newsock, int flags) 1042 int sock_no_accept(struct socket *sock, struct socket *newsock, int flags)
1029 { 1043 {
1030 return -EOPNOTSUPP; 1044 return -EOPNOTSUPP;
1031 } 1045 }
1032 1046
1033 int sock_no_getname(struct socket *sock, struct sockaddr *saddr, 1047 int sock_no_getname(struct socket *sock, struct sockaddr *saddr,
1034 int *len, int peer) 1048 int *len, int peer)
1035 { 1049 {
1036 return -EOPNOTSUPP; 1050 return -EOPNOTSUPP;
1037 } 1051 }
1038 1052
1039 unsigned int sock_no_poll(struct file * file, struct socket *sock, poll_table *pt) 1053 unsigned int sock_no_poll(struct file * file, struct socket *sock, poll_table *pt)
1040 { 1054 {
1041 return 0; 1055 return 0;
1042 } 1056 }
1043 1057
1044 int sock_no_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) 1058 int sock_no_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
1045 { 1059 {
1046 return -EOPNOTSUPP; 1060 return -EOPNOTSUPP;
1047 } 1061 }
1048 1062
1049 int sock_no_listen(struct socket *sock, int backlog) 1063 int sock_no_listen(struct socket *sock, int backlog)
1050 { 1064 {
1051 return -EOPNOTSUPP; 1065 return -EOPNOTSUPP;
1052 } 1066 }
1053 1067
1054 int sock_no_shutdown(struct socket *sock, int how) 1068 int sock_no_shutdown(struct socket *sock, int how)
1055 { 1069 {
1056 return -EOPNOTSUPP; 1070 return -EOPNOTSUPP;
1057 } 1071 }
1058 1072
1059 int sock_no_setsockopt(struct socket *sock, int level, int optname, 1073 int sock_no_setsockopt(struct socket *sock, int level, int optname,
1060 char __user *optval, int optlen) 1074 char __user *optval, int optlen)
1061 { 1075 {
1062 return -EOPNOTSUPP; 1076 return -EOPNOTSUPP;
1063 } 1077 }
1064 1078
1065 int sock_no_getsockopt(struct socket *sock, int level, int optname, 1079 int sock_no_getsockopt(struct socket *sock, int level, int optname,
1066 char __user *optval, int __user *optlen) 1080 char __user *optval, int __user *optlen)
1067 { 1081 {
1068 return -EOPNOTSUPP; 1082 return -EOPNOTSUPP;
1069 } 1083 }
1070 1084
1071 int sock_no_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *m, 1085 int sock_no_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *m,
1072 size_t len) 1086 size_t len)
1073 { 1087 {
1074 return -EOPNOTSUPP; 1088 return -EOPNOTSUPP;
1075 } 1089 }
1076 1090
1077 int sock_no_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *m, 1091 int sock_no_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *m,
1078 size_t len, int flags) 1092 size_t len, int flags)
1079 { 1093 {
1080 return -EOPNOTSUPP; 1094 return -EOPNOTSUPP;
1081 } 1095 }
1082 1096
1083 int sock_no_mmap(struct file *file, struct socket *sock, struct vm_area_struct *vma) 1097 int sock_no_mmap(struct file *file, struct socket *sock, struct vm_area_struct *vma)
1084 { 1098 {
1085 /* Mirror missing mmap method error code */ 1099 /* Mirror missing mmap method error code */
1086 return -ENODEV; 1100 return -ENODEV;
1087 } 1101 }
1088 1102
1089 ssize_t sock_no_sendpage(struct socket *sock, struct page *page, int offset, size_t size, int flags) 1103 ssize_t sock_no_sendpage(struct socket *sock, struct page *page, int offset, size_t size, int flags)
1090 { 1104 {
1091 ssize_t res; 1105 ssize_t res;
1092 struct msghdr msg = {.msg_flags = flags}; 1106 struct msghdr msg = {.msg_flags = flags};
1093 struct kvec iov; 1107 struct kvec iov;
1094 char *kaddr = kmap(page); 1108 char *kaddr = kmap(page);
1095 iov.iov_base = kaddr + offset; 1109 iov.iov_base = kaddr + offset;
1096 iov.iov_len = size; 1110 iov.iov_len = size;
1097 res = kernel_sendmsg(sock, &msg, &iov, 1, size); 1111 res = kernel_sendmsg(sock, &msg, &iov, 1, size);
1098 kunmap(page); 1112 kunmap(page);
1099 return res; 1113 return res;
1100 } 1114 }
1101 1115
1102 /* 1116 /*
1103 * Default Socket Callbacks 1117 * Default Socket Callbacks
1104 */ 1118 */
1105 1119
1106 static void sock_def_wakeup(struct sock *sk) 1120 static void sock_def_wakeup(struct sock *sk)
1107 { 1121 {
1108 read_lock(&sk->sk_callback_lock); 1122 read_lock(&sk->sk_callback_lock);
1109 if (sk->sk_sleep && waitqueue_active(sk->sk_sleep)) 1123 if (sk->sk_sleep && waitqueue_active(sk->sk_sleep))
1110 wake_up_interruptible_all(sk->sk_sleep); 1124 wake_up_interruptible_all(sk->sk_sleep);
1111 read_unlock(&sk->sk_callback_lock); 1125 read_unlock(&sk->sk_callback_lock);
1112 } 1126 }
1113 1127
1114 static void sock_def_error_report(struct sock *sk) 1128 static void sock_def_error_report(struct sock *sk)
1115 { 1129 {
1116 read_lock(&sk->sk_callback_lock); 1130 read_lock(&sk->sk_callback_lock);
1117 if (sk->sk_sleep && waitqueue_active(sk->sk_sleep)) 1131 if (sk->sk_sleep && waitqueue_active(sk->sk_sleep))
1118 wake_up_interruptible(sk->sk_sleep); 1132 wake_up_interruptible(sk->sk_sleep);
1119 sk_wake_async(sk,0,POLL_ERR); 1133 sk_wake_async(sk,0,POLL_ERR);
1120 read_unlock(&sk->sk_callback_lock); 1134 read_unlock(&sk->sk_callback_lock);
1121 } 1135 }
1122 1136
1123 static void sock_def_readable(struct sock *sk, int len) 1137 static void sock_def_readable(struct sock *sk, int len)
1124 { 1138 {
1125 read_lock(&sk->sk_callback_lock); 1139 read_lock(&sk->sk_callback_lock);
1126 if (sk->sk_sleep && waitqueue_active(sk->sk_sleep)) 1140 if (sk->sk_sleep && waitqueue_active(sk->sk_sleep))
1127 wake_up_interruptible(sk->sk_sleep); 1141 wake_up_interruptible(sk->sk_sleep);
1128 sk_wake_async(sk,1,POLL_IN); 1142 sk_wake_async(sk,1,POLL_IN);
1129 read_unlock(&sk->sk_callback_lock); 1143 read_unlock(&sk->sk_callback_lock);
1130 } 1144 }
1131 1145
1132 static void sock_def_write_space(struct sock *sk) 1146 static void sock_def_write_space(struct sock *sk)
1133 { 1147 {
1134 read_lock(&sk->sk_callback_lock); 1148 read_lock(&sk->sk_callback_lock);
1135 1149
1136 /* Do not wake up a writer until he can make "significant" 1150 /* Do not wake up a writer until he can make "significant"
1137 * progress. --DaveM 1151 * progress. --DaveM
1138 */ 1152 */
1139 if((atomic_read(&sk->sk_wmem_alloc) << 1) <= sk->sk_sndbuf) { 1153 if((atomic_read(&sk->sk_wmem_alloc) << 1) <= sk->sk_sndbuf) {
1140 if (sk->sk_sleep && waitqueue_active(sk->sk_sleep)) 1154 if (sk->sk_sleep && waitqueue_active(sk->sk_sleep))
1141 wake_up_interruptible(sk->sk_sleep); 1155 wake_up_interruptible(sk->sk_sleep);
1142 1156
1143 /* Should agree with poll, otherwise some programs break */ 1157 /* Should agree with poll, otherwise some programs break */
1144 if (sock_writeable(sk)) 1158 if (sock_writeable(sk))
1145 sk_wake_async(sk, 2, POLL_OUT); 1159 sk_wake_async(sk, 2, POLL_OUT);
1146 } 1160 }
1147 1161
1148 read_unlock(&sk->sk_callback_lock); 1162 read_unlock(&sk->sk_callback_lock);
1149 } 1163 }
1150 1164
1151 static void sock_def_destruct(struct sock *sk) 1165 static void sock_def_destruct(struct sock *sk)
1152 { 1166 {
1153 if (sk->sk_protinfo) 1167 if (sk->sk_protinfo)
1154 kfree(sk->sk_protinfo); 1168 kfree(sk->sk_protinfo);
1155 } 1169 }
1156 1170
1157 void sk_send_sigurg(struct sock *sk) 1171 void sk_send_sigurg(struct sock *sk)
1158 { 1172 {
1159 if (sk->sk_socket && sk->sk_socket->file) 1173 if (sk->sk_socket && sk->sk_socket->file)
1160 if (send_sigurg(&sk->sk_socket->file->f_owner)) 1174 if (send_sigurg(&sk->sk_socket->file->f_owner))
1161 sk_wake_async(sk, 3, POLL_PRI); 1175 sk_wake_async(sk, 3, POLL_PRI);
1162 } 1176 }
1163 1177
1164 void sk_reset_timer(struct sock *sk, struct timer_list* timer, 1178 void sk_reset_timer(struct sock *sk, struct timer_list* timer,
1165 unsigned long expires) 1179 unsigned long expires)
1166 { 1180 {
1167 if (!mod_timer(timer, expires)) 1181 if (!mod_timer(timer, expires))
1168 sock_hold(sk); 1182 sock_hold(sk);
1169 } 1183 }
1170 1184
1171 EXPORT_SYMBOL(sk_reset_timer); 1185 EXPORT_SYMBOL(sk_reset_timer);
1172 1186
1173 void sk_stop_timer(struct sock *sk, struct timer_list* timer) 1187 void sk_stop_timer(struct sock *sk, struct timer_list* timer)
1174 { 1188 {
1175 if (timer_pending(timer) && del_timer(timer)) 1189 if (timer_pending(timer) && del_timer(timer))
1176 __sock_put(sk); 1190 __sock_put(sk);
1177 } 1191 }
1178 1192
1179 EXPORT_SYMBOL(sk_stop_timer); 1193 EXPORT_SYMBOL(sk_stop_timer);
1180 1194
1181 void sock_init_data(struct socket *sock, struct sock *sk) 1195 void sock_init_data(struct socket *sock, struct sock *sk)
1182 { 1196 {
1183 skb_queue_head_init(&sk->sk_receive_queue); 1197 skb_queue_head_init(&sk->sk_receive_queue);
1184 skb_queue_head_init(&sk->sk_write_queue); 1198 skb_queue_head_init(&sk->sk_write_queue);
1185 skb_queue_head_init(&sk->sk_error_queue); 1199 skb_queue_head_init(&sk->sk_error_queue);
1186 1200
1187 sk->sk_send_head = NULL; 1201 sk->sk_send_head = NULL;
1188 1202
1189 init_timer(&sk->sk_timer); 1203 init_timer(&sk->sk_timer);
1190 1204
1191 sk->sk_allocation = GFP_KERNEL; 1205 sk->sk_allocation = GFP_KERNEL;
1192 sk->sk_rcvbuf = sysctl_rmem_default; 1206 sk->sk_rcvbuf = sysctl_rmem_default;
1193 sk->sk_sndbuf = sysctl_wmem_default; 1207 sk->sk_sndbuf = sysctl_wmem_default;
1194 sk->sk_state = TCP_CLOSE; 1208 sk->sk_state = TCP_CLOSE;
1195 sk->sk_socket = sock; 1209 sk->sk_socket = sock;
1196 1210
1197 sock_set_flag(sk, SOCK_ZAPPED); 1211 sock_set_flag(sk, SOCK_ZAPPED);
1198 1212
1199 if(sock) 1213 if(sock)
1200 { 1214 {
1201 sk->sk_type = sock->type; 1215 sk->sk_type = sock->type;
1202 sk->sk_sleep = &sock->wait; 1216 sk->sk_sleep = &sock->wait;
1203 sock->sk = sk; 1217 sock->sk = sk;
1204 } else 1218 } else
1205 sk->sk_sleep = NULL; 1219 sk->sk_sleep = NULL;
1206 1220
1207 rwlock_init(&sk->sk_dst_lock); 1221 rwlock_init(&sk->sk_dst_lock);
1208 rwlock_init(&sk->sk_callback_lock); 1222 rwlock_init(&sk->sk_callback_lock);
1209 1223
1210 sk->sk_state_change = sock_def_wakeup; 1224 sk->sk_state_change = sock_def_wakeup;
1211 sk->sk_data_ready = sock_def_readable; 1225 sk->sk_data_ready = sock_def_readable;
1212 sk->sk_write_space = sock_def_write_space; 1226 sk->sk_write_space = sock_def_write_space;
1213 sk->sk_error_report = sock_def_error_report; 1227 sk->sk_error_report = sock_def_error_report;
1214 sk->sk_destruct = sock_def_destruct; 1228 sk->sk_destruct = sock_def_destruct;
1215 1229
1216 sk->sk_sndmsg_page = NULL; 1230 sk->sk_sndmsg_page = NULL;
1217 sk->sk_sndmsg_off = 0; 1231 sk->sk_sndmsg_off = 0;
1218 1232
1219 sk->sk_peercred.pid = 0; 1233 sk->sk_peercred.pid = 0;
1220 sk->sk_peercred.uid = -1; 1234 sk->sk_peercred.uid = -1;
1221 sk->sk_peercred.gid = -1; 1235 sk->sk_peercred.gid = -1;
1222 sk->sk_write_pending = 0; 1236 sk->sk_write_pending = 0;
1223 sk->sk_rcvlowat = 1; 1237 sk->sk_rcvlowat = 1;
1224 sk->sk_rcvtimeo = MAX_SCHEDULE_TIMEOUT; 1238 sk->sk_rcvtimeo = MAX_SCHEDULE_TIMEOUT;
1225 sk->sk_sndtimeo = MAX_SCHEDULE_TIMEOUT; 1239 sk->sk_sndtimeo = MAX_SCHEDULE_TIMEOUT;
1226 1240
1227 sk->sk_stamp.tv_sec = -1L; 1241 sk->sk_stamp.tv_sec = -1L;
1228 sk->sk_stamp.tv_usec = -1L; 1242 sk->sk_stamp.tv_usec = -1L;
1229 1243
1230 atomic_set(&sk->sk_refcnt, 1); 1244 atomic_set(&sk->sk_refcnt, 1);
1231 } 1245 }
1232 1246
1233 void fastcall lock_sock(struct sock *sk) 1247 void fastcall lock_sock(struct sock *sk)
1234 { 1248 {
1235 might_sleep(); 1249 might_sleep();
1236 spin_lock_bh(&(sk->sk_lock.slock)); 1250 spin_lock_bh(&(sk->sk_lock.slock));
1237 if (sk->sk_lock.owner) 1251 if (sk->sk_lock.owner)
1238 __lock_sock(sk); 1252 __lock_sock(sk);
1239 sk->sk_lock.owner = (void *)1; 1253 sk->sk_lock.owner = (void *)1;
1240 spin_unlock_bh(&(sk->sk_lock.slock)); 1254 spin_unlock_bh(&(sk->sk_lock.slock));
1241 } 1255 }
1242 1256
1243 EXPORT_SYMBOL(lock_sock); 1257 EXPORT_SYMBOL(lock_sock);
1244 1258
1245 void fastcall release_sock(struct sock *sk) 1259 void fastcall release_sock(struct sock *sk)
1246 { 1260 {
1247 spin_lock_bh(&(sk->sk_lock.slock)); 1261 spin_lock_bh(&(sk->sk_lock.slock));
1248 if (sk->sk_backlog.tail) 1262 if (sk->sk_backlog.tail)
1249 __release_sock(sk); 1263 __release_sock(sk);
1250 sk->sk_lock.owner = NULL; 1264 sk->sk_lock.owner = NULL;
1251 if (waitqueue_active(&(sk->sk_lock.wq))) 1265 if (waitqueue_active(&(sk->sk_lock.wq)))
1252 wake_up(&(sk->sk_lock.wq)); 1266 wake_up(&(sk->sk_lock.wq));
1253 spin_unlock_bh(&(sk->sk_lock.slock)); 1267 spin_unlock_bh(&(sk->sk_lock.slock));
1254 } 1268 }
1255 EXPORT_SYMBOL(release_sock); 1269 EXPORT_SYMBOL(release_sock);
1256 1270
1257 int sock_get_timestamp(struct sock *sk, struct timeval __user *userstamp) 1271 int sock_get_timestamp(struct sock *sk, struct timeval __user *userstamp)
1258 { 1272 {
1259 if (!sock_flag(sk, SOCK_TIMESTAMP)) 1273 if (!sock_flag(sk, SOCK_TIMESTAMP))
1260 sock_enable_timestamp(sk); 1274 sock_enable_timestamp(sk);
1261 if (sk->sk_stamp.tv_sec == -1) 1275 if (sk->sk_stamp.tv_sec == -1)
1262 return -ENOENT; 1276 return -ENOENT;
1263 if (sk->sk_stamp.tv_sec == 0) 1277 if (sk->sk_stamp.tv_sec == 0)
1264 do_gettimeofday(&sk->sk_stamp); 1278 do_gettimeofday(&sk->sk_stamp);
1265 return copy_to_user(userstamp, &sk->sk_stamp, sizeof(struct timeval)) ? 1279 return copy_to_user(userstamp, &sk->sk_stamp, sizeof(struct timeval)) ?
1266 -EFAULT : 0; 1280 -EFAULT : 0;
1267 } 1281 }
1268 EXPORT_SYMBOL(sock_get_timestamp); 1282 EXPORT_SYMBOL(sock_get_timestamp);
1269 1283
1270 void sock_enable_timestamp(struct sock *sk) 1284 void sock_enable_timestamp(struct sock *sk)
1271 { 1285 {
1272 if (!sock_flag(sk, SOCK_TIMESTAMP)) { 1286 if (!sock_flag(sk, SOCK_TIMESTAMP)) {
1273 sock_set_flag(sk, SOCK_TIMESTAMP); 1287 sock_set_flag(sk, SOCK_TIMESTAMP);
1274 net_enable_timestamp(); 1288 net_enable_timestamp();
1275 } 1289 }
1276 } 1290 }
1277 EXPORT_SYMBOL(sock_enable_timestamp); 1291 EXPORT_SYMBOL(sock_enable_timestamp);
1278 1292
1279 /* 1293 /*
1280 * Get a socket option on an socket. 1294 * Get a socket option on an socket.
1281 * 1295 *
1282 * FIX: POSIX 1003.1g is very ambiguous here. It states that 1296 * FIX: POSIX 1003.1g is very ambiguous here. It states that
1283 * asynchronous errors should be reported by getsockopt. We assume 1297 * asynchronous errors should be reported by getsockopt. We assume
1284 * this means if you specify SO_ERROR (otherwise whats the point of it). 1298 * this means if you specify SO_ERROR (otherwise whats the point of it).
1285 */ 1299 */
1286 int sock_common_getsockopt(struct socket *sock, int level, int optname, 1300 int sock_common_getsockopt(struct socket *sock, int level, int optname,
1287 char __user *optval, int __user *optlen) 1301 char __user *optval, int __user *optlen)
1288 { 1302 {
1289 struct sock *sk = sock->sk; 1303 struct sock *sk = sock->sk;
1290 1304
1291 return sk->sk_prot->getsockopt(sk, level, optname, optval, optlen); 1305 return sk->sk_prot->getsockopt(sk, level, optname, optval, optlen);
1292 } 1306 }
1293 1307
1294 EXPORT_SYMBOL(sock_common_getsockopt); 1308 EXPORT_SYMBOL(sock_common_getsockopt);
1295 1309
1296 int sock_common_recvmsg(struct kiocb *iocb, struct socket *sock, 1310 int sock_common_recvmsg(struct kiocb *iocb, struct socket *sock,
1297 struct msghdr *msg, size_t size, int flags) 1311 struct msghdr *msg, size_t size, int flags)
1298 { 1312 {
1299 struct sock *sk = sock->sk; 1313 struct sock *sk = sock->sk;
1300 int addr_len = 0; 1314 int addr_len = 0;
1301 int err; 1315 int err;
1302 1316
1303 err = sk->sk_prot->recvmsg(iocb, sk, msg, size, flags & MSG_DONTWAIT, 1317 err = sk->sk_prot->recvmsg(iocb, sk, msg, size, flags & MSG_DONTWAIT,
1304 flags & ~MSG_DONTWAIT, &addr_len); 1318 flags & ~MSG_DONTWAIT, &addr_len);
1305 if (err >= 0) 1319 if (err >= 0)
1306 msg->msg_namelen = addr_len; 1320 msg->msg_namelen = addr_len;
1307 return err; 1321 return err;
1308 } 1322 }
1309 1323
1310 EXPORT_SYMBOL(sock_common_recvmsg); 1324 EXPORT_SYMBOL(sock_common_recvmsg);
1311 1325
1312 /* 1326 /*
1313 * Set socket options on an inet socket. 1327 * Set socket options on an inet socket.
1314 */ 1328 */
1315 int sock_common_setsockopt(struct socket *sock, int level, int optname, 1329 int sock_common_setsockopt(struct socket *sock, int level, int optname,
1316 char __user *optval, int optlen) 1330 char __user *optval, int optlen)
1317 { 1331 {
1318 struct sock *sk = sock->sk; 1332 struct sock *sk = sock->sk;
1319 1333
1320 return sk->sk_prot->setsockopt(sk, level, optname, optval, optlen); 1334 return sk->sk_prot->setsockopt(sk, level, optname, optval, optlen);
1321 } 1335 }
1322 1336
1323 EXPORT_SYMBOL(sock_common_setsockopt); 1337 EXPORT_SYMBOL(sock_common_setsockopt);
1324 1338
1325 void sk_common_release(struct sock *sk) 1339 void sk_common_release(struct sock *sk)
1326 { 1340 {
1327 if (sk->sk_prot->destroy) 1341 if (sk->sk_prot->destroy)
1328 sk->sk_prot->destroy(sk); 1342 sk->sk_prot->destroy(sk);
1329 1343
1330 /* 1344 /*
1331 * Observation: when sock_common_release is called, processes have 1345 * Observation: when sock_common_release is called, processes have
1332 * no access to socket. But net still has. 1346 * no access to socket. But net still has.
1333 * Step one, detach it from networking: 1347 * Step one, detach it from networking:
1334 * 1348 *
1335 * A. Remove from hash tables. 1349 * A. Remove from hash tables.
1336 */ 1350 */
1337 1351
1338 sk->sk_prot->unhash(sk); 1352 sk->sk_prot->unhash(sk);
1339 1353
1340 /* 1354 /*
1341 * In this point socket cannot receive new packets, but it is possible 1355 * In this point socket cannot receive new packets, but it is possible
1342 * that some packets are in flight because some CPU runs receiver and 1356 * that some packets are in flight because some CPU runs receiver and
1343 * did hash table lookup before we unhashed socket. They will achieve 1357 * did hash table lookup before we unhashed socket. They will achieve
1344 * receive queue and will be purged by socket destructor. 1358 * receive queue and will be purged by socket destructor.
1345 * 1359 *
1346 * Also we still have packets pending on receive queue and probably, 1360 * Also we still have packets pending on receive queue and probably,
1347 * our own packets waiting in device queues. sock_destroy will drain 1361 * our own packets waiting in device queues. sock_destroy will drain
1348 * receive queue, but transmitted packets will delay socket destruction 1362 * receive queue, but transmitted packets will delay socket destruction
1349 * until the last reference will be released. 1363 * until the last reference will be released.
1350 */ 1364 */
1351 1365
1352 sock_orphan(sk); 1366 sock_orphan(sk);
1353 1367
1354 xfrm_sk_free_policy(sk); 1368 xfrm_sk_free_policy(sk);
1355 1369
1356 #ifdef INET_REFCNT_DEBUG 1370 #ifdef INET_REFCNT_DEBUG
1357 if (atomic_read(&sk->sk_refcnt) != 1) 1371 if (atomic_read(&sk->sk_refcnt) != 1)
1358 printk(KERN_DEBUG "Destruction of the socket %p delayed, c=%d\n", 1372 printk(KERN_DEBUG "Destruction of the socket %p delayed, c=%d\n",
1359 sk, atomic_read(&sk->sk_refcnt)); 1373 sk, atomic_read(&sk->sk_refcnt));
1360 #endif 1374 #endif
1361 sock_put(sk); 1375 sock_put(sk);
1362 } 1376 }
1363 1377
1364 EXPORT_SYMBOL(sk_common_release); 1378 EXPORT_SYMBOL(sk_common_release);
1365 1379
1366 static DEFINE_RWLOCK(proto_list_lock); 1380 static DEFINE_RWLOCK(proto_list_lock);
1367 static LIST_HEAD(proto_list); 1381 static LIST_HEAD(proto_list);
1368 1382
1369 int proto_register(struct proto *prot, int alloc_slab) 1383 int proto_register(struct proto *prot, int alloc_slab)
1370 { 1384 {
1371 char *request_sock_slab_name; 1385 char *request_sock_slab_name;
1372 int rc = -ENOBUFS; 1386 int rc = -ENOBUFS;
1373 1387
1374 if (alloc_slab) { 1388 if (alloc_slab) {
1375 prot->slab = kmem_cache_create(prot->name, prot->obj_size, 0, 1389 prot->slab = kmem_cache_create(prot->name, prot->obj_size, 0,
1376 SLAB_HWCACHE_ALIGN, NULL, NULL); 1390 SLAB_HWCACHE_ALIGN, NULL, NULL);
1377 1391
1378 if (prot->slab == NULL) { 1392 if (prot->slab == NULL) {
1379 printk(KERN_CRIT "%s: Can't create sock SLAB cache!\n", 1393 printk(KERN_CRIT "%s: Can't create sock SLAB cache!\n",
1380 prot->name); 1394 prot->name);
1381 goto out; 1395 goto out;
1382 } 1396 }
1383 1397
1384 if (prot->rsk_prot != NULL) { 1398 if (prot->rsk_prot != NULL) {
1385 static const char mask[] = "request_sock_%s"; 1399 static const char mask[] = "request_sock_%s";
1386 1400
1387 request_sock_slab_name = kmalloc(strlen(prot->name) + sizeof(mask) - 1, GFP_KERNEL); 1401 request_sock_slab_name = kmalloc(strlen(prot->name) + sizeof(mask) - 1, GFP_KERNEL);
1388 if (request_sock_slab_name == NULL) 1402 if (request_sock_slab_name == NULL)
1389 goto out_free_sock_slab; 1403 goto out_free_sock_slab;
1390 1404
1391 sprintf(request_sock_slab_name, mask, prot->name); 1405 sprintf(request_sock_slab_name, mask, prot->name);
1392 prot->rsk_prot->slab = kmem_cache_create(request_sock_slab_name, 1406 prot->rsk_prot->slab = kmem_cache_create(request_sock_slab_name,
1393 prot->rsk_prot->obj_size, 0, 1407 prot->rsk_prot->obj_size, 0,
1394 SLAB_HWCACHE_ALIGN, NULL, NULL); 1408 SLAB_HWCACHE_ALIGN, NULL, NULL);
1395 1409
1396 if (prot->rsk_prot->slab == NULL) { 1410 if (prot->rsk_prot->slab == NULL) {
1397 printk(KERN_CRIT "%s: Can't create request sock SLAB cache!\n", 1411 printk(KERN_CRIT "%s: Can't create request sock SLAB cache!\n",
1398 prot->name); 1412 prot->name);
1399 goto out_free_request_sock_slab_name; 1413 goto out_free_request_sock_slab_name;
1400 } 1414 }
1401 } 1415 }
1402 } 1416 }
1403 1417
1404 write_lock(&proto_list_lock); 1418 write_lock(&proto_list_lock);
1405 list_add(&prot->node, &proto_list); 1419 list_add(&prot->node, &proto_list);
1406 write_unlock(&proto_list_lock); 1420 write_unlock(&proto_list_lock);
1407 rc = 0; 1421 rc = 0;
1408 out: 1422 out:
1409 return rc; 1423 return rc;
1410 out_free_request_sock_slab_name: 1424 out_free_request_sock_slab_name:
1411 kfree(request_sock_slab_name); 1425 kfree(request_sock_slab_name);
1412 out_free_sock_slab: 1426 out_free_sock_slab:
1413 kmem_cache_destroy(prot->slab); 1427 kmem_cache_destroy(prot->slab);
1414 prot->slab = NULL; 1428 prot->slab = NULL;
1415 goto out; 1429 goto out;
1416 } 1430 }
1417 1431
1418 EXPORT_SYMBOL(proto_register); 1432 EXPORT_SYMBOL(proto_register);
1419 1433
1420 void proto_unregister(struct proto *prot) 1434 void proto_unregister(struct proto *prot)
1421 { 1435 {
1422 write_lock(&proto_list_lock); 1436 write_lock(&proto_list_lock);
1423 1437
1424 if (prot->slab != NULL) { 1438 if (prot->slab != NULL) {
1425 kmem_cache_destroy(prot->slab); 1439 kmem_cache_destroy(prot->slab);
1426 prot->slab = NULL; 1440 prot->slab = NULL;
1427 } 1441 }
1428 1442
1429 if (prot->rsk_prot != NULL && prot->rsk_prot->slab != NULL) { 1443 if (prot->rsk_prot != NULL && prot->rsk_prot->slab != NULL) {
1430 const char *name = kmem_cache_name(prot->rsk_prot->slab); 1444 const char *name = kmem_cache_name(prot->rsk_prot->slab);
1431 1445
1432 kmem_cache_destroy(prot->rsk_prot->slab); 1446 kmem_cache_destroy(prot->rsk_prot->slab);
1433 kfree(name); 1447 kfree(name);
1434 prot->rsk_prot->slab = NULL; 1448 prot->rsk_prot->slab = NULL;
1435 } 1449 }
1436 1450
1437 list_del(&prot->node); 1451 list_del(&prot->node);
1438 write_unlock(&proto_list_lock); 1452 write_unlock(&proto_list_lock);
1439 } 1453 }
1440 1454
1441 EXPORT_SYMBOL(proto_unregister); 1455 EXPORT_SYMBOL(proto_unregister);
1442 1456
1443 #ifdef CONFIG_PROC_FS 1457 #ifdef CONFIG_PROC_FS
1444 static inline struct proto *__proto_head(void) 1458 static inline struct proto *__proto_head(void)
1445 { 1459 {
1446 return list_entry(proto_list.next, struct proto, node); 1460 return list_entry(proto_list.next, struct proto, node);
1447 } 1461 }
1448 1462
1449 static inline struct proto *proto_head(void) 1463 static inline struct proto *proto_head(void)
1450 { 1464 {
1451 return list_empty(&proto_list) ? NULL : __proto_head(); 1465 return list_empty(&proto_list) ? NULL : __proto_head();
1452 } 1466 }
1453 1467
1454 static inline struct proto *proto_next(struct proto *proto) 1468 static inline struct proto *proto_next(struct proto *proto)
1455 { 1469 {
1456 return proto->node.next == &proto_list ? NULL : 1470 return proto->node.next == &proto_list ? NULL :
1457 list_entry(proto->node.next, struct proto, node); 1471 list_entry(proto->node.next, struct proto, node);
1458 } 1472 }
1459 1473
1460 static inline struct proto *proto_get_idx(loff_t pos) 1474 static inline struct proto *proto_get_idx(loff_t pos)
1461 { 1475 {
1462 struct proto *proto; 1476 struct proto *proto;
1463 loff_t i = 0; 1477 loff_t i = 0;
1464 1478
1465 list_for_each_entry(proto, &proto_list, node) 1479 list_for_each_entry(proto, &proto_list, node)
1466 if (i++ == pos) 1480 if (i++ == pos)
1467 goto out; 1481 goto out;
1468 1482
1469 proto = NULL; 1483 proto = NULL;
1470 out: 1484 out:
1471 return proto; 1485 return proto;
1472 } 1486 }
1473 1487
1474 static void *proto_seq_start(struct seq_file *seq, loff_t *pos) 1488 static void *proto_seq_start(struct seq_file *seq, loff_t *pos)
1475 { 1489 {
1476 read_lock(&proto_list_lock); 1490 read_lock(&proto_list_lock);
1477 return *pos ? proto_get_idx(*pos - 1) : SEQ_START_TOKEN; 1491 return *pos ? proto_get_idx(*pos - 1) : SEQ_START_TOKEN;
1478 } 1492 }
1479 1493
1480 static void *proto_seq_next(struct seq_file *seq, void *v, loff_t *pos) 1494 static void *proto_seq_next(struct seq_file *seq, void *v, loff_t *pos)
1481 { 1495 {
1482 ++*pos; 1496 ++*pos;
1483 return v == SEQ_START_TOKEN ? proto_head() : proto_next(v); 1497 return v == SEQ_START_TOKEN ? proto_head() : proto_next(v);
1484 } 1498 }
1485 1499
1486 static void proto_seq_stop(struct seq_file *seq, void *v) 1500 static void proto_seq_stop(struct seq_file *seq, void *v)
1487 { 1501 {
1488 read_unlock(&proto_list_lock); 1502 read_unlock(&proto_list_lock);
1489 } 1503 }
1490 1504
1491 static char proto_method_implemented(const void *method) 1505 static char proto_method_implemented(const void *method)
1492 { 1506 {
1493 return method == NULL ? 'n' : 'y'; 1507 return method == NULL ? 'n' : 'y';
1494 } 1508 }
1495 1509
1496 static void proto_seq_printf(struct seq_file *seq, struct proto *proto) 1510 static void proto_seq_printf(struct seq_file *seq, struct proto *proto)
1497 { 1511 {
1498 seq_printf(seq, "%-9s %4u %6d %6d %-3s %6u %-3s %-10s " 1512 seq_printf(seq, "%-9s %4u %6d %6d %-3s %6u %-3s %-10s "
1499 "%2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c\n", 1513 "%2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c\n",
1500 proto->name, 1514 proto->name,
1501 proto->obj_size, 1515 proto->obj_size,
1502 proto->sockets_allocated != NULL ? atomic_read(proto->sockets_allocated) : -1, 1516 proto->sockets_allocated != NULL ? atomic_read(proto->sockets_allocated) : -1,
1503 proto->memory_allocated != NULL ? atomic_read(proto->memory_allocated) : -1, 1517 proto->memory_allocated != NULL ? atomic_read(proto->memory_allocated) : -1,
1504 proto->memory_pressure != NULL ? *proto->memory_pressure ? "yes" : "no" : "NI", 1518 proto->memory_pressure != NULL ? *proto->memory_pressure ? "yes" : "no" : "NI",
1505 proto->max_header, 1519 proto->max_header,
1506 proto->slab == NULL ? "no" : "yes", 1520 proto->slab == NULL ? "no" : "yes",
1507 module_name(proto->owner), 1521 module_name(proto->owner),
1508 proto_method_implemented(proto->close), 1522 proto_method_implemented(proto->close),
1509 proto_method_implemented(proto->connect), 1523 proto_method_implemented(proto->connect),
1510 proto_method_implemented(proto->disconnect), 1524 proto_method_implemented(proto->disconnect),
1511 proto_method_implemented(proto->accept), 1525 proto_method_implemented(proto->accept),
1512 proto_method_implemented(proto->ioctl), 1526 proto_method_implemented(proto->ioctl),
1513 proto_method_implemented(proto->init), 1527 proto_method_implemented(proto->init),
1514 proto_method_implemented(proto->destroy), 1528 proto_method_implemented(proto->destroy),
1515 proto_method_implemented(proto->shutdown), 1529 proto_method_implemented(proto->shutdown),
1516 proto_method_implemented(proto->setsockopt), 1530 proto_method_implemented(proto->setsockopt),
1517 proto_method_implemented(proto->getsockopt), 1531 proto_method_implemented(proto->getsockopt),
1518 proto_method_implemented(proto->sendmsg), 1532 proto_method_implemented(proto->sendmsg),
1519 proto_method_implemented(proto->recvmsg), 1533 proto_method_implemented(proto->recvmsg),
1520 proto_method_implemented(proto->sendpage), 1534 proto_method_implemented(proto->sendpage),
1521 proto_method_implemented(proto->bind), 1535 proto_method_implemented(proto->bind),
1522 proto_method_implemented(proto->backlog_rcv), 1536 proto_method_implemented(proto->backlog_rcv),
1523 proto_method_implemented(proto->hash), 1537 proto_method_implemented(proto->hash),
1524 proto_method_implemented(proto->unhash), 1538 proto_method_implemented(proto->unhash),
1525 proto_method_implemented(proto->get_port), 1539 proto_method_implemented(proto->get_port),
1526 proto_method_implemented(proto->enter_memory_pressure)); 1540 proto_method_implemented(proto->enter_memory_pressure));
1527 } 1541 }
1528 1542
1529 static int proto_seq_show(struct seq_file *seq, void *v) 1543 static int proto_seq_show(struct seq_file *seq, void *v)
1530 { 1544 {
1531 if (v == SEQ_START_TOKEN) 1545 if (v == SEQ_START_TOKEN)
1532 seq_printf(seq, "%-9s %-4s %-8s %-6s %-5s %-7s %-4s %-10s %s", 1546 seq_printf(seq, "%-9s %-4s %-8s %-6s %-5s %-7s %-4s %-10s %s",
1533 "protocol", 1547 "protocol",
1534 "size", 1548 "size",
1535 "sockets", 1549 "sockets",
1536 "memory", 1550 "memory",
1537 "press", 1551 "press",
1538 "maxhdr", 1552 "maxhdr",
1539 "slab", 1553 "slab",
1540 "module", 1554 "module",
1541 "cl co di ac io in de sh ss gs se re sp bi br ha uh gp em\n"); 1555 "cl co di ac io in de sh ss gs se re sp bi br ha uh gp em\n");
1542 else 1556 else
1543 proto_seq_printf(seq, v); 1557 proto_seq_printf(seq, v);
1544 return 0; 1558 return 0;
1545 } 1559 }
1546 1560
1547 static struct seq_operations proto_seq_ops = { 1561 static struct seq_operations proto_seq_ops = {
1548 .start = proto_seq_start, 1562 .start = proto_seq_start,
1549 .next = proto_seq_next, 1563 .next = proto_seq_next,
1550 .stop = proto_seq_stop, 1564 .stop = proto_seq_stop,
1551 .show = proto_seq_show, 1565 .show = proto_seq_show,
1552 }; 1566 };
1553 1567
1554 static int proto_seq_open(struct inode *inode, struct file *file) 1568 static int proto_seq_open(struct inode *inode, struct file *file)
1555 { 1569 {
1556 return seq_open(file, &proto_seq_ops); 1570 return seq_open(file, &proto_seq_ops);
1557 } 1571 }
1558 1572
1559 static struct file_operations proto_seq_fops = { 1573 static struct file_operations proto_seq_fops = {
1560 .owner = THIS_MODULE, 1574 .owner = THIS_MODULE,
1561 .open = proto_seq_open, 1575 .open = proto_seq_open,
1562 .read = seq_read, 1576 .read = seq_read,
1563 .llseek = seq_lseek, 1577 .llseek = seq_lseek,
1564 .release = seq_release, 1578 .release = seq_release,
1565 }; 1579 };
1566 1580
1567 static int __init proto_init(void) 1581 static int __init proto_init(void)
1568 { 1582 {
1569 /* register /proc/net/protocols */ 1583 /* register /proc/net/protocols */
1570 return proc_net_fops_create("protocols", S_IRUGO, &proto_seq_fops) == NULL ? -ENOBUFS : 0; 1584 return proc_net_fops_create("protocols", S_IRUGO, &proto_seq_fops) == NULL ? -ENOBUFS : 0;
1571 } 1585 }
1572 1586
1573 subsys_initcall(proto_init); 1587 subsys_initcall(proto_init);
1574 1588
1575 #endif /* PROC_FS */ 1589 #endif /* PROC_FS */
1576 1590
1577 EXPORT_SYMBOL(sk_alloc); 1591 EXPORT_SYMBOL(sk_alloc);
1578 EXPORT_SYMBOL(sk_free); 1592 EXPORT_SYMBOL(sk_free);
1579 EXPORT_SYMBOL(sk_send_sigurg); 1593 EXPORT_SYMBOL(sk_send_sigurg);
1580 EXPORT_SYMBOL(sock_alloc_send_skb); 1594 EXPORT_SYMBOL(sock_alloc_send_skb);
1581 EXPORT_SYMBOL(sock_init_data); 1595 EXPORT_SYMBOL(sock_init_data);
1582 EXPORT_SYMBOL(sock_kfree_s); 1596 EXPORT_SYMBOL(sock_kfree_s);
1583 EXPORT_SYMBOL(sock_kmalloc); 1597 EXPORT_SYMBOL(sock_kmalloc);
1584 EXPORT_SYMBOL(sock_no_accept); 1598 EXPORT_SYMBOL(sock_no_accept);
1585 EXPORT_SYMBOL(sock_no_bind); 1599 EXPORT_SYMBOL(sock_no_bind);
1586 EXPORT_SYMBOL(sock_no_connect); 1600 EXPORT_SYMBOL(sock_no_connect);
1587 EXPORT_SYMBOL(sock_no_getname); 1601 EXPORT_SYMBOL(sock_no_getname);
1588 EXPORT_SYMBOL(sock_no_getsockopt); 1602 EXPORT_SYMBOL(sock_no_getsockopt);
1589 EXPORT_SYMBOL(sock_no_ioctl); 1603 EXPORT_SYMBOL(sock_no_ioctl);
1590 EXPORT_SYMBOL(sock_no_listen); 1604 EXPORT_SYMBOL(sock_no_listen);
1591 EXPORT_SYMBOL(sock_no_mmap); 1605 EXPORT_SYMBOL(sock_no_mmap);
1592 EXPORT_SYMBOL(sock_no_poll); 1606 EXPORT_SYMBOL(sock_no_poll);
1593 EXPORT_SYMBOL(sock_no_recvmsg); 1607 EXPORT_SYMBOL(sock_no_recvmsg);
1594 EXPORT_SYMBOL(sock_no_sendmsg); 1608 EXPORT_SYMBOL(sock_no_sendmsg);
1595 EXPORT_SYMBOL(sock_no_sendpage); 1609 EXPORT_SYMBOL(sock_no_sendpage);
1596 EXPORT_SYMBOL(sock_no_setsockopt); 1610 EXPORT_SYMBOL(sock_no_setsockopt);
1597 EXPORT_SYMBOL(sock_no_shutdown); 1611 EXPORT_SYMBOL(sock_no_shutdown);
1598 EXPORT_SYMBOL(sock_no_socketpair); 1612 EXPORT_SYMBOL(sock_no_socketpair);
1599 EXPORT_SYMBOL(sock_rfree); 1613 EXPORT_SYMBOL(sock_rfree);
1600 EXPORT_SYMBOL(sock_setsockopt); 1614 EXPORT_SYMBOL(sock_setsockopt);
1601 EXPORT_SYMBOL(sock_wfree); 1615 EXPORT_SYMBOL(sock_wfree);
1602 EXPORT_SYMBOL(sock_wmalloc); 1616 EXPORT_SYMBOL(sock_wmalloc);
1603 EXPORT_SYMBOL(sock_i_uid); 1617 EXPORT_SYMBOL(sock_i_uid);
1604 EXPORT_SYMBOL(sock_i_ino); 1618 EXPORT_SYMBOL(sock_i_ino);
1605 #ifdef CONFIG_SYSCTL 1619 #ifdef CONFIG_SYSCTL
1606 EXPORT_SYMBOL(sysctl_optmem_max); 1620 EXPORT_SYMBOL(sysctl_optmem_max);
1607 EXPORT_SYMBOL(sysctl_rmem_max); 1621 EXPORT_SYMBOL(sysctl_rmem_max);
1608 EXPORT_SYMBOL(sysctl_wmem_max); 1622 EXPORT_SYMBOL(sysctl_wmem_max);
1609 #endif 1623 #endif
1610 1624