mirror of
https://github.com/Ysurac/openmptcprouter.git
synced 2025-02-12 19:31:52 +00:00
Add MPTCP BPF support
This commit is contained in:
parent
26e5327231
commit
6e29056f0b
1 changed files with 427 additions and 0 deletions
427
6.6/target/linux/generic/hack-6.6/999-mptcp-bpf.patch
Normal file
427
6.6/target/linux/generic/hack-6.6/999-mptcp-bpf.patch
Normal file
|
@ -0,0 +1,427 @@
|
||||||
|
From f1dfe037fdf0c300f38bab0bb8f256d4195d45e8 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Geliang Tang <geliang.tang@suse.com>
|
||||||
|
Date: Tue, 19 Dec 2023 13:27:59 +0100
|
||||||
|
Subject: [PATCH] mptcp: add sched_data helpers
|
||||||
|
|
||||||
|
Add a new helper mptcp_sched_data_set_contexts() to set the subflow
|
||||||
|
pointers array in struct mptcp_sched_data. Add a new helper
|
||||||
|
mptcp_subflow_ctx_by_pos() to get the given pos subflow from the
|
||||||
|
contexts array in struct mptcp_sched_data. They will be invoked by
|
||||||
|
the BPF schedulers to export the subflow pointers to the BPF contexts.
|
||||||
|
|
||||||
|
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
|
||||||
|
Reviewed-by: Mat Martineau <martineau@kernel.org>
|
||||||
|
---
|
||||||
|
net/mptcp/bpf.c | 14 ++++++++++++++
|
||||||
|
net/mptcp/protocol.h | 2 ++
|
||||||
|
net/mptcp/sched.c | 22 ++++++++++++++++++++++
|
||||||
|
3 files changed, 38 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
|
||||||
|
index 8a16672b94e23..c3d62535eb0cf 100644
|
||||||
|
--- a/net/mptcp/bpf.c
|
||||||
|
+++ b/net/mptcp/bpf.c
|
||||||
|
@@ -29,6 +29,20 @@ static const struct btf_kfunc_id_set bpf_mptcp_fmodret_set = {
|
||||||
|
.set = &bpf_mptcp_fmodret_ids,
|
||||||
|
};
|
||||||
|
|
||||||
|
+__diag_push();
|
||||||
|
+__diag_ignore_all("-Wmissing-prototypes",
|
||||||
|
+ "kfuncs which will be used in BPF programs");
|
||||||
|
+
|
||||||
|
+__bpf_kfunc struct mptcp_subflow_context *
|
||||||
|
+bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos)
|
||||||
|
+{
|
||||||
|
+ if (pos >= MPTCP_SUBFLOWS_MAX)
|
||||||
|
+ return NULL;
|
||||||
|
+ return data->contexts[pos];
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+__diag_pop();
|
||||||
|
+
|
||||||
|
static int __init bpf_mptcp_kfunc_init(void)
|
||||||
|
{
|
||||||
|
return register_btf_fmodret_id_set(&bpf_mptcp_fmodret_set);
|
||||||
|
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
|
||||||
|
index 3517f2d24a226..7cf5d2de74419 100644
|
||||||
|
--- a/net/mptcp/protocol.h
|
||||||
|
+++ b/net/mptcp/protocol.h
|
||||||
|
@@ -636,6 +636,8 @@ void __mptcp_subflow_send_ack(struct sock *ssk);
|
||||||
|
void mptcp_subflow_reset(struct sock *ssk);
|
||||||
|
void mptcp_subflow_queue_clean(struct sock *sk, struct sock *ssk);
|
||||||
|
void mptcp_sock_graft(struct sock *sk, struct socket *parent);
|
||||||
|
+struct mptcp_subflow_context *
|
||||||
|
+bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos);
|
||||||
|
struct sock *__mptcp_nmpc_sk(struct mptcp_sock *msk);
|
||||||
|
bool __mptcp_close(struct sock *sk, long timeout);
|
||||||
|
void mptcp_cancel_work(struct sock *sk);
|
||||||
|
diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c
|
||||||
|
index 4ab0693c069c0..a7e1c10b19848 100644
|
||||||
|
--- a/net/mptcp/sched.c
|
||||||
|
+++ b/net/mptcp/sched.c
|
||||||
|
@@ -121,6 +121,26 @@ void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow,
|
||||||
|
WRITE_ONCE(subflow->scheduled, scheduled);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void mptcp_sched_data_set_contexts(const struct mptcp_sock *msk,
|
||||||
|
+ struct mptcp_sched_data *data)
|
||||||
|
+{
|
||||||
|
+ struct mptcp_subflow_context *subflow;
|
||||||
|
+ int i = 0;
|
||||||
|
+
|
||||||
|
+ mptcp_for_each_subflow(msk, subflow) {
|
||||||
|
+ if (i == MPTCP_SUBFLOWS_MAX) {
|
||||||
|
+ pr_warn_once("too many subflows");
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ mptcp_subflow_set_scheduled(subflow, false);
|
||||||
|
+ data->contexts[i++] = subflow;
|
||||||
|
+ }
|
||||||
|
+ data->subflows = i;
|
||||||
|
+
|
||||||
|
+ for (; i < MPTCP_SUBFLOWS_MAX; i++)
|
||||||
|
+ data->contexts[i] = NULL;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
int mptcp_sched_get_send(struct mptcp_sock *msk)
|
||||||
|
{
|
||||||
|
struct mptcp_subflow_context *subflow;
|
||||||
|
@@ -147,6 +167,7 @@ int mptcp_sched_get_send(struct mptcp_sock *msk)
|
||||||
|
data.reinject = false;
|
||||||
|
if (msk->sched == &mptcp_sched_default || !msk->sched)
|
||||||
|
return mptcp_sched_default_get_subflow(msk, &data);
|
||||||
|
+ mptcp_sched_data_set_contexts(msk, &data);
|
||||||
|
return msk->sched->get_subflow(msk, &data);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -169,5 +190,6 @@ int mptcp_sched_get_retrans(struct mptcp_sock *msk)
|
||||||
|
data.reinject = true;
|
||||||
|
if (msk->sched == &mptcp_sched_default || !msk->sched)
|
||||||
|
return mptcp_sched_default_get_subflow(msk, &data);
|
||||||
|
+ mptcp_sched_data_set_contexts(msk, &data);
|
||||||
|
return msk->sched->get_subflow(msk, &data);
|
||||||
|
}
|
||||||
|
From 229208a99e76be925541e898fd9a272984b5958c Mon Sep 17 00:00:00 2001
|
||||||
|
From: Geliang Tang <geliang.tang@suse.com>
|
||||||
|
Date: Tue, 19 Dec 2023 13:28:00 +0100
|
||||||
|
Subject: [PATCH] bpf: Add bpf_mptcp_sched_ops
|
||||||
|
|
||||||
|
This patch implements a new struct bpf_struct_ops: bpf_mptcp_sched_ops.
|
||||||
|
Register and unregister the bpf scheduler in .reg and .unreg.
|
||||||
|
|
||||||
|
Add write access for the scheduled flag of struct mptcp_subflow_context
|
||||||
|
in .btf_struct_access.
|
||||||
|
|
||||||
|
This MPTCP BPF scheduler implementation is similar to BPF TCP CC. And
|
||||||
|
net/ipv4/bpf_tcp_ca.c is a frame of reference for this patch.
|
||||||
|
|
||||||
|
Acked-by: Paolo Abeni <pabeni@redhat.com>
|
||||||
|
Reviewed-by: Mat Martineau <martineau@kernel.org>
|
||||||
|
Co-developed-by: Matthieu Baerts <matttbe@kernel.org>
|
||||||
|
Signed-off-by: Matthieu Baerts <matttbe@kernel.org>
|
||||||
|
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
|
||||||
|
---
|
||||||
|
kernel/bpf/bpf_struct_ops_types.h | 4 +
|
||||||
|
net/mptcp/bpf.c | 146 ++++++++++++++++++++++++++++++
|
||||||
|
2 files changed, 150 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/kernel/bpf/bpf_struct_ops_types.h b/kernel/bpf/bpf_struct_ops_types.h
|
||||||
|
index 5678a9ddf8178..5a6b0c0d8d3db 100644
|
||||||
|
--- a/kernel/bpf/bpf_struct_ops_types.h
|
||||||
|
+++ b/kernel/bpf/bpf_struct_ops_types.h
|
||||||
|
@@ -8,5 +8,9 @@ BPF_STRUCT_OPS_TYPE(bpf_dummy_ops)
|
||||||
|
#ifdef CONFIG_INET
|
||||||
|
#include <net/tcp.h>
|
||||||
|
BPF_STRUCT_OPS_TYPE(tcp_congestion_ops)
|
||||||
|
+#ifdef CONFIG_MPTCP
|
||||||
|
+#include <net/mptcp.h>
|
||||||
|
+BPF_STRUCT_OPS_TYPE(mptcp_sched_ops)
|
||||||
|
+#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
|
||||||
|
index c3d62535eb0cf..dfcaaf0e07dd5 100644
|
||||||
|
--- a/net/mptcp/bpf.c
|
||||||
|
+++ b/net/mptcp/bpf.c
|
||||||
|
@@ -10,8 +10,153 @@
|
||||||
|
#define pr_fmt(fmt) "MPTCP: " fmt
|
||||||
|
|
||||||
|
#include <linux/bpf.h>
|
||||||
|
+#include <linux/bpf_verifier.h>
|
||||||
|
+#include <linux/btf.h>
|
||||||
|
+#include <linux/btf_ids.h>
|
||||||
|
+#include <net/bpf_sk_storage.h>
|
||||||
|
#include "protocol.h"
|
||||||
|
|
||||||
|
+#ifdef CONFIG_BPF_JIT
|
||||||
|
+extern struct bpf_struct_ops bpf_mptcp_sched_ops;
|
||||||
|
+static const struct btf_type *mptcp_sock_type, *mptcp_subflow_type __read_mostly;
|
||||||
|
+static u32 mptcp_sock_id, mptcp_subflow_id;
|
||||||
|
+
|
||||||
|
+static const struct bpf_func_proto *
|
||||||
|
+bpf_mptcp_sched_get_func_proto(enum bpf_func_id func_id, const struct bpf_prog *prog)
|
||||||
|
+{
|
||||||
|
+ switch (func_id) {
|
||||||
|
+ case BPF_FUNC_sk_storage_get:
|
||||||
|
+ return &bpf_sk_storage_get_proto;
|
||||||
|
+ case BPF_FUNC_sk_storage_delete:
|
||||||
|
+ return &bpf_sk_storage_delete_proto;
|
||||||
|
+ case BPF_FUNC_skc_to_tcp6_sock:
|
||||||
|
+ return &bpf_skc_to_tcp6_sock_proto;
|
||||||
|
+ case BPF_FUNC_skc_to_tcp_sock:
|
||||||
|
+ return &bpf_skc_to_tcp_sock_proto;
|
||||||
|
+ default:
|
||||||
|
+ return bpf_base_func_proto(func_id);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int bpf_mptcp_sched_btf_struct_access(struct bpf_verifier_log *log,
|
||||||
|
+ const struct bpf_reg_state *reg,
|
||||||
|
+ int off, int size)
|
||||||
|
+{
|
||||||
|
+ const struct btf_type *t;
|
||||||
|
+ size_t end;
|
||||||
|
+
|
||||||
|
+ t = btf_type_by_id(reg->btf, reg->btf_id);
|
||||||
|
+ if (t != mptcp_sock_type && t != mptcp_subflow_type) {
|
||||||
|
+ bpf_log(log, "only access to mptcp sock or subflow is supported\n");
|
||||||
|
+ return -EACCES;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ switch (off) {
|
||||||
|
+ case offsetof(struct mptcp_sock, snd_burst):
|
||||||
|
+ end = offsetofend(struct mptcp_sock, snd_burst);
|
||||||
|
+ break;
|
||||||
|
+ case offsetof(struct mptcp_subflow_context, scheduled):
|
||||||
|
+ end = offsetofend(struct mptcp_subflow_context, scheduled);
|
||||||
|
+ break;
|
||||||
|
+ case offsetof(struct mptcp_subflow_context, avg_pacing_rate):
|
||||||
|
+ end = offsetofend(struct mptcp_subflow_context, avg_pacing_rate);
|
||||||
|
+ break;
|
||||||
|
+ default:
|
||||||
|
+ bpf_log(log, "no write support to %s at off %d\n",
|
||||||
|
+ t == mptcp_sock_type ? "mptcp_sock" : "mptcp_subflow_context", off);
|
||||||
|
+ return -EACCES;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (off + size > end) {
|
||||||
|
+ bpf_log(log, "access beyond %s at off %u size %u ended at %zu",
|
||||||
|
+ t == mptcp_sock_type ? "mptcp_sock" : "mptcp_subflow_context",
|
||||||
|
+ off, size, end);
|
||||||
|
+ return -EACCES;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return NOT_INIT;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct bpf_verifier_ops bpf_mptcp_sched_verifier_ops = {
|
||||||
|
+ .get_func_proto = bpf_mptcp_sched_get_func_proto,
|
||||||
|
+ .is_valid_access = bpf_tracing_btf_ctx_access,
|
||||||
|
+ .btf_struct_access = bpf_mptcp_sched_btf_struct_access,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int bpf_mptcp_sched_reg(void *kdata)
|
||||||
|
+{
|
||||||
|
+ return mptcp_register_scheduler(kdata);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void bpf_mptcp_sched_unreg(void *kdata)
|
||||||
|
+{
|
||||||
|
+ mptcp_unregister_scheduler(kdata);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int bpf_mptcp_sched_check_member(const struct btf_type *t,
|
||||||
|
+ const struct btf_member *member,
|
||||||
|
+ const struct bpf_prog *prog)
|
||||||
|
+{
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int bpf_mptcp_sched_init_member(const struct btf_type *t,
|
||||||
|
+ const struct btf_member *member,
|
||||||
|
+ void *kdata, const void *udata)
|
||||||
|
+{
|
||||||
|
+ const struct mptcp_sched_ops *usched;
|
||||||
|
+ struct mptcp_sched_ops *sched;
|
||||||
|
+ u32 moff;
|
||||||
|
+
|
||||||
|
+ usched = (const struct mptcp_sched_ops *)udata;
|
||||||
|
+ sched = (struct mptcp_sched_ops *)kdata;
|
||||||
|
+
|
||||||
|
+ moff = __btf_member_bit_offset(t, member) / 8;
|
||||||
|
+ switch (moff) {
|
||||||
|
+ case offsetof(struct mptcp_sched_ops, name):
|
||||||
|
+ if (bpf_obj_name_cpy(sched->name, usched->name,
|
||||||
|
+ sizeof(sched->name)) <= 0)
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ if (mptcp_sched_find(usched->name))
|
||||||
|
+ return -EEXIST;
|
||||||
|
+ return 1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int bpf_mptcp_sched_init(struct btf *btf)
|
||||||
|
+{
|
||||||
|
+ s32 type_id;
|
||||||
|
+
|
||||||
|
+ type_id = btf_find_by_name_kind(btf, "mptcp_sock",
|
||||||
|
+ BTF_KIND_STRUCT);
|
||||||
|
+ if (type_id < 0)
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ mptcp_sock_id = type_id;
|
||||||
|
+ mptcp_sock_type = btf_type_by_id(btf, mptcp_sock_id);
|
||||||
|
+
|
||||||
|
+ type_id = btf_find_by_name_kind(btf, "mptcp_subflow_context",
|
||||||
|
+ BTF_KIND_STRUCT);
|
||||||
|
+ if (type_id < 0)
|
||||||
|
+ return -EINVAL;
|
||||||
|
+ mptcp_subflow_id = type_id;
|
||||||
|
+ mptcp_subflow_type = btf_type_by_id(btf, mptcp_subflow_id);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+struct bpf_struct_ops bpf_mptcp_sched_ops = {
|
||||||
|
+ .verifier_ops = &bpf_mptcp_sched_verifier_ops,
|
||||||
|
+ .reg = bpf_mptcp_sched_reg,
|
||||||
|
+ .unreg = bpf_mptcp_sched_unreg,
|
||||||
|
+ .check_member = bpf_mptcp_sched_check_member,
|
||||||
|
+ .init_member = bpf_mptcp_sched_init_member,
|
||||||
|
+ .init = bpf_mptcp_sched_init,
|
||||||
|
+ .name = "mptcp_sched_ops",
|
||||||
|
+};
|
||||||
|
+#endif /* CONFIG_BPF_JIT */
|
||||||
|
+
|
||||||
|
struct mptcp_sock *bpf_mptcp_sock_from_subflow(struct sock *sk)
|
||||||
|
{
|
||||||
|
if (sk && sk_fullsock(sk) && sk->sk_protocol == IPPROTO_TCP && sk_is_mptcp(sk))
|
||||||
|
From c128adc086aa390e8dba43bcad604fe223e50bf4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Geliang Tang <geliang.tang@suse.com>
|
||||||
|
Date: Tue, 19 Dec 2023 13:28:01 +0100
|
||||||
|
Subject: [PATCH] bpf: Add bpf_mptcp_sched_kfunc_set
|
||||||
|
|
||||||
|
This patch adds a new struct btf_kfunc_id_set for MPTCP scheduler. Add
|
||||||
|
mptcp_subflow_set_scheduled() and mptcp_sched_data_set_contexts() helpers
|
||||||
|
into this id_set, and register it in bpf_mptcp_kfunc_init() to make sure
|
||||||
|
these helpers can be accessed from the BPF context.
|
||||||
|
|
||||||
|
Reviewed-by: Mat Martineau <martineau@kernel.org>
|
||||||
|
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
|
||||||
|
---
|
||||||
|
net/mptcp/bpf.c | 16 +++++++++++++++-
|
||||||
|
1 file changed, 15 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
|
||||||
|
index dfcaaf0e07dd..aec9515888f7 100644
|
||||||
|
--- a/net/mptcp/bpf.c
|
||||||
|
+++ b/net/mptcp/bpf.c
|
||||||
|
@@ -189,8 +189,22 @@ bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int p
|
||||||
|
|
||||||
|
__diag_pop();
|
||||||
|
|
||||||
|
+BTF_SET8_START(bpf_mptcp_sched_kfunc_ids)
|
||||||
|
+BTF_ID_FLAGS(func, mptcp_subflow_set_scheduled)
|
||||||
|
+BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx_by_pos)
|
||||||
|
+BTF_SET8_END(bpf_mptcp_sched_kfunc_ids)
|
||||||
|
+
|
||||||
|
+static const struct btf_kfunc_id_set bpf_mptcp_sched_kfunc_set = {
|
||||||
|
+ .owner = THIS_MODULE,
|
||||||
|
+ .set = &bpf_mptcp_sched_kfunc_ids,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static int __init bpf_mptcp_kfunc_init(void)
|
||||||
|
{
|
||||||
|
- return register_btf_fmodret_id_set(&bpf_mptcp_fmodret_set);
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ ret = register_btf_fmodret_id_set(&bpf_mptcp_fmodret_set);
|
||||||
|
+ return ret ?: register_btf_kfunc_id_set(BPF_PROG_TYPE_STRUCT_OPS,
|
||||||
|
+ &bpf_mptcp_sched_kfunc_set);
|
||||||
|
}
|
||||||
|
late_initcall(bpf_mptcp_kfunc_init);
|
||||||
|
From f322294a8f32ddf7e40021d94c19665c302dbd79 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Geliang Tang <geliang.tang@suse.com>
|
||||||
|
Date: Tue, 19 Dec 2023 13:28:12 +0100
|
||||||
|
Subject: [PATCH] bpf: Export more bpf_burst related functions
|
||||||
|
|
||||||
|
sk_stream_memory_free() and tcp_rtx_and_write_queues_empty() are needed
|
||||||
|
to export into the BPF context for bpf_burst scheduler. But these two
|
||||||
|
functions are inline ones. So this patch added two wrappers for them,
|
||||||
|
and export the wrappers in the BPF context.
|
||||||
|
|
||||||
|
Add more bpf_burst related functions into bpf_mptcp_sched_kfunc_set to make
|
||||||
|
sure these helpers can be accessed from the BPF context.
|
||||||
|
|
||||||
|
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
|
||||||
|
Reviewed-by: Mat Martineau <martineau@kernel.org>
|
||||||
|
---
|
||||||
|
net/mptcp/bpf.c | 11 +++++++++++
|
||||||
|
net/mptcp/protocol.c | 4 ++--
|
||||||
|
net/mptcp/protocol.h | 3 +++
|
||||||
|
3 files changed, 16 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/net/mptcp/bpf.c b/net/mptcp/bpf.c
|
||||||
|
index aec9515888f7..007c2034db65 100644
|
||||||
|
--- a/net/mptcp/bpf.c
|
||||||
|
+++ b/net/mptcp/bpf.c
|
||||||
|
@@ -187,11 +187,22 @@ bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int p
|
||||||
|
return data->contexts[pos];
|
||||||
|
}
|
||||||
|
|
||||||
|
+__bpf_kfunc bool bpf_mptcp_subflow_queues_empty(struct sock *sk)
|
||||||
|
+{
|
||||||
|
+ return tcp_rtx_queue_empty(sk);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
__diag_pop();
|
||||||
|
|
||||||
|
BTF_SET8_START(bpf_mptcp_sched_kfunc_ids)
|
||||||
|
BTF_ID_FLAGS(func, mptcp_subflow_set_scheduled)
|
||||||
|
BTF_ID_FLAGS(func, bpf_mptcp_subflow_ctx_by_pos)
|
||||||
|
+BTF_ID_FLAGS(func, mptcp_subflow_active)
|
||||||
|
+BTF_ID_FLAGS(func, mptcp_set_timeout)
|
||||||
|
+BTF_ID_FLAGS(func, mptcp_wnd_end)
|
||||||
|
+BTF_ID_FLAGS(func, tcp_stream_memory_free)
|
||||||
|
+BTF_ID_FLAGS(func, bpf_mptcp_subflow_queues_empty)
|
||||||
|
+BTF_ID_FLAGS(func, mptcp_pm_subflow_chk_stale)
|
||||||
|
BTF_SET8_END(bpf_mptcp_sched_kfunc_ids)
|
||||||
|
|
||||||
|
static const struct btf_kfunc_id_set bpf_mptcp_sched_kfunc_set = {
|
||||||
|
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
|
||||||
|
index 8bfd266f2754..c12bf17691d7 100644
|
||||||
|
--- a/net/mptcp/protocol.c
|
||||||
|
+++ b/net/mptcp/protocol.c
|
||||||
|
@@ -50,7 +50,7 @@ DEFINE_PER_CPU(struct mptcp_delegated_action, mptcp_delegated_actions);
|
||||||
|
static struct net_device mptcp_napi_dev;
|
||||||
|
|
||||||
|
/* Returns end sequence number of the receiver's advertised window */
|
||||||
|
-static u64 mptcp_wnd_end(const struct mptcp_sock *msk)
|
||||||
|
+u64 mptcp_wnd_end(const struct mptcp_sock *msk)
|
||||||
|
{
|
||||||
|
return READ_ONCE(msk->wnd_end);
|
||||||
|
}
|
||||||
|
@@ -485,7 +485,7 @@ static long mptcp_timeout_from_subflow(const struct mptcp_subflow_context *subfl
|
||||||
|
inet_csk(ssk)->icsk_timeout - jiffies : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void mptcp_set_timeout(struct sock *sk)
|
||||||
|
+void mptcp_set_timeout(struct sock *sk)
|
||||||
|
{
|
||||||
|
struct mptcp_subflow_context *subflow;
|
||||||
|
long tout = 0;
|
||||||
|
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
|
||||||
|
index 7cf5d2de7441..f7b9c1b995df 100644
|
||||||
|
--- a/net/mptcp/protocol.h
|
||||||
|
+++ b/net/mptcp/protocol.h
|
||||||
|
@@ -636,6 +636,9 @@ void __mptcp_subflow_send_ack(struct sock *ssk);
|
||||||
|
void mptcp_subflow_reset(struct sock *ssk);
|
||||||
|
void mptcp_subflow_queue_clean(struct sock *sk, struct sock *ssk);
|
||||||
|
void mptcp_sock_graft(struct sock *sk, struct socket *parent);
|
||||||
|
+u64 mptcp_wnd_end(const struct mptcp_sock *msk);
|
||||||
|
+void mptcp_set_timeout(struct sock *sk);
|
||||||
|
+bool bpf_mptcp_subflow_queues_empty(struct sock *sk);
|
||||||
|
struct mptcp_subflow_context *
|
||||||
|
bpf_mptcp_subflow_ctx_by_pos(const struct mptcp_sched_data *data, unsigned int pos);
|
||||||
|
struct sock *__mptcp_nmpc_sk(struct mptcp_sock *msk);
|
Loading…
Reference in a new issue