From: Andreas Schultz <aschultz@tpip.net>
To: Pablo Neira <pablo@netfilter.org>
Cc: netdev@vger.kernel.org, Harald Welte <laforge@gnumonks.org>,
Lionel Gauthier <Lionel.Gauthier@eurecom.fr>,
openbsc@lists.osmocom.org
Subject: [PATCH 17/17] gtp: add support to select a GTP socket during PDP context creation
Date: Mon, 23 Jan 2017 12:57:06 +0100 [thread overview]
Message-ID: <20170123115706.4354-18-aschultz@tpip.net> (raw)
In-Reply-To: <20170123115706.4354-1-aschultz@tpip.net>
Signed-off-by: Andreas Schultz <aschultz@tpip.net>
---
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 157cf40..53faaa4 100644
--- a/drivers/net/gtp.c
+++ b/drivers/net/gtp.c
@@ -1016,6 +1016,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] ||
@@ -1053,11 +1054,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,
@@ -1089,11 +1098,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);
}
--
2.10.2
prev parent reply other threads:[~2017-01-23 12:06 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-01-23 11:56 [PATCH 00/17] gtp: fixes and support multiple VRF's per GTP socket Andreas Schultz
2017-01-23 11:56 ` [PATCH 01/17] gtp: add genl family modules alias Andreas Schultz
2017-01-23 11:56 ` [PATCH 02/17] gtp: clear DF bit on GTP packet tx Andreas Schultz
2017-01-23 11:56 ` [PATCH 03/17] gtp: make GTP sockets in gtp_newlink optional Andreas Schultz
2017-01-23 11:56 ` [PATCH 04/17] gtp: return error ptr in find pdp helpers Andreas Schultz
2017-01-23 11:56 ` [PATCH 05/17] gtp: unify genl_find_pdp and prepare for per socket lookup Andreas Schultz
2017-01-23 11:56 ` [PATCH 06/17] gtp: fix cross netns recv on gtp socket Andreas Schultz
2017-01-23 11:56 ` [PATCH 07/17] gtp: remove unnecessary rcu_read_lock Andreas Schultz
2017-01-23 11:56 ` [PATCH 08/17] gtp: consolidate pdp context destruction into helper Andreas Schultz
2017-01-23 11:56 ` [PATCH 09/17] gtp: use addr_hash when traversing pdp contexts Andreas Schultz
2017-01-23 11:56 ` [PATCH 10/17] gtp: add socket to pdp context Andreas Schultz
2017-01-23 11:57 ` [PATCH 11/17] gtp: consolidate gtp socket rx path Andreas Schultz
2017-01-23 11:57 ` [PATCH 12/17] gtp: let userspace handle packets for invalid tunnels Andreas Schultz
2017-01-23 11:57 ` [PATCH 13/17] gtp: replace netdev_dbg and KERN_DEBUG printk with pr_debug Andreas Schultz
2017-01-23 11:57 ` [PATCH 14/17] gtp: move TEID hash to per socket structure Andreas Schultz
2017-01-23 11:57 ` [PATCH 15/17] gtp: rename gtp hashtable helpers Andreas Schultz
2017-01-23 11:57 ` [PATCH 16/17] gtp: add genl cmd to enable GTP encapsulation on UDP socket Andreas Schultz
2017-01-23 11:57 ` Andreas Schultz [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170123115706.4354-18-aschultz@tpip.net \
--to=aschultz@tpip.net \
--cc=Lionel.Gauthier@eurecom.fr \
--cc=laforge@gnumonks.org \
--cc=netdev@vger.kernel.org \
--cc=openbsc@lists.osmocom.org \
--cc=pablo@netfilter.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.