|
|
|
|
@ -29,6 +29,22 @@ struct ROUTE_CACHE {
|
|
|
|
|
|
|
|
|
|
static struct ROUTE_CACHE g_route_cache = {0}; |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Преобразует IP-адрес в строку |
|
|
|
|
* @param ip IP-адрес (в host byte order) |
|
|
|
|
* @param buffer Буфер для строки (минимум 16 байт) |
|
|
|
|
* @return Указатель на buffer или NULL |
|
|
|
|
*/ |
|
|
|
|
static char *ip_to_string(uint32_t ip, char *buffer) { |
|
|
|
|
if (!buffer) return NULL; |
|
|
|
|
|
|
|
|
|
struct in_addr addr; |
|
|
|
|
addr.s_addr = htonl(ip); |
|
|
|
|
strncpy(buffer, inet_ntoa(addr), 15); |
|
|
|
|
buffer[15] = '\0'; |
|
|
|
|
return buffer; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Парсит строку подсети в сетевой адрес и длину префикса |
|
|
|
|
* @param subnet_str Строка подсети (например, "192.168.1.0/24") |
|
|
|
|
@ -137,7 +153,9 @@ static struct ROUTE_ARRAY* cache_lookup(uint32_t dest_ip) {
|
|
|
|
|
for (int i = 0; i < g_route_cache.count; i++) { |
|
|
|
|
if (g_route_cache.keys[i] == dest_ip && g_route_cache.entries[i]) { |
|
|
|
|
g_route_cache.access_time[i] = current_time; |
|
|
|
|
DEBUG_INFO(DEBUG_CATEGORY_ROUTING, "Cache hit for IP %u", dest_ip); |
|
|
|
|
char ip_str[16]; |
|
|
|
|
ip_to_string(dest_ip, ip_str); |
|
|
|
|
DEBUG_INFO(DEBUG_CATEGORY_ROUTING, "Cache hit for IP %s", ip_str); |
|
|
|
|
return g_route_cache.entries[i]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
@ -177,22 +195,6 @@ static void cache_insert(uint32_t dest_ip, struct ROUTE_ARRAY *result) {
|
|
|
|
|
DEBUG_INFO(DEBUG_CATEGORY_ROUTING, "Cache insert for IP %u at slot %d", dest_ip, insert_idx); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Преобразует IP-адрес в строку |
|
|
|
|
* @param ip IP-адрес (в host byte order) |
|
|
|
|
* @param buffer Буфер для строки (минимум 16 байт) |
|
|
|
|
* @return Указатель на buffer или NULL |
|
|
|
|
*/ |
|
|
|
|
static char *ip_to_string(uint32_t ip, char *buffer) { |
|
|
|
|
if (!buffer) return NULL; |
|
|
|
|
|
|
|
|
|
struct in_addr addr; |
|
|
|
|
addr.s_addr = htonl(ip); |
|
|
|
|
strncpy(buffer, inet_ntoa(addr), 15); |
|
|
|
|
buffer[15] = '\0'; |
|
|
|
|
return buffer; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Преобразует тип маршрута в строку |
|
|
|
|
* @param type Тип маршрута |
|
|
|
|
|