From patchwork Sun Apr 3 03:08:06 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: 605500 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 3qd0SK05P3z9sD3 for ; Sun, 3 Apr 2016 13:08:33 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=WPL/uqxT; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752133AbcDCDI3 (ORCPT ); Sat, 2 Apr 2016 23:08:29 -0400 Received: from mail-qg0-f68.google.com ([209.85.192.68]:36384 "EHLO mail-qg0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750864AbcDCDIY (ORCPT ); Sat, 2 Apr 2016 23:08:24 -0400 Received: by mail-qg0-f68.google.com with SMTP id n34so14845795qge.3 for ; Sat, 02 Apr 2016 20:08:23 -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=WPL/uqxTJquCRPWg8zDc1l4O/vp4baFBTTDYjRtWR/4A5LUD3If+fFvDjkTMeCe89d VUA7ECgfWxjs+giZFzLEiq/OGiQiSDt7gPYjLRuOGIFTrU5fS3l3Y16BzNnnYTSH6hJa qZdMmb5lETDhZfCwe/pwdk3A2KI47ka0owU3DUxHRyA6BIt6Sbevar8aNh9obU9lIA17 AYpBlNfPbAF9krKgDp789iZA4hyoK6h2t1gtUMpxZF/WDqoH5y9OdJI2CW151jdDYrmB WqygjacOv2VpvNKHDpiw+Ritb9zocar2G0Uc9KyCy9p/zkwPD/dsNeJJIeJAQ0hup3Bu 1aSA== 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=ZeerGqad4HcSaOzLa3kgpmJAa7EeOrTbWfYJzPCZIbAqD4IBTx/2ogQ00E6cd63rPh bewy5zuJ68xpLHHZz07I1dqElL0u7rGy8tfDNyT/XHYb5Wmegf9dvBxLyGATBRjBpMxJ jUzL/DVQnvXO/3SUNRlsP3w9iCZaMnCyL2onbMuESTFfqID7ihC+3+R3YQyJUP87cUZA f9InOutaoPVXXMlZQjX5mEbGuPkBkA5NfUzcw1rkURvMjfwD+sheDQPtLVusAeboP6bO smQz9ukmwN0c6x2hvns234iRjKQafC5I8erHznnd3jMxAXxZiaxAgyxIsrRJnf3N0dWD 1Y6Q== X-Gm-Message-State: AD7BkJKn57i0POx73RbMnSM8qXk3d4yZzqE7smragVUw84tsuZwK/2vr2PMWAc1G1J4LFA== X-Received: by 10.140.230.18 with SMTP id a18mr35298061qhc.3.1459652903105; Sat, 02 Apr 2016 20:08:23 -0700 (PDT) Received: from soheil.nyc.corp.google.com ([100.101.230.231]) by smtp.gmail.com with ESMTPSA id r65sm9611121qki.17.2016.04.02.20.08.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 02 Apr 2016 20:08:22 -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 v3 net-next 1/8] sock: break up sock_cmsg_snd into __sock_cmsg_snd and loop Date: Sat, 2 Apr 2016 23:08:06 -0400 Message-Id: <1459652893-14207-2-git-send-email-soheil.kdev@gmail.com> X-Mailer: git-send-email 2.8.0.rc3.226.g39d4020 In-Reply-To: <1459652893-14207-1-git-send-email-soheil.kdev@gmail.com> References: <1459652893-14207-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; }