-
-
Notifications
You must be signed in to change notification settings - Fork 43
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
selftests/bpf: Add getsockopt to inspect mptcp subflow
This patch adds a "cgroup/getsockopt" way to inspect the subflows of an MPTCP socket, and verify the modifications done by the same BPF program in the previous commit: a different mark per subflow, and a different TCP CC set on the second one. This new hook will be used by the next commit to verify the socket options set on each subflow. This extra "cgroup/getsockopt" prog walks the msk->conn_list and use bpf_core_cast to cast a pointer for readonly. It allows to inspect all the fields of a structure. Note that on the kernel side, the MPTCP socket stores a list of subflows under 'msk->conn_list'. They can be iterated using the generic 'list' helpers. They have been imported here, with a small difference: list_for_each_entry() uses 'can_loop' to limit the number of iterations, and ease its use. Because only data need to be read here, it is enough to use this technique. It is planned to use bpf_iter, when BPF programs will be used to modify data from the different subflows. mptcp_subflow_tcp_sock() and mptcp_for_each_stubflow() helpers have also be imported. Suggested-by: Martin KaFai Lau <[email protected]> Signed-off-by: Geliang Tang <[email protected]> Reviewed-by: Matthieu Baerts (NGI0) <[email protected]> Signed-off-by: Matthieu Baerts (NGI0) <[email protected]> Link: https://lore.kernel.org/r/20240926-upstream-bpf-next-20240506-mptcp-subflow-test-v7-2-d26029e15cdd@kernel.org Signed-off-by: Martin KaFai Lau <[email protected]>
- Loading branch information
Geliang Tang
authored and
Martin KaFai Lau
committed
Oct 1, 2024
1 parent
83752e1
commit cd19b88
Showing
3 changed files
with
112 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ | ||
#ifndef __MPTCP_BPF_H__ | ||
#define __MPTCP_BPF_H__ | ||
|
||
#include "bpf_experimental.h" | ||
|
||
/* list helpers from include/linux/list.h */ | ||
static inline int list_is_head(const struct list_head *list, | ||
const struct list_head *head) | ||
{ | ||
return list == head; | ||
} | ||
|
||
#define list_entry(ptr, type, member) \ | ||
container_of(ptr, type, member) | ||
|
||
#define list_first_entry(ptr, type, member) \ | ||
list_entry((ptr)->next, type, member) | ||
|
||
#define list_next_entry(pos, member) \ | ||
list_entry((pos)->member.next, typeof(*(pos)), member) | ||
|
||
#define list_entry_is_head(pos, head, member) \ | ||
list_is_head(&pos->member, (head)) | ||
|
||
/* small difference: 'can_loop' has been added in the conditions */ | ||
#define list_for_each_entry(pos, head, member) \ | ||
for (pos = list_first_entry(head, typeof(*pos), member); \ | ||
!list_entry_is_head(pos, head, member) && can_loop; \ | ||
pos = list_next_entry(pos, member)) | ||
|
||
/* mptcp helpers from protocol.h */ | ||
#define mptcp_for_each_subflow(__msk, __subflow) \ | ||
list_for_each_entry(__subflow, &((__msk)->conn_list), node) | ||
|
||
static __always_inline struct sock * | ||
mptcp_subflow_tcp_sock(const struct mptcp_subflow_context *subflow) | ||
{ | ||
return subflow->tcp_sock; | ||
} | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters