1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
3
v8:
4
- address Matt's comments in v7.
2
5
3
v7:
6
v7:
4
- addresss Matt's comments in v6 [1].
7
- addresss Matt's comments in v6 [1].
5
- drop "type" from struct mptcp_pm_ops as Matt suggested.
8
- drop "type" from struct mptcp_pm_ops as Matt suggested.
6
- map "pm_type" to new sysctl as Matt suggested.
9
- map "pm_type" to new sysctl as Matt suggested.
...
...
61
In order to implement BPF path manager, it's necessary to unify the
64
In order to implement BPF path manager, it's necessary to unify the
62
interfaces of the path manager. This set contains some cleanups and
65
interfaces of the path manager. This set contains some cleanups and
63
refactoring to unify the interfaces in kernel space. Finally, define
66
refactoring to unify the interfaces in kernel space. Finally, define
64
a struct mptcp_pm_ops for a path manager.
67
a struct mptcp_pm_ops for a path manager.
65
68
66
Geliang Tang (11):
69
Geliang Tang (12):
67
mptcp: pm: define struct mptcp_pm_ops
70
mptcp: pm: define struct mptcp_pm_ops
68
mptcp: sysctl: new sysctl to set path manager by name
71
mptcp: sysctl: new sysctl to set path manager by name
69
mptcp: sysctl: map pm_type to path_manager
72
mptcp: sysctl: map pm_type to path_manager
73
mptcp: sysctl: map path_manager to pm_type
70
mptcp: sysctl: add available_path_managers
74
mptcp: sysctl: add available_path_managers
71
mptcp: pm: in-kernel: register mptcp_kernel_pm
75
mptcp: pm: in-kernel: register mptcp_pm_kernel
72
mptcp: pm: userspace: register mptcp_userspace_pm
76
mptcp: pm: userspace: register mptcp_pm_userspace
73
mptcp: pm: initialize and release mptcp_pm_ops
77
mptcp: pm: initialize and release mptcp_pm_ops
74
mptcp: pm: drop pm_type in mptcp_pm_data
78
mptcp: pm: add get_local_id() interface
75
mptcp: sysctl: drop get_pm_type helper
79
mptcp: pm: add get_priority() interface
76
mptcp: pm: make get_local_id helpers static
80
selftests: mptcp: add pm_type mapping tests
77
mptcp: pm: make is_backup helpers static
81
selftests: mptcp: add path_manager sysctl test
78
82
79
Documentation/networking/mptcp-sysctl.rst | 26 +++++
83
Documentation/networking/mptcp-sysctl.rst | 23 +++
80
include/net/mptcp.h | 19 ++++
84
include/net/mptcp.h | 19 +++
81
net/mptcp/ctrl.c | 107 ++++++++++++++++-
85
net/mptcp/ctrl.c | 112 +++++++++++++-
82
net/mptcp/pm.c | 133 +++++++++++++++++++---
86
net/mptcp/pm.c | 145 ++++++++++++++----
83
net/mptcp/pm_kernel.c | 16 ++-
87
net/mptcp/pm_kernel.c | 35 ++++-
84
net/mptcp/pm_userspace.c | 26 ++++-
88
net/mptcp/pm_userspace.c | 36 ++++-
85
net/mptcp/protocol.h | 25 ++--
89
net/mptcp/protocol.h | 18 ++-
86
7 files changed, 317 insertions(+), 35 deletions(-)
90
.../testing/selftests/net/mptcp/mptcp_join.sh | 49 +++++-
91
8 files changed, 393 insertions(+), 44 deletions(-)
87
92
88
--
93
--
89
2.43.0
94
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 | 17 ++++++++++++++
12
include/net/mptcp.h | 12 ++++++++++
13
net/mptcp/pm.c | 55 ++++++++++++++++++++++++++++++++++++++++++++
13
net/mptcp/pm.c | 55 ++++++++++++++++++++++++++++++++++++++++++++
14
net/mptcp/protocol.h | 5 ++++
14
net/mptcp/protocol.h | 5 ++++
15
3 files changed, 77 insertions(+)
15
3 files changed, 72 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
...
...
31
} ____cacheline_aligned_in_smp;
31
} ____cacheline_aligned_in_smp;
32
32
33
+#define MPTCP_PM_NAME_MAX    16
33
+#define MPTCP_PM_NAME_MAX    16
34
+
34
+
35
+struct mptcp_pm_ops {
35
+struct mptcp_pm_ops {
36
+    int (*get_local_id)(struct mptcp_sock *msk,
37
+             struct mptcp_pm_addr_entry *skc);
38
+    bool (*get_priority)(struct mptcp_sock *msk,
39
+             struct mptcp_addr_info *skc);
40
+
41
+    char            name[MPTCP_PM_NAME_MAX];
36
+    char            name[MPTCP_PM_NAME_MAX];
42
+    struct module        *owner;
37
+    struct module        *owner;
43
+    struct list_head    list;
38
+    struct list_head    list;
44
+
39
+
45
+    void (*init)(struct mptcp_sock *msk);
40
+    void (*init)(struct mptcp_sock *msk);
...
...
71
+
66
+
72
/* path manager helpers */
67
/* path manager helpers */
73
68
74
/* if sk is ipv4 or ipv6_only allows only same-family local and remote addresses,
69
/* if sk is ipv4 or ipv6_only allows only same-family local and remote addresses,
75
@@ -XXX,XX +XXX,XX @@ void __init mptcp_pm_init(void)
70
@@ -XXX,XX +XXX,XX @@ void __init mptcp_pm_init(void)
76
{
71
    mptcp_pm_kernel_register();
77
    mptcp_pm_nl_init();
72
    mptcp_pm_nl_init();
78
}
73
}
79
+
74
+
80
+/* Must be called with rcu read lock held */
75
+/* Must be called with rcu read lock held */
81
+struct mptcp_pm_ops *mptcp_pm_find(const char *name)
76
+struct mptcp_pm_ops *mptcp_pm_find(const char *name)
...
...
90
+    return NULL;
85
+    return NULL;
91
+}
86
+}
92
+
87
+
93
+int mptcp_pm_validate(struct mptcp_pm_ops *pm)
88
+int mptcp_pm_validate(struct mptcp_pm_ops *pm)
94
+{
89
+{
95
+    if (!pm->get_local_id || !pm->get_priority) {
90
+    if (!pm->init) {
96
+        pr_err("%s does not implement required ops\n", pm->name);
91
+        pr_err("%s does not implement required ops\n", pm->name);
97
+        return -EINVAL;
92
+        return -EINVAL;
98
+    }
93
+    }
99
+
94
+
100
+    return 0;
95
+    return 0;
...
...
diff view generated by jsdifflib
...
...
6
6
7
This sysctl makes the old one "pm_type" deprecated.
7
This sysctl makes the old one "pm_type" deprecated.
8
8
9
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
9
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
10
---
10
---
11
Documentation/networking/mptcp-sysctl.rst | 22 ++++++++++
11
Documentation/networking/mptcp-sysctl.rst | 19 +++++++++
12
net/mptcp/ctrl.c | 50 +++++++++++++++++++++++
12
net/mptcp/ctrl.c | 50 +++++++++++++++++++++++
13
net/mptcp/protocol.h | 1 +
13
net/mptcp/protocol.h | 1 +
14
3 files changed, 73 insertions(+)
14
3 files changed, 70 insertions(+)
15
15
16
diff --git a/Documentation/networking/mptcp-sysctl.rst b/Documentation/networking/mptcp-sysctl.rst
16
diff --git a/Documentation/networking/mptcp-sysctl.rst b/Documentation/networking/mptcp-sysctl.rst
17
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
18
--- a/Documentation/networking/mptcp-sysctl.rst
18
--- a/Documentation/networking/mptcp-sysctl.rst
19
+++ b/Documentation/networking/mptcp-sysctl.rst
19
+++ b/Documentation/networking/mptcp-sysctl.rst
...
...
28
+    per-namespace values configured over the MPTCP netlink
28
+    per-namespace values configured over the MPTCP netlink
29
+    API. Userspace path management puts per-MPTCP-connection subflow
29
+    API. Userspace path management puts per-MPTCP-connection subflow
30
+    connection decisions and address advertisements under control of
30
+    connection decisions and address advertisements under control of
31
+    a privileged userspace program, at the cost of more netlink
31
+    a privileged userspace program, at the cost of more netlink
32
+    traffic to propagate all of the related events and commands.
32
+    traffic to propagate all of the related events and commands.
33
+    User-defined BPF-based path managers can also be set via this
34
+    sysctl.
35
+
33
+
36
+    This is a per-namespace sysctl.
34
+    This is a per-namespace sysctl.
37
+
35
+
38
+    * "kernel" - In-kernel path manager
36
+    * "kernel" - In-kernel path manager
39
+    * "userspace" - Userspace path manager
37
+    * "userspace" - Userspace path manager
40
+    * all other strings - BPF-based path managers
41
+
38
+
42
+    Default: "kernel"
39
+    Default: "kernel"
43
+
40
+
44
pm_type - INTEGER
41
pm_type - INTEGER
45
    Set the default path manager type to use for each new MPTCP
42
    Set the default path manager type to use for each new MPTCP
46
    socket. In-kernel path management will control subflow
43
    socket. In-kernel path management will control subflow
47
@@ -XXX,XX +XXX,XX @@ pm_type - INTEGER
44
@@ -XXX,XX +XXX,XX @@ pm_type - INTEGER
48
45
49
    This is a per-namespace sysctl.
46
    This is a per-namespace sysctl.
50
47
51
+    (Deprecated, use path_manager instead.).
48
+    Deprecated since v6.15, use path_manager instead.
52
+
49
+
53
    * 0 - In-kernel path manager
50
    * 0 - In-kernel path manager
54
    * 1 - Userspace path manager
51
    * 1 - Userspace path manager
55
52
56
diff --git a/net/mptcp/ctrl.c b/net/mptcp/ctrl.c
53
diff --git a/net/mptcp/ctrl.c b/net/mptcp/ctrl.c
...
...
diff view generated by jsdifflib
...
...
3
This patch adds a new proc_handler "proc_pm_type" for "pm_type" to
3
This patch adds a new proc_handler "proc_pm_type" for "pm_type" to
4
map old path manager sysctl "pm_type" to the newly added "path_manager".
4
map old path manager sysctl "pm_type" to the newly added "path_manager".
5
5
6
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
6
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
7
---
7
---
8
net/mptcp/ctrl.c | 33 ++++++++++++++++++++++++++++++---
8
net/mptcp/ctrl.c | 28 +++++++++++++++++++++++++++-
9
1 file changed, 30 insertions(+), 3 deletions(-)
9
1 file changed, 27 insertions(+), 1 deletion(-)
10
10
11
diff --git a/net/mptcp/ctrl.c b/net/mptcp/ctrl.c
11
diff --git a/net/mptcp/ctrl.c b/net/mptcp/ctrl.c
12
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
13
--- a/net/mptcp/ctrl.c
13
--- a/net/mptcp/ctrl.c
14
+++ b/net/mptcp/ctrl.c
14
+++ b/net/mptcp/ctrl.c
...
...
20
+            void *buffer, size_t *lenp, loff_t *ppos)
20
+            void *buffer, size_t *lenp, loff_t *ppos)
21
+{
21
+{
22
+    struct mptcp_pernet *pernet = container_of(ctl->data,
22
+    struct mptcp_pernet *pernet = container_of(ctl->data,
23
+                         struct mptcp_pernet,
23
+                         struct mptcp_pernet,
24
+                         pm_type);
24
+                         pm_type);
25
+    unsigned int val = READ_ONCE(*(u8 *)ctl->data);
25
+    u8 pm_type = READ_ONCE(*(u8 *)ctl->data);
26
+    const struct ctl_table tbl = {
26
+    const struct ctl_table tbl = {
27
+        .maxlen = sizeof(val),
27
+        .maxlen = sizeof(pm_type),
28
+        .data = &val,
28
+        .data = &pm_type,
29
+    };
29
+    };
30
+    int ret;
30
+    int ret;
31
+
31
+
32
+    if (val > mptcp_pm_type_max)
32
+    ret = proc_dou8vec_minmax(&tbl, write, buffer, lenp, ppos);
33
+        return -ERANGE;
34
+
35
+    ret = proc_douintvec(&tbl, write, buffer, lenp, ppos);
36
+    if (write && ret == 0) {
33
+    if (write && ret == 0) {
37
+        char *path_manager = "kernel";
34
+        char *path_manager = "kernel";
38
+
35
+
39
+        if (val == MPTCP_PM_TYPE_USERSPACE)
36
+        if (pm_type == MPTCP_PM_TYPE_USERSPACE)
40
+            path_manager = "userspace";
37
+            path_manager = "userspace";
41
+        mptcp_set_path_manager(pernet->path_manager, path_manager);
38
+        mptcp_set_path_manager(pernet->path_manager, path_manager);
42
+        WRITE_ONCE(*(u8 *)ctl->data, val);
39
+        WRITE_ONCE(*(u8 *)ctl->data, pm_type);
43
+    }
40
+    }
44
+
41
+
45
+    return ret;
42
+    return ret;
46
+}
43
+}
47
+
44
+
...
...
51
@@ -XXX,XX +XXX,XX @@ static struct ctl_table mptcp_sysctl_table[] = {
48
@@ -XXX,XX +XXX,XX @@ static struct ctl_table mptcp_sysctl_table[] = {
52
        .procname = "pm_type",
49
        .procname = "pm_type",
53
        .maxlen = sizeof(u8),
50
        .maxlen = sizeof(u8),
54
        .mode = 0644,
51
        .mode = 0644,
55
-        .proc_handler = proc_dou8vec_minmax,
52
-        .proc_handler = proc_dou8vec_minmax,
56
-        .extra1 = SYSCTL_ZERO,
57
-        .extra2 = &mptcp_pm_type_max
58
+        .proc_handler = proc_pm_type,
53
+        .proc_handler = proc_pm_type,
54
        .extra1 = SYSCTL_ZERO,
55
        .extra2 = &mptcp_pm_type_max
59
    },
56
    },
60
    {
61
        .procname = "scheduler",
62
--
57
--
63
2.43.0
58
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
The helper mptcp_get_pm_type() is unused now, it's replaced by the
3
This patch maps the newly added path manager sysctl "path_manager"
4
new one mptcp_get_path_manager(). So drop it.
4
to the old one "pm_type".
5
5
6
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
6
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
7
---
7
---
8
net/mptcp/ctrl.c | 5 -----
8
net/mptcp/ctrl.c | 11 ++++++++++-
9
net/mptcp/protocol.h | 1 -
9
1 file changed, 10 insertions(+), 1 deletion(-)
10
2 files changed, 6 deletions(-)
11
10
12
diff --git a/net/mptcp/ctrl.c b/net/mptcp/ctrl.c
11
diff --git a/net/mptcp/ctrl.c b/net/mptcp/ctrl.c
13
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
14
--- a/net/mptcp/ctrl.c
13
--- a/net/mptcp/ctrl.c
15
+++ b/net/mptcp/ctrl.c
14
+++ b/net/mptcp/ctrl.c
16
@@ -XXX,XX +XXX,XX @@ unsigned int mptcp_close_timeout(const struct sock *sk)
15
@@ -XXX,XX +XXX,XX @@ static int mptcp_set_path_manager(char *path_manager, const char *name)
17
    return mptcp_get_pernet(sock_net(sk))->close_timeout;
16
static int proc_path_manager(const struct ctl_table *ctl, int write,
17
             void *buffer, size_t *lenp, loff_t *ppos)
18
{
19
+    struct mptcp_pernet *pernet = container_of(ctl->data,
20
+                         struct mptcp_pernet,
21
+                         path_manager);
22
    char (*path_manager)[MPTCP_PM_NAME_MAX] = ctl->data;
23
    char val[MPTCP_PM_NAME_MAX];
24
    const struct ctl_table tbl = {
25
@@ -XXX,XX +XXX,XX @@ static int proc_path_manager(const struct ctl_table *ctl, int write,
26
    strscpy(val, *path_manager, MPTCP_PM_NAME_MAX);
27
28
    ret = proc_dostring(&tbl, write, buffer, lenp, ppos);
29
-    if (write && ret == 0)
30
+    if (write && ret == 0) {
31
+        u8 pm_type = MPTCP_PM_TYPE_KERNEL;
32
+
33
+        if (!strncmp(val, "userspace", MPTCP_PM_NAME_MAX))
34
+            pm_type = MPTCP_PM_TYPE_USERSPACE;
35
+        pernet->pm_type = pm_type;
36
        ret = mptcp_set_path_manager(*path_manager, val);
37
+    }
38
39
    return ret;
18
}
40
}
19
20
-int mptcp_get_pm_type(const struct net *net)
21
-{
22
-    return mptcp_get_pernet(net)->pm_type;
23
-}
24
-
25
const char *mptcp_get_path_manager(const struct net *net)
26
{
27
    return mptcp_get_pernet(net)->path_manager;
28
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
29
index XXXXXXX..XXXXXXX 100644
30
--- a/net/mptcp/protocol.h
31
+++ b/net/mptcp/protocol.h
32
@@ -XXX,XX +XXX,XX @@ int mptcp_is_checksum_enabled(const struct net *net);
33
int mptcp_allow_join_id0(const struct net *net);
34
unsigned int mptcp_stale_loss_cnt(const struct net *net);
35
unsigned int mptcp_close_timeout(const struct sock *sk);
36
-int mptcp_get_pm_type(const struct net *net);
37
const char *mptcp_get_path_manager(const struct net *net);
38
const char *mptcp_get_scheduler(const struct net *net);
39
40
--
41
--
41
2.43.0
42
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
Similarly to net.mptcp.available_schedulers, this patch adds a new one
3
Similarly to net.mptcp.available_schedulers, this patch adds a new one
4
net.mptcp.available_path_managers to list the available path mangers.
4
net.mptcp.available_path_managers to list the available path managers.
5
5
6
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
6
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
7
---
7
---
8
Documentation/networking/mptcp-sysctl.rst | 4 ++++
8
Documentation/networking/mptcp-sysctl.rst | 4 ++++
9
include/net/mptcp.h | 2 ++
9
include/net/mptcp.h | 2 ++
...
...
37
#define MPTCP_PM_NAME_MAX    16
37
#define MPTCP_PM_NAME_MAX    16
38
+#define MPTCP_PM_MAX        128
38
+#define MPTCP_PM_MAX        128
39
+#define MPTCP_PM_BUF_MAX    (MPTCP_PM_NAME_MAX * MPTCP_PM_MAX)
39
+#define MPTCP_PM_BUF_MAX    (MPTCP_PM_NAME_MAX * MPTCP_PM_MAX)
40
40
41
struct mptcp_pm_ops {
41
struct mptcp_pm_ops {
42
    int (*get_local_id)(struct mptcp_sock *msk,
42
    char            name[MPTCP_PM_NAME_MAX];
43
diff --git a/net/mptcp/ctrl.c b/net/mptcp/ctrl.c
43
diff --git a/net/mptcp/ctrl.c b/net/mptcp/ctrl.c
44
index XXXXXXX..XXXXXXX 100644
44
index XXXXXXX..XXXXXXX 100644
45
--- a/net/mptcp/ctrl.c
45
--- a/net/mptcp/ctrl.c
46
+++ b/net/mptcp/ctrl.c
46
+++ b/net/mptcp/ctrl.c
47
@@ -XXX,XX +XXX,XX @@ static int proc_pm_type(const struct ctl_table *ctl, int write,
47
@@ -XXX,XX +XXX,XX @@ static int proc_pm_type(const struct ctl_table *ctl, int write,
...
...
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 in-kernel netlink path manager as a
3
This patch defines the original in-kernel netlink path manager as a
4
new struct mptcp_pm_ops named "mptcp_kernel_pm", and register it in
4
new struct mptcp_pm_ops named "mptcp_pm_kernel", and register it in
5
mptcp_pm_nl_init().
5
mptcp_pm_kernel_register().
6
6
7
This mptcp_pm_ops will be skipped in mptcp_pm_unregister().
7
This mptcp_pm_ops will be skipped in mptcp_pm_unregister().
8
8
9
Only get_local_id() and get_priority() interfaces are implemented here.
10
11
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
9
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
12
---
10
---
13
net/mptcp/pm.c | 3 +++
11
net/mptcp/pm.c | 4 ++++
14
net/mptcp/pm_kernel.c | 9 +++++++++
12
net/mptcp/pm_kernel.c | 26 ++++++++++++++++++++++++++
15
net/mptcp/protocol.h | 2 ++
13
net/mptcp/protocol.h | 3 +++
16
3 files changed, 14 insertions(+)
14
3 files changed, 33 insertions(+)
17
15
18
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
16
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
19
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
20
--- a/net/mptcp/pm.c
18
--- a/net/mptcp/pm.c
21
+++ b/net/mptcp/pm.c
19
+++ b/net/mptcp/pm.c
22
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_register(struct mptcp_pm_ops *pm)
20
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_register(struct mptcp_pm_ops *pm)
23
21
24
void mptcp_pm_unregister(struct mptcp_pm_ops *pm)
22
void mptcp_pm_unregister(struct mptcp_pm_ops *pm)
25
{
23
{
26
+    if (pm == &mptcp_kernel_pm)
24
+    /* skip unregistering the default path manager */
25
+    if (pm == &mptcp_pm_kernel)
27
+        return;
26
+        return;
28
+
27
+
29
    spin_lock(&mptcp_pm_list_lock);
28
    spin_lock(&mptcp_pm_list_lock);
30
    list_del_rcu(&pm->list);
29
    list_del_rcu(&pm->list);
31
    spin_unlock(&mptcp_pm_list_lock);
30
    spin_unlock(&mptcp_pm_list_lock);
...
...
35
+++ b/net/mptcp/pm_kernel.c
34
+++ b/net/mptcp/pm_kernel.c
36
@@ -XXX,XX +XXX,XX @@ static struct pernet_operations mptcp_pm_pernet_ops = {
35
@@ -XXX,XX +XXX,XX @@ static struct pernet_operations mptcp_pm_pernet_ops = {
37
    .size = sizeof(struct pm_nl_pernet),
36
    .size = sizeof(struct pm_nl_pernet),
38
};
37
};
39
38
40
+struct mptcp_pm_ops mptcp_kernel_pm = {
39
+static void mptcp_pm_nl_initialize(struct mptcp_sock *msk)
41
+    .get_local_id        = mptcp_pm_nl_get_local_id,
40
+{
42
+    .get_priority        = mptcp_pm_nl_is_backup,
41
+    bool subflows_allowed = !!mptcp_pm_get_subflows_max(msk);
42
+    struct mptcp_pm_data *pm = &msk->pm;
43
+
44
+    /* pm->work_pending must be only be set to 'true' when
45
+     * pm is the default path manager
46
+     */
47
+    WRITE_ONCE(pm->work_pending,
48
+         (!!mptcp_pm_get_local_addr_max(msk) &&
49
+         subflows_allowed) ||
50
+         !!mptcp_pm_get_add_addr_signal_max(msk));
51
+    WRITE_ONCE(pm->accept_addr,
52
+         !!mptcp_pm_get_add_addr_accept_max(msk) &&
53
+         subflows_allowed);
54
+    WRITE_ONCE(pm->accept_subflow, subflows_allowed);
55
+}
56
+
57
+struct mptcp_pm_ops mptcp_pm_kernel = {
58
+    .init            = mptcp_pm_nl_initialize,
43
+    .name            = "kernel",
59
+    .name            = "kernel",
44
+    .owner            = THIS_MODULE,
60
+    .owner            = THIS_MODULE,
45
+};
61
+};
46
+
62
+
47
void __init mptcp_pm_nl_init(void)
63
void __init mptcp_pm_kernel_register(void)
48
{
64
{
49
    if (register_pernet_subsys(&mptcp_pm_pernet_ops) < 0)
65
    if (register_pernet_subsys(&mptcp_pm_pernet_ops) < 0)
50
@@ -XXX,XX +XXX,XX @@ void __init mptcp_pm_nl_init(void)
66
        panic("Failed to register MPTCP PM pernet subsystem.\n");
51
52
    if (genl_register_family(&mptcp_genl_family))
53
        panic("Failed to register MPTCP PM netlink family\n");
54
+
67
+
55
+    mptcp_pm_register(&mptcp_kernel_pm);
68
+    mptcp_pm_register(&mptcp_pm_kernel);
56
}
69
}
57
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
70
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
58
index XXXXXXX..XXXXXXX 100644
71
index XXXXXXX..XXXXXXX 100644
59
--- a/net/mptcp/protocol.h
72
--- a/net/mptcp/protocol.h
60
+++ b/net/mptcp/protocol.h
73
+++ b/net/mptcp/protocol.h
61
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_remove_addr(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_
74
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_remove_addr(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_
62
void mptcp_pm_remove_addr_entry(struct mptcp_sock *msk,
75
void mptcp_pm_remove_addr_entry(struct mptcp_sock *msk,
63
                struct mptcp_pm_addr_entry *entry);
76
                struct mptcp_pm_addr_entry *entry);
64
77
65
+extern struct mptcp_pm_ops mptcp_kernel_pm;
78
+/* the default path manager, used in mptcp_pm_unregister */
79
+extern struct mptcp_pm_ops mptcp_pm_kernel;
66
+
80
+
67
struct mptcp_pm_ops *mptcp_pm_find(const char *name);
81
struct mptcp_pm_ops *mptcp_pm_find(const char *name);
68
int mptcp_pm_validate(struct mptcp_pm_ops *pm);
82
int mptcp_pm_validate(struct mptcp_pm_ops *pm);
69
int mptcp_pm_register(struct mptcp_pm_ops *pm);
83
int mptcp_pm_register(struct mptcp_pm_ops *pm);
70
--
84
--
71
2.43.0
85
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 path manager as a new
3
This patch defines the original userspace path manager as a new
4
struct mptcp_pm_ops named "mptcp_userspace_pm", and register it
4
struct mptcp_pm_ops named "mptcp_userspace_pm", and register it
5
in mptcp_pm_data_init().
5
in mptcp_pm_init(). mptcp_userspace_pm_is_release() is a wrapper
6
6
of mptcp_userspace_pm_free_local_addr_list().
7
Only get_local_id(), get_priority() and release() interfaces are
8
implemented here. mptcp_userspace_pm_is_release() is a wrapper of
9
mptcp_userspace_pm_free_local_addr_list().
10
7
11
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
8
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
12
---
9
---
13
net/mptcp/pm.c | 1 +
10
net/mptcp/pm.c | 1 +
14
net/mptcp/pm_userspace.c | 18 ++++++++++++++++++
11
net/mptcp/pm_userspace.c | 26 ++++++++++++++++++++++++++
15
net/mptcp/protocol.h | 1 +
12
net/mptcp/protocol.h | 1 +
16
3 files changed, 20 insertions(+)
13
3 files changed, 28 insertions(+)
17
14
18
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
15
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
19
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
20
--- a/net/mptcp/pm.c
17
--- a/net/mptcp/pm.c
21
+++ b/net/mptcp/pm.c
18
+++ b/net/mptcp/pm.c
22
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_data_init(struct mptcp_sock *msk)
19
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_data_init(struct mptcp_sock *msk)
23
void __init mptcp_pm_init(void)
20
void __init mptcp_pm_init(void)
24
{
21
{
22
    mptcp_pm_kernel_register();
23
+    mptcp_pm_userspace_register();
25
    mptcp_pm_nl_init();
24
    mptcp_pm_nl_init();
26
+    mptcp_userspace_pm_init();
27
}
25
}
28
26
29
/* Must be called with rcu read lock held */
30
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
27
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
31
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
32
--- a/net/mptcp/pm_userspace.c
29
--- a/net/mptcp/pm_userspace.c
33
+++ b/net/mptcp/pm_userspace.c
30
+++ b/net/mptcp/pm_userspace.c
34
@@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr,
31
@@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr,
35
    sock_put(sk);
32
    sock_put(sk);
36
    return ret;
33
    return ret;
37
}
34
}
38
+
35
+
36
+static void mptcp_userspace_pm_init(struct mptcp_sock *msk)
37
+{
38
+    struct mptcp_pm_data *pm = &msk->pm;
39
+
40
+    WRITE_ONCE(pm->work_pending, 0);
41
+    WRITE_ONCE(pm->accept_addr, 0);
42
+    WRITE_ONCE(pm->accept_subflow, 0);
43
+}
44
+
39
+static void mptcp_userspace_pm_release(struct mptcp_sock *msk)
45
+static void mptcp_userspace_pm_release(struct mptcp_sock *msk)
40
+{
46
+{
41
+    mptcp_userspace_pm_free_local_addr_list(msk);
47
+    mptcp_userspace_pm_free_local_addr_list(msk);
42
+}
48
+}
43
+
49
+
44
+static struct mptcp_pm_ops mptcp_userspace_pm = {
50
+static struct mptcp_pm_ops mptcp_pm_userspace = {
45
+    .get_local_id        = mptcp_userspace_pm_get_local_id,
51
+    .init            = mptcp_userspace_pm_init,
46
+    .get_priority        = mptcp_userspace_pm_is_backup,
47
+    .release        = mptcp_userspace_pm_release,
52
+    .release        = mptcp_userspace_pm_release,
48
+    .name            = "userspace",
53
+    .name            = "userspace",
49
+    .owner            = THIS_MODULE,
54
+    .owner            = THIS_MODULE,
50
+};
55
+};
51
+
56
+
52
+void __init mptcp_userspace_pm_init(void)
57
+void __init mptcp_pm_userspace_register(void)
53
+{
58
+{
54
+    mptcp_pm_register(&mptcp_userspace_pm);
59
+    mptcp_pm_register(&mptcp_pm_userspace);
55
+}
60
+}
56
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
61
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
57
index XXXXXXX..XXXXXXX 100644
62
index XXXXXXX..XXXXXXX 100644
58
--- a/net/mptcp/protocol.h
63
--- a/net/mptcp/protocol.h
59
+++ b/net/mptcp/protocol.h
64
+++ b/net/mptcp/protocol.h
60
@@ -XXX,XX +XXX,XX @@ static inline u8 subflow_get_local_id(const struct mptcp_subflow_context *subflo
65
@@ -XXX,XX +XXX,XX @@ static inline u8 subflow_get_local_id(const struct mptcp_subflow_context *subflo
61
}
66
}
62
67
68
void __init mptcp_pm_kernel_register(void);
69
+void __init mptcp_pm_userspace_register(void);
63
void __init mptcp_pm_nl_init(void);
70
void __init mptcp_pm_nl_init(void);
64
+void __init mptcp_userspace_pm_init(void);
65
void mptcp_pm_worker(struct mptcp_sock *msk);
71
void mptcp_pm_worker(struct mptcp_sock *msk);
66
void __mptcp_pm_kernel_worker(struct mptcp_sock *msk);
72
void __mptcp_pm_kernel_worker(struct mptcp_sock *msk);
67
unsigned int mptcp_pm_get_add_addr_signal_max(const struct mptcp_sock *msk);
68
--
73
--
69
2.43.0
74
2.43.0
diff view generated by jsdifflib
...
...
5
this pointer. mptcp_pm_initialize() is invoked in mptcp_pm_data_reset(),
5
this pointer. mptcp_pm_initialize() is invoked in mptcp_pm_data_reset(),
6
while mptcp_pm_release() is invoked in mptcp_pm_destroy().
6
while mptcp_pm_release() is invoked in mptcp_pm_destroy().
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.c | 42 +++++++++++++++++++++++++++++++++++++++---
10
net/mptcp/pm.c | 57 +++++++++++++++++++++++++++-----------------
11
net/mptcp/protocol.h | 3 +++
11
net/mptcp/protocol.h | 1 +
12
2 files changed, 42 insertions(+), 3 deletions(-)
12
2 files changed, 36 insertions(+), 22 deletions(-)
13
13
14
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
14
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
15
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
16
--- a/net/mptcp/pm.c
16
--- a/net/mptcp/pm.c
17
+++ b/net/mptcp/pm.c
17
+++ b/net/mptcp/pm.c
18
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_worker(struct mptcp_sock *msk)
18
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_worker(struct mptcp_sock *msk)
19
void mptcp_pm_destroy(struct mptcp_sock *msk)
19
    spin_unlock_bh(&msk->pm.lock);
20
{
21
    mptcp_pm_free_anno_list(msk);
22
-
23
-    if (mptcp_pm_is_userspace(msk))
24
-        mptcp_userspace_pm_free_local_addr_list(msk);
25
+    mptcp_pm_release(msk);
26
}
20
}
27
21
28
void mptcp_pm_data_reset(struct mptcp_sock *msk)
22
+static void mptcp_pm_initialize(struct mptcp_sock *msk,
29
{
23
+                struct mptcp_pm_ops *pm)
30
+    const char *path_manager = mptcp_get_path_manager(sock_net((struct sock *)msk));
31
    u8 pm_type = mptcp_get_pm_type(sock_net((struct sock *)msk));
32
    struct mptcp_pm_data *pm = &msk->pm;
33
+    int ret;
34
35
    pm->add_addr_signaled = 0;
36
    pm->add_addr_accepted = 0;
37
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_data_reset(struct mptcp_sock *msk)
38
    pm->rm_list_rx.nr = 0;
39
    WRITE_ONCE(pm->pm_type, pm_type);
40
41
+    rcu_read_lock();
42
+    ret = mptcp_pm_initialize(msk, mptcp_pm_find(path_manager));
43
+    rcu_read_unlock();
44
+    if (ret)
45
+        return;
46
+
47
    if (pm_type == MPTCP_PM_TYPE_KERNEL) {
48
        bool subflows_allowed = !!mptcp_pm_get_subflows_max(msk);
49
50
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_get_available(char *buf, size_t maxlen)
51
    }
52
    rcu_read_unlock();
53
}
54
+
55
+int mptcp_pm_initialize(struct mptcp_sock *msk, struct mptcp_pm_ops *pm)
56
+{
24
+{
57
+    if (!pm)
25
+    if (!pm || !bpf_try_module_get(pm, pm->owner)) {
58
+        pm = &mptcp_kernel_pm;
26
+        pr_warn_once("pm %s fails, fallback to default pm",
59
+
27
+             pm->name);
60
+    if (!bpf_try_module_get(pm, pm->owner))
28
+        pm = &mptcp_pm_kernel;
61
+        return -EBUSY;
29
+    }
62
+
30
+
63
+    msk->pm.ops = pm;
31
+    msk->pm.ops = pm;
64
+    if (msk->pm.ops->init)
32
+    if (msk->pm.ops->init)
65
+        msk->pm.ops->init(msk);
33
+        msk->pm.ops->init(msk);
66
+
34
+
67
+    pr_debug("pm %s initialized\n", pm->name);
35
+    pr_debug("pm %s initialized\n", pm->name);
68
+    return 0;
69
+}
36
+}
70
+
37
+
71
+void mptcp_pm_release(struct mptcp_sock *msk)
38
+static void mptcp_pm_release(struct mptcp_sock *msk)
72
+{
39
+{
73
+    struct mptcp_pm_ops *pm = msk->pm.ops;
40
+    struct mptcp_pm_ops *pm = msk->pm.ops;
74
+
41
+
75
+    if (!pm)
42
+    if (!pm)
76
+        return;
43
+        return;
...
...
79
+    if (pm->release)
46
+    if (pm->release)
80
+        pm->release(msk);
47
+        pm->release(msk);
81
+
48
+
82
+    bpf_module_put(pm, pm->owner);
49
+    bpf_module_put(pm, pm->owner);
83
+}
50
+}
51
+
52
void mptcp_pm_destroy(struct mptcp_sock *msk)
53
{
54
    mptcp_pm_free_anno_list(msk);
55
-
56
-    if (mptcp_pm_is_userspace(msk))
57
-        mptcp_userspace_pm_free_local_addr_list(msk);
58
+    mptcp_pm_release(msk);
59
}
60
61
void mptcp_pm_data_reset(struct mptcp_sock *msk)
62
{
63
+    const char *path_manager = mptcp_get_path_manager(sock_net((struct sock *)msk));
64
    u8 pm_type = mptcp_get_pm_type(sock_net((struct sock *)msk));
65
    struct mptcp_pm_data *pm = &msk->pm;
66
67
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_data_reset(struct mptcp_sock *msk)
68
    pm->rm_list_rx.nr = 0;
69
    WRITE_ONCE(pm->pm_type, pm_type);
70
71
-    if (pm_type == MPTCP_PM_TYPE_KERNEL) {
72
-        bool subflows_allowed = !!mptcp_pm_get_subflows_max(msk);
73
-
74
-        /* pm->work_pending must be only be set to 'true' when
75
-         * pm->pm_type is set to MPTCP_PM_TYPE_KERNEL
76
-         */
77
-        WRITE_ONCE(pm->work_pending,
78
-             (!!mptcp_pm_get_local_addr_max(msk) &&
79
-             subflows_allowed) ||
80
-             !!mptcp_pm_get_add_addr_signal_max(msk));
81
-        WRITE_ONCE(pm->accept_addr,
82
-             !!mptcp_pm_get_add_addr_accept_max(msk) &&
83
-             subflows_allowed);
84
-        WRITE_ONCE(pm->accept_subflow, subflows_allowed);
85
-    } else {
86
-        WRITE_ONCE(pm->work_pending, 0);
87
-        WRITE_ONCE(pm->accept_addr, 0);
88
-        WRITE_ONCE(pm->accept_subflow, 0);
89
-    }
90
+    rcu_read_lock();
91
+    mptcp_pm_initialize(msk, mptcp_pm_find(path_manager));
92
+    rcu_read_unlock();
93
94
    WRITE_ONCE(pm->addr_signal, 0);
95
    WRITE_ONCE(pm->remote_deny_join_id0, false);
84
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
96
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
85
index XXXXXXX..XXXXXXX 100644
97
index XXXXXXX..XXXXXXX 100644
86
--- a/net/mptcp/protocol.h
98
--- a/net/mptcp/protocol.h
87
+++ b/net/mptcp/protocol.h
99
+++ b/net/mptcp/protocol.h
88
@@ -XXX,XX +XXX,XX @@ struct mptcp_pm_data {
100
@@ -XXX,XX +XXX,XX @@ struct mptcp_pm_data {
89
    struct mptcp_addr_info remote;
101
    struct mptcp_addr_info remote;
90
    struct list_head anno_list;
102
    struct list_head anno_list;
91
    struct list_head userspace_pm_local_addr_list;
103
    struct list_head userspace_pm_local_addr_list;
92
+    struct mptcp_pm_ops *ops;
104
+    struct mptcp_pm_ops *ops;
93
105
94
    spinlock_t    lock;        /*protects the whole PM data */
106
    spinlock_t    lock;        /*protects the whole PM data */
95
96
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_validate(struct mptcp_pm_ops *pm);
97
int mptcp_pm_register(struct mptcp_pm_ops *pm);
98
void mptcp_pm_unregister(struct mptcp_pm_ops *pm);
99
void mptcp_pm_get_available(char *buf, size_t maxlen);
100
+int mptcp_pm_initialize(struct mptcp_sock *msk, struct mptcp_pm_ops *pm);
101
+void mptcp_pm_release(struct mptcp_sock *msk);
102
103
void mptcp_userspace_pm_free_local_addr_list(struct mptcp_sock *msk);
104
107
105
--
108
--
106
2.43.0
109
2.43.0
diff view generated by jsdifflib
...
...
7
Then mptcp_pm_nl_get_local_id() and mptcp_userspace_pm_get_local_id()
7
Then mptcp_pm_nl_get_local_id() and mptcp_userspace_pm_get_local_id()
8
helpers can be static.
8
helpers can be static.
9
9
10
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
10
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
11
---
11
---
12
net/mptcp/pm.c | 4 +---
12
include/net/mptcp.h | 3 +++
13
net/mptcp/pm_kernel.c | 4 ++--
13
net/mptcp/pm.c | 6 ++----
14
net/mptcp/pm_userspace.c | 4 ++--
14
net/mptcp/pm_kernel.c | 5 +++--
15
net/mptcp/pm_userspace.c | 5 +++--
15
net/mptcp/protocol.h | 4 ----
16
net/mptcp/protocol.h | 4 ----
16
4 files changed, 5 insertions(+), 11 deletions(-)
17
5 files changed, 11 insertions(+), 12 deletions(-)
17
18
19
diff --git a/include/net/mptcp.h b/include/net/mptcp.h
20
index XXXXXXX..XXXXXXX 100644
21
--- a/include/net/mptcp.h
22
+++ b/include/net/mptcp.h
23
@@ -XXX,XX +XXX,XX @@ struct mptcp_sched_ops {
24
#define MPTCP_PM_BUF_MAX    (MPTCP_PM_NAME_MAX * MPTCP_PM_MAX)
25
26
struct mptcp_pm_ops {
27
+    int (*get_local_id)(struct mptcp_sock *msk,
28
+             struct mptcp_pm_addr_entry *skc);
29
+
30
    char            name[MPTCP_PM_NAME_MAX];
31
    struct module        *owner;
32
    struct list_head    list;
18
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
33
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
19
index XXXXXXX..XXXXXXX 100644
34
index XXXXXXX..XXXXXXX 100644
20
--- a/net/mptcp/pm.c
35
--- a/net/mptcp/pm.c
21
+++ b/net/mptcp/pm.c
36
+++ b/net/mptcp/pm.c
22
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc)
37
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc)
...
...
28
-    return mptcp_pm_nl_get_local_id(msk, &skc_local);
43
-    return mptcp_pm_nl_get_local_id(msk, &skc_local);
29
+    return msk->pm.ops->get_local_id(msk, &skc_local);
44
+    return msk->pm.ops->get_local_id(msk, &skc_local);
30
}
45
}
31
46
32
bool mptcp_pm_is_backup(struct mptcp_sock *msk, struct sock_common *skc)
47
bool mptcp_pm_is_backup(struct mptcp_sock *msk, struct sock_common *skc)
48
@@ -XXX,XX +XXX,XX @@ struct mptcp_pm_ops *mptcp_pm_find(const char *name)
49
50
int mptcp_pm_validate(struct mptcp_pm_ops *pm)
51
{
52
-    if (!pm->init) {
53
+    if (!pm->init || !pm->get_local_id) {
54
        pr_err("%s does not implement required ops\n", pm->name);
55
        return -EINVAL;
56
    }
33
diff --git a/net/mptcp/pm_kernel.c b/net/mptcp/pm_kernel.c
57
diff --git a/net/mptcp/pm_kernel.c b/net/mptcp/pm_kernel.c
34
index XXXXXXX..XXXXXXX 100644
58
index XXXXXXX..XXXXXXX 100644
35
--- a/net/mptcp/pm_kernel.c
59
--- a/net/mptcp/pm_kernel.c
36
+++ b/net/mptcp/pm_kernel.c
60
+++ b/net/mptcp/pm_kernel.c
37
@@ -XXX,XX +XXX,XX @@ static int mptcp_pm_nl_create_listen_socket(struct sock *sk,
61
@@ -XXX,XX +XXX,XX @@ static int mptcp_pm_nl_create_listen_socket(struct sock *sk,
...
...
43
+static int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk,
67
+static int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk,
44
+                 struct mptcp_pm_addr_entry *skc)
68
+                 struct mptcp_pm_addr_entry *skc)
45
{
69
{
46
    struct mptcp_pm_addr_entry *entry;
70
    struct mptcp_pm_addr_entry *entry;
47
    struct pm_nl_pernet *pernet;
71
    struct pm_nl_pernet *pernet;
72
@@ -XXX,XX +XXX,XX @@ static void mptcp_pm_nl_initialize(struct mptcp_sock *msk)
73
}
74
75
struct mptcp_pm_ops mptcp_pm_kernel = {
76
+    .get_local_id        = mptcp_pm_nl_get_local_id,
77
    .init            = mptcp_pm_nl_initialize,
78
    .name            = "kernel",
79
    .owner            = THIS_MODULE,
48
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
80
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
49
index XXXXXXX..XXXXXXX 100644
81
index XXXXXXX..XXXXXXX 100644
50
--- a/net/mptcp/pm_userspace.c
82
--- a/net/mptcp/pm_userspace.c
51
+++ b/net/mptcp/pm_userspace.c
83
+++ b/net/mptcp/pm_userspace.c
52
@@ -XXX,XX +XXX,XX @@ mptcp_userspace_pm_lookup_addr_by_id(struct mptcp_sock *msk, unsigned int id)
84
@@ -XXX,XX +XXX,XX @@ mptcp_userspace_pm_lookup_addr_by_id(struct mptcp_sock *msk, unsigned int id)
...
...
58
+static int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
90
+static int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
59
+                     struct mptcp_pm_addr_entry *skc)
91
+                     struct mptcp_pm_addr_entry *skc)
60
{
92
{
61
    __be16 msk_sport = ((struct inet_sock *)
93
    __be16 msk_sport = ((struct inet_sock *)
62
             inet_sk((struct sock *)msk))->inet_sport;
94
             inet_sk((struct sock *)msk))->inet_sport;
95
@@ -XXX,XX +XXX,XX @@ static void mptcp_userspace_pm_release(struct mptcp_sock *msk)
96
}
97
98
static struct mptcp_pm_ops mptcp_pm_userspace = {
99
+    .get_local_id        = mptcp_userspace_pm_get_local_id,
100
    .init            = mptcp_userspace_pm_init,
101
    .release        = mptcp_userspace_pm_release,
102
    .name            = "userspace",
63
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
103
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
64
index XXXXXXX..XXXXXXX 100644
104
index XXXXXXX..XXXXXXX 100644
65
--- a/net/mptcp/protocol.h
105
--- a/net/mptcp/protocol.h
66
+++ b/net/mptcp/protocol.h
106
+++ b/net/mptcp/protocol.h
67
@@ -XXX,XX +XXX,XX @@ bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, const struct sk_buff *skb,
107
@@ -XXX,XX +XXX,XX @@ bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, const struct sk_buff *skb,
...
...
diff view generated by jsdifflib
...
...
7
Then mptcp_pm_nl_is_backup() and mptcp_userspace_pm_is_backup() helpers
7
Then mptcp_pm_nl_is_backup() and mptcp_userspace_pm_is_backup() helpers
8
can be static.
8
can be static.
9
9
10
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
10
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
11
---
11
---
12
net/mptcp/pm.c | 5 +----
12
include/net/mptcp.h | 2 ++
13
net/mptcp/pm_kernel.c | 3 ++-
13
net/mptcp/pm.c | 7 ++-----
14
net/mptcp/pm_userspace.c | 4 ++--
14
net/mptcp/pm_kernel.c | 4 +++-
15
net/mptcp/pm_userspace.c | 5 +++--
15
net/mptcp/protocol.h | 2 --
16
net/mptcp/protocol.h | 2 --
16
4 files changed, 5 insertions(+), 9 deletions(-)
17
5 files changed, 10 insertions(+), 10 deletions(-)
17
18
19
diff --git a/include/net/mptcp.h b/include/net/mptcp.h
20
index XXXXXXX..XXXXXXX 100644
21
--- a/include/net/mptcp.h
22
+++ b/include/net/mptcp.h
23
@@ -XXX,XX +XXX,XX @@ struct mptcp_sched_ops {
24
struct mptcp_pm_ops {
25
    int (*get_local_id)(struct mptcp_sock *msk,
26
             struct mptcp_pm_addr_entry *skc);
27
+    bool (*get_priority)(struct mptcp_sock *msk,
28
+             struct mptcp_addr_info *skc);
29
30
    char            name[MPTCP_PM_NAME_MAX];
31
    struct module        *owner;
18
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
32
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
19
index XXXXXXX..XXXXXXX 100644
33
index XXXXXXX..XXXXXXX 100644
20
--- a/net/mptcp/pm.c
34
--- a/net/mptcp/pm.c
21
+++ b/net/mptcp/pm.c
35
+++ b/net/mptcp/pm.c
22
@@ -XXX,XX +XXX,XX @@ bool mptcp_pm_is_backup(struct mptcp_sock *msk, struct sock_common *skc)
36
@@ -XXX,XX +XXX,XX @@ bool mptcp_pm_is_backup(struct mptcp_sock *msk, struct sock_common *skc)
...
...
29
-    return mptcp_pm_nl_is_backup(msk, &skc_local);
43
-    return mptcp_pm_nl_is_backup(msk, &skc_local);
30
+    return msk->pm.ops->get_priority(msk, &skc_local);
44
+    return msk->pm.ops->get_priority(msk, &skc_local);
31
}
45
}
32
46
33
static void mptcp_pm_subflows_chk_stale(const struct mptcp_sock *msk, struct sock *ssk)
47
static void mptcp_pm_subflows_chk_stale(const struct mptcp_sock *msk, struct sock *ssk)
48
@@ -XXX,XX +XXX,XX @@ struct mptcp_pm_ops *mptcp_pm_find(const char *name)
49
50
int mptcp_pm_validate(struct mptcp_pm_ops *pm)
51
{
52
-    if (!pm->init || !pm->get_local_id) {
53
+    if (!pm->init || !pm->get_local_id || !pm->get_priority) {
54
        pr_err("%s does not implement required ops\n", pm->name);
55
        return -EINVAL;
56
    }
34
diff --git a/net/mptcp/pm_kernel.c b/net/mptcp/pm_kernel.c
57
diff --git a/net/mptcp/pm_kernel.c b/net/mptcp/pm_kernel.c
35
index XXXXXXX..XXXXXXX 100644
58
index XXXXXXX..XXXXXXX 100644
36
--- a/net/mptcp/pm_kernel.c
59
--- a/net/mptcp/pm_kernel.c
37
+++ b/net/mptcp/pm_kernel.c
60
+++ b/net/mptcp/pm_kernel.c
38
@@ -XXX,XX +XXX,XX @@ static int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk,
61
@@ -XXX,XX +XXX,XX @@ static int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk,
...
...
43
+static bool mptcp_pm_nl_is_backup(struct mptcp_sock *msk,
66
+static bool mptcp_pm_nl_is_backup(struct mptcp_sock *msk,
44
+                 struct mptcp_addr_info *skc)
67
+                 struct mptcp_addr_info *skc)
45
{
68
{
46
    struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk);
69
    struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk);
47
    struct mptcp_pm_addr_entry *entry;
70
    struct mptcp_pm_addr_entry *entry;
71
@@ -XXX,XX +XXX,XX @@ static void mptcp_pm_nl_initialize(struct mptcp_sock *msk)
72
73
struct mptcp_pm_ops mptcp_pm_kernel = {
74
    .get_local_id        = mptcp_pm_nl_get_local_id,
75
+    .get_priority        = mptcp_pm_nl_is_backup,
76
    .init            = mptcp_pm_nl_initialize,
77
    .name            = "kernel",
78
    .owner            = THIS_MODULE,
48
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
79
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
49
index XXXXXXX..XXXXXXX 100644
80
index XXXXXXX..XXXXXXX 100644
50
--- a/net/mptcp/pm_userspace.c
81
--- a/net/mptcp/pm_userspace.c
51
+++ b/net/mptcp/pm_userspace.c
82
+++ b/net/mptcp/pm_userspace.c
52
@@ -XXX,XX +XXX,XX @@ static int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
83
@@ -XXX,XX +XXX,XX @@ static int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
...
...
58
+static bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk,
89
+static bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk,
59
+                     struct mptcp_addr_info *skc)
90
+                     struct mptcp_addr_info *skc)
60
{
91
{
61
    struct mptcp_pm_addr_entry *entry;
92
    struct mptcp_pm_addr_entry *entry;
62
    bool backup;
93
    bool backup;
94
@@ -XXX,XX +XXX,XX @@ static void mptcp_userspace_pm_release(struct mptcp_sock *msk)
95
96
static struct mptcp_pm_ops mptcp_pm_userspace = {
97
    .get_local_id        = mptcp_userspace_pm_get_local_id,
98
+    .get_priority        = mptcp_userspace_pm_is_backup,
99
    .init            = mptcp_userspace_pm_init,
100
    .release        = mptcp_userspace_pm_release,
101
    .name            = "userspace",
63
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
102
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
64
index XXXXXXX..XXXXXXX 100644
103
index XXXXXXX..XXXXXXX 100644
65
--- a/net/mptcp/protocol.h
104
--- a/net/mptcp/protocol.h
66
+++ b/net/mptcp/protocol.h
105
+++ b/net/mptcp/protocol.h
67
@@ -XXX,XX +XXX,XX @@ bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
106
@@ -XXX,XX +XXX,XX @@ bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
...
...
diff view generated by jsdifflib
New patch
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
2
3
This patch adds a new helper set_path_manager() to set the newly added
4
net.mptcp.path_manager, and test it inside a userspace pm test.
5
6
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
7
---
8
tools/testing/selftests/net/mptcp/mptcp_join.sh | 15 +++++++++++++++
9
1 file changed, 15 insertions(+)
10
11
diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
12
index XXXXXXX..XXXXXXX 100755
13
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
14
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
15
@@ -XXX,XX +XXX,XX @@ userspace_tests()
16
    if reset_with_events "userspace pm add & remove address" &&
17
     continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then
18
        set_userspace_pm $ns1
19
+        if continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/path_manager'; then
20
+            local pm1 pm2
21
+
22
+            pm1=$(ip netns exec ${ns1} sysctl -n net.mptcp.path_manager)
23
+            if [ "$pm1" != "userspace" ]; then
24
+                mptcp_lib_pr_fail "ns1 pm_type mapping fails"
25
+                return 1
26
+            fi
27
+
28
+            pm2=$(ip netns exec ${ns2} sysctl -n net.mptcp.path_manager)
29
+            if [ "$pm2" != "kernel" ]; then
30
+                mptcp_lib_pr_fail "ns2 pm_type mapping fails"
31
+                return 1
32
+            fi
33
+        fi
34
        pm_nl_set_limits $ns2 2 2
35
        { speed=5 \
36
            run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null
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
Now pm->pm_type can be replaced by pm->ops->name, then "pm_type" filed
3
This patch adds a new helper set_path_manager() to set the newly added
4
of struct mptcp_pm_data can be dropped.
4
net.mptcp.path_manager, and test it inside a userspace pm test.
5
5
6
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
6
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
7
---
7
---
8
net/mptcp/pm.c | 4 +---
8
.../testing/selftests/net/mptcp/mptcp_join.sh | 34 ++++++++++++++++++-
9
net/mptcp/protocol.h | 5 ++---
9
1 file changed, 33 insertions(+), 1 deletion(-)
10
2 files changed, 3 insertions(+), 6 deletions(-)
11
10
12
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
11
diff --git a/tools/testing/selftests/net/mptcp/mptcp_join.sh b/tools/testing/selftests/net/mptcp/mptcp_join.sh
13
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100755
14
--- a/net/mptcp/pm.c
13
--- a/tools/testing/selftests/net/mptcp/mptcp_join.sh
15
+++ b/net/mptcp/pm.c
14
+++ b/tools/testing/selftests/net/mptcp/mptcp_join.sh
16
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_destroy(struct mptcp_sock *msk)
15
@@ -XXX,XX +XXX,XX @@ CBPF_MPTCP_SUBOPTION_ADD_ADDR="14,
17
void mptcp_pm_data_reset(struct mptcp_sock *msk)
16
             6 0 0 65535,
17
             6 0 0 0"
18
19
+set_path_manager()
20
+{
21
+    local ns=$1
22
+    local pm=$2
23
+
24
+    if ! ip netns exec ${ns} sysctl net.mptcp.available_path_managers |
25
+     grep -wq "${pm}"; then
26
+        mptcp_lib_pr_fail "path manager ${pm} not found"
27
+        return 1
28
+    fi
29
+    ip netns exec ${ns} sysctl -q net.mptcp.path_manager="${pm}"
30
+}
31
+
32
init_partial()
18
{
33
{
19
    const char *path_manager = mptcp_get_path_manager(sock_net((struct sock *)msk));
34
    capout=$(mktemp)
20
-    u8 pm_type = mptcp_get_pm_type(sock_net((struct sock *)msk));
35
@@ -XXX,XX +XXX,XX @@ userspace_tests()
21
    struct mptcp_pm_data *pm = &msk->pm;
36
    # userspace pm create destroy subflow
22
    int ret;
37
    if reset_with_events "userspace pm create destroy subflow" &&
23
38
     continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then
24
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_data_reset(struct mptcp_sock *msk)
39
-        set_userspace_pm $ns2
25
    pm->subflows = 0;
40
+        if continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/path_manager'; then
26
    pm->rm_list_tx.nr = 0;
41
+            local pm1 pm2
27
    pm->rm_list_rx.nr = 0;
42
+
28
-    WRITE_ONCE(pm->pm_type, pm_type);
43
+            set_path_manager $ns1 "kernel"
29
44
+            set_path_manager $ns2 "userspace"
30
    rcu_read_lock();
45
+
31
    ret = mptcp_pm_initialize(msk, mptcp_pm_find(path_manager));
46
+            pm1=$(ip netns exec ${ns1} sysctl -n net.mptcp.pm_type)
32
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_data_reset(struct mptcp_sock *msk)
47
+            if [ "$pm1" != "0" ]; then
33
    if (ret)
48
+                mptcp_lib_pr_fail "ns1 pm_type mapping fails"
34
        return;
49
+                return 1
35
50
+            fi
36
-    if (pm_type == MPTCP_PM_TYPE_KERNEL) {
51
+
37
+    if (mptcp_pm_is_kernel(msk)) {
52
+            pm2=$(ip netns exec ${ns2} sysctl -n net.mptcp.pm_type)
38
        bool subflows_allowed = !!mptcp_pm_get_subflows_max(msk);
53
+            if [ "$pm2" != "1" ]; then
39
54
+                mptcp_lib_pr_fail "ns2 pm_type mapping fails"
40
        /* pm->work_pending must be only be set to 'true' when
55
+                return 1
41
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
56
+            fi
42
index XXXXXXX..XXXXXXX 100644
57
+        else
43
--- a/net/mptcp/protocol.h
58
+            set_userspace_pm $ns2
44
+++ b/net/mptcp/protocol.h
59
+        fi
45
@@ -XXX,XX +XXX,XX @@ struct mptcp_pm_data {
60
        pm_nl_set_limits $ns1 0 1
46
    u8        add_addr_signaled;
61
        { speed=5 \
47
    u8        add_addr_accepted;
62
            run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null
48
    u8        local_addr_used;
49
-    u8        pm_type;
50
    u8        subflows;
51
    u8        status;
52
    DECLARE_BITMAP(id_avail_bitmap, MPTCP_PM_MAX_ADDR_ID + 1);
53
@@ -XXX,XX +XXX,XX @@ static inline bool mptcp_pm_should_rm_signal(struct mptcp_sock *msk)
54
55
static inline bool mptcp_pm_is_userspace(const struct mptcp_sock *msk)
56
{
57
-    return READ_ONCE(msk->pm.pm_type) == MPTCP_PM_TYPE_USERSPACE;
58
+    return !strncmp(msk->pm.ops->name, "userspace", MPTCP_PM_NAME_MAX);
59
}
60
61
static inline bool mptcp_pm_is_kernel(const struct mptcp_sock *msk)
62
{
63
-    return READ_ONCE(msk->pm.pm_type) == MPTCP_PM_TYPE_KERNEL;
64
+    return !strncmp(msk->pm.ops->name, "kernel", MPTCP_PM_NAME_MAX);
65
}
66
67
static inline unsigned int mptcp_add_addr_len(int family, bool echo, bool port)
68
--
63
--
69
2.43.0
64
2.43.0
diff view generated by jsdifflib