android_kernel_sony_sdm845/kernel
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Lawrence Brakmo 0702ed9179 BACKPORT: bpf: BPF support for sock_ops
Created a new BPF program type, BPF_PROG_TYPE_SOCK_OPS, and a corresponding
struct that allows BPF programs of this type to access some of the
socket's fields (such as IP addresses, ports, etc.). It uses the
existing bpf cgroups infrastructure so the programs can be attached per
cgroup with full inheritance support. The program will be called at
appropriate times to set relevant connections parameters such as buffer
sizes, SYN and SYN-ACK RTOs, etc., based on connection information such
as IP addresses, port numbers, etc.

Alghough there are already 3 mechanisms to set parameters (sysctls,
route metrics and setsockopts), this new mechanism provides some
distinct advantages. Unlike sysctls, it can set parameters per
connection. In contrast to route metrics, it can also use port numbers
and information provided by a user level program. In addition, it could
set parameters probabilistically for evaluation purposes (i.e. do
something different on 10% of the flows and compare results with the
other 90% of the flows). Also, in cases where IPv6 addresses contain
geographic information, the rules to make changes based on the distance
(or RTT) between the hosts are much easier than route metric rules and
can be global. Finally, unlike setsockopt, it oes not require
application changes and it can be updated easily at any time.

Although the bpf cgroup framework already contains a sock related
program type (BPF_PROG_TYPE_CGROUP_SOCK), I created the new type
(BPF_PROG_TYPE_SOCK_OPS) beccause the existing type expects to be called
only once during the connections's lifetime. In contrast, the new
program type will be called multiple times from different places in the
network stack code.  For example, before sending SYN and SYN-ACKs to set
an appropriate timeout, when the connection is established to set
congestion control, etc. As a result it has "op" field to specify the
type of operation requested.

The purpose of this new program type is to simplify setting connection
parameters, such as buffer sizes, TCP's SYN RTO, etc. For example, it is
easy to use facebook's internal IPv6 addresses to determine if both hosts
of a connection are in the same datacenter. Therefore, it is easy to
write a BPF program to choose a small SYN RTO value when both hosts are
in the same datacenter.

This patch only contains the framework to support the new BPF program
type, following patches add the functionality to set various connection
parameters.

This patch defines a new BPF program type: BPF_PROG_TYPE_SOCKET_OPS
and a new bpf syscall command to load a new program of this type:
BPF_PROG_LOAD_SOCKET_OPS.

Two new corresponding structs (one for the kernel one for the user/BPF
program):

/* kernel version */
struct bpf_sock_ops_kern {
        struct sock *sk;
        __u32  op;
        union {
                __u32 reply;
                __u32 replylong[4];
        };
};

/* user version
 * Some fields are in network byte order reflecting the sock struct
 * Use the bpf_ntohl helper macro in samples/bpf/bpf_endian.h to
 * convert them to host byte order.
 */
struct bpf_sock_ops {
        __u32 op;
        union {
                __u32 reply;
                __u32 replylong[4];
        };
        __u32 family;
        __u32 remote_ip4;     /* In network byte order */
        __u32 local_ip4;      /* In network byte order */
        __u32 remote_ip6[4];  /* In network byte order */
        __u32 local_ip6[4];   /* In network byte order */
        __u32 remote_port;    /* In network byte order */
        __u32 local_port;     /* In host byte horder */
};

Currently there are two types of ops. The first type expects the BPF
program to return a value which is then used by the caller (or a
negative value to indicate the operation is not supported). The second
type expects state changes to be done by the BPF program, for example
through a setsockopt BPF helper function, and they ignore the return
value.

The reply fields of the bpf_sockt_ops struct are there in case a bpf
program needs to return a value larger than an integer.

Signed-off-by: Lawrence Brakmo <brakmo@fb.com>
Acked-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sorayukii <sorayukii69@gmail.com>
2026-05-15 17:54:53 +07:00
..
bpf BACKPORT: bpf: BPF support for sock_ops 2026-05-15 17:54:53 +07:00
cgroup cgroup: psi: added lacked function 'subsys_cgroup_allow_attach'. 2026-05-15 17:50:47 +07:00
configs
debug UPSTREAM: kdb: use correct pointer when 'btc' calls 'btt' 2022-02-21 16:30:05 +01:00
events UPSTREAM: perf, bpf: Add BPF support to all perf_event types 2026-05-15 17:54:46 +07:00
gcov Merge branch 'android-4.9-q' of https://android.googlesource.com/kernel/common into lineage-20 2023-01-19 15:42:12 +01:00
irq Merge remote-tracking branch 'common/android-4.9-q' into android12-4.9-sdm845 2022-07-18 14:05:31 +03:00
livepatch
locking BACKPORT: rcu: Ports some of RCU's taken from k4.14 2026-05-15 17:49:30 +07:00
power treewide: Backport new vmalloc for large performance benefits 2026-05-15 17:48:25 +07:00
printk Merge remote-tracking branch 'common/android-4.9-q' into android12-4.9-sdm845 2022-06-12 01:39:01 +03:00
rcu rcu: Fix self-wakeups for grace-period kthread 2026-05-15 17:49:36 +07:00
sched cpuset: Remove cpuset_update_active_cpus()'s parameter. 2026-05-15 17:50:33 +07:00
time BACKPORT: rcu: Ports some of RCU's taken from k4.14 2026-05-15 17:49:30 +07:00
trace BACKPORT: bpf: possibly avoid extra masking for narrower load in verifier 2026-05-15 17:54:52 +07:00
.gitignore BACKPORT: Provide in-kernel headers to make extending kernel easier 2019-07-03 14:30:53 -04:00
acct.c acct: fix potential integer overflow in encode_comp_t() 2023-01-07 12:07:31 +01:00
async.c
audit.c Merge branch 'android-4.9-q' of https://android.googlesource.com/kernel/common into lineage-18.1-caf-sdm845 2021-04-26 01:27:02 +03:00
audit.h audit: fix a net reference leak in audit_list_rules_send() 2021-04-07 12:05:41 +02:00
audit_fsnotify.c
audit_tree.c
audit_watch.c audit: CONFIG_CHANGE don't log internal bookkeeping as an event 2020-10-01 20:40:07 +02:00
auditfilter.c audit: fix a net reference leak in audit_list_rules_send() 2021-04-07 12:05:41 +02:00
auditsc.c Merge android-4.9.204(72e8598) into msm-4.9 2020-01-06 18:13:26 +08:00
backtracetest.c
bounds.c kbuild: fix kernel/bounds.c 'W=1' warning 2018-11-13 11:16:57 -08:00
capability.c
cfi.c ANDROID: cfi: Remove unused variable in ptr_to_check_fn 2019-03-06 18:27:16 +00:00
compat.c
configs.c
context_tracking.c
cpu.c rcu: Migrate callbacks earlier in the CPU-offline timeline 2026-05-15 17:49:31 +07:00
cpu_pm.c Merge branch 'android-4.9-q' of https://android.googlesource.com/kernel/common into HEAD 2020-06-30 02:33:58 +03:00
crash_dump.c
cred.c memcg: account security cred as well to kmemcg 2020-01-12 11:24:13 +01:00
delayacct.c BACKPORT: delayacct: track delays from thrashing cache pages 2019-03-22 14:08:39 -07:00
dma.c
exec_domain.c
exit.c cgroup: Call cgroup_release() before __exit_signal() 2026-05-15 17:50:40 +07:00
extable.c BACKPORT: bpf: make jited programs visible in traces 2026-05-15 17:54:30 +07:00
fork.c BACKPORT: cgroup: cgroup v2 freezer 2026-05-15 17:50:46 +07:00
freezer.c
futex.c mm, futex: fix shared futex pgoff on shmem huge page 2021-07-11 12:46:40 +02:00
gen_kheaders.sh BACKPORT: kheaders: Do not regenerate archive if config is not changed 2019-07-03 14:31:16 -04:00
groups.c treewide: Backport new vmalloc for large performance benefits 2026-05-15 17:48:25 +07:00
hung_task.c Merge android-4.9.170 (1ef64da) into msm-4.9 2019-05-30 14:15:13 +08:00
irq_work.c
jump_label.c jump_label: Disable jump labels in __exit code 2021-06-06 18:42:18 +03:00
kallsyms.c BACKPORT: bpf: make jited programs visible in traces 2026-05-15 17:54:30 +07:00
kcmp.c
Kconfig.freezer
Kconfig.hz
Kconfig.locks locking/rwsem: for rwsem prio aware enhancement 2019-01-08 16:14:39 +08:00
Kconfig.preempt
kcov.c This is the 4.9.117 stable release 2018-08-03 08:50:05 +02:00
kexec.c
kexec_core.c treewide: Backport new vmalloc for large performance benefits 2026-05-15 17:48:25 +07:00
kexec_file.c Merge remote-tracking branch 'common/android-4.9-q' into android12-4.9-sdm845 2022-07-18 14:05:31 +03:00
kexec_internal.h
kheaders.c BACKPORT: kheaders: Move from proc to sysfs 2019-07-03 14:31:02 -04:00
kmod.c usermodehelper: reset umask to default before executing user process 2020-10-14 09:48:14 +02:00
kprobes.c This is the 4.9.327 stable release 2022-09-05 14:02:59 +02:00
ksysfs.c
kthread.c Merge branch 'android-4.9-q' of https://android.googlesource.com/kernel/common into lineage-18.1-caf-sdm845 2021-07-22 02:11:11 +03:00
latencytop.c
Makefile cgroup: move cgroup files under kernel/cgroup/ 2026-05-15 17:50:29 +07:00
membarrier.c
memremap.c mm, devm_memremap_pages: kill mapping "System RAM" support 2019-01-13 10:03:51 +01:00
module-internal.h
module.c treewide: Backport new vmalloc for large performance benefits 2026-05-15 17:48:25 +07:00
module_signing.c
notifier.c x86/mm: split vmalloc_sync_all() 2020-04-02 17:20:26 +02:00
nsproxy.c
padata.c padata: purge get_cpu and reorder_via_wq from padata_do_serial 2020-05-27 16:41:53 +02:00
panic.c Merge android-4.9.197(e9766ef) into msm-4.9 2019-12-06 19:41:21 +08:00
params.c
pid.c UPSTREAM: locking/atomic, kref: Add KREF_INIT() 2021-01-05 16:00:48 +00:00
pid_namespace.c memcg: enable accounting for pids in nested pid namespaces 2021-09-22 11:43:08 +02:00
profile.c profiling: fix shift-out-of-bounds bugs 2021-09-26 13:36:18 +02:00
ptrace.c ptrace: Reimplement PTRACE_KILL by always sending SIGKILL 2022-06-14 16:52:28 +02:00
range.c
reboot.c reboot: fix overflow parsing reboot cpu number 2020-11-18 18:26:32 +01:00
relay.c kernel/relay.c: fix memleak on destroy relay channel 2020-08-26 10:29:03 +02:00
resource.c Merge android-4.9.96 (320d53a) into msm-4.9 2018-05-11 05:38:48 -07:00
seccomp.c BACKPORT: bpf: drop unnecessary context cast from BPF_PROG_RUN 2026-05-15 17:54:14 +07:00
signal.c BACKPORT: cgroup: freezer: call cgroup_enter_frozen() with preemption disabled in ptrace_stop() 2026-05-15 17:50:47 +07:00
smp.c Merge remote-tracking branch 'common/android-4.9-q' into android12-4.9-sdm845 2022-06-12 01:39:01 +03:00
smpboot.c sched/walt: Fix the memory leak of idle task load pointers 2018-09-20 19:00:55 +05:30
smpboot.h
softirq.c Mark HI and TASKLET softirq synchronous 2018-08-15 18:14:42 +02:00
stacktrace.c
stop_machine.c stop_machine: Use raw spinlocks 2018-08-03 07:55:24 +02:00
sys.c Merge remote-tracking branch 'common/android-4.9-q' into lineage-18.1-caf-sdm845 2021-10-19 16:05:50 +03:00
sys_ni.c BACKPORT: signal: support CLONE_PIDFD with pidfd_send_signal 2019-09-03 13:44:59 -07:00
sysctl.c Revert "add toggle for disabling newly added USB devices" 2023-03-01 21:14:36 +02:00
sysctl_binary.c
task_work.c
taskstats.c taskstats: fix data-race 2020-01-12 11:24:12 +01:00
test_kprobes.c
torture.c
tracepoint.c tracepoint: Do not fail unregistering a probe due to memory failure 2021-03-03 17:44:38 +01:00
tsacct.c taskstats: Cleanup the use of task->exit_code 2022-02-23 11:56:40 +01:00
ucount.c
uid16.c
up.c
user-return-notifier.c
user.c
user_namespace.c userns: move user access out of the mutex 2018-09-09 20:01:24 +02:00
utsname.c
utsname_sysctl.c sys: don't hold uts_sem while accessing userspace memory 2018-09-09 20:01:24 +02:00
watchdog.c
watchdog_hld.c
workqueue.c rcu: Create RCU-specific workqueues with rescuers 2026-05-15 17:49:31 +07:00
workqueue_internal.h UPSTREAM: psi: fix aggregation idle shut-off 2019-03-22 14:15:01 -07:00