brintos

brintos / linux-shallow public Read only

0
0
Text · 2.4 KiB · 623f130 Raw
101 lines · c
1// SPDX-License-Identifier: GPL-2.02 3#include <linux/bpf.h>4#include <stdint.h>5 6#include <bpf/bpf_helpers.h>7#include <bpf/bpf_core_read.h>8 9#include "bpf_misc.h"10 11struct core_reloc_bitfields {12	/* unsigned bitfields */13	uint8_t		ub1: 1;14	uint8_t		ub2: 2;15	uint32_t	ub7: 7;16	/* signed bitfields */17	int8_t		sb4: 4;18	int32_t		sb20: 20;19	/* non-bitfields */20	uint32_t	u32;21	int32_t		s32;22} __attribute__((preserve_access_index));23 24SEC("tc")25__description("single CO-RE bitfield roundtrip")26__btf_path("btf__core_reloc_bitfields.bpf.o")27__success28__retval(3)29int single_field_roundtrip(struct __sk_buff *ctx)30{31	struct core_reloc_bitfields bitfields;32 33	__builtin_memset(&bitfields, 0, sizeof(bitfields));34	BPF_CORE_WRITE_BITFIELD(&bitfields, ub2, 3);35	return BPF_CORE_READ_BITFIELD(&bitfields, ub2);36}37 38SEC("tc")39__description("multiple CO-RE bitfield roundtrip")40__btf_path("btf__core_reloc_bitfields.bpf.o")41__success42__retval(0x3FD)43int multiple_field_roundtrip(struct __sk_buff *ctx)44{45	struct core_reloc_bitfields bitfields;46	uint8_t ub2;47	int8_t sb4;48 49	__builtin_memset(&bitfields, 0, sizeof(bitfields));50	BPF_CORE_WRITE_BITFIELD(&bitfields, ub2, 1);51	BPF_CORE_WRITE_BITFIELD(&bitfields, sb4, -1);52 53	ub2 = BPF_CORE_READ_BITFIELD(&bitfields, ub2);54	sb4 = BPF_CORE_READ_BITFIELD(&bitfields, sb4);55 56	return (((uint8_t)sb4) << 2) | ub2;57}58 59SEC("tc")60__description("adjacent CO-RE bitfield roundtrip")61__btf_path("btf__core_reloc_bitfields.bpf.o")62__success63__retval(7)64int adjacent_field_roundtrip(struct __sk_buff *ctx)65{66	struct core_reloc_bitfields bitfields;67	uint8_t ub1, ub2;68 69	__builtin_memset(&bitfields, 0, sizeof(bitfields));70	BPF_CORE_WRITE_BITFIELD(&bitfields, ub1, 1);71	BPF_CORE_WRITE_BITFIELD(&bitfields, ub2, 3);72 73	ub1 = BPF_CORE_READ_BITFIELD(&bitfields, ub1);74	ub2 = BPF_CORE_READ_BITFIELD(&bitfields, ub2);75 76	return (ub2 << 1) | ub1;77}78 79SEC("tc")80__description("multibyte CO-RE bitfield roundtrip")81__btf_path("btf__core_reloc_bitfields.bpf.o")82__success83__retval(0x21)84int multibyte_field_roundtrip(struct __sk_buff *ctx)85{86	struct core_reloc_bitfields bitfields;87	uint32_t ub7;88	uint8_t ub1;89 90	__builtin_memset(&bitfields, 0, sizeof(bitfields));91	BPF_CORE_WRITE_BITFIELD(&bitfields, ub1, 1);92	BPF_CORE_WRITE_BITFIELD(&bitfields, ub7, 16);93 94	ub1 = BPF_CORE_READ_BITFIELD(&bitfields, ub1);95	ub7 = BPF_CORE_READ_BITFIELD(&bitfields, ub7);96 97	return (ub7 << 1) | ub1;98}99 100char _license[] SEC("license") = "GPL";101