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 3/6] gtp: unify genl_find_pdp and prepare for per socket lookup
Date: Mon, 30 Jan 2017 17:31:57 +0100 [thread overview]
Message-ID: <20170130163200.17070-4-aschultz@tpip.net> (raw)
In-Reply-To: <20170130163200.17070-1-aschultz@tpip.net>
This unifies duplicate code into a helper. It also prepares the
groundwork to add a lookup version that uses the socket to find
attache pdp contexts.
Signed-off-by: Andreas Schultz <aschultz@tpip.net>
---
drivers/net/gtp.c | 120 +++++++++++++++++++++++-------------------------------
1 file changed, 51 insertions(+), 69 deletions(-)
diff --git a/drivers/net/gtp.c b/drivers/net/gtp.c
index c96c71f..6b7a3c2 100644
--- a/drivers/net/gtp.c
+++ b/drivers/net/gtp.c
@@ -1027,47 +1027,62 @@ static int gtp_genl_new_pdp(struct sk_buff *skb, struct genl_info *info)
return err;
}
+static struct pdp_ctx *gtp_genl_find_pdp_by_link(struct sk_buff *skb,
+ struct genl_info *info)
+{
+ struct gtp_dev *gtp;
+
+ gtp = gtp_genl_find_dev(sock_net(skb->sk), info->attrs);
+ if (!gtp)
+ return ERR_PTR(-ENODEV);
+
+ if (info->attrs[GTPA_MS_ADDRESS]) {
+ __be32 ip = nla_get_be32(info->attrs[GTPA_MS_ADDRESS]);
+
+ return ipv4_pdp_find(gtp, ip);
+ } else if (info->attrs[GTPA_VERSION]) {
+ u32 gtp_version = nla_get_u32(info->attrs[GTPA_VERSION]);
+
+ if (gtp_version == GTP_V0 && info->attrs[GTPA_TID])
+ return gtp0_pdp_find(gtp, nla_get_u64(
+ info->attrs[GTPA_TID]));
+ else if (gtp_version == GTP_V1 && info->attrs[GTPA_I_TEI])
+ return gtp1_pdp_find(gtp, nla_get_u32(
+ info->attrs[GTPA_I_TEI]));
+ }
+
+ return ERR_PTR(-EINVAL);
+}
+
+static struct pdp_ctx *gtp_genl_find_pdp(struct sk_buff *skb,
+ struct genl_info *info)
+{
+ struct pdp_ctx *pctx;
+
+ if (info->attrs[GTPA_LINK])
+ pctx = gtp_genl_find_pdp_by_link(skb, info);
+ else
+ pctx = ERR_PTR(-EINVAL);
+
+ if (!pctx)
+ pctx = ERR_PTR(-ENOENT);
+
+ return pctx;
+}
+
static int gtp_genl_del_pdp(struct sk_buff *skb, struct genl_info *info)
{
struct pdp_ctx *pctx;
- struct gtp_dev *gtp;
int err = 0;
- if (!info->attrs[GTPA_VERSION] ||
- !info->attrs[GTPA_LINK])
+ if (!info->attrs[GTPA_VERSION])
return -EINVAL;
rcu_read_lock();
- gtp = gtp_genl_find_dev(sock_net(skb->sk), info->attrs);
- if (!gtp) {
- err = -ENODEV;
- goto out_unlock;
- }
-
- switch (nla_get_u32(info->attrs[GTPA_VERSION])) {
- case GTP_V0:
- if (!info->attrs[GTPA_TID]) {
- err = -EINVAL;
- goto out_unlock;
- }
- pctx = gtp0_pdp_find(gtp, nla_get_u64(info->attrs[GTPA_TID]));
- break;
- case GTP_V1:
- if (!info->attrs[GTPA_I_TEI]) {
- err = -EINVAL;
- goto out_unlock;
- }
- pctx = gtp1_pdp_find(gtp, nla_get_u64(info->attrs[GTPA_I_TEI]));
- break;
-
- default:
- err = -EINVAL;
- goto out_unlock;
- }
-
- if (!pctx) {
- err = -ENOENT;
+ pctx = gtp_genl_find_pdp(skb, info);
+ if (IS_ERR(pctx)) {
+ err = PTR_ERR(pctx);
goto out_unlock;
}
@@ -1129,49 +1144,16 @@ static int gtp_genl_get_pdp(struct sk_buff *skb, struct genl_info *info)
{
struct pdp_ctx *pctx = NULL;
struct sk_buff *skb2;
- struct gtp_dev *gtp;
- u32 gtp_version;
int err;
- if (!info->attrs[GTPA_VERSION] ||
- !info->attrs[GTPA_LINK])
+ if (!info->attrs[GTPA_VERSION])
return -EINVAL;
- gtp_version = nla_get_u32(info->attrs[GTPA_VERSION]);
- switch (gtp_version) {
- case GTP_V0:
- case GTP_V1:
- break;
- default:
- return -EINVAL;
- }
-
rcu_read_lock();
- gtp = gtp_genl_find_dev(sock_net(skb->sk), info->attrs);
- if (!gtp) {
- err = -ENODEV;
- goto err_unlock;
- }
-
- if (gtp_version == GTP_V0 &&
- info->attrs[GTPA_TID]) {
- u64 tid = nla_get_u64(info->attrs[GTPA_TID]);
-
- pctx = gtp0_pdp_find(gtp, tid);
- } else if (gtp_version == GTP_V1 &&
- info->attrs[GTPA_I_TEI]) {
- u32 tid = nla_get_u32(info->attrs[GTPA_I_TEI]);
-
- pctx = gtp1_pdp_find(gtp, tid);
- } else if (info->attrs[GTPA_MS_ADDRESS]) {
- __be32 ip = nla_get_be32(info->attrs[GTPA_MS_ADDRESS]);
-
- pctx = ipv4_pdp_find(gtp, ip);
- }
-
- if (pctx == NULL) {
- err = -ENOENT;
+ pctx = gtp_genl_find_pdp(skb, info);
+ if (IS_ERR(pctx)) {
+ err = PTR_ERR(pctx);
goto err_unlock;
}
--
2.10.2
next prev parent reply other threads:[~2017-01-30 16:42 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-01-30 16:31 [PATCH 0/6] gtp: misc improvements Andreas Schultz
2017-01-30 16:31 ` [PATCH 1/6] gtp: make GTP sockets in gtp_newlink optional Andreas Schultz
2017-01-30 16:31 ` [PATCH 2/6] gtp: merge gtp_get_net and gtp_genl_find_dev Andreas Schultz
2017-01-30 16:31 ` Andreas Schultz [this message]
2017-01-30 16:31 ` [PATCH 4/6] gtp: consolidate pdp context destruction into helper Andreas Schultz
2017-01-30 16:31 ` [PATCH 5/6] gtp: add socket to pdp context Andreas Schultz
2017-01-30 16:32 ` [PATCH 6/6] gtp: consolidate gtp socket rx path Andreas Schultz
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=20170130163200.17070-4-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.