Linux Audio

Check our new training course

Loading...
v6.13.7
 1// SPDX-License-Identifier: GPL-2.0
 2#include <netinet/in.h>
 3#include <linux/bpf.h>
 4#include <bpf/bpf_helpers.h>
 5
 6char _license[] SEC("license") = "GPL";
 
 7
 8__s32 page_size = 0;
 9
10SEC("cgroup/getsockopt")
11int _getsockopt_child(struct bpf_sockopt *ctx)
12{
13	__u8 *optval_end = ctx->optval_end;
14	__u8 *optval = ctx->optval;
15
16	if (ctx->level != SOL_IP || ctx->optname != IP_TOS)
17		goto out;
18
19	if (optval + 1 > optval_end)
20		return 0; /* EPERM, bounds check */
21
22	if (optval[0] != 0x80)
23		return 0; /* EPERM, unexpected optval from the kernel */
24
25	ctx->retval = 0; /* Reset system call return value to zero */
26
27	optval[0] = 0x90;
28	ctx->optlen = 1;
29
30	return 1;
31
32out:
33	/* optval larger than PAGE_SIZE use kernel's buffer. */
34	if (ctx->optlen > page_size)
35		ctx->optlen = 0;
36	return 1;
37}
38
39SEC("cgroup/getsockopt")
40int _getsockopt_parent(struct bpf_sockopt *ctx)
41{
42	__u8 *optval_end = ctx->optval_end;
43	__u8 *optval = ctx->optval;
44
45	if (ctx->level != SOL_IP || ctx->optname != IP_TOS)
46		goto out;
47
48	if (optval + 1 > optval_end)
49		return 0; /* EPERM, bounds check */
50
51	if (optval[0] != 0x90)
52		return 0; /* EPERM, unexpected optval from the kernel */
53
54	ctx->retval = 0; /* Reset system call return value to zero */
55
56	optval[0] = 0xA0;
57	ctx->optlen = 1;
58
59	return 1;
60
61out:
62	/* optval larger than PAGE_SIZE use kernel's buffer. */
63	if (ctx->optlen > page_size)
64		ctx->optlen = 0;
65	return 1;
66}
67
68SEC("cgroup/setsockopt")
69int _setsockopt(struct bpf_sockopt *ctx)
70{
71	__u8 *optval_end = ctx->optval_end;
72	__u8 *optval = ctx->optval;
73
74	if (ctx->level != SOL_IP || ctx->optname != IP_TOS)
75		goto out;
76
77	if (optval + 1 > optval_end)
78		return 0; /* EPERM, bounds check */
79
80	optval[0] += 0x10;
81	ctx->optlen = 1;
82
83	return 1;
84
85out:
86	/* optval larger than PAGE_SIZE use kernel's buffer. */
87	if (ctx->optlen > page_size)
88		ctx->optlen = 0;
89	return 1;
90}
v5.14.15
 1// SPDX-License-Identifier: GPL-2.0
 2#include <netinet/in.h>
 3#include <linux/bpf.h>
 4#include <bpf/bpf_helpers.h>
 5
 6char _license[] SEC("license") = "GPL";
 7__u32 _version SEC("version") = 1;
 8
 9SEC("cgroup/getsockopt/child")
 
 
10int _getsockopt_child(struct bpf_sockopt *ctx)
11{
12	__u8 *optval_end = ctx->optval_end;
13	__u8 *optval = ctx->optval;
14
15	if (ctx->level != SOL_IP || ctx->optname != IP_TOS)
16		return 1;
17
18	if (optval + 1 > optval_end)
19		return 0; /* EPERM, bounds check */
20
21	if (optval[0] != 0x80)
22		return 0; /* EPERM, unexpected optval from the kernel */
23
24	ctx->retval = 0; /* Reset system call return value to zero */
25
26	optval[0] = 0x90;
27	ctx->optlen = 1;
28
29	return 1;
 
 
 
 
 
 
30}
31
32SEC("cgroup/getsockopt/parent")
33int _getsockopt_parent(struct bpf_sockopt *ctx)
34{
35	__u8 *optval_end = ctx->optval_end;
36	__u8 *optval = ctx->optval;
37
38	if (ctx->level != SOL_IP || ctx->optname != IP_TOS)
39		return 1;
40
41	if (optval + 1 > optval_end)
42		return 0; /* EPERM, bounds check */
43
44	if (optval[0] != 0x90)
45		return 0; /* EPERM, unexpected optval from the kernel */
46
47	ctx->retval = 0; /* Reset system call return value to zero */
48
49	optval[0] = 0xA0;
50	ctx->optlen = 1;
51
52	return 1;
 
 
 
 
 
 
53}
54
55SEC("cgroup/setsockopt")
56int _setsockopt(struct bpf_sockopt *ctx)
57{
58	__u8 *optval_end = ctx->optval_end;
59	__u8 *optval = ctx->optval;
60
61	if (ctx->level != SOL_IP || ctx->optname != IP_TOS)
62		return 1;
63
64	if (optval + 1 > optval_end)
65		return 0; /* EPERM, bounds check */
66
67	optval[0] += 0x10;
68	ctx->optlen = 1;
69
 
 
 
 
 
 
70	return 1;
71}