From patchwork Tue Jan 24 15:28:47 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Schultz X-Patchwork-Id: 719219 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.osmocom.org (lists.osmocom.org [144.76.43.76]) by ozlabs.org (Postfix) with ESMTP id 3v7BvK0zHWz9sxS for ; Wed, 25 Jan 2017 02:30:05 +1100 (AEDT) Received: from lists.osmocom.org (lists.osmocom.org [144.76.43.76]) by lists.osmocom.org (Postfix) with ESMTP id D9401280A2; Tue, 24 Jan 2017 15:30:03 +0000 (UTC) Authentication-Results: lists.osmocom.org; dmarc=none header.from=tpip.net X-Original-To: openbsc@lists.osmocom.org Delivered-To: openbsc@lists.osmocom.org Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=92.43.49.48; helo=mail.tpip.net; envelope-from=aschultz@tpip.net; receiver=openbsc@lists.osmocom.org Authentication-Results: lists.osmocom.org; dmarc=none header.from=tpip.net Received: from mail.tpip.net (mail.tpip.net [92.43.49.48]) by lists.osmocom.org (Postfix) with ESMTP id E926A29F80 for ; Tue, 24 Jan 2017 15:28:57 +0000 (UTC) Received: from office.tpip.net (unknown [153.92.65.89]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.tpip.net (Postfix) with ESMTPS id AC82B4F404; Tue, 24 Jan 2017 15:28:57 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by office.tpip.net (Postfix) with ESMTP id 85048A2CC7; Tue, 24 Jan 2017 16:28:57 +0100 (CET) Received: from office.tpip.net ([127.0.0.1]) by localhost (office.tpip.net [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id M0bY3u-N9RcT; Tue, 24 Jan 2017 16:28:57 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by office.tpip.net (Postfix) with ESMTP id 32231A2CC3; Tue, 24 Jan 2017 16:28:57 +0100 (CET) X-Virus-Scanned: amavisd-new at tpip.net Received: from office.tpip.net ([127.0.0.1]) by localhost (office.tpip.net [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id u3Zyeo1mhLn7; Tue, 24 Jan 2017 16:28:57 +0100 (CET) Received: from localhost.localdomain (pd95c9392.dip0.t-ipconnect.de [217.92.147.146]) by office.tpip.net (Postfix) with ESMTPSA id E02D7A2CC0; Tue, 24 Jan 2017 16:28:56 +0100 (CET) From: Andreas Schultz To: Pablo Neira Subject: [PATCH v2 17/18] gtp: add support to select a GTP socket during PDP context creation Date: Tue, 24 Jan 2017 16:28:47 +0100 Message-Id: <20170124152848.6120-18-aschultz@tpip.net> X-Mailer: git-send-email 2.10.2 In-Reply-To: <20170124152848.6120-1-aschultz@tpip.net> References: <20170124152848.6120-1-aschultz@tpip.net> X-BeenThere: openbsc@lists.osmocom.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "Development of OpenBSC, OsmoBSC, OsmoNITB, OsmoCSCN" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: netdev@vger.kernel.org, openbsc@lists.osmocom.org, Lionel Gauthier Errors-To: openbsc-bounces@lists.osmocom.org Sender: "OpenBSC" Signed-off-by: Andreas Schultz --- drivers/net/gtp.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 65 insertions(+), 3 deletions(-) diff --git a/drivers/net/gtp.c b/drivers/net/gtp.c index c6c1f0d..4637ce7 100644 --- a/drivers/net/gtp.c +++ b/drivers/net/gtp.c @@ -1023,6 +1023,7 @@ static int gtp_genl_new_pdp(struct sk_buff *skb, struct genl_info *info) struct net_device *dev; struct net *net; struct socket *sock; + int err; if (!info->attrs[GTPA_VERSION] || !info->attrs[GTPA_LINK] || @@ -1060,11 +1061,19 @@ static int gtp_genl_new_pdp(struct sk_buff *skb, struct genl_info *info) } put_net(net); - sock = gtp_genl_new_pdp_select_socket(version, dev); - if (!sock) + if (info->attrs[GTPA_FD]) + sock = sockfd_lookup(nla_get_u32(info->attrs[GTPA_FD]), &err); + else + sock = gtp_genl_new_pdp_select_socket(version, dev); + if (!sock || !sock->sk) return -ENODEV; - return ipv4_pdp_add(dev, sock->sk, info); + err = ipv4_pdp_add(dev, sock->sk, info); + + if (info->attrs[GTPA_FD]) + sockfd_put(sock); + + return err; } static struct pdp_ctx *gtp_genl_find_pdp_by_link(struct sk_buff *skb, @@ -1096,11 +1105,64 @@ static struct pdp_ctx *gtp_genl_find_pdp_by_link(struct sk_buff *skb, return ipv4_pdp_find(gtp, ms_addr); } +static struct pdp_ctx *gtp_genl_find_pdp_by_socket(struct sk_buff *skb, + struct genl_info *info) +{ + struct socket *sock; + struct gtp_sock *gsk; + struct pdp_ctx *pctx; + int fd, err = 0; + + if (!info->attrs[GTPA_FD]) + return ERR_PTR(-EINVAL); + + fd = nla_get_u32(info->attrs[GTPA_FD]); + sock = sockfd_lookup(fd, &err); + if (!sock) { + pr_debug("gtp socket fd=%d not found\n", fd); + return ERR_PTR(-EBADF); + } + + gsk = rcu_dereference_sk_user_data(sock->sk); + if (!gsk) { + pctx = ERR_PTR(-EINVAL); + goto out_sock; + } + + switch (nla_get_u32(info->attrs[GTPA_VERSION])) { + case GTP_V0: + if (!info->attrs[GTPA_TID]) { + pctx = ERR_PTR(-EINVAL); + break; + } + pctx = gtp0_pdp_find(gsk, nla_get_u64(info->attrs[GTPA_TID])); + break; + + case GTP_V1: + if (!info->attrs[GTPA_I_TEI]) { + pctx = ERR_PTR(-EINVAL); + break; + } + pctx = gtp1_pdp_find(gsk, nla_get_u64(info->attrs[GTPA_I_TEI])); + break; + + default: + pctx = ERR_PTR(-EINVAL); + break; + } + +out_sock: + sockfd_put(sock); + return pctx; +} + static struct pdp_ctx *gtp_genl_find_pdp(struct sk_buff *skb, struct genl_info *info) { if (info->attrs[GTPA_LINK]) return gtp_genl_find_pdp_by_link(skb, info); + else if (info->attrs[GTPA_FD]) + return gtp_genl_find_pdp_by_socket(skb, info); else return ERR_PTR(-EINVAL); }