1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
2
3
Implement address_announced/address_removed/subflow_established/
3
Some path manager related refactoring and cleanups.
4
subflow_closed interfaces.
4
- patch 1, a cleanup.
5
- patches 2-4, drop mptcp_pm_is_userspace() and mptcp_pm_is_kernel().
6
- patches 5-6, change remote of set_flags as mptcp_pm_addr_entry type.
5
7
6
Depends on:
8
Geliang Tang (6):
7
- BPF path manager, part 4, v5
9
mptcp: pm: use pm variable instead of msk->pm
8
Based-on: <cover.1740019794.git.tanggeliang@kylinos.cn>
10
mptcp: pm: userspace: drop is_userspace in free_local_addr_list
11
mptcp: pm: drop is_kernel in alloc_anno_list
12
mptcp: pm: in-kernel: drop is_userspace in remove_id_zero
13
mptcp: pm: add remote parameter for set_flags
14
mptcp: pm: in-kernel: drop changed parameter of set_flags
9
15
10
Geliang Tang (9):
16
net/mptcp/pm.c | 28 ++++++++----
11
mptcp: pm: in-kernel: add address_removed/subflow_closed
17
net/mptcp/pm_netlink.c | 93 +++++++++++++++++++++-------------------
12
mptcp: pm: in-kernel: address_announced interface
18
net/mptcp/pm_userspace.c | 25 +++--------
13
mptcp: pm: in-kernel: address_removed interface
19
net/mptcp/protocol.h | 5 ++-
14
mptcp: pm: in-kernel: subflow_established interface
20
4 files changed, 77 insertions(+), 74 deletions(-)
15
mptcp: pm: in-kernel: subflow_closed interface
16
mptcp: pm: userspace: address_announced interface
17
mptcp: pm: userspace: address_removed interface
18
mptcp: pm: userspace: subflow_established interface
19
mptcp: pm: userspace: subflow_closed interface
20
21
net/mptcp/pm_netlink.c | 115 ++++++++++++++------
22
net/mptcp/pm_userspace.c | 220 +++++++++++++++++++++++----------------
23
2 files changed, 215 insertions(+), 120 deletions(-)
24
21
25
--
22
--
26
2.43.0
23
2.43.0
diff view generated by jsdifflib
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
2
3
Extract subflow_closed() interface of the userspace PM from the handler of
3
The variable "pm" has been defined in mptcp_pm_fully_established()
4
netlink command MPTCP_PM_CMD_SUBFLOW_DESTROY
4
and mptcp_pm_data_reset() as "sk->pm", so use "pm" directly instead
5
5
of using "sk->pm".
6
    mptcp_pm_nl_subflow_destroy_doit(),
7
8
only leave the code for obtaining msk through "info", parsing local address
9
entry and parsing remote address info in the handler.
10
11
This interface is invoked under holding the msk socket lock.
12
6
13
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
7
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
14
---
8
---
15
net/mptcp/pm_userspace.c | 45 ++++++++++++++++++++++++++--------------
9
net/mptcp/pm.c | 8 ++++----
16
1 file changed, 30 insertions(+), 15 deletions(-)
10
1 file changed, 4 insertions(+), 4 deletions(-)
17
11
18
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
12
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
19
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
20
--- a/net/mptcp/pm_userspace.c
14
--- a/net/mptcp/pm.c
21
+++ b/net/mptcp/pm_userspace.c
15
+++ b/net/mptcp/pm.c
22
@@ -XXX,XX +XXX,XX @@ static struct sock *mptcp_nl_find_ssk(struct mptcp_sock *msk,
16
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_fully_established(struct mptcp_sock *msk, const struct sock *ssk)
23
    return NULL;
17
     * be sure to serve this event only once.
18
     */
19
    if (READ_ONCE(pm->work_pending) &&
20
-     !(msk->pm.status & BIT(MPTCP_PM_ALREADY_ESTABLISHED)))
21
+     !(pm->status & BIT(MPTCP_PM_ALREADY_ESTABLISHED)))
22
        mptcp_pm_schedule_work(msk, MPTCP_PM_ESTABLISHED);
23
24
-    if ((msk->pm.status & BIT(MPTCP_PM_ALREADY_ESTABLISHED)) == 0)
25
+    if ((pm->status & BIT(MPTCP_PM_ALREADY_ESTABLISHED)) == 0)
26
        announce = true;
27
28
-    msk->pm.status |= BIT(MPTCP_PM_ALREADY_ESTABLISHED);
29
+    pm->status |= BIT(MPTCP_PM_ALREADY_ESTABLISHED);
30
    spin_unlock_bh(&pm->lock);
31
32
    if (announce)
33
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_data_reset(struct mptcp_sock *msk)
34
    WRITE_ONCE(pm->addr_signal, 0);
35
    WRITE_ONCE(pm->remote_deny_join_id0, false);
36
    pm->status = 0;
37
-    bitmap_fill(msk->pm.id_avail_bitmap, MPTCP_PM_MAX_ADDR_ID + 1);
38
+    bitmap_fill(pm->id_avail_bitmap, MPTCP_PM_MAX_ADDR_ID + 1);
24
}
39
}
25
40
26
+static int mptcp_userspace_pm_subflow_closed(struct mptcp_sock *msk,
41
void mptcp_pm_data_init(struct mptcp_sock *msk)
27
+                     struct mptcp_pm_param *param)
28
+{
29
+    struct mptcp_pm_addr_entry *local = &param->entry;
30
+    struct mptcp_addr_info *remote = &param->addr;
31
+    struct sock *ssk, *sk = (struct sock *)msk;
32
+
33
+    ssk = mptcp_nl_find_ssk(msk, &local->addr, remote);
34
+    if (!ssk)
35
+        return -ESRCH;
36
+
37
+    spin_lock_bh(&msk->pm.lock);
38
+    mptcp_userspace_pm_delete_local_addr(msk, local);
39
+    spin_unlock_bh(&msk->pm.lock);
40
+    mptcp_subflow_shutdown(sk, ssk, RCV_SHUTDOWN | SEND_SHUTDOWN);
41
+    mptcp_close_ssk(sk, ssk, mptcp_subflow_ctx(ssk));
42
+    MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_RMSUBFLOW);
43
+
44
+    return 0;
45
+}
46
+
47
int mptcp_pm_nl_subflow_destroy_doit(struct sk_buff *skb, struct genl_info *info)
48
{
49
    struct mptcp_pm_addr_entry addr_l;
50
    struct mptcp_addr_info addr_r;
51
    struct nlattr *raddr, *laddr;
52
+    struct mptcp_pm_param param;
53
    struct mptcp_sock *msk;
54
-    struct sock *sk, *ssk;
55
    int err = -EINVAL;
56
+    struct sock *sk;
57
58
    if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR) ||
59
     GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR_REMOTE))
60
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_subflow_destroy_doit(struct sk_buff *skb, struct genl_info *info
61
    }
62
63
    lock_sock(sk);
64
-    ssk = mptcp_nl_find_ssk(msk, &addr_l.addr, &addr_r);
65
-    if (!ssk) {
66
-        GENL_SET_ERR_MSG(info, "subflow not found");
67
-        err = -ESRCH;
68
-        goto release_sock;
69
-    }
70
-
71
-    spin_lock_bh(&msk->pm.lock);
72
-    mptcp_userspace_pm_delete_local_addr(msk, &addr_l);
73
-    spin_unlock_bh(&msk->pm.lock);
74
-    mptcp_subflow_shutdown(sk, ssk, RCV_SHUTDOWN | SEND_SHUTDOWN);
75
-    mptcp_close_ssk(sk, ssk, mptcp_subflow_ctx(ssk));
76
-    MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_RMSUBFLOW);
77
-release_sock:
78
+    mptcp_pm_param_set_contexts(&param, &addr_l, &addr_r);
79
+    err = msk->pm.ops && msk->pm.ops->subflow_closed ?
80
+     msk->pm.ops->subflow_closed(msk, &param) :
81
+     mptcp_userspace_pm_subflow_closed(msk, &param);
82
    release_sock(sk);
83
+    if (err)
84
+        GENL_SET_ERR_MSG(info, "subflow not found");
85
86
destroy_err:
87
    sock_put(sk);
88
@@ -XXX,XX +XXX,XX @@ static struct mptcp_pm_ops mptcp_userspace_pm = {
89
    .address_announced    = mptcp_userspace_pm_address_announced,
90
    .address_removed    = mptcp_userspace_pm_address_removed,
91
    .subflow_established    = mptcp_userspace_pm_subflow_established,
92
+    .subflow_closed        = mptcp_userspace_pm_subflow_closed,
93
    .get_local_id        = mptcp_userspace_pm_get_local_id,
94
    .get_priority        = mptcp_userspace_pm_get_priority,
95
    .type            = MPTCP_PM_TYPE_USERSPACE,
96
--
42
--
97
2.43.0
43
2.43.0
diff view generated by jsdifflib
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
2
3
Extract address_removed() interface of the userspace PM from the handler
3
To reduce the path manager's reliance on mptcp_pm_is_userspace()
4
of netlink command MPTCP_PM_CMD_REMOVE mptcp_pm_nl_remove_doit(), only
4
and mptcp_pm_is_kernel() helpers, this patch drops the check for
5
leave the code for parsing address id and obtaining msk through "info"
5
mptcp_pm_is_userspace() in mptcp_free_local_addr_list() and
6
in the handler.
6
replaces it with a check to see if userspace_pm_local_addr_list
7
7
is empty.
8
This interface is invoked under holding the msk socket lock.
9
8
10
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
9
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
11
---
10
---
12
net/mptcp/pm_userspace.c | 74 ++++++++++++++++++++--------------------
11
net/mptcp/pm_userspace.c | 2 +-
13
1 file changed, 37 insertions(+), 37 deletions(-)
12
1 file changed, 1 insertion(+), 1 deletion(-)
14
13
15
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
14
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
16
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
17
--- a/net/mptcp/pm_userspace.c
16
--- a/net/mptcp/pm_userspace.c
18
+++ b/net/mptcp/pm_userspace.c
17
+++ b/net/mptcp/pm_userspace.c
19
@@ -XXX,XX +XXX,XX @@ static int mptcp_userspace_pm_remove_id_zero_address(struct mptcp_sock *msk)
18
@@ -XXX,XX +XXX,XX @@ void mptcp_free_local_addr_list(struct mptcp_sock *msk)
20
{
19
    struct sock *sk = (struct sock *)msk;
21
    struct mptcp_rm_list list = { .nr = 0 };
20
    LIST_HEAD(free_list);
22
    struct mptcp_subflow_context *subflow;
21
23
-    struct sock *sk = (struct sock *)msk;
22
-    if (!mptcp_pm_is_userspace(msk))
24
    bool has_id_0 = false;
23
+    if (list_empty(&msk->pm.userspace_pm_local_addr_list))
25
-    int err = -EINVAL;
24
        return;
26
25
27
-    lock_sock(sk);
26
    spin_lock_bh(&msk->pm.lock);
28
    mptcp_for_each_subflow(msk, subflow) {
29
        if (READ_ONCE(subflow->local_id) == 0) {
30
            has_id_0 = true;
31
@@ -XXX,XX +XXX,XX @@ static int mptcp_userspace_pm_remove_id_zero_address(struct mptcp_sock *msk)
32
        }
33
    }
34
    if (!has_id_0)
35
-        goto remove_err;
36
+        return -EINVAL;
37
38
    list.ids[list.nr++] = 0;
39
40
@@ -XXX,XX +XXX,XX @@ static int mptcp_userspace_pm_remove_id_zero_address(struct mptcp_sock *msk)
41
    mptcp_pm_remove_addr(msk, &list);
42
    spin_unlock_bh(&msk->pm.lock);
43
44
-    err = 0;
45
-
46
-remove_err:
47
-    release_sock(sk);
48
-    return err;
49
+    return 0;
50
}
51
52
void mptcp_pm_remove_addr_entry(struct mptcp_sock *msk,
53
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_remove_addr_entry(struct mptcp_sock *msk,
54
    spin_unlock_bh(&msk->pm.lock);
55
}
56
57
+static int mptcp_userspace_pm_address_removed(struct mptcp_sock *msk,
58
+                     struct mptcp_pm_param *param)
59
+{
60
+    struct mptcp_pm_addr_entry *entry;
61
+    u8 id = param->addr.id;
62
+
63
+    if (id == 0)
64
+        return mptcp_userspace_pm_remove_id_zero_address(msk);
65
+
66
+    spin_lock_bh(&msk->pm.lock);
67
+    entry = mptcp_userspace_pm_lookup_addr_by_id(msk, id);
68
+    if (!entry) {
69
+        spin_unlock_bh(&msk->pm.lock);
70
+        return -EINVAL;
71
+    }
72
+
73
+    list_del_rcu(&entry->list);
74
+    spin_unlock_bh(&msk->pm.lock);
75
+
76
+    mptcp_pm_remove_addr_entry(msk, entry);
77
+
78
+    sock_kfree_s((struct sock *)msk, entry, sizeof(*entry));
79
+
80
+    return 0;
81
+}
82
+
83
int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
84
{
85
-    struct mptcp_pm_addr_entry *match;
86
+    struct mptcp_addr_info addr;
87
+    struct mptcp_pm_param param;
88
    struct mptcp_sock *msk;
89
    struct nlattr *id;
90
    int err = -EINVAL;
91
    struct sock *sk;
92
-    u8 id_val;
93
94
    if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_LOC_ID))
95
        return err;
96
97
    id = info->attrs[MPTCP_PM_ATTR_LOC_ID];
98
-    id_val = nla_get_u8(id);
99
+    addr.id = nla_get_u8(id);
100
101
    msk = mptcp_userspace_pm_get_sock(info);
102
    if (!msk)
103
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
104
105
    sk = (struct sock *)msk;
106
107
-    if (id_val == 0) {
108
-        err = mptcp_userspace_pm_remove_id_zero_address(msk);
109
-        goto out;
110
-    }
111
-
112
    lock_sock(sk);
113
-
114
-    spin_lock_bh(&msk->pm.lock);
115
-    match = mptcp_userspace_pm_lookup_addr_by_id(msk, id_val);
116
-    if (!match) {
117
-        spin_unlock_bh(&msk->pm.lock);
118
-        release_sock(sk);
119
-        goto out;
120
-    }
121
-
122
-    list_del_rcu(&match->list);
123
-    spin_unlock_bh(&msk->pm.lock);
124
-
125
-    mptcp_pm_remove_addr_entry(msk, match);
126
-
127
+    mptcp_pm_param_set_contexts(&param, NULL, &addr);
128
+    err = msk->pm.ops && msk->pm.ops->address_removed ?
129
+     msk->pm.ops->address_removed(msk, &param) :
130
+     mptcp_userspace_pm_address_removed(msk, &param);
131
    release_sock(sk);
132
-
133
-    sock_kfree_s(sk, match, sizeof(*match));
134
-
135
-    err = 0;
136
-out:
137
    if (err)
138
        NL_SET_ERR_MSG_ATTR_FMT(info->extack, id,
139
                    "address with id %u not found",
140
-                    id_val);
141
+                    addr.id);
142
143
    sock_put(sk);
144
    return err;
145
@@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr,
146
147
static struct mptcp_pm_ops mptcp_userspace_pm = {
148
    .address_announced    = mptcp_userspace_pm_address_announced,
149
+    .address_removed    = mptcp_userspace_pm_address_removed,
150
    .get_local_id        = mptcp_userspace_pm_get_local_id,
151
    .get_priority        = mptcp_userspace_pm_get_priority,
152
    .type            = MPTCP_PM_TYPE_USERSPACE,
153
--
27
--
154
2.43.0
28
2.43.0
diff view generated by jsdifflib
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
2
3
Update mptcp_pm_nl_subflow_established() to match the parameters and
3
To reduce the path manager's reliance on mptcp_pm_is_userspace()
4
return value of subflow_established() interface and define it as the
4
and mptcp_pm_is_kernel() helpers, this patch drops the check for
5
interface of the in-kernel netlink PM.
5
mptcp_pm_is_kernel() in the function mptcp_pm_alloc_anno_list().
6
6
Instead, add a new parameter "reissue" for this function, pass
7
This interface is invoked under holding the msk socket lock.
7
"false" to this function in the in-kernel PM while pass "true"
8
to it in the userspace PM.
8
9
9
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
10
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
10
---
11
---
11
net/mptcp/pm_netlink.c | 11 +++++++++--
12
net/mptcp/pm_netlink.c | 7 ++++---
12
1 file changed, 9 insertions(+), 2 deletions(-)
13
net/mptcp/pm_userspace.c | 2 +-
14
net/mptcp/protocol.h | 3 ++-
15
3 files changed, 7 insertions(+), 5 deletions(-)
13
16
14
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
17
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
15
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
16
--- a/net/mptcp/pm_netlink.c
19
--- a/net/mptcp/pm_netlink.c
17
+++ b/net/mptcp/pm_netlink.c
20
+++ b/net/mptcp/pm_netlink.c
18
@@ -XXX,XX +XXX,XX @@ static void mptcp_pm_nl_fully_established(struct mptcp_sock *msk)
21
@@ -XXX,XX +XXX,XX @@ mptcp_pm_del_add_timer(struct mptcp_sock *msk,
19
    mptcp_pm_create_subflow_or_signal_addr(msk);
20
}
22
}
21
23
22
-static void mptcp_pm_nl_subflow_established(struct mptcp_sock *msk)
24
bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk,
23
+static int mptcp_pm_nl_subflow_established(struct mptcp_sock *msk,
25
-             const struct mptcp_addr_info *addr)
24
+                     struct mptcp_pm_param *param)
26
+             const struct mptcp_addr_info *addr,
27
+             bool reissue)
25
{
28
{
26
    mptcp_pm_create_subflow_or_signal_addr(msk);
29
    struct mptcp_pm_add_entry *add_entry = NULL;
27
+
30
    struct sock *sk = (struct sock *)msk;
28
+    return 0;
31
@@ -XXX,XX +XXX,XX @@ bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk,
29
}
32
    add_entry = mptcp_lookup_anno_list_by_saddr(msk, addr);
30
33
31
/* Fill all the local addresses into the array addrs[],
34
    if (add_entry) {
32
@@ -XXX,XX +XXX,XX @@ static void mptcp_pm_nl_rm_subflow_received(struct mptcp_sock *msk,
35
-        if (WARN_ON_ONCE(mptcp_pm_is_kernel(msk)))
33
void mptcp_pm_nl_work(struct mptcp_sock *msk)
36
+        if (WARN_ON_ONCE(!reissue))
34
{
37
            return false;
35
    struct mptcp_pm_data *pm = &msk->pm;
38
36
+    struct mptcp_pm_param param;
39
        sk_reset_timer(sk, &add_entry->add_timer,
37
40
@@ -XXX,XX +XXX,XX @@ static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk)
38
    msk_owned_by_me(msk);
41
        /* If the alloc fails, we are on memory pressure, not worth
39
42
         * continuing, and trying to create subflows.
40
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_nl_work(struct mptcp_sock *msk)
43
         */
41
    }
44
-        if (!mptcp_pm_alloc_anno_list(msk, &local.addr))
42
    if (pm->status & BIT(MPTCP_PM_SUBFLOW_ESTABLISHED)) {
45
+        if (!mptcp_pm_alloc_anno_list(msk, &local.addr, false))
43
        pm->status &= ~BIT(MPTCP_PM_SUBFLOW_ESTABLISHED);
46
            return;
44
-        mptcp_pm_nl_subflow_established(msk);
47
45
+        msk->pm.ops && msk->pm.ops->subflow_established ?
48
        __clear_bit(local.addr.id, msk->pm.id_avail_bitmap);
46
+            msk->pm.ops->subflow_established(msk, &param) :
49
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
47
+            mptcp_pm_nl_subflow_established(msk, &param);
50
index XXXXXXX..XXXXXXX 100644
48
    }
51
--- a/net/mptcp/pm_userspace.c
49
52
+++ b/net/mptcp/pm_userspace.c
50
    spin_unlock_bh(&msk->pm.lock);
53
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_announce_doit(struct sk_buff *skb, struct genl_info *info)
51
@@ -XXX,XX +XXX,XX @@ static struct pernet_operations mptcp_pm_pernet_ops = {
54
    lock_sock(sk);
52
static struct mptcp_pm_ops mptcp_netlink_pm = {
55
    spin_lock_bh(&msk->pm.lock);
53
    .address_announced    = mptcp_pm_nl_address_announced,
56
54
    .address_removed    = mptcp_pm_nl_address_removed,
57
-    if (mptcp_pm_alloc_anno_list(msk, &addr_val.addr)) {
55
+    .subflow_established    = mptcp_pm_nl_subflow_established,
58
+    if (mptcp_pm_alloc_anno_list(msk, &addr_val.addr, true)) {
56
    .get_local_id        = mptcp_pm_nl_get_local_id,
59
        msk->pm.add_addr_signaled++;
57
    .get_priority        = mptcp_pm_nl_get_priority,
60
        mptcp_pm_announce_addr(msk, &addr_val.addr, false);
58
    .type            = MPTCP_PM_TYPE_KERNEL,
61
        mptcp_pm_nl_addr_send_ack(msk);
62
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
63
index XXXXXXX..XXXXXXX 100644
64
--- a/net/mptcp/protocol.h
65
+++ b/net/mptcp/protocol.h
66
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,
67
                 struct mptcp_addr_info *rem,
68
                 u8 bkup);
69
bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk,
70
-             const struct mptcp_addr_info *addr);
71
+             const struct mptcp_addr_info *addr,
72
+             bool reissue);
73
void mptcp_pm_free_anno_list(struct mptcp_sock *msk);
74
bool mptcp_pm_sport_in_anno_list(struct mptcp_sock *msk, const struct sock *sk);
75
struct mptcp_pm_add_entry *
59
--
76
--
60
2.43.0
77
2.43.0
diff view generated by jsdifflib
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
2
3
This patch defines the code in the loop of traversing all msks in
3
There're duplicate operations in mptcp_nl_remove_subflow_and_signal_addr()
4
mptcp_nl_remove_subflow_and_signal_addr() as two new helpers,
4
and mptcp_nl_remove_id_zero_address(), both of which traverse all mptcp
5
mptcp_pm_nl_address_removed() and mptcp_pm_nl_subflow_closed(),
5
sockets in the net namespace. This patch drops the traversal operation in
6
used for signaling a RM_ADDR and closing a subflow respectively.
6
the latter and reuse the traversal loop of the former to do the removal of
7
id zero address.
8
9
An additional benefit is that the check for mptcp_pm_is_userspace() in
10
mptcp_nl_remove_id_zero_address() is dropped, which reduces the path
11
manager's reliance on mptcp_pm_is_userspace() and mptcp_pm_is_kernel()
12
helpers.
7
13
8
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
14
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
9
---
15
---
10
net/mptcp/pm_netlink.c | 60 +++++++++++++++++++++++++++---------------
16
net/mptcp/pm_netlink.c | 77 ++++++++++++++++++++----------------------
11
1 file changed, 39 insertions(+), 21 deletions(-)
17
1 file changed, 37 insertions(+), 40 deletions(-)
12
18
13
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
19
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
14
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
15
--- a/net/mptcp/pm_netlink.c
21
--- a/net/mptcp/pm_netlink.c
16
+++ b/net/mptcp/pm_netlink.c
22
+++ b/net/mptcp/pm_netlink.c
17
@@ -XXX,XX +XXX,XX @@ static void __mark_subflow_endp_available(struct mptcp_sock *msk, u8 id)
23
@@ -XXX,XX +XXX,XX @@ static void __mark_subflow_endp_available(struct mptcp_sock *msk, u8 id)
18
        msk->pm.local_addr_used--;
24
        msk->pm.local_addr_used--;
19
}
25
}
20
26
21
+static int mptcp_pm_nl_address_removed(struct mptcp_sock *msk,
27
+static void mptcp_nl_remove_id_zero_address(struct mptcp_sock *msk,
22
+                 const struct mptcp_pm_addr_entry *local)
28
+                     const struct mptcp_addr_info *addr)
23
+{
29
+{
24
+    bool remove_subflow;
30
+    struct mptcp_rm_list list = { .nr = 0 };
31
+    struct mptcp_addr_info msk_local;
25
+
32
+
26
+    remove_subflow = mptcp_lookup_subflow_by_saddr(&msk->conn_list, &local->addr);
33
+    if (list_empty(&msk->conn_list))
27
+    mptcp_pm_remove_anno_addr(msk, &local->addr, remove_subflow &&
34
+        return;
28
+                 !(local->flags & MPTCP_PM_ADDR_FLAG_IMPLICIT));
29
+    return 0;
30
+}
31
+
35
+
32
+static int mptcp_pm_nl_subflow_closed(struct mptcp_sock *msk,
36
+    mptcp_local_address((struct sock_common *)msk, &msk_local);
33
+                 const struct mptcp_pm_addr_entry *local)
37
+    if (!mptcp_addresses_equal(&msk_local, addr, addr->port))
34
+{
38
+        return;
35
+    struct mptcp_rm_list list = { .nr = 1 };
36
+    bool remove_subflow;
37
+
39
+
38
+    list.ids[0] = mptcp_endp_get_local_id(msk, &local->addr);
40
+    list.ids[list.nr++] = 0;
39
+    remove_subflow = mptcp_lookup_subflow_by_saddr(&msk->conn_list, &local->addr);
40
+    if (remove_subflow) {
41
+        spin_lock_bh(&msk->pm.lock);
42
+        mptcp_pm_nl_rm_subflow_received(msk, &list);
43
+        spin_unlock_bh(&msk->pm.lock);
44
+    }
45
+
41
+
46
+    if (local->flags & MPTCP_PM_ADDR_FLAG_SUBFLOW) {
42
+    spin_lock_bh(&msk->pm.lock);
47
+        spin_lock_bh(&msk->pm.lock);
43
+    mptcp_pm_remove_addr(msk, &list);
48
+        __mark_subflow_endp_available(msk, list.ids[0]);
44
+    mptcp_pm_nl_rm_subflow_received(msk, &list);
49
+        spin_unlock_bh(&msk->pm.lock);
45
+    __mark_subflow_endp_available(msk, 0);
50
+    }
46
+    spin_unlock_bh(&msk->pm.lock);
51
+
52
+    if (msk->mpc_endpoint_id == local->addr.id)
53
+        msk->mpc_endpoint_id = 0;
54
+
55
+    return 0;
56
+}
47
+}
57
+
48
+
58
static int mptcp_nl_remove_subflow_and_signal_addr(struct net *net,
49
static int mptcp_nl_remove_subflow_and_signal_addr(struct net *net,
59
                         const struct mptcp_pm_addr_entry *entry)
50
                         const struct mptcp_pm_addr_entry *entry)
60
{
51
{
61
    const struct mptcp_addr_info *addr = &entry->addr;
62
-    struct mptcp_rm_list list = { .nr = 1 };
63
    long s_slot = 0, s_num = 0;
64
    struct mptcp_sock *msk;
65
66
@@ -XXX,XX +XXX,XX @@ static int mptcp_nl_remove_subflow_and_signal_addr(struct net *net,
52
@@ -XXX,XX +XXX,XX @@ static int mptcp_nl_remove_subflow_and_signal_addr(struct net *net,
67
68
    while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) {
69
        struct sock *sk = (struct sock *)msk;
70
-        bool remove_subflow;
71
72
        if (mptcp_pm_is_userspace(msk))
73
            goto next;
53
            goto next;
74
54
75
        lock_sock(sk);
55
        lock_sock(sk);
76
-        remove_subflow = mptcp_lookup_subflow_by_saddr(&msk->conn_list, addr);
56
+        if (entry->addr.id == 0) {
77
-        mptcp_pm_remove_anno_addr(msk, addr, remove_subflow &&
57
+            mptcp_nl_remove_id_zero_address(msk, &entry->addr);
78
-                     !(entry->flags & MPTCP_PM_ADDR_FLAG_IMPLICIT));
58
+            goto out;
59
+        }
60
+
61
        remove_subflow = mptcp_lookup_subflow_by_saddr(&msk->conn_list, addr);
62
        mptcp_pm_remove_anno_addr(msk, addr, remove_subflow &&
63
                     !(entry->flags & MPTCP_PM_ADDR_FLAG_IMPLICIT));
64
@@ -XXX,XX +XXX,XX @@ static int mptcp_nl_remove_subflow_and_signal_addr(struct net *net,
65
66
        if (msk->mpc_endpoint_id == entry->addr.id)
67
            msk->mpc_endpoint_id = 0;
68
-        release_sock(sk);
79
-
69
-
80
-        list.ids[0] = mptcp_endp_get_local_id(msk, addr);
70
-next:
81
-        if (remove_subflow) {
71
-        sock_put(sk);
82
-            spin_lock_bh(&msk->pm.lock);
72
-        cond_resched();
83
-            mptcp_pm_nl_rm_subflow_received(msk, &list);
73
-    }
84
-            spin_unlock_bh(&msk->pm.lock);
85
-        }
86
-
74
-
87
-        if (entry->flags & MPTCP_PM_ADDR_FLAG_SUBFLOW) {
75
-    return 0;
88
-            spin_lock_bh(&msk->pm.lock);
76
-}
89
-            __mark_subflow_endp_available(msk, list.ids[0]);
90
-            spin_unlock_bh(&msk->pm.lock);
91
-        }
92
-
77
-
93
-        if (msk->mpc_endpoint_id == entry->addr.id)
78
-static int mptcp_nl_remove_id_zero_address(struct net *net,
94
-            msk->mpc_endpoint_id = 0;
79
-                     struct mptcp_addr_info *addr)
95
+        mptcp_pm_nl_address_removed(msk, entry);
80
-{
96
+        mptcp_pm_nl_subflow_closed(msk, entry);
81
-    struct mptcp_rm_list list = { .nr = 0 };
82
-    long s_slot = 0, s_num = 0;
83
-    struct mptcp_sock *msk;
84
-
85
-    list.ids[list.nr++] = 0;
86
-
87
-    while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) {
88
-        struct sock *sk = (struct sock *)msk;
89
-        struct mptcp_addr_info msk_local;
90
-
91
-        if (list_empty(&msk->conn_list) || mptcp_pm_is_userspace(msk))
92
-            goto next;
93
-
94
-        mptcp_local_address((struct sock_common *)msk, &msk_local);
95
-        if (!mptcp_addresses_equal(&msk_local, addr, addr->port))
96
-            goto next;
97
-
98
-        lock_sock(sk);
99
-        spin_lock_bh(&msk->pm.lock);
100
-        mptcp_pm_remove_addr(msk, &list);
101
-        mptcp_pm_nl_rm_subflow_received(msk, &list);
102
-        __mark_subflow_endp_available(msk, 0);
103
-        spin_unlock_bh(&msk->pm.lock);
104
+out:
97
        release_sock(sk);
105
        release_sock(sk);
98
106
99
next:
107
next:
108
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_del_addr_doit(struct sk_buff *skb, struct genl_info *info)
109
     * id addresses. Additionally zero id is not accounted for in id_bitmap.
110
     * Let's use an 'mptcp_rm_list' instead of the common remove code.
111
     */
112
-    if (addr.addr.id == 0)
113
-        return mptcp_nl_remove_id_zero_address(sock_net(skb->sk), &addr.addr);
114
+    if (addr.addr.id == 0) {
115
+        entry = &addr;
116
+        goto del_addr;
117
+    }
118
119
    spin_lock_bh(&pernet->lock);
120
    entry = __lookup_addr_by_id(pernet, addr.addr.id);
121
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_del_addr_doit(struct sk_buff *skb, struct genl_info *info)
122
    __clear_bit(entry->addr.id, pernet->id_bitmap);
123
    spin_unlock_bh(&pernet->lock);
124
125
+del_addr:
126
    mptcp_nl_remove_subflow_and_signal_addr(sock_net(skb->sk), entry);
127
-    synchronize_rcu();
128
-    __mptcp_pm_release_addr_entry(entry);
129
+    if (entry->addr.id) {
130
+        synchronize_rcu();
131
+        __mptcp_pm_release_addr_entry(entry);
132
+    }
133
134
    return ret;
135
}
100
--
136
--
101
2.43.0
137
2.43.0
diff view generated by jsdifflib
Deleted patch
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
1
3
Extract address_announced() interface of the in-kernel netlink PM from
4
the helper mptcp_nl_add_subflow_or_signal_addr(), only leave the code
5
for traversing all msk in the helper.
6
7
This interface is invoked under holding the msk socket lock.
8
9
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
10
---
11
net/mptcp/pm_netlink.c | 34 +++++++++++++++++++++++++---------
12
1 file changed, 25 insertions(+), 9 deletions(-)
13
14
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/net/mptcp/pm_netlink.c
17
+++ b/net/mptcp/pm_netlink.c
18
@@ -XXX,XX +XXX,XX @@ static struct pm_nl_pernet *genl_info_pm_nl(struct genl_info *info)
19
    return pm_nl_get_pernet(genl_info_net(info));
20
}
21
22
+static int mptcp_pm_nl_address_announced(struct mptcp_sock *msk,
23
+                     struct mptcp_pm_param *param)
24
+{
25
+    struct mptcp_addr_info *addr = &param->addr;
26
+    struct mptcp_addr_info mpc_addr;
27
+
28
+    /* if the endp linked to the init sf is re-added with a != ID */
29
+    mptcp_local_address((struct sock_common *)msk, &mpc_addr);
30
+
31
+    spin_lock_bh(&msk->pm.lock);
32
+    if (mptcp_addresses_equal(addr, &mpc_addr, addr->port))
33
+        msk->mpc_endpoint_id = addr->id;
34
+
35
+    mptcp_pm_create_subflow_or_signal_addr(msk);
36
+    spin_unlock_bh(&msk->pm.lock);
37
+
38
+    return 0;
39
+}
40
+
41
static int mptcp_nl_add_subflow_or_signal_addr(struct net *net,
42
                     struct mptcp_addr_info *addr)
43
{
44
@@ -XXX,XX +XXX,XX @@ static int mptcp_nl_add_subflow_or_signal_addr(struct net *net,
45
46
    while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) {
47
        struct sock *sk = (struct sock *)msk;
48
-        struct mptcp_addr_info mpc_addr;
49
+        struct mptcp_pm_param param;
50
51
        if (!READ_ONCE(msk->fully_established) ||
52
         mptcp_pm_is_userspace(msk))
53
            goto next;
54
55
-        /* if the endp linked to the init sf is re-added with a != ID */
56
-        mptcp_local_address((struct sock_common *)msk, &mpc_addr);
57
-
58
        lock_sock(sk);
59
-        spin_lock_bh(&msk->pm.lock);
60
-        if (mptcp_addresses_equal(addr, &mpc_addr, addr->port))
61
-            msk->mpc_endpoint_id = addr->id;
62
-        mptcp_pm_create_subflow_or_signal_addr(msk);
63
-        spin_unlock_bh(&msk->pm.lock);
64
+        mptcp_pm_param_set_contexts(&param, NULL, addr);
65
+        msk->pm.ops && msk->pm.ops->address_announced ?
66
+            msk->pm.ops->address_announced(msk, &param) :
67
+            mptcp_pm_nl_address_announced(msk, &param);
68
        release_sock(sk);
69
70
next:
71
@@ -XXX,XX +XXX,XX @@ static struct pernet_operations mptcp_pm_pernet_ops = {
72
};
73
74
static struct mptcp_pm_ops mptcp_netlink_pm = {
75
+    .address_announced    = mptcp_pm_nl_address_announced,
76
    .get_local_id        = mptcp_pm_nl_get_local_id,
77
    .get_priority        = mptcp_pm_nl_get_priority,
78
    .type            = MPTCP_PM_TYPE_KERNEL,
79
--
80
2.43.0
diff view generated by jsdifflib
Deleted patch
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
1
3
Update the 2nd parameter of mptcp_pm_nl_address_removed(), and define it
4
as the address_removed() interface of the in-kernel netlink PM.
5
6
This interface is invoked under holding the msk socket lock.
7
8
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
9
---
10
net/mptcp/pm_netlink.c | 10 ++++++++--
11
1 file changed, 8 insertions(+), 2 deletions(-)
12
13
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/net/mptcp/pm_netlink.c
16
+++ b/net/mptcp/pm_netlink.c
17
@@ -XXX,XX +XXX,XX @@ static void __mark_subflow_endp_available(struct mptcp_sock *msk, u8 id)
18
}
19
20
static int mptcp_pm_nl_address_removed(struct mptcp_sock *msk,
21
-                 const struct mptcp_pm_addr_entry *local)
22
+                 struct mptcp_pm_param *param)
23
{
24
+    struct mptcp_pm_addr_entry *local = &param->entry;
25
    bool remove_subflow;
26
27
    remove_subflow = mptcp_lookup_subflow_by_saddr(&msk->conn_list, &local->addr);
28
@@ -XXX,XX +XXX,XX @@ static int mptcp_nl_remove_subflow_and_signal_addr(struct net *net,
29
30
    while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) {
31
        struct sock *sk = (struct sock *)msk;
32
+        struct mptcp_pm_param param;
33
34
        if (mptcp_pm_is_userspace(msk))
35
            goto next;
36
37
        lock_sock(sk);
38
-        mptcp_pm_nl_address_removed(msk, entry);
39
+        mptcp_pm_param_set_contexts(&param, entry, NULL);
40
+        msk->pm.ops && msk->pm.ops->address_removed ?
41
+            msk->pm.ops->address_removed(msk, &param) :
42
+            mptcp_pm_nl_address_removed(msk, &param);
43
        mptcp_pm_nl_subflow_closed(msk, entry);
44
        release_sock(sk);
45
46
@@ -XXX,XX +XXX,XX @@ static struct pernet_operations mptcp_pm_pernet_ops = {
47
48
static struct mptcp_pm_ops mptcp_netlink_pm = {
49
    .address_announced    = mptcp_pm_nl_address_announced,
50
+    .address_removed    = mptcp_pm_nl_address_removed,
51
    .get_local_id        = mptcp_pm_nl_get_local_id,
52
    .get_priority        = mptcp_pm_nl_get_priority,
53
    .type            = MPTCP_PM_TYPE_KERNEL,
54
--
55
2.43.0
diff view generated by jsdifflib
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
2
3
Extract subflow_established() interface of the userspace PM from the
3
The remote address of set_flags() interface is useful for userspace PM,
4
handler of netlink command MPTCP_PM_CMD_SUBFLOW_CREATE
4
but unused in in-kernel PM.
5
5
6
mptcp_pm_nl_subflow_create_doit(),
6
But an additional "changed" parameter needs to be passed to set_flags() of
7
in-kernel PM. One option is to add a "u8 changed" parameter to set_flags()
8
interface:
7
9
8
only leave the code for obtaining msk through "info", parsing local address
10
    set_flags(struct mptcp_pm_addr_entry *local,
9
entry and parsing remote address info in the handler.
11
         struct mptcp_addr_info *remote,
12
         u8 changed)
10
13
11
This interface is invoked under holding the msk socket lock.
14
A better option is to add a struct mptcp_pm_addr_entry "remote" parameter
15
for set_flags(), so that "remote->addr" can be used for userspace PM, and
16
"remote->flags" can be used for in-kernel PM to replace the additional
17
"changed" parameter.
12
18
13
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
19
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
14
---
20
---
15
net/mptcp/pm_userspace.c | 54 +++++++++++++++++++++++++---------------
21
net/mptcp/pm.c | 20 ++++++++++++++++----
16
1 file changed, 34 insertions(+), 20 deletions(-)
22
net/mptcp/pm_netlink.c | 1 +
23
net/mptcp/pm_userspace.c | 21 +++------------------
24
net/mptcp/protocol.h | 2 ++
25
4 files changed, 22 insertions(+), 22 deletions(-)
17
26
27
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
28
index XXXXXXX..XXXXXXX 100644
29
--- a/net/mptcp/pm.c
30
+++ b/net/mptcp/pm.c
31
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_get_addr_dumpit(struct sk_buff *msg,
32
static int mptcp_pm_set_flags(struct genl_info *info)
33
{
34
    struct mptcp_pm_addr_entry loc = { .addr = { .family = AF_UNSPEC }, };
35
-    struct nlattr *attr_loc;
36
+    struct mptcp_pm_addr_entry rem = { .addr = { .family = AF_UNSPEC }, };
37
+    struct nlattr *attr_loc, *attr_rem;
38
    int ret = -EINVAL;
39
40
    if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR))
41
@@ -XXX,XX +XXX,XX @@ static int mptcp_pm_set_flags(struct genl_info *info)
42
    if (ret < 0)
43
        return ret;
44
45
-    if (info->attrs[MPTCP_PM_ATTR_TOKEN])
46
-        return mptcp_userspace_pm_set_flags(&loc, info);
47
-    return mptcp_pm_nl_set_flags(&loc, info);
48
+    if (info->attrs[MPTCP_PM_ATTR_TOKEN]) {
49
+        attr_rem = info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE];
50
+        ret = mptcp_pm_parse_entry(attr_rem, info, false, &rem);
51
+        if (ret < 0)
52
+            return ret;
53
+
54
+        if (rem.addr.family == AF_UNSPEC) {
55
+            NL_SET_ERR_MSG_ATTR(info->extack, attr_rem,
56
+                     "invalid remote address family");
57
+            return -EINVAL;
58
+        }
59
+        return mptcp_userspace_pm_set_flags(&loc, &rem, info);
60
+    }
61
+    return mptcp_pm_nl_set_flags(&loc, &rem, info);
62
}
63
64
int mptcp_pm_nl_set_flags_doit(struct sk_buff *skb, struct genl_info *info)
65
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
66
index XXXXXXX..XXXXXXX 100644
67
--- a/net/mptcp/pm_netlink.c
68
+++ b/net/mptcp/pm_netlink.c
69
@@ -XXX,XX +XXX,XX @@ static void mptcp_nl_set_flags(struct net *net,
70
}
71
72
int mptcp_pm_nl_set_flags(struct mptcp_pm_addr_entry *local,
73
+             struct mptcp_pm_addr_entry *remote,
74
             struct genl_info *info)
75
{
76
    struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR];
18
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
77
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
19
index XXXXXXX..XXXXXXX 100644
78
index XXXXXXX..XXXXXXX 100644
20
--- a/net/mptcp/pm_userspace.c
79
--- a/net/mptcp/pm_userspace.c
21
+++ b/net/mptcp/pm_userspace.c
80
+++ b/net/mptcp/pm_userspace.c
22
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
81
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_subflow_destroy_doit(struct sk_buff *skb, struct genl_info *info
23
    return err;
24
}
82
}
25
83
26
+static int mptcp_userspace_pm_subflow_established(struct mptcp_sock *msk,
84
int mptcp_userspace_pm_set_flags(struct mptcp_pm_addr_entry *local,
27
+                         struct mptcp_pm_param *param)
85
+                 struct mptcp_pm_addr_entry *remote,
28
+{
86
                 struct genl_info *info)
29
+    struct mptcp_pm_addr_entry *entry = &param->entry;
30
+    struct mptcp_addr_info *remote = &param->addr;
31
+    struct sock *sk = (struct sock *)msk;
32
+    struct mptcp_pm_local local;
33
+    int err;
34
+
35
+    err = mptcp_userspace_pm_append_new_local_addr(msk, entry, false);
36
+    if (err < 0)
37
+        return err;
38
+
39
+    local.addr = entry->addr;
40
+    local.flags = entry->flags;
41
+    local.ifindex = entry->ifindex;
42
+
43
+    err = __mptcp_subflow_connect(sk, &local, remote);
44
+    spin_lock_bh(&msk->pm.lock);
45
+    if (err)
46
+        mptcp_userspace_pm_delete_local_addr(msk, entry);
47
+    else
48
+        msk->pm.subflows++;
49
+    spin_unlock_bh(&msk->pm.lock);
50
+
51
+    return err;
52
+}
53
+
54
int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)
55
{
87
{
56
    struct mptcp_pm_addr_entry entry = { 0 };
88
-    struct mptcp_addr_info rem = { .family = AF_UNSPEC, };
57
    struct mptcp_addr_info addr_r;
89
    struct mptcp_pm_addr_entry *entry;
58
    struct nlattr *raddr, *laddr;
90
-    struct nlattr *attr, *attr_rem;
59
-    struct mptcp_pm_local local;
60
+    struct mptcp_pm_param param;
61
    struct mptcp_sock *msk;
91
    struct mptcp_sock *msk;
62
    int err = -EINVAL;
92
+    struct nlattr *attr;
93
    int ret = -EINVAL;
63
    struct sock *sk;
94
    struct sock *sk;
64
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)
95
    u8 bkup = 0;
65
        goto create_err;
96
97
-    if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR_REMOTE))
98
-        return ret;
99
-
100
    msk = mptcp_userspace_pm_get_sock(info);
101
    if (!msk)
102
        return ret;
103
@@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_set_flags(struct mptcp_pm_addr_entry *local,
104
        goto set_flags_err;
66
    }
105
    }
67
106
68
-    err = mptcp_userspace_pm_append_new_local_addr(msk, &entry, false);
107
-    attr_rem = info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE];
69
-    if (err < 0) {
108
-    ret = mptcp_pm_parse_addr(attr_rem, info, &rem);
70
-        NL_SET_ERR_MSG_ATTR(info->extack, laddr,
109
-    if (ret < 0)
71
-                 "did not match address and id");
110
-        goto set_flags_err;
72
-        goto create_err;
111
-
112
-    if (rem.family == AF_UNSPEC) {
113
-        NL_SET_ERR_MSG_ATTR(info->extack, attr_rem,
114
-                 "invalid remote address family");
115
-        ret = -EINVAL;
116
-        goto set_flags_err;
73
-    }
117
-    }
74
-
118
-
75
-    local.addr = entry.addr;
119
    if (local->flags & MPTCP_PM_ADDR_FLAG_BACKUP)
76
-    local.flags = entry.flags;
120
        bkup = 1;
77
-    local.ifindex = entry.ifindex;
121
78
-
122
@@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_set_flags(struct mptcp_pm_addr_entry *local,
123
    spin_unlock_bh(&msk->pm.lock);
124
79
    lock_sock(sk);
125
    lock_sock(sk);
80
-    err = __mptcp_subflow_connect(sk, &local, &addr_r);
126
-    ret = mptcp_pm_nl_mp_prio_send_ack(msk, &local->addr, &rem, bkup);
81
+    mptcp_pm_param_set_contexts(&param, &entry, &addr_r);
127
+    ret = mptcp_pm_nl_mp_prio_send_ack(msk, &local->addr, &remote->addr, bkup);
82
+    err = msk->pm.ops && msk->pm.ops->subflow_established ?
83
+     msk->pm.ops->subflow_established(msk, &param) :
84
+     mptcp_userspace_pm_subflow_established(msk, &param);
85
    release_sock(sk);
128
    release_sock(sk);
86
129
87
    if (err)
130
    /* mptcp_pm_nl_mp_prio_send_ack() only fails in one case */
88
        GENL_SET_ERR_MSG_FMT(info, "connect error: %d", err);
131
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
89
132
index XXXXXXX..XXXXXXX 100644
90
-    spin_lock_bh(&msk->pm.lock);
133
--- a/net/mptcp/protocol.h
91
-    if (err)
134
+++ b/net/mptcp/protocol.h
92
-        mptcp_userspace_pm_delete_local_addr(msk, &entry);
135
@@ -XXX,XX +XXX,XX @@ bool mptcp_lookup_subflow_by_saddr(const struct list_head *list,
93
-    else
136
bool mptcp_remove_anno_list_by_saddr(struct mptcp_sock *msk,
94
-        msk->pm.subflows++;
137
                 const struct mptcp_addr_info *addr);
95
-    spin_unlock_bh(&msk->pm.lock);
138
int mptcp_pm_nl_set_flags(struct mptcp_pm_addr_entry *local,
96
-
139
+             struct mptcp_pm_addr_entry *remote,
97
create_err:
140
             struct genl_info *info);
98
    sock_put(sk);
141
int mptcp_userspace_pm_set_flags(struct mptcp_pm_addr_entry *local,
99
    return err;
142
+                 struct mptcp_pm_addr_entry *remote,
100
@@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr,
143
                 struct genl_info *info);
101
static struct mptcp_pm_ops mptcp_userspace_pm = {
144
int mptcp_pm_announce_addr(struct mptcp_sock *msk,
102
    .address_announced    = mptcp_userspace_pm_address_announced,
145
             const struct mptcp_addr_info *addr,
103
    .address_removed    = mptcp_userspace_pm_address_removed,
104
+    .subflow_established    = mptcp_userspace_pm_subflow_established,
105
    .get_local_id        = mptcp_userspace_pm_get_local_id,
106
    .get_priority        = mptcp_userspace_pm_get_priority,
107
    .type            = MPTCP_PM_TYPE_USERSPACE,
108
--
146
--
109
2.43.0
147
2.43.0
diff view generated by jsdifflib
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
2
3
Update the 2nd parameter of mptcp_pm_nl_subflow_closed(), and define it
3
To drop the additional "changed" parameter of mptcp_nl_set_flags(),
4
as the subflow_closed() interface of the in-kernel netlink PM.
4
store "entry->flags" to "remote->flags" before modifying it in
5
5
mptcp_pm_nl_set_flags(), so that "changed" value can be obtained by
6
This interface is invoked under holding the msk socket lock.
6
comparing "local->flags" and "remote->flags" in mptcp_nl_set_flags().
7
7
8
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
8
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
9
---
9
---
10
net/mptcp/pm_netlink.c | 8 ++++++--
10
net/mptcp/pm_netlink.c | 8 ++++++--
11
1 file changed, 6 insertions(+), 2 deletions(-)
11
1 file changed, 6 insertions(+), 2 deletions(-)
12
12
13
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
13
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
14
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
15
--- a/net/mptcp/pm_netlink.c
15
--- a/net/mptcp/pm_netlink.c
16
+++ b/net/mptcp/pm_netlink.c
16
+++ b/net/mptcp/pm_netlink.c
17
@@ -XXX,XX +XXX,XX @@ static int mptcp_pm_nl_address_removed(struct mptcp_sock *msk,
17
@@ -XXX,XX +XXX,XX @@ static void mptcp_pm_nl_fullmesh(struct mptcp_sock *msk,
18
19
static void mptcp_nl_set_flags(struct net *net,
20
             struct mptcp_pm_addr_entry *local,
21
-             u8 changed)
22
+             struct mptcp_pm_addr_entry *remote)
23
{
24
    u8 is_subflow = !!(local->flags & MPTCP_PM_ADDR_FLAG_SUBFLOW);
25
    u8 bkup = !!(local->flags & MPTCP_PM_ADDR_FLAG_BACKUP);
26
+    u8 changed, mask = MPTCP_PM_ADDR_FLAG_BACKUP |
27
+             MPTCP_PM_ADDR_FLAG_FULLMESH;
28
    long s_slot = 0, s_num = 0;
29
    struct mptcp_sock *msk;
30
31
+    changed = (local->flags ^ remote->flags) & mask;
32
    if (changed == MPTCP_PM_ADDR_FLAG_FULLMESH && !is_subflow)
33
        return;
34
35
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_set_flags(struct mptcp_pm_addr_entry *local,
36
        return -EINVAL;
37
    }
38
39
+    remote->flags = entry->flags;
40
    changed = (local->flags ^ entry->flags) & mask;
41
    entry->flags = (entry->flags & ~mask) | (local->flags & mask);
42
    *local = *entry;
43
    spin_unlock_bh(&pernet->lock);
44
45
-    mptcp_nl_set_flags(net, local, changed);
46
+    mptcp_nl_set_flags(net, local, remote);
47
    return 0;
18
}
48
}
19
49
20
static int mptcp_pm_nl_subflow_closed(struct mptcp_sock *msk,
21
-                 const struct mptcp_pm_addr_entry *local)
22
+                 struct mptcp_pm_param *param)
23
{
24
+    struct mptcp_pm_addr_entry *local = &param->entry;
25
    struct mptcp_rm_list list = { .nr = 1 };
26
    bool remove_subflow;
27
28
@@ -XXX,XX +XXX,XX @@ static int mptcp_nl_remove_subflow_and_signal_addr(struct net *net,
29
        msk->pm.ops && msk->pm.ops->address_removed ?
30
            msk->pm.ops->address_removed(msk, &param) :
31
            mptcp_pm_nl_address_removed(msk, &param);
32
-        mptcp_pm_nl_subflow_closed(msk, entry);
33
+        msk->pm.ops && msk->pm.ops->subflow_closed ?
34
+            msk->pm.ops->subflow_closed(msk, &param) :
35
+            mptcp_pm_nl_subflow_closed(msk, &param);
36
        release_sock(sk);
37
38
next:
39
@@ -XXX,XX +XXX,XX @@ static struct mptcp_pm_ops mptcp_netlink_pm = {
40
    .address_announced    = mptcp_pm_nl_address_announced,
41
    .address_removed    = mptcp_pm_nl_address_removed,
42
    .subflow_established    = mptcp_pm_nl_subflow_established,
43
+    .subflow_closed        = mptcp_pm_nl_subflow_closed,
44
    .get_local_id        = mptcp_pm_nl_get_local_id,
45
    .get_priority        = mptcp_pm_nl_get_priority,
46
    .type            = MPTCP_PM_TYPE_KERNEL,
47
--
50
--
48
2.43.0
51
2.43.0
diff view generated by jsdifflib
Deleted patch
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
1
3
Extract address_announced() interface of the userspace PM from the handler
4
of netlink command MPTCP_PM_CMD_ANNOUNCE mptcp_pm_nl_announce_doit(), only
5
leave the code for obtaining msk through "info" and parsing address entry
6
in the handler.
7
8
This interface is invoked under holding the msk socket lock.
9
10
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
11
---
12
net/mptcp/pm_userspace.c | 49 ++++++++++++++++++++++++++--------------
13
1 file changed, 32 insertions(+), 17 deletions(-)
14
15
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/net/mptcp/pm_userspace.c
18
+++ b/net/mptcp/pm_userspace.c
19
@@ -XXX,XX +XXX,XX @@ static struct mptcp_sock *mptcp_userspace_pm_get_sock(const struct genl_info *in
20
    return msk;
21
}
22
23
+static int mptcp_userspace_pm_address_announced(struct mptcp_sock *msk,
24
+                        struct mptcp_pm_param *param)
25
+{
26
+    struct mptcp_pm_addr_entry *local = &param->entry;
27
+    int err;
28
+
29
+    err = mptcp_userspace_pm_append_new_local_addr(msk, local, false);
30
+    if (err < 0)
31
+        return err;
32
+
33
+    spin_lock_bh(&msk->pm.lock);
34
+
35
+    if (mptcp_pm_alloc_anno_list(msk, &local->addr)) {
36
+        msk->pm.add_addr_signaled++;
37
+        mptcp_pm_announce_addr(msk, &local->addr, false);
38
+        mptcp_pm_nl_addr_send_ack(msk);
39
+    }
40
+
41
+    spin_unlock_bh(&msk->pm.lock);
42
+
43
+    return 0;
44
+}
45
+
46
int mptcp_pm_nl_announce_doit(struct sk_buff *skb, struct genl_info *info)
47
{
48
    struct mptcp_pm_addr_entry addr_val;
49
+    struct mptcp_pm_param param;
50
    struct mptcp_sock *msk;
51
    struct nlattr *addr;
52
    int err = -EINVAL;
53
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_announce_doit(struct sk_buff *skb, struct genl_info *info)
54
        goto announce_err;
55
    }
56
57
-    err = mptcp_userspace_pm_append_new_local_addr(msk, &addr_val, false);
58
-    if (err < 0) {
59
-        NL_SET_ERR_MSG_ATTR(info->extack, addr,
60
-                 "did not match address and id");
61
-        goto announce_err;
62
-    }
63
-
64
    lock_sock(sk);
65
-    spin_lock_bh(&msk->pm.lock);
66
-
67
-    if (mptcp_pm_alloc_anno_list(msk, &addr_val.addr)) {
68
-        msk->pm.add_addr_signaled++;
69
-        mptcp_pm_announce_addr(msk, &addr_val.addr, false);
70
-        mptcp_pm_nl_addr_send_ack(msk);
71
-    }
72
-
73
-    spin_unlock_bh(&msk->pm.lock);
74
+    mptcp_pm_param_set_contexts(&param, &addr_val, NULL);
75
+    err = msk->pm.ops && msk->pm.ops->address_announced ?
76
+     msk->pm.ops->address_announced(msk, &param) :
77
+     mptcp_userspace_pm_address_announced(msk, &param);
78
    release_sock(sk);
79
+    if (err)
80
+        NL_SET_ERR_MSG_ATTR(info->extack, addr,
81
+                 "did not match address and id");
82
83
-    err = 0;
84
announce_err:
85
    sock_put(sk);
86
    return err;
87
@@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr,
88
}
89
90
static struct mptcp_pm_ops mptcp_userspace_pm = {
91
+    .address_announced    = mptcp_userspace_pm_address_announced,
92
    .get_local_id        = mptcp_userspace_pm_get_local_id,
93
    .get_priority        = mptcp_userspace_pm_get_priority,
94
    .type            = MPTCP_PM_TYPE_USERSPACE,
95
--
96
2.43.0
diff view generated by jsdifflib