soreuseport: infrastructure
authorTom Herbert <therbert@google.com>
Tue, 22 Jan 2013 09:49:50 +0000 (09:49 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 23 Jan 2013 18:44:00 +0000 (13:44 -0500)
Definitions and macros for implementing soreusport.

Signed-off-by: Tom Herbert <therbert@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
18 files changed:
arch/alpha/include/uapi/asm/socket.h
arch/avr32/include/uapi/asm/socket.h
arch/cris/include/uapi/asm/socket.h
arch/frv/include/uapi/asm/socket.h
arch/h8300/include/uapi/asm/socket.h
arch/ia64/include/uapi/asm/socket.h
arch/m32r/include/uapi/asm/socket.h
arch/mips/include/uapi/asm/socket.h
arch/mn10300/include/uapi/asm/socket.h
arch/parisc/include/uapi/asm/socket.h
arch/powerpc/include/uapi/asm/socket.h
arch/s390/include/uapi/asm/socket.h
arch/sparc/include/uapi/asm/socket.h
arch/xtensa/include/uapi/asm/socket.h
include/linux/random.h
include/net/sock.h
include/uapi/asm-generic/socket.h
net/core/sock.c

index 755702eefd9cfa9c53e0ab465eb306fb58c02f3d..c5195524d1ef8904af746889e9955271b2ff55c1 100644 (file)
@@ -19,7 +19,7 @@
 #define SO_BROADCAST   0x0020
 #define SO_LINGER      0x0080
 #define SO_OOBINLINE   0x0100
-/* To add :#define SO_REUSEPORT 0x0200 */
+#define SO_REUSEPORT   0x0200
 
 #define SO_TYPE                0x1008
 #define SO_ERROR       0x1007
index f3f38a0e2ef91e79c0da872bcb83b2d85669b0cd..51c6401582ea677a1d9d211ce3652b833de9516c 100644 (file)
@@ -22,7 +22,7 @@
 #define SO_PRIORITY    12
 #define SO_LINGER      13
 #define SO_BSDCOMPAT   14
-/* To add :#define SO_REUSEPORT 15 */
+#define SO_REUSEPORT   15
 #define SO_PASSCRED    16
 #define SO_PEERCRED    17
 #define SO_RCVLOWAT    18
index 406b5838defd9dbcc28cc1dd6769735986eba7cf..50692b738c756172af61ab84f2f8693495ea6655 100644 (file)
@@ -24,7 +24,7 @@
 #define SO_PRIORITY    12
 #define SO_LINGER      13
 #define SO_BSDCOMPAT   14
-/* To add :#define SO_REUSEPORT 15 */
+#define SO_REUSEPORT   15
 #define SO_PASSCRED    16
 #define SO_PEERCRED    17
 #define SO_RCVLOWAT    18
index d8e1132a1ab63f99588c8e2cf388fdfbb4b475b7..595391f0f98c65e2bddbcbbe70b7e4d5062082d9 100644 (file)
@@ -22,7 +22,7 @@
 #define SO_PRIORITY    12
 #define SO_LINGER      13
 #define SO_BSDCOMPAT   14
-/* To add :#define SO_REUSEPORT 15 */
+#define SO_REUSEPORT   15
 #define SO_PASSCRED    16
 #define SO_PEERCRED    17
 #define SO_RCVLOWAT    18
index c8b87a828206885d424b28ecbdaf1fd90b685912..43e32621da7d01ab20ad81f0c520d6ee83682434 100644 (file)
@@ -22,7 +22,7 @@
 #define SO_PRIORITY    12
 #define SO_LINGER      13
 #define SO_BSDCOMPAT   14
-/* To add :#define SO_REUSEPORT 15 */
+#define SO_REUSEPORT   15
 #define SO_PASSCRED    16
 #define SO_PEERCRED    17
 #define SO_RCVLOWAT    18
index f390896c31048c30135e9b77227c3c729b94e291..c567adc8bea535fb5bcc15156a51f4af55424bf3 100644 (file)
@@ -31,7 +31,7 @@
 #define SO_PRIORITY    12
 #define SO_LINGER      13
 #define SO_BSDCOMPAT   14
-/* To add :#define SO_REUSEPORT 15 */
+#define SO_REUSEPORT   15
 #define SO_PASSCRED    16
 #define SO_PEERCRED    17
 #define SO_RCVLOWAT    18
index 6a895155e7a39107c20e4365b1a442a38840fa93..519afa2755db5c8738bc7138f67aecc408d27fd2 100644 (file)
@@ -22,7 +22,7 @@
 #define SO_PRIORITY    12
 #define SO_LINGER      13
 #define SO_BSDCOMPAT   14
-/* To add :#define SO_REUSEPORT 15 */
+#define SO_REUSEPORT   15
 #define SO_PASSCRED    16
 #define SO_PEERCRED    17
 #define SO_RCVLOWAT    18
index 9d11a771392364c34704f40089d02d950af0b313..7e2723637b356d08169ae18c5b82eb1403801a43 100644 (file)
@@ -28,8 +28,7 @@
 #define SO_LINGER      0x0080  /* Block on close of a reliable
                                   socket to transmit pending data.  */
 #define SO_OOBINLINE 0x0100    /* Receive out-of-band data in-band.  */
-#if 0
-To add: #define SO_REUSEPORT 0x0200    /* Allow local address and port reuse.  */
+#define SO_REUSEPORT 0x0200    /* Allow local address and port reuse.  */
 #endif
 
 #define SO_TYPE                0x1008  /* Compatible name for SO_STYLE.  */
index ab702c40b30e8173f5ec2d8160d928cd83a5dff1..5c7c7c988544558f632a84ab5f529801a27b8963 100644 (file)
@@ -22,7 +22,7 @@
 #define SO_PRIORITY    12
 #define SO_LINGER      13
 #define SO_BSDCOMPAT   14
-/* To add :#define SO_REUSEPORT 15 */
+#define SO_REUSEPORT   15
 #define SO_PASSCRED    16
 #define SO_PEERCRED    17
 #define SO_RCVLOWAT    18
index da2c8d3c209efa2b7cb9c225283fc0ba5cd82510..526e4b9aece0a0480f1631bcb492c83ffac2c735 100644 (file)
@@ -13,7 +13,7 @@
 #define SO_BROADCAST   0x0020
 #define SO_LINGER      0x0080
 #define SO_OOBINLINE   0x0100
-/* To add :#define SO_REUSEPORT 0x0200 */
+#define SO_REUSEPORT   0x0200
 #define SO_SNDBUF      0x1001
 #define SO_RCVBUF      0x1002
 #define SO_SNDBUFFORCE 0x100a
index e6ca31816cc96e62557521eaa15006678fcd65f6..a26dcaece509490746ab8b2a5d254125f6d4571f 100644 (file)
@@ -29,7 +29,7 @@
 #define SO_PRIORITY    12
 #define SO_LINGER      13
 #define SO_BSDCOMPAT   14
-/* To add :#define SO_REUSEPORT 15 */
+#define SO_REUSEPORT   15
 #define SO_RCVLOWAT    16
 #define SO_SNDLOWAT    17
 #define SO_RCVTIMEO    18
index 9ce60b68f0709468fa454f66d886bb48cb71c525..f99eea7fff0fc4af85cf41ab1fd91ff6e402352b 100644 (file)
@@ -28,7 +28,7 @@
 #define SO_PRIORITY    12
 #define SO_LINGER      13
 #define SO_BSDCOMPAT   14
-/* To add :#define SO_REUSEPORT 15 */
+#define SO_REUSEPORT   15
 #define SO_PASSCRED    16
 #define SO_PEERCRED    17
 #define SO_RCVLOWAT    18
index fbbba57547d1f7cf7fa495f36b5dea3696ecc49b..cbbad74b2e06a0c6405ecabd4d054887b404668f 100644 (file)
@@ -15,7 +15,7 @@
 #define SO_PEERCRED    0x0040
 #define SO_LINGER      0x0080
 #define SO_OOBINLINE   0x0100
-/* To add :#define SO_REUSEPORT 0x0200 */
+#define SO_REUSEPORT   0x0200
 #define SO_BSDCOMPAT    0x0400
 #define SO_RCVLOWAT     0x0800
 #define SO_SNDLOWAT     0x1000
index dbf316487b510e94ea6d95423404102cceebe0d5..35905cb6e419a661c04e24bf205f5c4e1f1982f5 100644 (file)
@@ -32,7 +32,7 @@
 #define SO_PRIORITY    12
 #define SO_LINGER      13
 #define SO_BSDCOMPAT   14
-/* To add :#define SO_REUSEPORT 15 */
+#define SO_REUSEPORT   15
 #define SO_PASSCRED    16
 #define SO_PEERCRED    17
 #define SO_RCVLOWAT    18
index d9846088c2c5fe63ed7b97c0c1a19a5bf23f31dc..347ce553a3065fd5020eb1ab864434db488df27c 100644 (file)
@@ -74,4 +74,10 @@ static inline int arch_get_random_int(unsigned int *v)
 }
 #endif
 
+/* Pseudo random number generator from numerical recipes. */
+static inline u32 next_pseudo_random32(u32 seed)
+{
+       return seed * 1664525 + 1013904223;
+}
+
 #endif /* _LINUX_RANDOM_H */
index 5a34e2f036575fc2015589f958103d4feba2985f..581dc6bd7dc633a23aef606826023f9b642bdeff 100644 (file)
@@ -140,6 +140,7 @@ typedef __u64 __bitwise __addrpair;
  *     @skc_family: network address family
  *     @skc_state: Connection state
  *     @skc_reuse: %SO_REUSEADDR setting
+ *     @skc_reuseport: %SO_REUSEPORT setting
  *     @skc_bound_dev_if: bound device index if != 0
  *     @skc_bind_node: bind hash linkage for various protocol lookup tables
  *     @skc_portaddr_node: second hash linkage for UDP/UDP-Lite protocol
@@ -179,7 +180,8 @@ struct sock_common {
 
        unsigned short          skc_family;
        volatile unsigned char  skc_state;
-       unsigned char           skc_reuse;
+       unsigned char           skc_reuse:4;
+       unsigned char           skc_reuseport:4;
        int                     skc_bound_dev_if;
        union {
                struct hlist_node       skc_bind_node;
@@ -297,6 +299,7 @@ struct sock {
 #define sk_family              __sk_common.skc_family
 #define sk_state               __sk_common.skc_state
 #define sk_reuse               __sk_common.skc_reuse
+#define sk_reuseport           __sk_common.skc_reuseport
 #define sk_bound_dev_if                __sk_common.skc_bound_dev_if
 #define sk_bind_node           __sk_common.skc_bind_node
 #define sk_prot                        __sk_common.skc_prot
index 3f6a992014101e004fb1fa64e6cd3bb5d973ef2e..4ef3acbba5daeba94e21ab2a9c4700c9b9cf2108 100644 (file)
@@ -22,8 +22,7 @@
 #define SO_PRIORITY    12
 #define SO_LINGER      13
 #define SO_BSDCOMPAT   14
-/* To add :#define SO_REUSEPORT 15 */
-
+#define SO_REUSEPORT   15
 #ifndef SO_PASSCRED /* powerpc only differs in these */
 #define SO_PASSCRED    16
 #define SO_PEERCRED    17
index 8258fb741e9a1557c1345110c9b15958523e6507..235fb89e8973a864978c00acfa0dbc0173762082 100644 (file)
@@ -665,6 +665,9 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
        case SO_REUSEADDR:
                sk->sk_reuse = (valbool ? SK_CAN_REUSE : SK_NO_REUSE);
                break;
+       case SO_REUSEPORT:
+               sk->sk_reuseport = valbool;
+               break;
        case SO_TYPE:
        case SO_PROTOCOL:
        case SO_DOMAIN:
@@ -972,6 +975,10 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
                v.val = sk->sk_reuse;
                break;
 
+       case SO_REUSEPORT:
+               v.val = sk->sk_reuseport;
+               break;
+
        case SO_KEEPALIVE:
                v.val = sock_flag(sk, SOCK_KEEPOPEN);
                break;