1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
2
3
v4:
4
- include a new patch "define BPF path manager type".
5
6
- add new interfaces:
7
    created established closed
8
    listerner_created listener_closed
9
10
- rename interfaces as:
11
    address_announced address_removed
12
    subflow_established subflow_closed
13
    get_priority set_priority
14
15
- rename functions as:
16
    mptcp_pm_validate
17
    mptcp_pm_register
18
    mptcp_pm_unregister
19
    mptcp_pm_initialize
20
    mptcp_pm_release
21
22
v3:
23
- rename the 2nd parameter of get_local_id() from 'local' to 'skc'.
24
- keep the 'msk_sport' check in mptcp_userspace_pm_get_local_id().
25
- return 'err' instead of '0' in userspace_pm_subflow_create().
26
- drop 'ret' variable inmptcp_pm_data_reset().
27
- fix typos in commit log.
28
3
v2:
29
v2:
4
30
- update get_local_id interface in patch 2.
5
- update get_local_id interface in patch 2.
6
7
Depends on: "BPF path manager, part 3" v3
8
9
Based-on: <cover.1736935086.git.tanggeliang@kylinos.cn>
10
31
11
get_addr() and dump_addr() interfaces of BPF userspace pm are dropped
32
get_addr() and dump_addr() interfaces of BPF userspace pm are dropped
12
as Matt suggested.
33
as Matt suggested.
13
34
14
In order to implement BPF userspace path manager, it is necessary to
35
In order to implement BPF userspace path manager, it is necessary to
15
unify the interfaces of the path manager. This set contains some
36
unify the interfaces of the path manager. This set contains some
16
cleanups and refactoring to unify the interfaces in kernel space.
37
cleanups and refactoring to unify the interfaces in kernel space.
17
Finally, define a struct mptcp_pm_ops for a userspace path manager
38
Finally, define a struct mptcp_pm_ops for a userspace path manager
18
like this:
39
like this:
19
40
20
struct mptcp_pm_ops {
41
struct mptcp_pm_ops {
21
    int (*address_announce)(struct mptcp_sock *msk,
42
int (*created)(struct mptcp_sock *msk);
22
                struct mptcp_pm_addr_entry *local);
43
int (*established)(struct mptcp_sock *msk);
23
    int (*address_remove)(struct mptcp_sock *msk, u8 id);
44
int (*closed)(struct mptcp_sock *msk);
24
    int (*subflow_create)(struct mptcp_sock *msk,
45
int (*address_announced)(struct mptcp_sock *msk,
25
             struct mptcp_pm_addr_entry *local,
46
struct mptcp_pm_addr_entry *local);
26
             struct mptcp_addr_info *remote);
47
int (*address_removed)(struct mptcp_sock *msk, u8 id);
27
    int (*subflow_destroy)(struct mptcp_sock *msk,
48
int (*subflow_established)(struct mptcp_sock *msk,
28
             struct mptcp_pm_addr_entry *local,
49
struct mptcp_pm_addr_entry *local,
29
             struct mptcp_addr_info *remote);
50
struct mptcp_addr_info *remote);
30
    int (*get_local_id)(struct mptcp_sock *msk,
51
int (*subflow_closed)(struct mptcp_sock *msk,
31
             struct mptcp_pm_addr_entry *local);
52
struct mptcp_pm_addr_entry *local,
32
    u8 (*get_flags)(struct mptcp_sock *msk,
53
struct mptcp_addr_info *remote);
33
            struct mptcp_addr_info *skc);
54
int (*get_local_id)(struct mptcp_sock *msk,
34
    int (*set_flags)(struct mptcp_sock *msk,
55
struct mptcp_pm_addr_entry *skc);
35
             struct mptcp_pm_addr_entry *local,
56
bool (*get_priority)(struct mptcp_sock *msk,
36
             struct mptcp_addr_info *remote);
57
struct mptcp_addr_info *skc);
58
int (*set_priority)(struct mptcp_sock *msk,
59
struct mptcp_pm_addr_entry *local,
60
struct mptcp_addr_info *remote);
61
int (*listener_created)(struct mptcp_sock *msk);
62
int (*listener_closed)(struct mptcp_sock *msk);
37
63
38
    u8            type;
64
u8 type;
39
    struct module        *owner;
65
struct module *owner;
40
    struct list_head    list;
66
struct list_head list;
41
67
42
    void (*init)(struct mptcp_sock *msk);
68
void (*init)(struct mptcp_sock *msk);
43
    void (*release)(struct mptcp_sock *msk);
69
void (*release)(struct mptcp_sock *msk);
44
} ____cacheline_aligned_in_smp;
70
} ____cacheline_aligned_in_smp;
45
71
46
Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/74
72
Geliang Tang (4):
73
mptcp: define struct mptcp_pm_ops
74
mptcp: define BPF path manager type
75
mptcp: register default userspace pm
76
mptcp: initialize and release mptcp_pm_ops
47
77
48
Geliang Tang (3):
78
include/net/mptcp.h | 32 +++++
49
mptcp: define struct mptcp_pm_ops
79
net/mptcp/pm.c | 109 ++++++++++++++-
50
mptcp: register default userspace pm
80
net/mptcp/pm_netlink.c | 11 +-
51
mptcp: init and release mptcp_pm_ops
81
net/mptcp/pm_userspace.c | 294 ++++++++++++++++++++++++---------------
52
82
net/mptcp/protocol.c | 10 +-
53
include/net/mptcp.h | 27 +++
83
net/mptcp/protocol.h | 15 +-
54
net/mptcp/pm.c | 8 +
84
6 files changed, 355 insertions(+), 116 deletions(-)
55
net/mptcp/pm_userspace.c | 376 ++++++++++++++++++++++++++++-----------
56
net/mptcp/protocol.c | 1 +
57
net/mptcp/protocol.h | 9 +
58
5 files changed, 317 insertions(+), 104 deletions(-)
59
85
60
--
86
--
61
2.43.0
87
2.43.0
diff view generated by jsdifflib
...
...
7
Add a set of functions to register, unregister, find and validate a
7
Add a set of functions to register, unregister, find and validate a
8
given struct ops.
8
given struct ops.
9
9
10
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
10
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
11
---
11
---
12
include/net/mptcp.h | 27 +++++++++++++++++++
12
include/net/mptcp.h | 32 ++++++++++++++++++++++++
13
net/mptcp/pm_userspace.c | 57 ++++++++++++++++++++++++++++++++++++++++
13
net/mptcp/pm.c | 59 ++++++++++++++++++++++++++++++++++++++++++++
14
net/mptcp/protocol.h | 5 ++++
14
net/mptcp/protocol.h | 5 ++++
15
3 files changed, 89 insertions(+)
15
3 files changed, 96 insertions(+)
16
16
17
diff --git a/include/net/mptcp.h b/include/net/mptcp.h
17
diff --git a/include/net/mptcp.h b/include/net/mptcp.h
18
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
19
--- a/include/net/mptcp.h
19
--- a/include/net/mptcp.h
20
+++ b/include/net/mptcp.h
20
+++ b/include/net/mptcp.h
...
...
29
@@ -XXX,XX +XXX,XX @@ struct mptcp_sched_ops {
29
@@ -XXX,XX +XXX,XX @@ struct mptcp_sched_ops {
30
    void (*release)(struct mptcp_sock *msk);
30
    void (*release)(struct mptcp_sock *msk);
31
} ____cacheline_aligned_in_smp;
31
} ____cacheline_aligned_in_smp;
32
32
33
+struct mptcp_pm_ops {
33
+struct mptcp_pm_ops {
34
+    int (*address_announce)(struct mptcp_sock *msk,
34
+    int (*created)(struct mptcp_sock *msk);
35
+                struct mptcp_pm_addr_entry *local);
35
+    int (*established)(struct mptcp_sock *msk);
36
+    int (*address_remove)(struct mptcp_sock *msk, u8 id);
36
+    int (*closed)(struct mptcp_sock *msk);
37
+    int (*subflow_create)(struct mptcp_sock *msk,
37
+    int (*address_announced)(struct mptcp_sock *msk,
38
+                 struct mptcp_pm_addr_entry *local);
39
+    int (*address_removed)(struct mptcp_sock *msk, u8 id);
40
+    int (*subflow_established)(struct mptcp_sock *msk,
41
+                 struct mptcp_pm_addr_entry *local,
42
+                 struct mptcp_addr_info *remote);
43
+    int (*subflow_closed)(struct mptcp_sock *msk,
38
+             struct mptcp_pm_addr_entry *local,
44
+             struct mptcp_pm_addr_entry *local,
39
+             struct mptcp_addr_info *remote);
45
+             struct mptcp_addr_info *remote);
40
+    int (*subflow_destroy)(struct mptcp_sock *msk,
41
+             struct mptcp_pm_addr_entry *local,
42
+             struct mptcp_addr_info *remote);
43
+    int (*get_local_id)(struct mptcp_sock *msk,
46
+    int (*get_local_id)(struct mptcp_sock *msk,
44
+             struct mptcp_pm_addr_entry *local);
47
+             struct mptcp_pm_addr_entry *skc);
45
+    u8 (*get_flags)(struct mptcp_sock *msk,
48
+    bool (*get_priority)(struct mptcp_sock *msk,
46
+            struct mptcp_addr_info *skc);
49
+             struct mptcp_addr_info *skc);
47
+    int (*set_flags)(struct mptcp_sock *msk,
50
+    int (*set_priority)(struct mptcp_sock *msk,
48
+             struct mptcp_pm_addr_entry *local,
51
+             struct mptcp_pm_addr_entry *local,
49
+             struct mptcp_addr_info *remote);
52
+             struct mptcp_addr_info *remote);
53
+    int (*listener_created)(struct mptcp_sock *msk);
54
+    int (*listener_closed)(struct mptcp_sock *msk);
50
+
55
+
51
+    u8            type;
56
+    u8            type;
52
+    struct module        *owner;
57
+    struct module        *owner;
53
+    struct list_head    list;
58
+    struct list_head    list;
54
+
59
+
...
...
57
+} ____cacheline_aligned_in_smp;
62
+} ____cacheline_aligned_in_smp;
58
+
63
+
59
#ifdef CONFIG_MPTCP
64
#ifdef CONFIG_MPTCP
60
void mptcp_init(void);
65
void mptcp_init(void);
61
66
62
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
67
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
63
index XXXXXXX..XXXXXXX 100644
68
index XXXXXXX..XXXXXXX 100644
64
--- a/net/mptcp/pm_userspace.c
69
--- a/net/mptcp/pm.c
65
+++ b/net/mptcp/pm_userspace.c
70
+++ b/net/mptcp/pm.c
66
@@ -XXX,XX +XXX,XX @@
71
@@ -XXX,XX +XXX,XX @@
67
* Copyright (c) 2022, Intel Corporation.
72
#define pr_fmt(fmt) "MPTCP: " fmt
68
*/
73
69
74
#include <linux/kernel.h>
70
+#include <linux/rculist.h>
75
+#include <linux/rculist.h>
71
+#include <linux/spinlock.h>
76
+#include <linux/spinlock.h>
77
#include <net/mptcp.h>
72
#include "protocol.h"
78
#include "protocol.h"
79
73
#include "mib.h"
80
#include "mib.h"
74
#include "mptcp_pm_gen.h"
81
#include "mptcp_pm_gen.h"
75
@@ -XXX,XX +XXX,XX @@
76
    list_for_each_entry(__entry,                        \
77
             &((__msk)->pm.userspace_pm_local_addr_list), list)
78
82
79
+static DEFINE_SPINLOCK(mptcp_pm_list_lock);
83
+static DEFINE_SPINLOCK(mptcp_pm_list_lock);
80
+static LIST_HEAD(mptcp_pm_list);
84
+static LIST_HEAD(mptcp_pm_list);
81
+
85
+
82
void mptcp_free_local_addr_list(struct mptcp_sock *msk)
86
/* path manager command handlers */
87
88
int mptcp_pm_announce_addr(struct mptcp_sock *msk,
89
@@ -XXX,XX +XXX,XX @@ void __init mptcp_pm_init(void)
83
{
90
{
84
    struct mptcp_pm_addr_entry *entry, *tmp;
91
    mptcp_pm_nl_init();
85
@@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr,
86
    sock_put(sk);
87
    return ret;
88
}
92
}
89
+
93
+
90
+/* Must be called with rcu read lock held */
94
+/* Must be called with rcu read lock held */
91
+struct mptcp_pm_ops *mptcp_pm_find(enum mptcp_pm_type type)
95
+struct mptcp_pm_ops *mptcp_pm_find(enum mptcp_pm_type type)
92
+{
96
+{
...
...
98
+    }
102
+    }
99
+
103
+
100
+    return NULL;
104
+    return NULL;
101
+}
105
+}
102
+
106
+
103
+int mptcp_validate_path_manager(struct mptcp_pm_ops *pm)
107
+int mptcp_pm_validate(struct mptcp_pm_ops *pm)
104
+{
108
+{
105
+    if (!pm->address_announce && !pm->address_remove &&
109
+    if (!pm->created && !pm->established && !pm->closed &&
106
+     !pm->subflow_create && !pm->subflow_destroy &&
110
+     !pm->address_announced && !pm->address_removed &&
107
+     !pm->get_local_id && !pm->get_flags && !pm->set_flags) {
111
+     !pm->subflow_established && !pm->subflow_closed &&
112
+     !pm->get_local_id && !pm->get_priority && !pm->set_priority &&
113
+     !pm->listener_created && !pm->listener_closed) {
108
+        pr_err("%u does not implement required ops\n", pm->type);
114
+        pr_err("%u does not implement required ops\n", pm->type);
109
+        return -EINVAL;
115
+        return -EINVAL;
110
+    }
116
+    }
111
+
117
+
112
+    return 0;
118
+    return 0;
113
+}
119
+}
114
+
120
+
115
+int mptcp_register_path_manager(struct mptcp_pm_ops *pm)
121
+int mptcp_pm_register(struct mptcp_pm_ops *pm)
116
+{
122
+{
117
+    int ret;
123
+    int ret;
118
+
124
+
119
+    ret = mptcp_validate_path_manager(pm);
125
+    ret = mptcp_pm_validate(pm);
120
+    if (ret)
126
+    if (ret)
121
+        return ret;
127
+        return ret;
122
+
128
+
123
+    spin_lock(&mptcp_pm_list_lock);
129
+    spin_lock(&mptcp_pm_list_lock);
124
+    if (mptcp_pm_find(pm->type)) {
130
+    if (mptcp_pm_find(pm->type)) {
...
...
130
+
136
+
131
+    pr_debug("userspace_pm type %u registered\n", pm->type);
137
+    pr_debug("userspace_pm type %u registered\n", pm->type);
132
+    return 0;
138
+    return 0;
133
+}
139
+}
134
+
140
+
135
+void mptcp_unregister_path_manager(struct mptcp_pm_ops *pm)
141
+void mptcp_pm_unregister(struct mptcp_pm_ops *pm)
136
+{
142
+{
137
+    spin_lock(&mptcp_pm_list_lock);
143
+    spin_lock(&mptcp_pm_list_lock);
138
+    list_del_rcu(&pm->list);
144
+    list_del_rcu(&pm->list);
139
+    spin_unlock(&mptcp_pm_list_lock);
145
+    spin_unlock(&mptcp_pm_list_lock);
140
+}
146
+}
...
...
145
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_remove_addr(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_
151
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_remove_addr(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_
146
void mptcp_pm_remove_addr_entry(struct mptcp_sock *msk,
152
void mptcp_pm_remove_addr_entry(struct mptcp_sock *msk,
147
                struct mptcp_pm_addr_entry *entry);
153
                struct mptcp_pm_addr_entry *entry);
148
154
149
+struct mptcp_pm_ops *mptcp_pm_find(enum mptcp_pm_type type);
155
+struct mptcp_pm_ops *mptcp_pm_find(enum mptcp_pm_type type);
150
+int mptcp_validate_path_manager(struct mptcp_pm_ops *pm);
156
+int mptcp_pm_validate(struct mptcp_pm_ops *pm);
151
+int mptcp_register_path_manager(struct mptcp_pm_ops *pm);
157
+int mptcp_pm_register(struct mptcp_pm_ops *pm);
152
+void mptcp_unregister_path_manager(struct mptcp_pm_ops *pm);
158
+void mptcp_pm_unregister(struct mptcp_pm_ops *pm);
153
+
159
+
154
void mptcp_free_local_addr_list(struct mptcp_sock *msk);
160
void mptcp_free_local_addr_list(struct mptcp_sock *msk);
155
161
156
void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk,
162
void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk,
157
--
163
--
158
2.43.0
164
2.43.0
diff view generated by jsdifflib
New patch
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
2
3
This patch defines a new path manager type: MPTCP_PM_TYPE_BPF_USERSPACE,
4
which is used for the userspace path manager implemented in BPF. This
5
path manager is also a userspace path manager, so add this new type in
6
mptcp_pm_is_userspace() too.
7
8
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
9
---
10
net/mptcp/protocol.h | 6 +++++-
11
1 file changed, 5 insertions(+), 1 deletion(-)
12
13
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
14
index XXXXXXX..XXXXXXX 100644
15
--- a/net/mptcp/protocol.h
16
+++ b/net/mptcp/protocol.h
17
@@ -XXX,XX +XXX,XX @@ enum mptcp_pm_status {
18
enum mptcp_pm_type {
19
    MPTCP_PM_TYPE_KERNEL = 0,
20
    MPTCP_PM_TYPE_USERSPACE,
21
+    MPTCP_PM_TYPE_BPF_USERSPACE,
22
23
    __MPTCP_PM_TYPE_NR,
24
    __MPTCP_PM_TYPE_MAX = __MPTCP_PM_TYPE_NR - 1,
25
@@ -XXX,XX +XXX,XX @@ static inline bool mptcp_pm_should_rm_signal(struct mptcp_sock *msk)
26
27
static inline bool mptcp_pm_is_userspace(const struct mptcp_sock *msk)
28
{
29
-    return READ_ONCE(msk->pm.pm_type) == MPTCP_PM_TYPE_USERSPACE;
30
+    enum mptcp_pm_type pm_type = READ_ONCE(msk->pm.pm_type);
31
+
32
+    return (pm_type == MPTCP_PM_TYPE_USERSPACE ||
33
+        pm_type == MPTCP_PM_TYPE_BPF_USERSPACE);
34
}
35
36
static inline bool mptcp_pm_is_kernel(const struct mptcp_sock *msk)
37
--
38
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 original userspace pm as the default path manager,
3
This patch defines the original userspace pm as the default path manager,
4
named mptcp_userspace_pm, and register it in mptcp_pm_data_init().
4
named mptcp_userspace_pm, and register it in mptcp_pm_data_init().
5
5
6
Extract address_announce() interface of the userspace PM from the handler
6
Extract address_announce() interface of the userspace PM from the handler
7
of netlink commond MPTCP_PM_CMD_ANNOUNCE mptcp_pm_nl_announce_doit(), only
7
of netlink command MPTCP_PM_CMD_ANNOUNCE mptcp_pm_nl_announce_doit(), only
8
leave the code for obtaining msk through "info" and parsing address entry
8
leave the code for obtaining msk through "info" and parsing address entry
9
in the handler.
9
in the handler.
10
10
11
Extract address_remove() interface of the userspace PM from the handler
11
Extract address_remove() interface of the userspace PM from the handler
12
of netlink commond MPTCP_PM_CMD_REMOVE mptcp_pm_nl_remove_doit(), only
12
of netlink command MPTCP_PM_CMD_REMOVE mptcp_pm_nl_remove_doit(), only
13
leave the code for parsing address id and obtaining msk through "info"
13
leave the code for parsing address id and obtaining msk through "info"
14
in the handler.
14
in the handler.
15
15
16
Extract subflow_create() interface of the userspace PM from the handler of
16
Extract subflow_create() interface of the userspace PM from the handler of
17
netlink commond MPTCP_PM_CMD_SUBFLOW_CREATE
17
netlink command MPTCP_PM_CMD_SUBFLOW_CREATE
18
18
19
    mptcp_pm_nl_subflow_create_doit(),
19
    mptcp_pm_nl_subflow_create_doit(),
20
20
21
only leave the code for obtaining msk through "info", parsing local address
21
only leave the code for obtaining msk through "info", parsing local address
22
entry and parsing remote address info in the handler.
22
entry and parsing remote address info in the handler.
23
23
24
Extract subflow_destroy() interface of the userspace PM from the handler of
24
Extract subflow_destroy() interface of the userspace PM from the handler of
25
netlink commond MPTCP_PM_CMD_SUBFLOW_DESTROY
25
netlink command MPTCP_PM_CMD_SUBFLOW_DESTROY
26
26
27
    mptcp_pm_nl_subflow_destroy_doit(),
27
    mptcp_pm_nl_subflow_destroy_doit(),
28
28
29
only leave the code for obtaining msk through "info", parsing local address
29
only leave the code for obtaining msk through "info", parsing local address
30
entry and parsing remote address info in the handler.
30
entry and parsing remote address info in the handler.
...
...
44
becomes a wrapper.
44
becomes a wrapper.
45
45
46
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
46
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
47
---
47
---
48
net/mptcp/pm.c | 1 +
48
net/mptcp/pm.c | 1 +
49
net/mptcp/pm_userspace.c | 275 ++++++++++++++++++++++++---------------
49
net/mptcp/pm_userspace.c | 280 +++++++++++++++++++++++----------------
50
net/mptcp/protocol.h | 1 +
50
net/mptcp/protocol.h | 1 +
51
3 files changed, 173 insertions(+), 104 deletions(-)
51
3 files changed, 171 insertions(+), 111 deletions(-)
52
52
53
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
53
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
54
index XXXXXXX..XXXXXXX 100644
54
index XXXXXXX..XXXXXXX 100644
55
--- a/net/mptcp/pm.c
55
--- a/net/mptcp/pm.c
56
+++ b/net/mptcp/pm.c
56
+++ b/net/mptcp/pm.c
57
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_data_init(struct mptcp_sock *msk)
57
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_data_init(struct mptcp_sock *msk)
58
void __init mptcp_pm_init(void)
58
void __init mptcp_pm_init(void)
59
{
59
{
60
    mptcp_pm_nl_init();
60
    mptcp_pm_nl_init();
61
+    mptcp_userspace_pm_init();
61
+    mptcp_userspace_pm_init();
62
}
62
}
63
64
/* Must be called with rcu read lock held */
63
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
65
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
64
index XXXXXXX..XXXXXXX 100644
66
index XXXXXXX..XXXXXXX 100644
65
--- a/net/mptcp/pm_userspace.c
67
--- a/net/mptcp/pm_userspace.c
66
+++ b/net/mptcp/pm_userspace.c
68
+++ b/net/mptcp/pm_userspace.c
67
@@ -XXX,XX +XXX,XX @@ mptcp_userspace_pm_lookup_addr_by_id(struct mptcp_sock *msk, unsigned int id)
69
@@ -XXX,XX +XXX,XX @@ mptcp_userspace_pm_lookup_addr_by_id(struct mptcp_sock *msk, unsigned int id)
68
    return NULL;
70
    return NULL;
69
}
71
}
70
72
71
-int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
73
-int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
72
-                 struct mptcp_addr_info *skc)
74
-                 struct mptcp_addr_info *skc)
73
+static int userspace_pm_get_local_id(struct mptcp_sock *msk,
75
+static int userspace_pm_get_local_id(struct mptcp_sock *msk,
74
+                 struct mptcp_pm_addr_entry *local)
76
+                 struct mptcp_pm_addr_entry *skc)
75
{
77
{
76
-    struct mptcp_pm_addr_entry *entry = NULL, new_entry;
78
-    struct mptcp_pm_addr_entry *entry = NULL, new_entry;
77
    __be16 msk_sport = ((struct inet_sock *)
79
-    __be16 msk_sport = ((struct inet_sock *)
78
             inet_sk((struct sock *)msk))->inet_sport;
80
-             inet_sk((struct sock *)msk))->inet_sport;
79
+    struct mptcp_pm_addr_entry *entry;
81
+    struct mptcp_pm_addr_entry *entry;
80
82
81
    spin_lock_bh(&msk->pm.lock);
83
    spin_lock_bh(&msk->pm.lock);
82
-    entry = mptcp_userspace_pm_lookup_addr(msk, skc);
84
-    entry = mptcp_userspace_pm_lookup_addr(msk, skc);
83
+    entry = mptcp_userspace_pm_lookup_addr(msk, &local->addr);
85
+    entry = mptcp_userspace_pm_lookup_addr(msk, &skc->addr);
84
    spin_unlock_bh(&msk->pm.lock);
86
    spin_unlock_bh(&msk->pm.lock);
85
    if (entry)
87
    if (entry)
86
        return entry->addr.id;
88
        return entry->addr.id;
87
89
88
+    if (local->addr.port == msk_sport)
90
+    return mptcp_userspace_pm_append_new_local_addr(msk, skc, true);
89
+        local->addr.port = 0;
90
+
91
+    return mptcp_userspace_pm_append_new_local_addr(msk, local, true);
92
+}
91
+}
93
+
92
+
94
+int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
93
+int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
95
+                 struct mptcp_addr_info *skc)
94
+                 struct mptcp_addr_info *skc)
96
+{
95
+{
96
+    __be16 msk_sport = ((struct inet_sock *)
97
+             inet_sk((struct sock *)msk))->inet_sport;
97
+    struct mptcp_pm_addr_entry new_entry;
98
+    struct mptcp_pm_addr_entry new_entry;
98
+
99
+
99
    memset(&new_entry, 0, sizeof(struct mptcp_pm_addr_entry));
100
    memset(&new_entry, 0, sizeof(struct mptcp_pm_addr_entry));
100
    new_entry.addr = *skc;
101
    new_entry.addr = *skc;
101
    new_entry.addr.id = 0;
102
    new_entry.addr.id = 0;
102
    new_entry.flags = MPTCP_PM_ADDR_FLAG_IMPLICIT;
103
@@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
103
104
    if (new_entry.addr.port == msk_sport)
104
-    if (new_entry.addr.port == msk_sport)
105
        new_entry.addr.port = 0;
105
-        new_entry.addr.port = 0;
106
106
-
107
-    return mptcp_userspace_pm_append_new_local_addr(msk, &new_entry, true);
107
-    return mptcp_userspace_pm_append_new_local_addr(msk, &new_entry, true);
108
+    return userspace_pm_get_local_id(msk, &new_entry);
108
+    return userspace_pm_get_local_id(msk, &new_entry);
109
}
109
}
110
110
111
-u8 mptcp_userspace_pm_get_flags(struct mptcp_sock *msk,
111
-bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk,
112
-                struct mptcp_addr_info *skc)
112
-                 struct mptcp_addr_info *skc)
113
+static u8 userspace_pm_get_flags(struct mptcp_sock *msk,
113
+static bool userspace_pm_get_priority(struct mptcp_sock *msk,
114
+                 struct mptcp_addr_info *skc)
114
+                 struct mptcp_addr_info *skc)
115
{
115
{
116
    struct mptcp_pm_addr_entry *entry;
116
    struct mptcp_pm_addr_entry *entry;
117
    u8 flags;
117
    bool backup;
118
@@ -XXX,XX +XXX,XX @@ u8 mptcp_userspace_pm_get_flags(struct mptcp_sock *msk,
118
@@ -XXX,XX +XXX,XX @@ bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk,
119
    return flags;
119
    return backup;
120
}
120
}
121
121
122
+u8 mptcp_userspace_pm_get_flags(struct mptcp_sock *msk,
122
+bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk,
123
+                struct mptcp_addr_info *skc)
123
+                 struct mptcp_addr_info *skc)
124
+{
124
+{
125
+    return userspace_pm_get_flags(msk, skc);
125
+    return userspace_pm_get_priority(msk, skc);
126
+}
126
+}
127
+
127
+
128
static struct mptcp_sock *mptcp_userspace_pm_get_sock(const struct genl_info *info)
128
static struct mptcp_sock *mptcp_userspace_pm_get_sock(const struct genl_info *info)
129
{
129
{
130
    struct mptcp_sock *msk;
130
    struct mptcp_sock *msk;
131
@@ -XXX,XX +XXX,XX @@ static struct mptcp_sock *mptcp_userspace_pm_get_sock(const struct genl_info *in
131
@@ -XXX,XX +XXX,XX @@ static struct mptcp_sock *mptcp_userspace_pm_get_sock(const struct genl_info *in
132
    return msk;
132
    return msk;
133
}
133
}
134
134
135
+static int userspace_pm_address_announce(struct mptcp_sock *msk,
135
+static int userspace_pm_address_announced(struct mptcp_sock *msk,
136
+                     struct mptcp_pm_addr_entry *local)
136
+                     struct mptcp_pm_addr_entry *local)
137
+{
137
+{
138
+    int err;
138
+    int err;
139
+
139
+
140
+    err = mptcp_userspace_pm_append_new_local_addr(msk, local, false);
140
+    err = mptcp_userspace_pm_append_new_local_addr(msk, local, false);
141
+    if (err < 0)
141
+    if (err < 0)
...
...
176
-        mptcp_pm_announce_addr(msk, &addr_val.addr, false);
176
-        mptcp_pm_announce_addr(msk, &addr_val.addr, false);
177
-        mptcp_pm_nl_addr_send_ack(msk);
177
-        mptcp_pm_nl_addr_send_ack(msk);
178
-    }
178
-    }
179
-
179
-
180
-    spin_unlock_bh(&msk->pm.lock);
180
-    spin_unlock_bh(&msk->pm.lock);
181
+    err = userspace_pm_address_announce(msk, &addr_val);
181
+    err = userspace_pm_address_announced(msk, &addr_val);
182
    release_sock(sk);
182
    release_sock(sk);
183
+    if (err)
183
+    if (err)
184
+        NL_SET_ERR_MSG_ATTR(info->extack, addr,
184
+        NL_SET_ERR_MSG_ATTR(info->extack, addr,
185
+                 "did not match address and id");
185
+                 "did not match address and id");
186
186
187
-    err = 0;
187
-    err = 0;
188
announce_err:
188
announce_err:
189
    sock_put(sk);
189
    sock_put(sk);
190
    return err;
190
    return err;
191
@@ -XXX,XX +XXX,XX @@ static int mptcp_userspace_pm_remove_id_zero_address(struct mptcp_sock *msk)
192
{
193
    struct mptcp_rm_list list = { .nr = 0 };
194
    struct mptcp_subflow_context *subflow;
195
-    struct sock *sk = (struct sock *)msk;
196
    bool has_id_0 = false;
197
-    int err = -EINVAL;
198
199
-    lock_sock(sk);
200
    mptcp_for_each_subflow(msk, subflow) {
201
        if (READ_ONCE(subflow->local_id) == 0) {
202
            has_id_0 = true;
203
@@ -XXX,XX +XXX,XX @@ static int mptcp_userspace_pm_remove_id_zero_address(struct mptcp_sock *msk)
204
        }
205
    }
206
    if (!has_id_0)
207
-        goto remove_err;
208
+        return -EINVAL;
209
210
    list.ids[list.nr++] = 0;
211
212
@@ -XXX,XX +XXX,XX @@ static int mptcp_userspace_pm_remove_id_zero_address(struct mptcp_sock *msk)
213
    mptcp_pm_remove_addr(msk, &list);
214
    spin_unlock_bh(&msk->pm.lock);
215
216
-    err = 0;
217
-
218
-remove_err:
219
-    release_sock(sk);
220
-    return err;
221
+    return 0;
222
}
223
224
void mptcp_pm_remove_addr_entry(struct mptcp_sock *msk,
191
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_remove_addr_entry(struct mptcp_sock *msk,
225
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_remove_addr_entry(struct mptcp_sock *msk,
192
    spin_unlock_bh(&msk->pm.lock);
226
    spin_unlock_bh(&msk->pm.lock);
193
}
227
}
194
228
195
+static int userspace_pm_address_remove(struct mptcp_sock *msk, u8 id)
229
+static int userspace_pm_address_removed(struct mptcp_sock *msk, u8 id)
196
+{
230
+{
197
+    struct mptcp_pm_addr_entry *entry;
231
+    struct mptcp_pm_addr_entry *entry;
198
+
232
+
199
+    if (id == 0)
233
+    if (id == 0)
200
+        return mptcp_userspace_pm_remove_id_zero_address(msk);
234
+        return mptcp_userspace_pm_remove_id_zero_address(msk);
...
...
221
-    struct mptcp_pm_addr_entry *match;
255
-    struct mptcp_pm_addr_entry *match;
222
    struct mptcp_sock *msk;
256
    struct mptcp_sock *msk;
223
    struct nlattr *id;
257
    struct nlattr *id;
224
    int err = -EINVAL;
258
    int err = -EINVAL;
225
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
259
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
260
226
    sk = (struct sock *)msk;
261
    sk = (struct sock *)msk;
227
262
228
    lock_sock(sk);
229
-
230
-    if (id_val == 0) {
263
-    if (id_val == 0) {
231
-        err = mptcp_userspace_pm_remove_id_zero_address(msk);
264
-        err = mptcp_userspace_pm_remove_id_zero_address(msk);
232
-        release_sock(sk);
233
-        goto out;
265
-        goto out;
234
-    }
266
-    }
267
-
268
    lock_sock(sk);
235
-
269
-
236
-    spin_lock_bh(&msk->pm.lock);
270
-    spin_lock_bh(&msk->pm.lock);
237
-    match = mptcp_userspace_pm_lookup_addr_by_id(msk, id_val);
271
-    match = mptcp_userspace_pm_lookup_addr_by_id(msk, id_val);
238
-    if (!match) {
272
-    if (!match) {
239
-        spin_unlock_bh(&msk->pm.lock);
273
-        spin_unlock_bh(&msk->pm.lock);
...
...
244
-    list_del_rcu(&match->list);
278
-    list_del_rcu(&match->list);
245
-    spin_unlock_bh(&msk->pm.lock);
279
-    spin_unlock_bh(&msk->pm.lock);
246
-
280
-
247
-    mptcp_pm_remove_addr_entry(msk, match);
281
-    mptcp_pm_remove_addr_entry(msk, match);
248
-
282
-
249
+    err = userspace_pm_address_remove(msk, id_val);
283
+    err = userspace_pm_address_removed(msk, id_val);
250
    release_sock(sk);
284
    release_sock(sk);
251
-
285
-
252
-    sock_kfree_s(sk, match, sizeof(*match));
286
-    sock_kfree_s(sk, match, sizeof(*match));
253
-
287
-
254
-    err = 0;
288
-    err = 0;
...
...
258
                    "address with id %u not found",
292
                    "address with id %u not found",
259
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
293
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
260
    return err;
294
    return err;
261
}
295
}
262
296
263
+static int userspace_pm_subflow_create(struct mptcp_sock *msk,
297
+static int userspace_pm_subflow_established(struct mptcp_sock *msk,
264
+                 struct mptcp_pm_addr_entry *entry,
298
+                     struct mptcp_pm_addr_entry *entry,
265
+                 struct mptcp_addr_info *remote)
299
+                     struct mptcp_addr_info *remote)
266
+{
300
+{
267
+    struct sock *sk = (struct sock *)msk;
301
+    struct sock *sk = (struct sock *)msk;
268
+    struct mptcp_pm_local local;
302
+    struct mptcp_pm_local local;
269
+    int err;
303
+    int err;
270
+
304
+
...
...
282
+        mptcp_userspace_pm_delete_local_addr(msk, entry);
316
+        mptcp_userspace_pm_delete_local_addr(msk, entry);
283
+    else
317
+    else
284
+        msk->pm.subflows++;
318
+        msk->pm.subflows++;
285
+    spin_unlock_bh(&msk->pm.lock);
319
+    spin_unlock_bh(&msk->pm.lock);
286
+
320
+
287
+    return 0;
321
+    return err;
288
+}
322
+}
289
+
323
+
290
int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)
324
int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)
291
{
325
{
292
    struct mptcp_pm_addr_entry entry = { 0 };
326
    struct mptcp_pm_addr_entry entry = { 0 };
...
...
311
-    local.flags = entry.flags;
345
-    local.flags = entry.flags;
312
-    local.ifindex = entry.ifindex;
346
-    local.ifindex = entry.ifindex;
313
-
347
-
314
    lock_sock(sk);
348
    lock_sock(sk);
315
-    err = __mptcp_subflow_connect(sk, &local, &addr_r);
349
-    err = __mptcp_subflow_connect(sk, &local, &addr_r);
316
+    err = userspace_pm_subflow_create(msk, &entry, &addr_r);
350
+    err = userspace_pm_subflow_established(msk, &entry, &addr_r);
317
    release_sock(sk);
351
    release_sock(sk);
318
352
319
    if (err)
353
    if (err)
320
        GENL_SET_ERR_MSG_FMT(info, "connect error: %d", err);
354
        GENL_SET_ERR_MSG_FMT(info, "connect error: %d", err);
321
355
...
...
331
    return err;
365
    return err;
332
@@ -XXX,XX +XXX,XX @@ static struct sock *mptcp_nl_find_ssk(struct mptcp_sock *msk,
366
@@ -XXX,XX +XXX,XX @@ static struct sock *mptcp_nl_find_ssk(struct mptcp_sock *msk,
333
    return NULL;
367
    return NULL;
334
}
368
}
335
369
336
+static int userspace_pm_subflow_destroy(struct mptcp_sock *msk,
370
+static int userspace_pm_subflow_closed(struct mptcp_sock *msk,
337
+                    struct mptcp_pm_addr_entry *local,
371
+                 struct mptcp_pm_addr_entry *local,
338
+                    struct mptcp_addr_info *remote)
372
+                 struct mptcp_addr_info *remote)
339
+{
373
+{
340
+    struct sock *ssk, *sk = (struct sock *)msk;
374
+    struct sock *ssk, *sk = (struct sock *)msk;
341
+
375
+
342
+    ssk = mptcp_nl_find_ssk(msk, &local->addr, remote);
376
+    ssk = mptcp_nl_find_ssk(msk, &local->addr, remote);
343
+    if (!ssk)
377
+    if (!ssk)
...
...
381
-    spin_unlock_bh(&msk->pm.lock);
415
-    spin_unlock_bh(&msk->pm.lock);
382
-    mptcp_subflow_shutdown(sk, ssk, RCV_SHUTDOWN | SEND_SHUTDOWN);
416
-    mptcp_subflow_shutdown(sk, ssk, RCV_SHUTDOWN | SEND_SHUTDOWN);
383
-    mptcp_close_ssk(sk, ssk, mptcp_subflow_ctx(ssk));
417
-    mptcp_close_ssk(sk, ssk, mptcp_subflow_ctx(ssk));
384
-    MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_RMSUBFLOW);
418
-    MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_RMSUBFLOW);
385
-release_sock:
419
-release_sock:
386
+    err = userspace_pm_subflow_destroy(msk, &addr_l, &addr_r);
420
+    err = userspace_pm_subflow_closed(msk, &addr_l, &addr_r);
387
    release_sock(sk);
421
    release_sock(sk);
388
+    if (err)
422
+    if (err)
389
+        GENL_SET_ERR_MSG(info, "subflow not found");
423
+        GENL_SET_ERR_MSG(info, "subflow not found");
390
424
391
destroy_err:
425
destroy_err:
392
    sock_put(sk);
426
    sock_put(sk);
393
    return err;
427
    return err;
394
}
428
}
395
429
396
+static int userspace_pm_set_flags(struct mptcp_sock *msk,
430
+static int userspace_pm_set_priority(struct mptcp_sock *msk,
397
+                 struct mptcp_pm_addr_entry *local,
431
+                 struct mptcp_pm_addr_entry *local,
398
+                 struct mptcp_addr_info *remote)
432
+                 struct mptcp_addr_info *remote)
399
+{
433
+{
400
+    struct mptcp_pm_addr_entry *entry;
434
+    struct mptcp_pm_addr_entry *entry;
401
+    u8 bkup = 0;
435
+    u8 bkup = 0;
402
+
436
+
403
+    if (local->flags & MPTCP_PM_ADDR_FLAG_BACKUP)
437
+    if (local->flags & MPTCP_PM_ADDR_FLAG_BACKUP)
...
...
446
-    }
480
-    }
447
-    spin_unlock_bh(&msk->pm.lock);
481
-    spin_unlock_bh(&msk->pm.lock);
448
-
482
-
449
    lock_sock(sk);
483
    lock_sock(sk);
450
-    ret = mptcp_pm_nl_mp_prio_send_ack(msk, &local->addr, &rem, bkup);
484
-    ret = mptcp_pm_nl_mp_prio_send_ack(msk, &local->addr, &rem, bkup);
451
+    ret = userspace_pm_set_flags(msk, local, &rem);
485
+    ret = userspace_pm_set_priority(msk, local, &rem);
452
    release_sock(sk);
486
    release_sock(sk);
453
487
454
    /* mptcp_pm_nl_mp_prio_send_ack() only fails in one case */
488
    /* mptcp_pm_nl_mp_prio_send_ack() only fails in one case */
455
@@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr,
489
@@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr,
490
    sock_put(sk);
456
    return ret;
491
    return ret;
457
}
492
}
458
493
+
459
+static struct mptcp_pm_ops mptcp_userspace_pm = {
494
+static struct mptcp_pm_ops mptcp_userspace_pm = {
460
+    .address_announce    = userspace_pm_address_announce,
495
+    .address_announced    = userspace_pm_address_announced,
461
+    .address_remove        = userspace_pm_address_remove,
496
+    .address_removed    = userspace_pm_address_removed,
462
+    .subflow_create        = userspace_pm_subflow_create,
497
+    .subflow_established    = userspace_pm_subflow_established,
463
+    .subflow_destroy    = userspace_pm_subflow_destroy,
498
+    .subflow_closed        = userspace_pm_subflow_closed,
464
+    .get_local_id        = userspace_pm_get_local_id,
499
+    .get_local_id        = userspace_pm_get_local_id,
465
+    .get_flags        = userspace_pm_get_flags,
500
+    .get_priority        = userspace_pm_get_priority,
466
+    .set_flags        = userspace_pm_set_flags,
501
+    .set_priority        = userspace_pm_set_priority,
467
+    .type            = MPTCP_PM_TYPE_USERSPACE,
502
+    .type            = MPTCP_PM_TYPE_USERSPACE,
468
+    .owner            = THIS_MODULE,
503
+    .owner            = THIS_MODULE,
469
+};
504
+};
470
+
505
+
471
/* Must be called with rcu read lock held */
472
struct mptcp_pm_ops *mptcp_pm_find(enum mptcp_pm_type type)
473
{
474
@@ -XXX,XX +XXX,XX @@ int mptcp_register_path_manager(struct mptcp_pm_ops *pm)
475
476
void mptcp_unregister_path_manager(struct mptcp_pm_ops *pm)
477
{
478
+    if (pm == &mptcp_userspace_pm)
479
+        return;
480
+
481
    spin_lock(&mptcp_pm_list_lock);
482
    list_del_rcu(&pm->list);
483
    spin_unlock(&mptcp_pm_list_lock);
484
}
485
+
486
+void __init mptcp_userspace_pm_init(void)
506
+void __init mptcp_userspace_pm_init(void)
487
+{
507
+{
488
+    mptcp_register_path_manager(&mptcp_userspace_pm);
508
+    mptcp_pm_register(&mptcp_userspace_pm);
489
+}
509
+}
490
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
510
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
491
index XXXXXXX..XXXXXXX 100644
511
index XXXXXXX..XXXXXXX 100644
492
--- a/net/mptcp/protocol.h
512
--- a/net/mptcp/protocol.h
493
+++ b/net/mptcp/protocol.h
513
+++ b/net/mptcp/protocol.h
...
...
diff view generated by jsdifflib
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
2
3
Add a struct mptcp_pm_ops pointer "ops" in struct mptcp_pm_data, and two
3
Add a struct mptcp_pm_ops pointer "ops" in struct mptcp_pm_data, and two
4
functions mptcp_init_pm() and mptcp_release_pm(), to set and release this
4
functions mptcp_pm_initialize() and mptcp_pm_release(), to set and release
5
pointer. mptcp_init_pm() is invoked in mptcp_pm_data_reset(), while
5
this pointer. mptcp_pm_initialize() is invoked in mptcp_pm_data_reset(),
6
mptcp_release_pm() is invoked in __mptcp_destroy_sock().
6
while mptcp_pm_release() is invoked in __mptcp_destroy_sock().
7
7
8
In this way, different userspace path managers can be initialized through
8
In this way, different userspace path managers can be initialized through
9
the pm_type sysctl, and then called into their respective interfaces
9
the pm_type sysctl, and then called into their respective interfaces
10
through "ops" of "msk->pm".
10
through "ops" of "msk->pm".
11
11
12
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
12
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
13
---
13
---
14
net/mptcp/pm.c | 7 +++++
14
net/mptcp/pm.c | 49 ++++++++++++++++++++++++++++++++++++++--
15
net/mptcp/pm_userspace.c | 58 +++++++++++++++++++++++++++++++++++-----
15
net/mptcp/pm_netlink.c | 11 ++++++++-
16
net/mptcp/protocol.c | 1 +
16
net/mptcp/pm_userspace.c | 28 +++++++++++++++++------
17
net/mptcp/protocol.c | 10 +++++++-
17
net/mptcp/protocol.h | 3 +++
18
net/mptcp/protocol.h | 3 +++
18
4 files changed, 62 insertions(+), 7 deletions(-)
19
5 files changed, 90 insertions(+), 11 deletions(-)
19
20
20
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
21
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
21
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
22
--- a/net/mptcp/pm.c
23
--- a/net/mptcp/pm.c
23
+++ b/net/mptcp/pm.c
24
+++ b/net/mptcp/pm.c
24
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_data_reset(struct mptcp_sock *msk)
25
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_new_connection(struct mptcp_sock *msk, const struct sock *ssk, int
26
27
    WRITE_ONCE(pm->server_side, server_side);
28
    mptcp_event(MPTCP_EVENT_CREATED, msk, ssk, GFP_ATOMIC);
29
+
30
+    if (pm->ops && pm->ops->created)
31
+        pm->ops->created(msk);
32
}
33
34
bool mptcp_pm_allow_new_subflow(struct mptcp_sock *msk)
35
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_fully_established(struct mptcp_sock *msk, const struct sock *ssk)
36
    msk->pm.status |= BIT(MPTCP_PM_ALREADY_ESTABLISHED);
37
    spin_unlock_bh(&pm->lock);
38
39
-    if (announce)
40
+    if (announce) {
41
        mptcp_event(MPTCP_EVENT_ESTABLISHED, msk, ssk, GFP_ATOMIC);
42
+
43
+        if (pm->ops && pm->ops->established)
44
+            pm->ops->established(msk);
45
+    }
46
}
47
48
void mptcp_pm_connection_closed(struct mptcp_sock *msk)
25
{
49
{
26
    u8 pm_type = mptcp_get_pm_type(sock_net((struct sock *)msk));
50
    pr_debug("msk=%p\n", msk);
27
    struct mptcp_pm_data *pm = &msk->pm;
51
28
+    int ret;
52
-    if (msk->token)
29
53
+    if (msk->token) {
30
    pm->add_addr_signaled = 0;
54
        mptcp_event(MPTCP_EVENT_CLOSED, msk, NULL, GFP_KERNEL);
31
    pm->add_addr_accepted = 0;
55
+
56
+        if (msk->pm.ops && msk->pm.ops->closed)
57
+            msk->pm.ops->closed(msk);
58
+    }
59
}
60
61
void mptcp_pm_subflow_established(struct mptcp_sock *msk)
32
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_data_reset(struct mptcp_sock *msk)
62
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_data_reset(struct mptcp_sock *msk)
33
        WRITE_ONCE(pm->work_pending, 0);
63
        WRITE_ONCE(pm->work_pending, 0);
34
        WRITE_ONCE(pm->accept_addr, 0);
64
        WRITE_ONCE(pm->accept_addr, 0);
35
        WRITE_ONCE(pm->accept_subflow, 0);
65
        WRITE_ONCE(pm->accept_subflow, 0);
36
+
66
+
37
+        rcu_read_lock();
67
+        rcu_read_lock();
38
+        ret = mptcp_init_pm(msk, mptcp_pm_find(pm_type));
68
+        mptcp_pm_initialize(msk, mptcp_pm_find(pm_type));
39
+        rcu_read_unlock();
69
+        rcu_read_unlock();
40
+        if (ret)
70
    }
41
+            return;
42
    }
43
71
44
    WRITE_ONCE(pm->addr_signal, 0);
72
    WRITE_ONCE(pm->addr_signal, 0);
73
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_unregister(struct mptcp_pm_ops *pm)
74
    list_del_rcu(&pm->list);
75
    spin_unlock(&mptcp_pm_list_lock);
76
}
77
+
78
+int mptcp_pm_initialize(struct mptcp_sock *msk, struct mptcp_pm_ops *pm)
79
+{
80
+    if (!pm)
81
+        return -EINVAL;
82
+
83
+    if (!bpf_try_module_get(pm, pm->owner))
84
+        return -EBUSY;
85
+
86
+    msk->pm.ops = pm;
87
+    if (msk->pm.ops->init)
88
+        msk->pm.ops->init(msk);
89
+
90
+    pr_debug("userspace_pm type %u initialized\n", msk->pm.ops->type);
91
+    return 0;
92
+}
93
+
94
+void mptcp_pm_release(struct mptcp_sock *msk)
95
+{
96
+    struct mptcp_pm_ops *pm = msk->pm.ops;
97
+
98
+    if (!pm)
99
+        return;
100
+
101
+    msk->pm.ops = NULL;
102
+    if (pm->release)
103
+        pm->release(msk);
104
+
105
+    bpf_module_put(pm, pm->owner);
106
+}
107
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
108
index XXXXXXX..XXXXXXX 100644
109
--- a/net/mptcp/pm_netlink.c
110
+++ b/net/mptcp/pm_netlink.c
111
@@ -XXX,XX +XXX,XX @@ static int mptcp_pm_nl_create_listen_socket(struct sock *sk,
112
    int addrlen = sizeof(struct sockaddr_in);
113
    struct sockaddr_storage addr;
114
    struct sock *newsk, *ssk;
115
+    struct mptcp_sock *msk;
116
    int backlog = 1024;
117
    int err;
118
119
@@ -XXX,XX +XXX,XX @@ static int mptcp_pm_nl_create_listen_socket(struct sock *sk,
120
                 is_ipv6 ? "msk_lock-AF_INET6" : "msk_lock-AF_INET",
121
                 &mptcp_keys[is_ipv6]);
122
123
+    msk = mptcp_sk(newsk);
124
    lock_sock(newsk);
125
-    ssk = __mptcp_nmpc_sk(mptcp_sk(newsk));
126
+    ssk = __mptcp_nmpc_sk(msk);
127
    release_sock(newsk);
128
    if (IS_ERR(ssk))
129
        return PTR_ERR(ssk);
130
@@ -XXX,XX +XXX,XX @@ static int mptcp_pm_nl_create_listen_socket(struct sock *sk,
131
    if (!err)
132
        mptcp_event_pm_listener(ssk, MPTCP_EVENT_LISTENER_CREATED);
133
    release_sock(ssk);
134
+
135
+    if (!err) {
136
+        lock_sock(newsk);
137
+        if (msk->pm.ops && msk->pm.ops->listener_created)
138
+            msk->pm.ops->listener_created(msk);
139
+        release_sock(newsk);
140
+    }
141
    return err;
142
}
143
45
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
144
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
46
index XXXXXXX..XXXXXXX 100644
145
index XXXXXXX..XXXXXXX 100644
47
--- a/net/mptcp/pm_userspace.c
146
--- a/net/mptcp/pm_userspace.c
48
+++ b/net/mptcp/pm_userspace.c
147
+++ b/net/mptcp/pm_userspace.c
49
@@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
148
@@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
50
    new_entry.addr.id = 0;
149
    if (new_entry.addr.port == msk_sport)
51
    new_entry.flags = MPTCP_PM_ADDR_FLAG_IMPLICIT;
150
        new_entry.addr.port = 0;
52
151
53
-    return userspace_pm_get_local_id(msk, &new_entry);
152
-    return userspace_pm_get_local_id(msk, &new_entry);
54
+    return msk->pm.ops->get_local_id ?
153
+    return msk->pm.ops && msk->pm.ops->get_local_id ?
55
+     msk->pm.ops->get_local_id(msk, &new_entry) :
154
+     msk->pm.ops->get_local_id(msk, &new_entry) :
56
+     userspace_pm_get_local_id(msk, &new_entry);
155
+     userspace_pm_get_local_id(msk, &new_entry);
57
}
156
}
58
157
59
static u8 userspace_pm_get_flags(struct mptcp_sock *msk,
158
static bool userspace_pm_get_priority(struct mptcp_sock *msk,
60
@@ -XXX,XX +XXX,XX @@ static u8 userspace_pm_get_flags(struct mptcp_sock *msk,
159
@@ -XXX,XX +XXX,XX @@ static bool userspace_pm_get_priority(struct mptcp_sock *msk,
61
u8 mptcp_userspace_pm_get_flags(struct mptcp_sock *msk,
160
bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk,
62
                struct mptcp_addr_info *skc)
161
                 struct mptcp_addr_info *skc)
63
{
162
{
64
-    return userspace_pm_get_flags(msk, skc);
163
-    return userspace_pm_get_priority(msk, skc);
65
+    return msk->pm.ops->get_flags ?
164
+    return msk->pm.ops && msk->pm.ops->get_priority ?
66
+     msk->pm.ops->get_flags(msk, skc) :
165
+     msk->pm.ops->get_priority(msk, skc) :
67
+     userspace_pm_get_flags(msk, skc);
166
+     userspace_pm_get_priority(msk, skc);
68
}
167
}
69
168
70
static struct mptcp_sock *mptcp_userspace_pm_get_sock(const struct genl_info *info)
169
static struct mptcp_sock *mptcp_userspace_pm_get_sock(const struct genl_info *info)
71
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_announce_doit(struct sk_buff *skb, struct genl_info *info)
170
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_announce_doit(struct sk_buff *skb, struct genl_info *info)
72
    }
171
    }
73
172
74
    lock_sock(sk);
173
    lock_sock(sk);
75
-    err = userspace_pm_address_announce(msk, &addr_val);
174
-    err = userspace_pm_address_announced(msk, &addr_val);
76
+    err = msk->pm.ops->address_announce ?
175
+    err = msk->pm.ops && msk->pm.ops->address_announced ?
77
+     msk->pm.ops->address_announce(msk, &addr_val) :
176
+     msk->pm.ops->address_announced(msk, &addr_val) :
78
+     userspace_pm_address_announce(msk, &addr_val);
177
+     userspace_pm_address_announced(msk, &addr_val);
79
    release_sock(sk);
178
    release_sock(sk);
80
    if (err)
179
    if (err)
81
        NL_SET_ERR_MSG_ATTR(info->extack, addr,
180
        NL_SET_ERR_MSG_ATTR(info->extack, addr,
82
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
181
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
83
    sk = (struct sock *)msk;
182
    sk = (struct sock *)msk;
84
183
85
    lock_sock(sk);
184
    lock_sock(sk);
86
-    err = userspace_pm_address_remove(msk, id_val);
185
-    err = userspace_pm_address_removed(msk, id_val);
87
+    err = msk->pm.ops->address_remove ?
186
+    err = msk->pm.ops && msk->pm.ops->address_removed ?
88
+     msk->pm.ops->address_remove(msk, id_val) :
187
+     msk->pm.ops->address_removed(msk, id_val) :
89
+     userspace_pm_address_remove(msk, id_val);
188
+     userspace_pm_address_removed(msk, id_val);
90
    release_sock(sk);
189
    release_sock(sk);
91
    if (err)
190
    if (err)
92
        NL_SET_ERR_MSG_ATTR_FMT(info->extack, id,
191
        NL_SET_ERR_MSG_ATTR_FMT(info->extack, id,
93
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)
192
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)
94
    }
193
    }
95
194
96
    lock_sock(sk);
195
    lock_sock(sk);
97
-    err = userspace_pm_subflow_create(msk, &entry, &addr_r);
196
-    err = userspace_pm_subflow_established(msk, &entry, &addr_r);
98
+    err = msk->pm.ops->subflow_create ?
197
+    err = msk->pm.ops && msk->pm.ops->subflow_established ?
99
+     msk->pm.ops->subflow_create(msk, &entry, &addr_r) :
198
+     msk->pm.ops->subflow_established(msk, &entry, &addr_r) :
100
+     userspace_pm_subflow_create(msk, &entry, &addr_r);
199
+     userspace_pm_subflow_established(msk, &entry, &addr_r);
101
    release_sock(sk);
200
    release_sock(sk);
102
201
103
    if (err)
202
    if (err)
104
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_subflow_destroy_doit(struct sk_buff *skb, struct genl_info *info
203
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_subflow_destroy_doit(struct sk_buff *skb, struct genl_info *info
105
    }
204
    }
106
205
107
    lock_sock(sk);
206
    lock_sock(sk);
108
-    err = userspace_pm_subflow_destroy(msk, &addr_l, &addr_r);
207
-    err = userspace_pm_subflow_closed(msk, &addr_l, &addr_r);
109
+    err = msk->pm.ops->subflow_destroy ?
208
+    err = msk->pm.ops && msk->pm.ops->subflow_closed ?
110
+     msk->pm.ops->subflow_destroy(msk, &addr_l, &addr_r) :
209
+     msk->pm.ops->subflow_closed(msk, &addr_l, &addr_r) :
111
+     userspace_pm_subflow_destroy(msk, &addr_l, &addr_r);
210
+     userspace_pm_subflow_closed(msk, &addr_l, &addr_r);
112
    release_sock(sk);
211
    release_sock(sk);
113
    if (err)
212
    if (err)
114
        GENL_SET_ERR_MSG(info, "subflow not found");
213
        GENL_SET_ERR_MSG(info, "subflow not found");
115
@@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_set_flags(struct mptcp_pm_addr_entry *local,
214
@@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_set_flags(struct mptcp_pm_addr_entry *local,
116
    }
215
    }
117
216
118
    lock_sock(sk);
217
    lock_sock(sk);
119
-    ret = userspace_pm_set_flags(msk, local, &rem);
218
-    ret = userspace_pm_set_priority(msk, local, &rem);
120
+    ret = msk->pm.ops->set_flags ?
219
+    ret = msk->pm.ops && msk->pm.ops->set_priority ?
121
+     msk->pm.ops->set_flags(msk, local, &rem) :
220
+     msk->pm.ops->set_priority(msk, local, &rem) :
122
+     userspace_pm_set_flags(msk, local, &rem);
221
+     userspace_pm_set_priority(msk, local, &rem);
123
    release_sock(sk);
222
    release_sock(sk);
124
223
125
    /* mptcp_pm_nl_mp_prio_send_ack() only fails in one case */
224
    /* mptcp_pm_nl_mp_prio_send_ack() only fails in one case */
126
@@ -XXX,XX +XXX,XX @@ void mptcp_unregister_path_manager(struct mptcp_pm_ops *pm)
127
    spin_unlock(&mptcp_pm_list_lock);
128
}
129
130
+int mptcp_init_pm(struct mptcp_sock *msk, struct mptcp_pm_ops *pm)
131
+{
132
+    if (!pm)
133
+        pm = &mptcp_userspace_pm;
134
+
135
+    if (!bpf_try_module_get(pm, pm->owner))
136
+        return -EBUSY;
137
+
138
+    msk->pm.ops = pm;
139
+    if (msk->pm.ops->init)
140
+        msk->pm.ops->init(msk);
141
+
142
+    pr_debug("userspace_pm type %u initialized\n", msk->pm.ops->type);
143
+    return 0;
144
+}
145
+
146
+void mptcp_release_pm(struct mptcp_sock *msk)
147
+{
148
+    struct mptcp_pm_ops *pm = msk->pm.ops;
149
+
150
+    if (!pm)
151
+        return;
152
+
153
+    msk->pm.ops = NULL;
154
+    if (pm->release)
155
+        pm->release(msk);
156
+
157
+    bpf_module_put(pm, pm->owner);
158
+}
159
+
160
void __init mptcp_userspace_pm_init(void)
161
{
162
    mptcp_register_path_manager(&mptcp_userspace_pm);
163
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
225
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
164
index XXXXXXX..XXXXXXX 100644
226
index XXXXXXX..XXXXXXX 100644
165
--- a/net/mptcp/protocol.c
227
--- a/net/mptcp/protocol.c
166
+++ b/net/mptcp/protocol.c
228
+++ b/net/mptcp/protocol.c
167
@@ -XXX,XX +XXX,XX @@ static void __mptcp_destroy_sock(struct sock *sk)
229
@@ -XXX,XX +XXX,XX @@ static void __mptcp_destroy_sock(struct sock *sk)
168
    sk_stop_timer(sk, &sk->sk_timer);
230
    sk_stop_timer(sk, &sk->sk_timer);
169
    msk->pm.status = 0;
231
    msk->pm.status = 0;
170
    mptcp_release_sched(msk);
232
    mptcp_release_sched(msk);
171
+    mptcp_release_pm(msk);
233
+    mptcp_pm_release(msk);
172
234
173
    sk->sk_prot->destroy(sk);
235
    sk->sk_prot->destroy(sk);
174
236
237
@@ -XXX,XX +XXX,XX @@ static __poll_t mptcp_check_readable(struct sock *sk)
238
239
static void mptcp_check_listen_stop(struct sock *sk)
240
{
241
+    struct mptcp_sock *msk = mptcp_sk(sk);
242
    struct sock *ssk;
243
244
    if (inet_sk_state_load(sk) != TCP_LISTEN)
245
        return;
246
247
    sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
248
-    ssk = mptcp_sk(sk)->first;
249
+    ssk = msk->first;
250
    if (WARN_ON_ONCE(!ssk || inet_sk_state_load(ssk) != TCP_LISTEN))
251
        return;
252
253
@@ -XXX,XX +XXX,XX @@ static void mptcp_check_listen_stop(struct sock *sk)
254
    inet_csk_listen_stop(ssk);
255
    mptcp_event_pm_listener(ssk, MPTCP_EVENT_LISTENER_CLOSED);
256
    release_sock(ssk);
257
+
258
+    if (msk->pm.ops && msk->pm.ops->listener_closed)
259
+        msk->pm.ops->listener_closed(msk);
260
}
261
262
bool __mptcp_close(struct sock *sk, long timeout)
263
@@ -XXX,XX +XXX,XX @@ static int mptcp_listen(struct socket *sock, int backlog)
264
        sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
265
        mptcp_copy_inaddrs(sk, ssk);
266
        mptcp_event_pm_listener(ssk, MPTCP_EVENT_LISTENER_CREATED);
267
+
268
+        if (msk->pm.ops && msk->pm.ops->listener_created)
269
+            msk->pm.ops->listener_created(msk);
270
    }
271
272
unlock:
175
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
273
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
176
index XXXXXXX..XXXXXXX 100644
274
index XXXXXXX..XXXXXXX 100644
177
--- a/net/mptcp/protocol.h
275
--- a/net/mptcp/protocol.h
178
+++ b/net/mptcp/protocol.h
276
+++ b/net/mptcp/protocol.h
179
@@ -XXX,XX +XXX,XX @@ struct mptcp_pm_data {
277
@@ -XXX,XX +XXX,XX @@ struct mptcp_pm_data {
...
...
183
+    struct mptcp_pm_ops *ops;
281
+    struct mptcp_pm_ops *ops;
184
282
185
    spinlock_t    lock;        /*protects the whole PM data */
283
    spinlock_t    lock;        /*protects the whole PM data */
186
284
187
@@ -XXX,XX +XXX,XX @@ struct mptcp_pm_ops *mptcp_pm_find(enum mptcp_pm_type type);
285
@@ -XXX,XX +XXX,XX @@ struct mptcp_pm_ops *mptcp_pm_find(enum mptcp_pm_type type);
188
int mptcp_validate_path_manager(struct mptcp_pm_ops *pm);
286
int mptcp_pm_validate(struct mptcp_pm_ops *pm);
189
int mptcp_register_path_manager(struct mptcp_pm_ops *pm);
287
int mptcp_pm_register(struct mptcp_pm_ops *pm);
190
void mptcp_unregister_path_manager(struct mptcp_pm_ops *pm);
288
void mptcp_pm_unregister(struct mptcp_pm_ops *pm);
191
+int mptcp_init_pm(struct mptcp_sock *msk, struct mptcp_pm_ops *pm);
289
+int mptcp_pm_initialize(struct mptcp_sock *msk, struct mptcp_pm_ops *pm);
192
+void mptcp_release_pm(struct mptcp_sock *msk);
290
+void mptcp_pm_release(struct mptcp_sock *msk);
193
291
194
void mptcp_free_local_addr_list(struct mptcp_sock *msk);
292
void mptcp_free_local_addr_list(struct mptcp_sock *msk);
195
293
196
--
294
--
197
2.43.0
295
2.43.0
diff view generated by jsdifflib