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; } }