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