From patchwork Wed Mar 30 22:37:21 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Soheil Hassas Yeganeh X-Patchwork-Id: 603679 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 3qb2bM2kGDz9sXQ for ; Thu, 31 Mar 2016 09:37:51 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=L8cQ0UGL; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755244AbcC3Wht (ORCPT ); Wed, 30 Mar 2016 18:37:49 -0400 Received: from mail-qg0-f65.google.com ([209.85.192.65]:33179 "EHLO mail-qg0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754574AbcC3Whs (ORCPT ); Wed, 30 Mar 2016 18:37:48 -0400 Received: by mail-qg0-f65.google.com with SMTP id y89so6192917qge.0 for ; Wed, 30 Mar 2016 15:37:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=nt5q0Wje3Ci9YW0xEY8q3rRVlUDoyoUonUdiCbJ/v6A=; b=L8cQ0UGLJQIfPTbg9GDuFZ6DzWbD1rFZgZTnypMO/gK48AzZLM98qI7qEF2tAoiv3v YeD8e+O6ozeTYiirrPr3k5pbEi0lmaL7aBynawXMt2/IHo5haEdfJujxMO910hGeLbTm RlPhrntY/52y5MR7Q0jfQiN7q6pTGLI9At4c/lHnsNCYhXvHnIHPIvdamZXXv8cuhSnn FUMGECh6QmGhjLZJFmJ6wA6YlqoESokbUYeGgYwuRExfcQKtumfC98mG9F6ScN870Zy2 ycjz0btrrpm9FMIX5UMcJfm8vb5uU0SsS2LTtZonPqzGOpTA9a67e3+fCyQ8t5GWWO7p ZofA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=nt5q0Wje3Ci9YW0xEY8q3rRVlUDoyoUonUdiCbJ/v6A=; b=Lly4dwwtCa1NDOJRV6kkald/4n6omw2GVjkyZEs+ACplMYbQCxi0iDoGl++R6NdWvJ LNi/IU4A6pMm1rNaHkZrYXm3QJhihVCProtaULMNs6nx69aHVsWqOASUslAWszWVSWrC r/CXNiVWQJhy2pTPzden+9Xu6w7lvorcYN2cASvFr/FIp55mvD0C+SeaPU1vmUne6w4T FNUT6aIac+E33PPLdjVY2H5EOr/qjMjTvNuHT2fgZyqsfX2i/ypiwRtA65cw3cugE69c 3b+PrwbpDOPdHykrLAZf5k6wlkypNZZmC8/DUNKpAV00TAk10di620Z2rhQo7vx+zs2m F6Bw== X-Gm-Message-State: AD7BkJIrSjgUfRd1HJ+keDSYnL1xXVcG9bPWo4cVpw+H9GOKjaVaZBWE9rKDWdG+ECdVcA== X-Received: by 10.140.95.117 with SMTP id h108mr12837337qge.65.1459377466897; Wed, 30 Mar 2016 15:37:46 -0700 (PDT) Received: from soheil.nyc.corp.google.com ([100.101.230.231]) by smtp.gmail.com with ESMTPSA id l67sm2782265qgl.47.2016.03.30.15.37.46 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 30 Mar 2016 15:37:46 -0700 (PDT) From: Soheil Hassas Yeganeh To: davem@davemloft.net, netdev@vger.kernel.org Cc: willemb@google.com, edumazet@google.com, ycheng@google.com, ncardwell@google.com, kafai@fb.com, Soheil Hassas Yeganeh Subject: [PATCH net-next 1/8] sock: break up sock_cmsg_snd into __sock_cmsg_snd and loop Date: Wed, 30 Mar 2016 18:37:21 -0400 Message-Id: <1459377448-2239-2-git-send-email-soheil.kdev@gmail.com> X-Mailer: git-send-email 2.8.0.rc3.226.g39d4020 In-Reply-To: <1459377448-2239-1-git-send-email-soheil.kdev@gmail.com> References: <1459377448-2239-1-git-send-email-soheil.kdev@gmail.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Willem de Bruijn To process cmsg's of the SOL_SOCKET level in addition to cmsgs of another level, protocols can call sock_cmsg_send(). This causes a double walk on the cmsghdr list, one for SOL_SOCKET and one for the other level. Extract the inner demultiplex logic from the loop that walks the list, to allow having this called directly from a walker in the protocol specific code. Signed-off-by: Willem de Bruijn Signed-off-by: Soheil Hassas Yeganeh --- include/net/sock.h | 2 ++ net/core/sock.c | 33 ++++++++++++++++++++++----------- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/include/net/sock.h b/include/net/sock.h index 255d3e0..03772d4 100644 --- a/include/net/sock.h +++ b/include/net/sock.h @@ -1420,6 +1420,8 @@ struct sockcm_cookie { u32 mark; }; +int __sock_cmsg_send(struct sock *sk, struct msghdr *msg, struct cmsghdr *cmsg, + struct sockcm_cookie *sockc); int sock_cmsg_send(struct sock *sk, struct msghdr *msg, struct sockcm_cookie *sockc); diff --git a/net/core/sock.c b/net/core/sock.c index b67b9ae..66976f8 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -1866,27 +1866,38 @@ struct sk_buff *sock_alloc_send_skb(struct sock *sk, unsigned long size, } EXPORT_SYMBOL(sock_alloc_send_skb); +int __sock_cmsg_send(struct sock *sk, struct msghdr *msg, struct cmsghdr *cmsg, + struct sockcm_cookie *sockc) +{ + switch (cmsg->cmsg_type) { + case SO_MARK: + if (!ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN)) + return -EPERM; + if (cmsg->cmsg_len != CMSG_LEN(sizeof(u32))) + return -EINVAL; + sockc->mark = *(u32 *)CMSG_DATA(cmsg); + break; + default: + return -EINVAL; + } + return 0; +} +EXPORT_SYMBOL(__sock_cmsg_send); + int sock_cmsg_send(struct sock *sk, struct msghdr *msg, struct sockcm_cookie *sockc) { struct cmsghdr *cmsg; + int ret; for_each_cmsghdr(cmsg, msg) { if (!CMSG_OK(msg, cmsg)) return -EINVAL; if (cmsg->cmsg_level != SOL_SOCKET) continue; - switch (cmsg->cmsg_type) { - case SO_MARK: - if (!ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN)) - return -EPERM; - if (cmsg->cmsg_len != CMSG_LEN(sizeof(u32))) - return -EINVAL; - sockc->mark = *(u32 *)CMSG_DATA(cmsg); - break; - default: - return -EINVAL; - } + ret = __sock_cmsg_send(sk, msg, cmsg, sockc); + if (ret) + return ret; } return 0; }