diff options
| author | Tom Herbert <therbert@google.com> | 2013-01-22 04:49:50 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2013-01-23 13:44:00 -0500 |
| commit | 055dc21a1d1d219608cd4baac7d0683fb2cbbe8a (patch) | |
| tree | 23e66bde4668a92585f62d15c759c53fd4d0892f | |
| parent | 4a633a602c26497b8285a202830829d3be007c7b (diff) | |
soreuseport: infrastructure
Definitions and macros for implementing soreusport.
Signed-off-by: Tom Herbert <therbert@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | arch/alpha/include/uapi/asm/socket.h | 2 | ||||
| -rw-r--r-- | arch/avr32/include/uapi/asm/socket.h | 2 | ||||
| -rw-r--r-- | arch/cris/include/uapi/asm/socket.h | 2 | ||||
| -rw-r--r-- | arch/frv/include/uapi/asm/socket.h | 2 | ||||
| -rw-r--r-- | arch/h8300/include/uapi/asm/socket.h | 2 | ||||
| -rw-r--r-- | arch/ia64/include/uapi/asm/socket.h | 2 | ||||
| -rw-r--r-- | arch/m32r/include/uapi/asm/socket.h | 2 | ||||
| -rw-r--r-- | arch/mips/include/uapi/asm/socket.h | 3 | ||||
| -rw-r--r-- | arch/mn10300/include/uapi/asm/socket.h | 2 | ||||
| -rw-r--r-- | arch/parisc/include/uapi/asm/socket.h | 2 | ||||
| -rw-r--r-- | arch/powerpc/include/uapi/asm/socket.h | 2 | ||||
| -rw-r--r-- | arch/s390/include/uapi/asm/socket.h | 2 | ||||
| -rw-r--r-- | arch/sparc/include/uapi/asm/socket.h | 2 | ||||
| -rw-r--r-- | arch/xtensa/include/uapi/asm/socket.h | 2 | ||||
| -rw-r--r-- | include/linux/random.h | 6 | ||||
| -rw-r--r-- | include/net/sock.h | 5 | ||||
| -rw-r--r-- | include/uapi/asm-generic/socket.h | 3 | ||||
| -rw-r--r-- | net/core/sock.c | 7 |
18 files changed, 32 insertions, 18 deletions
diff --git a/arch/alpha/include/uapi/asm/socket.h b/arch/alpha/include/uapi/asm/socket.h index 755702eefd9c..c5195524d1ef 100644 --- a/arch/alpha/include/uapi/asm/socket.h +++ b/arch/alpha/include/uapi/asm/socket.h | |||
| @@ -19,7 +19,7 @@ | |||
| 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 | #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 |
diff --git a/arch/avr32/include/uapi/asm/socket.h b/arch/avr32/include/uapi/asm/socket.h index f3f38a0e2ef9..51c6401582ea 100644 --- a/arch/avr32/include/uapi/asm/socket.h +++ b/arch/avr32/include/uapi/asm/socket.h | |||
| @@ -22,7 +22,7 @@ | |||
| 22 | #define SO_PRIORITY 12 | 22 | #define SO_PRIORITY 12 |
| 23 | #define SO_LINGER 13 | 23 | #define SO_LINGER 13 |
| 24 | #define SO_BSDCOMPAT 14 | 24 | #define SO_BSDCOMPAT 14 |
| 25 | /* To add :#define SO_REUSEPORT 15 */ | 25 | #define SO_REUSEPORT 15 |
| 26 | #define SO_PASSCRED 16 | 26 | #define SO_PASSCRED 16 |
| 27 | #define SO_PEERCRED 17 | 27 | #define SO_PEERCRED 17 |
| 28 | #define SO_RCVLOWAT 18 | 28 | #define SO_RCVLOWAT 18 |
diff --git a/arch/cris/include/uapi/asm/socket.h b/arch/cris/include/uapi/asm/socket.h index 406b5838defd..50692b738c75 100644 --- a/arch/cris/include/uapi/asm/socket.h +++ b/arch/cris/include/uapi/asm/socket.h | |||
| @@ -24,7 +24,7 @@ | |||
| 24 | #define SO_PRIORITY 12 | 24 | #define SO_PRIORITY 12 |
| 25 | #define SO_LINGER 13 | 25 | #define SO_LINGER 13 |
| 26 | #define SO_BSDCOMPAT 14 | 26 | #define SO_BSDCOMPAT 14 |
| 27 | /* To add :#define SO_REUSEPORT 15 */ | 27 | #define SO_REUSEPORT 15 |
| 28 | #define SO_PASSCRED 16 | 28 | #define SO_PASSCRED 16 |
| 29 | #define SO_PEERCRED 17 | 29 | #define SO_PEERCRED 17 |
| 30 | #define SO_RCVLOWAT 18 | 30 | #define SO_RCVLOWAT 18 |
diff --git a/arch/frv/include/uapi/asm/socket.h b/arch/frv/include/uapi/asm/socket.h index d8e1132a1ab6..595391f0f98c 100644 --- a/arch/frv/include/uapi/asm/socket.h +++ b/arch/frv/include/uapi/asm/socket.h | |||
| @@ -22,7 +22,7 @@ | |||
| 22 | #define SO_PRIORITY 12 | 22 | #define SO_PRIORITY 12 |
| 23 | #define SO_LINGER 13 | 23 | #define SO_LINGER 13 |
| 24 | #define SO_BSDCOMPAT 14 | 24 | #define SO_BSDCOMPAT 14 |
| 25 | /* To add :#define SO_REUSEPORT 15 */ | 25 | #define SO_REUSEPORT 15 |
| 26 | #define SO_PASSCRED 16 | 26 | #define SO_PASSCRED 16 |
| 27 | #define SO_PEERCRED 17 | 27 | #define SO_PEERCRED 17 |
| 28 | #define SO_RCVLOWAT 18 | 28 | #define SO_RCVLOWAT 18 |
diff --git a/arch/h8300/include/uapi/asm/socket.h b/arch/h8300/include/uapi/asm/socket.h index c8b87a828206..43e32621da7d 100644 --- a/arch/h8300/include/uapi/asm/socket.h +++ b/arch/h8300/include/uapi/asm/socket.h | |||
| @@ -22,7 +22,7 @@ | |||
| 22 | #define SO_PRIORITY 12 | 22 | #define SO_PRIORITY 12 |
| 23 | #define SO_LINGER 13 | 23 | #define SO_LINGER 13 |
| 24 | #define SO_BSDCOMPAT 14 | 24 | #define SO_BSDCOMPAT 14 |
| 25 | /* To add :#define SO_REUSEPORT 15 */ | 25 | #define SO_REUSEPORT 15 |
| 26 | #define SO_PASSCRED 16 | 26 | #define SO_PASSCRED 16 |
| 27 | #define SO_PEERCRED 17 | 27 | #define SO_PEERCRED 17 |
| 28 | #define SO_RCVLOWAT 18 | 28 | #define SO_RCVLOWAT 18 |
diff --git a/arch/ia64/include/uapi/asm/socket.h b/arch/ia64/include/uapi/asm/socket.h index f390896c3104..c567adc8bea5 100644 --- a/arch/ia64/include/uapi/asm/socket.h +++ b/arch/ia64/include/uapi/asm/socket.h | |||
| @@ -31,7 +31,7 @@ | |||
| 31 | #define SO_PRIORITY 12 | 31 | #define SO_PRIORITY 12 |
| 32 | #define SO_LINGER 13 | 32 | #define SO_LINGER 13 |
| 33 | #define SO_BSDCOMPAT 14 | 33 | #define SO_BSDCOMPAT 14 |
| 34 | /* To add :#define SO_REUSEPORT 15 */ | 34 | #define SO_REUSEPORT 15 |
| 35 | #define SO_PASSCRED 16 | 35 | #define SO_PASSCRED 16 |
| 36 | #define SO_PEERCRED 17 | 36 | #define SO_PEERCRED 17 |
| 37 | #define SO_RCVLOWAT 18 | 37 | #define SO_RCVLOWAT 18 |
diff --git a/arch/m32r/include/uapi/asm/socket.h b/arch/m32r/include/uapi/asm/socket.h index 6a895155e7a3..519afa2755db 100644 --- a/arch/m32r/include/uapi/asm/socket.h +++ b/arch/m32r/include/uapi/asm/socket.h | |||
| @@ -22,7 +22,7 @@ | |||
| 22 | #define SO_PRIORITY 12 | 22 | #define SO_PRIORITY 12 |
| 23 | #define SO_LINGER 13 | 23 | #define SO_LINGER 13 |
| 24 | #define SO_BSDCOMPAT 14 | 24 | #define SO_BSDCOMPAT 14 |
| 25 | /* To add :#define SO_REUSEPORT 15 */ | 25 | #define SO_REUSEPORT 15 |
| 26 | #define SO_PASSCRED 16 | 26 | #define SO_PASSCRED 16 |
| 27 | #define SO_PEERCRED 17 | 27 | #define SO_PEERCRED 17 |
| 28 | #define SO_RCVLOWAT 18 | 28 | #define SO_RCVLOWAT 18 |
diff --git a/arch/mips/include/uapi/asm/socket.h b/arch/mips/include/uapi/asm/socket.h index 9d11a7713923..7e2723637b35 100644 --- a/arch/mips/include/uapi/asm/socket.h +++ b/arch/mips/include/uapi/asm/socket.h | |||
| @@ -28,8 +28,7 @@ | |||
| 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 | #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 | 32 | #endif |
| 34 | 33 | ||
| 35 | #define SO_TYPE 0x1008 /* Compatible name for SO_STYLE. */ | 34 | #define SO_TYPE 0x1008 /* Compatible name for SO_STYLE. */ |
diff --git a/arch/mn10300/include/uapi/asm/socket.h b/arch/mn10300/include/uapi/asm/socket.h index ab702c40b30e..5c7c7c988544 100644 --- a/arch/mn10300/include/uapi/asm/socket.h +++ b/arch/mn10300/include/uapi/asm/socket.h | |||
| @@ -22,7 +22,7 @@ | |||
| 22 | #define SO_PRIORITY 12 | 22 | #define SO_PRIORITY 12 |
| 23 | #define SO_LINGER 13 | 23 | #define SO_LINGER 13 |
| 24 | #define SO_BSDCOMPAT 14 | 24 | #define SO_BSDCOMPAT 14 |
| 25 | /* To add :#define SO_REUSEPORT 15 */ | 25 | #define SO_REUSEPORT 15 |
| 26 | #define SO_PASSCRED 16 | 26 | #define SO_PASSCRED 16 |
| 27 | #define SO_PEERCRED 17 | 27 | #define SO_PEERCRED 17 |
| 28 | #define SO_RCVLOWAT 18 | 28 | #define SO_RCVLOWAT 18 |
diff --git a/arch/parisc/include/uapi/asm/socket.h b/arch/parisc/include/uapi/asm/socket.h index da2c8d3c209e..526e4b9aece0 100644 --- a/arch/parisc/include/uapi/asm/socket.h +++ b/arch/parisc/include/uapi/asm/socket.h | |||
| @@ -13,7 +13,7 @@ | |||
| 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 | #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 | 19 | #define SO_SNDBUFFORCE 0x100a |
diff --git a/arch/powerpc/include/uapi/asm/socket.h b/arch/powerpc/include/uapi/asm/socket.h index e6ca31816cc9..a26dcaece509 100644 --- a/arch/powerpc/include/uapi/asm/socket.h +++ b/arch/powerpc/include/uapi/asm/socket.h | |||
| @@ -29,7 +29,7 @@ | |||
| 29 | #define SO_PRIORITY 12 | 29 | #define SO_PRIORITY 12 |
| 30 | #define SO_LINGER 13 | 30 | #define SO_LINGER 13 |
| 31 | #define SO_BSDCOMPAT 14 | 31 | #define SO_BSDCOMPAT 14 |
| 32 | /* To add :#define SO_REUSEPORT 15 */ | 32 | #define SO_REUSEPORT 15 |
| 33 | #define SO_RCVLOWAT 16 | 33 | #define SO_RCVLOWAT 16 |
| 34 | #define SO_SNDLOWAT 17 | 34 | #define SO_SNDLOWAT 17 |
| 35 | #define SO_RCVTIMEO 18 | 35 | #define SO_RCVTIMEO 18 |
diff --git a/arch/s390/include/uapi/asm/socket.h b/arch/s390/include/uapi/asm/socket.h index 9ce60b68f070..f99eea7fff0f 100644 --- a/arch/s390/include/uapi/asm/socket.h +++ b/arch/s390/include/uapi/asm/socket.h | |||
| @@ -28,7 +28,7 @@ | |||
| 28 | #define SO_PRIORITY 12 | 28 | #define SO_PRIORITY 12 |
| 29 | #define SO_LINGER 13 | 29 | #define SO_LINGER 13 |
| 30 | #define SO_BSDCOMPAT 14 | 30 | #define SO_BSDCOMPAT 14 |
| 31 | /* To add :#define SO_REUSEPORT 15 */ | 31 | #define SO_REUSEPORT 15 |
| 32 | #define SO_PASSCRED 16 | 32 | #define SO_PASSCRED 16 |
| 33 | #define SO_PEERCRED 17 | 33 | #define SO_PEERCRED 17 |
| 34 | #define SO_RCVLOWAT 18 | 34 | #define SO_RCVLOWAT 18 |
diff --git a/arch/sparc/include/uapi/asm/socket.h b/arch/sparc/include/uapi/asm/socket.h index fbbba57547d1..cbbad74b2e06 100644 --- a/arch/sparc/include/uapi/asm/socket.h +++ b/arch/sparc/include/uapi/asm/socket.h | |||
| @@ -15,7 +15,7 @@ | |||
| 15 | #define SO_PEERCRED 0x0040 | 15 | #define SO_PEERCRED 0x0040 |
| 16 | #define SO_LINGER 0x0080 | 16 | #define SO_LINGER 0x0080 |
| 17 | #define SO_OOBINLINE 0x0100 | 17 | #define SO_OOBINLINE 0x0100 |
| 18 | /* To add :#define SO_REUSEPORT 0x0200 */ | 18 | #define SO_REUSEPORT 0x0200 |
| 19 | #define SO_BSDCOMPAT 0x0400 | 19 | #define SO_BSDCOMPAT 0x0400 |
| 20 | #define SO_RCVLOWAT 0x0800 | 20 | #define SO_RCVLOWAT 0x0800 |
| 21 | #define SO_SNDLOWAT 0x1000 | 21 | #define SO_SNDLOWAT 0x1000 |
diff --git a/arch/xtensa/include/uapi/asm/socket.h b/arch/xtensa/include/uapi/asm/socket.h index dbf316487b51..35905cb6e419 100644 --- a/arch/xtensa/include/uapi/asm/socket.h +++ b/arch/xtensa/include/uapi/asm/socket.h | |||
| @@ -32,7 +32,7 @@ | |||
| 32 | #define SO_PRIORITY 12 | 32 | #define SO_PRIORITY 12 |
| 33 | #define SO_LINGER 13 | 33 | #define SO_LINGER 13 |
| 34 | #define SO_BSDCOMPAT 14 | 34 | #define SO_BSDCOMPAT 14 |
| 35 | /* To add :#define SO_REUSEPORT 15 */ | 35 | #define SO_REUSEPORT 15 |
| 36 | #define SO_PASSCRED 16 | 36 | #define SO_PASSCRED 16 |
| 37 | #define SO_PEERCRED 17 | 37 | #define SO_PEERCRED 17 |
| 38 | #define SO_RCVLOWAT 18 | 38 | #define SO_RCVLOWAT 18 |
diff --git a/include/linux/random.h b/include/linux/random.h index d9846088c2c5..347ce553a306 100644 --- a/include/linux/random.h +++ b/include/linux/random.h | |||
| @@ -74,4 +74,10 @@ static inline int arch_get_random_int(unsigned int *v) | |||
| 74 | } | 74 | } |
| 75 | #endif | 75 | #endif |
| 76 | 76 | ||
| 77 | /* Pseudo random number generator from numerical recipes. */ | ||
| 78 | static inline u32 next_pseudo_random32(u32 seed) | ||
| 79 | { | ||
| 80 | return seed * 1664525 + 1013904223; | ||
| 81 | } | ||
| 82 | |||
| 77 | #endif /* _LINUX_RANDOM_H */ | 83 | #endif /* _LINUX_RANDOM_H */ |
diff --git a/include/net/sock.h b/include/net/sock.h index 5a34e2f03657..581dc6bd7dc6 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
| @@ -140,6 +140,7 @@ typedef __u64 __bitwise __addrpair; | |||
| 140 | * @skc_family: network address family | 140 | * @skc_family: network address family |
| 141 | * @skc_state: Connection state | 141 | * @skc_state: Connection state |
| 142 | * @skc_reuse: %SO_REUSEADDR setting | 142 | * @skc_reuse: %SO_REUSEADDR setting |
| 143 | * @skc_reuseport: %SO_REUSEPORT setting | ||
| 143 | * @skc_bound_dev_if: bound device index if != 0 | 144 | * @skc_bound_dev_if: bound device index if != 0 |
| 144 | * @skc_bind_node: bind hash linkage for various protocol lookup tables | 145 | * @skc_bind_node: bind hash linkage for various protocol lookup tables |
| 145 | * @skc_portaddr_node: second hash linkage for UDP/UDP-Lite protocol | 146 | * @skc_portaddr_node: second hash linkage for UDP/UDP-Lite protocol |
| @@ -179,7 +180,8 @@ struct sock_common { | |||
| 179 | 180 | ||
| 180 | unsigned short skc_family; | 181 | unsigned short skc_family; |
| 181 | volatile unsigned char skc_state; | 182 | volatile unsigned char skc_state; |
| 182 | unsigned char skc_reuse; | 183 | unsigned char skc_reuse:4; |
| 184 | unsigned char skc_reuseport:4; | ||
| 183 | int skc_bound_dev_if; | 185 | int skc_bound_dev_if; |
| 184 | union { | 186 | union { |
| 185 | struct hlist_node skc_bind_node; | 187 | struct hlist_node skc_bind_node; |
| @@ -297,6 +299,7 @@ struct sock { | |||
| 297 | #define sk_family __sk_common.skc_family | 299 | #define sk_family __sk_common.skc_family |
| 298 | #define sk_state __sk_common.skc_state | 300 | #define sk_state __sk_common.skc_state |
| 299 | #define sk_reuse __sk_common.skc_reuse | 301 | #define sk_reuse __sk_common.skc_reuse |
| 302 | #define sk_reuseport __sk_common.skc_reuseport | ||
| 300 | #define sk_bound_dev_if __sk_common.skc_bound_dev_if | 303 | #define sk_bound_dev_if __sk_common.skc_bound_dev_if |
| 301 | #define sk_bind_node __sk_common.skc_bind_node | 304 | #define sk_bind_node __sk_common.skc_bind_node |
| 302 | #define sk_prot __sk_common.skc_prot | 305 | #define sk_prot __sk_common.skc_prot |
diff --git a/include/uapi/asm-generic/socket.h b/include/uapi/asm-generic/socket.h index 3f6a99201410..4ef3acbba5da 100644 --- a/include/uapi/asm-generic/socket.h +++ b/include/uapi/asm-generic/socket.h | |||
| @@ -22,8 +22,7 @@ | |||
| 22 | #define SO_PRIORITY 12 | 22 | #define SO_PRIORITY 12 |
| 23 | #define SO_LINGER 13 | 23 | #define SO_LINGER 13 |
| 24 | #define SO_BSDCOMPAT 14 | 24 | #define SO_BSDCOMPAT 14 |
| 25 | /* To add :#define SO_REUSEPORT 15 */ | 25 | #define SO_REUSEPORT 15 |
| 26 | |||
| 27 | #ifndef SO_PASSCRED /* powerpc only differs in these */ | 26 | #ifndef SO_PASSCRED /* powerpc only differs in these */ |
| 28 | #define SO_PASSCRED 16 | 27 | #define SO_PASSCRED 16 |
| 29 | #define SO_PEERCRED 17 | 28 | #define SO_PEERCRED 17 |
diff --git a/net/core/sock.c b/net/core/sock.c index 8258fb741e9a..235fb89e8973 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
| @@ -665,6 +665,9 @@ int sock_setsockopt(struct socket *sock, int level, int optname, | |||
| 665 | case SO_REUSEADDR: | 665 | case SO_REUSEADDR: |
| 666 | sk->sk_reuse = (valbool ? SK_CAN_REUSE : SK_NO_REUSE); | 666 | sk->sk_reuse = (valbool ? SK_CAN_REUSE : SK_NO_REUSE); |
| 667 | break; | 667 | break; |
| 668 | case SO_REUSEPORT: | ||
| 669 | sk->sk_reuseport = valbool; | ||
| 670 | break; | ||
| 668 | case SO_TYPE: | 671 | case SO_TYPE: |
| 669 | case SO_PROTOCOL: | 672 | case SO_PROTOCOL: |
| 670 | case SO_DOMAIN: | 673 | case SO_DOMAIN: |
| @@ -972,6 +975,10 @@ int sock_getsockopt(struct socket *sock, int level, int optname, | |||
| 972 | v.val = sk->sk_reuse; | 975 | v.val = sk->sk_reuse; |
| 973 | break; | 976 | break; |
| 974 | 977 | ||
| 978 | case SO_REUSEPORT: | ||
| 979 | v.val = sk->sk_reuseport; | ||
| 980 | break; | ||
| 981 | |||
| 975 | case SO_KEEPALIVE: | 982 | case SO_KEEPALIVE: |
| 976 | v.val = sock_flag(sk, SOCK_KEEPOPEN); | 983 | v.val = sock_flag(sk, SOCK_KEEPOPEN); |
| 977 | break; | 984 | break; |
