From patchwork Wed Mar 22 22:59:13 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "R. Parameswaran" X-Patchwork-Id: 742370 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 3vpQ9n3Psbz9s7f for ; Thu, 23 Mar 2017 09:59:41 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="jFedh3PJ"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754105AbdCVW7a (ORCPT ); Wed, 22 Mar 2017 18:59:30 -0400 Received: from mail-pf0-f194.google.com ([209.85.192.194]:34183 "EHLO mail-pf0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753610AbdCVW71 (ORCPT ); Wed, 22 Mar 2017 18:59:27 -0400 Received: by mail-pf0-f194.google.com with SMTP id o126so28910404pfb.1; Wed, 22 Mar 2017 15:59:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:date:to:cc:subject:message-id:user-agent:mime-version; bh=zcNNo6QaFcNZLm7naBka5UctO4V6mmewvuKx5c2IW1A=; b=jFedh3PJ4/wtqe0Rva3Qps5v+vmgFhBZHt6fanymIuN2mvpLMARekUC5/ikOEprM1d wt9pdc8OrRqzrcOZqJUpNQN6kJsDmu1/j9wo7pVA6YpfElONS+oYDktRP60etGQlYzkD WMb51ESP93YVCSUlG9+aM0ujcBpW91A8UrNf7O3h472h3kyyeZcgpwRSL53+HGRjinll 8VykfRpUIONxxFRsH7w1MFCevjRL4Z1Gb2wvCDgyXTIkUxYgGKs/SuiAm4o7PIu5R2ur bocYek6Y35GeucuGa3YzQgU3yrDqYhdBIUj5CVBY6xJx52V6MGMa+LxCEjXAIZQ8w498 YgQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:date:to:cc:subject:message-id:user-agent :mime-version; bh=zcNNo6QaFcNZLm7naBka5UctO4V6mmewvuKx5c2IW1A=; b=FG1qU9novrCTaDCd4UCYEx27ocI9yMBOtEkZmHMerrcD0GVNy0I6CgwqovQ00vE5LX 5HM8CQdvF1GuQaUblPNjgLPWz1staNiaOa6DFfVD5el7VTOfj6saIqb6sv4eWu/h3hp6 0hEs3H3OB9x3wY2pw1HCzj/6lfN1MZTA/p/ewYIookr1HDJobUve+7rFvC8yZAtaJhkx snzjUGg/wJaqWU6Qp2rztyehknWtZGEGZVTV6HKN6c97uXFtXxUXzd8lRz1w6Rvi1fgp ReOaO7NhcqzvCN1+4PsuC6bvxDTOMXKBHwAj4MTmH/uax4f14vSaiU0neFvlAyOAnq7/ uG/g== X-Gm-Message-State: AFeK/H34pwayPMNGKoOBYFLp7dRnoOjGMTcIPVDzmnfnW0sIPiDmQmG02rm87y9ecRbwYA== X-Received: by 10.84.230.131 with SMTP id e3mr50305099plk.100.1490223566096; Wed, 22 Mar 2017 15:59:26 -0700 (PDT) Received: from vera100 ([144.49.131.1]) by smtp.gmail.com with ESMTPSA id n85sm5867183pfi.101.2017.03.22.15.59.25 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 22 Mar 2017 15:59:25 -0700 (PDT) From: "R. Parameswaran" X-Google-Original-From: "R. Parameswaran" Date: Wed, 22 Mar 2017 15:59:13 -0700 (PDT) To: netdev@vger.kernel.org cc: kleptog@svana.org, jchapman@katalix.com, davem@redhat.com, nprachan@brocade.com, rshearma@brocade.com, stephen@networkplumber.org, sdietric@brocade.com, ciwillia@brocade.com, lboccass@brocade.com, dfawcus@brocade.com, bhong@brocade.com, jblunck@brocade.com, linux-kernel@vger.kernel.org Subject: [PATCH net-next v4 1/2] New kernel function to get IP overhead on a socket. Message-ID: User-Agent: Alpine 2.11 (DEB 23 2013-08-11) MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org A new function, kernel_sock_ip_overhead(), is provided to calculate the cumulative overhead imposed by the IP Header and IP options, if any, on a socket's payload. The new function returns an overhead of zero for sockets that do not belong to the IPv4 or IPv6 address families. Signed-off-by: R. Parameswaran --- include/linux/net.h | 3 +++ net/socket.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/include/linux/net.h b/include/linux/net.h index 0620f5e..a42fab2 100644 --- a/include/linux/net.h +++ b/include/linux/net.h @@ -298,6 +298,9 @@ int kernel_sendpage(struct socket *sock, struct page *page, int offset, int kernel_sock_ioctl(struct socket *sock, int cmd, unsigned long arg); int kernel_sock_shutdown(struct socket *sock, enum sock_shutdown_cmd how); +/* Following routine returns the IP overhead imposed by a socket. */ +u32 kernel_sock_ip_overhead(struct sock *sk); + #define MODULE_ALIAS_NETPROTO(proto) \ MODULE_ALIAS("net-pf-" __stringify(proto)) diff --git a/net/socket.c b/net/socket.c index e034fe4..69598e1 100644 --- a/net/socket.c +++ b/net/socket.c @@ -3345,3 +3345,47 @@ int kernel_sock_shutdown(struct socket *sock, enum sock_shutdown_cmd how) return sock->ops->shutdown(sock, how); } EXPORT_SYMBOL(kernel_sock_shutdown); + +/* This routine returns the IP overhead imposed by a socket i.e. + * the length of the underlying IP header, depending on whether + * this is an IPv4 or IPv6 socket and the length from IP options turned + * on at the socket. + */ +u32 kernel_sock_ip_overhead(struct sock *sk) +{ + struct inet_sock *inet; + struct ipv6_pinfo *np; + struct ip_options_rcu *opt; + struct ipv6_txoptions *optv6 = NULL; + u32 overhead = 0; + bool owned_by_user; + + if (!sk) + return overhead; + + owned_by_user = sock_owned_by_user(sk); + switch (sk->sk_family) { + case AF_INET: + inet = inet_sk(sk); + overhead += sizeof(struct iphdr); + opt = rcu_dereference_protected(inet->inet_opt, + owned_by_user); + if (opt) + overhead += opt->opt.optlen; + return overhead; +#if IS_ENABLED(CONFIG_IPV6) + case AF_INET6: + np = inet6_sk(sk); + overhead += sizeof(struct ipv6hdr); + if (np) + optv6 = rcu_dereference_protected(np->opt, + owned_by_user); + if (optv6) + overhead += (optv6->opt_flen + optv6->opt_nflen); + return overhead; +#endif /* IS_ENABLED(CONFIG_IPV6) */ + default: /* Returns 0 overhead if the socket is not ipv4 or ipv6 */ + return overhead; + } +} +EXPORT_SYMBOL(kernel_sock_ip_overhead);