Browse Source

move is_server indicator from per-connection to per-link in member detail and links JSON

topo_upd
evgeny 2 months ago
parent
commit
477b4dfc98
  1. 13
      src/chat/chat_status.c
  2. 16
      tools/chatgui-android/jni_bridge/android_jni_bridge.c
  3. 38
      tools/chatgui/src/accountlist.cpp
  4. 3
      tools/chatgui/src/accountlist.h
  5. 2
      tools/chatgui/transport/gui_bridge.h

13
src/chat/chat_status.c

@ -301,15 +301,15 @@ void chat_core_collect_conn_metrics_trampoline(void* arg) {
} }
/* ── Live-снапшот для панели деталей участника ── /* ── Live-снапшот для панели деталей участника ──
* packet: [node_id:8][flags:1][own_tcp_active:2][link_count:1](link:24B)*[sock_count:1](sock:48B)* * packet: [node_id:8][flags:1][own_tcp_active:2][link_count:1](link:25B)*[sock_count:1](sock:48B)*
* flags: bit0=conn_present bit1=conn_up(links_up) bit2=conn_initialized bit3=client bit4=server * flags: bit0=conn_present bit1=conn_up(links_up) bit2=conn_initialized
* link: [is_tcp:1][link_state:1][link_status:1][tcp_ready:1][family:1][addr_len:1][addr:16][port:2] * link: [is_tcp:1][link_state:1][link_status:1][tcp_ready:1][is_server:1][family:1][addr_len:1][addr:16][port:2]
* sock: [sock_id:4][port:2][link_count:4][ifname:38] * sock: [sock_id:4][port:2][link_count:4][ifname:38]
* Собирается в worker-потоке — читает живые структуры UTUN_INSTANCE безопасно. */ * Собирается в worker-потоке — читает живые структуры UTUN_INSTANCE безопасно. */
#define MEMBER_DETAIL_MAX_LINKS 16 #define MEMBER_DETAIL_MAX_LINKS 16
#define MEMBER_DETAIL_MAX_SOCKS 16 #define MEMBER_DETAIL_MAX_SOCKS 16
#define MEMBER_DETAIL_LINK_SIZE 24 #define MEMBER_DETAIL_LINK_SIZE 25
#define MEMBER_DETAIL_SOCK_SIZE 48 #define MEMBER_DETAIL_SOCK_SIZE 48
/* Повторяет Qt: name.lastIndexOf("_v") → name.mid(3, idx - 3) */ /* Повторяет Qt: name.lastIndexOf("_v") → name.mid(3, idx - 3) */
@ -337,10 +337,6 @@ static void collect_member_detail(uint64_t node_id) {
flags |= 1; flags |= 1;
if (conn->links_up) flags |= 2; if (conn->links_up) flags |= 2;
if (conn->initialized) flags |= 4; if (conn->initialized) flags |= 4;
if (conn->links) {
if (!conn->links->is_server) flags |= 8;
else flags |= 16;
}
} }
uint16_t own_tcp_active = 0; uint16_t own_tcp_active = 0;
@ -388,6 +384,7 @@ static void collect_member_detail(uint64_t node_id) {
*p++ = lk->link_state; *p++ = lk->link_state;
*p++ = lk->link_status; *p++ = lk->link_status;
*p++ = (lk->is_tcp && lk->tcp_link && stcp_link_is_ready(lk->tcp_link)) ? 1 : 0; *p++ = (lk->is_tcp && lk->tcp_link && stcp_link_is_ready(lk->tcp_link)) ? 1 : 0;
*p++ = lk->is_server;
uint8_t family = 0, addr_len = 0; uint8_t addr[16] = {0}; uint16_t port = 0; uint8_t family = 0, addr_len = 0; uint8_t addr[16] = {0}; uint16_t port = 0;
const struct sockaddr_storage* sa = &lk->remote_addr; const struct sockaddr_storage* sa = &lk->remote_addr;
if (sa->ss_family == AF_INET) { if (sa->ss_family == AF_INET) {

16
tools/chatgui-android/jni_bridge/android_jni_bridge.c

@ -812,14 +812,6 @@ char* utun_bridge_get_member_detail_json(const char* channel_id, uint64_t node_i
} }
char peers_tbl[80]; peers_table_name(channel_id, peers_tbl, sizeof(peers_tbl)); char peers_tbl[80]; peers_table_name(channel_id, peers_tbl, sizeof(peers_tbl));
{ /* server/client role */
struct ETCP_CONN* detail_conn = NULL;
if (g_cc.inst) detail_conn = instance_find_conn(g_cc.inst, node_id);
const char* sc = (detail_conn && detail_conn->links)
? (detail_conn->links->is_server ? "S" : "C") : "";
pos += (size_t)snprintf(buf + pos, sizeof(buf) - pos, ",\"sc\":\"%s\"", sc);
}
snprintf(buf + pos, sizeof(buf) - pos, ",\"adr\":["); pos += strlen(buf + pos); snprintf(buf + pos, sizeof(buf) - pos, ",\"adr\":["); pos += strlen(buf + pos);
if (sqlite3_prepare_v2(db, if (sqlite3_prepare_v2(db,
@ -1038,8 +1030,8 @@ char* utun_bridge_get_member_links_json(uint64_t node_id) {
if (!ip[0]) continue; if (!ip[0]) continue;
const char* sep = first ? "" : ","; first = 0; const char* sep = first ? "" : ","; first = 0;
pos += snprintf(buf + pos, sizeof(buf) - (size_t)pos, pos += snprintf(buf + pos, sizeof(buf) - (size_t)pos,
"%s{\"fm\":%d,\"ad\":\"%s\",\"po\":%d,\"st\":%d,\"ls\":%d}", "%s{\"fm\":%d,\"ad\":\"%s\",\"po\":%d,\"st\":%d,\"ls\":%d,\"is\":%d}",
sep, fm, ip, (int)po, lk->link_state, lk->link_status); sep, fm, ip, (int)po, lk->link_state, lk->link_status, lk->is_server);
} }
for (struct ETCP_LINK* lk2 = conn->links; lk2; lk2 = lk2->next) { for (struct ETCP_LINK* lk2 = conn->links; lk2; lk2 = lk2->next) {
if (!lk2->is_tcp || !lk2->tcp_link) continue; if (!lk2->is_tcp || !lk2->tcp_link) continue;
@ -1062,8 +1054,8 @@ char* utun_bridge_get_member_links_json(uint64_t node_id) {
int ready = stcp_link_is_ready(tcp); int ready = stcp_link_is_ready(tcp);
const char* sep = first ? "" : ","; first = 0; const char* sep = first ? "" : ","; first = 0;
pos += snprintf(buf + pos, sizeof(buf) - (size_t)pos, pos += snprintf(buf + pos, sizeof(buf) - (size_t)pos,
"%s{\"fm\":%d,\"ad\":\"%s\",\"po\":%d,\"st\":%d,\"ls\":%d}", "%s{\"fm\":%d,\"ad\":\"%s\",\"po\":%d,\"st\":%d,\"ls\":%d,\"is\":%d}",
sep, fm, ip, (int)po, ready ? 3 : 1, ready ? 1 : 0); sep, fm, ip, (int)po, ready ? 3 : 1, ready ? 1 : 0, lk2->is_server);
} }
if (pos < (int)sizeof(buf)) if (pos < (int)sizeof(buf))
pos += snprintf(buf + pos, sizeof(buf) - (size_t)pos, "]}"); pos += snprintf(buf + pos, sizeof(buf) - (size_t)pos, "]}");

38
tools/chatgui/src/accountlist.cpp

@ -154,8 +154,6 @@ void AccountList::showMemberDetail(quint64 nodeId) {
m_snapConnPresent = false; m_snapConnPresent = false;
m_snapConnUp = false; m_snapConnUp = false;
m_snapConnInit = false; m_snapConnInit = false;
m_snapClient = false;
m_snapServer = false;
m_snapOwnTcpActive = 0; m_snapOwnTcpActive = 0;
m_snapLinks.clear(); m_snapLinks.clear();
m_snapSocks.clear(); m_snapSocks.clear();
@ -246,8 +244,6 @@ void AccountList::onMemberDetailData(uint64_t nodeId, const uint8_t* data, int l
m_snapConnPresent = (flags & 1) != 0; m_snapConnPresent = (flags & 1) != 0;
m_snapConnUp = (flags & 2) != 0; m_snapConnUp = (flags & 2) != 0;
m_snapConnInit = (flags & 4) != 0; m_snapConnInit = (flags & 4) != 0;
m_snapClient = (flags & 8) != 0;
m_snapServer = (flags & 16) != 0;
uint16_t ownTcpActive; uint16_t ownTcpActive;
memcpy(&ownTcpActive, p, 2); p += 2; memcpy(&ownTcpActive, p, 2); p += 2;
m_snapOwnTcpActive = ownTcpActive; m_snapOwnTcpActive = ownTcpActive;
@ -261,10 +257,11 @@ void AccountList::onMemberDetailData(uint64_t nodeId, const uint8_t* data, int l
lk.linkState = p[1]; lk.linkState = p[1];
lk.linkStatus = p[2]; lk.linkStatus = p[2];
lk.tcpReady = p[3] != 0; lk.tcpReady = p[3] != 0;
lk.family = p[4]; lk.isServer = p[4] != 0;
int addrLen = p[5]; lk.family = p[5];
lk.addr = QByteArray((const char*)p + 6, qMin(addrLen, 16)); int addrLen = p[6];
memcpy(&lk.port, p + 22, 2); lk.addr = QByteArray((const char*)p + 7, qMin(addrLen, 16));
memcpy(&lk.port, p + 23, 2);
p += MEMBER_DETAIL_LINK_SIZE; p += MEMBER_DETAIL_LINK_SIZE;
m_snapLinks.append(lk); m_snapLinks.append(lk);
} }
@ -306,11 +303,8 @@ void AccountList::updateDetailDisplay() {
lines.append(QString("ID:0x%1").arg(m_detailNodeId, 16, 16, QChar('0'))); lines.append(QString("ID:0x%1").arg(m_detailNodeId, 16, 16, QChar('0')));
QString dotColor = m_detailOnline ? "#4CAF50" : "#9E9E9E"; QString dotColor = m_detailOnline ? "#4CAF50" : "#9E9E9E";
QString scLabel; lines.append(QString("<span style='color:%1;'>●</span> %2")
if (m_snapClient) scLabel = " C"; .arg(dotColor, m_detailName.toHtmlEscaped()));
else if (m_snapServer) scLabel = " S";
lines.append(QString("<span style='color:%1;'>●</span> %2%3")
.arg(dotColor, m_detailName.toHtmlEscaped(), scLabel));
if (m_detailLastSeen > 0) if (m_detailLastSeen > 0)
lines.append(QString("⌛ %1").arg(relativeTimeStr(m_detailLastSeen))); lines.append(QString("⌛ %1").arg(relativeTimeStr(m_detailLastSeen)));
@ -323,18 +317,19 @@ void AccountList::updateDetailDisplay() {
for (const auto& a : m_detailAddrs) { for (const auto& a : m_detailAddrs) {
QString proto; QString proto;
switch (a.protocol) { case 1: proto = "UDP"; break; case 2: proto = "TCP"; break; default: proto = "UDP/TCP"; break; } switch (a.protocol) { case 1: proto = "UDP"; break; case 2: proto = "TCP"; break; default: proto = "UDP/TCP"; break; }
QString linkColor = "#9E9E9E"; QString linkColor = "#9E9E9E"; QString scRole;
if (m_snapConnPresent) { if (m_snapConnPresent) {
for (const auto& lk : m_snapLinks) { for (const auto& lk : m_snapLinks) {
if (lk.family == a.family && lk.port == a.port if (lk.family == a.family && lk.port == a.port
&& lk.addr == a.addr) { && lk.addr == a.addr) {
linkColor = (lk.linkState == 3 && lk.linkStatus == 1) ? "#4CAF50" : "#E53935"; linkColor = (lk.linkState == 3 && lk.linkStatus == 1) ? "#4CAF50" : "#E53935";
scRole = lk.isServer ? " S" : " C";
break; break;
} }
} }
if (linkColor == "#9E9E9E" && a.protocol == 2) { if (linkColor == "#9E9E9E" && a.protocol == 2) {
for (const auto& lk : m_snapLinks) { for (const auto& lk : m_snapLinks) {
if (lk.isTcp && lk.tcpReady) { linkColor = "#4CAF50"; break; } if (lk.isTcp && lk.tcpReady) { linkColor = "#4CAF50"; scRole = lk.isServer ? " S" : " C"; break; }
} }
} }
} }
@ -353,13 +348,13 @@ void AccountList::updateDetailDisplay() {
} }
if (!a.ifname.isEmpty()) { if (!a.ifname.isEmpty()) {
lines.append(QString("%1<span style='color:%2;'>●</span> %3 %4") lines.append(QString("%1<span style='color:%2;'>●</span> %3%4 %5")
.arg(prefix, linkColor, proto, a.ifname)); .arg(prefix, linkColor, proto, scRole, a.ifname));
lines.append(QString("&nbsp;&nbsp;%1:<span style='color:#FF9800;'>%2</span>") lines.append(QString("&nbsp;&nbsp;%1:<span style='color:#FF9800;'>%2</span>")
.arg(addrStr(a.addr.constData(), a.family)).arg(a.port)); .arg(addrStr(a.addr.constData(), a.family)).arg(a.port));
} else { } else {
lines.append(QString("%1<span style='color:%2;'>●</span> %3:%4:%5") lines.append(QString("%1<span style='color:%2;'>●</span> %3%4:%5:%6")
.arg(prefix, linkColor, proto, addrStr(a.addr.constData(), a.family)).arg(a.port)); .arg(prefix, linkColor, proto, scRole, addrStr(a.addr.constData(), a.family)).arg(a.port));
} }
} }
@ -374,9 +369,10 @@ void AccountList::updateDetailDisplay() {
} }
if (matched) continue; if (matched) continue;
QString proto = lk.isTcp ? "TCP" : "UDP"; QString proto = lk.isTcp ? "TCP" : "UDP";
QString sc = lk.isServer ? " S" : " C";
QString lc = (lk.linkState == 3 && lk.linkStatus == 1) ? "#4CAF50" : "#E53935"; QString lc = (lk.linkState == 3 && lk.linkStatus == 1) ? "#4CAF50" : "#E53935";
lines.append(QString("<span style='color:%1;'>●</span> %2:%3:%4 [link]") lines.append(QString("<span style='color:%1;'>●</span> %2%3:%4:%5 [link]")
.arg(lc, proto, addrStr(lk.addr.constData(), lk.family)).arg(lk.port)); .arg(lc, proto, sc, addrStr(lk.addr.constData(), lk.family)).arg(lk.port));
} }
} }

3
tools/chatgui/src/accountlist.h

@ -26,6 +26,7 @@ struct MemberLinkSnap {
int linkState; int linkState;
int linkStatus; int linkStatus;
bool tcpReady; bool tcpReady;
bool isServer;
int family; int family;
QByteArray addr; QByteArray addr;
uint16_t port; uint16_t port;
@ -89,8 +90,6 @@ private:
bool m_snapConnPresent = false; bool m_snapConnPresent = false;
bool m_snapConnUp = false; bool m_snapConnUp = false;
bool m_snapConnInit = false; bool m_snapConnInit = false;
bool m_snapClient = false;
bool m_snapServer = false;
int m_snapOwnTcpActive = 0; int m_snapOwnTcpActive = 0;
QVector<MemberLinkSnap> m_snapLinks; QVector<MemberLinkSnap> m_snapLinks;
QVector<MemberSockSnap> m_snapSocks; QVector<MemberSockSnap> m_snapSocks;

2
tools/chatgui/transport/gui_bridge.h

@ -36,7 +36,7 @@ struct TOPO_GROUP_NODE;
#define GUI_EVT_MEMBER_REMOVED 25 /* data: [ch_id_len:1][ch_id:var][node_id:8] — мембер удалён из канала */ #define GUI_EVT_MEMBER_REMOVED 25 /* data: [ch_id_len:1][ch_id:var][node_id:8] — мембер удалён из канала */
/* Размеры элементов пакета GUI_EVT_MEMBER_DETAIL (должны совпадать с chat_status.c) */ /* Размеры элементов пакета GUI_EVT_MEMBER_DETAIL (должны совпадать с chat_status.c) */
#define MEMBER_DETAIL_LINK_SIZE 24 #define MEMBER_DETAIL_LINK_SIZE 25
#define MEMBER_DETAIL_SOCK_SIZE 48 #define MEMBER_DETAIL_SOCK_SIZE 48
#define MEMBER_DETAIL_MAX_LINKS 16 #define MEMBER_DETAIL_MAX_LINKS 16
#define MEMBER_DETAIL_MAX_SOCKS 16 #define MEMBER_DETAIL_MAX_SOCKS 16

Loading…
Cancel
Save