Measure owned endpoint mapping and inbound reachability separately

This commit is contained in:
evgeny committed 2026-10-12 00:01:40 +02:00
1 parent b54307a0df
commit ff69552a61
51 files changed
+2620 -2483

No files matched your search

+1 -1
View File
@@ -35,7 +35,7 @@ static void memberDetailCb(const uint8_t* data, int len) {
}
static QString addrRoleStr(int t) {
switch (t) { case 0: return "local"; case 1: return "public"; case 2: return "nat_eim"; case 3: return "nat_strict"; case 4: return "nat"; default: return QString("?%1").arg(t); }
switch (t) { case 0: return "local"; case 1: return "public"; case 2: return "nat_eim"; case 3: return "nat_dependent"; case 4: return "unknown"; case 5: return "contact_required"; default: return QString("?%1").arg(t); }
}
QString AccountList::addrStr(const void* addr, int family) {
+2 -2
View File
@@ -61,8 +61,8 @@ QVariant MemberListModel::data(const QModelIndex& index, int role) const {
QString sub;
if (it->rtt >= 0) sub += QString("rtt=%1ms").arg(it->rtt / 10);
if (it->natType >= 0) {
static const char* nat[] = {"NET","DIR","EIM","STR","NAT"};
const char* nt = (it->natType <= 4) ? nat[it->natType] : "?";
static const char* nat[] = {"NET","DIR","EIM","DEP","?","CONTACT"};
const char* nt = (it->natType <= 5) ? nat[it->natType] : "?";
if (!sub.isEmpty()) sub += " ";
sub += nt;
}
+1 -1
View File
@@ -49,7 +49,7 @@ QString NodesPage::protoStr(int protocol) {
}
static QString addrTypeStr(int t) {
switch (t) { case 0: return "NETIF"; case 1: return "DIRECT"; case 2: return "NAT_EIM"; case 3: return "NAT_STRICT"; case 4: return "NAT"; default: return QString("?%1").arg(t); }
switch (t) { case 0: return "NETIF"; case 1: return "DIRECT"; case 2: return "NAT_EIM"; case 3: return "NAT_DEPENDENT"; case 4: return "UNKNOWN"; case 5: return "CONTACT_REQUIRED"; default: return QString("?%1").arg(t); }
}
NodesPage::NodesPage(DbManager* db, QWidget* parent)
+5 -31
View File
@@ -1589,18 +1589,6 @@ static const char* config_type_to_string(uint8_t config_type) {
}
}
static const char* nat_type_to_string(uint8_t nat_type) {
switch (nat_type) {
case NAT_TYPE_EIM: return "EIM";
case NAT_TYPE_STRICT: return "Strict";
case NAT_TYPE_DIRECT: return "Direct";
case NAT_VERIFIED_EIM: return "Verified-EIM";
case NAT_VERIFIED_STRICT: return "Verified-Strict";
case NAT_VERIFIED_DIRECT: return "Verified-Direct";
case NAT_TYPE_UNKNOWN: return "Unknown";
default: return "?";
}
}
void etcpmon_gui_update_socket_list(struct etcpmon_app* app,
struct etcpmon_socket_info* list,
@@ -1614,25 +1602,11 @@ void etcpmon_gui_update_socket_list(struct etcpmon_app* app,
if (list[i].name[0] == '\0') continue;
char display[256];
const char* cfg_str = config_type_to_string(list[i].config_type);
const char* nat_str = nat_type_to_string(list[i].nat_type);
if (list[i].nat_ip[0] != '\0') {
if (list[i].is_ipv6) {
snprintf(display, sizeof(display), "[%s]:%d | Type: %s | NAT: %s (%s:%d)",
list[i].ip, list[i].port, cfg_str, nat_str, list[i].nat_ip, list[i].nat_port);
} else {
snprintf(display, sizeof(display), "%s:%d | Type: %s | NAT: %s (%s:%d)",
list[i].ip, list[i].port, cfg_str, nat_str, list[i].nat_ip, list[i].nat_port);
}
} else {
if (list[i].is_ipv6) {
snprintf(display, sizeof(display), "[%s]:%d | Type: %s | NAT: %s",
list[i].ip, list[i].port, cfg_str, nat_str);
} else {
snprintf(display, sizeof(display), "%s:%d | Type: %s | NAT: %s",
list[i].ip, list[i].port, cfg_str, nat_str);
}
}
snprintf(display, sizeof(display), "%s%s%s:%u | %s policy=%s | mapping=%s inbound=%s | external=%s:%u",
list[i].is_ipv6 ? "[" : "", list[i].ip, list[i].is_ipv6 ? "]" : "", list[i].port,
list[i].is_tcp ? "TCP" : "UDP", config_type_to_string(list[i].config_type),
address_mapping_name(list[i].mapping), address_inbound_name(list[i].inbound),
list[i].nat_ip[0] ? list[i].nat_ip : "unknown", list[i].nat_port);
SendMessageA(app->hListSockets, LB_ADDSTRING, 0, (LPARAM)display);
}
}
+5 -12
View File
@@ -11,6 +11,7 @@
#define ETCPMON_PROTOCOL_H
#include <stdint.h>
#include "../../src/routing_layer/address_profile.h"
#ifdef __cplusplus
@@ -21,17 +22,7 @@ extern "C" {
* Protocol Constants
* ============================================================================ */
#define ETCPMON_PROTOCOL_VERSION 1
/* NAT types (mirrored from etcp_connections.h for monitor protocol) */
#define NAT_TYPE_UNKNOWN 0
#define NAT_TYPE_EIM 1 /* Endpoint-Independent Mapping */
#define NAT_TYPE_STRICT 2 /* Address/Restricted or Symmetric */
#define NAT_TYPE_DIRECT 3 /* Real public IP */
#define NAT_VERIFIED_UNKNOWN 4
#define NAT_VERIFIED_EIM 5 /* EIM NAT */
#define NAT_VERIFIED_STRICT 6 /* strict NAT */
#define NAT_VERIFIED_DIRECT 7
#define ETCPMON_PROTOCOL_VERSION 2
/* Server config types (mirrored from config_parser.h) */
#define CFG_SERVER_TYPE_UNKNOWN 0
@@ -135,7 +126,9 @@ struct etcpmon_socket_info {
uint16_t port; /* Port number (host byte order) */
uint8_t is_ipv6; /* 1 = IPv6, 0 = IPv4 */
uint8_t config_type; /* CFG_SERVER_TYPE_PUBLIC/NAT/PRIVATE */
uint8_t nat_type; /* NAT_TYPE_* / NAT_VERIFIED_* */
uint8_t mapping, inbound; /* ADDRESS_MAP_* / ADDRESS_IN_* */
uint8_t is_tcp;
uint64_t generation, evidence_id, checked_at;
char nat_ip[46]; /* Null-terminated NAT IP address string */
uint16_t nat_port; /* NAT port (host byte order) */
};