// Copyright (c) Microsoft Corporation // SPDX-License-Identifier: MIT #pragma once #include "ebpf_structs.h" #include "ebpf_program_types.h" #include "ebpf_platform.h" #include "ebpf_nethooks.h" #define XDP_EXT_HELPER_FUNCTION_START EBPF_MAX_GENERAL_HELPER_FUNCTION // XDP helper function prototype descriptors. static ebpf_helper_function_prototype_t _xdp_ebpf_extension_helper_function_prototype[] = { {XDP_EXT_HELPER_FUNCTION_START + 1, "bpf_xdp_adjust_head", EBPF_RETURN_TYPE_INTEGER, {EBPF_ARGUMENT_TYPE_PTR_TO_CTX, EBPF_ARGUMENT_TYPE_ANYTHING}}}; // XDP program information. static ebpf_context_descriptor_t _ebpf_xdp_context_descriptor = { sizeof(xdp_md_t), EBPF_OFFSET_OF(xdp_md_t, data), EBPF_OFFSET_OF(xdp_md_t, data_end), EBPF_OFFSET_OF(xdp_md_t, data_meta)}; static ebpf_program_info_t _ebpf_xdp_program_info = { {"xdp", &_ebpf_xdp_context_descriptor, {0}, BPF_PROG_TYPE_XDP}, EBPF_COUNT_OF(_xdp_ebpf_extension_helper_function_prototype), _xdp_ebpf_extension_helper_function_prototype}; static ebpf_program_section_info_t _ebpf_xdp_section_info[] = { {(const wchar_t*)L"xdp", &EBPF_PROGRAM_TYPE_XDP, &EBPF_ATTACH_TYPE_XDP, BPF_PROG_TYPE_XDP, BPF_XDP}}; // Bind program information. static ebpf_context_descriptor_t _ebpf_bind_context_descriptor = { sizeof(bind_md_t), EBPF_OFFSET_OF(bind_md_t, app_id_start), EBPF_OFFSET_OF(bind_md_t, app_id_end), -1}; static ebpf_program_info_t _ebpf_bind_program_info = { {"bind", &_ebpf_bind_context_descriptor, {0}, BPF_PROG_TYPE_BIND}, 0, NULL}; static ebpf_program_section_info_t _ebpf_bind_section_info[] = { {L"bind", &EBPF_PROGRAM_TYPE_BIND, &EBPF_ATTACH_TYPE_BIND, BPF_PROG_TYPE_BIND, BPF_ATTACH_TYPE_BIND}}; // CGROUP_SOCK_ADDR program information. static ebpf_context_descriptor_t _ebpf_sock_addr_context_descriptor = { sizeof(bpf_sock_addr_t), -1, // Offset into ctx struct for pointer to data, or -1 if none. -1, // Offset into ctx struct for pointer to data, or -1 if none. -1, // Offset into ctx struct for pointer to metadata, or -1 if none. }; static ebpf_program_info_t _ebpf_sock_addr_program_info = { {"sock_addr", &_ebpf_sock_addr_context_descriptor, {0}, BPF_PROG_TYPE_CGROUP_SOCK_ADDR}, 0, NULL}; static ebpf_program_section_info_t _ebpf_sock_addr_section_info[] = { {L"cgroup/connect4", &EBPF_PROGRAM_TYPE_CGROUP_SOCK_ADDR, &EBPF_ATTACH_TYPE_CGROUP_INET4_CONNECT, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_INET4_CONNECT}, {L"cgroup/connect6", &EBPF_PROGRAM_TYPE_CGROUP_SOCK_ADDR, &EBPF_ATTACH_TYPE_CGROUP_INET6_CONNECT, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_INET6_CONNECT}, {L"cgroup/recv_accept4", &EBPF_PROGRAM_TYPE_CGROUP_SOCK_ADDR, &EBPF_ATTACH_TYPE_CGROUP_INET4_RECV_ACCEPT, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_INET4_RECV_ACCEPT}, {L"cgroup/recv_accept6", &EBPF_PROGRAM_TYPE_CGROUP_SOCK_ADDR, &EBPF_ATTACH_TYPE_CGROUP_INET6_RECV_ACCEPT, BPF_PROG_TYPE_CGROUP_SOCK_ADDR, BPF_CGROUP_INET6_RECV_ACCEPT}}; // SOCK_OPS program information. static ebpf_context_descriptor_t _ebpf_sock_ops_context_descriptor = { sizeof(bpf_sock_ops_t), -1, // Offset into ctx struct for pointer to data, or -1 if none. -1, // Offset into ctx struct for pointer to data, or -1 if none. -1, // Offset into ctx struct for pointer to metadata, or -1 if none. }; static ebpf_program_info_t _ebpf_sock_ops_program_info = { {"sockops", &_ebpf_sock_ops_context_descriptor, {0}, BPF_PROG_TYPE_SOCK_OPS}, 0, NULL}; static ebpf_program_section_info_t _ebpf_sock_ops_section_info[] = { {L"sockops", &EBPF_PROGRAM_TYPE_SOCK_OPS, &EBPF_ATTACH_TYPE_CGROUP_SOCK_OPS, BPF_PROG_TYPE_SOCK_OPS, BPF_CGROUP_SOCK_OPS}};