1*35749060SStanislav Fomichev // SPDX-License-Identifier: GPL-2.0
2*35749060SStanislav Fomichev 
3*35749060SStanislav Fomichev #include <linux/stddef.h>
4*35749060SStanislav Fomichev #include <linux/bpf.h>
5*35749060SStanislav Fomichev #include <linux/in.h>
6*35749060SStanislav Fomichev #include <sys/socket.h>
7*35749060SStanislav Fomichev 
8*35749060SStanislav Fomichev #include <bpf/bpf_helpers.h>
9*35749060SStanislav Fomichev #include <bpf/bpf_endian.h>
10*35749060SStanislav Fomichev 
11*35749060SStanislav Fomichev #define SERV4_IP		0xc0a801feU /* 192.168.1.254 */
12*35749060SStanislav Fomichev #define SERV4_PORT		4040
13*35749060SStanislav Fomichev 
14*35749060SStanislav Fomichev SEC("cgroup/recvmsg4")
15*35749060SStanislav Fomichev int recvmsg4_prog(struct bpf_sock_addr *ctx)
16*35749060SStanislav Fomichev {
17*35749060SStanislav Fomichev 	struct bpf_sock *sk;
18*35749060SStanislav Fomichev 	__u32 user_ip4;
19*35749060SStanislav Fomichev 	__u16 user_port;
20*35749060SStanislav Fomichev 
21*35749060SStanislav Fomichev 	sk = ctx->sk;
22*35749060SStanislav Fomichev 	if (!sk)
23*35749060SStanislav Fomichev 		return 1;
24*35749060SStanislav Fomichev 
25*35749060SStanislav Fomichev 	if (sk->family != AF_INET)
26*35749060SStanislav Fomichev 		return 1;
27*35749060SStanislav Fomichev 
28*35749060SStanislav Fomichev 	if (ctx->type != SOCK_STREAM && ctx->type != SOCK_DGRAM)
29*35749060SStanislav Fomichev 		return 1;
30*35749060SStanislav Fomichev 
31*35749060SStanislav Fomichev 	ctx->user_ip4 = bpf_htonl(SERV4_IP);
32*35749060SStanislav Fomichev 	ctx->user_port = bpf_htons(SERV4_PORT);
33*35749060SStanislav Fomichev 
34*35749060SStanislav Fomichev 	return 1;
35*35749060SStanislav Fomichev }
36*35749060SStanislav Fomichev 
37*35749060SStanislav Fomichev char _license[] SEC("license") = "GPL";
38