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 |