diff --git a/src/chat/member_sync.c b/src/chat/member_sync.c index c28d2d36..cdc4fa2a 100644 --- a/src/chat/member_sync.c +++ b/src/chat/member_sync.c @@ -558,7 +558,7 @@ int member_sync_put(struct UTUN_INSTANCE* inst, const char* ch_id, sqlite3_bind_int(as, 6, (int)sid); sqlite3_step(as); sqlite3_reset(as); if (fam == 4) { - const uint8_t* ip = p - 7; /* p advanced by ip_sz(4) + port(2) - back to start of ip */ + const uint8_t* ip = p - 6; /* p advanced by ip_sz(4) + port(2) - back to start of ip */ DEBUG_INFO(DEBUG_CATEGORY_DEBUG, "%s: [ADDR_SYNC] member_sync_put INSERT node=0x%016llx proto=%d sock=%d %d.%d.%d.%d:%d", MS_ID, (unsigned long long)member_id, proto, sid, ip[0], ip[1], ip[2], ip[3], port); } else { diff --git a/src/transport_layer/stcp_link.c b/src/transport_layer/stcp_link.c index b6baf1f7..4a7d9065 100644 --- a/src/transport_layer/stcp_link.c +++ b/src/transport_layer/stcp_link.c @@ -226,6 +226,10 @@ struct ETCP_CONN *stcp_link_get_etcp_conn(struct stcp_link *link) { return link ? &link->etcp_conn : NULL; } +const struct sockaddr_storage *stcp_link_get_remote_addr(struct stcp_link *link) { + return link && link->cfg.remote_addr ? link->cfg.remote_addr : NULL; +} + void stcp_link_set_on_ready(struct stcp_link *link, stcp_link_cb cb, void *arg) { if (!link) return; link->on_ready_cb = cb; diff --git a/src/transport_layer/stcp_link.h b/src/transport_layer/stcp_link.h index 7e70f55c..38a0abc0 100644 --- a/src/transport_layer/stcp_link.h +++ b/src/transport_layer/stcp_link.h @@ -51,6 +51,7 @@ int stcp_link_send(struct stcp_link *link, const uint8_t *data, size_t len); int stcp_link_is_ready(struct stcp_link *link); struct ETCP_CONN *stcp_link_get_etcp_conn(struct stcp_link *link); +const struct sockaddr_storage *stcp_link_get_remote_addr(struct stcp_link *link); typedef void (*stcp_link_cb)(struct stcp_link *link, void *arg); void stcp_link_set_on_ready(struct stcp_link *link, stcp_link_cb cb, void *arg); diff --git a/tools/chatgui-android/jni_bridge/android_jni_bridge.c b/tools/chatgui-android/jni_bridge/android_jni_bridge.c index a545de01..2d984e9e 100644 --- a/tools/chatgui-android/jni_bridge/android_jni_bridge.c +++ b/tools/chatgui-android/jni_bridge/android_jni_bridge.c @@ -779,6 +779,30 @@ char* utun_bridge_get_member_links_json(uint64_t node_id) { "%s{\"fm\":%d,\"ad\":\"%s\",\"po\":%d,\"st\":%d,\"ls\":%d}", sep, fm, ip, (int)po, lk->link_state, lk->link_status); } + if (conn->transport_link) { + struct stcp_link* tcp = (struct stcp_link*)conn->transport_link; + const struct sockaddr_storage* sa = stcp_link_get_remote_addr(tcp); + if (sa && pos < (int)sizeof(buf) - 100) { + char ip[INET6_ADDRSTRLEN] = ""; + int fm = 0; uint16_t po = 0; + if (sa->ss_family == AF_INET) { + struct sockaddr_in* sin = (struct sockaddr_in*)sa; + inet_ntop(AF_INET, &sin->sin_addr, ip, sizeof(ip)); + fm = 4; po = ntohs(sin->sin_port); + } else if (sa->ss_family == AF_INET6) { + struct sockaddr_in6* sin6 = (struct sockaddr_in6*)sa; + inet_ntop(AF_INET6, &sin6->sin6_addr, ip, sizeof(ip)); + fm = 6; po = ntohs(sin6->sin6_port); + } + if (ip[0]) { + int ready = stcp_link_is_ready(tcp); + const char* sep = first ? "" : ","; + pos += snprintf(buf + pos, sizeof(buf) - (size_t)pos, + "%s{\"fm\":%d,\"ad\":\"%s\",\"po\":%d,\"st\":%d,\"ls\":%d}", + sep, fm, ip, (int)po, ready ? 3 : 1, ready ? 1 : 0); + } + } + } pos += snprintf(buf + pos, sizeof(buf) - (size_t)pos, "]}"); return u_strdup(buf); }