From 761f64cf76f1b09b1962e4d9df0318c3929361ce Mon Sep 17 00:00:00 2001 From: evgeny Date: Tue, 15 Sep 2026 12:18:22 +0300 Subject: [PATCH] =?UTF-8?q?chatgui-android:=20=D0=BE=D1=82=D0=BE=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20REALITY-=D0=BB?= =?UTF-8?q?=D0=B8=D0=BD=D0=BA=D0=BE=D0=B2=20(TCP+REALITY)=20=D0=B2=20?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D1=82=D1=83=D1=81=D0=B5=20=D1=83=D0=B7=D0=BB?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=B8=20=D1=81=D0=BE=D0=BA=D0=B5=D1=82=D0=BE?= =?UTF-8?q?=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/utun/chat/data/ChatRepository.kt | 7 ++++--- .../jni_bridge/android_jni_bridge.c | 14 ++++++++------ 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/ChatRepository.kt b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/ChatRepository.kt index 1707af9e..950fff69 100644 --- a/tools/chatgui-android/app/src/main/java/com/utun/chat/data/ChatRepository.kt +++ b/tools/chatgui-android/app/src/main/java/com/utun/chat/data/ChatRepository.kt @@ -179,8 +179,8 @@ fun MemberWire.toChatMember(): ChatMember = ChatMember( fun cleanSocketName(raw: String): String = raw.removePrefix("as_").replace(Regex("_v[46]_(tcp|udp)$"), " $1") -/* ── MEMBER_DETAIL (event 22) link format: 63 bytes per link ── */ -private const val MEMBER_DETAIL_LINK_SIZE = 63 +/* ── MEMBER_DETAIL (event 22) link format: 64 bytes per link ── */ +private const val MEMBER_DETAIL_LINK_SIZE = 64 private fun addrFromBytes(family: Int, bytes: ByteArray): String { if (family == 4 && bytes.size >= 4) @@ -214,13 +214,14 @@ fun parseMemberDetail(data: ByteArray): MemberLinks? { val rp = lbuf.getShort().toInt() and 0xFFFF val snBytes = ByteArray(20); lbuf.get(snBytes) val sn = String(snBytes).trimEnd('\u0000').trimEnd() + val isReality = lbuf.get().toInt() != 0 val effState = if (isTcp != 0 && tcpReady != 0) 3 else state val effStatus = if (isTcp != 0 && tcpReady != 0) 1 else status links.add(LinkStatus( localFamily = lf, localAddr = addrFromBytes(lf, la), localPort = lp, remoteFamily = rf, remoteAddr = addrFromBytes(rf, ra), remotePort = rp, linkState = effState, linkStatus = effStatus, isServer = isServer != 0, - socketName = sn, protocol = if (isTcp != 0) "TCP" else "UDP" + socketName = sn, protocol = if (isReality) "TCP+REALITY" else if (isTcp != 0) "TCP" else "UDP" )) offset += MEMBER_DETAIL_LINK_SIZE } diff --git a/tools/chatgui-android/jni_bridge/android_jni_bridge.c b/tools/chatgui-android/jni_bridge/android_jni_bridge.c index 3e62cea6..8a04499d 100644 --- a/tools/chatgui-android/jni_bridge/android_jni_bridge.c +++ b/tools/chatgui-android/jni_bridge/android_jni_bridge.c @@ -759,7 +759,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; } + if (proto & 0x04) pn = "TCP+REALITY"; + else 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,\"at\":%d,\"rt\":%d}", af ? "" : ",", family, pn, addr_str[0] ? addr_str : "?", port, sid, at, rtt); @@ -897,7 +898,7 @@ char* utun_bridge_get_member_links_json(uint64_t node_id) { const char* sn = lk->conn ? lk->conn->name : ""; pos += snprintf(buf + pos, sizeof(buf) - (size_t)pos, "%s{\"id\":%d,\"pt\":\"%s\",\"lf\":%d,\"la\":\"%s\",\"lp\":%d,\"rf\":%d,\"ra\":\"%s\",\"rp\":%d,\"st\":%d,\"ls\":%d,\"is\":%d,\"sn\":\"%s\"}", - sep, lk->local_link_id, lk->is_tcp ? "TCP" : "UDP", lf, la, (int)lp, rf, ra, (int)rp, st, ls, lk->is_server, sn); + sep, lk->local_link_id, lk->reality_set ? "TCP+REALITY" : (lk->is_tcp ? "TCP" : "UDP"), lf, la, (int)lp, rf, ra, (int)rp, st, ls, lk->is_server, sn); } if (pos < (int)sizeof(buf)) pos += snprintf(buf + pos, sizeof(buf) - (size_t)pos, "]}"); @@ -998,14 +999,15 @@ char* utun_bridge_get_local_sockets_json(void) { int lu, ld; SOCK_COUNT_LINKS(s, lu, ld); int state = 2; /* bound and listening */ const char* sep = first ? "" : ","; first = 0; + const char* pn = s->reality_enabled ? "TCP+REALITY" : "TCP"; size_t needed = snprintf(NULL, 0, - "%s{\"si\":%u,\"nm\":\"%s\",\"ad\":\"%s\",\"po\":%d,\"pt\":\"TCP\",\"st\":%d,\"lu\":%d,\"ld\":%d}", - sep, s->sock_id, s->name, ip_str, port, state, lu, ld); + "%s{\"si\":%u,\"nm\":\"%s\",\"ad\":\"%s\",\"po\":%d,\"pt\":\"%s\",\"st\":%d,\"lu\":%d,\"ld\":%d}", + sep, s->sock_id, s->name, ip_str, port, pn, state, lu, ld); while (pos + needed + 2 > cap) { char* tmp = u_realloc(json, cap * 2); if (!tmp) break; json = tmp; cap *= 2; } if (pos + needed + 2 <= cap) pos += (size_t)snprintf(json + pos, cap - pos, - "%s{\"si\":%u,\"nm\":\"%s\",\"ad\":\"%s\",\"po\":%d,\"pt\":\"TCP\",\"st\":%d,\"lu\":%d,\"ld\":%d}", - sep, s->sock_id, s->name, ip_str, port, state, lu, ld); + "%s{\"si\":%u,\"nm\":\"%s\",\"ad\":\"%s\",\"po\":%d,\"pt\":\"%s\",\"st\":%d,\"lu\":%d,\"ld\":%d}", + sep, s->sock_id, s->name, ip_str, port, pn, state, lu, ld); s = s->next; } }