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:
2
17
3
v3:
18
v3:
4
- drop "mptcp: update address type of get_local_id".
19
- drop "mptcp: update address type of get_local_id".
5
20
6
v2:
21
v2:
...
...
11
26
12
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
13
mptcp_pm_addr_id_bitmap_t in include/net/mptcp.h, since get_addr() and
28
mptcp_pm_addr_id_bitmap_t in include/net/mptcp.h, since get_addr() and
14
dump_addr() interfaces of BPF userspace pm is dropped as Matt suggested.
29
dump_addr() interfaces of BPF userspace pm is dropped as Matt suggested.
15
30
16
Geliang Tang (6):
31
Geliang Tang (5):
32
mptcp: add a build check for userspace_pm_dump_addr
17
mptcp: add mptcp_pm_genl_fill_addr helper
33
mptcp: add mptcp_pm_genl_fill_addr helper
18
mptcp: add struct mptcp_pm_addr_id_bitmap
19
mptcp: drop inet6_sk in mptcp_nl_find_ssk
20
mptcp: drop match in userspace_pm_append_new_local_addr
34
mptcp: drop match in userspace_pm_append_new_local_addr
21
mptcp: hold msk lock before removing id 0 address
35
mptcp: drop inet6_sk after inet_sk
22
mptcp: change is_backup interfaces as get_flags
36
mptcp: use ipv6_addr_equal in addresses_equal
23
37
24
net/mptcp/pm.c | 28 +++++++++++++++--
38
net/mptcp/pm.c | 21 +++++++++++++++++++++
25
net/mptcp/pm_netlink.c | 21 ++++---------
39
net/mptcp/pm_netlink.c | 22 ++++------------------
26
net/mptcp/pm_userspace.c | 67 +++++++++++++---------------------------
40
net/mptcp/pm_userspace.c | 29 +++++++----------------------
27
net/mptcp/protocol.h | 13 ++++++--
41
net/mptcp/protocol.h | 3 +++
28
4 files changed, 64 insertions(+), 65 deletions(-)
42
4 files changed, 35 insertions(+), 40 deletions(-)
29
43
30
--
44
--
31
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;
...
...
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
In mptcp_pm_nl_remove_doit(), move 'lock_sock(sk)' before invoking the
4
function mptcp_userspace_pm_remove_id_zero_address(). Then no need to
5
hold and release this lock in this function. And 'sk' and 'err' variables
6
and 'remove_err' label in it can be dropped.
7
8
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
9
---
10
net/mptcp/pm_userspace.c | 16 +++++-----------
11
1 file changed, 5 insertions(+), 11 deletions(-)
12
13
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/net/mptcp/pm_userspace.c
16
+++ b/net/mptcp/pm_userspace.c
17
@@ -XXX,XX +XXX,XX @@ static int mptcp_userspace_pm_remove_id_zero_address(struct mptcp_sock *msk)
18
{
19
    struct mptcp_rm_list list = { .nr = 0 };
20
    struct mptcp_subflow_context *subflow;
21
-    struct sock *sk = (struct sock *)msk;
22
    bool has_id_0 = false;
23
-    int err = -EINVAL;
24
25
-    lock_sock(sk);
26
    mptcp_for_each_subflow(msk, subflow) {
27
        if (READ_ONCE(subflow->local_id) == 0) {
28
            has_id_0 = true;
29
@@ -XXX,XX +XXX,XX @@ static int mptcp_userspace_pm_remove_id_zero_address(struct mptcp_sock *msk)
30
        }
31
    }
32
    if (!has_id_0)
33
-        goto remove_err;
34
+        return -EINVAL;
35
36
    list.ids[list.nr++] = 0;
37
38
@@ -XXX,XX +XXX,XX @@ static int mptcp_userspace_pm_remove_id_zero_address(struct mptcp_sock *msk)
39
    mptcp_pm_remove_addr(msk, &list);
40
    spin_unlock_bh(&msk->pm.lock);
41
42
-    err = 0;
43
-
44
-remove_err:
45
-    release_sock(sk);
46
-    return err;
47
+    return 0;
48
}
49
50
void mptcp_pm_remove_addr_entry(struct mptcp_sock *msk,
51
@@ -XXX,XX +XXX,XX @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
52
53
    sk = (struct sock *)msk;
54
55
+    lock_sock(sk);
56
+
57
    if (id_val == 0) {
58
        err = mptcp_userspace_pm_remove_id_zero_address(msk);
59
+        release_sock(sk);
60
        goto out;
61
    }
62
63
-    lock_sock(sk);
64
-
65
    spin_lock_bh(&msk->pm.lock);
66
    match = mptcp_userspace_pm_lookup_addr_by_id(msk, id_val);
67
    if (!match) {
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
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, struct mptcp_addr_info *skc
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, &new_entry, 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_get_local_id(struct mptcp_sock *msk, struct sock_common *skc);
100
int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *skc);
101
int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *skc);
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