Browse Source

r

nodeinfo-routing-update
jeka 1 month ago
parent
commit
2f06979f17
  1. 36
      src/route_lib.c
  2. 9
      src/routing.c

36
src/route_lib.c

@ -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 Тип маршрута

9
src/routing.c

@ -47,7 +47,7 @@ static uint32_t extract_dst_ip(uint8_t* data, size_t len) {
uint32_t dst_ip;
memcpy(&dst_ip, data + IP_HDR_DST_ADDR_OFFSET, 4);
return dst_ip; // Keep in network byte order
return ntohl(dst_ip); // Convert to host byte order
}
// Callback for packets from ETCP (via etcp_bind id=0)
@ -173,7 +173,7 @@ static void routing_pkt_from_tun_cb(struct ll_queue* q, void* arg) {
memory_pool_free(instance->tun->pool, pkt);
} else {
struct in_addr addr;
addr.s_addr = dst_ip;
addr.s_addr = htonl(dst_ip);
struct ROUTE_ARRAY* routes = route_table_lookup(instance->rt, dst_ip);
if (!routes || routes->routes == 0) {
@ -202,14 +202,11 @@ static void routing_pkt_from_tun_cb(struct ll_queue* q, void* arg) {
memcpy(entry->dgram + 1, pkt->ll.dgram, pkt->ll.len);
entry->len = etcp_data_len;
DEBUG_DEBUG(DEBUG_CATEGORY_ROUTING, "Sendign dgram to ETCP %s len=%d", conn->log_name, entry->len);
if (etcp_send(conn, entry) != 0) {
DEBUG_WARN(DEBUG_CATEGORY_ROUTING, "etcp_send failed for %s", ip_to_str(&addr, AF_INET).str);
queue_entry_free(entry);
queue_dgram_free(entry);
} else {
dump_ip_packet("routing->ETCP", (const uint8_t*)entry->dgram, entry->len);
DEBUG_DEBUG(DEBUG_CATEGORY_ROUTING, "Forwarded packet to %s via ETCP conn [%s]",
ip_to_str(&addr, AF_INET).str, conn->log_name);
}
free(pkt->ll.dgram);

Loading…
Cancel
Save