route_node: refactor NODEINFO — separate protocol/memory structs, linked lists with memory_pool
- NODEINFO_MSG (protocol, packed): added flags byte + group_id field - NODEINFO (memory): ref_count, linked list heads instead of inline arrays - NODEINFO_ROUTES: separate struct with linked list subnet heads - NODEINFO_Q: node*, routes*, tranzit_data*, hop_list* as separate mallocs - 6 memory_pools in ROUTE_BGP for NI_* linked list items - ni_list_count() universal counter via _ni_head cast - nodeinfo_serialize/deserialize for protocol <-> memory conversion - NODEINFO_FLAG_SEND_SUBNETS controls subnet data in protocol - group_id defaults: utun=NODEINFO_GROUP_UTUN(1) with subnets Fixes: - deserialization: data+2 instead of data+sizeof(BGP_NODEINFO_PACKET) - memset: start after ll_entry to preserve ll.size - hop_src: subtract hop_count*8 to point at correct dynamic offset - same-ver branch: remove_path(conn) instead of remove_path_by_hop(peer) - double-free in route_bgp_remove_conn/process_withdraw - conn_mgr_add_alien_node: rewritten for new structures - all test files updated for new API
This commit is contained in:
1 parent
62954ca0a9
commit
c7ac42eb5f
27 files changed
+3615
-2027
No files matched your search
@@ -1386,19 +1386,20 @@ static struct ETCP_CONN* find_connection_by_peer_id(struct UTUN_INSTANCE* instan
|
||||
* ============================================================================ */
|
||||
|
||||
static void send_single_node_info(struct control_server* server, struct control_client* client, struct NODEINFO_Q* nq) {
|
||||
int dyn = nodeinfo_dyn_size(&nq->node);
|
||||
size_t np_size = sizeof(struct etcpmon_msg_header) + 2 + sizeof(struct NODEINFO) + dyn;
|
||||
if (!server || !nq || !nq->node) return;
|
||||
uint8_t buf[8192];
|
||||
int ser_len = nodeinfo_serialize(server->instance->bgp, nq, buf + 2, sizeof(buf) - 2);
|
||||
if (ser_len < 0) { DEBUG_ERROR(DEBUG_CATEGORY_CONTROL, "Failed to serialize node info"); return; }
|
||||
buf[0] = CTRL_BGP_CMD; buf[1] = CTRL_BGP_SUBCMD;
|
||||
size_t data_size = 2 + (size_t)ser_len;
|
||||
|
||||
size_t np_size = sizeof(struct etcpmon_msg_header) + data_size;
|
||||
uint8_t* buffer = (uint8_t*)u_malloc(np_size);
|
||||
if (!buffer) { DEBUG_ERROR(DEBUG_CATEGORY_CONTROL, "Failed to allocate node info buffer"); return; }
|
||||
|
||||
struct etcpmon_msg_header* hdr = (struct etcpmon_msg_header*)buffer;
|
||||
etcpmon_build_header(hdr, 2 + sizeof(struct NODEINFO) + dyn, ETCPMON_RSP_NODE_INFO, 0);
|
||||
|
||||
uint8_t* pay = buffer + sizeof(*hdr);
|
||||
pay[0] = CTRL_BGP_CMD; pay[1] = CTRL_BGP_SUBCMD;
|
||||
memcpy(pay + 2, &nq->node, sizeof(struct NODEINFO));
|
||||
memcpy(pay + 2 + sizeof(struct NODEINFO), (uint8_t*)&nq->node + sizeof(struct NODEINFO), dyn);
|
||||
etcpmon_build_header(hdr, (uint16_t)data_size, ETCPMON_RSP_NODE_INFO, 0);
|
||||
memcpy(buffer + sizeof(*hdr), buf, data_size);
|
||||
|
||||
control_client_send(server, client, buffer, (uint16_t)np_size);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user