From patchwork Fri Apr 1 15:04:33 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: 604874 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 3qc4Rg5xzYz9t3w for ; Sat, 2 Apr 2016 02:04:47 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=df0JjrWt; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758701AbcDAPEp (ORCPT ); Fri, 1 Apr 2016 11:04:45 -0400 Received: from mail-qk0-f196.google.com ([209.85.220.196]:33440 "EHLO mail-qk0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751876AbcDAPEo (ORCPT ); Fri, 1 Apr 2016 11:04:44 -0400 Received: by mail-qk0-f196.google.com with SMTP id q184so4712816qkb.0 for ; Fri, 01 Apr 2016 08:04:43 -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=df0JjrWt2l3XD4NMKvLkefLa3JBh78W9xZaxZxmdVWY5OXXtln5eXGaUyMsWvns6AC ElARgtIrPHVjAsWa/2OyDEG34Z2g+X98CefkYgR0A8a7QAahVcmVYb0MxvN2CgmnqbkX H7wolWy91trGv5Swiow/L0jGGW3ZA5LaJnqla2Sa/+a/kZSq9qk64oq7dXaYycqyWooe Vbd0ogXaCuR/5/p7L4a39m6n/OjQ0hnK4zLBROieM0gVUnDrbvf6zQ8JgeJ/tsuXNDc/ l03pOq+Da1G8aQEhMeWMYOFto4ICvupiJzZlo4Db7uLK+kJFTGP8j/6PcZ5yZWQRmMtE waOw== 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=N+0Gze00litR5IxuYi7av/UV5gEYQzT5IqKIkG0lzhN4DrE3veiRyFv6AEOqjLR0Xm 8vmvxeAVL1mQDZQ4FFhI9OO4pLag8l8WI1OwKHw+Gz0z3SV8pwA0IjptYG4WsPbBGx0p ULzVdOz1S2lzFImyKEnDPgnTJ+15d6lH8JcS2P3FV6DY9qu0N888eSvMyzOUeN5B4c31 sdjTW4bZ5ivuo5ftN26PdW5/PrfP1+w6E+gGBSycgXIKDKGwrxG2tINgbJtSvWC5GBgG ErIyNdTTGTYY924XfaYFqQaZsNaOlaWezH8qDKbi0NCSTdLx4POnL2rHO0YWGSVvti8h +ABg== X-Gm-Message-State: AD7BkJJNNFdKbIMpnakIZjvEF2kI3XfiHr80/CMOQ8LnbKv7Z3EJQos8B4sCyeJv9AposA== X-Received: by 10.55.31.215 with SMTP id n84mr19096567qkh.93.1459523083232; Fri, 01 Apr 2016 08:04:43 -0700 (PDT) Received: from soheil.nyc.corp.google.com ([100.101.230.231]) by smtp.gmail.com with ESMTPSA id d6sm6312885qkb.13.2016.04.01.08.04.42 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 01 Apr 2016 08:04:42 -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 v2 net-next 1/8] sock: break up sock_cmsg_snd into __sock_cmsg_snd and loop Date: Fri, 1 Apr 2016 11:04:33 -0400 Message-Id: <1459523080-29329-2-git-send-email-soheil.kdev@gmail.com> X-Mailer: git-send-email 2.8.0.rc3.226.g39d4020 In-Reply-To: <1459523080-29329-1-git-send-email-soheil.kdev@gmail.com> References: <1459523080-29329-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; }