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:
1 parent
a823898379
commit
7bba39ddcb
14 files changed
+82
-39
No files matched your search
@@ -87,7 +87,11 @@ data class MemberDetail(val nodeId: Long, val name: String = "",
|
||||
val bgpNodes: Int = 0)
|
||||
|
||||
data class MemberAddr(val family: Int = 0, val protocol: String = "", val address: String = "",
|
||||
val port: Int = 0, val socketId: Int = 0, val rtt: Int = 0)
|
||||
val port: Int = 0, val socketId: Int = 0, val addrType: Int = 0, val rtt: Int = 0) {
|
||||
val roleLabel: String get() = when (addrType) {
|
||||
0 -> "local"; 1 -> "public"; 2 -> "nat_eim"; 3 -> "nat_strict"; 4 -> "nat"; else -> "?$addrType"
|
||||
}
|
||||
}
|
||||
|
||||
data class LinkStatus(val linkId: Int = 0, val localFamily: Int = 0, val localAddr: String = "", val localPort: Int = 0,
|
||||
val remoteFamily: Int = 0, val remoteAddr: String = "", val remotePort: Int = 0,
|
||||
@@ -428,6 +432,7 @@ class ChatRepository {
|
||||
address = a.optString("ad", ""),
|
||||
port = a.optInt("po", 0),
|
||||
socketId = a.optInt("si", 0),
|
||||
addrType = a.optInt("at", 0),
|
||||
rtt = a.optInt("rt", 0)
|
||||
))
|
||||
}
|
||||
|
||||
+1
-1
@@ -325,7 +325,7 @@ private fun MemberDetailCard(
|
||||
Text("Addresses:", fontSize = 13.sp, fontWeight = FontWeight.Medium)
|
||||
detail.addresses.forEach { a ->
|
||||
Text(
|
||||
text = "${a.protocol} ${a.address}:${a.port}",
|
||||
text = "[sock${a.socketId}] ${a.protocol} ${a.address}:${a.port} ${a.roleLabel}",
|
||||
fontFamily = FontFamily.Monospace,
|
||||
fontSize = 13.sp,
|
||||
color = Color.DarkGray
|
||||
|
||||
@@ -673,8 +673,8 @@ char* utun_bridge_get_member_detail_json(const char* channel_id, uint64_t node_i
|
||||
snprintf(buf + pos, sizeof(buf) - pos, ",\"adr\":["); pos += strlen(buf + pos);
|
||||
|
||||
if (sqlite3_prepare_v2(db,
|
||||
"SELECT family, protocol, address, port, socket_id, COALESCE(rtt,0)"
|
||||
" FROM node_addresses WHERE node_id=? ORDER BY family, port",
|
||||
"SELECT family, protocol, address, port, socket_id, addr_type, COALESCE(rtt,0)"
|
||||
" FROM node_addresses WHERE node_id=? ORDER BY socket_id, addr_type, family, port",
|
||||
-1, &st, NULL) == SQLITE_OK) {
|
||||
sqlite3_bind_int64(st, 1, (sqlite3_int64)node_id);
|
||||
int af = 1;
|
||||
@@ -685,7 +685,8 @@ char* utun_bridge_get_member_detail_json(const char* channel_id, uint64_t node_i
|
||||
int addr_len = sqlite3_column_bytes(st, 2);
|
||||
int port = sqlite3_column_int(st, 3);
|
||||
int sid = sqlite3_column_int(st, 4);
|
||||
int rtt = sqlite3_column_int(st, 5);
|
||||
int at = sqlite3_column_int(st, 5);
|
||||
int rtt = sqlite3_column_int(st, 6);
|
||||
|
||||
char addr_str[64] = "";
|
||||
if (addr && addr_len >= (family == 4 ? 4 : 16)) {
|
||||
@@ -700,8 +701,8 @@ char* utun_bridge_get_member_detail_json(const char* channel_id, uint64_t node_i
|
||||
const char* pn;
|
||||
switch (proto) { case 1: pn = "UDP"; break; case 2: pn = "TCP"; break; default: pn = "UDP/TCP"; break; }
|
||||
pos += (size_t)snprintf(buf + pos, sizeof(buf) - pos,
|
||||
"%s{\"fm\":%d,\"pt\":\"%s\",\"ad\":\"%s\",\"po\":%d,\"si\":%d,\"rt\":%d}",
|
||||
af ? "" : ",", family, pn, addr_str[0] ? addr_str : "?", port, sid, rtt);
|
||||
"%s{\"fm\":%d,\"pt\":\"%s\",\"ad\":\"%s\",\"po\":%d,\"si\":%d,\"at\":%d,\"rt\":%d}",
|
||||
af ? "" : ",", family, pn, addr_str[0] ? addr_str : "?", port, sid, at, rtt);
|
||||
af = 0;
|
||||
}
|
||||
sqlite3_finalize(st);
|
||||
|
||||
Reference in new issue
Block a user