1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
3
v5:
4
- drop "change is_backup interfaces as get_flags"
5
- move "add struct mptcp_pm_addr_id_bitmap" and "hold msk lock before
6
removing id 0 address" out of this set.
7
- a new patch "use ipv6_addr_equal in addresses_equal"
8
- patch 4, drop inet6_sk() in mptcp_event_add_subflow() and
9
mptcp_event_pm_listener() too.
10
11
v4:
12
- add a new patch, "add a build check for userspace_pm_dump_addr" as
13
Matt suggested.
14
- patch 4, fix a warning here reported by CI:
15
WARNING: line length of 84 exceeds 80 columns
16
#27: FILE: net/mptcp/pm_userspace.c:468:
17
18
v3:
19
- drop "mptcp: update address type of get_local_id".
20
21
v2:
22
- a new patch "hold msk lock before removing id 0 address"
2
23
3
Drop the patch "mptcp: reuse sending nlmsg code in dump_addr", add a new
24
Drop the patch "mptcp: reuse sending nlmsg code in dump_addr", add a new
4
helper mptcp_pm_genl_fill_addr() to save the duplicated code.
25
helper mptcp_pm_genl_fill_addr() to save the duplicated code.
5
26
6
Define struct mptcp_pm_addr_id_bitmap in protocol.h, instead of defining
27
Define struct mptcp_pm_addr_id_bitmap in protocol.h, instead of defining
7
mptcp_pm_addr_id_bitmap_t in include/net/mptcp.h, since dump_addr()
28
mptcp_pm_addr_id_bitmap_t in include/net/mptcp.h, since get_addr() and
8
interface of bpf userspace pm is dropped as Matt suggested.
29
dump_addr() interfaces of BPF userspace pm is dropped as Matt suggested.
9
30
10
Geliang Tang (6):
31
Geliang Tang (5):
32
mptcp: add a build check for userspace_pm_dump_addr
11
mptcp: add mptcp_pm_genl_fill_addr helper
33
mptcp: add mptcp_pm_genl_fill_addr helper
12
mptcp: add struct mptcp_pm_addr_id_bitmap
13
mptcp: drop inet6_sk in mptcp_nl_find_ssk
14
mptcp: drop match in userspace_pm_append_new_local_addr
34
mptcp: drop match in userspace_pm_append_new_local_addr
15
mptcp: update address type of get_local_id
35
mptcp: drop inet6_sk after inet_sk
16
mptcp: change is_backup interfaces as get_flags
36
mptcp: use ipv6_addr_equal in addresses_equal
17
37
18
net/mptcp/pm.c | 38 +++++++++++++++++++---
38
net/mptcp/pm.c | 21 +++++++++++++++++++++
19
net/mptcp/pm_netlink.c | 33 ++++++-------------
39
net/mptcp/pm_netlink.c | 22 ++++------------------
20
net/mptcp/pm_userspace.c | 68 +++++++++++++---------------------------
40
net/mptcp/pm_userspace.c | 29 +++++++----------------------
21
net/mptcp/protocol.h | 19 ++++++++---
41
net/mptcp/protocol.h | 3 +++
22
4 files changed, 80 insertions(+), 78 deletions(-)
42
4 files changed, 35 insertions(+), 40 deletions(-)
23
43
24
--
44
--
25
2.43.0
45
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
To simplify the use of bitmap in BPF, a new type for MPTCP userspace
3
This patch adds a build check for mptcp_userspace_pm_dump_addr() to make
4
pm id bitmap, struct mptcp_pm_addr_id_bitmap is defined. Because
4
sure there is enough space in 'cb->ctx' to store an address id bitmap.
5
there's no way to use DECLARE_BITMAP macro in BPF program, and it's
6
not easy to reimplement it in BPF.
7
5
6
Reviewed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
8
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
7
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
9
---
8
---
10
net/mptcp/pm_userspace.c | 14 ++++++--------
9
net/mptcp/pm_userspace.c | 2 ++
11
net/mptcp/protocol.h | 4 ++++
10
1 file changed, 2 insertions(+)
12
2 files changed, 10 insertions(+), 8 deletions(-)
13
11
14
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
12
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
15
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
16
--- a/net/mptcp/pm_userspace.c
14
--- a/net/mptcp/pm_userspace.c
17
+++ b/net/mptcp/pm_userspace.c
15
+++ b/net/mptcp/pm_userspace.c
18
@@ -XXX,XX +XXX,XX @@ static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
16
@@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_dump_addr(struct sk_buff *msg,
19
                         struct mptcp_pm_addr_entry *entry,
20
                         bool needs_id)
21
{
22
-    DECLARE_BITMAP(id_bitmap, MPTCP_PM_MAX_ADDR_ID + 1);
23
+    struct mptcp_pm_addr_id_bitmap id_bitmap;
24
    struct mptcp_pm_addr_entry *match = NULL;
25
    struct sock *sk = (struct sock *)msk;
26
    struct mptcp_pm_addr_entry *e;
27
@@ -XXX,XX +XXX,XX @@ static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
28
    bool id_match = false;
29
    int ret = -EINVAL;
30
31
-    bitmap_zero(id_bitmap, MPTCP_PM_MAX_ADDR_ID + 1);
32
+    bitmap_zero(id_bitmap.map, MPTCP_PM_MAX_ADDR_ID + 1);
33
34
    spin_lock_bh(&msk->pm.lock);
35
    mptcp_for_each_userspace_pm_addr(msk, e) {
36
@@ -XXX,XX +XXX,XX @@ static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
37
        } else if (addr_match || id_match) {
38
            break;
39
        }
40
-        __set_bit(e->addr.id, id_bitmap);
41
+        __set_bit(e->addr.id, id_bitmap.map);
42
    }
43
44
    if (!match && !addr_match && !id_match) {
45
@@ -XXX,XX +XXX,XX @@ static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
46
47
        *e = *entry;
48
        if (!e->addr.id && needs_id)
49
-            e->addr.id = find_next_zero_bit(id_bitmap,
50
+            e->addr.id = find_next_zero_bit(id_bitmap.map,
51
                            MPTCP_PM_MAX_ADDR_ID + 1,
52
                            1);
53
        list_add_tail_rcu(&e->list, &msk->pm.userspace_pm_local_addr_list);
54
@@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_set_flags(struct mptcp_pm_addr_entry *local,
55
int mptcp_userspace_pm_dump_addr(struct sk_buff *msg,
56
                 struct netlink_callback *cb)
57
{
58
-    struct id_bitmap {
59
-        DECLARE_BITMAP(map, MPTCP_PM_MAX_ADDR_ID + 1);
60
-    } *bitmap;
61
    const struct genl_info *info = genl_info_dump(cb);
62
+    struct mptcp_pm_addr_id_bitmap *bitmap;
63
    struct mptcp_pm_addr_entry *entry;
64
    struct mptcp_sock *msk;
65
    int ret = -EINVAL;
66
    struct sock *sk;
17
    struct sock *sk;
67
18
    void *hdr;
68
-    bitmap = (struct id_bitmap *)cb->ctx;
19
69
+    bitmap = (struct mptcp_pm_addr_id_bitmap *)cb->ctx;
20
+    BUILD_BUG_ON(sizeof(struct id_bitmap) > sizeof(cb->ctx));
21
+
22
    bitmap = (struct id_bitmap *)cb->ctx;
70
23
71
    msk = mptcp_userspace_pm_get_sock(info);
24
    msk = mptcp_userspace_pm_get_sock(info);
72
    if (!msk)
73
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
74
index XXXXXXX..XXXXXXX 100644
75
--- a/net/mptcp/protocol.h
76
+++ b/net/mptcp/protocol.h
77
@@ -XXX,XX +XXX,XX @@ enum mptcp_addr_signal_status {
78
/* max value of mptcp_addr_info.id */
79
#define MPTCP_PM_MAX_ADDR_ID        U8_MAX
80
81
+struct mptcp_pm_addr_id_bitmap {
82
+    DECLARE_BITMAP(map, MPTCP_PM_MAX_ADDR_ID + 1);
83
+};
84
+
85
struct mptcp_pm_data {
86
    struct mptcp_addr_info local;
87
    struct mptcp_addr_info remote;
88
--
25
--
89
2.43.0
26
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
To save some redundant code in dump_addr() interfaces of both the
3
To save some redundant code in dump_addr() interfaces of both the
4
netlink PM and userspace PM, the code that calls netlink message
4
netlink PM and userspace PM, the code that calls netlink message
5
helpers (genlmsg_put/cancel/end) and mptcp_nl_fill_addr() is wrapped
5
helpers (genlmsg_put/cancel/end) and mptcp_nl_fill_addr() is wrapped
6
into a new helper mptcp_pm_genl_fill_addr().
6
into a new helper mptcp_pm_genl_fill_addr().
7
8
This helper will also be used in BPF path managers.
9
7
10
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
8
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
11
---
9
---
12
net/mptcp/pm.c | 21 +++++++++++++++++++++
10
net/mptcp/pm.c | 21 +++++++++++++++++++++
13
net/mptcp/pm_netlink.c | 12 +-----------
11
net/mptcp/pm_netlink.c | 12 +-----------
...
...
65
63
66
-            hdr = genlmsg_put(msg, NETLINK_CB(cb->skb).portid,
64
-            hdr = genlmsg_put(msg, NETLINK_CB(cb->skb).portid,
67
-                     cb->nlh->nlmsg_seq, &mptcp_genl_family,
65
-                     cb->nlh->nlmsg_seq, &mptcp_genl_family,
68
-                     NLM_F_MULTI, MPTCP_PM_CMD_GET_ADDR);
66
-                     NLM_F_MULTI, MPTCP_PM_CMD_GET_ADDR);
69
-            if (!hdr)
67
-            if (!hdr)
70
+            if (mptcp_pm_genl_fill_addr(msg, cb, entry))
68
+            if (mptcp_pm_genl_fill_addr(msg, cb, entry) < 0)
71
                break;
69
                break;
72
70
73
-            if (mptcp_nl_fill_addr(msg, entry) < 0) {
71
-            if (mptcp_nl_fill_addr(msg, entry) < 0) {
74
-                genlmsg_cancel(msg, hdr);
72
-                genlmsg_cancel(msg, hdr);
75
-                break;
73
-                break;
...
...
88
    struct mptcp_sock *msk;
86
    struct mptcp_sock *msk;
89
    int ret = -EINVAL;
87
    int ret = -EINVAL;
90
    struct sock *sk;
88
    struct sock *sk;
91
-    void *hdr;
89
-    void *hdr;
92
90
93
    bitmap = (struct id_bitmap *)cb->ctx;
91
    BUILD_BUG_ON(sizeof(struct id_bitmap) > sizeof(cb->ctx));
94
92
95
@@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_dump_addr(struct sk_buff *msg,
93
@@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_dump_addr(struct sk_buff *msg,
96
        if (test_bit(entry->addr.id, bitmap->map))
94
        if (test_bit(entry->addr.id, bitmap->map))
97
            continue;
95
            continue;
98
96
99
-        hdr = genlmsg_put(msg, NETLINK_CB(cb->skb).portid,
97
-        hdr = genlmsg_put(msg, NETLINK_CB(cb->skb).portid,
100
-                 cb->nlh->nlmsg_seq, &mptcp_genl_family,
98
-                 cb->nlh->nlmsg_seq, &mptcp_genl_family,
101
-                 NLM_F_MULTI, MPTCP_PM_CMD_GET_ADDR);
99
-                 NLM_F_MULTI, MPTCP_PM_CMD_GET_ADDR);
102
-        if (!hdr)
100
-        if (!hdr)
103
+        if (mptcp_pm_genl_fill_addr(msg, cb, entry))
101
+        if (mptcp_pm_genl_fill_addr(msg, cb, entry) < 0)
104
            break;
102
            break;
105
103
106
-        if (mptcp_nl_fill_addr(msg, entry) < 0) {
104
-        if (mptcp_nl_fill_addr(msg, entry) < 0) {
107
-            genlmsg_cancel(msg, hdr);
105
-            genlmsg_cancel(msg, hdr);
108
-            break;
106
-            break;
...
...
115
    release_sock(sk);
113
    release_sock(sk);
116
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
114
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
117
index XXXXXXX..XXXXXXX 100644
115
index XXXXXXX..XXXXXXX 100644
118
--- a/net/mptcp/protocol.h
116
--- a/net/mptcp/protocol.h
119
+++ b/net/mptcp/protocol.h
117
+++ b/net/mptcp/protocol.h
120
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_dump_addr(struct sk_buff *msg,
118
@@ -XXX,XX +XXX,XX @@ void mptcp_fastopen_subflow_synack_set_params(struct mptcp_subflow_context *subf
121
             struct netlink_callback *cb);
119
                     struct request_sock *req);
122
int mptcp_userspace_pm_dump_addr(struct sk_buff *msg,
120
int mptcp_nl_fill_addr(struct sk_buff *skb,
123
                 struct netlink_callback *cb);
121
         struct mptcp_pm_addr_entry *entry);
124
+int mptcp_pm_genl_fill_addr(struct sk_buff *msg,
122
+int mptcp_pm_genl_fill_addr(struct sk_buff *msg,
125
+             struct netlink_callback *cb,
123
+             struct netlink_callback *cb,
126
+             struct mptcp_pm_addr_entry *entry);
124
+             struct mptcp_pm_addr_entry *entry);
127
int mptcp_pm_nl_get_addr(u8 id, struct mptcp_pm_addr_entry *addr,
125
128
             struct genl_info *info);
126
static inline bool mptcp_pm_should_add_signal(struct mptcp_sock *msk)
129
int mptcp_userspace_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr,
127
{
130
--
128
--
131
2.43.0
129
2.43.0
diff view generated by jsdifflib
...
...
8
a Boolean one.
8
a Boolean one.
9
9
10
Also other variables 'addr_match' and 'id_match' make 'match' a redundant
10
Also other variables 'addr_match' and 'id_match' make 'match' a redundant
11
one, which can be replaced by directly checking 'addr_match && id_match'.
11
one, which can be replaced by directly checking 'addr_match && id_match'.
12
12
13
Reviewed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
13
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
14
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
14
---
15
---
15
net/mptcp/pm_userspace.c | 11 +++--------
16
net/mptcp/pm_userspace.c | 11 +++--------
16
1 file changed, 3 insertions(+), 8 deletions(-)
17
1 file changed, 3 insertions(+), 8 deletions(-)
17
18
...
...
20
--- a/net/mptcp/pm_userspace.c
21
--- a/net/mptcp/pm_userspace.c
21
+++ b/net/mptcp/pm_userspace.c
22
+++ b/net/mptcp/pm_userspace.c
22
@@ -XXX,XX +XXX,XX @@ static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
23
@@ -XXX,XX +XXX,XX @@ static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
23
                         bool needs_id)
24
                         bool needs_id)
24
{
25
{
25
    struct mptcp_pm_addr_id_bitmap id_bitmap;
26
    DECLARE_BITMAP(id_bitmap, MPTCP_PM_MAX_ADDR_ID + 1);
26
-    struct mptcp_pm_addr_entry *match = NULL;
27
-    struct mptcp_pm_addr_entry *match = NULL;
27
    struct sock *sk = (struct sock *)msk;
28
    struct sock *sk = (struct sock *)msk;
28
    struct mptcp_pm_addr_entry *e;
29
    struct mptcp_pm_addr_entry *e;
29
    bool addr_match = false;
30
    bool addr_match = false;
30
@@ -XXX,XX +XXX,XX @@ static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
31
@@ -XXX,XX +XXX,XX @@ static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk,
...
...
36
+        if (addr_match || id_match)
37
+        if (addr_match || id_match)
37
            break;
38
            break;
38
-        } else if (addr_match || id_match) {
39
-        } else if (addr_match || id_match) {
39
-            break;
40
-            break;
40
-        }
41
-        }
41
        __set_bit(e->addr.id, id_bitmap.map);
42
        __set_bit(e->addr.id, id_bitmap);
42
    }
43
    }
43
44
44
-    if (!match && !addr_match && !id_match) {
45
-    if (!match && !addr_match && !id_match) {
45
+    if (!addr_match && !id_match) {
46
+    if (!addr_match && !id_match) {
46
        /* Memory for the entry is allocated from the
47
        /* Memory for the entry is allocated from the
...
...
diff view generated by jsdifflib
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
2
3
In mptcp_nl_find_ssk(), 'issk' has already been got through inet_sk(). No
3
In mptcp_event_add_subflow(), mptcp_event_pm_listener() and
4
need to use inet6_sk() to get 'pinfo' again, just use issk->pinet6 instead.
4
mptcp_nl_find_ssk(), 'issk' has already been got through inet_sk().
5
This patch also drops this 'pinfo' variable.
5
No need to use inet6_sk() to get 'ipv6_pinfo' again, just use
6
issk->pinet6 instead. This patch also drops these 'ipv6_pinfo'
7
variables.
6
8
9
Reviewed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
7
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
10
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
8
---
11
---
12
v2:
13
- drop inet6_sk() in mptcp_event_add_subflow() and
14
mptcp_event_pm_listener() too.
15
---
16
net/mptcp/pm_netlink.c | 8 ++------
9
net/mptcp/pm_userspace.c | 4 +---
17
net/mptcp/pm_userspace.c | 4 +---
10
1 file changed, 1 insertion(+), 3 deletions(-)
18
2 files changed, 3 insertions(+), 9 deletions(-)
11
19
20
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
21
index XXXXXXX..XXXXXXX 100644
22
--- a/net/mptcp/pm_netlink.c
23
+++ b/net/mptcp/pm_netlink.c
24
@@ -XXX,XX +XXX,XX @@ static int mptcp_event_add_subflow(struct sk_buff *skb, const struct sock *ssk)
25
        break;
26
#if IS_ENABLED(CONFIG_MPTCP_IPV6)
27
    case AF_INET6: {
28
-        const struct ipv6_pinfo *np = inet6_sk(ssk);
29
-
30
-        if (nla_put_in6_addr(skb, MPTCP_ATTR_SADDR6, &np->saddr))
31
+        if (nla_put_in6_addr(skb, MPTCP_ATTR_SADDR6, &issk->pinet6->saddr))
32
            return -EMSGSIZE;
33
        if (nla_put_in6_addr(skb, MPTCP_ATTR_DADDR6, &ssk->sk_v6_daddr))
34
            return -EMSGSIZE;
35
@@ -XXX,XX +XXX,XX @@ void mptcp_event_pm_listener(const struct sock *ssk,
36
        break;
37
#if IS_ENABLED(CONFIG_MPTCP_IPV6)
38
    case AF_INET6: {
39
-        const struct ipv6_pinfo *np = inet6_sk(ssk);
40
-
41
-        if (nla_put_in6_addr(skb, MPTCP_ATTR_SADDR6, &np->saddr))
42
+        if (nla_put_in6_addr(skb, MPTCP_ATTR_SADDR6, &issk->pinet6->saddr))
43
            goto nla_put_failure;
44
        break;
45
    }
12
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
46
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
13
index XXXXXXX..XXXXXXX 100644
47
index XXXXXXX..XXXXXXX 100644
14
--- a/net/mptcp/pm_userspace.c
48
--- a/net/mptcp/pm_userspace.c
15
+++ b/net/mptcp/pm_userspace.c
49
+++ b/net/mptcp/pm_userspace.c
16
@@ -XXX,XX +XXX,XX @@ static struct sock *mptcp_nl_find_ssk(struct mptcp_sock *msk,
50
@@ -XXX,XX +XXX,XX @@ static struct sock *mptcp_nl_find_ssk(struct mptcp_sock *msk,
...
...
diff view generated by jsdifflib
Deleted patch
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
1
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
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 | 10 +++++++---
19
net/mptcp/pm_netlink.c | 12 ++++--------
20
net/mptcp/pm_userspace.c | 17 ++++++-----------
21
net/mptcp/protocol.h | 6 ++++--
22
4 files changed, 21 insertions(+), 24 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 = { 0 };
34
    struct mptcp_addr_info msk_local;
35
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)
38
     * addr
39
     */
40
    mptcp_local_address((struct sock_common *)msk, &msk_local);
41
-    mptcp_local_address((struct sock_common *)skc, &skc_local);
42
-    if (mptcp_addresses_equal(&msk_local, &skc_local, false))
43
+    mptcp_local_address((struct sock_common *)skc, &skc_local.addr);
44
+    if (mptcp_addresses_equal(&msk_local, &skc_local.addr, false))
45
        return 0;
46
47
+    skc_local.addr.id = 0;
48
+    skc_local.flags = MPTCP_PM_ADDR_FLAG_IMPLICIT;
49
+
50
    if (mptcp_pm_is_userspace(msk))
51
        return mptcp_userspace_pm_get_local_id(msk, &skc_local);
52
+    skc_local.addr.port = 0;
53
    return mptcp_pm_nl_get_local_id(msk, &skc_local);
54
}
55
56
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
57
index XXXXXXX..XXXXXXX 100644
58
--- a/net/mptcp/pm_netlink.c
59
+++ b/net/mptcp/pm_netlink.c
60
@@ -XXX,XX +XXX,XX @@ static int mptcp_pm_nl_create_listen_socket(struct sock *sk,
61
    return err;
62
}
63
64
-int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *skc)
65
+int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk,
66
+             struct mptcp_pm_addr_entry *local)
67
{
68
    struct mptcp_pm_addr_entry *entry;
69
    struct pm_nl_pernet *pernet;
70
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *skc
71
    pernet = pm_nl_get_pernet_from_msk(msk);
72
73
    rcu_read_lock();
74
-    entry = __lookup_addr(pernet, skc);
75
+    entry = __lookup_addr(pernet, &local->addr);
76
    ret = entry ? entry->addr.id : -1;
77
    rcu_read_unlock();
78
    if (ret >= 0)
79
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *skc
80
    if (!entry)
81
        return -ENOMEM;
82
83
-    entry->addr = *skc;
84
-    entry->addr.id = 0;
85
-    entry->addr.port = 0;
86
-    entry->ifindex = 0;
87
-    entry->flags = MPTCP_PM_ADDR_FLAG_IMPLICIT;
88
-    entry->lsk = NULL;
89
+    *entry = *local;
90
    ret = mptcp_pm_nl_append_new_local_addr(pernet, entry, true);
91
    if (ret < 0)
92
        kfree(entry);
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 *local)
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, &local->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 (local->addr.port == msk_sport)
124
+        local->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, local, 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 *local);
143
+int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
144
+                 struct mptcp_pm_addr_entry *local);
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
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
2
3
is_backup() interface of the path managers is not very common. A more
3
Use ipv6_addr_equal() to check whether two IPv6 addresses are equal in
4
common approach is to add a get_flags() interface to obtain the flags
4
mptcp_addresses_equal() is more appropriate than using ipv6_addr_cmp().
5
value of a given address. Then is_backup() can be implemented through
6
get_flags() by test whether backup flag is set in the flags value.
7
5
8
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
6
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
9
---
7
---
10
net/mptcp/pm.c | 7 +++++--
8
net/mptcp/pm_netlink.c | 2 +-
11
net/mptcp/pm_netlink.c | 9 +++++----
9
1 file changed, 1 insertion(+), 1 deletion(-)
12
net/mptcp/pm_userspace.c | 10 +++++-----
13
net/mptcp/protocol.h | 6 ++++--
14
4 files changed, 19 insertions(+), 13 deletions(-)
15
10
16
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/net/mptcp/pm.c
19
+++ b/net/mptcp/pm.c
20
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc)
21
bool mptcp_pm_is_backup(struct mptcp_sock *msk, struct sock_common *skc)
22
{
23
    struct mptcp_addr_info skc_local;
24
+    u8 flags;
25
26
    mptcp_local_address((struct sock_common *)skc, &skc_local);
27
28
    if (mptcp_pm_is_userspace(msk))
29
-        return mptcp_userspace_pm_is_backup(msk, &skc_local);
30
+        flags = mptcp_userspace_pm_get_flags(msk, &skc_local);
31
+    else
32
+        flags = mptcp_pm_nl_get_flags(msk, &skc_local);
33
34
-    return mptcp_pm_nl_is_backup(msk, &skc_local);
35
+    return !!(flags & MPTCP_PM_ADDR_FLAG_BACKUP);
36
}
37
38
static int mptcp_pm_get_addr(u8 id, struct mptcp_pm_addr_entry *addr,
39
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
11
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
40
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
41
--- a/net/mptcp/pm_netlink.c
13
--- a/net/mptcp/pm_netlink.c
42
+++ b/net/mptcp/pm_netlink.c
14
+++ b/net/mptcp/pm_netlink.c
43
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk,
15
@@ -XXX,XX +XXX,XX @@ bool mptcp_addresses_equal(const struct mptcp_addr_info *a,
44
    return ret;
16
            addr_equals = a->addr.s_addr == b->addr.s_addr;
45
}
17
#if IS_ENABLED(CONFIG_MPTCP_IPV6)
46
18
        else
47
-bool mptcp_pm_nl_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc)
19
-            addr_equals = !ipv6_addr_cmp(&a->addr6, &b->addr6);
48
+u8 mptcp_pm_nl_get_flags(struct mptcp_sock *msk,
20
+            addr_equals = ipv6_addr_equal(&a->addr6, &b->addr6);
49
+             struct mptcp_addr_info *skc)
21
    } else if (a->family == AF_INET) {
50
{
22
        if (ipv6_addr_v4mapped(&b->addr6))
51
    struct pm_nl_pernet *pernet = pm_nl_get_pernet_from_msk(msk);
23
            addr_equals = a->addr.s_addr == b->addr6.s6_addr32[3];
52
    struct mptcp_pm_addr_entry *entry;
53
-    bool backup;
54
+    u8 flags;
55
56
    rcu_read_lock();
57
    entry = __lookup_addr(pernet, skc);
58
-    backup = entry && !!(entry->flags & MPTCP_PM_ADDR_FLAG_BACKUP);
59
+    flags = entry ? entry->flags : 0;
60
    rcu_read_unlock();
61
62
-    return backup;
63
+    return flags;
64
}
65
66
#define MPTCP_PM_CMD_GRP_OFFSET 0
67
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
68
index XXXXXXX..XXXXXXX 100644
69
--- a/net/mptcp/pm_userspace.c
70
+++ b/net/mptcp/pm_userspace.c
71
@@ -XXX,XX +XXX,XX @@ int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
72
    return mptcp_userspace_pm_append_new_local_addr(msk, local, true);
73
}
74
75
-bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk,
76
-                 struct mptcp_addr_info *skc)
77
+u8 mptcp_userspace_pm_get_flags(struct mptcp_sock *msk,
78
+                struct mptcp_addr_info *skc)
79
{
80
    struct mptcp_pm_addr_entry *entry;
81
-    bool backup;
82
+    u8 flags;
83
84
    spin_lock_bh(&msk->pm.lock);
85
    entry = mptcp_userspace_pm_lookup_addr(msk, skc);
86
-    backup = entry && !!(entry->flags & MPTCP_PM_ADDR_FLAG_BACKUP);
87
+    flags = entry ? entry->flags : 0;
88
    spin_unlock_bh(&msk->pm.lock);
89
90
-    return backup;
91
+    return flags;
92
}
93
94
static struct mptcp_sock *mptcp_userspace_pm_get_sock(const struct genl_info *info)
95
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
96
index XXXXXXX..XXXXXXX 100644
97
--- a/net/mptcp/protocol.h
98
+++ b/net/mptcp/protocol.h
99
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk,
100
int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk,
101
                 struct mptcp_pm_addr_entry *local);
102
bool mptcp_pm_is_backup(struct mptcp_sock *msk, struct sock_common *skc);
103
-bool mptcp_pm_nl_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc);
104
-bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc);
105
+u8 mptcp_pm_nl_get_flags(struct mptcp_sock *msk,
106
+             struct mptcp_addr_info *skc);
107
+u8 mptcp_userspace_pm_get_flags(struct mptcp_sock *msk,
108
+                struct mptcp_addr_info *skc);
109
int mptcp_pm_nl_dump_addr(struct sk_buff *msg,
110
             struct netlink_callback *cb);
111
int mptcp_userspace_pm_dump_addr(struct sk_buff *msg,
112
--
24
--
113
2.43.0
25
2.43.0
diff view generated by jsdifflib