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 |