// config_parser.h - Configuration parser for utun application #ifndef CONFIG_PARSER_H #define CONFIG_PARSER_H #include #include #include #include #include #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 }; struct CFG_CLIENT_LINK { struct CFG_CLIENT_LINK *next; // Next link in linked list struct CFG_SERVER* local_srv; 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; int net_debug; }; struct utun_config { struct global_config global; struct CFG_SERVER* servers; struct CFG_CLIENT* clients; struct CFG_ROUTE_ENTRY* allowed_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