From patchwork Mon Jan 14 20:00:18 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Herbert X-Patchwork-Id: 211874 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 0E3872C00A6 for ; Tue, 15 Jan 2013 07:00:32 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758564Ab3ANUAY (ORCPT ); Mon, 14 Jan 2013 15:00:24 -0500 Received: from mail-la0-f74.google.com ([209.85.215.74]:49672 "EHLO mail-la0-f74.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757333Ab3ANUAV (ORCPT ); Mon, 14 Jan 2013 15:00:21 -0500 Received: by mail-la0-f74.google.com with SMTP id ej20so288356lab.3 for ; Mon, 14 Jan 2013 12:00:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:date:from:to:cc:subject:message-id:user-agent :mime-version:content-type; bh=fxuy6M67TXSRgTOVcXjlbv6uNQ0kdw2WSYNMkFXHGOI=; b=I/s5wMw5l9R69RPR929vwUqKfCD51L//XASmg2SnrCHUgF5FJ/YkAzRbui2odx1y6F hg8SBZNrmzzXvpwWnWIIX+QEk+Fr8mVDm9pq97Dtx4aTXYiR1XcnljBSq7O2oVqxmPVb VxGvZmnOMvDVaIDudXJpFelsNgcIzxCHUqD6i0e5cBg8+LN6p9edKJJYUk3sInUooUzm ckVFuBbl60Z6TUunNlgqsGAs3/SloiBQ3IvNy3/cBAHAILXC3G28l4/rgA+Xueba5DT7 3TRtIIElUrBdFMa4A4LNoWOpDNdCnmcl3SlnDwcI1Zw4/pvHNwk1Gjs4jbIK/LOhuLEr OHFQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:date:from:to:cc:subject:message-id:user-agent :mime-version:content-type:x-gm-message-state; bh=fxuy6M67TXSRgTOVcXjlbv6uNQ0kdw2WSYNMkFXHGOI=; b=GSu5QHxJcV9ERCIdh9swCXpIT2ODBr7wJXJzKAzbVaO4eqTOeD0K8aUPs3NC9fX5fX gflWohRHTyzo6DdQxwcbUTzozL3kVGrDmXPAuijJyug2EXGmjHo5TvKSP3b+lu01lJeq ObszHtqoB1bIER4NG4RN0x68cS/bvhWMvJeej5g2ipAsR03+/DkhTSUVOXLOpo8lLrVL pxiAeLLPy0uXeY4PrXjb+mMF0/UHfxMh/wCHV1BZzWhXyXohcXqJvfkHwBkGIYgN3sn9 AI5ytudhVrELBFxj+7Gk/nHYFex3luDYzKJRqOhvopAY+DNCkPHwSpXPiLz1leiWEmfc wbnw== X-Received: by 10.14.180.2 with SMTP id i2mr23345840eem.1.1358193619697; Mon, 14 Jan 2013 12:00:19 -0800 (PST) Received: from hpza10.eem.corp.google.com ([74.125.121.33]) by gmr-mx.google.com with ESMTPS id z44si5288233een.0.2013.01.14.12.00.19 (version=TLSv1 cipher=AES128-SHA bits=128/128); Mon, 14 Jan 2013 12:00:19 -0800 (PST) Received: from pokey.mtv.corp.google.com (pokey.mtv.corp.google.com [172.17.131.25]) by hpza10.eem.corp.google.com (Postfix) with ESMTP id 3A93E20005C; Mon, 14 Jan 2013 12:00:19 -0800 (PST) Received: by pokey.mtv.corp.google.com (Postfix, from userid 60832) id 9C56C22F058; Mon, 14 Jan 2013 12:00:18 -0800 (PST) Received: from localhost (localhost [127.0.0.1]) by pokey.mtv.corp.google.com (Postfix) with ESMTP id 9B84C22F04A; Mon, 14 Jan 2013 12:00:18 -0800 (PST) Date: Mon, 14 Jan 2013 12:00:18 -0800 (PST) From: Tom Herbert To: netdev@vger.kernel.org, davem@davemloft.net cc: netdev@markandruth.co.uk, eric.dumazet@gmail.com Subject: [PATCH 1/5] soreuseport: infrastructure Message-ID: User-Agent: Alpine 2.00 (DEB 1167 2008-08-23) MIME-Version: 1.0 X-Gm-Message-State: ALoCoQmAA+tsB+0Nv/qZdOofSnCkbWr5lsmM8/8C443rtodWg7TQP/lMUiWdapU8ZAly6WQdleqk4flHQSlwDgsM0PftvCue2RY+yJpfWbf0Rf7WsflGJ8F/lJz7ArFzMWV6xDhjZk35Si67vzaGU5XX6zurplCT/QOR/Llb5KMvIcgJKz6oFCIbWVpVXxShpeMN1P+8xb/3 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Definitions and macros for implementing soreusport. Signed-off-by: Tom Herbert --- include/linux/random.h | 6 ++++++ include/net/sock.h | 5 ++++- include/uapi/asm-generic/socket.h | 3 +-- net/core/sock.c | 7 +++++++ 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/include/linux/random.h b/include/linux/random.h index d984608..347ce55 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) } #endif +/* Pseudo random number generator from numerical recipes. */ +static inline u32 next_pseudo_random32(u32 seed) +{ + return seed * 1664525 + 1013904223; +} + #endif /* _LINUX_RANDOM_H */ diff --git a/include/net/sock.h b/include/net/sock.h index 182ca99..360b412 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -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 diff --git a/include/uapi/asm-generic/socket.h b/include/uapi/asm-generic/socket.h index 2d32d07..331e322 100644 --- a/include/uapi/asm-generic/socket.h +++ b/include/uapi/asm-generic/socket.h @@ -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 diff --git a/net/core/sock.c b/net/core/sock.c index bc131d4..0040832 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, 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: @@ -965,6 +968,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;