1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
2
3
v5:
4
- use "struct mptcp_pm_param *param" as unified parameters for all
5
interfaces.
6
- register in-kernel mptcp_pm_ops too.
7
- only implement two interfaces "get_local_id" and "get_priority" in
8
this set.
9
10
v4:
11
- include a new patch "define BPF path manager type".
12
13
- add new interfaces:
14
    created established closed
15
    listerner_created listener_closed
16
17
- rename interfaces as:
18
    address_announced address_removed
19
    subflow_established subflow_closed
20
    get_priority set_priority
21
22
- rename functions as:
23
    mptcp_pm_validate
24
    mptcp_pm_register
25
    mptcp_pm_unregister
26
    mptcp_pm_initialize
27
    mptcp_pm_release
28
29
v3:
30
- rename the 2nd parameter of get_local_id() from 'local' to 'skc'.
31
- keep the 'msk_sport' check in mptcp_userspace_pm_get_local_id().
32
- return 'err' instead of '0' in userspace_pm_subflow_create().
33
- drop 'ret' variable inmptcp_pm_data_reset().
34
- fix typos in commit log.
35
3
v2:
36
v2:
4
37
- update get_local_id interface in patch 2.
5
- update get_local_id interface in patch 2.
6
7
Depends on: "BPF path manager, part 3" v3
8
9
Based-on: <cover.1736935086.git.tanggeliang@kylinos.cn>
10
38
11
get_addr() and dump_addr() interfaces of BPF userspace pm are dropped
39
get_addr() and dump_addr() interfaces of BPF userspace pm are dropped
12
as Matt suggested.
40
as Matt suggested.
13
41
14
In order to implement BPF userspace path manager, it is necessary to
42
In order to implement BPF path manager, it's necessary to unify the
15
unify the interfaces of the path manager. This set contains some
43
interfaces of the path manager. This set contains some cleanups and
16
cleanups and refactoring to unify the interfaces in kernel space.
44
refactoring to unify the interfaces in kernel space. Finally, define
17
Finally, define a struct mptcp_pm_ops for a userspace path manager
45
a struct mptcp_pm_ops for a path manager.
18
like this:
19
46
20
struct mptcp_pm_ops {
47
Geliang Tang (9):
21
    int (*address_announce)(struct mptcp_sock *msk,
48
mptcp: pm: use addr entry for get_local_id
22
                struct mptcp_pm_addr_entry *local);
49
mptcp: pm: add struct mptcp_pm_param
23
    int (*address_remove)(struct mptcp_sock *msk, u8 id);
50
mptcp: pm: pass pm_param to get_local_id
24
    int (*subflow_create)(struct mptcp_sock *msk,
51
mptcp: pm: define struct mptcp_pm_ops
25
             struct mptcp_pm_addr_entry *local,
52
mptcp: pm: in-kernel: register mptcp_netlink_pm
26
             struct mptcp_addr_info *remote);
53
mptcp: pm: userspace: register mptcp_userspace_pm
27
    int (*subflow_destroy)(struct mptcp_sock *msk,
54
mptcp: pm: initialize and release mptcp_pm_ops
28
             struct mptcp_pm_addr_entry *local,
55
mptcp: pm: drop get_local_id helpers
29
             struct mptcp_addr_info *remote);
56
mptcp: pm: drop is_backup helpers
30
    int (*get_local_id)(struct mptcp_sock *msk,
31
             struct mptcp_pm_addr_entry *local);
32
    u8 (*get_flags)(struct mptcp_sock *msk,
33
            struct mptcp_addr_info *skc);
34
    int (*set_flags)(struct mptcp_sock *msk,
35
             struct mptcp_pm_addr_entry *local,
36
             struct mptcp_addr_info *remote);
37
57
38
    u8            type;
58
include/net/mptcp.h | 42 +++++++++++++
39
    struct module        *owner;
59
net/mptcp/pm.c | 131 ++++++++++++++++++++++++++++++++++++---
40
    struct list_head    list;
60
net/mptcp/pm_netlink.c | 23 +++++--
41
61
net/mptcp/pm_userspace.c | 37 ++++++-----
42
    void (*init)(struct mptcp_sock *msk);
43
    void (*release)(struct mptcp_sock *msk);
44
} ____cacheline_aligned_in_smp;
45
46
Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/74
47
48
Geliang Tang (3):
49
mptcp: define struct mptcp_pm_ops
50
mptcp: register default userspace pm
51
mptcp: init and release mptcp_pm_ops
52
53
include/net/mptcp.h | 27 +++
54
net/mptcp/pm.c | 8 +
55
net/mptcp/pm_userspace.c | 376 ++++++++++++++++++++++++++++-----------
56
net/mptcp/protocol.c | 1 +
62
net/mptcp/protocol.c | 1 +
57
net/mptcp/protocol.h | 9 +
63
net/mptcp/protocol.h | 24 +++----
58
5 files changed, 317 insertions(+), 104 deletions(-)
64
6 files changed, 216 insertions(+), 42 deletions(-)
59
65
60
--
66
--
61
2.43.0
67
2.43.0
diff view generated by jsdifflib
New patch
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
2
3
The following code in mptcp_userspace_pm_get_local_id() that assigns "skc"
4
to "new_entry" is not allowed in BPF if we use the same code to implement
5
the get_local_id() interface of a BFP path manager:
6
7
    memset(&new_entry, 0, sizeof(struct mptcp_pm_addr_entry));
8
    new_entry.addr = *skc;
9
    new_entry.addr.id = 0;
10
    new_entry.flags = MPTCP_PM_ADDR_FLAG_IMPLICIT;
11
12
To solve the issue, this patch moves this assignment to "new_entry" forward
13
to mptcp_pm_get_local_id(), and then passing "new_entry" as a parameter to
14
both mptcp_pm_nl_get_local_id() and mptcp_userspace_pm_get_local_id().
15
16
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
17
---
18
net/mptcp/pm.c | 11 ++++++++---
19
net/mptcp/pm_netlink.c | 9 ++++-----
20
net/mptcp/pm_userspace.c | 17 ++++++-----------
21
net/mptcp/protocol.h | 6 ++++--
22
4 files changed, 22 insertions(+), 21 deletions(-)
23
24
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
25
index XXXXXXX..XXXXXXX 100644
26
--- a/net/mptcp/pm.c
27
+++ b/net/mptcp/pm.c
28
@@ -XXX,XX +XXX,XX @@ bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
29
30
int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc)
31
{
32
-    struct mptcp_addr_info skc_local;
33
+    struct mptcp_pm_addr_entry skc_local;
34
    struct mptcp_addr_info msk_local;
35
36
    if (WARN_ON_ONCE(!msk))
37
        return -1;
38
39
+    memset(&skc_local, 0, sizeof(struct mptcp_pm_addr_entry));
40
+
41
    /* The 0 ID mapping is defined by the first subflow, copied into the msk
42
     * addr
43
     */
44
    mptcp_local_address((struct sock_common *)msk, &msk_local);
45
-    mptcp_local_address((struct sock_common *)skc, &skc_local);
46
-    if (mptcp_addresses_equal(&msk_local, &skc_local, false))
47
+    mptcp_local_address((struct sock_common *)skc, &skc_local.addr);
48
+    if (mptcp_addresses_equal(&msk_local, &skc_local.addr, false))
49
        return 0;
50
51
+    skc_local.addr.id = 0;
52
+    skc_local.flags = MPTCP_PM_ADDR_FLAG_IMPLICIT;
53
+
54
    if (mptcp_pm_is_userspace(msk))
55
        return mptcp_userspace_pm_get_local_id(msk, &skc_local);
56
    return mptcp_pm_nl_get_local_id(msk, &skc_local);
57
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
58
index XXXXXXX..XXXXXXX 100644
59
--- a/net/mptcp/pm_netlink.c
60
+++ b/net/mptcp/pm_netlink.c
61
@@ -XXX,XX +XXX,XX @@ static int mptcp_pm_nl_create_listen_socket(struct sock *sk,
62
    return err;
63
}
64
65
-int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *skc)
66
+int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk,
67
+             struct mptcp_pm_addr_entry *skc)
68
{
69
    struct mptcp_pm_addr_entry *entry;
70
    struct pm_nl_pernet *pernet;
71
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *skc
72
    pernet = pm_nl_get_pernet_from_msk(msk);
73
74
    rcu_read_lock();
75
-    entry = __lookup_addr(pernet, skc);
76
+    entry = __lookup_addr(pernet, &skc->addr);
77
    ret = entry ? entry->addr.id : -1;
78
    rcu_read_unlock();
79
    if (ret >= 0)
80
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *skc
81
    if (!entry)
82
        return -ENOMEM;
83
84
-    entry->addr = *skc;
85
-    entry->addr.id = 0;
86
+    *entry = *skc;
87
    entry->addr.port = 0;
88
    entry->ifindex = 0;
89
-    entry->flags = MPTCP_PM_ADDR_FLAG_IMPLICIT;
90
    entry->lsk = NULL;
91
    ret = mptcp_pm_nl_append_new_local_addr(pernet, entry, true);
92
    if (ret < 0)
93
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
94
index XXXXXXX..XXXXXXX 100644
95
--- a/net/mptcp/pm_userspace.c
96
+++ b/net/mptcp/pm_userspace.c
97
@@ -XXX,XX +XXX,XX @@ mptcp_userspace_pm_lookup_addr_by_id(struct mptcp_sock *msk, unsigned int id)
98
}
99
100
int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
101
-                 struct mptcp_addr_info *skc)
102
+                 struct mptcp_pm_addr_entry *skc)
103
{
104
-    struct mptcp_pm_addr_entry *entry = NULL, new_entry;
105
    __be16 msk_sport = ((struct inet_sock *)
106
             inet_sk((struct sock *)msk))->inet_sport;
107
+    struct mptcp_pm_addr_entry *entry;
108
109
    spin_lock_bh(&msk->pm.lock);
110
-    entry = mptcp_userspace_pm_lookup_addr(msk, skc);
111
+    entry = mptcp_userspace_pm_lookup_addr(msk, &skc->addr);
112
    spin_unlock_bh(&msk->pm.lock);
113
    if (entry)
114
        return entry->addr.id;
115
116
-    memset(&new_entry, 0, sizeof(struct mptcp_pm_addr_entry));
117
-    new_entry.addr = *skc;
118
-    new_entry.addr.id = 0;
119
-    new_entry.flags = MPTCP_PM_ADDR_FLAG_IMPLICIT;
120
-
121
-    if (new_entry.addr.port == msk_sport)
122
-        new_entry.addr.port = 0;
123
+    if (skc->addr.port == msk_sport)
124
+        skc->addr.port = 0;
125
126
-    return mptcp_userspace_pm_append_new_local_addr(msk, &new_entry, true);
127
+    return mptcp_userspace_pm_append_new_local_addr(msk, skc, true);
128
}
129
130
bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk,
131
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
132
index XXXXXXX..XXXXXXX 100644
133
--- a/net/mptcp/protocol.h
134
+++ b/net/mptcp/protocol.h
135
@@ -XXX,XX +XXX,XX @@ bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, const struct sk_buff *skb,
136
bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
137
             struct mptcp_rm_list *rm_list);
138
int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
139
-int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *skc);
140
-int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *skc);
141
+int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk,
142
+             struct mptcp_pm_addr_entry *skc);
143
+int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
144
+                 struct mptcp_pm_addr_entry *skc);
145
bool mptcp_pm_is_backup(struct mptcp_sock *msk, struct sock_common *skc);
146
bool mptcp_pm_nl_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc);
147
bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc);
148
--
149
2.43.0
diff view generated by jsdifflib
New patch
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
2
3
Generally, in the path manager interfaces, the local address is defined
4
as an mptcp_pm_addr_entry type address, while the remote address is
5
defined as an mptcp_addr_info type one:
6
7
(struct mptcp_pm_addr_entry *local, struct mptcp_addr_info *remote)
8
9
In order to make these interfaces more flexible and extensible, a struct
10
mptcp_pm_param is defined here to pass parameters. "entry" can be used
11
as the local address entry, and "addr" can be used as the remote address.
12
13
Also add a new helper mptcp_pm_param_set_contexts() to set a struct
14
mptcp_pm_param type parameter.
15
16
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
17
---
18
include/net/mptcp.h | 13 +++++++++++++
19
net/mptcp/pm.c | 10 ++++++++++
20
net/mptcp/protocol.h | 11 +++--------
21
3 files changed, 26 insertions(+), 8 deletions(-)
22
23
diff --git a/include/net/mptcp.h b/include/net/mptcp.h
24
index XXXXXXX..XXXXXXX 100644
25
--- a/include/net/mptcp.h
26
+++ b/include/net/mptcp.h
27
@@ -XXX,XX +XXX,XX @@ struct mptcp_sched_ops {
28
    void (*release)(struct mptcp_sock *msk);
29
} ____cacheline_aligned_in_smp;
30
31
+struct mptcp_pm_addr_entry {
32
+    struct list_head    list;
33
+    struct mptcp_addr_info    addr;
34
+    u8            flags;
35
+    int            ifindex;
36
+    struct socket        *lsk;
37
+};
38
+
39
+struct mptcp_pm_param {
40
+    struct mptcp_pm_addr_entry    entry;
41
+    struct mptcp_addr_info        addr;
42
+};
43
+
44
#ifdef CONFIG_MPTCP
45
void mptcp_init(void);
46
47
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
48
index XXXXXXX..XXXXXXX 100644
49
--- a/net/mptcp/pm.c
50
+++ b/net/mptcp/pm.c
51
@@ -XXX,XX +XXX,XX @@ bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
52
    return ret;
53
}
54
55
+void mptcp_pm_param_set_contexts(struct mptcp_pm_param *param,
56
+                 const struct mptcp_pm_addr_entry *entry,
57
+                 const struct mptcp_addr_info *addr)
58
+{
59
+    if (entry)
60
+        param->entry = *entry;
61
+    if (addr)
62
+        param->addr = *addr;
63
+}
64
+
65
int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc)
66
{
67
    struct mptcp_pm_addr_entry skc_local;
68
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
69
index XXXXXXX..XXXXXXX 100644
70
--- a/net/mptcp/protocol.h
71
+++ b/net/mptcp/protocol.h
72
@@ -XXX,XX +XXX,XX @@ struct mptcp_pm_local {
73
    int            ifindex;
74
};
75
76
-struct mptcp_pm_addr_entry {
77
-    struct list_head    list;
78
-    struct mptcp_addr_info    addr;
79
-    u8            flags;
80
-    int            ifindex;
81
-    struct socket        *lsk;
82
-};
83
-
84
struct mptcp_data_frag {
85
    struct list_head list;
86
    u64 data_seq;
87
@@ -XXX,XX +XXX,XX @@ bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, const struct sk_buff *skb,
88
             bool *drop_other_suboptions);
89
bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
90
             struct mptcp_rm_list *rm_list);
91
+void mptcp_pm_param_set_contexts(struct mptcp_pm_param *param,
92
+                 const struct mptcp_pm_addr_entry *entry,
93
+                 const struct mptcp_addr_info *addr);
94
int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
95
int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk,
96
             struct mptcp_pm_addr_entry *skc);
97
--
98
2.43.0
diff view generated by jsdifflib
New patch
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
2
3
This patch changes the 2nd parameter of get_local_id() interface as
4
"struct mptcp_pm_param" type. Only "entry" member of this struct is
5
used.
6
7
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
8
---
9
net/mptcp/pm.c | 6 ++++--
10
net/mptcp/pm_netlink.c | 3 ++-
11
net/mptcp/pm_userspace.c | 3 ++-
12
net/mptcp/protocol.h | 4 ++--
13
4 files changed, 10 insertions(+), 6 deletions(-)
14
15
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/net/mptcp/pm.c
18
+++ b/net/mptcp/pm.c
19
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc)
20
{
21
    struct mptcp_pm_addr_entry skc_local;
22
    struct mptcp_addr_info msk_local;
23
+    struct mptcp_pm_param param;
24
25
    if (WARN_ON_ONCE(!msk))
26
        return -1;
27
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc)
28
    skc_local.addr.id = 0;
29
    skc_local.flags = MPTCP_PM_ADDR_FLAG_IMPLICIT;
30
31
+    mptcp_pm_param_set_contexts(&param, &skc_local, NULL);
32
    if (mptcp_pm_is_userspace(msk))
33
-        return mptcp_userspace_pm_get_local_id(msk, &skc_local);
34
-    return mptcp_pm_nl_get_local_id(msk, &skc_local);
35
+        return mptcp_userspace_pm_get_local_id(msk, &param);
36
+    return mptcp_pm_nl_get_local_id(msk, &param);
37
}
38
39
bool mptcp_pm_is_backup(struct mptcp_sock *msk, struct sock_common *skc)
40
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
41
index XXXXXXX..XXXXXXX 100644
42
--- a/net/mptcp/pm_netlink.c
43
+++ b/net/mptcp/pm_netlink.c
44
@@ -XXX,XX +XXX,XX @@ static int mptcp_pm_nl_create_listen_socket(struct sock *sk,
45
}
46
47
int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk,
48
-             struct mptcp_pm_addr_entry *skc)
49
+             struct mptcp_pm_param *param)
50
{
51
+    struct mptcp_pm_addr_entry *skc = &param->entry;
52
    struct mptcp_pm_addr_entry *entry;
53
    struct pm_nl_pernet *pernet;
54
    int ret;
55
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
56
index XXXXXXX..XXXXXXX 100644
57
--- a/net/mptcp/pm_userspace.c
58
+++ b/net/mptcp/pm_userspace.c
59
@@ -XXX,XX +XXX,XX @@ mptcp_userspace_pm_lookup_addr_by_id(struct mptcp_sock *msk, unsigned int id)
60
}
61
62
int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
63
-                 struct mptcp_pm_addr_entry *skc)
64
+                 struct mptcp_pm_param *param)
65
{
66
    __be16 msk_sport = ((struct inet_sock *)
67
             inet_sk((struct sock *)msk))->inet_sport;
68
+    struct mptcp_pm_addr_entry *skc = &param->entry;
69
    struct mptcp_pm_addr_entry *entry;
70
71
    spin_lock_bh(&msk->pm.lock);
72
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
73
index XXXXXXX..XXXXXXX 100644
74
--- a/net/mptcp/protocol.h
75
+++ b/net/mptcp/protocol.h
76
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_param_set_contexts(struct mptcp_pm_param *param,
77
                 const struct mptcp_addr_info *addr);
78
int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
79
int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk,
80
-             struct mptcp_pm_addr_entry *skc);
81
+             struct mptcp_pm_param *param);
82
int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
83
-                 struct mptcp_pm_addr_entry *skc);
84
+                 struct mptcp_pm_param *param);
85
bool mptcp_pm_is_backup(struct mptcp_sock *msk, struct sock_common *skc);
86
bool mptcp_pm_nl_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc);
87
bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc);
88
--
89
2.43.0
diff view generated by jsdifflib
...
...
7
Add a set of functions to register, unregister, find and validate a
7
Add a set of functions to register, unregister, find and validate a
8
given struct ops.
8
given struct ops.
9
9
10
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
10
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
11
---
11
---
12
include/net/mptcp.h | 27 +++++++++++++++++++
12
include/net/mptcp.h | 29 ++++++++++++++++++++++
13
net/mptcp/pm_userspace.c | 57 ++++++++++++++++++++++++++++++++++++++++
13
net/mptcp/pm.c | 59 ++++++++++++++++++++++++++++++++++++++++++++
14
net/mptcp/protocol.h | 5 ++++
14
net/mptcp/protocol.h | 5 ++++
15
3 files changed, 89 insertions(+)
15
3 files changed, 93 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
21
@@ -XXX,XX +XXX,XX @@
21
@@ -XXX,XX +XXX,XX @@ struct mptcp_pm_param {
22
22
    struct mptcp_addr_info        addr;
23
struct mptcp_info;
23
};
24
struct mptcp_sock;
25
+struct mptcp_pm_addr_entry;
26
struct seq_file;
27
28
/* MPTCP sk_buff extension data */
29
@@ -XXX,XX +XXX,XX @@ struct mptcp_sched_ops {
30
    void (*release)(struct mptcp_sock *msk);
31
} ____cacheline_aligned_in_smp;
32
24
33
+struct mptcp_pm_ops {
25
+struct mptcp_pm_ops {
34
+    int (*address_announce)(struct mptcp_sock *msk,
26
+    int (*created)(struct mptcp_sock *msk);
35
+                struct mptcp_pm_addr_entry *local);
27
+    int (*established)(struct mptcp_sock *msk);
36
+    int (*address_remove)(struct mptcp_sock *msk, u8 id);
28
+    int (*closed)(struct mptcp_sock *msk);
37
+    int (*subflow_create)(struct mptcp_sock *msk,
29
+    int (*address_announced)(struct mptcp_sock *msk,
38
+             struct mptcp_pm_addr_entry *local,
30
+                 struct mptcp_pm_param *param);
39
+             struct mptcp_addr_info *remote);
31
+    int (*address_removed)(struct mptcp_sock *msk,
40
+    int (*subflow_destroy)(struct mptcp_sock *msk,
32
+             struct mptcp_pm_param *param);
41
+             struct mptcp_pm_addr_entry *local,
33
+    int (*subflow_established)(struct mptcp_sock *msk,
42
+             struct mptcp_addr_info *remote);
34
+                 struct mptcp_pm_param *param);
35
+    int (*subflow_closed)(struct mptcp_sock *msk,
36
+             struct mptcp_pm_param *param);
43
+    int (*get_local_id)(struct mptcp_sock *msk,
37
+    int (*get_local_id)(struct mptcp_sock *msk,
44
+             struct mptcp_pm_addr_entry *local);
38
+             struct mptcp_pm_param *param);
45
+    u8 (*get_flags)(struct mptcp_sock *msk,
39
+    bool (*get_priority)(struct mptcp_sock *msk,
46
+            struct mptcp_addr_info *skc);
40
+             struct mptcp_pm_param *param);
47
+    int (*set_flags)(struct mptcp_sock *msk,
41
+    int (*set_priority)(struct mptcp_sock *msk,
48
+             struct mptcp_pm_addr_entry *local,
42
+             struct mptcp_pm_param *param);
49
+             struct mptcp_addr_info *remote);
43
+    int (*listener_created)(struct mptcp_sock *msk);
44
+    int (*listener_closed)(struct mptcp_sock *msk);
50
+
45
+
51
+    u8            type;
46
+    u8            type;
52
+    struct module        *owner;
47
+    struct module        *owner;
53
+    struct list_head    list;
48
+    struct list_head    list;
54
+
49
+
...
...
57
+} ____cacheline_aligned_in_smp;
52
+} ____cacheline_aligned_in_smp;
58
+
53
+
59
#ifdef CONFIG_MPTCP
54
#ifdef CONFIG_MPTCP
60
void mptcp_init(void);
55
void mptcp_init(void);
61
56
62
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
57
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
63
index XXXXXXX..XXXXXXX 100644
58
index XXXXXXX..XXXXXXX 100644
64
--- a/net/mptcp/pm_userspace.c
59
--- a/net/mptcp/pm.c
65
+++ b/net/mptcp/pm_userspace.c
60
+++ b/net/mptcp/pm.c
66
@@ -XXX,XX +XXX,XX @@
61
@@ -XXX,XX +XXX,XX @@
67
* Copyright (c) 2022, Intel Corporation.
62
#define pr_fmt(fmt) "MPTCP: " fmt
68
*/
63
69
64
#include <linux/kernel.h>
70
+#include <linux/rculist.h>
65
+#include <linux/rculist.h>
71
+#include <linux/spinlock.h>
66
+#include <linux/spinlock.h>
67
#include <net/mptcp.h>
72
#include "protocol.h"
68
#include "protocol.h"
69
73
#include "mib.h"
70
#include "mib.h"
74
#include "mptcp_pm_gen.h"
71
#include "mptcp_pm_gen.h"
75
@@ -XXX,XX +XXX,XX @@
76
    list_for_each_entry(__entry,                        \
77
             &((__msk)->pm.userspace_pm_local_addr_list), list)
78
72
79
+static DEFINE_SPINLOCK(mptcp_pm_list_lock);
73
+static DEFINE_SPINLOCK(mptcp_pm_list_lock);
80
+static LIST_HEAD(mptcp_pm_list);
74
+static LIST_HEAD(mptcp_pm_list);
81
+
75
+
82
void mptcp_free_local_addr_list(struct mptcp_sock *msk)
76
/* path manager command handlers */
77
78
int mptcp_pm_announce_addr(struct mptcp_sock *msk,
79
@@ -XXX,XX +XXX,XX @@ void __init mptcp_pm_init(void)
83
{
80
{
84
    struct mptcp_pm_addr_entry *entry, *tmp;
81
    mptcp_pm_nl_init();
85
@@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr,
86
    sock_put(sk);
87
    return ret;
88
}
82
}
89
+
83
+
90
+/* Must be called with rcu read lock held */
84
+/* Must be called with rcu read lock held */
91
+struct mptcp_pm_ops *mptcp_pm_find(enum mptcp_pm_type type)
85
+struct mptcp_pm_ops *mptcp_pm_find(enum mptcp_pm_type type)
92
+{
86
+{
...
...
98
+    }
92
+    }
99
+
93
+
100
+    return NULL;
94
+    return NULL;
101
+}
95
+}
102
+
96
+
103
+int mptcp_validate_path_manager(struct mptcp_pm_ops *pm)
97
+int mptcp_pm_validate(struct mptcp_pm_ops *pm)
104
+{
98
+{
105
+    if (!pm->address_announce && !pm->address_remove &&
99
+    if (!pm->created && !pm->established && !pm->closed &&
106
+     !pm->subflow_create && !pm->subflow_destroy &&
100
+     !pm->address_announced && !pm->address_removed &&
107
+     !pm->get_local_id && !pm->get_flags && !pm->set_flags) {
101
+     !pm->subflow_established && !pm->subflow_closed &&
102
+     !pm->get_local_id && !pm->get_priority && !pm->set_priority &&
103
+     !pm->listener_created && !pm->listener_closed) {
108
+        pr_err("%u does not implement required ops\n", pm->type);
104
+        pr_err("%u does not implement required ops\n", pm->type);
109
+        return -EINVAL;
105
+        return -EINVAL;
110
+    }
106
+    }
111
+
107
+
112
+    return 0;
108
+    return 0;
113
+}
109
+}
114
+
110
+
115
+int mptcp_register_path_manager(struct mptcp_pm_ops *pm)
111
+int mptcp_pm_register(struct mptcp_pm_ops *pm)
116
+{
112
+{
117
+    int ret;
113
+    int ret;
118
+
114
+
119
+    ret = mptcp_validate_path_manager(pm);
115
+    ret = mptcp_pm_validate(pm);
120
+    if (ret)
116
+    if (ret)
121
+        return ret;
117
+        return ret;
122
+
118
+
123
+    spin_lock(&mptcp_pm_list_lock);
119
+    spin_lock(&mptcp_pm_list_lock);
124
+    if (mptcp_pm_find(pm->type)) {
120
+    if (mptcp_pm_find(pm->type)) {
...
...
130
+
126
+
131
+    pr_debug("userspace_pm type %u registered\n", pm->type);
127
+    pr_debug("userspace_pm type %u registered\n", pm->type);
132
+    return 0;
128
+    return 0;
133
+}
129
+}
134
+
130
+
135
+void mptcp_unregister_path_manager(struct mptcp_pm_ops *pm)
131
+void mptcp_pm_unregister(struct mptcp_pm_ops *pm)
136
+{
132
+{
137
+    spin_lock(&mptcp_pm_list_lock);
133
+    spin_lock(&mptcp_pm_list_lock);
138
+    list_del_rcu(&pm->list);
134
+    list_del_rcu(&pm->list);
139
+    spin_unlock(&mptcp_pm_list_lock);
135
+    spin_unlock(&mptcp_pm_list_lock);
140
+}
136
+}
...
...
145
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_remove_addr(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_
141
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_remove_addr(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_
146
void mptcp_pm_remove_addr_entry(struct mptcp_sock *msk,
142
void mptcp_pm_remove_addr_entry(struct mptcp_sock *msk,
147
                struct mptcp_pm_addr_entry *entry);
143
                struct mptcp_pm_addr_entry *entry);
148
144
149
+struct mptcp_pm_ops *mptcp_pm_find(enum mptcp_pm_type type);
145
+struct mptcp_pm_ops *mptcp_pm_find(enum mptcp_pm_type type);
150
+int mptcp_validate_path_manager(struct mptcp_pm_ops *pm);
146
+int mptcp_pm_validate(struct mptcp_pm_ops *pm);
151
+int mptcp_register_path_manager(struct mptcp_pm_ops *pm);
147
+int mptcp_pm_register(struct mptcp_pm_ops *pm);
152
+void mptcp_unregister_path_manager(struct mptcp_pm_ops *pm);
148
+void mptcp_pm_unregister(struct mptcp_pm_ops *pm);
153
+
149
+
154
void mptcp_free_local_addr_list(struct mptcp_sock *msk);
150
void mptcp_free_local_addr_list(struct mptcp_sock *msk);
155
151
156
void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk,
152
void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk,
157
--
153
--
158
2.43.0
154
2.43.0
diff view generated by jsdifflib
New patch
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
2
3
This patch defines the original in-kernel netlink path manager as a new
4
struct mptcp_pm_ops named "mptcp_netlink_pm", and register it in
5
mptcp_pm_nl_init().
6
7
Only get_local_id() and get_priority() interfaces are implemented here.
8
mptcp_pm_nl_is_backup() becomes a wrapper of get_priority().
9
10
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
11
---
12
net/mptcp/pm_netlink.c | 21 ++++++++++++++++++++-
13
1 file changed, 20 insertions(+), 1 deletion(-)
14
15
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/net/mptcp/pm_netlink.c
18
+++ b/net/mptcp/pm_netlink.c
19
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk,
20
    return ret;
21
}
22
23
-bool mptcp_pm_nl_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc)
24
+static bool mptcp_pm_nl_get_priority(struct mptcp_sock *msk,
25
+                 struct mptcp_pm_param *param)
26
{
27
    struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk);
28
+    struct mptcp_addr_info *skc = &param->addr;
29
    struct mptcp_pm_addr_entry *entry;
30
    bool backup;
31
32
@@ -XXX,XX +XXX,XX @@ bool mptcp_pm_nl_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc)
33
    return backup;
34
}
35
36
+bool mptcp_pm_nl_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc)
37
+{
38
+    struct mptcp_pm_param param;
39
+
40
+    mptcp_pm_param_set_contexts(&param, NULL, skc);
41
+    return mptcp_pm_nl_get_priority(msk, &param);
42
+}
43
+
44
#define MPTCP_PM_CMD_GRP_OFFSET 0
45
#define MPTCP_PM_EV_GRP_OFFSET 1
46
47
@@ -XXX,XX +XXX,XX @@ static struct pernet_operations mptcp_pm_pernet_ops = {
48
    .size = sizeof(struct pm_nl_pernet),
49
};
50
51
+static struct mptcp_pm_ops mptcp_netlink_pm = {
52
+    .get_local_id        = mptcp_pm_nl_get_local_id,
53
+    .get_priority        = mptcp_pm_nl_get_priority,
54
+    .type            = MPTCP_PM_TYPE_KERNEL,
55
+    .owner            = THIS_MODULE,
56
+};
57
+
58
void __init mptcp_pm_nl_init(void)
59
{
60
    if (register_pernet_subsys(&mptcp_pm_pernet_ops) < 0)
61
@@ -XXX,XX +XXX,XX @@ void __init mptcp_pm_nl_init(void)
62
63
    if (genl_register_family(&mptcp_genl_family))
64
        panic("Failed to register MPTCP PM netlink family\n");
65
+
66
+    mptcp_pm_register(&mptcp_netlink_pm);
67
}
68
--
69
2.43.0
diff view generated by jsdifflib
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
2
3
This patch defines the original userspace pm as the default path manager,
3
This patch defines the original userspace path manager as a new struct
4
named mptcp_userspace_pm, and register it in mptcp_pm_data_init().
4
mptcp_pm_ops named "mptcp_userspace_pm", and register it in
5
mptcp_pm_data_init().
5
6
6
Extract address_announce() interface of the userspace PM from the handler
7
Only get_local_id() and get_priority() interfaces are implemented here.
7
of netlink commond MPTCP_PM_CMD_ANNOUNCE mptcp_pm_nl_announce_doit(), only
8
mptcp_userspace_pm_is_backup() becomes a wrapper of get_priority().
8
leave the code for obtaining msk through "info" and parsing address entry
9
in the handler.
10
11
Extract address_remove() interface of the userspace PM from the handler
12
of netlink commond MPTCP_PM_CMD_REMOVE mptcp_pm_nl_remove_doit(), only
13
leave the code for parsing address id and obtaining msk through "info"
14
in the handler.
15
16
Extract subflow_create() interface of the userspace PM from the handler of
17
netlink commond MPTCP_PM_CMD_SUBFLOW_CREATE
18
19
    mptcp_pm_nl_subflow_create_doit(),
20
21
only leave the code for obtaining msk through "info", parsing local address
22
entry and parsing remote address info in the handler.
23
24
Extract subflow_destroy() interface of the userspace PM from the handler of
25
netlink commond MPTCP_PM_CMD_SUBFLOW_DESTROY
26
27
    mptcp_pm_nl_subflow_destroy_doit(),
28
29
only leave the code for obtaining msk through "info", parsing local address
30
entry and parsing remote address info in the handler.
31
32
Extract set_flags() interface of the userspace PM from function
33
mptcp_userspace_pm_set_flags(), only leave the code for obtaining
34
msk through "info" in this function.
35
36
All fives interfaces are invoked under holding the msk socket lock.
37
38
Extract get_local_id() interface of the userspace PM from function
39
mptcp_userspace_pm_get_local_id(), only leave the code for setting
40
new address entry in this function.
41
42
get_flags() interface of the userspace PM is defined as the same as
43
the function mptcp_userspace_pm_get_flags(), then this function
44
becomes a wrapper.
45
9
46
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
10
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
47
---
11
---
48
net/mptcp/pm.c | 1 +
12
net/mptcp/pm.c | 1 +
49
net/mptcp/pm_userspace.c | 275 ++++++++++++++++++++++++---------------
13
net/mptcp/pm_userspace.c | 26 ++++++++++++++++++++++++--
50
net/mptcp/protocol.h | 1 +
14
net/mptcp/protocol.h | 1 +
51
3 files changed, 173 insertions(+), 104 deletions(-)
15
3 files changed, 26 insertions(+), 2 deletions(-)
52
16
53
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
17
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
54
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
55
--- a/net/mptcp/pm.c
19
--- a/net/mptcp/pm.c
56
+++ b/net/mptcp/pm.c
20
+++ b/net/mptcp/pm.c
57
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_data_init(struct mptcp_sock *msk)
21
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_data_init(struct mptcp_sock *msk)
58
void __init mptcp_pm_init(void)
22
void __init mptcp_pm_init(void)
59
{
23
{
60
    mptcp_pm_nl_init();
24
    mptcp_pm_nl_init();
61
+    mptcp_userspace_pm_init();
25
+    mptcp_userspace_pm_init();
62
}
26
}
27
28
/* Must be called with rcu read lock held */
63
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
29
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
64
index XXXXXXX..XXXXXXX 100644
30
index XXXXXXX..XXXXXXX 100644
65
--- a/net/mptcp/pm_userspace.c
31
--- a/net/mptcp/pm_userspace.c
66
+++ b/net/mptcp/pm_userspace.c
32
+++ b/net/mptcp/pm_userspace.c
67
@@ -XXX,XX +XXX,XX @@ mptcp_userspace_pm_lookup_addr_by_id(struct mptcp_sock *msk, unsigned int id)
33
@@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
68
    return NULL;
34
    return mptcp_userspace_pm_append_new_local_addr(msk, skc, true);
69
}
35
}
70
36
71
-int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
37
-bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk,
72
-                 struct mptcp_addr_info *skc)
38
-                 struct mptcp_addr_info *skc)
73
+static int userspace_pm_get_local_id(struct mptcp_sock *msk,
39
+static bool mptcp_userspace_pm_get_priority(struct mptcp_sock *msk,
74
+                 struct mptcp_pm_addr_entry *local)
40
+                     struct mptcp_pm_param *param)
75
{
41
{
76
-    struct mptcp_pm_addr_entry *entry = NULL, new_entry;
42
+    struct mptcp_addr_info *skc = &param->addr;
77
    __be16 msk_sport = ((struct inet_sock *)
43
    struct mptcp_pm_addr_entry *entry;
78
             inet_sk((struct sock *)msk))->inet_sport;
44
    bool backup;
79
+    struct mptcp_pm_addr_entry *entry;
45
80
46
@@ -XXX,XX +XXX,XX @@ bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk,
81
    spin_lock_bh(&msk->pm.lock);
47
    return backup;
82
-    entry = mptcp_userspace_pm_lookup_addr(msk, skc);
48
}
83
+    entry = mptcp_userspace_pm_lookup_addr(msk, &local->addr);
49
84
    spin_unlock_bh(&msk->pm.lock);
50
+bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk,
85
    if (entry)
51
+                 struct mptcp_addr_info *skc)
86
        return entry->addr.id;
52
+{
87
53
+    struct mptcp_pm_param param;
88
+    if (local->addr.port == msk_sport)
89
+        local->addr.port = 0;
90
+
54
+
91
+    return mptcp_userspace_pm_append_new_local_addr(msk, local, true);
55
+    mptcp_pm_param_set_contexts(&param, NULL, skc);
92
+}
56
+    return mptcp_userspace_pm_get_priority(msk, &param);
93
+
94
+int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
95
+                 struct mptcp_addr_info *skc)
96
+{
97
+    struct mptcp_pm_addr_entry new_entry;
98
+
99
    memset(&new_entry, 0, sizeof(struct mptcp_pm_addr_entry));
100
    new_entry.addr = *skc;
101
    new_entry.addr.id = 0;
102
    new_entry.flags = MPTCP_PM_ADDR_FLAG_IMPLICIT;
103
104
-    if (new_entry.addr.port == msk_sport)
105
-        new_entry.addr.port = 0;
106
-
107
-    return mptcp_userspace_pm_append_new_local_addr(msk, &new_entry, true);
108
+    return userspace_pm_get_local_id(msk, &new_entry);
109
}
110
111
-u8 mptcp_userspace_pm_get_flags(struct mptcp_sock *msk,
112
-                struct mptcp_addr_info *skc)
113
+static u8 userspace_pm_get_flags(struct mptcp_sock *msk,
114
+                 struct mptcp_addr_info *skc)
115
{
116
    struct mptcp_pm_addr_entry *entry;
117
    u8 flags;
118
@@ -XXX,XX +XXX,XX @@ u8 mptcp_userspace_pm_get_flags(struct mptcp_sock *msk,
119
    return flags;
120
}
121
122
+u8 mptcp_userspace_pm_get_flags(struct mptcp_sock *msk,
123
+                struct mptcp_addr_info *skc)
124
+{
125
+    return userspace_pm_get_flags(msk, skc);
126
+}
57
+}
127
+
58
+
128
static struct mptcp_sock *mptcp_userspace_pm_get_sock(const struct genl_info *info)
59
static struct mptcp_sock *mptcp_userspace_pm_get_sock(const struct genl_info *info)
129
{
60
{
130
    struct mptcp_sock *msk;
61
    struct mptcp_sock *msk;
131
@@ -XXX,XX +XXX,XX @@ static struct mptcp_sock *mptcp_userspace_pm_get_sock(const struct genl_info *in
62
@@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr,
132
    return msk;
133
}
134
135
+static int userspace_pm_address_announce(struct mptcp_sock *msk,
136
+                     struct mptcp_pm_addr_entry *local)
137
+{
138
+    int err;
139
+
140
+    err = mptcp_userspace_pm_append_new_local_addr(msk, local, false);
141
+    if (err < 0)
142
+        return err;
143
+
144
+    spin_lock_bh(&msk->pm.lock);
145
+
146
+    if (mptcp_pm_alloc_anno_list(msk, &local->addr)) {
147
+        msk->pm.add_addr_signaled++;
148
+        mptcp_pm_announce_addr(msk, &local->addr, false);
149
+        mptcp_pm_nl_addr_send_ack(msk);
150
+    }
151
+
152
+    spin_unlock_bh(&msk->pm.lock);
153
+
154
+    return 0;
155
+}
156
+
157
int mptcp_pm_nl_announce_doit(struct sk_buff *skb, struct genl_info *info)
158
{
159
    struct mptcp_pm_addr_entry addr_val;
160
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_announce_doit(struct sk_buff *skb, struct genl_info *info)
161
        goto announce_err;
162
    }
163
164
-    err = mptcp_userspace_pm_append_new_local_addr(msk, &addr_val, false);
165
-    if (err < 0) {
166
-        NL_SET_ERR_MSG_ATTR(info->extack, addr,
167
-                 "did not match address and id");
168
-        goto announce_err;
169
-    }
170
-
171
    lock_sock(sk);
172
-    spin_lock_bh(&msk->pm.lock);
173
-
174
-    if (mptcp_pm_alloc_anno_list(msk, &addr_val.addr)) {
175
-        msk->pm.add_addr_signaled++;
176
-        mptcp_pm_announce_addr(msk, &addr_val.addr, false);
177
-        mptcp_pm_nl_addr_send_ack(msk);
178
-    }
179
-
180
-    spin_unlock_bh(&msk->pm.lock);
181
+    err = userspace_pm_address_announce(msk, &addr_val);
182
    release_sock(sk);
183
+    if (err)
184
+        NL_SET_ERR_MSG_ATTR(info->extack, addr,
185
+                 "did not match address and id");
186
187
-    err = 0;
188
announce_err:
189
    sock_put(sk);
63
    sock_put(sk);
190
    return err;
191
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_remove_addr_entry(struct mptcp_sock *msk,
192
    spin_unlock_bh(&msk->pm.lock);
193
}
194
195
+static int userspace_pm_address_remove(struct mptcp_sock *msk, u8 id)
196
+{
197
+    struct mptcp_pm_addr_entry *entry;
198
+
199
+    if (id == 0)
200
+        return mptcp_userspace_pm_remove_id_zero_address(msk);
201
+
202
+    spin_lock_bh(&msk->pm.lock);
203
+    entry = mptcp_userspace_pm_lookup_addr_by_id(msk, id);
204
+    if (!entry) {
205
+        spin_unlock_bh(&msk->pm.lock);
206
+        return -EINVAL;
207
+    }
208
+
209
+    list_del_rcu(&entry->list);
210
+    spin_unlock_bh(&msk->pm.lock);
211
+
212
+    mptcp_pm_remove_addr_entry(msk, entry);
213
+
214
+    sock_kfree_s((struct sock *)msk, entry, sizeof(*entry));
215
+
216
+    return 0;
217
+}
218
+
219
int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
220
{
221
-    struct mptcp_pm_addr_entry *match;
222
    struct mptcp_sock *msk;
223
    struct nlattr *id;
224
    int err = -EINVAL;
225
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
226
    sk = (struct sock *)msk;
227
228
    lock_sock(sk);
229
-
230
-    if (id_val == 0) {
231
-        err = mptcp_userspace_pm_remove_id_zero_address(msk);
232
-        release_sock(sk);
233
-        goto out;
234
-    }
235
-
236
-    spin_lock_bh(&msk->pm.lock);
237
-    match = mptcp_userspace_pm_lookup_addr_by_id(msk, id_val);
238
-    if (!match) {
239
-        spin_unlock_bh(&msk->pm.lock);
240
-        release_sock(sk);
241
-        goto out;
242
-    }
243
-
244
-    list_del_rcu(&match->list);
245
-    spin_unlock_bh(&msk->pm.lock);
246
-
247
-    mptcp_pm_remove_addr_entry(msk, match);
248
-
249
+    err = userspace_pm_address_remove(msk, id_val);
250
    release_sock(sk);
251
-
252
-    sock_kfree_s(sk, match, sizeof(*match));
253
-
254
-    err = 0;
255
-out:
256
    if (err)
257
        NL_SET_ERR_MSG_ATTR_FMT(info->extack, id,
258
                    "address with id %u not found",
259
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
260
    return err;
261
}
262
263
+static int userspace_pm_subflow_create(struct mptcp_sock *msk,
264
+                 struct mptcp_pm_addr_entry *entry,
265
+                 struct mptcp_addr_info *remote)
266
+{
267
+    struct sock *sk = (struct sock *)msk;
268
+    struct mptcp_pm_local local;
269
+    int err;
270
+
271
+    err = mptcp_userspace_pm_append_new_local_addr(msk, entry, false);
272
+    if (err < 0)
273
+        return err;
274
+
275
+    local.addr = entry->addr;
276
+    local.flags = entry->flags;
277
+    local.ifindex = entry->ifindex;
278
+
279
+    err = __mptcp_subflow_connect(sk, &local, remote);
280
+    spin_lock_bh(&msk->pm.lock);
281
+    if (err)
282
+        mptcp_userspace_pm_delete_local_addr(msk, entry);
283
+    else
284
+        msk->pm.subflows++;
285
+    spin_unlock_bh(&msk->pm.lock);
286
+
287
+    return 0;
288
+}
289
+
290
int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)
291
{
292
    struct mptcp_pm_addr_entry entry = { 0 };
293
    struct mptcp_addr_info addr_r;
294
    struct nlattr *raddr, *laddr;
295
-    struct mptcp_pm_local local;
296
    struct mptcp_sock *msk;
297
    int err = -EINVAL;
298
    struct sock *sk;
299
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)
300
        goto create_err;
301
    }
302
303
-    err = mptcp_userspace_pm_append_new_local_addr(msk, &entry, false);
304
-    if (err < 0) {
305
-        NL_SET_ERR_MSG_ATTR(info->extack, laddr,
306
-                 "did not match address and id");
307
-        goto create_err;
308
-    }
309
-
310
-    local.addr = entry.addr;
311
-    local.flags = entry.flags;
312
-    local.ifindex = entry.ifindex;
313
-
314
    lock_sock(sk);
315
-    err = __mptcp_subflow_connect(sk, &local, &addr_r);
316
+    err = userspace_pm_subflow_create(msk, &entry, &addr_r);
317
    release_sock(sk);
318
319
    if (err)
320
        GENL_SET_ERR_MSG_FMT(info, "connect error: %d", err);
321
322
-    spin_lock_bh(&msk->pm.lock);
323
-    if (err)
324
-        mptcp_userspace_pm_delete_local_addr(msk, &entry);
325
-    else
326
-        msk->pm.subflows++;
327
-    spin_unlock_bh(&msk->pm.lock);
328
-
329
create_err:
330
    sock_put(sk);
331
    return err;
332
@@ -XXX,XX +XXX,XX @@ static struct sock *mptcp_nl_find_ssk(struct mptcp_sock *msk,
333
    return NULL;
334
}
335
336
+static int userspace_pm_subflow_destroy(struct mptcp_sock *msk,
337
+                    struct mptcp_pm_addr_entry *local,
338
+                    struct mptcp_addr_info *remote)
339
+{
340
+    struct sock *ssk, *sk = (struct sock *)msk;
341
+
342
+    ssk = mptcp_nl_find_ssk(msk, &local->addr, remote);
343
+    if (!ssk)
344
+        return -ESRCH;
345
+
346
+    spin_lock_bh(&msk->pm.lock);
347
+    mptcp_userspace_pm_delete_local_addr(msk, local);
348
+    spin_unlock_bh(&msk->pm.lock);
349
+    mptcp_subflow_shutdown(sk, ssk, RCV_SHUTDOWN | SEND_SHUTDOWN);
350
+    mptcp_close_ssk(sk, ssk, mptcp_subflow_ctx(ssk));
351
+    MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_RMSUBFLOW);
352
+
353
+    return 0;
354
+}
355
+
356
int mptcp_pm_nl_subflow_destroy_doit(struct sk_buff *skb, struct genl_info *info)
357
{
358
    struct mptcp_pm_addr_entry addr_l;
359
    struct mptcp_addr_info addr_r;
360
    struct nlattr *raddr, *laddr;
361
    struct mptcp_sock *msk;
362
-    struct sock *sk, *ssk;
363
    int err = -EINVAL;
364
+    struct sock *sk;
365
366
    if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR) ||
367
     GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR_REMOTE))
368
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_subflow_destroy_doit(struct sk_buff *skb, struct genl_info *info
369
    }
370
371
    lock_sock(sk);
372
-    ssk = mptcp_nl_find_ssk(msk, &addr_l.addr, &addr_r);
373
-    if (!ssk) {
374
-        GENL_SET_ERR_MSG(info, "subflow not found");
375
-        err = -ESRCH;
376
-        goto release_sock;
377
-    }
378
-
379
-    spin_lock_bh(&msk->pm.lock);
380
-    mptcp_userspace_pm_delete_local_addr(msk, &addr_l);
381
-    spin_unlock_bh(&msk->pm.lock);
382
-    mptcp_subflow_shutdown(sk, ssk, RCV_SHUTDOWN | SEND_SHUTDOWN);
383
-    mptcp_close_ssk(sk, ssk, mptcp_subflow_ctx(ssk));
384
-    MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_RMSUBFLOW);
385
-release_sock:
386
+    err = userspace_pm_subflow_destroy(msk, &addr_l, &addr_r);
387
    release_sock(sk);
388
+    if (err)
389
+        GENL_SET_ERR_MSG(info, "subflow not found");
390
391
destroy_err:
392
    sock_put(sk);
393
    return err;
394
}
395
396
+static int userspace_pm_set_flags(struct mptcp_sock *msk,
397
+                 struct mptcp_pm_addr_entry *local,
398
+                 struct mptcp_addr_info *remote)
399
+{
400
+    struct mptcp_pm_addr_entry *entry;
401
+    u8 bkup = 0;
402
+
403
+    if (local->flags & MPTCP_PM_ADDR_FLAG_BACKUP)
404
+        bkup = 1;
405
+
406
+    spin_lock_bh(&msk->pm.lock);
407
+    entry = mptcp_userspace_pm_lookup_addr(msk, &local->addr);
408
+    if (entry) {
409
+        if (bkup)
410
+            entry->flags |= MPTCP_PM_ADDR_FLAG_BACKUP;
411
+        else
412
+            entry->flags &= ~MPTCP_PM_ADDR_FLAG_BACKUP;
413
+    }
414
+    spin_unlock_bh(&msk->pm.lock);
415
+
416
+    return mptcp_pm_nl_mp_prio_send_ack(msk, &local->addr, remote, bkup);
417
+}
418
+
419
int mptcp_userspace_pm_set_flags(struct mptcp_pm_addr_entry *local,
420
                 struct genl_info *info)
421
{
422
    struct mptcp_addr_info rem = { .family = AF_UNSPEC, };
423
-    struct mptcp_pm_addr_entry *entry;
424
    struct nlattr *attr, *attr_rem;
425
    struct mptcp_sock *msk;
426
    int ret = -EINVAL;
427
    struct sock *sk;
428
-    u8 bkup = 0;
429
430
    if (GENL_REQ_ATTR_CHECK(info, MPTCP_PM_ATTR_ADDR_REMOTE))
431
        return ret;
432
@@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_set_flags(struct mptcp_pm_addr_entry *local,
433
        goto set_flags_err;
434
    }
435
436
-    if (local->flags & MPTCP_PM_ADDR_FLAG_BACKUP)
437
-        bkup = 1;
438
-
439
-    spin_lock_bh(&msk->pm.lock);
440
-    entry = mptcp_userspace_pm_lookup_addr(msk, &local->addr);
441
-    if (entry) {
442
-        if (bkup)
443
-            entry->flags |= MPTCP_PM_ADDR_FLAG_BACKUP;
444
-        else
445
-            entry->flags &= ~MPTCP_PM_ADDR_FLAG_BACKUP;
446
-    }
447
-    spin_unlock_bh(&msk->pm.lock);
448
-
449
    lock_sock(sk);
450
-    ret = mptcp_pm_nl_mp_prio_send_ack(msk, &local->addr, &rem, bkup);
451
+    ret = userspace_pm_set_flags(msk, local, &rem);
452
    release_sock(sk);
453
454
    /* mptcp_pm_nl_mp_prio_send_ack() only fails in one case */
455
@@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr,
456
    return ret;
64
    return ret;
457
}
65
}
458
66
+
459
+static struct mptcp_pm_ops mptcp_userspace_pm = {
67
+static struct mptcp_pm_ops mptcp_userspace_pm = {
460
+    .address_announce    = userspace_pm_address_announce,
68
+    .get_local_id        = mptcp_userspace_pm_get_local_id,
461
+    .address_remove        = userspace_pm_address_remove,
69
+    .get_priority        = mptcp_userspace_pm_get_priority,
462
+    .subflow_create        = userspace_pm_subflow_create,
463
+    .subflow_destroy    = userspace_pm_subflow_destroy,
464
+    .get_local_id        = userspace_pm_get_local_id,
465
+    .get_flags        = userspace_pm_get_flags,
466
+    .set_flags        = userspace_pm_set_flags,
467
+    .type            = MPTCP_PM_TYPE_USERSPACE,
70
+    .type            = MPTCP_PM_TYPE_USERSPACE,
468
+    .owner            = THIS_MODULE,
71
+    .owner            = THIS_MODULE,
469
+};
72
+};
470
+
73
+
471
/* Must be called with rcu read lock held */
472
struct mptcp_pm_ops *mptcp_pm_find(enum mptcp_pm_type type)
473
{
474
@@ -XXX,XX +XXX,XX @@ int mptcp_register_path_manager(struct mptcp_pm_ops *pm)
475
476
void mptcp_unregister_path_manager(struct mptcp_pm_ops *pm)
477
{
478
+    if (pm == &mptcp_userspace_pm)
479
+        return;
480
+
481
    spin_lock(&mptcp_pm_list_lock);
482
    list_del_rcu(&pm->list);
483
    spin_unlock(&mptcp_pm_list_lock);
484
}
485
+
486
+void __init mptcp_userspace_pm_init(void)
74
+void __init mptcp_userspace_pm_init(void)
487
+{
75
+{
488
+    mptcp_register_path_manager(&mptcp_userspace_pm);
76
+    mptcp_pm_register(&mptcp_userspace_pm);
489
+}
77
+}
490
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
78
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
491
index XXXXXXX..XXXXXXX 100644
79
index XXXXXXX..XXXXXXX 100644
492
--- a/net/mptcp/protocol.h
80
--- a/net/mptcp/protocol.h
493
+++ b/net/mptcp/protocol.h
81
+++ b/net/mptcp/protocol.h
...
...
diff view generated by jsdifflib
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
2
3
Add a struct mptcp_pm_ops pointer "ops" in struct mptcp_pm_data, and two
3
Add a struct mptcp_pm_ops pointer "ops" in struct mptcp_pm_data, and two
4
functions mptcp_init_pm() and mptcp_release_pm(), to set and release this
4
functions mptcp_pm_initialize() and mptcp_pm_release(), to set and release
5
pointer. mptcp_init_pm() is invoked in mptcp_pm_data_reset(), while
5
this pointer. mptcp_pm_initialize() is invoked in mptcp_pm_data_reset(),
6
mptcp_release_pm() is invoked in __mptcp_destroy_sock().
6
while mptcp_pm_release() is invoked in __mptcp_destroy_sock().
7
8
In this way, different userspace path managers can be initialized through
9
the pm_type sysctl, and then called into their respective interfaces
10
through "ops" of "msk->pm".
11
7
12
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
8
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
13
---
9
---
14
net/mptcp/pm.c | 7 +++++
10
net/mptcp/pm.c | 33 +++++++++++++++++++++++++++++++++
15
net/mptcp/pm_userspace.c | 58 +++++++++++++++++++++++++++++++++++-----
11
net/mptcp/protocol.c | 1 +
16
net/mptcp/protocol.c | 1 +
12
net/mptcp/protocol.h | 3 +++
17
net/mptcp/protocol.h | 3 +++
13
3 files changed, 37 insertions(+)
18
4 files changed, 62 insertions(+), 7 deletions(-)
19
14
20
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
21
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
22
--- a/net/mptcp/pm.c
17
--- a/net/mptcp/pm.c
23
+++ b/net/mptcp/pm.c
18
+++ b/net/mptcp/pm.c
24
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_data_reset(struct mptcp_sock *msk)
19
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_data_reset(struct mptcp_sock *msk)
25
{
20
    pm->rm_list_tx.nr = 0;
26
    u8 pm_type = mptcp_get_pm_type(sock_net((struct sock *)msk));
21
    pm->rm_list_rx.nr = 0;
27
    struct mptcp_pm_data *pm = &msk->pm;
22
    WRITE_ONCE(pm->pm_type, pm_type);
28
+    int ret;
23
+    rcu_read_lock();
29
24
+    mptcp_pm_initialize(msk, mptcp_pm_find(pm_type));
30
    pm->add_addr_signaled = 0;
25
+    rcu_read_unlock();
31
    pm->add_addr_accepted = 0;
26
32
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_data_reset(struct mptcp_sock *msk)
27
    if (pm_type == MPTCP_PM_TYPE_KERNEL) {
33
        WRITE_ONCE(pm->work_pending, 0);
28
        bool subflows_allowed = !!mptcp_pm_get_subflows_max(msk);
34
        WRITE_ONCE(pm->accept_addr, 0);
29
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_unregister(struct mptcp_pm_ops *pm)
35
        WRITE_ONCE(pm->accept_subflow, 0);
30
    list_del_rcu(&pm->list);
36
+
37
+        rcu_read_lock();
38
+        ret = mptcp_init_pm(msk, mptcp_pm_find(pm_type));
39
+        rcu_read_unlock();
40
+        if (ret)
41
+            return;
42
    }
43
44
    WRITE_ONCE(pm->addr_signal, 0);
45
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
46
index XXXXXXX..XXXXXXX 100644
47
--- a/net/mptcp/pm_userspace.c
48
+++ b/net/mptcp/pm_userspace.c
49
@@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
50
    new_entry.addr.id = 0;
51
    new_entry.flags = MPTCP_PM_ADDR_FLAG_IMPLICIT;
52
53
-    return userspace_pm_get_local_id(msk, &new_entry);
54
+    return msk->pm.ops->get_local_id ?
55
+     msk->pm.ops->get_local_id(msk, &new_entry) :
56
+     userspace_pm_get_local_id(msk, &new_entry);
57
}
58
59
static u8 userspace_pm_get_flags(struct mptcp_sock *msk,
60
@@ -XXX,XX +XXX,XX @@ static u8 userspace_pm_get_flags(struct mptcp_sock *msk,
61
u8 mptcp_userspace_pm_get_flags(struct mptcp_sock *msk,
62
                struct mptcp_addr_info *skc)
63
{
64
-    return userspace_pm_get_flags(msk, skc);
65
+    return msk->pm.ops->get_flags ?
66
+     msk->pm.ops->get_flags(msk, skc) :
67
+     userspace_pm_get_flags(msk, skc);
68
}
69
70
static struct mptcp_sock *mptcp_userspace_pm_get_sock(const struct genl_info *info)
71
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_announce_doit(struct sk_buff *skb, struct genl_info *info)
72
    }
73
74
    lock_sock(sk);
75
-    err = userspace_pm_address_announce(msk, &addr_val);
76
+    err = msk->pm.ops->address_announce ?
77
+     msk->pm.ops->address_announce(msk, &addr_val) :
78
+     userspace_pm_address_announce(msk, &addr_val);
79
    release_sock(sk);
80
    if (err)
81
        NL_SET_ERR_MSG_ATTR(info->extack, addr,
82
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
83
    sk = (struct sock *)msk;
84
85
    lock_sock(sk);
86
-    err = userspace_pm_address_remove(msk, id_val);
87
+    err = msk->pm.ops->address_remove ?
88
+     msk->pm.ops->address_remove(msk, id_val) :
89
+     userspace_pm_address_remove(msk, id_val);
90
    release_sock(sk);
91
    if (err)
92
        NL_SET_ERR_MSG_ATTR_FMT(info->extack, id,
93
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)
94
    }
95
96
    lock_sock(sk);
97
-    err = userspace_pm_subflow_create(msk, &entry, &addr_r);
98
+    err = msk->pm.ops->subflow_create ?
99
+     msk->pm.ops->subflow_create(msk, &entry, &addr_r) :
100
+     userspace_pm_subflow_create(msk, &entry, &addr_r);
101
    release_sock(sk);
102
103
    if (err)
104
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_subflow_destroy_doit(struct sk_buff *skb, struct genl_info *info
105
    }
106
107
    lock_sock(sk);
108
-    err = userspace_pm_subflow_destroy(msk, &addr_l, &addr_r);
109
+    err = msk->pm.ops->subflow_destroy ?
110
+     msk->pm.ops->subflow_destroy(msk, &addr_l, &addr_r) :
111
+     userspace_pm_subflow_destroy(msk, &addr_l, &addr_r);
112
    release_sock(sk);
113
    if (err)
114
        GENL_SET_ERR_MSG(info, "subflow not found");
115
@@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_set_flags(struct mptcp_pm_addr_entry *local,
116
    }
117
118
    lock_sock(sk);
119
-    ret = userspace_pm_set_flags(msk, local, &rem);
120
+    ret = msk->pm.ops->set_flags ?
121
+     msk->pm.ops->set_flags(msk, local, &rem) :
122
+     userspace_pm_set_flags(msk, local, &rem);
123
    release_sock(sk);
124
125
    /* mptcp_pm_nl_mp_prio_send_ack() only fails in one case */
126
@@ -XXX,XX +XXX,XX @@ void mptcp_unregister_path_manager(struct mptcp_pm_ops *pm)
127
    spin_unlock(&mptcp_pm_list_lock);
31
    spin_unlock(&mptcp_pm_list_lock);
128
}
32
}
129
33
+
130
+int mptcp_init_pm(struct mptcp_sock *msk, struct mptcp_pm_ops *pm)
34
+int mptcp_pm_initialize(struct mptcp_sock *msk, struct mptcp_pm_ops *pm)
131
+{
35
+{
132
+    if (!pm)
36
+    if (!pm)
133
+        pm = &mptcp_userspace_pm;
37
+        return -EINVAL;
134
+
38
+
135
+    if (!bpf_try_module_get(pm, pm->owner))
39
+    if (!bpf_try_module_get(pm, pm->owner))
136
+        return -EBUSY;
40
+        return -EBUSY;
137
+
41
+
138
+    msk->pm.ops = pm;
42
+    msk->pm.ops = pm;
...
...
141
+
45
+
142
+    pr_debug("userspace_pm type %u initialized\n", msk->pm.ops->type);
46
+    pr_debug("userspace_pm type %u initialized\n", msk->pm.ops->type);
143
+    return 0;
47
+    return 0;
144
+}
48
+}
145
+
49
+
146
+void mptcp_release_pm(struct mptcp_sock *msk)
50
+void mptcp_pm_release(struct mptcp_sock *msk)
147
+{
51
+{
148
+    struct mptcp_pm_ops *pm = msk->pm.ops;
52
+    struct mptcp_pm_ops *pm = msk->pm.ops;
149
+
53
+
150
+    if (!pm)
54
+    if (!pm)
151
+        return;
55
+        return;
...
...
154
+    if (pm->release)
58
+    if (pm->release)
155
+        pm->release(msk);
59
+        pm->release(msk);
156
+
60
+
157
+    bpf_module_put(pm, pm->owner);
61
+    bpf_module_put(pm, pm->owner);
158
+}
62
+}
159
+
160
void __init mptcp_userspace_pm_init(void)
161
{
162
    mptcp_register_path_manager(&mptcp_userspace_pm);
163
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
63
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
164
index XXXXXXX..XXXXXXX 100644
64
index XXXXXXX..XXXXXXX 100644
165
--- a/net/mptcp/protocol.c
65
--- a/net/mptcp/protocol.c
166
+++ b/net/mptcp/protocol.c
66
+++ b/net/mptcp/protocol.c
167
@@ -XXX,XX +XXX,XX @@ static void __mptcp_destroy_sock(struct sock *sk)
67
@@ -XXX,XX +XXX,XX @@ static void __mptcp_destroy_sock(struct sock *sk)
168
    sk_stop_timer(sk, &sk->sk_timer);
68
    sk_stop_timer(sk, &sk->sk_timer);
169
    msk->pm.status = 0;
69
    msk->pm.status = 0;
170
    mptcp_release_sched(msk);
70
    mptcp_release_sched(msk);
171
+    mptcp_release_pm(msk);
71
+    mptcp_pm_release(msk);
172
72
173
    sk->sk_prot->destroy(sk);
73
    sk->sk_prot->destroy(sk);
174
74
175
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
75
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
176
index XXXXXXX..XXXXXXX 100644
76
index XXXXXXX..XXXXXXX 100644
...
...
183
+    struct mptcp_pm_ops *ops;
83
+    struct mptcp_pm_ops *ops;
184
84
185
    spinlock_t    lock;        /*protects the whole PM data */
85
    spinlock_t    lock;        /*protects the whole PM data */
186
86
187
@@ -XXX,XX +XXX,XX @@ struct mptcp_pm_ops *mptcp_pm_find(enum mptcp_pm_type type);
87
@@ -XXX,XX +XXX,XX @@ struct mptcp_pm_ops *mptcp_pm_find(enum mptcp_pm_type type);
188
int mptcp_validate_path_manager(struct mptcp_pm_ops *pm);
88
int mptcp_pm_validate(struct mptcp_pm_ops *pm);
189
int mptcp_register_path_manager(struct mptcp_pm_ops *pm);
89
int mptcp_pm_register(struct mptcp_pm_ops *pm);
190
void mptcp_unregister_path_manager(struct mptcp_pm_ops *pm);
90
void mptcp_pm_unregister(struct mptcp_pm_ops *pm);
191
+int mptcp_init_pm(struct mptcp_sock *msk, struct mptcp_pm_ops *pm);
91
+int mptcp_pm_initialize(struct mptcp_sock *msk, struct mptcp_pm_ops *pm);
192
+void mptcp_release_pm(struct mptcp_sock *msk);
92
+void mptcp_pm_release(struct mptcp_sock *msk);
193
93
194
void mptcp_free_local_addr_list(struct mptcp_sock *msk);
94
void mptcp_free_local_addr_list(struct mptcp_sock *msk);
195
95
196
--
96
--
197
2.43.0
97
2.43.0
diff view generated by jsdifflib
New patch
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
2
3
Now mptcp_pm_nl_get_local_id() and mptcp_userspace_pm_get_local_id()
4
helpers can be dropped, and mptcp_pm_get_local_id() can directly invoke
5
get_local_id() interface through "ops" of "msk->pm".
6
7
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
8
---
9
net/mptcp/pm.c | 6 +++---
10
net/mptcp/pm_netlink.c | 4 ++--
11
net/mptcp/pm_userspace.c | 4 ++--
12
net/mptcp/protocol.h | 4 ----
13
4 files changed, 7 insertions(+), 11 deletions(-)
14
15
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/net/mptcp/pm.c
18
+++ b/net/mptcp/pm.c
19
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc)
20
    skc_local.addr.id = 0;
21
    skc_local.flags = MPTCP_PM_ADDR_FLAG_IMPLICIT;
22
23
+    if (!msk->pm.ops || !msk->pm.ops->get_local_id)
24
+        return -ENOTSUPP;
25
    mptcp_pm_param_set_contexts(&param, &skc_local, NULL);
26
-    if (mptcp_pm_is_userspace(msk))
27
-        return mptcp_userspace_pm_get_local_id(msk, &param);
28
-    return mptcp_pm_nl_get_local_id(msk, &param);
29
+    return msk->pm.ops->get_local_id(msk, &param);
30
}
31
32
bool mptcp_pm_is_backup(struct mptcp_sock *msk, struct sock_common *skc)
33
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/net/mptcp/pm_netlink.c
36
+++ b/net/mptcp/pm_netlink.c
37
@@ -XXX,XX +XXX,XX @@ static int mptcp_pm_nl_create_listen_socket(struct sock *sk,
38
    return err;
39
}
40
41
-int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk,
42
-             struct mptcp_pm_param *param)
43
+static int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk,
44
+                 struct mptcp_pm_param *param)
45
{
46
    struct mptcp_pm_addr_entry *skc = &param->entry;
47
    struct mptcp_pm_addr_entry *entry;
48
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
49
index XXXXXXX..XXXXXXX 100644
50
--- a/net/mptcp/pm_userspace.c
51
+++ 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)
53
    return NULL;
54
}
55
56
-int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
57
-                 struct mptcp_pm_param *param)
58
+static int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
59
+                     struct mptcp_pm_param *param)
60
{
61
    __be16 msk_sport = ((struct inet_sock *)
62
             inet_sk((struct sock *)msk))->inet_sport;
63
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
64
index XXXXXXX..XXXXXXX 100644
65
--- a/net/mptcp/protocol.h
66
+++ b/net/mptcp/protocol.h
67
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_param_set_contexts(struct mptcp_pm_param *param,
68
                 const struct mptcp_pm_addr_entry *entry,
69
                 const struct mptcp_addr_info *addr);
70
int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
71
-int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk,
72
-             struct mptcp_pm_param *param);
73
-int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
74
-                 struct mptcp_pm_param *param);
75
bool mptcp_pm_is_backup(struct mptcp_sock *msk, struct sock_common *skc);
76
bool mptcp_pm_nl_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc);
77
bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc);
78
--
79
2.43.0
diff view generated by jsdifflib
New patch
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
2
3
Now mptcp_pm_nl_is_backup() and mptcp_userspace_pm_is_backup()
4
helpers can be dropped, and mptcp_pm_is_backup() can directly
5
invoke get_priority() interface through "ops" of "msk->pm".
6
7
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
8
---
9
net/mptcp/pm.c | 9 +++++----
10
net/mptcp/pm_netlink.c | 8 --------
11
net/mptcp/pm_userspace.c | 9 ---------
12
net/mptcp/protocol.h | 2 --
13
4 files changed, 5 insertions(+), 23 deletions(-)
14
15
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/net/mptcp/pm.c
18
+++ b/net/mptcp/pm.c
19
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc)
20
bool mptcp_pm_is_backup(struct mptcp_sock *msk, struct sock_common *skc)
21
{
22
    struct mptcp_addr_info skc_local;
23
+    struct mptcp_pm_param param;
24
25
    mptcp_local_address((struct sock_common *)skc, &skc_local);
26
27
-    if (mptcp_pm_is_userspace(msk))
28
-        return mptcp_userspace_pm_is_backup(msk, &skc_local);
29
-
30
-    return mptcp_pm_nl_is_backup(msk, &skc_local);
31
+    if (!msk->pm.ops || !msk->pm.ops->get_priority)
32
+        return -ENOTSUPP;
33
+    mptcp_pm_param_set_contexts(&param, NULL, &skc_local);
34
+    return msk->pm.ops->get_priority(msk, &param);
35
}
36
37
static int mptcp_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr,
38
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
39
index XXXXXXX..XXXXXXX 100644
40
--- a/net/mptcp/pm_netlink.c
41
+++ b/net/mptcp/pm_netlink.c
42
@@ -XXX,XX +XXX,XX @@ static bool mptcp_pm_nl_get_priority(struct mptcp_sock *msk,
43
    return backup;
44
}
45
46
-bool mptcp_pm_nl_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc)
47
-{
48
-    struct mptcp_pm_param param;
49
-
50
-    mptcp_pm_param_set_contexts(&param, NULL, skc);
51
-    return mptcp_pm_nl_get_priority(msk, &param);
52
-}
53
-
54
#define MPTCP_PM_CMD_GRP_OFFSET 0
55
#define MPTCP_PM_EV_GRP_OFFSET 1
56
57
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
58
index XXXXXXX..XXXXXXX 100644
59
--- a/net/mptcp/pm_userspace.c
60
+++ b/net/mptcp/pm_userspace.c
61
@@ -XXX,XX +XXX,XX @@ static bool mptcp_userspace_pm_get_priority(struct mptcp_sock *msk,
62
    return backup;
63
}
64
65
-bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk,
66
-                 struct mptcp_addr_info *skc)
67
-{
68
-    struct mptcp_pm_param param;
69
-
70
-    mptcp_pm_param_set_contexts(&param, NULL, skc);
71
-    return mptcp_userspace_pm_get_priority(msk, &param);
72
-}
73
-
74
static struct mptcp_sock *mptcp_userspace_pm_get_sock(const struct genl_info *info)
75
{
76
    struct mptcp_sock *msk;
77
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
78
index XXXXXXX..XXXXXXX 100644
79
--- a/net/mptcp/protocol.h
80
+++ b/net/mptcp/protocol.h
81
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_param_set_contexts(struct mptcp_pm_param *param,
82
                 const struct mptcp_addr_info *addr);
83
int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
84
bool mptcp_pm_is_backup(struct mptcp_sock *msk, struct sock_common *skc);
85
-bool mptcp_pm_nl_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc);
86
-bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc);
87
int mptcp_pm_nl_dump_addr(struct sk_buff *msg,
88
             struct netlink_callback *cb);
89
int mptcp_userspace_pm_dump_addr(struct sk_buff *msg,
90
--
91
2.43.0
diff view generated by jsdifflib