восстановление морды (частичное)
This commit is contained in:
1 parent
6ffec2f1e7
commit
b8ea33160d
9 files changed
+436
-143
No files matched your search
@@ -238,7 +238,7 @@ void control_server_shutdown(struct control_server* server) {
|
||||
}
|
||||
|
||||
/* Close listening socket */
|
||||
if (server->listen_fd >= 0) {
|
||||
if (server->listen_fd != INVALID_SOCKET) {
|
||||
uasync_remove_socket_t(server->ua, server->listen_fd);
|
||||
server->listen_socket_id = NULL;
|
||||
}
|
||||
@@ -419,10 +419,6 @@ static void client_read_callback(socket_t fd, void* arg) {
|
||||
if (received == SOCKET_ERROR) {
|
||||
int err = WSAGetLastError();
|
||||
if (err != WSAEWOULDBLOCK) {
|
||||
if (err == 10054) {
|
||||
client->connected = 0;
|
||||
return;
|
||||
}
|
||||
if (server && server->log_file) {
|
||||
fprintf(server->log_file, "%llu: [ERROR] Client recv error: %d\n",
|
||||
(unsigned long long)get_timestamp_ms(), err);
|
||||
@@ -508,7 +504,7 @@ static void close_client(struct control_server* server, struct control_client* c
|
||||
}
|
||||
|
||||
/* Remove from uasync */
|
||||
if (client->fd >= 0) {
|
||||
if (client->fd != INVALID_SOCKET) {
|
||||
uasync_remove_socket_t(server->ua, client->fd);
|
||||
}
|
||||
|
||||
|
||||
+18
-64
@@ -22,12 +22,6 @@
|
||||
// Размер пакета (без заголовка ETCP)
|
||||
#define BGP_PACKET_SIZE (sizeof(struct ROUTE_BGP_PACKET))
|
||||
|
||||
static inline void format_network(uint32_t network, char* out, size_t out_size)
|
||||
{
|
||||
uint32_t addr = htonl(network);
|
||||
inet_ntop(AF_INET, &addr, out, out_size);
|
||||
}
|
||||
|
||||
// Forward declarations
|
||||
static void route_bgp_send_route(struct ROUTE_BGP* bgp, struct ETCP_CONN* conn,
|
||||
const struct ROUTE_ENTRY* route);
|
||||
@@ -70,20 +64,11 @@ static void route_bgp_receive_cbk(struct ETCP_CONN* from_conn, struct ll_entry*
|
||||
return;
|
||||
}
|
||||
|
||||
char network_str[INET_ADDRSTRLEN];
|
||||
format_network(ntohl(pkt->network), network_str, sizeof(network_str));
|
||||
|
||||
DEBUG_INFO(DEBUG_CATEGORY_BGP, "Received BGP packet: subcmd=%d, network=%s/%d, node_id=%016llx",
|
||||
pkt->subcmd, network_str, pkt->prefix_length & 0x3F, (unsigned long long)pkt->node_id);
|
||||
DEBUG_INFO(DEBUG_CATEGORY_BGP, "Received BGP packet: subcmd=%d, network=%08x/%d, node_id=%016llx",
|
||||
pkt->subcmd, ntohl(pkt->network), pkt->prefix_length & 0x3F, (unsigned long long)pkt->node_id);
|
||||
|
||||
switch (pkt->subcmd) {
|
||||
case ROUTE_SUBCMD_ENTRY: {
|
||||
// Игнорируем маршруты от себя
|
||||
if (pkt->node_id == instance->node_id) {
|
||||
DEBUG_DEBUG(DEBUG_CATEGORY_BGP, "Ignoring own route: %s/%d", network_str, pkt->prefix_length & 0x3F);
|
||||
break;
|
||||
}
|
||||
|
||||
// Создаем запись маршрута
|
||||
struct ROUTE_ENTRY route;
|
||||
memset(&route, 0, sizeof(route));
|
||||
@@ -112,44 +97,32 @@ static void route_bgp_receive_cbk(struct ETCP_CONN* from_conn, struct ll_entry*
|
||||
}
|
||||
|
||||
// Вставляем в таблицу
|
||||
char network_str[INET_ADDRSTRLEN];
|
||||
format_network(route.network, network_str, sizeof(network_str));
|
||||
|
||||
if (route_table_insert(instance->rt, &route)) {
|
||||
DEBUG_INFO(DEBUG_CATEGORY_BGP, "Added learned route: %s/%d via node %016llx (hops=%d)",
|
||||
network_str, route.prefix_length,
|
||||
DEBUG_INFO(DEBUG_CATEGORY_BGP, "Added learned route: %08x/%d via node %016llx (hops=%d)",
|
||||
route.network, route.prefix_length,
|
||||
(unsigned long long)route.destination_node_id,
|
||||
route.metrics.hop_count);
|
||||
} else {
|
||||
DEBUG_WARN(DEBUG_CATEGORY_BGP, "Failed to insert route: %s/%d",
|
||||
network_str, route.prefix_length);
|
||||
DEBUG_WARN(DEBUG_CATEGORY_BGP, "Failed to insert route: %08x/%d",
|
||||
route.network, route.prefix_length);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case ROUTE_SUBCMD_WITHDRAW: {
|
||||
// Игнорируем withdraw от себя
|
||||
if (pkt->node_id == instance->node_id) {
|
||||
DEBUG_DEBUG(DEBUG_CATEGORY_BGP, "Ignoring own withdraw: %s/%d", network_str, pkt->prefix_length & 0x3F);
|
||||
break;
|
||||
}
|
||||
|
||||
// Удаление маршрута (withdrawal)
|
||||
uint32_t network = ntohl(pkt->network);
|
||||
uint8_t prefix_length = pkt->prefix_length & 0x3F;
|
||||
|
||||
char network_str[INET_ADDRSTRLEN];
|
||||
format_network(network, network_str, sizeof(network_str));
|
||||
|
||||
DEBUG_INFO(DEBUG_CATEGORY_BGP, "Processing route withdrawal: %s/%d from conn %p",
|
||||
network_str, prefix_length, (void*)from_conn);
|
||||
DEBUG_INFO(DEBUG_CATEGORY_BGP, "Processing route withdrawal: %08x/%d from conn %p",
|
||||
network, prefix_length, (void*)from_conn);
|
||||
|
||||
if (route_table_delete_entry(instance->rt, network, prefix_length, from_conn)) {
|
||||
DEBUG_INFO(DEBUG_CATEGORY_BGP, "Route withdrawn successfully: %s/%d",
|
||||
network_str, prefix_length);
|
||||
DEBUG_INFO(DEBUG_CATEGORY_BGP, "Route withdrawn successfully: %08x/%d",
|
||||
network, prefix_length);
|
||||
} else {
|
||||
DEBUG_WARN(DEBUG_CATEGORY_BGP, "Route to withdraw not found: %s/%d",
|
||||
network_str, prefix_length);
|
||||
DEBUG_WARN(DEBUG_CATEGORY_BGP, "Route to withdraw not found: %08x/%d",
|
||||
network, prefix_length);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -181,11 +154,6 @@ static void route_bgp_send_withdraw(struct ROUTE_BGP* bgp, struct ETCP_CONN* con
|
||||
return;
|
||||
}
|
||||
|
||||
// Не отправляем withdraw автору маршрута
|
||||
if (route->destination_node_id == conn->peer_node_id) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Создаем ETCP пакет
|
||||
struct ll_entry* entry = ll_alloc_lldgram(sizeof(struct ROUTE_BGP_PACKET));
|
||||
if (!entry) {
|
||||
@@ -207,11 +175,8 @@ static void route_bgp_send_withdraw(struct ROUTE_BGP* bgp, struct ETCP_CONN* con
|
||||
|
||||
entry->len = sizeof(struct ROUTE_BGP_PACKET);
|
||||
|
||||
char network_str[INET_ADDRSTRLEN];
|
||||
format_network(route->network, network_str, sizeof(network_str));
|
||||
|
||||
DEBUG_DEBUG(DEBUG_CATEGORY_BGP, "Sending withdraw: %s/%d to conn %p",
|
||||
network_str, route->prefix_length, (void*)conn);
|
||||
DEBUG_DEBUG(DEBUG_CATEGORY_BGP, "Sending withdraw: %08x/%d to conn %p",
|
||||
route->network, route->prefix_length, (void*)conn);
|
||||
|
||||
// Отправляем через ETCP
|
||||
if (etcp_send(conn, entry) != 0) {
|
||||
@@ -273,11 +238,8 @@ static void route_bgp_on_route_change(struct ROUTE_TABLE* table,
|
||||
// Не рассылаем маршруты через которые мы их получили (чтобы избежать петель)
|
||||
// Это делается в цикле ниже
|
||||
|
||||
char network_str[INET_ADDRSTRLEN];
|
||||
format_network(entry->network, network_str, sizeof(network_str));
|
||||
|
||||
DEBUG_DEBUG(DEBUG_CATEGORY_BGP, "Route change: action=%d, network=%s/%d, type=%d",
|
||||
action, network_str, entry->prefix_length, entry->type);
|
||||
DEBUG_DEBUG(DEBUG_CATEGORY_BGP, "Route change: action=%d, network=%08x/%d, type=%d",
|
||||
action, entry->network, entry->prefix_length, entry->type);
|
||||
|
||||
// Перебираем все соединения в senders_list
|
||||
struct ll_entry* item_entry = bgp->senders_list->head;
|
||||
@@ -310,11 +272,6 @@ static void route_bgp_send_route(struct ROUTE_BGP* bgp, struct ETCP_CONN* conn,
|
||||
return;
|
||||
}
|
||||
|
||||
// Не отправляем маршрут автору этого маршрута
|
||||
if (route->destination_node_id == conn->peer_node_id) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Пропускаем неактивные маршруты
|
||||
if (!(route->flags & ROUTE_FLAG_ACTIVE)) {
|
||||
return;
|
||||
@@ -356,11 +313,8 @@ static void route_bgp_send_route(struct ROUTE_BGP* bgp, struct ETCP_CONN* conn,
|
||||
|
||||
entry->len = sizeof(struct ROUTE_BGP_PACKET);
|
||||
|
||||
char network_str[INET_ADDRSTRLEN];
|
||||
format_network(route->network, network_str, sizeof(network_str));
|
||||
|
||||
DEBUG_DEBUG(DEBUG_CATEGORY_BGP, "Sending route: %s/%d to conn %p",
|
||||
network_str, route->prefix_length & 0x3F, (void*)conn);
|
||||
DEBUG_DEBUG(DEBUG_CATEGORY_BGP, "Sending route: %08x/%d to conn %p",
|
||||
route->network, route->prefix_length & 0x3F, (void*)conn);
|
||||
|
||||
// Отправляем через ETCP
|
||||
if (etcp_send(conn, entry) != 0) {
|
||||
|
||||
Reference in new issue
Block a user