keepalive handshake: device_type + keepalive negotiation in UDP/TCP INIT
- Добавлен device_type (1 байт, CLIENT_TYPE_*) в INIT_REQUEST и INIT_RESPONSE - Добавлен keepalive_interval (2 байта) в INIT_RESPONSE - STCP handshake расширен с 43 до 46 байт (device_type+keepalive) - negotiate_keepalive(): оба desktop/server → min, иначе (есть mobile) → max - keepalive_interval вынесен в UTUN_INSTANCE для использования в handshake - stcp_client_connect() принимает device_type и keepalive_interval - peer_device_type/peer_keepalive_interval передаются через stcp_link в ETCP_LINK
This commit is contained in:
1 parent
43aca4a41b
commit
0f1bd3d120
37 files changed
+535
-309
No files matched your search
@@ -38,6 +38,8 @@ QString AccountList::addrStr(const void* addr, int family) {
|
||||
}
|
||||
if (family == 6) {
|
||||
const uint16_t* a = (const uint16_t*)addr;
|
||||
int zero = 1; for (int i = 0; i < 8; i++) if (a[i]) { zero = 0; break; }
|
||||
if (zero) return "[::]";
|
||||
return QString("%1:%2:%3:%4:%5:%6:%7:%8")
|
||||
.arg(ntohs(a[0]), 0, 16).arg(ntohs(a[1]), 0, 16)
|
||||
.arg(ntohs(a[2]), 0, 16).arg(ntohs(a[3]), 0, 16)
|
||||
@@ -336,8 +338,16 @@ void AccountList::updateDetailDisplay() {
|
||||
QString lc = (lk.linkState == 3 && lk.linkStatus == 1) ? "#4CAF50" : "#E53935";
|
||||
QString left = QString("%1:%2").arg(addrStr(lk.localAddr.constData(), lk.localFamily)).arg(lk.localPort);
|
||||
QString right = QString("%1:%2").arg(addrStr(lk.addr.constData(), lk.family)).arg(lk.port);
|
||||
lines.append(QString("<span style='color:%1;'>●</span> %2 %3 → %4")
|
||||
.arg(lc, proto, left, right));
|
||||
const char* arrow = lk.isServer
|
||||
? "<b style='color:#FF9800;font-size:13pt;'>◀</b>"
|
||||
: "<b style='color:#2196F3;font-size:13pt;'>▶</b>";
|
||||
if (lk.localFamily == 6 || lk.family == 6) {
|
||||
lines.append(QString("<span style='color:%1;'>●</span> %2 %3:%4").arg(lc, proto, addrStr(lk.localAddr.constData(), lk.localFamily)).arg(lk.localPort));
|
||||
lines.append(QString(" %1 %2:%3").arg(arrow, addrStr(lk.addr.constData(), lk.family)).arg(lk.port));
|
||||
} else {
|
||||
lines.append(QString("<span style='color:%1;'>●</span> %2 %3 %4 %5")
|
||||
.arg(lc, proto, left, arrow, right));
|
||||
}
|
||||
}
|
||||
/* DB addresses without live link */
|
||||
for (const auto& a : m_detailAddrs) {
|
||||
|
||||
@@ -27,7 +27,7 @@ struct TOPO_GROUP_NODE;
|
||||
#define GUI_EVT_NODE_CHANGED 11 /* data: [node_id:8] */
|
||||
#define GUI_EVT_ATTACHMENT_DOWNLOADED 14 /* data: [ch_id_len:1][ch_id:var][msg_id:8] */
|
||||
#define GUI_EVT_DOWNLOAD_PROGRESS 15 /* data: [ch_id_len:1][ch_id:var][msg_id:8][blocks_done:4][num_blocks:4] */
|
||||
#define GUI_EVT_NODEINFO_UPDATE 16 /* data: node_id:8 conn_presence:1 conn_up:1 best_rtt_packed:2 */
|
||||
#define GUI_EVT_NODEINFO_UPDATE 16 /* data: node_id:8 conn_presence:1 conn_up:1 best_rtt:2(0.1ms,0xFFFF=nodata) */
|
||||
#define GUI_EVT_CONN_LIST 20 /* data: [count:2][entry:46B]* — binary conn list */
|
||||
#define GUI_EVT_CONN_METRICS 21 /* data: text dump of selected connection metrics */
|
||||
#define GUI_EVT_MEMBER_DETAIL 22 /* data: [node_id:8][flags:1][own_tcp_active:2][links...][socks...] — live snapshot for member detail panel */
|
||||
|
||||
@@ -318,12 +318,15 @@ void gui_bridge_set_member_removed_cb(gui_member_removed_fn cb) {
|
||||
extern "C" void gui_nodeinfo_cb_impl(struct TOPO_GROUP* group, struct TOPO_GROUP_NODE* nq, void* arg) {
|
||||
(void)arg;
|
||||
if (!nq) return;
|
||||
uint16_t best_rtt = node_best_rtt(nq);
|
||||
uint8_t data[12];
|
||||
uint16_t best_rtt = topo_get_chain_rtt(nq);
|
||||
uint8_t data[16];
|
||||
memcpy(data, &nq->node_id, 8);
|
||||
data[8] = nq->conn_presence;
|
||||
data[9] = nq->conn_up;
|
||||
memcpy(data + 10, &best_rtt, 2);
|
||||
uint16_t bgp_nodes = group ? (uint16_t)queue_entry_count(group->nodes) : 0;
|
||||
memcpy(data + 12, &bgp_nodes, 2);
|
||||
memcpy(data + 14, &bgp_nodes, 2);
|
||||
gui_bridge_post(GUI_EVT_NODEINFO_UPDATE, data, sizeof(data));
|
||||
}
|
||||
|
||||
|
||||
@@ -217,19 +217,20 @@ QList<NodeAddr> UtunNode::getInviteAddresses(DbManager* db) {
|
||||
|
||||
/* 3) TCP from local TCP sockets */
|
||||
{
|
||||
struct ETCP_SOCKET* ts = m_instance->tcp_sockets;
|
||||
while (ts) {
|
||||
struct sockaddr_storage* sa = &ts->interface_addr;
|
||||
struct ETCP_SOCKET* s = m_instance->etcp_sockets;
|
||||
while (s) {
|
||||
if (!s->is_tcp) { s = s->next; continue; }
|
||||
struct sockaddr_storage* sa = &s->interface_addr;
|
||||
if (sa->ss_family == AF_INET) {
|
||||
struct sockaddr_in* sin = (struct sockaddr_in*)sa;
|
||||
QByteArray addr((const char*)&sin->sin_addr, 4);
|
||||
add_addr(addr, ntohs(sin->sin_port), 4, (int)ts->sock_id, INVITE_PROTO_TCP);
|
||||
add_addr(addr, ntohs(sin->sin_port), 4, (int)s->sock_id, INVITE_PROTO_TCP);
|
||||
} else if (sa->ss_family == AF_INET6) {
|
||||
struct sockaddr_in6* sin6 = (struct sockaddr_in6*)sa;
|
||||
QByteArray addr((const char*)&sin6->sin6_addr, 16);
|
||||
add_addr(addr, ntohs(sin6->sin6_port), 6, (int)ts->sock_id, INVITE_PROTO_TCP);
|
||||
add_addr(addr, ntohs(sin6->sin6_port), 6, (int)s->sock_id, INVITE_PROTO_TCP);
|
||||
}
|
||||
ts = ts->next;
|
||||
s = s->next;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user