// config_parser.h - Configuration parser for utun application #ifndef CONFIG_PARSER_H #define CONFIG_PARSER_H #include #include #include "../lib/platform_compat.h" #ifdef __cplusplus extern "C" { #endif #define MAX_CONN_NAME_LEN 64 #define MAX_KEY_LEN 256 #define MAX_ADDR_LEN 64 struct IP { sa_family_t family; union { struct in_addr v4; struct in6_addr v6; } addr; }; #define CFG_SERVER_TYPE_UNKNOWN 0 #define CFG_SERVER_TYPE_PUBLIC 1 #define CFG_SERVER_TYPE_NAT 2 #define CFG_SERVER_TYPE_PRIVATE 3 struct CFG_SERVER { struct CFG_SERVER* next; char name[MAX_CONN_NAME_LEN]; struct sockaddr_storage ip; // ip:port uint32_t netif_index;// if_nameindex, 0 - no interface specified int so_mark; uint8_t type; // public/nat/private int mtu; int loss_rate; // packet loss rate in percent (0-100), default 0 }; struct CFG_CLIENT_LINK { struct CFG_CLIENT_LINK *next; // Next link in linked list struct CFG_SERVER* local_srv; char server_name[MAX_CONN_NAME_LEN]; // Name of local server for this link struct sockaddr_storage remote_addr; // ip:port }; struct CFG_CLIENT { char name[MAX_CONN_NAME_LEN]; char peer_public_key_hex[MAX_KEY_LEN]; int keepalive; struct CFG_CLIENT_LINK *links; // Linked list of links struct CFG_CLIENT *next; // Next client in linked list }; struct CFG_ROUTE_ENTRY { struct CFG_ROUTE_ENTRY* next; struct IP ip; uint8_t netmask; }; struct global_config { char my_private_key_hex[MAX_KEY_LEN]; char my_public_key_hex[MAX_KEY_LEN]; uint64_t my_node_id; char tun_ifname[16]; // TUN interface name (e.g., "tun12") struct IP tun_ip; int mtu; struct sockaddr_storage control_sock; char control_ip[MAX_ADDR_LEN]; // Control server IP address int net_debug; // Debug and logging configuration char log_file[256]; // Path to log file (empty = stdout) char debug_level[16]; // debug level: error, warn, info, debug, trace uint32_t debug_categories; // bitwise debug categories int enable_timestamp; // enable timestamps in logs int enable_function_names; // enable function names in logs int enable_file_lines; // enable file:line in logs int enable_colors; // enable ANSI colors in logs // Per-category debug levels (loaded from [debug] section) struct { char category[16][16]; // category name char level[16][16]; // level string int count; } debug_levels; int tun_test_mode; // test mode: 1 = don't open real TUN, queues only int keepalive_timeout; // keepalive timeout in ms (default: 2000) int keepalive_interval; // keepalive interval in ms (default: 200) }; struct utun_config { struct global_config global; struct CFG_SERVER* servers; struct CFG_CLIENT* clients; struct CFG_ROUTE_ENTRY* route_subnets; struct CFG_ROUTE_ENTRY* my_subnets; }; struct utun_config* parse_config(const char *filename); void free_config(struct utun_config *config); void print_config(const struct utun_config *config); int update_config_keys(const char *filename, const char *priv_key, const char *pub_key); #ifdef __cplusplus } #endif #endif