1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
2
3
Some path manager related refactoring and cleanups.
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.
4
9
5
Geliang Tang (6):
10
v4:
6
mptcp: pm: in-kernel: avoid access entry without lock
11
- include a new patch "define BPF path manager type".
7
mptcp: pm: in-kernel: reduce parameters of set_flags
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
36
v2:
37
- update get_local_id interface in patch 2.
38
39
get_addr() and dump_addr() interfaces of BPF userspace pm are dropped
40
as Matt suggested.
41
42
In order to implement BPF path manager, it's necessary to unify the
43
interfaces of the path manager. This set contains some cleanups and
44
refactoring to unify the interfaces in kernel space. Finally, define
45
a struct mptcp_pm_ops for a path manager.
46
47
Geliang Tang (9):
8
mptcp: pm: use addr entry for get_local_id
48
mptcp: pm: use addr entry for get_local_id
9
mptcp: pm: in-kernel: use kmemdup helper
49
mptcp: pm: add struct mptcp_pm_param
10
sock: add sock_kmemdup helper
50
mptcp: pm: pass pm_param to get_local_id
11
mptcp: pm: userspace: use sock_kmemdup helper
51
mptcp: pm: define struct mptcp_pm_ops
52
mptcp: pm: in-kernel: register mptcp_netlink_pm
53
mptcp: pm: userspace: register mptcp_userspace_pm
54
mptcp: pm: initialize and release mptcp_pm_ops
55
mptcp: pm: drop get_local_id helpers
56
mptcp: pm: drop is_backup helpers
12
57
13
include/net/sock.h | 1 +
58
include/net/mptcp.h | 42 +++++++++++++
14
net/core/sock.c | 23 +++++++++++++++++++++++
59
net/mptcp/pm.c | 131 ++++++++++++++++++++++++++++++++++++---
15
net/mptcp/pm.c | 9 ++++++---
60
net/mptcp/pm_netlink.c | 23 +++++--
16
net/mptcp/pm_netlink.c | 30 +++++++++++++-----------------
61
net/mptcp/pm_userspace.c | 37 ++++++-----
17
net/mptcp/pm_userspace.c | 20 +++++++-------------
62
net/mptcp/protocol.c | 1 +
18
net/mptcp/protocol.h | 6 ++++--
63
net/mptcp/protocol.h | 24 +++----
19
6 files changed, 54 insertions(+), 35 deletions(-)
64
6 files changed, 216 insertions(+), 42 deletions(-)
20
65
21
--
66
--
22
2.43.0
67
2.43.0
diff view generated by jsdifflib
...
...
13
to mptcp_pm_get_local_id(), and then passing "new_entry" as a parameter to
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().
14
both mptcp_pm_nl_get_local_id() and mptcp_userspace_pm_get_local_id().
15
15
16
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
16
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
17
---
17
---
18
net/mptcp/pm.c | 9 ++++++---
18
net/mptcp/pm.c | 11 ++++++++---
19
net/mptcp/pm_netlink.c | 11 ++++-------
19
net/mptcp/pm_netlink.c | 9 ++++-----
20
net/mptcp/pm_userspace.c | 17 ++++++-----------
20
net/mptcp/pm_userspace.c | 17 ++++++-----------
21
net/mptcp/protocol.h | 6 ++++--
21
net/mptcp/protocol.h | 6 ++++--
22
4 files changed, 20 insertions(+), 23 deletions(-)
22
4 files changed, 22 insertions(+), 21 deletions(-)
23
23
24
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
24
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
25
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
26
--- a/net/mptcp/pm.c
26
--- a/net/mptcp/pm.c
27
+++ b/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,
28
@@ -XXX,XX +XXX,XX @@ bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remaining,
29
29
30
int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc)
30
int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc)
31
{
31
{
32
-    struct mptcp_addr_info skc_local;
32
-    struct mptcp_addr_info skc_local;
33
+    struct mptcp_pm_addr_entry skc_local = { 0 };
33
+    struct mptcp_pm_addr_entry skc_local;
34
    struct mptcp_addr_info msk_local;
34
    struct mptcp_addr_info msk_local;
35
35
36
    if (WARN_ON_ONCE(!msk))
36
    if (WARN_ON_ONCE(!msk))
37
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc)
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
38
     * addr
42
     * addr
39
     */
43
     */
40
    mptcp_local_address((struct sock_common *)msk, &msk_local);
44
    mptcp_local_address((struct sock_common *)msk, &msk_local);
41
-    mptcp_local_address((struct sock_common *)skc, &skc_local);
45
-    mptcp_local_address((struct sock_common *)skc, &skc_local);
42
-    if (mptcp_addresses_equal(&msk_local, &skc_local, false))
46
-    if (mptcp_addresses_equal(&msk_local, &skc_local, false))
...
...
79
83
80
-    entry->addr = *skc;
84
-    entry->addr = *skc;
81
-    entry->addr.id = 0;
85
-    entry->addr.id = 0;
82
+    *entry = *skc;
86
+    *entry = *skc;
83
    entry->addr.port = 0;
87
    entry->addr.port = 0;
84
-    entry->ifindex = 0;
88
    entry->ifindex = 0;
85
-    entry->flags = MPTCP_PM_ADDR_FLAG_IMPLICIT;
89
-    entry->flags = MPTCP_PM_ADDR_FLAG_IMPLICIT;
86
-    entry->lsk = NULL;
90
    entry->lsk = NULL;
87
    ret = mptcp_pm_nl_append_new_local_addr(pernet, entry, true);
91
    ret = mptcp_pm_nl_append_new_local_addr(pernet, entry, true);
88
    if (ret < 0)
92
    if (ret < 0)
89
        kfree(entry);
90
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
93
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
91
index XXXXXXX..XXXXXXX 100644
94
index XXXXXXX..XXXXXXX 100644
92
--- a/net/mptcp/pm_userspace.c
95
--- a/net/mptcp/pm_userspace.c
93
+++ b/net/mptcp/pm_userspace.c
96
+++ b/net/mptcp/pm_userspace.c
94
@@ -XXX,XX +XXX,XX @@ mptcp_userspace_pm_lookup_addr_by_id(struct mptcp_sock *msk, unsigned int id)
97
@@ -XXX,XX +XXX,XX @@ mptcp_userspace_pm_lookup_addr_by_id(struct mptcp_sock *msk, unsigned int id)
...
...
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
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
2
3
The number of parameters in mptcp_nl_set_flags() can be reduced.
3
This patch changes the 2nd parameter of get_local_id() interface as
4
Only need to pass a "local" parameter to it instead of "local->addr"
4
"struct mptcp_pm_param" type. Only "entry" member of this struct is
5
and "local->flags".
5
used.
6
6
7
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
7
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
8
---
8
---
9
net/mptcp/pm_netlink.c | 15 ++++++++-------
9
net/mptcp/pm.c | 6 ++++--
10
1 file changed, 8 insertions(+), 7 deletions(-)
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(-)
11
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)
12
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
40
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
13
index XXXXXXX..XXXXXXX 100644
41
index XXXXXXX..XXXXXXX 100644
14
--- a/net/mptcp/pm_netlink.c
42
--- a/net/mptcp/pm_netlink.c
15
+++ b/net/mptcp/pm_netlink.c
43
+++ b/net/mptcp/pm_netlink.c
16
@@ -XXX,XX +XXX,XX @@ static void mptcp_pm_nl_fullmesh(struct mptcp_sock *msk,
44
@@ -XXX,XX +XXX,XX @@ static int mptcp_pm_nl_create_listen_socket(struct sock *sk,
17
    spin_unlock_bh(&msk->pm.lock);
18
}
45
}
19
46
20
-static void mptcp_nl_set_flags(struct net *net, struct mptcp_addr_info *addr,
47
int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk,
21
-             u8 flags, u8 changed)
48
-             struct mptcp_pm_addr_entry *skc)
22
+static void mptcp_nl_set_flags(struct net *net,
49
+             struct mptcp_pm_param *param)
23
+             struct mptcp_pm_addr_entry *local,
24
+             u8 changed)
25
{
50
{
26
-    u8 is_subflow = !!(flags & MPTCP_PM_ADDR_FLAG_SUBFLOW);
51
+    struct mptcp_pm_addr_entry *skc = &param->entry;
27
-    u8 bkup = !!(flags & MPTCP_PM_ADDR_FLAG_BACKUP);
52
    struct mptcp_pm_addr_entry *entry;
28
+    u8 is_subflow = !!(local->flags & MPTCP_PM_ADDR_FLAG_SUBFLOW);
53
    struct pm_nl_pernet *pernet;
29
+    u8 bkup = !!(local->flags & MPTCP_PM_ADDR_FLAG_BACKUP);
54
    int ret;
30
    long s_slot = 0, s_num = 0;
55
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
31
    struct mptcp_sock *msk;
56
index XXXXXXX..XXXXXXX 100644
32
57
--- a/net/mptcp/pm_userspace.c
33
@@ -XXX,XX +XXX,XX @@ static void mptcp_nl_set_flags(struct net *net, struct mptcp_addr_info *addr,
58
+++ b/net/mptcp/pm_userspace.c
34
59
@@ -XXX,XX +XXX,XX @@ mptcp_userspace_pm_lookup_addr_by_id(struct mptcp_sock *msk, unsigned int id)
35
        lock_sock(sk);
36
        if (changed & MPTCP_PM_ADDR_FLAG_BACKUP)
37
-            mptcp_pm_nl_mp_prio_send_ack(msk, addr, NULL, bkup);
38
+            mptcp_pm_nl_mp_prio_send_ack(msk, &local->addr, NULL, bkup);
39
        /* Subflows will only be recreated if the SUBFLOW flag is set */
40
        if (is_subflow && (changed & MPTCP_PM_ADDR_FLAG_FULLMESH))
41
-            mptcp_pm_nl_fullmesh(msk, addr);
42
+            mptcp_pm_nl_fullmesh(msk, &local->addr);
43
        release_sock(sk);
44
45
next:
46
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_set_flags(struct mptcp_pm_addr_entry *local,
47
    *local = *entry;
48
    spin_unlock_bh(&pernet->lock);
49
50
-    mptcp_nl_set_flags(net, &local->addr, local->flags, changed);
51
+    mptcp_nl_set_flags(net, local, changed);
52
    return 0;
53
}
60
}
54
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);
55
--
88
--
56
2.43.0
89
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 adds the sock version of kmemdup() helper, named sock_kmemdup(),
3
In order to allow users to develop their own BPF-based path manager,
4
to duplicate a memory block using the socket's option memory buffer.
4
this patch defines a struct ops "mptcp_pm_ops" for a userspace path
5
manager, which contains a set of interfaces.
6
7
Add a set of functions to register, unregister, find and validate a
8
given struct ops.
5
9
6
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
10
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
7
---
11
---
8
include/net/sock.h | 1 +
12
include/net/mptcp.h | 29 ++++++++++++++++++++++
9
net/core/sock.c | 23 +++++++++++++++++++++++
13
net/mptcp/pm.c | 59 ++++++++++++++++++++++++++++++++++++++++++++
10
2 files changed, 24 insertions(+)
14
net/mptcp/protocol.h | 5 ++++
15
3 files changed, 93 insertions(+)
11
16
12
diff --git a/include/net/sock.h b/include/net/sock.h
17
diff --git a/include/net/mptcp.h b/include/net/mptcp.h
13
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
14
--- a/include/net/sock.h
19
--- a/include/net/mptcp.h
15
+++ b/include/net/sock.h
20
+++ b/include/net/mptcp.h
16
@@ -XXX,XX +XXX,XX @@ static inline struct sk_buff *sock_alloc_send_skb(struct sock *sk,
21
@@ -XXX,XX +XXX,XX @@ struct mptcp_pm_param {
22
    struct mptcp_addr_info        addr;
23
};
24
25
+struct mptcp_pm_ops {
26
+    int (*created)(struct mptcp_sock *msk);
27
+    int (*established)(struct mptcp_sock *msk);
28
+    int (*closed)(struct mptcp_sock *msk);
29
+    int (*address_announced)(struct mptcp_sock *msk,
30
+                 struct mptcp_pm_param *param);
31
+    int (*address_removed)(struct mptcp_sock *msk,
32
+             struct mptcp_pm_param *param);
33
+    int (*subflow_established)(struct mptcp_sock *msk,
34
+                 struct mptcp_pm_param *param);
35
+    int (*subflow_closed)(struct mptcp_sock *msk,
36
+             struct mptcp_pm_param *param);
37
+    int (*get_local_id)(struct mptcp_sock *msk,
38
+             struct mptcp_pm_param *param);
39
+    bool (*get_priority)(struct mptcp_sock *msk,
40
+             struct mptcp_pm_param *param);
41
+    int (*set_priority)(struct mptcp_sock *msk,
42
+             struct mptcp_pm_param *param);
43
+    int (*listener_created)(struct mptcp_sock *msk);
44
+    int (*listener_closed)(struct mptcp_sock *msk);
45
+
46
+    u8            type;
47
+    struct module        *owner;
48
+    struct list_head    list;
49
+
50
+    void (*init)(struct mptcp_sock *msk);
51
+    void (*release)(struct mptcp_sock *msk);
52
+} ____cacheline_aligned_in_smp;
53
+
54
#ifdef CONFIG_MPTCP
55
void mptcp_init(void);
56
57
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
58
index XXXXXXX..XXXXXXX 100644
59
--- a/net/mptcp/pm.c
60
+++ b/net/mptcp/pm.c
61
@@ -XXX,XX +XXX,XX @@
62
#define pr_fmt(fmt) "MPTCP: " fmt
63
64
#include <linux/kernel.h>
65
+#include <linux/rculist.h>
66
+#include <linux/spinlock.h>
67
#include <net/mptcp.h>
68
#include "protocol.h"
69
70
#include "mib.h"
71
#include "mptcp_pm_gen.h"
72
73
+static DEFINE_SPINLOCK(mptcp_pm_list_lock);
74
+static LIST_HEAD(mptcp_pm_list);
75
+
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)
80
{
81
    mptcp_pm_nl_init();
17
}
82
}
18
83
+
19
void *sock_kmalloc(struct sock *sk, int size, gfp_t priority);
84
+/* Must be called with rcu read lock held */
20
+void *sock_kmemdup(struct sock *sk, const void *src, int size, gfp_t priority);
85
+struct mptcp_pm_ops *mptcp_pm_find(enum mptcp_pm_type type)
21
void sock_kfree_s(struct sock *sk, void *mem, int size);
22
void sock_kzfree_s(struct sock *sk, void *mem, int size);
23
void sk_send_sigurg(struct sock *sk);
24
diff --git a/net/core/sock.c b/net/core/sock.c
25
index XXXXXXX..XXXXXXX 100644
26
--- a/net/core/sock.c
27
+++ b/net/core/sock.c
28
@@ -XXX,XX +XXX,XX @@ void *sock_kmalloc(struct sock *sk, int size, gfp_t priority)
29
}
30
EXPORT_SYMBOL(sock_kmalloc);
31
32
+/*
33
+ * Duplicate a memory block using the socket's option memory buffer.
34
+ */
35
+void *sock_kmemdup(struct sock *sk, const void *src, int size, gfp_t priority)
36
+{
86
+{
37
+    int optmem_max = READ_ONCE(sock_net(sk)->core.sysctl_optmem_max);
87
+    struct mptcp_pm_ops *pm;
38
+
88
+
39
+    if ((unsigned int)size <= optmem_max &&
89
+    list_for_each_entry_rcu(pm, &mptcp_pm_list, list) {
40
+     atomic_read(&sk->sk_omem_alloc) + size < optmem_max) {
90
+        if (pm->type == type)
41
+        void *mem;
91
+            return pm;
42
+        /* First do the add, to avoid the race if kmalloc
43
+         * might sleep.
44
+         */
45
+        atomic_add(size, &sk->sk_omem_alloc);
46
+        mem = kmemdup(src, size, priority);
47
+        if (mem)
48
+            return mem;
49
+        atomic_sub(size, &sk->sk_omem_alloc);
50
+    }
92
+    }
93
+
51
+    return NULL;
94
+    return NULL;
52
+}
95
+}
53
+EXPORT_SYMBOL(sock_kmemdup);
54
+
96
+
55
/* Free an option memory block. Note, we actually want the inline
97
+int mptcp_pm_validate(struct mptcp_pm_ops *pm)
56
* here as this allows gcc to detect the nullify and fold away the
98
+{
57
* condition entirely.
99
+    if (!pm->created && !pm->established && !pm->closed &&
100
+     !pm->address_announced && !pm->address_removed &&
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) {
104
+        pr_err("%u does not implement required ops\n", pm->type);
105
+        return -EINVAL;
106
+    }
107
+
108
+    return 0;
109
+}
110
+
111
+int mptcp_pm_register(struct mptcp_pm_ops *pm)
112
+{
113
+    int ret;
114
+
115
+    ret = mptcp_pm_validate(pm);
116
+    if (ret)
117
+        return ret;
118
+
119
+    spin_lock(&mptcp_pm_list_lock);
120
+    if (mptcp_pm_find(pm->type)) {
121
+        spin_unlock(&mptcp_pm_list_lock);
122
+        return -EEXIST;
123
+    }
124
+    list_add_tail_rcu(&pm->list, &mptcp_pm_list);
125
+    spin_unlock(&mptcp_pm_list_lock);
126
+
127
+    pr_debug("userspace_pm type %u registered\n", pm->type);
128
+    return 0;
129
+}
130
+
131
+void mptcp_pm_unregister(struct mptcp_pm_ops *pm)
132
+{
133
+    spin_lock(&mptcp_pm_list_lock);
134
+    list_del_rcu(&pm->list);
135
+    spin_unlock(&mptcp_pm_list_lock);
136
+}
137
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
138
index XXXXXXX..XXXXXXX 100644
139
--- a/net/mptcp/protocol.h
140
+++ b/net/mptcp/protocol.h
141
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_remove_addr(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_
142
void mptcp_pm_remove_addr_entry(struct mptcp_sock *msk,
143
                struct mptcp_pm_addr_entry *entry);
144
145
+struct mptcp_pm_ops *mptcp_pm_find(enum mptcp_pm_type type);
146
+int mptcp_pm_validate(struct mptcp_pm_ops *pm);
147
+int mptcp_pm_register(struct mptcp_pm_ops *pm);
148
+void mptcp_pm_unregister(struct mptcp_pm_ops *pm);
149
+
150
void mptcp_free_local_addr_list(struct mptcp_sock *msk);
151
152
void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk,
58
--
153
--
59
2.43.0
154
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
Instead of using kmalloc() or kzalloc() to allocate an entry and
3
This patch defines the original in-kernel netlink path manager as a new
4
then immediately duplicate another entry to the newly allocated
4
struct mptcp_pm_ops named "mptcp_netlink_pm", and register it in
5
one, kmemdup() helper can be used to simplify the code.
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().
6
9
7
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
10
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
8
---
11
---
9
net/mptcp/pm_netlink.c | 6 ++----
12
net/mptcp/pm_netlink.c | 21 ++++++++++++++++++++-
10
1 file changed, 2 insertions(+), 4 deletions(-)
13
1 file changed, 20 insertions(+), 1 deletion(-)
11
14
12
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
15
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
13
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
14
--- a/net/mptcp/pm_netlink.c
17
--- a/net/mptcp/pm_netlink.c
15
+++ b/net/mptcp/pm_netlink.c
18
+++ b/net/mptcp/pm_netlink.c
16
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk,
19
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk,
17
        return ret;
20
    return ret;
18
21
}
19
    /* address not found, add to local list */
22
20
-    entry = kmalloc(sizeof(*entry), GFP_ATOMIC);
23
-bool mptcp_pm_nl_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc)
21
+    entry = kmemdup(skc, sizeof(*skc), GFP_ATOMIC);
24
+static bool mptcp_pm_nl_get_priority(struct mptcp_sock *msk,
22
    if (!entry)
25
+                 struct mptcp_pm_param *param)
23
        return -ENOMEM;
26
{
24
27
    struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk);
25
-    *entry = *skc;
28
+    struct mptcp_addr_info *skc = &param->addr;
26
    entry->addr.port = 0;
29
    struct mptcp_pm_addr_entry *entry;
27
    ret = mptcp_pm_nl_append_new_local_addr(pernet, entry, true);
30
    bool backup;
28
    if (ret < 0)
31
29
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_add_addr_doit(struct sk_buff *skb, struct genl_info *info)
32
@@ -XXX,XX +XXX,XX @@ bool mptcp_pm_nl_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc)
30
        return -EINVAL;
33
    return backup;
31
    }
34
}
32
35
33
-    entry = kzalloc(sizeof(*entry), GFP_KERNEL_ACCOUNT);
36
+bool mptcp_pm_nl_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc)
34
+    entry = kmemdup(&addr, sizeof(addr), GFP_KERNEL_ACCOUNT);
37
+{
35
    if (!entry) {
38
+    struct mptcp_pm_param param;
36
        GENL_SET_ERR_MSG(info, "can't allocate addr");
39
+
37
        return -ENOMEM;
40
+    mptcp_pm_param_set_contexts(&param, NULL, skc);
38
    }
41
+    return mptcp_pm_nl_get_priority(msk, &param);
39
42
+}
40
-    *entry = addr;
43
+
41
    if (entry->addr.port) {
44
#define MPTCP_PM_CMD_GRP_OFFSET 0
42
        ret = mptcp_pm_nl_create_listen_socket(skb->sk, entry);
45
#define MPTCP_PM_EV_GRP_OFFSET 1
43
        if (ret) {
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
}
44
--
68
--
45
2.43.0
69
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 userspace path manager as a new struct
4
mptcp_pm_ops named "mptcp_userspace_pm", and register it in
5
mptcp_pm_data_init().
6
7
Only get_local_id() and get_priority() interfaces are implemented here.
8
mptcp_userspace_pm_is_backup() becomes a wrapper of get_priority().
9
10
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
11
---
12
net/mptcp/pm.c | 1 +
13
net/mptcp/pm_userspace.c | 26 ++++++++++++++++++++++++--
14
net/mptcp/protocol.h | 1 +
15
3 files changed, 26 insertions(+), 2 deletions(-)
16
17
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/net/mptcp/pm.c
20
+++ b/net/mptcp/pm.c
21
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_data_init(struct mptcp_sock *msk)
22
void __init mptcp_pm_init(void)
23
{
24
    mptcp_pm_nl_init();
25
+    mptcp_userspace_pm_init();
26
}
27
28
/* Must be called with rcu read lock held */
29
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
30
index XXXXXXX..XXXXXXX 100644
31
--- a/net/mptcp/pm_userspace.c
32
+++ b/net/mptcp/pm_userspace.c
33
@@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
34
    return mptcp_userspace_pm_append_new_local_addr(msk, skc, true);
35
}
36
37
-bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk,
38
-                 struct mptcp_addr_info *skc)
39
+static bool mptcp_userspace_pm_get_priority(struct mptcp_sock *msk,
40
+                     struct mptcp_pm_param *param)
41
{
42
+    struct mptcp_addr_info *skc = &param->addr;
43
    struct mptcp_pm_addr_entry *entry;
44
    bool backup;
45
46
@@ -XXX,XX +XXX,XX @@ bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk,
47
    return backup;
48
}
49
50
+bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk,
51
+                 struct mptcp_addr_info *skc)
52
+{
53
+    struct mptcp_pm_param param;
54
+
55
+    mptcp_pm_param_set_contexts(&param, NULL, skc);
56
+    return mptcp_userspace_pm_get_priority(msk, &param);
57
+}
58
+
59
static struct mptcp_sock *mptcp_userspace_pm_get_sock(const struct genl_info *info)
60
{
61
    struct mptcp_sock *msk;
62
@@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr,
63
    sock_put(sk);
64
    return ret;
65
}
66
+
67
+static struct mptcp_pm_ops mptcp_userspace_pm = {
68
+    .get_local_id        = mptcp_userspace_pm_get_local_id,
69
+    .get_priority        = mptcp_userspace_pm_get_priority,
70
+    .type            = MPTCP_PM_TYPE_USERSPACE,
71
+    .owner            = THIS_MODULE,
72
+};
73
+
74
+void __init mptcp_userspace_pm_init(void)
75
+{
76
+    mptcp_pm_register(&mptcp_userspace_pm);
77
+}
78
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
79
index XXXXXXX..XXXXXXX 100644
80
--- a/net/mptcp/protocol.h
81
+++ b/net/mptcp/protocol.h
82
@@ -XXX,XX +XXX,XX @@ static inline u8 subflow_get_local_id(const struct mptcp_subflow_context *subflo
83
}
84
85
void __init mptcp_pm_nl_init(void);
86
+void __init mptcp_userspace_pm_init(void);
87
void mptcp_pm_nl_work(struct mptcp_sock *msk);
88
unsigned int mptcp_pm_get_add_addr_signal_max(const struct mptcp_sock *msk);
89
unsigned int mptcp_pm_get_add_addr_accept_max(const struct mptcp_sock *msk);
90
--
91
2.43.0
diff view generated by jsdifflib
New patch
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
2
3
Add a struct mptcp_pm_ops pointer "ops" in struct mptcp_pm_data, and two
4
functions mptcp_pm_initialize() and mptcp_pm_release(), to set and release
5
this pointer. mptcp_pm_initialize() is invoked in mptcp_pm_data_reset(),
6
while mptcp_pm_release() is invoked in __mptcp_destroy_sock().
7
8
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
9
---
10
net/mptcp/pm.c | 33 +++++++++++++++++++++++++++++++++
11
net/mptcp/protocol.c | 1 +
12
net/mptcp/protocol.h | 3 +++
13
3 files changed, 37 insertions(+)
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 @@ void mptcp_pm_data_reset(struct mptcp_sock *msk)
20
    pm->rm_list_tx.nr = 0;
21
    pm->rm_list_rx.nr = 0;
22
    WRITE_ONCE(pm->pm_type, pm_type);
23
+    rcu_read_lock();
24
+    mptcp_pm_initialize(msk, mptcp_pm_find(pm_type));
25
+    rcu_read_unlock();
26
27
    if (pm_type == MPTCP_PM_TYPE_KERNEL) {
28
        bool subflows_allowed = !!mptcp_pm_get_subflows_max(msk);
29
@@ -XXX,XX +XXX,XX @@ void mptcp_pm_unregister(struct mptcp_pm_ops *pm)
30
    list_del_rcu(&pm->list);
31
    spin_unlock(&mptcp_pm_list_lock);
32
}
33
+
34
+int mptcp_pm_initialize(struct mptcp_sock *msk, struct mptcp_pm_ops *pm)
35
+{
36
+    if (!pm)
37
+        return -EINVAL;
38
+
39
+    if (!bpf_try_module_get(pm, pm->owner))
40
+        return -EBUSY;
41
+
42
+    msk->pm.ops = pm;
43
+    if (msk->pm.ops->init)
44
+        msk->pm.ops->init(msk);
45
+
46
+    pr_debug("userspace_pm type %u initialized\n", msk->pm.ops->type);
47
+    return 0;
48
+}
49
+
50
+void mptcp_pm_release(struct mptcp_sock *msk)
51
+{
52
+    struct mptcp_pm_ops *pm = msk->pm.ops;
53
+
54
+    if (!pm)
55
+        return;
56
+
57
+    msk->pm.ops = NULL;
58
+    if (pm->release)
59
+        pm->release(msk);
60
+
61
+    bpf_module_put(pm, pm->owner);
62
+}
63
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
64
index XXXXXXX..XXXXXXX 100644
65
--- a/net/mptcp/protocol.c
66
+++ b/net/mptcp/protocol.c
67
@@ -XXX,XX +XXX,XX @@ static void __mptcp_destroy_sock(struct sock *sk)
68
    sk_stop_timer(sk, &sk->sk_timer);
69
    msk->pm.status = 0;
70
    mptcp_release_sched(msk);
71
+    mptcp_pm_release(msk);
72
73
    sk->sk_prot->destroy(sk);
74
75
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
76
index XXXXXXX..XXXXXXX 100644
77
--- a/net/mptcp/protocol.h
78
+++ b/net/mptcp/protocol.h
79
@@ -XXX,XX +XXX,XX @@ struct mptcp_pm_data {
80
    struct mptcp_addr_info remote;
81
    struct list_head anno_list;
82
    struct list_head userspace_pm_local_addr_list;
83
+    struct mptcp_pm_ops *ops;
84
85
    spinlock_t    lock;        /*protects the whole PM data */
86
87
@@ -XXX,XX +XXX,XX @@ struct mptcp_pm_ops *mptcp_pm_find(enum mptcp_pm_type type);
88
int mptcp_pm_validate(struct mptcp_pm_ops *pm);
89
int mptcp_pm_register(struct mptcp_pm_ops *pm);
90
void mptcp_pm_unregister(struct mptcp_pm_ops *pm);
91
+int mptcp_pm_initialize(struct mptcp_sock *msk, struct mptcp_pm_ops *pm);
92
+void mptcp_pm_release(struct mptcp_sock *msk);
93
94
void mptcp_free_local_addr_list(struct mptcp_sock *msk);
95
96
--
97
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
Instead of using sock_kmalloc() to allocate an entry and then
3
Now mptcp_pm_nl_get_local_id() and mptcp_userspace_pm_get_local_id()
4
immediately duplicate another entry to the newly allocated one,
4
helpers can be dropped, and mptcp_pm_get_local_id() can directly invoke
5
sock_kmemdup() helper can be used to simplify the code.
5
get_local_id() interface through "ops" of "msk->pm".
6
7
More importantly, the code "*e = *entry;" that assigns "entry"
8
to "e" is not easy to implemented in BPF if we use the same code
9
to implement an append_new_local_addr() helper of a BFP path
10
manager. This patch avoids this type of memory assignment
11
operation.
12
6
13
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
7
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
14
---
8
---
15
net/mptcp/pm_userspace.c | 3 +--
9
net/mptcp/pm.c | 6 +++---
16
1 file changed, 1 insertion(+), 2 deletions(-)
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(-)
17
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;
18
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
48
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
19
index XXXXXXX..XXXXXXX 100644
49
index XXXXXXX..XXXXXXX 100644
20
--- a/net/mptcp/pm_userspace.c
50
--- a/net/mptcp/pm_userspace.c
21
+++ b/net/mptcp/pm_userspace.c
51
+++ b/net/mptcp/pm_userspace.c
22
@@ -XXX,XX +XXX,XX @@ static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
52
@@ -XXX,XX +XXX,XX @@ mptcp_userspace_pm_lookup_addr_by_id(struct mptcp_sock *msk, unsigned int id)
23
        /* Memory for the entry is allocated from the
53
    return NULL;
24
         * sock option buffer.
54
}
25
         */
55
26
-        e = sock_kmalloc(sk, sizeof(*e), GFP_ATOMIC);
56
-int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
27
+        e = sock_kmemdup(sk, entry, sizeof(*entry), GFP_ATOMIC);
57
-                 struct mptcp_pm_param *param)
28
        if (!e) {
58
+static int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
29
            ret = -ENOMEM;
59
+                     struct mptcp_pm_param *param)
30
            goto append_err;
60
{
31
        }
61
    __be16 msk_sport = ((struct inet_sock *)
32
62
             inet_sk((struct sock *)msk))->inet_sport;
33
-        *e = *entry;
63
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
34
        if (!e->addr.id && needs_id)
64
index XXXXXXX..XXXXXXX 100644
35
            e->addr.id = find_next_zero_bit(id_bitmap,
65
--- a/net/mptcp/protocol.h
36
                            MPTCP_PM_MAX_ADDR_ID + 1,
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);
37
--
78
--
38
2.43.0
79
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
In mptcp_pm_nl_set_flags(), "entry" is copied to "local" when pernet->lock
3
Now mptcp_pm_nl_is_backup() and mptcp_userspace_pm_is_backup()
4
is held to avoid direct access to entry without pernet->lock.
4
helpers can be dropped, and mptcp_pm_is_backup() can directly
5
5
invoke get_priority() interface through "ops" of "msk->pm".
6
Therefore, "local->flags" should be passed to mptcp_nl_set_flags instead
7
of "entry->flags" when pernet->lock is not held, so as to avoid access to
8
entry.
9
6
10
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
7
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
11
---
8
---
12
net/mptcp/pm_netlink.c | 2 +-
9
net/mptcp/pm.c | 9 +++++----
13
1 file changed, 1 insertion(+), 1 deletion(-)
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
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,
15
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
38
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
16
index XXXXXXX..XXXXXXX 100644
39
index XXXXXXX..XXXXXXX 100644
17
--- a/net/mptcp/pm_netlink.c
40
--- a/net/mptcp/pm_netlink.c
18
+++ b/net/mptcp/pm_netlink.c
41
+++ b/net/mptcp/pm_netlink.c
19
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_set_flags(struct mptcp_pm_addr_entry *local,
42
@@ -XXX,XX +XXX,XX @@ static bool mptcp_pm_nl_get_priority(struct mptcp_sock *msk,
20
    *local = *entry;
43
    return backup;
21
    spin_unlock_bh(&pernet->lock);
22
23
-    mptcp_nl_set_flags(net, &local->addr, entry->flags, changed);
24
+    mptcp_nl_set_flags(net, &local->addr, local->flags, changed);
25
    return 0;
26
}
44
}
27
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,
28
--
90
--
29
2.43.0
91
2.43.0
diff view generated by jsdifflib