From: Gang Yan <yangang@kylinos.cn>
The "update_socket_protocol" interface is designed to empower user space
with the capability to customize and modify socket protocols leveraging
BPF methods. Currently, it has only granted the fmod_ret permission,
allowing for modifications to return values. We are extending the
permissions further by 'ALLOW_ERROR_INJECTION', thereby facilitating
the development of user-space programs with enhanced flexibility and
convenience.
When we attempt to modify the return value of "update_socket_protocol"
to "IPPROTO_MPTCP" using the below code based on the BCC tool:
'''
int kprobe__update_socket_protocol(void* ctx)
{
...
bpf_override_return(ctx,IPPROTO_MPTCP);
...
}
'''
But an error occurs:
'''
ioctl(PERF_EVENT_IOC_SET_BPF): Invalid argument
Traceback (most recent call last):
File "/media/yangang/work/Code/BCC/test.py", line 27, in <module>
b = BPF(text=prog)
^^^^^^^^^^^^^^
File "/usr/lib/python3/dist-packages/bcc/__init__.py", line 487, \
in __init__ self._trace_autoload()
File "/usr/lib/python3/dist-packages/bcc/__init__.py", line 1466, \
in _trace_autoload self.attach_kprobe(
File "/usr/lib/python3/dist-packages/bcc/__init__.py", line 855,\
in attach_kprobe
raise Exception("Failed to attach BPF program %s to kprobe %s"
Exception: Failed to attach BPF program b'kprobe__update_socket_protocol' \
to kprobe b'update_socket_protocol', it's not traceable \
(either non-existing, inlined, or marked as "notrace")
'''
This patch can fix the issue.
Suggested-by: Geliang Tang <geliang@kernel.org>
Signed-off-by: Gang Yan <yangang@kylinos.cn>
---
net/socket.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/net/socket.c b/net/socket.c
index fcbdd5bc47ac..63ce1caf75eb 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1695,6 +1695,7 @@ __weak noinline int update_socket_protocol(int family, int type, int protocol)
{
return protocol;
}
+ALLOW_ERROR_INJECTION(update_socket_protocol, ERRNO);
__bpf_hook_end();
--
2.43.0
Hi Gang, Geliang,
On 21/08/2024 04:35, Gang Yan wrote:
> From: Gang Yan <yangang@kylinos.cn>
>
> The "update_socket_protocol" interface is designed to empower user space
> with the capability to customize and modify socket protocols leveraging
> BPF methods. Currently, it has only granted the fmod_ret permission,
> allowing for modifications to return values. We are extending the
> permissions further by 'ALLOW_ERROR_INJECTION', thereby facilitating
> the development of user-space programs with enhanced flexibility and
> convenience.
>
> When we attempt to modify the return value of "update_socket_protocol"
> to "IPPROTO_MPTCP" using the below code based on the BCC tool:
>
> '''
> int kprobe__update_socket_protocol(void* ctx)
> {
> ...
> bpf_override_return(ctx,IPPROTO_MPTCP);
> ...
> }
> '''
>
> But an error occurs:
>
> '''
> ioctl(PERF_EVENT_IOC_SET_BPF): Invalid argument
> Traceback (most recent call last):
> File "/media/yangang/work/Code/BCC/test.py", line 27, in <module>
> b = BPF(text=prog)
> ^^^^^^^^^^^^^^
> File "/usr/lib/python3/dist-packages/bcc/__init__.py", line 487, \
> in __init__ self._trace_autoload()
> File "/usr/lib/python3/dist-packages/bcc/__init__.py", line 1466, \
> in _trace_autoload self.attach_kprobe(
> File "/usr/lib/python3/dist-packages/bcc/__init__.py", line 855,\
> in attach_kprobe
> raise Exception("Failed to attach BPF program %s to kprobe %s"
> Exception: Failed to attach BPF program b'kprobe__update_socket_protocol' \
> to kprobe b'update_socket_protocol', it's not traceable \
> (either non-existing, inlined, or marked as "notrace")
> '''
Thank you for this patch and this explanation!
The modification looks good to me, but this should be accepted by BPF
and netdev maintainers, more than us, I think.
Do you mind sending this directly to netdev with the BPF ML in CC please?
Cheers,
Matt
--
Sponsored by the NGI0 Core fund.
Hi Gang,
Thank you for your modifications, that's great!
Our CI did some validations and here is its report:
- KVM Validation: normal: Success! ✅
- KVM Validation: debug: Success! ✅
- KVM Validation: btf (only bpftest_all): Success! ✅
- Task: https://github.com/multipath-tcp/mptcp_net-next/actions/runs/10482667406
Initiator: Patchew Applier
Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/0757fd384ece
Patchwork: https://patchwork.kernel.org/project/mptcp/list/?series=881543
If there are some issues, you can reproduce them using the same environment as
the one used by the CI thanks to a docker image, e.g.:
$ cd [kernel source code]
$ docker run -v "${PWD}:${PWD}:rw" -w "${PWD}" --privileged --rm -it \
--pull always mptcp/mptcp-upstream-virtme-docker:latest \
auto-normal
For more details:
https://github.com/multipath-tcp/mptcp-upstream-virtme-docker
Please note that despite all the efforts that have been already done to have a
stable tests suite when executed on a public CI like here, it is possible some
reported issues are not due to your modifications. Still, do not hesitate to
help us improve that ;-)
Cheers,
MPTCP GH Action bot
Bot operated by Matthieu Baerts (NGI0 Core)
© 2016 - 2026 Red Hat, Inc.