162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* Converted from tools/testing/selftests/bpf/verifier/sock.c */ 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#include <linux/bpf.h> 562306a36Sopenharmony_ci#include <bpf/bpf_helpers.h> 662306a36Sopenharmony_ci#include "bpf_misc.h" 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#define sizeof_field(TYPE, MEMBER) sizeof((((TYPE *)0)->MEMBER)) 962306a36Sopenharmony_ci#define offsetofend(TYPE, MEMBER) \ 1062306a36Sopenharmony_ci (offsetof(TYPE, MEMBER) + sizeof_field(TYPE, MEMBER)) 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_cistruct { 1362306a36Sopenharmony_ci __uint(type, BPF_MAP_TYPE_REUSEPORT_SOCKARRAY); 1462306a36Sopenharmony_ci __uint(max_entries, 1); 1562306a36Sopenharmony_ci __type(key, __u32); 1662306a36Sopenharmony_ci __type(value, __u64); 1762306a36Sopenharmony_ci} map_reuseport_array SEC(".maps"); 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_cistruct { 2062306a36Sopenharmony_ci __uint(type, BPF_MAP_TYPE_SOCKHASH); 2162306a36Sopenharmony_ci __uint(max_entries, 1); 2262306a36Sopenharmony_ci __type(key, int); 2362306a36Sopenharmony_ci __type(value, int); 2462306a36Sopenharmony_ci} map_sockhash SEC(".maps"); 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_cistruct { 2762306a36Sopenharmony_ci __uint(type, BPF_MAP_TYPE_SOCKMAP); 2862306a36Sopenharmony_ci __uint(max_entries, 1); 2962306a36Sopenharmony_ci __type(key, int); 3062306a36Sopenharmony_ci __type(value, int); 3162306a36Sopenharmony_ci} map_sockmap SEC(".maps"); 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_cistruct { 3462306a36Sopenharmony_ci __uint(type, BPF_MAP_TYPE_XSKMAP); 3562306a36Sopenharmony_ci __uint(max_entries, 1); 3662306a36Sopenharmony_ci __type(key, int); 3762306a36Sopenharmony_ci __type(value, int); 3862306a36Sopenharmony_ci} map_xskmap SEC(".maps"); 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cistruct val { 4162306a36Sopenharmony_ci int cnt; 4262306a36Sopenharmony_ci struct bpf_spin_lock l; 4362306a36Sopenharmony_ci}; 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_cistruct { 4662306a36Sopenharmony_ci __uint(type, BPF_MAP_TYPE_SK_STORAGE); 4762306a36Sopenharmony_ci __uint(max_entries, 0); 4862306a36Sopenharmony_ci __type(key, int); 4962306a36Sopenharmony_ci __type(value, struct val); 5062306a36Sopenharmony_ci __uint(map_flags, BPF_F_NO_PREALLOC); 5162306a36Sopenharmony_ci} sk_storage_map SEC(".maps"); 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ciSEC("cgroup/skb") 5462306a36Sopenharmony_ci__description("skb->sk: no NULL check") 5562306a36Sopenharmony_ci__failure __msg("invalid mem access 'sock_common_or_null'") 5662306a36Sopenharmony_ci__failure_unpriv 5762306a36Sopenharmony_ci__naked void skb_sk_no_null_check(void) 5862306a36Sopenharmony_ci{ 5962306a36Sopenharmony_ci asm volatile (" \ 6062306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 6162306a36Sopenharmony_ci r0 = *(u32*)(r1 + 0); \ 6262306a36Sopenharmony_ci r0 = 0; \ 6362306a36Sopenharmony_ci exit; \ 6462306a36Sopenharmony_ci" : 6562306a36Sopenharmony_ci : __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)) 6662306a36Sopenharmony_ci : __clobber_all); 6762306a36Sopenharmony_ci} 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ciSEC("cgroup/skb") 7062306a36Sopenharmony_ci__description("skb->sk: sk->family [non fullsock field]") 7162306a36Sopenharmony_ci__success __success_unpriv __retval(0) 7262306a36Sopenharmony_ci__naked void sk_family_non_fullsock_field_1(void) 7362306a36Sopenharmony_ci{ 7462306a36Sopenharmony_ci asm volatile (" \ 7562306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 7662306a36Sopenharmony_ci if r1 != 0 goto l0_%=; \ 7762306a36Sopenharmony_ci r0 = 0; \ 7862306a36Sopenharmony_ci exit; \ 7962306a36Sopenharmony_cil0_%=: r0 = *(u32*)(r1 + %[bpf_sock_family]); \ 8062306a36Sopenharmony_ci r0 = 0; \ 8162306a36Sopenharmony_ci exit; \ 8262306a36Sopenharmony_ci" : 8362306a36Sopenharmony_ci : __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)), 8462306a36Sopenharmony_ci __imm_const(bpf_sock_family, offsetof(struct bpf_sock, family)) 8562306a36Sopenharmony_ci : __clobber_all); 8662306a36Sopenharmony_ci} 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ciSEC("cgroup/skb") 8962306a36Sopenharmony_ci__description("skb->sk: sk->type [fullsock field]") 9062306a36Sopenharmony_ci__failure __msg("invalid sock_common access") 9162306a36Sopenharmony_ci__failure_unpriv 9262306a36Sopenharmony_ci__naked void sk_sk_type_fullsock_field_1(void) 9362306a36Sopenharmony_ci{ 9462306a36Sopenharmony_ci asm volatile (" \ 9562306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 9662306a36Sopenharmony_ci if r1 != 0 goto l0_%=; \ 9762306a36Sopenharmony_ci r0 = 0; \ 9862306a36Sopenharmony_ci exit; \ 9962306a36Sopenharmony_cil0_%=: r0 = *(u32*)(r1 + %[bpf_sock_type]); \ 10062306a36Sopenharmony_ci r0 = 0; \ 10162306a36Sopenharmony_ci exit; \ 10262306a36Sopenharmony_ci" : 10362306a36Sopenharmony_ci : __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)), 10462306a36Sopenharmony_ci __imm_const(bpf_sock_type, offsetof(struct bpf_sock, type)) 10562306a36Sopenharmony_ci : __clobber_all); 10662306a36Sopenharmony_ci} 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ciSEC("cgroup/skb") 10962306a36Sopenharmony_ci__description("bpf_sk_fullsock(skb->sk): no !skb->sk check") 11062306a36Sopenharmony_ci__failure __msg("type=sock_common_or_null expected=sock_common") 11162306a36Sopenharmony_ci__failure_unpriv 11262306a36Sopenharmony_ci__naked void sk_no_skb_sk_check_1(void) 11362306a36Sopenharmony_ci{ 11462306a36Sopenharmony_ci asm volatile (" \ 11562306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 11662306a36Sopenharmony_ci call %[bpf_sk_fullsock]; \ 11762306a36Sopenharmony_ci r0 = 0; \ 11862306a36Sopenharmony_ci exit; \ 11962306a36Sopenharmony_ci" : 12062306a36Sopenharmony_ci : __imm(bpf_sk_fullsock), 12162306a36Sopenharmony_ci __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)) 12262306a36Sopenharmony_ci : __clobber_all); 12362306a36Sopenharmony_ci} 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ciSEC("cgroup/skb") 12662306a36Sopenharmony_ci__description("sk_fullsock(skb->sk): no NULL check on ret") 12762306a36Sopenharmony_ci__failure __msg("invalid mem access 'sock_or_null'") 12862306a36Sopenharmony_ci__failure_unpriv 12962306a36Sopenharmony_ci__naked void no_null_check_on_ret_1(void) 13062306a36Sopenharmony_ci{ 13162306a36Sopenharmony_ci asm volatile (" \ 13262306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 13362306a36Sopenharmony_ci if r1 != 0 goto l0_%=; \ 13462306a36Sopenharmony_ci r0 = 0; \ 13562306a36Sopenharmony_ci exit; \ 13662306a36Sopenharmony_cil0_%=: call %[bpf_sk_fullsock]; \ 13762306a36Sopenharmony_ci r0 = *(u32*)(r0 + %[bpf_sock_type]); \ 13862306a36Sopenharmony_ci r0 = 0; \ 13962306a36Sopenharmony_ci exit; \ 14062306a36Sopenharmony_ci" : 14162306a36Sopenharmony_ci : __imm(bpf_sk_fullsock), 14262306a36Sopenharmony_ci __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)), 14362306a36Sopenharmony_ci __imm_const(bpf_sock_type, offsetof(struct bpf_sock, type)) 14462306a36Sopenharmony_ci : __clobber_all); 14562306a36Sopenharmony_ci} 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ciSEC("cgroup/skb") 14862306a36Sopenharmony_ci__description("sk_fullsock(skb->sk): sk->type [fullsock field]") 14962306a36Sopenharmony_ci__success __success_unpriv __retval(0) 15062306a36Sopenharmony_ci__naked void sk_sk_type_fullsock_field_2(void) 15162306a36Sopenharmony_ci{ 15262306a36Sopenharmony_ci asm volatile (" \ 15362306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 15462306a36Sopenharmony_ci if r1 != 0 goto l0_%=; \ 15562306a36Sopenharmony_ci r0 = 0; \ 15662306a36Sopenharmony_ci exit; \ 15762306a36Sopenharmony_cil0_%=: call %[bpf_sk_fullsock]; \ 15862306a36Sopenharmony_ci if r0 != 0 goto l1_%=; \ 15962306a36Sopenharmony_ci r0 = 0; \ 16062306a36Sopenharmony_ci exit; \ 16162306a36Sopenharmony_cil1_%=: r0 = *(u32*)(r0 + %[bpf_sock_type]); \ 16262306a36Sopenharmony_ci r0 = 0; \ 16362306a36Sopenharmony_ci exit; \ 16462306a36Sopenharmony_ci" : 16562306a36Sopenharmony_ci : __imm(bpf_sk_fullsock), 16662306a36Sopenharmony_ci __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)), 16762306a36Sopenharmony_ci __imm_const(bpf_sock_type, offsetof(struct bpf_sock, type)) 16862306a36Sopenharmony_ci : __clobber_all); 16962306a36Sopenharmony_ci} 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ciSEC("cgroup/skb") 17262306a36Sopenharmony_ci__description("sk_fullsock(skb->sk): sk->family [non fullsock field]") 17362306a36Sopenharmony_ci__success __success_unpriv __retval(0) 17462306a36Sopenharmony_ci__naked void sk_family_non_fullsock_field_2(void) 17562306a36Sopenharmony_ci{ 17662306a36Sopenharmony_ci asm volatile (" \ 17762306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 17862306a36Sopenharmony_ci if r1 != 0 goto l0_%=; \ 17962306a36Sopenharmony_ci r0 = 0; \ 18062306a36Sopenharmony_ci exit; \ 18162306a36Sopenharmony_cil0_%=: call %[bpf_sk_fullsock]; \ 18262306a36Sopenharmony_ci if r0 != 0 goto l1_%=; \ 18362306a36Sopenharmony_ci exit; \ 18462306a36Sopenharmony_cil1_%=: r0 = *(u32*)(r0 + %[bpf_sock_family]); \ 18562306a36Sopenharmony_ci r0 = 0; \ 18662306a36Sopenharmony_ci exit; \ 18762306a36Sopenharmony_ci" : 18862306a36Sopenharmony_ci : __imm(bpf_sk_fullsock), 18962306a36Sopenharmony_ci __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)), 19062306a36Sopenharmony_ci __imm_const(bpf_sock_family, offsetof(struct bpf_sock, family)) 19162306a36Sopenharmony_ci : __clobber_all); 19262306a36Sopenharmony_ci} 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ciSEC("cgroup/skb") 19562306a36Sopenharmony_ci__description("sk_fullsock(skb->sk): sk->state [narrow load]") 19662306a36Sopenharmony_ci__success __success_unpriv __retval(0) 19762306a36Sopenharmony_ci__naked void sk_sk_state_narrow_load(void) 19862306a36Sopenharmony_ci{ 19962306a36Sopenharmony_ci asm volatile (" \ 20062306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 20162306a36Sopenharmony_ci if r1 != 0 goto l0_%=; \ 20262306a36Sopenharmony_ci r0 = 0; \ 20362306a36Sopenharmony_ci exit; \ 20462306a36Sopenharmony_cil0_%=: call %[bpf_sk_fullsock]; \ 20562306a36Sopenharmony_ci if r0 != 0 goto l1_%=; \ 20662306a36Sopenharmony_ci r0 = 0; \ 20762306a36Sopenharmony_ci exit; \ 20862306a36Sopenharmony_cil1_%=: r0 = *(u8*)(r0 + %[bpf_sock_state]); \ 20962306a36Sopenharmony_ci r0 = 0; \ 21062306a36Sopenharmony_ci exit; \ 21162306a36Sopenharmony_ci" : 21262306a36Sopenharmony_ci : __imm(bpf_sk_fullsock), 21362306a36Sopenharmony_ci __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)), 21462306a36Sopenharmony_ci __imm_const(bpf_sock_state, offsetof(struct bpf_sock, state)) 21562306a36Sopenharmony_ci : __clobber_all); 21662306a36Sopenharmony_ci} 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ciSEC("cgroup/skb") 21962306a36Sopenharmony_ci__description("sk_fullsock(skb->sk): sk->dst_port [word load] (backward compatibility)") 22062306a36Sopenharmony_ci__success __success_unpriv __retval(0) 22162306a36Sopenharmony_ci__naked void port_word_load_backward_compatibility(void) 22262306a36Sopenharmony_ci{ 22362306a36Sopenharmony_ci asm volatile (" \ 22462306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 22562306a36Sopenharmony_ci if r1 != 0 goto l0_%=; \ 22662306a36Sopenharmony_ci r0 = 0; \ 22762306a36Sopenharmony_ci exit; \ 22862306a36Sopenharmony_cil0_%=: call %[bpf_sk_fullsock]; \ 22962306a36Sopenharmony_ci if r0 != 0 goto l1_%=; \ 23062306a36Sopenharmony_ci r0 = 0; \ 23162306a36Sopenharmony_ci exit; \ 23262306a36Sopenharmony_cil1_%=: r0 = *(u32*)(r0 + %[bpf_sock_dst_port]); \ 23362306a36Sopenharmony_ci r0 = 0; \ 23462306a36Sopenharmony_ci exit; \ 23562306a36Sopenharmony_ci" : 23662306a36Sopenharmony_ci : __imm(bpf_sk_fullsock), 23762306a36Sopenharmony_ci __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)), 23862306a36Sopenharmony_ci __imm_const(bpf_sock_dst_port, offsetof(struct bpf_sock, dst_port)) 23962306a36Sopenharmony_ci : __clobber_all); 24062306a36Sopenharmony_ci} 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ciSEC("cgroup/skb") 24362306a36Sopenharmony_ci__description("sk_fullsock(skb->sk): sk->dst_port [half load]") 24462306a36Sopenharmony_ci__success __success_unpriv __retval(0) 24562306a36Sopenharmony_ci__naked void sk_dst_port_half_load(void) 24662306a36Sopenharmony_ci{ 24762306a36Sopenharmony_ci asm volatile (" \ 24862306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 24962306a36Sopenharmony_ci if r1 != 0 goto l0_%=; \ 25062306a36Sopenharmony_ci r0 = 0; \ 25162306a36Sopenharmony_ci exit; \ 25262306a36Sopenharmony_cil0_%=: call %[bpf_sk_fullsock]; \ 25362306a36Sopenharmony_ci if r0 != 0 goto l1_%=; \ 25462306a36Sopenharmony_ci r0 = 0; \ 25562306a36Sopenharmony_ci exit; \ 25662306a36Sopenharmony_cil1_%=: r0 = *(u16*)(r0 + %[bpf_sock_dst_port]); \ 25762306a36Sopenharmony_ci r0 = 0; \ 25862306a36Sopenharmony_ci exit; \ 25962306a36Sopenharmony_ci" : 26062306a36Sopenharmony_ci : __imm(bpf_sk_fullsock), 26162306a36Sopenharmony_ci __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)), 26262306a36Sopenharmony_ci __imm_const(bpf_sock_dst_port, offsetof(struct bpf_sock, dst_port)) 26362306a36Sopenharmony_ci : __clobber_all); 26462306a36Sopenharmony_ci} 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_ciSEC("cgroup/skb") 26762306a36Sopenharmony_ci__description("sk_fullsock(skb->sk): sk->dst_port [half load] (invalid)") 26862306a36Sopenharmony_ci__failure __msg("invalid sock access") 26962306a36Sopenharmony_ci__failure_unpriv 27062306a36Sopenharmony_ci__naked void dst_port_half_load_invalid_1(void) 27162306a36Sopenharmony_ci{ 27262306a36Sopenharmony_ci asm volatile (" \ 27362306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 27462306a36Sopenharmony_ci if r1 != 0 goto l0_%=; \ 27562306a36Sopenharmony_ci r0 = 0; \ 27662306a36Sopenharmony_ci exit; \ 27762306a36Sopenharmony_cil0_%=: call %[bpf_sk_fullsock]; \ 27862306a36Sopenharmony_ci if r0 != 0 goto l1_%=; \ 27962306a36Sopenharmony_ci r0 = 0; \ 28062306a36Sopenharmony_ci exit; \ 28162306a36Sopenharmony_cil1_%=: r0 = *(u16*)(r0 + %[__imm_0]); \ 28262306a36Sopenharmony_ci r0 = 0; \ 28362306a36Sopenharmony_ci exit; \ 28462306a36Sopenharmony_ci" : 28562306a36Sopenharmony_ci : __imm(bpf_sk_fullsock), 28662306a36Sopenharmony_ci __imm_const(__imm_0, offsetof(struct bpf_sock, dst_port) + 2), 28762306a36Sopenharmony_ci __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)) 28862306a36Sopenharmony_ci : __clobber_all); 28962306a36Sopenharmony_ci} 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_ciSEC("cgroup/skb") 29262306a36Sopenharmony_ci__description("sk_fullsock(skb->sk): sk->dst_port [byte load]") 29362306a36Sopenharmony_ci__success __success_unpriv __retval(0) 29462306a36Sopenharmony_ci__naked void sk_dst_port_byte_load(void) 29562306a36Sopenharmony_ci{ 29662306a36Sopenharmony_ci asm volatile (" \ 29762306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 29862306a36Sopenharmony_ci if r1 != 0 goto l0_%=; \ 29962306a36Sopenharmony_ci r0 = 0; \ 30062306a36Sopenharmony_ci exit; \ 30162306a36Sopenharmony_cil0_%=: call %[bpf_sk_fullsock]; \ 30262306a36Sopenharmony_ci if r0 != 0 goto l1_%=; \ 30362306a36Sopenharmony_ci r0 = 0; \ 30462306a36Sopenharmony_ci exit; \ 30562306a36Sopenharmony_cil1_%=: r2 = *(u8*)(r0 + %[bpf_sock_dst_port]); \ 30662306a36Sopenharmony_ci r2 = *(u8*)(r0 + %[__imm_0]); \ 30762306a36Sopenharmony_ci r0 = 0; \ 30862306a36Sopenharmony_ci exit; \ 30962306a36Sopenharmony_ci" : 31062306a36Sopenharmony_ci : __imm(bpf_sk_fullsock), 31162306a36Sopenharmony_ci __imm_const(__imm_0, offsetof(struct bpf_sock, dst_port) + 1), 31262306a36Sopenharmony_ci __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)), 31362306a36Sopenharmony_ci __imm_const(bpf_sock_dst_port, offsetof(struct bpf_sock, dst_port)) 31462306a36Sopenharmony_ci : __clobber_all); 31562306a36Sopenharmony_ci} 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ciSEC("cgroup/skb") 31862306a36Sopenharmony_ci__description("sk_fullsock(skb->sk): sk->dst_port [byte load] (invalid)") 31962306a36Sopenharmony_ci__failure __msg("invalid sock access") 32062306a36Sopenharmony_ci__failure_unpriv 32162306a36Sopenharmony_ci__naked void dst_port_byte_load_invalid(void) 32262306a36Sopenharmony_ci{ 32362306a36Sopenharmony_ci asm volatile (" \ 32462306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 32562306a36Sopenharmony_ci if r1 != 0 goto l0_%=; \ 32662306a36Sopenharmony_ci r0 = 0; \ 32762306a36Sopenharmony_ci exit; \ 32862306a36Sopenharmony_cil0_%=: call %[bpf_sk_fullsock]; \ 32962306a36Sopenharmony_ci if r0 != 0 goto l1_%=; \ 33062306a36Sopenharmony_ci r0 = 0; \ 33162306a36Sopenharmony_ci exit; \ 33262306a36Sopenharmony_cil1_%=: r0 = *(u8*)(r0 + %[__imm_0]); \ 33362306a36Sopenharmony_ci r0 = 0; \ 33462306a36Sopenharmony_ci exit; \ 33562306a36Sopenharmony_ci" : 33662306a36Sopenharmony_ci : __imm(bpf_sk_fullsock), 33762306a36Sopenharmony_ci __imm_const(__imm_0, offsetof(struct bpf_sock, dst_port) + 2), 33862306a36Sopenharmony_ci __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)) 33962306a36Sopenharmony_ci : __clobber_all); 34062306a36Sopenharmony_ci} 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_ciSEC("cgroup/skb") 34362306a36Sopenharmony_ci__description("sk_fullsock(skb->sk): past sk->dst_port [half load] (invalid)") 34462306a36Sopenharmony_ci__failure __msg("invalid sock access") 34562306a36Sopenharmony_ci__failure_unpriv 34662306a36Sopenharmony_ci__naked void dst_port_half_load_invalid_2(void) 34762306a36Sopenharmony_ci{ 34862306a36Sopenharmony_ci asm volatile (" \ 34962306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 35062306a36Sopenharmony_ci if r1 != 0 goto l0_%=; \ 35162306a36Sopenharmony_ci r0 = 0; \ 35262306a36Sopenharmony_ci exit; \ 35362306a36Sopenharmony_cil0_%=: call %[bpf_sk_fullsock]; \ 35462306a36Sopenharmony_ci if r0 != 0 goto l1_%=; \ 35562306a36Sopenharmony_ci r0 = 0; \ 35662306a36Sopenharmony_ci exit; \ 35762306a36Sopenharmony_cil1_%=: r0 = *(u16*)(r0 + %[bpf_sock_dst_port__end]); \ 35862306a36Sopenharmony_ci r0 = 0; \ 35962306a36Sopenharmony_ci exit; \ 36062306a36Sopenharmony_ci" : 36162306a36Sopenharmony_ci : __imm(bpf_sk_fullsock), 36262306a36Sopenharmony_ci __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)), 36362306a36Sopenharmony_ci __imm_const(bpf_sock_dst_port__end, offsetofend(struct bpf_sock, dst_port)) 36462306a36Sopenharmony_ci : __clobber_all); 36562306a36Sopenharmony_ci} 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ciSEC("cgroup/skb") 36862306a36Sopenharmony_ci__description("sk_fullsock(skb->sk): sk->dst_ip6 [load 2nd byte]") 36962306a36Sopenharmony_ci__success __success_unpriv __retval(0) 37062306a36Sopenharmony_ci__naked void dst_ip6_load_2nd_byte(void) 37162306a36Sopenharmony_ci{ 37262306a36Sopenharmony_ci asm volatile (" \ 37362306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 37462306a36Sopenharmony_ci if r1 != 0 goto l0_%=; \ 37562306a36Sopenharmony_ci r0 = 0; \ 37662306a36Sopenharmony_ci exit; \ 37762306a36Sopenharmony_cil0_%=: call %[bpf_sk_fullsock]; \ 37862306a36Sopenharmony_ci if r0 != 0 goto l1_%=; \ 37962306a36Sopenharmony_ci r0 = 0; \ 38062306a36Sopenharmony_ci exit; \ 38162306a36Sopenharmony_cil1_%=: r0 = *(u8*)(r0 + %[__imm_0]); \ 38262306a36Sopenharmony_ci r0 = 0; \ 38362306a36Sopenharmony_ci exit; \ 38462306a36Sopenharmony_ci" : 38562306a36Sopenharmony_ci : __imm(bpf_sk_fullsock), 38662306a36Sopenharmony_ci __imm_const(__imm_0, offsetof(struct bpf_sock, dst_ip6[0]) + 1), 38762306a36Sopenharmony_ci __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)) 38862306a36Sopenharmony_ci : __clobber_all); 38962306a36Sopenharmony_ci} 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_ciSEC("cgroup/skb") 39262306a36Sopenharmony_ci__description("sk_fullsock(skb->sk): sk->type [narrow load]") 39362306a36Sopenharmony_ci__success __success_unpriv __retval(0) 39462306a36Sopenharmony_ci__naked void sk_sk_type_narrow_load(void) 39562306a36Sopenharmony_ci{ 39662306a36Sopenharmony_ci asm volatile (" \ 39762306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 39862306a36Sopenharmony_ci if r1 != 0 goto l0_%=; \ 39962306a36Sopenharmony_ci r0 = 0; \ 40062306a36Sopenharmony_ci exit; \ 40162306a36Sopenharmony_cil0_%=: call %[bpf_sk_fullsock]; \ 40262306a36Sopenharmony_ci if r0 != 0 goto l1_%=; \ 40362306a36Sopenharmony_ci r0 = 0; \ 40462306a36Sopenharmony_ci exit; \ 40562306a36Sopenharmony_cil1_%=: r0 = *(u8*)(r0 + %[bpf_sock_type]); \ 40662306a36Sopenharmony_ci r0 = 0; \ 40762306a36Sopenharmony_ci exit; \ 40862306a36Sopenharmony_ci" : 40962306a36Sopenharmony_ci : __imm(bpf_sk_fullsock), 41062306a36Sopenharmony_ci __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)), 41162306a36Sopenharmony_ci __imm_const(bpf_sock_type, offsetof(struct bpf_sock, type)) 41262306a36Sopenharmony_ci : __clobber_all); 41362306a36Sopenharmony_ci} 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_ciSEC("cgroup/skb") 41662306a36Sopenharmony_ci__description("sk_fullsock(skb->sk): sk->protocol [narrow load]") 41762306a36Sopenharmony_ci__success __success_unpriv __retval(0) 41862306a36Sopenharmony_ci__naked void sk_sk_protocol_narrow_load(void) 41962306a36Sopenharmony_ci{ 42062306a36Sopenharmony_ci asm volatile (" \ 42162306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 42262306a36Sopenharmony_ci if r1 != 0 goto l0_%=; \ 42362306a36Sopenharmony_ci r0 = 0; \ 42462306a36Sopenharmony_ci exit; \ 42562306a36Sopenharmony_cil0_%=: call %[bpf_sk_fullsock]; \ 42662306a36Sopenharmony_ci if r0 != 0 goto l1_%=; \ 42762306a36Sopenharmony_ci r0 = 0; \ 42862306a36Sopenharmony_ci exit; \ 42962306a36Sopenharmony_cil1_%=: r0 = *(u8*)(r0 + %[bpf_sock_protocol]); \ 43062306a36Sopenharmony_ci r0 = 0; \ 43162306a36Sopenharmony_ci exit; \ 43262306a36Sopenharmony_ci" : 43362306a36Sopenharmony_ci : __imm(bpf_sk_fullsock), 43462306a36Sopenharmony_ci __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)), 43562306a36Sopenharmony_ci __imm_const(bpf_sock_protocol, offsetof(struct bpf_sock, protocol)) 43662306a36Sopenharmony_ci : __clobber_all); 43762306a36Sopenharmony_ci} 43862306a36Sopenharmony_ci 43962306a36Sopenharmony_ciSEC("cgroup/skb") 44062306a36Sopenharmony_ci__description("sk_fullsock(skb->sk): beyond last field") 44162306a36Sopenharmony_ci__failure __msg("invalid sock access") 44262306a36Sopenharmony_ci__failure_unpriv 44362306a36Sopenharmony_ci__naked void skb_sk_beyond_last_field_1(void) 44462306a36Sopenharmony_ci{ 44562306a36Sopenharmony_ci asm volatile (" \ 44662306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 44762306a36Sopenharmony_ci if r1 != 0 goto l0_%=; \ 44862306a36Sopenharmony_ci r0 = 0; \ 44962306a36Sopenharmony_ci exit; \ 45062306a36Sopenharmony_cil0_%=: call %[bpf_sk_fullsock]; \ 45162306a36Sopenharmony_ci if r0 != 0 goto l1_%=; \ 45262306a36Sopenharmony_ci r0 = 0; \ 45362306a36Sopenharmony_ci exit; \ 45462306a36Sopenharmony_cil1_%=: r0 = *(u32*)(r0 + %[bpf_sock_rx_queue_mapping__end]);\ 45562306a36Sopenharmony_ci r0 = 0; \ 45662306a36Sopenharmony_ci exit; \ 45762306a36Sopenharmony_ci" : 45862306a36Sopenharmony_ci : __imm(bpf_sk_fullsock), 45962306a36Sopenharmony_ci __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)), 46062306a36Sopenharmony_ci __imm_const(bpf_sock_rx_queue_mapping__end, offsetofend(struct bpf_sock, rx_queue_mapping)) 46162306a36Sopenharmony_ci : __clobber_all); 46262306a36Sopenharmony_ci} 46362306a36Sopenharmony_ci 46462306a36Sopenharmony_ciSEC("cgroup/skb") 46562306a36Sopenharmony_ci__description("bpf_tcp_sock(skb->sk): no !skb->sk check") 46662306a36Sopenharmony_ci__failure __msg("type=sock_common_or_null expected=sock_common") 46762306a36Sopenharmony_ci__failure_unpriv 46862306a36Sopenharmony_ci__naked void sk_no_skb_sk_check_2(void) 46962306a36Sopenharmony_ci{ 47062306a36Sopenharmony_ci asm volatile (" \ 47162306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 47262306a36Sopenharmony_ci call %[bpf_tcp_sock]; \ 47362306a36Sopenharmony_ci r0 = 0; \ 47462306a36Sopenharmony_ci exit; \ 47562306a36Sopenharmony_ci" : 47662306a36Sopenharmony_ci : __imm(bpf_tcp_sock), 47762306a36Sopenharmony_ci __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)) 47862306a36Sopenharmony_ci : __clobber_all); 47962306a36Sopenharmony_ci} 48062306a36Sopenharmony_ci 48162306a36Sopenharmony_ciSEC("cgroup/skb") 48262306a36Sopenharmony_ci__description("bpf_tcp_sock(skb->sk): no NULL check on ret") 48362306a36Sopenharmony_ci__failure __msg("invalid mem access 'tcp_sock_or_null'") 48462306a36Sopenharmony_ci__failure_unpriv 48562306a36Sopenharmony_ci__naked void no_null_check_on_ret_2(void) 48662306a36Sopenharmony_ci{ 48762306a36Sopenharmony_ci asm volatile (" \ 48862306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 48962306a36Sopenharmony_ci if r1 != 0 goto l0_%=; \ 49062306a36Sopenharmony_ci r0 = 0; \ 49162306a36Sopenharmony_ci exit; \ 49262306a36Sopenharmony_cil0_%=: call %[bpf_tcp_sock]; \ 49362306a36Sopenharmony_ci r0 = *(u32*)(r0 + %[bpf_tcp_sock_snd_cwnd]); \ 49462306a36Sopenharmony_ci r0 = 0; \ 49562306a36Sopenharmony_ci exit; \ 49662306a36Sopenharmony_ci" : 49762306a36Sopenharmony_ci : __imm(bpf_tcp_sock), 49862306a36Sopenharmony_ci __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)), 49962306a36Sopenharmony_ci __imm_const(bpf_tcp_sock_snd_cwnd, offsetof(struct bpf_tcp_sock, snd_cwnd)) 50062306a36Sopenharmony_ci : __clobber_all); 50162306a36Sopenharmony_ci} 50262306a36Sopenharmony_ci 50362306a36Sopenharmony_ciSEC("cgroup/skb") 50462306a36Sopenharmony_ci__description("bpf_tcp_sock(skb->sk): tp->snd_cwnd") 50562306a36Sopenharmony_ci__success __success_unpriv __retval(0) 50662306a36Sopenharmony_ci__naked void skb_sk_tp_snd_cwnd_1(void) 50762306a36Sopenharmony_ci{ 50862306a36Sopenharmony_ci asm volatile (" \ 50962306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 51062306a36Sopenharmony_ci if r1 != 0 goto l0_%=; \ 51162306a36Sopenharmony_ci r0 = 0; \ 51262306a36Sopenharmony_ci exit; \ 51362306a36Sopenharmony_cil0_%=: call %[bpf_tcp_sock]; \ 51462306a36Sopenharmony_ci if r0 != 0 goto l1_%=; \ 51562306a36Sopenharmony_ci exit; \ 51662306a36Sopenharmony_cil1_%=: r0 = *(u32*)(r0 + %[bpf_tcp_sock_snd_cwnd]); \ 51762306a36Sopenharmony_ci r0 = 0; \ 51862306a36Sopenharmony_ci exit; \ 51962306a36Sopenharmony_ci" : 52062306a36Sopenharmony_ci : __imm(bpf_tcp_sock), 52162306a36Sopenharmony_ci __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)), 52262306a36Sopenharmony_ci __imm_const(bpf_tcp_sock_snd_cwnd, offsetof(struct bpf_tcp_sock, snd_cwnd)) 52362306a36Sopenharmony_ci : __clobber_all); 52462306a36Sopenharmony_ci} 52562306a36Sopenharmony_ci 52662306a36Sopenharmony_ciSEC("cgroup/skb") 52762306a36Sopenharmony_ci__description("bpf_tcp_sock(skb->sk): tp->bytes_acked") 52862306a36Sopenharmony_ci__success __success_unpriv __retval(0) 52962306a36Sopenharmony_ci__naked void skb_sk_tp_bytes_acked(void) 53062306a36Sopenharmony_ci{ 53162306a36Sopenharmony_ci asm volatile (" \ 53262306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 53362306a36Sopenharmony_ci if r1 != 0 goto l0_%=; \ 53462306a36Sopenharmony_ci r0 = 0; \ 53562306a36Sopenharmony_ci exit; \ 53662306a36Sopenharmony_cil0_%=: call %[bpf_tcp_sock]; \ 53762306a36Sopenharmony_ci if r0 != 0 goto l1_%=; \ 53862306a36Sopenharmony_ci exit; \ 53962306a36Sopenharmony_cil1_%=: r0 = *(u64*)(r0 + %[bpf_tcp_sock_bytes_acked]); \ 54062306a36Sopenharmony_ci r0 = 0; \ 54162306a36Sopenharmony_ci exit; \ 54262306a36Sopenharmony_ci" : 54362306a36Sopenharmony_ci : __imm(bpf_tcp_sock), 54462306a36Sopenharmony_ci __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)), 54562306a36Sopenharmony_ci __imm_const(bpf_tcp_sock_bytes_acked, offsetof(struct bpf_tcp_sock, bytes_acked)) 54662306a36Sopenharmony_ci : __clobber_all); 54762306a36Sopenharmony_ci} 54862306a36Sopenharmony_ci 54962306a36Sopenharmony_ciSEC("cgroup/skb") 55062306a36Sopenharmony_ci__description("bpf_tcp_sock(skb->sk): beyond last field") 55162306a36Sopenharmony_ci__failure __msg("invalid tcp_sock access") 55262306a36Sopenharmony_ci__failure_unpriv 55362306a36Sopenharmony_ci__naked void skb_sk_beyond_last_field_2(void) 55462306a36Sopenharmony_ci{ 55562306a36Sopenharmony_ci asm volatile (" \ 55662306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 55762306a36Sopenharmony_ci if r1 != 0 goto l0_%=; \ 55862306a36Sopenharmony_ci r0 = 0; \ 55962306a36Sopenharmony_ci exit; \ 56062306a36Sopenharmony_cil0_%=: call %[bpf_tcp_sock]; \ 56162306a36Sopenharmony_ci if r0 != 0 goto l1_%=; \ 56262306a36Sopenharmony_ci exit; \ 56362306a36Sopenharmony_cil1_%=: r0 = *(u64*)(r0 + %[bpf_tcp_sock_bytes_acked__end]);\ 56462306a36Sopenharmony_ci r0 = 0; \ 56562306a36Sopenharmony_ci exit; \ 56662306a36Sopenharmony_ci" : 56762306a36Sopenharmony_ci : __imm(bpf_tcp_sock), 56862306a36Sopenharmony_ci __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)), 56962306a36Sopenharmony_ci __imm_const(bpf_tcp_sock_bytes_acked__end, offsetofend(struct bpf_tcp_sock, bytes_acked)) 57062306a36Sopenharmony_ci : __clobber_all); 57162306a36Sopenharmony_ci} 57262306a36Sopenharmony_ci 57362306a36Sopenharmony_ciSEC("cgroup/skb") 57462306a36Sopenharmony_ci__description("bpf_tcp_sock(bpf_sk_fullsock(skb->sk)): tp->snd_cwnd") 57562306a36Sopenharmony_ci__success __success_unpriv __retval(0) 57662306a36Sopenharmony_ci__naked void skb_sk_tp_snd_cwnd_2(void) 57762306a36Sopenharmony_ci{ 57862306a36Sopenharmony_ci asm volatile (" \ 57962306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 58062306a36Sopenharmony_ci if r1 != 0 goto l0_%=; \ 58162306a36Sopenharmony_ci r0 = 0; \ 58262306a36Sopenharmony_ci exit; \ 58362306a36Sopenharmony_cil0_%=: call %[bpf_sk_fullsock]; \ 58462306a36Sopenharmony_ci if r0 != 0 goto l1_%=; \ 58562306a36Sopenharmony_ci exit; \ 58662306a36Sopenharmony_cil1_%=: r1 = r0; \ 58762306a36Sopenharmony_ci call %[bpf_tcp_sock]; \ 58862306a36Sopenharmony_ci if r0 != 0 goto l2_%=; \ 58962306a36Sopenharmony_ci exit; \ 59062306a36Sopenharmony_cil2_%=: r0 = *(u32*)(r0 + %[bpf_tcp_sock_snd_cwnd]); \ 59162306a36Sopenharmony_ci r0 = 0; \ 59262306a36Sopenharmony_ci exit; \ 59362306a36Sopenharmony_ci" : 59462306a36Sopenharmony_ci : __imm(bpf_sk_fullsock), 59562306a36Sopenharmony_ci __imm(bpf_tcp_sock), 59662306a36Sopenharmony_ci __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)), 59762306a36Sopenharmony_ci __imm_const(bpf_tcp_sock_snd_cwnd, offsetof(struct bpf_tcp_sock, snd_cwnd)) 59862306a36Sopenharmony_ci : __clobber_all); 59962306a36Sopenharmony_ci} 60062306a36Sopenharmony_ci 60162306a36Sopenharmony_ciSEC("tc") 60262306a36Sopenharmony_ci__description("bpf_sk_release(skb->sk)") 60362306a36Sopenharmony_ci__failure __msg("R1 must be referenced when passed to release function") 60462306a36Sopenharmony_ci__naked void bpf_sk_release_skb_sk(void) 60562306a36Sopenharmony_ci{ 60662306a36Sopenharmony_ci asm volatile (" \ 60762306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 60862306a36Sopenharmony_ci if r1 == 0 goto l0_%=; \ 60962306a36Sopenharmony_ci call %[bpf_sk_release]; \ 61062306a36Sopenharmony_cil0_%=: r0 = 0; \ 61162306a36Sopenharmony_ci exit; \ 61262306a36Sopenharmony_ci" : 61362306a36Sopenharmony_ci : __imm(bpf_sk_release), 61462306a36Sopenharmony_ci __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)) 61562306a36Sopenharmony_ci : __clobber_all); 61662306a36Sopenharmony_ci} 61762306a36Sopenharmony_ci 61862306a36Sopenharmony_ciSEC("tc") 61962306a36Sopenharmony_ci__description("bpf_sk_release(bpf_sk_fullsock(skb->sk))") 62062306a36Sopenharmony_ci__failure __msg("R1 must be referenced when passed to release function") 62162306a36Sopenharmony_ci__naked void bpf_sk_fullsock_skb_sk(void) 62262306a36Sopenharmony_ci{ 62362306a36Sopenharmony_ci asm volatile (" \ 62462306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 62562306a36Sopenharmony_ci if r1 != 0 goto l0_%=; \ 62662306a36Sopenharmony_ci r0 = 0; \ 62762306a36Sopenharmony_ci exit; \ 62862306a36Sopenharmony_cil0_%=: call %[bpf_sk_fullsock]; \ 62962306a36Sopenharmony_ci if r0 != 0 goto l1_%=; \ 63062306a36Sopenharmony_ci exit; \ 63162306a36Sopenharmony_cil1_%=: r1 = r0; \ 63262306a36Sopenharmony_ci call %[bpf_sk_release]; \ 63362306a36Sopenharmony_ci r0 = 1; \ 63462306a36Sopenharmony_ci exit; \ 63562306a36Sopenharmony_ci" : 63662306a36Sopenharmony_ci : __imm(bpf_sk_fullsock), 63762306a36Sopenharmony_ci __imm(bpf_sk_release), 63862306a36Sopenharmony_ci __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)) 63962306a36Sopenharmony_ci : __clobber_all); 64062306a36Sopenharmony_ci} 64162306a36Sopenharmony_ci 64262306a36Sopenharmony_ciSEC("tc") 64362306a36Sopenharmony_ci__description("bpf_sk_release(bpf_tcp_sock(skb->sk))") 64462306a36Sopenharmony_ci__failure __msg("R1 must be referenced when passed to release function") 64562306a36Sopenharmony_ci__naked void bpf_tcp_sock_skb_sk(void) 64662306a36Sopenharmony_ci{ 64762306a36Sopenharmony_ci asm volatile (" \ 64862306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 64962306a36Sopenharmony_ci if r1 != 0 goto l0_%=; \ 65062306a36Sopenharmony_ci r0 = 0; \ 65162306a36Sopenharmony_ci exit; \ 65262306a36Sopenharmony_cil0_%=: call %[bpf_tcp_sock]; \ 65362306a36Sopenharmony_ci if r0 != 0 goto l1_%=; \ 65462306a36Sopenharmony_ci exit; \ 65562306a36Sopenharmony_cil1_%=: r1 = r0; \ 65662306a36Sopenharmony_ci call %[bpf_sk_release]; \ 65762306a36Sopenharmony_ci r0 = 1; \ 65862306a36Sopenharmony_ci exit; \ 65962306a36Sopenharmony_ci" : 66062306a36Sopenharmony_ci : __imm(bpf_sk_release), 66162306a36Sopenharmony_ci __imm(bpf_tcp_sock), 66262306a36Sopenharmony_ci __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)) 66362306a36Sopenharmony_ci : __clobber_all); 66462306a36Sopenharmony_ci} 66562306a36Sopenharmony_ci 66662306a36Sopenharmony_ciSEC("tc") 66762306a36Sopenharmony_ci__description("sk_storage_get(map, skb->sk, NULL, 0): value == NULL") 66862306a36Sopenharmony_ci__success __retval(0) 66962306a36Sopenharmony_ci__naked void sk_null_0_value_null(void) 67062306a36Sopenharmony_ci{ 67162306a36Sopenharmony_ci asm volatile (" \ 67262306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 67362306a36Sopenharmony_ci if r1 != 0 goto l0_%=; \ 67462306a36Sopenharmony_ci r0 = 0; \ 67562306a36Sopenharmony_ci exit; \ 67662306a36Sopenharmony_cil0_%=: call %[bpf_sk_fullsock]; \ 67762306a36Sopenharmony_ci if r0 != 0 goto l1_%=; \ 67862306a36Sopenharmony_ci r0 = 0; \ 67962306a36Sopenharmony_ci exit; \ 68062306a36Sopenharmony_cil1_%=: r4 = 0; \ 68162306a36Sopenharmony_ci r3 = 0; \ 68262306a36Sopenharmony_ci r2 = r0; \ 68362306a36Sopenharmony_ci r1 = %[sk_storage_map] ll; \ 68462306a36Sopenharmony_ci call %[bpf_sk_storage_get]; \ 68562306a36Sopenharmony_ci r0 = 0; \ 68662306a36Sopenharmony_ci exit; \ 68762306a36Sopenharmony_ci" : 68862306a36Sopenharmony_ci : __imm(bpf_sk_fullsock), 68962306a36Sopenharmony_ci __imm(bpf_sk_storage_get), 69062306a36Sopenharmony_ci __imm_addr(sk_storage_map), 69162306a36Sopenharmony_ci __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)) 69262306a36Sopenharmony_ci : __clobber_all); 69362306a36Sopenharmony_ci} 69462306a36Sopenharmony_ci 69562306a36Sopenharmony_ciSEC("tc") 69662306a36Sopenharmony_ci__description("sk_storage_get(map, skb->sk, 1, 1): value == 1") 69762306a36Sopenharmony_ci__failure __msg("R3 type=scalar expected=fp") 69862306a36Sopenharmony_ci__naked void sk_1_1_value_1(void) 69962306a36Sopenharmony_ci{ 70062306a36Sopenharmony_ci asm volatile (" \ 70162306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 70262306a36Sopenharmony_ci if r1 != 0 goto l0_%=; \ 70362306a36Sopenharmony_ci r0 = 0; \ 70462306a36Sopenharmony_ci exit; \ 70562306a36Sopenharmony_cil0_%=: call %[bpf_sk_fullsock]; \ 70662306a36Sopenharmony_ci if r0 != 0 goto l1_%=; \ 70762306a36Sopenharmony_ci r0 = 0; \ 70862306a36Sopenharmony_ci exit; \ 70962306a36Sopenharmony_cil1_%=: r4 = 1; \ 71062306a36Sopenharmony_ci r3 = 1; \ 71162306a36Sopenharmony_ci r2 = r0; \ 71262306a36Sopenharmony_ci r1 = %[sk_storage_map] ll; \ 71362306a36Sopenharmony_ci call %[bpf_sk_storage_get]; \ 71462306a36Sopenharmony_ci r0 = 0; \ 71562306a36Sopenharmony_ci exit; \ 71662306a36Sopenharmony_ci" : 71762306a36Sopenharmony_ci : __imm(bpf_sk_fullsock), 71862306a36Sopenharmony_ci __imm(bpf_sk_storage_get), 71962306a36Sopenharmony_ci __imm_addr(sk_storage_map), 72062306a36Sopenharmony_ci __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)) 72162306a36Sopenharmony_ci : __clobber_all); 72262306a36Sopenharmony_ci} 72362306a36Sopenharmony_ci 72462306a36Sopenharmony_ciSEC("tc") 72562306a36Sopenharmony_ci__description("sk_storage_get(map, skb->sk, &stack_value, 1): stack_value") 72662306a36Sopenharmony_ci__success __retval(0) 72762306a36Sopenharmony_ci__naked void stack_value_1_stack_value(void) 72862306a36Sopenharmony_ci{ 72962306a36Sopenharmony_ci asm volatile (" \ 73062306a36Sopenharmony_ci r2 = 0; \ 73162306a36Sopenharmony_ci *(u64*)(r10 - 8) = r2; \ 73262306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 73362306a36Sopenharmony_ci if r1 != 0 goto l0_%=; \ 73462306a36Sopenharmony_ci r0 = 0; \ 73562306a36Sopenharmony_ci exit; \ 73662306a36Sopenharmony_cil0_%=: call %[bpf_sk_fullsock]; \ 73762306a36Sopenharmony_ci if r0 != 0 goto l1_%=; \ 73862306a36Sopenharmony_ci r0 = 0; \ 73962306a36Sopenharmony_ci exit; \ 74062306a36Sopenharmony_cil1_%=: r4 = 1; \ 74162306a36Sopenharmony_ci r3 = r10; \ 74262306a36Sopenharmony_ci r3 += -8; \ 74362306a36Sopenharmony_ci r2 = r0; \ 74462306a36Sopenharmony_ci r1 = %[sk_storage_map] ll; \ 74562306a36Sopenharmony_ci call %[bpf_sk_storage_get]; \ 74662306a36Sopenharmony_ci r0 = 0; \ 74762306a36Sopenharmony_ci exit; \ 74862306a36Sopenharmony_ci" : 74962306a36Sopenharmony_ci : __imm(bpf_sk_fullsock), 75062306a36Sopenharmony_ci __imm(bpf_sk_storage_get), 75162306a36Sopenharmony_ci __imm_addr(sk_storage_map), 75262306a36Sopenharmony_ci __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)) 75362306a36Sopenharmony_ci : __clobber_all); 75462306a36Sopenharmony_ci} 75562306a36Sopenharmony_ci 75662306a36Sopenharmony_ciSEC("tc") 75762306a36Sopenharmony_ci__description("bpf_map_lookup_elem(smap, &key)") 75862306a36Sopenharmony_ci__failure __msg("cannot pass map_type 24 into func bpf_map_lookup_elem") 75962306a36Sopenharmony_ci__naked void map_lookup_elem_smap_key(void) 76062306a36Sopenharmony_ci{ 76162306a36Sopenharmony_ci asm volatile (" \ 76262306a36Sopenharmony_ci r1 = 0; \ 76362306a36Sopenharmony_ci *(u32*)(r10 - 4) = r1; \ 76462306a36Sopenharmony_ci r2 = r10; \ 76562306a36Sopenharmony_ci r2 += -4; \ 76662306a36Sopenharmony_ci r1 = %[sk_storage_map] ll; \ 76762306a36Sopenharmony_ci call %[bpf_map_lookup_elem]; \ 76862306a36Sopenharmony_ci r0 = 0; \ 76962306a36Sopenharmony_ci exit; \ 77062306a36Sopenharmony_ci" : 77162306a36Sopenharmony_ci : __imm(bpf_map_lookup_elem), 77262306a36Sopenharmony_ci __imm_addr(sk_storage_map) 77362306a36Sopenharmony_ci : __clobber_all); 77462306a36Sopenharmony_ci} 77562306a36Sopenharmony_ci 77662306a36Sopenharmony_ciSEC("xdp") 77762306a36Sopenharmony_ci__description("bpf_map_lookup_elem(xskmap, &key); xs->queue_id") 77862306a36Sopenharmony_ci__success __retval(0) 77962306a36Sopenharmony_ci__naked void xskmap_key_xs_queue_id(void) 78062306a36Sopenharmony_ci{ 78162306a36Sopenharmony_ci asm volatile (" \ 78262306a36Sopenharmony_ci r1 = 0; \ 78362306a36Sopenharmony_ci *(u32*)(r10 - 8) = r1; \ 78462306a36Sopenharmony_ci r2 = r10; \ 78562306a36Sopenharmony_ci r2 += -8; \ 78662306a36Sopenharmony_ci r1 = %[map_xskmap] ll; \ 78762306a36Sopenharmony_ci call %[bpf_map_lookup_elem]; \ 78862306a36Sopenharmony_ci if r0 != 0 goto l0_%=; \ 78962306a36Sopenharmony_ci exit; \ 79062306a36Sopenharmony_cil0_%=: r0 = *(u32*)(r0 + %[bpf_xdp_sock_queue_id]); \ 79162306a36Sopenharmony_ci r0 = 0; \ 79262306a36Sopenharmony_ci exit; \ 79362306a36Sopenharmony_ci" : 79462306a36Sopenharmony_ci : __imm(bpf_map_lookup_elem), 79562306a36Sopenharmony_ci __imm_addr(map_xskmap), 79662306a36Sopenharmony_ci __imm_const(bpf_xdp_sock_queue_id, offsetof(struct bpf_xdp_sock, queue_id)) 79762306a36Sopenharmony_ci : __clobber_all); 79862306a36Sopenharmony_ci} 79962306a36Sopenharmony_ci 80062306a36Sopenharmony_ciSEC("sk_skb") 80162306a36Sopenharmony_ci__description("bpf_map_lookup_elem(sockmap, &key)") 80262306a36Sopenharmony_ci__failure __msg("Unreleased reference id=2 alloc_insn=6") 80362306a36Sopenharmony_ci__naked void map_lookup_elem_sockmap_key(void) 80462306a36Sopenharmony_ci{ 80562306a36Sopenharmony_ci asm volatile (" \ 80662306a36Sopenharmony_ci r1 = 0; \ 80762306a36Sopenharmony_ci *(u32*)(r10 - 4) = r1; \ 80862306a36Sopenharmony_ci r2 = r10; \ 80962306a36Sopenharmony_ci r2 += -4; \ 81062306a36Sopenharmony_ci r1 = %[map_sockmap] ll; \ 81162306a36Sopenharmony_ci call %[bpf_map_lookup_elem]; \ 81262306a36Sopenharmony_ci r0 = 0; \ 81362306a36Sopenharmony_ci exit; \ 81462306a36Sopenharmony_ci" : 81562306a36Sopenharmony_ci : __imm(bpf_map_lookup_elem), 81662306a36Sopenharmony_ci __imm_addr(map_sockmap) 81762306a36Sopenharmony_ci : __clobber_all); 81862306a36Sopenharmony_ci} 81962306a36Sopenharmony_ci 82062306a36Sopenharmony_ciSEC("sk_skb") 82162306a36Sopenharmony_ci__description("bpf_map_lookup_elem(sockhash, &key)") 82262306a36Sopenharmony_ci__failure __msg("Unreleased reference id=2 alloc_insn=6") 82362306a36Sopenharmony_ci__naked void map_lookup_elem_sockhash_key(void) 82462306a36Sopenharmony_ci{ 82562306a36Sopenharmony_ci asm volatile (" \ 82662306a36Sopenharmony_ci r1 = 0; \ 82762306a36Sopenharmony_ci *(u32*)(r10 - 4) = r1; \ 82862306a36Sopenharmony_ci r2 = r10; \ 82962306a36Sopenharmony_ci r2 += -4; \ 83062306a36Sopenharmony_ci r1 = %[map_sockhash] ll; \ 83162306a36Sopenharmony_ci call %[bpf_map_lookup_elem]; \ 83262306a36Sopenharmony_ci r0 = 0; \ 83362306a36Sopenharmony_ci exit; \ 83462306a36Sopenharmony_ci" : 83562306a36Sopenharmony_ci : __imm(bpf_map_lookup_elem), 83662306a36Sopenharmony_ci __imm_addr(map_sockhash) 83762306a36Sopenharmony_ci : __clobber_all); 83862306a36Sopenharmony_ci} 83962306a36Sopenharmony_ci 84062306a36Sopenharmony_ciSEC("sk_skb") 84162306a36Sopenharmony_ci__description("bpf_map_lookup_elem(sockmap, &key); sk->type [fullsock field]; bpf_sk_release(sk)") 84262306a36Sopenharmony_ci__success 84362306a36Sopenharmony_ci__naked void field_bpf_sk_release_sk_1(void) 84462306a36Sopenharmony_ci{ 84562306a36Sopenharmony_ci asm volatile (" \ 84662306a36Sopenharmony_ci r1 = 0; \ 84762306a36Sopenharmony_ci *(u32*)(r10 - 4) = r1; \ 84862306a36Sopenharmony_ci r2 = r10; \ 84962306a36Sopenharmony_ci r2 += -4; \ 85062306a36Sopenharmony_ci r1 = %[map_sockmap] ll; \ 85162306a36Sopenharmony_ci call %[bpf_map_lookup_elem]; \ 85262306a36Sopenharmony_ci if r0 != 0 goto l0_%=; \ 85362306a36Sopenharmony_ci exit; \ 85462306a36Sopenharmony_cil0_%=: r1 = r0; \ 85562306a36Sopenharmony_ci r0 = *(u32*)(r0 + %[bpf_sock_type]); \ 85662306a36Sopenharmony_ci call %[bpf_sk_release]; \ 85762306a36Sopenharmony_ci exit; \ 85862306a36Sopenharmony_ci" : 85962306a36Sopenharmony_ci : __imm(bpf_map_lookup_elem), 86062306a36Sopenharmony_ci __imm(bpf_sk_release), 86162306a36Sopenharmony_ci __imm_addr(map_sockmap), 86262306a36Sopenharmony_ci __imm_const(bpf_sock_type, offsetof(struct bpf_sock, type)) 86362306a36Sopenharmony_ci : __clobber_all); 86462306a36Sopenharmony_ci} 86562306a36Sopenharmony_ci 86662306a36Sopenharmony_ciSEC("sk_skb") 86762306a36Sopenharmony_ci__description("bpf_map_lookup_elem(sockhash, &key); sk->type [fullsock field]; bpf_sk_release(sk)") 86862306a36Sopenharmony_ci__success 86962306a36Sopenharmony_ci__naked void field_bpf_sk_release_sk_2(void) 87062306a36Sopenharmony_ci{ 87162306a36Sopenharmony_ci asm volatile (" \ 87262306a36Sopenharmony_ci r1 = 0; \ 87362306a36Sopenharmony_ci *(u32*)(r10 - 4) = r1; \ 87462306a36Sopenharmony_ci r2 = r10; \ 87562306a36Sopenharmony_ci r2 += -4; \ 87662306a36Sopenharmony_ci r1 = %[map_sockhash] ll; \ 87762306a36Sopenharmony_ci call %[bpf_map_lookup_elem]; \ 87862306a36Sopenharmony_ci if r0 != 0 goto l0_%=; \ 87962306a36Sopenharmony_ci exit; \ 88062306a36Sopenharmony_cil0_%=: r1 = r0; \ 88162306a36Sopenharmony_ci r0 = *(u32*)(r0 + %[bpf_sock_type]); \ 88262306a36Sopenharmony_ci call %[bpf_sk_release]; \ 88362306a36Sopenharmony_ci exit; \ 88462306a36Sopenharmony_ci" : 88562306a36Sopenharmony_ci : __imm(bpf_map_lookup_elem), 88662306a36Sopenharmony_ci __imm(bpf_sk_release), 88762306a36Sopenharmony_ci __imm_addr(map_sockhash), 88862306a36Sopenharmony_ci __imm_const(bpf_sock_type, offsetof(struct bpf_sock, type)) 88962306a36Sopenharmony_ci : __clobber_all); 89062306a36Sopenharmony_ci} 89162306a36Sopenharmony_ci 89262306a36Sopenharmony_ciSEC("sk_reuseport") 89362306a36Sopenharmony_ci__description("bpf_sk_select_reuseport(ctx, reuseport_array, &key, flags)") 89462306a36Sopenharmony_ci__success 89562306a36Sopenharmony_ci__naked void ctx_reuseport_array_key_flags(void) 89662306a36Sopenharmony_ci{ 89762306a36Sopenharmony_ci asm volatile (" \ 89862306a36Sopenharmony_ci r4 = 0; \ 89962306a36Sopenharmony_ci r2 = 0; \ 90062306a36Sopenharmony_ci *(u32*)(r10 - 4) = r2; \ 90162306a36Sopenharmony_ci r3 = r10; \ 90262306a36Sopenharmony_ci r3 += -4; \ 90362306a36Sopenharmony_ci r2 = %[map_reuseport_array] ll; \ 90462306a36Sopenharmony_ci call %[bpf_sk_select_reuseport]; \ 90562306a36Sopenharmony_ci exit; \ 90662306a36Sopenharmony_ci" : 90762306a36Sopenharmony_ci : __imm(bpf_sk_select_reuseport), 90862306a36Sopenharmony_ci __imm_addr(map_reuseport_array) 90962306a36Sopenharmony_ci : __clobber_all); 91062306a36Sopenharmony_ci} 91162306a36Sopenharmony_ci 91262306a36Sopenharmony_ciSEC("sk_reuseport") 91362306a36Sopenharmony_ci__description("bpf_sk_select_reuseport(ctx, sockmap, &key, flags)") 91462306a36Sopenharmony_ci__success 91562306a36Sopenharmony_ci__naked void reuseport_ctx_sockmap_key_flags(void) 91662306a36Sopenharmony_ci{ 91762306a36Sopenharmony_ci asm volatile (" \ 91862306a36Sopenharmony_ci r4 = 0; \ 91962306a36Sopenharmony_ci r2 = 0; \ 92062306a36Sopenharmony_ci *(u32*)(r10 - 4) = r2; \ 92162306a36Sopenharmony_ci r3 = r10; \ 92262306a36Sopenharmony_ci r3 += -4; \ 92362306a36Sopenharmony_ci r2 = %[map_sockmap] ll; \ 92462306a36Sopenharmony_ci call %[bpf_sk_select_reuseport]; \ 92562306a36Sopenharmony_ci exit; \ 92662306a36Sopenharmony_ci" : 92762306a36Sopenharmony_ci : __imm(bpf_sk_select_reuseport), 92862306a36Sopenharmony_ci __imm_addr(map_sockmap) 92962306a36Sopenharmony_ci : __clobber_all); 93062306a36Sopenharmony_ci} 93162306a36Sopenharmony_ci 93262306a36Sopenharmony_ciSEC("sk_reuseport") 93362306a36Sopenharmony_ci__description("bpf_sk_select_reuseport(ctx, sockhash, &key, flags)") 93462306a36Sopenharmony_ci__success 93562306a36Sopenharmony_ci__naked void reuseport_ctx_sockhash_key_flags(void) 93662306a36Sopenharmony_ci{ 93762306a36Sopenharmony_ci asm volatile (" \ 93862306a36Sopenharmony_ci r4 = 0; \ 93962306a36Sopenharmony_ci r2 = 0; \ 94062306a36Sopenharmony_ci *(u32*)(r10 - 4) = r2; \ 94162306a36Sopenharmony_ci r3 = r10; \ 94262306a36Sopenharmony_ci r3 += -4; \ 94362306a36Sopenharmony_ci r2 = %[map_sockmap] ll; \ 94462306a36Sopenharmony_ci call %[bpf_sk_select_reuseport]; \ 94562306a36Sopenharmony_ci exit; \ 94662306a36Sopenharmony_ci" : 94762306a36Sopenharmony_ci : __imm(bpf_sk_select_reuseport), 94862306a36Sopenharmony_ci __imm_addr(map_sockmap) 94962306a36Sopenharmony_ci : __clobber_all); 95062306a36Sopenharmony_ci} 95162306a36Sopenharmony_ci 95262306a36Sopenharmony_ciSEC("tc") 95362306a36Sopenharmony_ci__description("mark null check on return value of bpf_skc_to helpers") 95462306a36Sopenharmony_ci__failure __msg("invalid mem access") 95562306a36Sopenharmony_ci__naked void of_bpf_skc_to_helpers(void) 95662306a36Sopenharmony_ci{ 95762306a36Sopenharmony_ci asm volatile (" \ 95862306a36Sopenharmony_ci r1 = *(u64*)(r1 + %[__sk_buff_sk]); \ 95962306a36Sopenharmony_ci if r1 != 0 goto l0_%=; \ 96062306a36Sopenharmony_ci r0 = 0; \ 96162306a36Sopenharmony_ci exit; \ 96262306a36Sopenharmony_cil0_%=: r6 = r1; \ 96362306a36Sopenharmony_ci call %[bpf_skc_to_tcp_sock]; \ 96462306a36Sopenharmony_ci r7 = r0; \ 96562306a36Sopenharmony_ci r1 = r6; \ 96662306a36Sopenharmony_ci call %[bpf_skc_to_tcp_request_sock]; \ 96762306a36Sopenharmony_ci r8 = r0; \ 96862306a36Sopenharmony_ci if r8 != 0 goto l1_%=; \ 96962306a36Sopenharmony_ci r0 = 0; \ 97062306a36Sopenharmony_ci exit; \ 97162306a36Sopenharmony_cil1_%=: r0 = *(u8*)(r7 + 0); \ 97262306a36Sopenharmony_ci exit; \ 97362306a36Sopenharmony_ci" : 97462306a36Sopenharmony_ci : __imm(bpf_skc_to_tcp_request_sock), 97562306a36Sopenharmony_ci __imm(bpf_skc_to_tcp_sock), 97662306a36Sopenharmony_ci __imm_const(__sk_buff_sk, offsetof(struct __sk_buff, sk)) 97762306a36Sopenharmony_ci : __clobber_all); 97862306a36Sopenharmony_ci} 97962306a36Sopenharmony_ci 98062306a36Sopenharmony_cichar _license[] SEC("license") = "GPL"; 981