// Copyright The OpenTelemetry Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#define MAX_OS_THREADS 20

//#ifndef __VMLINUX_H__
//#define __VMLINUX_H__
#pragma once
typedef unsigned char __u8;
typedef short int __s16;
typedef short unsigned int __u16;
typedef int __s32;
typedef unsigned int __u32;
typedef long long int __s64;
typedef long long unsigned int __u64;
typedef __u8 u8;
typedef __s16 s16;
typedef __u16 u16;
typedef __s32 s32;
typedef __u32 u32;
typedef __s64 s64;
typedef __u64 u64;
typedef __u16 __le16;
typedef __u16 __be16;
typedef __u32 __be32;
typedef __u64 __be64;
typedef __u32 __wsum;
//
//enum bpf_map_type
//{
//	BPF_MAP_TYPE_UNSPEC = 0,
//	BPF_MAP_TYPE_HASH = 1,
//	BPF_MAP_TYPE_ARRAY = 2,
//	BPF_MAP_TYPE_PROG_ARRAY = 3,
//	BPF_MAP_TYPE_PERF_EVENT_ARRAY = 4,
//	BPF_MAP_TYPE_PERCPU_HASH = 5,
//	BPF_MAP_TYPE_PERCPU_ARRAY = 6,
//	BPF_MAP_TYPE_STACK_TRACE = 7,
//	BPF_MAP_TYPE_CGROUP_ARRAY = 8,
//	BPF_MAP_TYPE_LRU_HASH = 9,
//	BPF_MAP_TYPE_LRU_PERCPU_HASH = 10,
//	BPF_MAP_TYPE_LPM_TRIE = 11,
//	BPF_MAP_TYPE_ARRAY_OF_MAPS = 12,
//	BPF_MAP_TYPE_HASH_OF_MAPS = 13,
//	BPF_MAP_TYPE_DEVMAP = 14,
//	BPF_MAP_TYPE_SOCKMAP = 15,
//	BPF_MAP_TYPE_CPUMAP = 16,
//	BPF_MAP_TYPE_XSKMAP = 17,
//	BPF_MAP_TYPE_SOCKHASH = 18,
//	BPF_MAP_TYPE_CGROUP_STORAGE = 19,
//	BPF_MAP_TYPE_REUSEPORT_SOCKARRAY = 20,
//	BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE = 21,
//	BPF_MAP_TYPE_QUEUE = 22,
//	BPF_MAP_TYPE_STACK = 23,
//	BPF_MAP_TYPE_SK_STORAGE = 24,
//	BPF_MAP_TYPE_DEVMAP_HASH = 25,
//	BPF_MAP_TYPE_STRUCT_OPS = 26,
//	BPF_MAP_TYPE_RINGBUF = 27,
//	BPF_MAP_TYPE_INODE_STORAGE = 28,
//};
//
//enum
//{
//	BPF_ANY = 0,
//	BPF_NOEXIST = 1,
//	BPF_EXIST = 2,
//	BPF_F_LOCK = 4,
//};
//
///* BPF_FUNC_perf_event_output, BPF_FUNC_perf_event_read and
// * BPF_FUNC_perf_event_read_value flags.
// */
//#define BPF_F_INDEX_MASK 0xffffffffULL
//#define BPF_F_CURRENT_CPU BPF_F_INDEX_MASK
//
//#if defined(__TARGET_ARCH_x86)
//struct pt_regs {
//	/*
//	 * C ABI says these regs are callee-preserved. They aren't saved on kernel entry
//	 * unless syscall needs a complete, fully filled "struct pt_regs".
//	 */
//	long unsigned int r15;
//	long unsigned int r14;
//	long unsigned int r13;
//	long unsigned int r12;
//	long unsigned int bp;
//	long unsigned int bx;
//	/* These regs are callee-clobbered. Always saved on kernel entry. */
//	long unsigned int r11;
//	long unsigned int r10;
//	long unsigned int r9;
//	long unsigned int r8;
//	long unsigned int ax;
//	long unsigned int cx;
//	long unsigned int dx;
//	long unsigned int si;
//	long unsigned int di;
//	/*
//	 * On syscall entry, this is syscall#. On CPU exception, this is error code.
//	 * On hw interrupt, it's IRQ number:
//	 */
//	long unsigned int orig_ax;
//	/* Return frame for iretq */
//	long unsigned int ip;
//	long unsigned int cs;
//	long unsigned int flags;
//	long unsigned int sp;
//	long unsigned int ss;
//	/* top of stack page */
//};
//#elif defined(__TARGET_ARCH_arm64)
//struct user_pt_regs {
//	__u64 regs[31];
//	__u64 sp;
//	__u64 pc;
//	__u64 pstate;
//};
//
//struct pt_regs {
//	union {
//		struct user_pt_regs user_regs;
//		struct {
//			u64 regs[31];
//			u64 sp;
//			u64 pc;
//			u64 pstate;
//		};
//	};
//	u64 orig_x0;
//	s32 syscallno;
//	u32 unused2;
//	u64 orig_addr_limit;
//	u64 pmr_save;
//	u64 stackframe[2];
//	u64 lockdep_hardirqs;
//	u64 exit_rcu;
//};
//#endif
//
//#endif /* __VMLINUX_H__ */

struct {
	__uint(type, BPF_MAP_TYPE_PROG_ARRAY);
	__uint(key_size, 4);
	__uint(value_size, 4);
	__uint(max_entries, 1);
} jmp_table2 SEC(".maps");

struct tail_client_ctx_t {
	void *header_value_str_p;
	void *headers_ptr;
	void *bucket_ptr;
	u64 curr_keyvalue_count;
};

struct {
	__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
	__type(key, u32);
	__type(value, struct tail_client_ctx_t);
	__uint(max_entries, 1);
} tail_client_ctx_heap SEC(".maps");