nodeinfo: 2 адреса на сокет (до/после NAT) + типы адресов local/public/nat/nat_eim/nat_strict

- topo_node: сокет рекламирует INTERFACE (до NAT) + NAT (после NAT, EIM);
  strict/direct отдельным адресом не передаются
- topo_node_sqlite: addr_type_classify различает NAT_VERIFIED_*; добавлен
  ADDR_TYPE_NAT (тип неизвестен), fallback больше не даёт DIRECT по IP
- chat_member: бейдж NAT-типа по приоритету (public>nat_eim>nat>nat_strict>local)
  вместо MIN(addr_type)
- GUI (desktop+android): адреса мембера с socket_id и ролью (local/public/nat/nat_eim/nat_strict)
This commit is contained in:
evgeny committed 2026-09-13 01:05:25 +03:00
1 parent a823898379
commit 7bba39ddcb
14 files changed
+82 -39

No files matched your search

+14 -5
View File
@@ -31,6 +31,10 @@ static void memberDetailCb(const uint8_t* data, int len) {
g_detailTarget->onMemberDetailData(nodeId, data, 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); }
}
QString AccountList::addrStr(const void* addr, int family) {
if (family == 4) {
const uint8_t* a = (const uint8_t*)addr;
@@ -233,7 +237,7 @@ void AccountList::showMemberDetail(quint64 nodeId) {
sqlite3_stmt* na = nullptr;
sqlite3_prepare_v2(d,
"SELECT family, protocol, address, port, socket_id FROM node_addresses WHERE node_id=?",
"SELECT family, protocol, address, port, socket_id, addr_type FROM node_addresses WHERE node_id=?",
-1, &na, nullptr);
if (na) {
sqlite3_bind_int64(na, 1, (sqlite3_int64)nodeId);
@@ -246,6 +250,7 @@ void AccountList::showMemberDetail(quint64 nodeId) {
if (adr && sz > 0) a.addr = QByteArray((const char*)adr, sz);
a.port = sqlite3_column_int(na, 3);
a.socket_id = sqlite3_column_int(na, 4);
a.addr_type = sqlite3_column_int(na, 5);
if (!a.addr.isEmpty()) m_detailAddrs.append(a);
}
sqlite3_finalize(na);
@@ -253,7 +258,8 @@ void AccountList::showMemberDetail(quint64 nodeId) {
std::sort(m_detailAddrs.begin(), m_detailAddrs.end(),
[](const DetailAddress& a, const DetailAddress& b) {
if (a.ifname != b.ifname) return a.ifname < b.ifname;
if (a.socket_id != b.socket_id) return a.socket_id < b.socket_id;
if (a.addr_type != b.addr_type) return a.addr_type < b.addr_type;
if (a.addr != b.addr) return a.addr < b.addr;
if (a.protocol != b.protocol) return a.protocol < b.protocol;
return a.port < b.port;
@@ -333,7 +339,8 @@ void AccountList::onMemberDetailData(uint64_t nodeId, const uint8_t* data, int l
}
std::sort(m_detailAddrs.begin(), m_detailAddrs.end(),
[](const DetailAddress& a, const DetailAddress& b) {
if (a.ifname != b.ifname) return a.ifname < b.ifname;
if (a.socket_id != b.socket_id) return a.socket_id < b.socket_id;
if (a.addr_type != b.addr_type) return a.addr_type < b.addr_type;
if (a.addr != b.addr) return a.addr < b.addr;
if (a.protocol != b.protocol) return a.protocol < b.protocol;
return a.port < b.port;
@@ -365,11 +372,13 @@ void AccountList::updateDetailDisplay() {
for (const auto& a : m_detailAddrs) {
QString proto;
switch (a.protocol) { case 1: proto = "UDP"; break; case 2: proto = "TCP"; break; default: proto = "?"; break; }
lines.append(QString(" %1 %2 %3:%4")
lines.append(QString(" [sock%1] %2 %3 %4:%5 %6")
.arg(a.socket_id)
.arg(proto)
.arg(a.ifname)
.arg(addrStr(a.addr.constData(), a.family))
.arg(a.port));
.arg(a.port)
.arg(addrRoleStr(a.addr_type)));
}
}