Definitions and macros for implementing soreusport.
Signed-off-by: Tom Herbert <therbert@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
 #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
 
 #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
 
 #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
 
 #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
 
 #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
 
 #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
 
 #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
 
 #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.  */
 
 #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
 
 #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
 
 #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
 
 #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
 
 #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
 
 #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
 
 }
 #endif
 
+/* Pseudo random number generator from numerical recipes. */
+static inline u32 next_pseudo_random32(u32 seed)
+{
+       return seed * 1664525 + 1013904223;
+}
+
 #endif /* _LINUX_RANDOM_H */
 
  *     @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
 
        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;
 #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
 
 #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
 
        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:
                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;