1252190Srpaulo// SPDX-License-Identifier: GPL-2.0
2252190Srpaulo#include "vmlinux.h"
3252190Srpaulo#include <bpf/bpf_helpers.h>
4252190Srpaulo#include <bpf/bpf_tracing.h>
5252190Srpaulo#include <bpf/bpf_core_read.h>
6252190Srpaulo#include "bpf_misc.h"
7252190Srpaulo
8252190Srpaulostatic struct sockaddr_in old;
9252190Srpaulo
10252190Srpaulostatic int handle_sys_connect_common(struct sockaddr_in *uservaddr)
11252190Srpaulo{
12252190Srpaulo	struct sockaddr_in new;
13252190Srpaulo
14252190Srpaulo	bpf_probe_read_user(&old, sizeof(old), uservaddr);
15252190Srpaulo	__builtin_memset(&new, 0xab, sizeof(new));
16252190Srpaulo	bpf_probe_write_user(uservaddr, &new, sizeof(new));
17252190Srpaulo
18252190Srpaulo	return 0;
19252190Srpaulo}
20252190Srpaulo
21252190SrpauloSEC("ksyscall/connect")
22252190Srpauloint BPF_KSYSCALL(handle_sys_connect, int fd, struct sockaddr_in *uservaddr,
23252190Srpaulo		 int addrlen)
24252190Srpaulo{
25252190Srpaulo	return handle_sys_connect_common(uservaddr);
26252190Srpaulo}
27252190Srpaulo
28252190Srpaulo#if defined(bpf_target_s390)
29252190Srpaulo#ifndef SYS_CONNECT
30252190Srpaulo#define SYS_CONNECT 3
31252190Srpaulo#endif
32252190Srpaulo
33252190SrpauloSEC("ksyscall/socketcall")
34252190Srpauloint BPF_KSYSCALL(handle_sys_socketcall, int call, unsigned long *args)
35252190Srpaulo{
36252190Srpaulo	if (call == SYS_CONNECT) {
37252190Srpaulo		struct sockaddr_in *uservaddr;
38252190Srpaulo
39252190Srpaulo		bpf_probe_read_user(&uservaddr, sizeof(uservaddr), &args[1]);
40252190Srpaulo		return handle_sys_connect_common(uservaddr);
41252190Srpaulo	}
42252190Srpaulo
43252190Srpaulo	return 0;
44252190Srpaulo}
45252190Srpaulo#endif
46252190Srpaulo
47252190Srpaulochar _license[] SEC("license") = "GPL";
48252190Srpaulo