mirror of
				https://github.com/Ysurac/openmptcprouter.git
				synced 2025-03-09 15:40:20 +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…
	
	Add table
		Add a link
		
	
		Reference in a new issue