zenith-stack 0.1.0

Zenith 全协议栈框架:AF_XDP + eBPF + TLS 1.3 + HTTP/1-2-3 + Web + Proxy + WAF,按需导入
Documentation
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Minimal vmlinux.h stub for Zenith eBPF programs
 * Provides necessary kernel types for eBPF compilation
 */

#ifndef __VMLINUX_H__
#define __VMLINUX_H__

/* ============ 基础整数类型 ============ */

typedef unsigned char __u8;
typedef unsigned short __u16;
typedef unsigned int __u32;
typedef unsigned long long __u64;

typedef signed char __s8;
typedef signed short __s16;
typedef signed int __s32;
typedef signed long long __s64;

/* ============ Linux 内核便捷类型别名 ============ */
typedef __u8 u8;
typedef __u16 u16;
typedef __u32 u32;
typedef __u64 u64;
typedef __s8 s8;
typedef __s16 s16;
typedef __s32 s32;
typedef __s64 s64;

/* ============ C 标准类型 ============ */
#include <stdbool.h>
#include <stddef.h>

/* ============ 端序类型 ============ */

typedef __u16 __be16;
typedef __u32 __be32;
typedef __u64 __be64;

typedef __u16 __le16;
typedef __u32 __le32;
typedef __u64 __le64;

/* ============ 校验和类型 ============ */

typedef __u32 __wsum;
typedef __u16 __sum16;

/* ============ XDP 相关 ============ */
/* 严格对齐内核 enum xdp_action(linux/bpf.h),错误取值会导致"丢弃"变成"放行" */

#define XDP_ABORTED  0
#define XDP_DROP     1
#define XDP_PASS     2
#define XDP_TX       3
#define XDP_REDIRECT 4

struct xdp_md {
    __u32 data;
    __u32 data_end;
    __u32 data_meta;
    __u32 ingress_ifindex;
    __u32 rx_queue_index;
    __u32 egress_ifindex;
};

/* ============ 以太网 ============ */

#define ETH_HLEN    14
#define ETH_P_IP    0x0800
#define ETH_P_IPV6  0x86DD
#define ETH_P_ARP   0x0806
#define ETH_P_VLAN  0x8100

struct ethhdr {
    __u8  h_dest[6];
    __u8  h_source[6];
    __u16 h_proto;
} __attribute__((packed));

/* ============ IPv4 ============ */

#define IPPROTO_TCP   6
#define IPPROTO_UDP   17
#define IPPROTO_ICMP  1
#define IPPROTO_IGMP  2

struct iphdr {
    __u8  ihl:4, version:4;
    __u8  tos;
    __u16 tot_len;
    __u16 id;
    __u16 frag_off;
    __u8  ttl;
    __u8  protocol;
    __u16 check;
    __u32 saddr;
    __u32 daddr;
} __attribute__((packed));

/* ============ IPv6 ============ */

struct ipv6hdr {
    __u8  priority:4, version:4;
    __u8  flow_lbl[3];
    __u16 payload_len;
    __u8  nexthdr;
    __u8  hop_limit;
    __u8  saddr[16];
    __u8  daddr[16];
} __attribute__((packed));

/* ============ TCP ============ */

struct tcphdr {
    __u16 source;
    __u16 dest;
    __u32 seq;
    __u32 ack_seq;
    __u16 doff:4, res1:4, res2:2, urg:1, ack:1, psh:1, rst:1, syn:1, fin:1;
    __u16 window;
    __u16 check;
    __u16 urgent_ptr;
} __attribute__((packed));

/* ============ UDP ============ */

struct udphdr {
    __u16 source;
    __u16 dest;
    __u16 len;
    __u16 check;
} __attribute__((packed));

/* ============ BPF Map 类型 ============ */
/* 严格对齐内核 6.6 enum bpf_map_type(uapi/linux/bpf.h)
 * 错误的枚举顺序会让 clang 编码出错误的 map_type 数值,
 * 导致内核验证器拒绝加载(如 XSKMAP 必须为 17 而非 9)。
 * 参考:include/uapi/linux/bpf.h
 */
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 */
    BPF_MAP_TYPE_TASK_STORAGE,          /* 29 */
    BPF_MAP_TYPE_BLOOM_FILTER,          /* 30 */
    BPF_MAP_TYPE_USER_RINGBUF,          /* 31 */
    BPF_MAP_TYPE_CGRP_STORAGE,          /* 32 */
};

/* ============ sk_buff 前向声明 ============ */
/* bpf_helpers.h 需要此类型,但我们不需要完整定义 */
struct __sk_buff;

/* ============ 内核宏 ============ */

#define __always_inline inline __attribute__((always_inline))

#endif /* __VMLINUX_H__ */