You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
3.5 KiB
121 lines
3.5 KiB
// config_parser.h - Configuration parser for utun application |
|
#ifndef CONFIG_PARSER_H |
|
#define CONFIG_PARSER_H |
|
|
|
#include <stdint.h> |
|
#include <stddef.h> |
|
#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 CFG_FIREWALL_RULE { |
|
uint32_t ip; // IPv4 in host byte order for sorting |
|
uint16_t port; // 0 means any port |
|
uint8_t bypass; // 1 for allow=all (bypass all checks) |
|
}; |
|
|
|
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 |
|
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) |
|
|
|
// Firewall configuration |
|
struct CFG_FIREWALL_RULE *firewall_rules; |
|
int firewall_rule_count; |
|
int firewall_bypass_all; |
|
}; |
|
|
|
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
|
|
|