1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
2
3
v5:
4
- update subjects and commit logs as Matt suggested (thanks).
5
- avoid repeating checks in patch 1.
6
- do stricter checks on subflows in patch 3.
7
8
v4:
9
- CI reports the following BUILD_BUG_ON fails on i386:
10
11
BUILD_BUG_ON(sizeof(struct bpf_iter_mptcp_subflow_kern) !=
12
     sizeof(struct bpf_iter_mptcp_subflow))
13
14
Just like in bpf_iter_task_new(), change this "!=" to ">".
15
16
v3:
17
- check sock_owned_by_user_nocheck(sk)/spin_is_locked(&sk->sk_lock.slock),
18
instead of lockdep_sock_is_held(sk).
19
- add "sizeof" and "alignof" checks.
20
- drop bpf_mptcp_sk() and bpf_mptcp_subflow_tcp_sock() definitions. Use
21
bpf_skc_to_mptcp_sock() and mptcp_subflow_tcp_sock() in mptcp_subflow
22
bpf_iter selftests instead.
23
3
v2:
24
v2:
4
- Drop bpf_skc_to_mptcp_sock
25
- add CONFIG_LOCKDEP check in patch 2 to fix the build error reported
5
- Check the owner before assigning the msk as Mat suggested.
26
by CI.
6
- Use bpf_core_cast() in mptcp_subflow bpf_iter subtest instead of
7
using bpf_skc_to_mptcp_sock().
8
27
9
Address Martin's suggestions for v2.
28
Address Martin's comments in v1.
10
29
11
Geliang Tang (5):
30
Geliang Tang (5):
12
Revert "bpf: Extend bpf_skc_to_mptcp_sock to MPTCP sock"
31
bpf: Extend bpf_skc_to_mptcp_sock to MPTCP sock
13
Revert "bpf: Allow use of skc_to_mptcp_sock in cg_sockopt"
32
bpf: Allow use of skc_to_mptcp_sock in cg_sockopt
33
Squash to "bpf: Register mptcp common kfunc set"
14
Squash to "bpf: Add mptcp_subflow bpf_iter"
34
Squash to "bpf: Add mptcp_subflow bpf_iter"
15
Revert "bpf: Acquire and release mptcp socket"
16
Squash to "selftests/bpf: Add mptcp_subflow bpf_iter subtest"
35
Squash to "selftests/bpf: Add mptcp_subflow bpf_iter subtest"
17
36
18
include/net/mptcp.h | 4 +-
37
include/net/mptcp.h | 4 +-
19
kernel/bpf/cgroup.c | 2 -
38
kernel/bpf/cgroup.c | 2 +
20
net/core/filter.c | 2 +-
39
net/core/filter.c | 2 +-
21
net/mptcp/bpf.c | 43 +++++--------------
40
net/mptcp/bpf.c | 41 +++++++++++--------
22
.../testing/selftests/bpf/bpf_experimental.h | 2 +-
41
tools/testing/selftests/bpf/progs/mptcp_bpf.h | 1 -
23
tools/testing/selftests/bpf/progs/mptcp_bpf.h | 3 --
42
.../selftests/bpf/progs/mptcp_bpf_iters.c | 11 +++--
24
.../selftests/bpf/progs/mptcp_bpf_iters.c | 8 +---
43
6 files changed, 33 insertions(+), 28 deletions(-)
25
7 files changed, 16 insertions(+), 48 deletions(-)
26
44
27
--
45
--
28
2.43.0
46
2.45.2
diff view generated by jsdifflib
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
2
3
bpf_core_cast() can be used in mptcp_subflow bpf_iter selftests to get the
3
Currently, bpf_skc_to_mptcp_sock() can only be used with sockets that
4
msk, instead of using bpf_skc_to_mptcp_sock(). No need to add this patch
4
are MPTCP subflows: TCP sockets with tp->is_mptcp, created by the kernel
5
anymore, revert it.
5
from an MPTCP socket (IPPROTO_MPTCP). Typically used with BPF sock_ops
6
operators.
7
8
Here, this helper is extended to support MPTCP sockets, the ones created
9
by the userspace (IPPROTO_MPTCP). This is useful for BPF hooks involving
10
these sockets, e.g. [gs]etsocktopt.
11
12
bpf_skc_to_mptcp_sock() uses bpf_mptcp_sock_from_subflow(). The former
13
suggests any MPTCP type/subtype can be used, but the latter only accepts
14
subflow ones. So bpf_mptcp_sock_from_subflow is modified here to support
15
MPTCP socket, and renamed to avoid confusions.
6
16
7
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
17
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
8
---
18
---
9
include/net/mptcp.h | 4 ++--
19
include/net/mptcp.h | 4 ++--
10
net/core/filter.c | 2 +-
20
net/core/filter.c | 2 +-
11
net/mptcp/bpf.c | 10 ++--------
21
net/mptcp/bpf.c | 10 ++++++++--
12
3 files changed, 5 insertions(+), 11 deletions(-)
22
3 files changed, 11 insertions(+), 5 deletions(-)
13
23
14
diff --git a/include/net/mptcp.h b/include/net/mptcp.h
24
diff --git a/include/net/mptcp.h b/include/net/mptcp.h
15
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
16
--- a/include/net/mptcp.h
26
--- a/include/net/mptcp.h
17
+++ b/include/net/mptcp.h
27
+++ b/include/net/mptcp.h
18
@@ -XXX,XX +XXX,XX @@ static inline void mptcpv6_handle_mapped(struct sock *sk, bool mapped) { }
28
@@ -XXX,XX +XXX,XX @@ static inline void mptcpv6_handle_mapped(struct sock *sk, bool mapped) { }
19
#endif
29
#endif
20
30
21
#if defined(CONFIG_MPTCP) && defined(CONFIG_BPF_SYSCALL)
31
#if defined(CONFIG_MPTCP) && defined(CONFIG_BPF_SYSCALL)
22
-struct mptcp_sock *bpf_mptcp_sock_from_sock(struct sock *sk);
32
-struct mptcp_sock *bpf_mptcp_sock_from_subflow(struct sock *sk);
23
+struct mptcp_sock *bpf_mptcp_sock_from_subflow(struct sock *sk);
33
+struct mptcp_sock *bpf_mptcp_sock_from_sock(struct sock *sk);
24
#else
34
#else
25
-static inline struct mptcp_sock *bpf_mptcp_sock_from_sock(struct sock *sk) { return NULL; }
35
-static inline struct mptcp_sock *bpf_mptcp_sock_from_subflow(struct sock *sk) { return NULL; }
26
+static inline struct mptcp_sock *bpf_mptcp_sock_from_subflow(struct sock *sk) { return NULL; }
36
+static inline struct mptcp_sock *bpf_mptcp_sock_from_sock(struct sock *sk) { return NULL; }
27
#endif
37
#endif
28
38
29
#if !IS_ENABLED(CONFIG_MPTCP)
39
#if !IS_ENABLED(CONFIG_MPTCP)
30
diff --git a/net/core/filter.c b/net/core/filter.c
40
diff --git a/net/core/filter.c b/net/core/filter.c
31
index XXXXXXX..XXXXXXX 100644
41
index XXXXXXX..XXXXXXX 100644
32
--- a/net/core/filter.c
42
--- a/net/core/filter.c
33
+++ b/net/core/filter.c
43
+++ b/net/core/filter.c
34
@@ -XXX,XX +XXX,XX @@ const struct bpf_func_proto bpf_skc_to_unix_sock_proto = {
44
@@ -XXX,XX +XXX,XX @@ const struct bpf_func_proto bpf_skc_to_unix_sock_proto = {
35
BPF_CALL_1(bpf_skc_to_mptcp_sock, struct sock *, sk)
45
BPF_CALL_1(bpf_skc_to_mptcp_sock, struct sock *, sk)
36
{
46
{
37
    BTF_TYPE_EMIT(struct mptcp_sock);
47
    BTF_TYPE_EMIT(struct mptcp_sock);
38
-    return (unsigned long)bpf_mptcp_sock_from_sock(sk);
48
-    return (unsigned long)bpf_mptcp_sock_from_subflow(sk);
39
+    return (unsigned long)bpf_mptcp_sock_from_subflow(sk);
49
+    return (unsigned long)bpf_mptcp_sock_from_sock(sk);
40
}
50
}
41
51
42
const struct bpf_func_proto bpf_skc_to_mptcp_sock_proto = {
52
const struct bpf_func_proto bpf_skc_to_mptcp_sock_proto = {
43
diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
53
diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
44
index XXXXXXX..XXXXXXX 100644
54
index XXXXXXX..XXXXXXX 100644
45
--- a/net/mptcp/bpf.c
55
--- a/net/mptcp/bpf.c
46
+++ b/net/mptcp/bpf.c
56
+++ b/net/mptcp/bpf.c
47
@@ -XXX,XX +XXX,XX @@ static struct bpf_struct_ops bpf_mptcp_sched_ops = {
57
@@ -XXX,XX +XXX,XX @@ static struct bpf_struct_ops bpf_mptcp_sched_ops = {
48
};
58
};
49
#endif /* CONFIG_BPF_JIT */
59
#endif /* CONFIG_BPF_JIT */
50
60
51
-struct mptcp_sock *bpf_mptcp_sock_from_sock(struct sock *sk)
61
-struct mptcp_sock *bpf_mptcp_sock_from_subflow(struct sock *sk)
52
+struct mptcp_sock *bpf_mptcp_sock_from_subflow(struct sock *sk)
62
+struct mptcp_sock *bpf_mptcp_sock_from_sock(struct sock *sk)
53
{
63
{
54
-    if (unlikely(!sk || !sk_fullsock(sk)))
64
-    if (sk && sk_fullsock(sk) && sk->sk_protocol == IPPROTO_TCP && sk_is_mptcp(sk))
55
-        return NULL;
65
+    if (unlikely(!sk || !sk_fullsock(sk)))
56
-
66
+        return NULL;
57
-    if (sk->sk_protocol == IPPROTO_MPTCP)
67
+
58
-        return mptcp_sk(sk);
68
+    if (sk->sk_protocol == IPPROTO_MPTCP)
59
-
69
+        return mptcp_sk(sk);
60
-    if (sk->sk_protocol == IPPROTO_TCP && sk_is_mptcp(sk))
70
+
61
+    if (sk && sk_fullsock(sk) && sk->sk_protocol == IPPROTO_TCP && sk_is_mptcp(sk))
71
+    if (sk->sk_protocol == IPPROTO_TCP && sk_is_mptcp(sk))
62
        return mptcp_sk(mptcp_subflow_ctx(sk)->conn);
72
        return mptcp_sk(mptcp_subflow_ctx(sk)->conn);
63
73
64
    return NULL;
74
    return NULL;
65
--
75
--
66
2.43.0
76
2.45.2
diff view generated by jsdifflib
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
2
3
bpf_core_cast() can be used in mptcp_subflow bpf_iter selftests to get the
3
Currently, bpf_skc_to_mptcp_sock() helper is not allowed to be used
4
msk, instead of using bpf_skc_to_mptcp_sock(). No need to add this patch
4
in cg_sockopt. This patch adds this permission.
5
anymore, revert it.
6
5
7
This reverts commit d8d42f5a4542c2dc31e4e00c58508a821c6ab789.
6
Thanks to the previous patch allowing skc_to_mptcp_sock() to be used
7
with MPTCP sockets, this permission allows this helper to be use it in
8
CGroup BPF hooks, e.g. [gs]etsocktopt.
9
10
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
8
---
11
---
9
kernel/bpf/cgroup.c | 2 --
12
kernel/bpf/cgroup.c | 2 ++
10
1 file changed, 2 deletions(-)
13
1 file changed, 2 insertions(+)
11
14
12
diff --git a/kernel/bpf/cgroup.c b/kernel/bpf/cgroup.c
15
diff --git a/kernel/bpf/cgroup.c b/kernel/bpf/cgroup.c
13
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
14
--- a/kernel/bpf/cgroup.c
17
--- a/kernel/bpf/cgroup.c
15
+++ b/kernel/bpf/cgroup.c
18
+++ b/kernel/bpf/cgroup.c
16
@@ -XXX,XX +XXX,XX @@ cg_sockopt_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
19
@@ -XXX,XX +XXX,XX @@ cg_sockopt_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
17
#ifdef CONFIG_INET
20
#ifdef CONFIG_INET
18
    case BPF_FUNC_tcp_sock:
21
    case BPF_FUNC_tcp_sock:
19
        return &bpf_tcp_sock_proto;
22
        return &bpf_tcp_sock_proto;
20
-    case BPF_FUNC_skc_to_mptcp_sock:
23
+    case BPF_FUNC_skc_to_mptcp_sock:
21
-        return &bpf_skc_to_mptcp_sock_proto;
24
+        return &bpf_skc_to_mptcp_sock_proto;
22
#endif
25
#endif
23
    case BPF_FUNC_perf_event_output:
26
    case BPF_FUNC_perf_event_output:
24
        return &bpf_event_output_data_proto;
27
        return &bpf_event_output_data_proto;
25
--
28
--
26
2.43.0
29
2.45.2
diff view generated by jsdifflib
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
2
3
Drop this patch as Martin suggested.
3
Drop bpf_mptcp_sk() and bpf_mptcp_subflow_tcp_sock() definitions. Use
4
bpf_skc_to_mptcp_sock() and mptcp_subflow_tcp_sock() in mptcp_subflow
5
bpf_iter selftests instead.
6
7
Address Martin's comments in v1:
8
9
- add null-check for bpf_mptcp_subflow_ctx.
10
- add KF_RET_NULL flags for bpf_mptcp_subflow_ctx.
11
- register this kfunc set to BPF_PROG_TYPE_CGROUP_SOCKOPT only,
12
not BPF_PROG_TYPE_UNSPEC.
4
13
5
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
14
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
6
---
15
---
7
net/mptcp/bpf.c | 19 -------------------
16
net/mptcp/bpf.c | 21 ++++++---------------
8
1 file changed, 19 deletions(-)
17
1 file changed, 6 insertions(+), 15 deletions(-)
9
18
10
diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
19
diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
11
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
12
--- a/net/mptcp/bpf.c
21
--- a/net/mptcp/bpf.c
13
+++ b/net/mptcp/bpf.c
22
+++ b/net/mptcp/bpf.c
14
@@ -XXX,XX +XXX,XX @@ bpf_iter_mptcp_subflow_destroy(struct bpf_iter_mptcp_subflow *it)
23
@@ -XXX,XX +XXX,XX @@ struct bpf_iter_mptcp_subflow_kern {
15
{
24
16
}
25
__bpf_kfunc_start_defs();
17
26
18
-__bpf_kfunc static struct
27
-__bpf_kfunc static struct mptcp_sock *bpf_mptcp_sk(struct sock *sk)
19
-mptcp_sock *bpf_mptcp_sock_acquire(struct mptcp_sock *msk)
20
-{
28
-{
21
-    struct sock *sk = (struct sock *)msk;
29
-    return mptcp_sk(sk);
22
-
23
-    if (sk && refcount_inc_not_zero(&sk->sk_refcnt))
24
-        return msk;
25
-    return NULL;
26
-}
30
-}
27
-
31
-
28
-__bpf_kfunc static void bpf_mptcp_sock_release(struct mptcp_sock *msk)
32
__bpf_kfunc static struct mptcp_subflow_context *
33
bpf_mptcp_subflow_ctx(const struct sock *sk)
34
{
35
-    return mptcp_subflow_ctx(sk);
36
-}
37
+    if (sk && sk_fullsock(sk) &&
38
+     sk->sk_protocol == IPPROTO_TCP && sk_is_mptcp(sk))
39
+        return mptcp_subflow_ctx(sk);
40
41
-__bpf_kfunc static struct sock *
42
-bpf_mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow)
29
-{
43
-{
30
-    struct sock *sk = (struct sock *)msk;
44
-    return mptcp_subflow_tcp_sock(subflow);
31
-
45
+    return NULL;
32
-    WARN_ON_ONCE(!sk || !refcount_dec_not_one(&sk->sk_refcnt));
46
}
33
-}
47
34
-
48
__bpf_kfunc static int
35
__bpf_kfunc struct mptcp_subflow_context *
49
@@ -XXX,XX +XXX,XX @@ __bpf_kfunc static bool bpf_mptcp_subflow_queues_empty(struct sock *sk)
36
bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos)
50
__bpf_kfunc_end_defs();
37
{
51
38
@@ -XXX,XX +XXX,XX @@ BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx, KF_RET_NULL)
52
BTF_KFUNCS_START(bpf_mptcp_common_kfunc_ids)
53
-BTF_ID_FLAGS(func, bpf_mptcp_sk)
54
-BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx)
55
-BTF_ID_FLAGS(func, bpf_mptcp_subflow_tcp_sock)
56
+BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx, KF_RET_NULL)
39
BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_new, KF_ITER_NEW | KF_TRUSTED_ARGS)
57
BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_new, KF_ITER_NEW | KF_TRUSTED_ARGS)
40
BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_next, KF_ITER_NEXT | KF_RET_NULL)
58
BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_next, KF_ITER_NEXT | KF_RET_NULL)
41
BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_destroy, KF_ITER_DESTROY)
59
BTF_ID_FLAGS(func, bpf_iter_mptcp_subflow_destroy, KF_ITER_DESTROY)
42
-BTF_ID_FLAGS(func, bpf_mptcp_sock_acquire, KF_ACQUIRE | KF_RET_NULL)
60
@@ -XXX,XX +XXX,XX @@ static int __init bpf_mptcp_kfunc_init(void)
43
-BTF_ID_FLAGS(func, bpf_mptcp_sock_release, KF_RELEASE)
61
    int ret;
44
BTF_KFUNCS_END(bpf_mptcp_common_kfunc_ids)
62
45
63
    ret = register_btf_fmodret_id_set(&bpf_mptcp_fmodret_set);
46
static const struct btf_kfunc_id_set bpf_mptcp_common_kfunc_set = {
64
-    ret = ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_UNSPEC,
65
+    ret = ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_CGROUP_SOCKOPT,
66
                     &bpf_mptcp_common_kfunc_set);
67
    ret = ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_STRUCT_OPS,
68
                     &bpf_mptcp_sched_kfunc_set);
47
--
69
--
48
2.43.0
70
2.45.2
diff view generated by jsdifflib
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
2
3
Drop the NULL check as Martin suggested.
3
Add "sizeof" and "alignof" checks.
4
4
5
Use the "struct sock *sk" instead of "struct mptcp-sock *msk" as the
5
Address Martin's comments in v1:
6
argument in the bpf_iter_mptcp_subflow_new as Martin suggested.
7
6
8
Use msk_owned_by_me().
7
- bpf_iter_mptcp_subflow_new returns -EINVAL when msk socket lock isn't
9
8
held.
10
v2:
11
- check the owner before assigning the msk as Mat suggested.
12
9
13
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
10
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
14
---
11
---
15
net/mptcp/bpf.c | 14 ++++++++------
12
net/mptcp/bpf.c | 10 +++++++++-
16
1 file changed, 8 insertions(+), 6 deletions(-)
13
1 file changed, 9 insertions(+), 1 deletion(-)
17
14
18
diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
15
diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
19
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
20
--- a/net/mptcp/bpf.c
17
--- a/net/mptcp/bpf.c
21
+++ b/net/mptcp/bpf.c
18
+++ b/net/mptcp/bpf.c
22
@@ -XXX,XX +XXX,XX @@ bpf_mptcp_subflow_ctx(const struct sock *sk)
19
@@ -XXX,XX +XXX,XX @@ bpf_iter_mptcp_subflow_new(struct bpf_iter_mptcp_subflow *it,
23
20
             struct mptcp_sock *msk)
24
__bpf_kfunc static int
25
bpf_iter_mptcp_subflow_new(struct bpf_iter_mptcp_subflow *it,
26
-             struct mptcp_sock *msk)
27
+             struct sock *sk)
28
{
21
{
29
    struct bpf_iter_mptcp_subflow_kern *kit = (void *)it;
22
    struct bpf_iter_mptcp_subflow_kern *kit = (void *)it;
30
-    struct sock *sk = (struct sock *)msk;
23
+    struct sock *sk = (struct sock *)msk;
31
+    struct mptcp_sock *msk;
24
+
32
25
+    BUILD_BUG_ON(sizeof(struct bpf_iter_mptcp_subflow_kern) >
33
    BUILD_BUG_ON(sizeof(struct bpf_iter_mptcp_subflow_kern) >
26
+         sizeof(struct bpf_iter_mptcp_subflow));
34
         sizeof(struct bpf_iter_mptcp_subflow));
27
+    BUILD_BUG_ON(__alignof__(struct bpf_iter_mptcp_subflow_kern) !=
35
    BUILD_BUG_ON(__alignof__(struct bpf_iter_mptcp_subflow_kern) !=
28
+         __alignof__(struct bpf_iter_mptcp_subflow));
36
         __alignof__(struct bpf_iter_mptcp_subflow));
29
37
30
    kit->msk = msk;
38
-    kit->msk = msk;
31
    if (!msk)
39
-    if (!msk)
40
+    if (unlikely(!sk || !sk_fullsock(sk)))
41
        return -EINVAL;
32
        return -EINVAL;
42
33
43
-    if (!sock_owned_by_user_nocheck(sk) &&
34
-    msk_owned_by_me(msk);
44
-     !spin_is_locked(&sk->sk_lock.slock))
35
+    if (!sock_owned_by_user_nocheck(sk) &&
45
+    if (sk->sk_protocol != IPPROTO_MPTCP)
36
+     !spin_is_locked(&sk->sk_lock.slock))
46
        return -EINVAL;
37
+        return -EINVAL;
47
38
48
+    msk = mptcp_sk(sk);
49
+    msk_owned_by_me(msk);
50
+
51
+    kit->msk = msk;
52
    kit->pos = &msk->conn_list;
39
    kit->pos = &msk->conn_list;
53
    return 0;
40
    return 0;
54
}
55
--
41
--
56
2.43.0
42
2.45.2
diff view generated by jsdifflib
1
From: Geliang Tang <tanggeliang@kylinos.cn>
1
From: Geliang Tang <tanggeliang@kylinos.cn>
2
2
3
Use bpf_core_cast() instead of bpf_skc_to_mptcp_sock().
3
Use bpf_skc_to_mptcp_sock() and mptcp_subflow_tcp_sock() instead of
4
Change the 2nd parameter type of bpf_for_each() as 'struct sock'.
4
bpf_mptcp_sk() and bpf_mptcp_subflow_tcp_sock().
5
Drop bpf_mptcp_sock_acquire/release.
5
6
IPPROTO_MPTCP is checked in bpf_skc_to_mptcp_sock(), no need to check
7
it in BPF program.
8
9
bpf_skc_to_mptcp_sock() and bpf_mptcp_subflow_ctx() may return NULL,
10
need to check the return values.
6
11
7
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
12
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
8
---
13
---
9
tools/testing/selftests/bpf/bpf_experimental.h | 2 +-
14
tools/testing/selftests/bpf/progs/mptcp_bpf.h | 1 -
10
tools/testing/selftests/bpf/progs/mptcp_bpf.h | 3 ---
15
tools/testing/selftests/bpf/progs/mptcp_bpf_iters.c | 11 +++++------
11
tools/testing/selftests/bpf/progs/mptcp_bpf_iters.c | 8 ++------
16
2 files changed, 5 insertions(+), 7 deletions(-)
12
3 files changed, 3 insertions(+), 10 deletions(-)
13
17
14
diff --git a/tools/testing/selftests/bpf/bpf_experimental.h b/tools/testing/selftests/bpf/bpf_experimental.h
15
index XXXXXXX..XXXXXXX 100644
16
--- a/tools/testing/selftests/bpf/bpf_experimental.h
17
+++ b/tools/testing/selftests/bpf/bpf_experimental.h
18
@@ -XXX,XX +XXX,XX @@ extern void bpf_iter_css_destroy(struct bpf_iter_css *it) __weak __ksym;
19
20
struct bpf_iter_mptcp_subflow;
21
extern int bpf_iter_mptcp_subflow_new(struct bpf_iter_mptcp_subflow *it,
22
-                 struct mptcp_sock *msk) __weak __ksym;
23
+                 struct sock *sk) __weak __ksym;
24
extern struct mptcp_subflow_context *
25
bpf_iter_mptcp_subflow_next(struct bpf_iter_mptcp_subflow *it) __weak __ksym;
26
extern void
27
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf.h b/tools/testing/selftests/bpf/progs/mptcp_bpf.h
18
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf.h b/tools/testing/selftests/bpf/progs/mptcp_bpf.h
28
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
29
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf.h
20
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf.h
30
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf.h
21
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf.h
31
@@ -XXX,XX +XXX,XX @@ mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow)
22
@@ -XXX,XX +XXX,XX @@ mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow)
32
}
23
extern struct mptcp_sock *bpf_mptcp_sock_acquire(struct mptcp_sock *msk) __ksym;
33
24
extern void bpf_mptcp_sock_release(struct mptcp_sock *msk) __ksym;
34
/* ksym */
25
35
-extern struct mptcp_sock *bpf_mptcp_sock_acquire(struct mptcp_sock *msk) __ksym;
26
-extern struct mptcp_sock *bpf_mptcp_sk(struct sock *sk) __ksym;
36
-extern void bpf_mptcp_sock_release(struct mptcp_sock *msk) __ksym;
37
-
38
extern struct mptcp_subflow_context *
27
extern struct mptcp_subflow_context *
39
bpf_mptcp_subflow_ctx(const struct sock *sk) __ksym;
28
bpf_mptcp_subflow_ctx(const struct sock *sk) __ksym;
40
extern struct sock *
29
extern struct sock *
41
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_iters.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_iters.c
30
diff --git a/tools/testing/selftests/bpf/progs/mptcp_bpf_iters.c b/tools/testing/selftests/bpf/progs/mptcp_bpf_iters.c
42
index XXXXXXX..XXXXXXX 100644
31
index XXXXXXX..XXXXXXX 100644
43
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_iters.c
32
--- a/tools/testing/selftests/bpf/progs/mptcp_bpf_iters.c
44
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_iters.c
33
+++ b/tools/testing/selftests/bpf/progs/mptcp_bpf_iters.c
45
@@ -XXX,XX +XXX,XX @@ int iters_subflow(struct bpf_sockopt *ctx)
34
@@ -XXX,XX +XXX,XX @@ int iters_subflow(struct bpf_sockopt *ctx)
46
    if (ctx->level != SOL_TCP || ctx->optname != TCP_IS_MPTCP)
35
    struct mptcp_sock *msk;
36
    int local_ids = 0;
37
38
-    if (!sk || sk->protocol != IPPROTO_MPTCP ||
39
-     ctx->level != SOL_TCP || ctx->optname != TCP_IS_MPTCP)
40
+    if (ctx->level != SOL_TCP || ctx->optname != TCP_IS_MPTCP)
47
        return 1;
41
        return 1;
48
42
49
-    msk = bpf_skc_to_mptcp_sock(sk);
43
-    msk = bpf_mptcp_sk((struct sock *)sk);
50
+    msk = bpf_core_cast(sk, struct mptcp_sock);
44
-    if (msk->pm.server_side || !msk->pm.subflows)
51
    if (!msk || msk->pm.server_side || !msk->pm.subflows)
45
+    msk = bpf_skc_to_mptcp_sock(sk);
46
+    if (!msk || msk->pm.server_side || !msk->pm.subflows)
52
        return 1;
47
        return 1;
53
48
54
-    msk = bpf_mptcp_sock_acquire(msk);
49
    msk = bpf_mptcp_sock_acquire(msk);
55
-    if (!msk)
56
-        return 1;
57
-    bpf_for_each(mptcp_subflow, subflow, msk) {
58
+    bpf_for_each(mptcp_subflow, subflow, (struct sock *)sk) {
59
        /* Here MPTCP-specific packet scheduler kfunc can be called:
60
         * this test is not doing anything really useful, only to
61
         * verify the iteration works.
62
@@ -XXX,XX +XXX,XX @@ int iters_subflow(struct bpf_sockopt *ctx)
50
@@ -XXX,XX +XXX,XX @@ int iters_subflow(struct bpf_sockopt *ctx)
51
        local_ids += subflow->subflow_id;
52
53
        /* only to check the following kfunc works */
54
-        ssk = bpf_mptcp_subflow_tcp_sock(subflow);
55
+        ssk = mptcp_subflow_tcp_sock(subflow);
56
    }
57
58
    if (!ssk)
59
@@ -XXX,XX +XXX,XX @@ int iters_subflow(struct bpf_sockopt *ctx)
60
61
    /* only to check the following kfunc works */
62
    subflow = bpf_mptcp_subflow_ctx(ssk);
63
-    if (subflow->token != msk->token)
64
+    if (!subflow || subflow->token != msk->token)
65
        goto out;
66
63
    ids = local_ids;
67
    ids = local_ids;
64
65
out:
66
-    bpf_mptcp_sock_release(msk);
67
    return 1;
68
}
69
--
68
--
70
2.43.0
69
2.45.2
diff view generated by jsdifflib