Skip to content

Commit 9ab4807

Browse files
kmaloordavem330
authored andcommitted
mptcp: netlink: Add MPTCP_PM_CMD_ANNOUNCE
This change adds a MPTCP netlink interface for issuing ADD_ADDR advertisements over the chosen MPTCP connection from a userspace path manager. The command requires the following parameters: { token, { loc_id, family, daddr4 | daddr6 [, dport] } [, if_idx], flags[signal] }. Acked-by: Paolo Abeni <[email protected]> Signed-off-by: Kishen Maloor <[email protected]> Signed-off-by: Mat Martineau <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 982f17b commit 9ab4807

File tree

4 files changed

+81
-5
lines changed

4 files changed

+81
-5
lines changed

include/uapi/linux/mptcp.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ enum {
5555
MPTCP_PM_ATTR_ADDR, /* nested address */
5656
MPTCP_PM_ATTR_RCV_ADD_ADDRS, /* u32 */
5757
MPTCP_PM_ATTR_SUBFLOWS, /* u32 */
58+
MPTCP_PM_ATTR_TOKEN, /* u32 */
5859

5960
__MPTCP_PM_ATTR_MAX
6061
};
@@ -93,6 +94,7 @@ enum {
9394
MPTCP_PM_CMD_SET_LIMITS,
9495
MPTCP_PM_CMD_GET_LIMITS,
9596
MPTCP_PM_CMD_SET_FLAGS,
97+
MPTCP_PM_CMD_ANNOUNCE,
9698

9799
__MPTCP_PM_CMD_AFTER_LAST
98100
};

net/mptcp/pm_netlink.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -352,8 +352,8 @@ mptcp_pm_del_add_timer(struct mptcp_sock *msk,
352352
return entry;
353353
}
354354

355-
static bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk,
356-
const struct mptcp_pm_addr_entry *entry)
355+
bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk,
356+
const struct mptcp_pm_addr_entry *entry)
357357
{
358358
struct mptcp_pm_add_entry *add_entry = NULL;
359359
struct sock *sk = (struct sock *)msk;
@@ -1094,6 +1094,7 @@ static const struct nla_policy mptcp_pm_policy[MPTCP_PM_ATTR_MAX + 1] = {
10941094
NLA_POLICY_NESTED(mptcp_pm_addr_policy),
10951095
[MPTCP_PM_ATTR_RCV_ADD_ADDRS] = { .type = NLA_U32, },
10961096
[MPTCP_PM_ATTR_SUBFLOWS] = { .type = NLA_U32, },
1097+
[MPTCP_PM_ATTR_TOKEN] = { .type = NLA_U32, },
10971098
};
10981099

10991100
void mptcp_pm_nl_subflow_chk_stale(const struct mptcp_sock *msk, struct sock *ssk)
@@ -1203,9 +1204,9 @@ static int mptcp_pm_parse_pm_addr_attr(struct nlattr *tb[],
12031204
return err;
12041205
}
12051206

1206-
static int mptcp_pm_parse_entry(struct nlattr *attr, struct genl_info *info,
1207-
bool require_family,
1208-
struct mptcp_pm_addr_entry *entry)
1207+
int mptcp_pm_parse_entry(struct nlattr *attr, struct genl_info *info,
1208+
bool require_family,
1209+
struct mptcp_pm_addr_entry *entry)
12091210
{
12101211
struct nlattr *tb[MPTCP_PM_ADDR_ATTR_MAX + 1];
12111212
int err;
@@ -2198,6 +2199,11 @@ static const struct genl_small_ops mptcp_pm_ops[] = {
21982199
.doit = mptcp_nl_cmd_set_flags,
21992200
.flags = GENL_ADMIN_PERM,
22002201
},
2202+
{
2203+
.cmd = MPTCP_PM_CMD_ANNOUNCE,
2204+
.doit = mptcp_nl_cmd_announce,
2205+
.flags = GENL_ADMIN_PERM,
2206+
},
22012207
};
22022208

22032209
static struct genl_family mptcp_genl_family __ro_after_init = {

net/mptcp/pm_userspace.c

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,3 +119,64 @@ int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
119119

120120
return mptcp_userspace_pm_append_new_local_addr(msk, &new_entry);
121121
}
122+
123+
int mptcp_nl_cmd_announce(struct sk_buff *skb, struct genl_info *info)
124+
{
125+
struct nlattr *token = info->attrs[MPTCP_PM_ATTR_TOKEN];
126+
struct nlattr *addr = info->attrs[MPTCP_PM_ATTR_ADDR];
127+
struct mptcp_pm_addr_entry addr_val;
128+
struct mptcp_sock *msk;
129+
int err = -EINVAL;
130+
u32 token_val;
131+
132+
if (!addr || !token) {
133+
GENL_SET_ERR_MSG(info, "missing required inputs");
134+
return err;
135+
}
136+
137+
token_val = nla_get_u32(token);
138+
139+
msk = mptcp_token_get_sock(sock_net(skb->sk), token_val);
140+
if (!msk) {
141+
NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token");
142+
return err;
143+
}
144+
145+
if (!mptcp_pm_is_userspace(msk)) {
146+
GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected");
147+
goto announce_err;
148+
}
149+
150+
err = mptcp_pm_parse_entry(addr, info, true, &addr_val);
151+
if (err < 0) {
152+
GENL_SET_ERR_MSG(info, "error parsing local address");
153+
goto announce_err;
154+
}
155+
156+
if (addr_val.addr.id == 0 || !(addr_val.flags & MPTCP_PM_ADDR_FLAG_SIGNAL)) {
157+
GENL_SET_ERR_MSG(info, "invalid addr id or flags");
158+
goto announce_err;
159+
}
160+
161+
err = mptcp_userspace_pm_append_new_local_addr(msk, &addr_val);
162+
if (err < 0) {
163+
GENL_SET_ERR_MSG(info, "did not match address and id");
164+
goto announce_err;
165+
}
166+
167+
lock_sock((struct sock *)msk);
168+
spin_lock_bh(&msk->pm.lock);
169+
170+
if (mptcp_pm_alloc_anno_list(msk, &addr_val)) {
171+
mptcp_pm_announce_addr(msk, &addr_val.addr, false);
172+
mptcp_pm_nl_addr_send_ack(msk);
173+
}
174+
175+
spin_unlock_bh(&msk->pm.lock);
176+
release_sock((struct sock *)msk);
177+
178+
err = 0;
179+
announce_err:
180+
sock_put((struct sock *)msk);
181+
return err;
182+
}

net/mptcp/protocol.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <net/tcp.h>
1212
#include <net/inet_connection_sock.h>
1313
#include <uapi/linux/mptcp.h>
14+
#include <net/genetlink.h>
1415

1516
#define MPTCP_SUPPORTED_VERSION 1
1617

@@ -755,6 +756,9 @@ u16 __mptcp_make_csum(u64 data_seq, u32 subflow_seq, u16 data_len, __wsum sum);
755756
void __init mptcp_pm_init(void);
756757
void mptcp_pm_data_init(struct mptcp_sock *msk);
757758
void mptcp_pm_data_reset(struct mptcp_sock *msk);
759+
int mptcp_pm_parse_entry(struct nlattr *attr, struct genl_info *info,
760+
bool require_family,
761+
struct mptcp_pm_addr_entry *entry);
758762
void mptcp_pm_subflow_chk_stale(const struct mptcp_sock *msk, struct sock *ssk);
759763
void mptcp_pm_nl_subflow_chk_stale(const struct mptcp_sock *msk, struct sock *ssk);
760764
void mptcp_pm_new_connection(struct mptcp_sock *msk, const struct sock *ssk, int server_side);
@@ -775,6 +779,8 @@ void mptcp_pm_rm_addr_received(struct mptcp_sock *msk,
775779
const struct mptcp_rm_list *rm_list);
776780
void mptcp_pm_mp_prio_received(struct sock *sk, u8 bkup);
777781
void mptcp_pm_mp_fail_received(struct sock *sk, u64 fail_seq);
782+
bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk,
783+
const struct mptcp_pm_addr_entry *entry);
778784
void mptcp_pm_free_anno_list(struct mptcp_sock *msk);
779785
bool mptcp_pm_sport_in_anno_list(struct mptcp_sock *msk, const struct sock *sk);
780786
struct mptcp_pm_add_entry *
@@ -798,6 +804,7 @@ int mptcp_pm_remove_subflow(struct mptcp_sock *msk, const struct mptcp_rm_list *
798804
int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
799805
struct mptcp_pm_addr_entry *entry);
800806
void mptcp_free_local_addr_list(struct mptcp_sock *msk);
807+
int mptcp_nl_cmd_announce(struct sk_buff *skb, struct genl_info *info);
801808

802809
void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk,
803810
const struct sock *ssk, gfp_t gfp);

0 commit comments

Comments
 (0)