From: Geliang Tang <tanggeliang@kylinos.cn>
With the previous commit, we can reuse the send_nlmsg() code in
get_addr() interfaces between the netlink PM and userspace PM.
They only need to implement their own get_addr() interfaces to
hold the different locks, get the entry from the different lists,
then release the locks.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
net/mptcp/pm_netlink.c | 58 ++++++++++++++++++++--------------------
net/mptcp/pm_userspace.c | 32 ----------------------
2 files changed, 29 insertions(+), 61 deletions(-)
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index b646f97f6afe..ef47b54d8328 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -1795,21 +1795,7 @@ static int mptcp_pm_nl_get_addr(u8 id, struct mptcp_pm_addr_entry *addr,
{
struct pm_nl_pernet *pernet = genl_info_pm_nl(info);
struct mptcp_pm_addr_entry *entry;
- struct sk_buff *msg;
int ret = -EINVAL;
- void *reply;
-
- msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
- if (!msg)
- return -ENOMEM;
-
- reply = genlmsg_put_reply(msg, info, &mptcp_genl_family, 0,
- info->genlhdr->cmd);
- if (!reply) {
- GENL_SET_ERR_MSG(info, "not enough space in Netlink message");
- ret = -EMSGSIZE;
- goto fail;
- }
spin_lock_bh(&pernet->lock);
entry = __lookup_addr_by_id(pernet, id);
@@ -1819,21 +1805,6 @@ static int mptcp_pm_nl_get_addr(u8 id, struct mptcp_pm_addr_entry *addr,
}
spin_unlock_bh(&pernet->lock);
- if (ret) {
- GENL_SET_ERR_MSG(info, "address not found");
- goto fail;
- }
-
- ret = mptcp_nl_fill_addr(msg, addr);
- if (ret)
- goto fail;
-
- genlmsg_end(msg, reply);
- ret = genlmsg_reply(msg, info);
- return ret;
-
-fail:
- nlmsg_free(msg);
return ret;
}
@@ -1849,13 +1820,42 @@ int mptcp_pm_nl_get_addr_doit(struct sk_buff *skb, struct genl_info *info)
{
struct nlattr *attr = info->attrs[MPTCP_PM_ENDPOINT_ADDR];
struct mptcp_pm_addr_entry addr;
+ struct sk_buff *msg;
+ void *reply;
int ret;
ret = mptcp_pm_parse_entry(attr, info, false, &addr);
if (ret < 0)
return ret;
+ msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
+ if (!msg)
+ return -ENOMEM;
+
+ reply = genlmsg_put_reply(msg, info, &mptcp_genl_family, 0,
+ info->genlhdr->cmd);
+ if (!reply) {
+ GENL_SET_ERR_MSG(info, "not enough space in Netlink message");
+ ret = -EMSGSIZE;
+ goto fail;
+ }
+
ret = mptcp_pm_get_addr(addr.addr.id, &addr, info);
+ if (ret) {
+ GENL_SET_ERR_MSG(info, "address not found");
+ goto fail;
+ }
+
+ ret = mptcp_nl_fill_addr(msg, &addr);
+ if (ret)
+ goto fail;
+
+ genlmsg_end(msg, reply);
+ ret = genlmsg_reply(msg, info);
+ return ret;
+
+fail:
+ nlmsg_free(msg);
return ret;
}
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index 80cb2c6508ba..7c0bb084303b 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -675,10 +675,8 @@ int mptcp_userspace_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr,
struct net *net = genl_info_net(info);
struct mptcp_pm_addr_entry *entry;
struct mptcp_sock *msk;
- struct sk_buff *msg;
int ret = -EINVAL;
struct sock *sk;
- void *reply;
msk = mptcp_token_get_sock(net, nla_get_u32(token));
if (!msk) {
@@ -693,20 +691,6 @@ int mptcp_userspace_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr,
goto out;
}
- msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
- if (!msg) {
- ret = -ENOMEM;
- goto out;
- }
-
- reply = genlmsg_put_reply(msg, info, &mptcp_genl_family, 0,
- info->genlhdr->cmd);
- if (!reply) {
- GENL_SET_ERR_MSG(info, "not enough space in Netlink message");
- ret = -EMSGSIZE;
- goto fail;
- }
-
lock_sock(sk);
spin_lock_bh(&msk->pm.lock);
entry = mptcp_userspace_pm_lookup_addr_by_id(msk, id);
@@ -717,22 +701,6 @@ int mptcp_userspace_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr,
spin_unlock_bh(&msk->pm.lock);
release_sock(sk);
- if (ret) {
- GENL_SET_ERR_MSG(info, "address not found");
- goto fail;
- }
-
- ret = mptcp_nl_fill_addr(msg, addr);
- if (ret)
- goto fail;
-
- genlmsg_end(msg, reply);
- ret = genlmsg_reply(msg, info);
- sock_put(sk);
- return ret;
-
-fail:
- nlmsg_free(msg);
out:
sock_put(sk);
return ret;
--
2.43.0