Ground-Zerro / HydraRoute Public
Code Issues Pull requests Actions Releases View on GitHub ↗
4.9 KB c
#ifndef HRNEO_H
#define HRNEO_H

#include <stdint.h>
#include <stddef.h>
#include <sys/types.h>

#define DEFAULT_CONFIG_PATH       "/opt/etc/HydraRoute/hrneo.conf"
#define DEFAULT_PID_FILE          "/var/run/hrneo.pid"
#define DEFAULT_API_PORT          79
#define IPSET_HASH_TYPE           "hash:net"
#define MANGLE_TABLE              "mangle"
#define SOCKET_READ_BUFFER        (1024 * 1024)
#define SIGUSR1_DEBOUNCE_SEC      5
#define RCI_TIMEOUT_SEC           10
#define POLICY_API_MAX_RETRIES    5
#define POLICY_API_RETRY_DELAY    3
#define IPSET_CHUNK_SIZE          256
#define IPSET_DEFAULT_MAXELEM     262144
#define POOL_CHUNK_SIZE           (256 * 1024)

#define NFNL_SUBSYS_IPSET       6
#define IPSET_PROTOCOL          6
#define IPSET_CMD_CREATE        2
#define IPSET_CMD_FLUSH         4
#define IPSET_CMD_ADD           9
#define IPSET_CMD_TYPE         13
#define IPSET_ATTR_PROTOCOL     1
#define IPSET_ATTR_SETNAME      2
#define IPSET_ATTR_TYPENAME     3
#define IPSET_ATTR_REVISION     4
#define IPSET_ATTR_FAMILY       5
#define IPSET_ATTR_DATA         7
#define IPSET_ATTR_IP           1
#define IPSET_ATTR_IPADDR_IPV4  1
#define IPSET_ATTR_IPADDR_IPV6  2
#define IPSET_ATTR_CIDR         3
#define IPSET_ATTR_TIMEOUT      6
#define IPSET_ATTR_HASHSIZE     18
#define IPSET_ATTR_MAXELEM      19
#define NLA_F_NESTED            (1 << 15)
#define NLA_F_NET_BYTEORDER     (1 << 14)
#define NLM_F_EXCL              0x200
#define NLM_F_CREATE            0x400
#define IPSET_ERR_EXIST         4103
#define IPSET_ERR_HASH_FULL     4101

#define CT_NFNL_SUBSYS    1
#define CT_MSG_GET         1
#define CT_MSG_DELETE      2
#define CTA_TUPLE_ORIG     1
#define CTA_TUPLE_IP       1
#define CTA_IPV4_DST       2
#define CTA_IPV6_DST       4

#define MAX_GEO_FILES       16
#define MAX_POLICY_ORDER    64
#define MAX_PATH_LEN        512
#define MAX_INTERFACE_NAME  32
#define MAX_INTERFACES      64
#define MAX_POLICY_NAME     64
#define MAX_TAG_LEN         64

#define DOMAIN_HT_BUCKETS  8192

#define MAX_CNAME_CHAIN         16

typedef struct {
    int auto_start;
    char watchlist_path[MAX_PATH_LEN];
    int clear_ipset;
    int cidr_enabled;
    char cidr_file_path[MAX_PATH_LEN];
    int ipset_enable_timeout;
    int ipset_timeout;
    char log_level[16];
    char log_file_path[MAX_PATH_LEN];
    int direct_route_enabled;
    int interface_fwmark_start;
    int interface_table_start;
    int global_routing;
    int conntrack_flush;
    int ipset_maxelem;
    char geo_ip_files[MAX_GEO_FILES][MAX_PATH_LEN];
    int geo_ip_file_count;
    char geo_site_files[MAX_GEO_FILES][MAX_PATH_LEN];
    int geo_site_file_count;
    char policy_order[MAX_POLICY_ORDER][64];
    int policy_order_count;
    int l7_capture_enabled;
    int l7_queue_num;
    int l7_enable_tls;
    int l7_enable_http;
    int l7_connbytes_max;
    char l7_wan_interface[MAX_INTERFACE_NAME];
    int l7_tcp_reasm_enabled;
    int l7_tcp_reasm_max_entries;
    int l7_tcp_reasm_ttl_sec;
} config_t;

typedef struct {
    char ipv4[64];
    char ipv6[64];
} ipset_pair_t;

typedef struct {
    uint8_t ip[16];
    uint8_t prefix;
    uint8_t family;
} parsed_cidr_t;

typedef struct {
    uint8_t ip[16];
    uint32_t prefix;
    uint8_t ip_len;
} geoip_entry_t;

#define GEOSITE_TYPE_PLAIN  0
#define GEOSITE_TYPE_REGEX  1
#define GEOSITE_TYPE_DOMAIN 2
#define GEOSITE_TYPE_FULL   3

typedef struct {
    uint32_t type;
    char *value;
} geosite_domain_t;

typedef struct {
    char tag[MAX_TAG_LEN];
    char policy_name[MAX_POLICY_NAME];
} geosite_rule_t;

typedef struct {
    char *ipset_name;
    int match_subs;
} domain_entry_t;

typedef struct domain_node {
    char *domain;
    size_t domain_len;
    domain_entry_t entry;
    struct domain_node *next;
} domain_node_t;

typedef struct pool_chunk {
    struct pool_chunk *next;
    size_t used;
    char data[POOL_CHUNK_SIZE];
} pool_chunk_t;

typedef struct {
    domain_node_t *buckets[DOMAIN_HT_BUCKETS];
    int count;
    pool_chunk_t *pool_head;
    pool_chunk_t *pool_tail;
    char  ipset_name_cache[MAX_POLICY_ORDER][64];
    char *ipset_name_ptrs[MAX_POLICY_ORDER];
    int   ipset_name_count;
} domain_hashtable_t;

static inline uint32_t fnv1a_hash(const char *str, size_t len) {
    uint32_t hash = 2166136261u;
    for (size_t i = 0; i < len; i++) {
        hash ^= (uint8_t)str[i];
        hash *= 16777619u;
    }
    return hash;
}

typedef struct {
    char name[MAX_INTERFACE_NAME];
    char state[16];
} interface_info_t;

typedef struct {
    char interface_name[MAX_INTERFACE_NAME];
    ipset_pair_t ipset_pair;
    int fwmark;
    int table_id;
} interface_route_t;

typedef struct {
    config_t *config;
    interface_info_t interfaces[MAX_INTERFACES];
    int interface_count;
    interface_route_t routes[MAX_INTERFACES];
    int route_count;
    int next_fwmark;
    int next_table_id;
} direct_route_manager_t;

typedef struct {
    char from[256];
    char to[256];
} cname_entry_t;

#endif