- Implement control_server.c/h for monitoring and management - Add Windows-compatible uasync_poll using select() instead of WSAPoll - Fix Wintun adapter creation to open existing adapters first - Add debug category for control server operations - Update build files to include control server in compilation - Add test_control_server to test suite
156 lines
6.4 KiB
C
156 lines
6.4 KiB
C
/**
|
|
* Runtime debug configuration system
|
|
* Provides flexible control over debug output without recompilation
|
|
*/
|
|
|
|
#ifndef DEBUG_CONFIG_H
|
|
#define DEBUG_CONFIG_H
|
|
|
|
#ifdef _WIN32
|
|
#include <winsock2.h>
|
|
#include <ws2tcpip.h>
|
|
#else
|
|
#include <sys/socket.h> // struct sockaddr_storage
|
|
#endif
|
|
#include <stddef.h> // size_t
|
|
#include <stdint.h>
|
|
#include <stddef.h>
|
|
#include <time.h>
|
|
#include <stdio.h> // FILE
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* Debug levels */
|
|
typedef enum {
|
|
DEBUG_LEVEL_NONE = 0, // No debug output
|
|
DEBUG_LEVEL_ERROR = 1, // Errors only
|
|
DEBUG_LEVEL_WARN = 2, // Warnings and errors
|
|
DEBUG_LEVEL_INFO = 3, // Info, warnings, errors
|
|
DEBUG_LEVEL_DEBUG = 4, // Full debug output
|
|
DEBUG_LEVEL_TRACE = 5 // Trace everything
|
|
} debug_level_t;
|
|
|
|
/* Debug categories - can be combined with bitwise OR */
|
|
typedef uint64_t debug_category_t;
|
|
|
|
#define DEBUG_CATEGORY_NONE ((debug_category_t)0)
|
|
#define DEBUG_CATEGORY_UASYNC ((debug_category_t)1 << 0) // u_async module
|
|
#define DEBUG_CATEGORY_LL_QUEUE ((debug_category_t)1 << 1) // ll_queue module
|
|
#define DEBUG_CATEGORY_CONNECTION ((debug_category_t)1 << 2) // connection module
|
|
#define DEBUG_CATEGORY_ETCP ((debug_category_t)1 << 3) // etcp module
|
|
#define DEBUG_CATEGORY_CRYPTO ((debug_category_t)1 << 4) // crypto operations
|
|
#define DEBUG_CATEGORY_MEMORY ((debug_category_t)1 << 5) // memory management
|
|
#define DEBUG_CATEGORY_TIMING ((debug_category_t)1 << 6) // timing/performance
|
|
#define DEBUG_CATEGORY_CONFIG ((debug_category_t)1 << 7) // configuration parsing
|
|
#define DEBUG_CATEGORY_TUN ((debug_category_t)1 << 8) // TUN interface
|
|
#define DEBUG_CATEGORY_ROUTING ((debug_category_t)1 << 9) // routing table
|
|
#define DEBUG_CATEGORY_TIMERS ((debug_category_t)1 << 10) // timer management
|
|
#define DEBUG_CATEGORY_NORMALIZER ((debug_category_t)1 << 11) // packet normalizer
|
|
#define DEBUG_CATEGORY_BGP ((debug_category_t)1 << 12) // BGP route exchange
|
|
#define DEBUG_CATEGORY_SOCKET ((debug_category_t)1 << 13) // Socket operations
|
|
#define DEBUG_CATEGORY_CONTROL ((debug_category_t)1 << 14) // Control/monitoring server
|
|
#define DEBUG_CATEGORY_ALL ((debug_category_t)0xFFFFFFFFFFFFFFFFULL)
|
|
|
|
/* Debug configuration structure */
|
|
typedef struct {
|
|
debug_level_t level; // Global debug level
|
|
debug_category_t categories; // Enabled categories (bitmask)
|
|
int timestamp_enabled; // Include timestamps in output
|
|
int function_name_enabled; // Include function names
|
|
int file_line_enabled; // Include file:line info
|
|
const char* output_file; // NULL = stdout, otherwise file path
|
|
|
|
// Dual output support
|
|
FILE* file_output; // File handle for log file (NULL if not open)
|
|
debug_level_t file_level; // Log level for file output
|
|
debug_level_t console_level; // Log level for console output
|
|
int console_enabled; // Enable console output
|
|
} debug_config_t;
|
|
|
|
/* Global debug configuration */
|
|
extern debug_config_t g_debug_config;
|
|
|
|
/* Initialize debug system with default settings */
|
|
void debug_config_init(void);
|
|
|
|
/* Set debug level */
|
|
void debug_set_level(debug_level_t level);
|
|
|
|
/* Enable/disable specific categories */
|
|
void debug_enable_category(debug_category_t category);
|
|
void debug_disable_category(debug_category_t category);
|
|
void debug_set_categories(debug_category_t categories);
|
|
|
|
/* Set masks directly */
|
|
void debug_set_masks(debug_category_t categories, debug_level_t level);
|
|
|
|
/* Configure output options */
|
|
void debug_enable_timestamp(int enable);
|
|
void debug_enable_function_name(int enable);
|
|
void debug_enable_file_line(int enable);
|
|
void debug_set_output_file(const char* file_path);
|
|
|
|
/* Dual output configuration */
|
|
void debug_set_console_level(debug_level_t level);
|
|
void debug_set_file_level(debug_level_t level);
|
|
void debug_enable_file_output(const char* file_path, int truncate);
|
|
void debug_disable_file_output(void);
|
|
void debug_enable_console(int enable);
|
|
|
|
// вывод struct sockaddr_storage как текст
|
|
size_t addr_to_string(const struct sockaddr_storage *addr, char *buf, size_t buflen);
|
|
|
|
// hex dump в лог
|
|
void log_dump(const char* prefix, const uint8_t* data, size_t len);
|
|
|
|
/* Check if debug output should be shown for given level and category */
|
|
int debug_should_output(debug_level_t level, debug_category_t category);
|
|
|
|
/* Get current debug level */
|
|
debug_level_t debug_get_level(void);
|
|
|
|
/* Format and output debug message (internal use by macros) */
|
|
void debug_output(debug_level_t level, debug_category_t category,
|
|
const char* function, const char* file, int line,
|
|
const char* format, ...);
|
|
|
|
/* Parse debug configuration from string (e.g., "modules=etcp,memory;level=4" or "modules=all;level=4") */
|
|
int debug_parse_config(const char* config_string);
|
|
|
|
/* Convenience macros for debug output */
|
|
#define DEBUG_ERROR(category, fmt, ...) \
|
|
do { if (debug_should_output(DEBUG_LEVEL_ERROR, category)) { \
|
|
debug_output(DEBUG_LEVEL_ERROR, category, __FUNCTION__, __FILE__, __LINE__, fmt, ##__VA_ARGS__); \
|
|
} } while(0)
|
|
|
|
#define DEBUG_WARN(category, fmt, ...) \
|
|
do { if (debug_should_output(DEBUG_LEVEL_WARN, category)) { \
|
|
debug_output(DEBUG_LEVEL_WARN, category, __FUNCTION__, __FILE__, __LINE__, fmt, ##__VA_ARGS__); \
|
|
} } while(0)
|
|
|
|
#define DEBUG_INFO(category, fmt, ...) \
|
|
do { if (debug_should_output(DEBUG_LEVEL_INFO, category)) { \
|
|
debug_output(DEBUG_LEVEL_INFO, category, __FUNCTION__, __FILE__, __LINE__, fmt, ##__VA_ARGS__); \
|
|
} } while(0)
|
|
|
|
#define DEBUG_DEBUG(category, fmt, ...) \
|
|
do { if (debug_should_output(DEBUG_LEVEL_DEBUG, category)) { \
|
|
debug_output(DEBUG_LEVEL_DEBUG, category, __FUNCTION__, __FILE__, __LINE__, fmt, ##__VA_ARGS__); \
|
|
} } while(0)
|
|
|
|
#define DEBUG_TRACE(category, fmt, ...) \
|
|
do { if (debug_should_output(DEBUG_LEVEL_TRACE, category)) { \
|
|
debug_output(DEBUG_LEVEL_TRACE, category, __FUNCTION__, __FILE__, __LINE__, fmt, ##__VA_ARGS__); \
|
|
} } while(0)
|
|
|
|
/* Backward compatibility - default to ERROR level if not specified */
|
|
#define DEBUG_OUTPUT(fmt, ...) DEBUG_ERROR(DEBUG_CATEGORY_ALL, fmt, ##__VA_ARGS__)
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif // DEBUG_CONFIG_H
|