Browse Source

member_sync: fix p-6 for ip pointer, add stcp link addr+status to JNI bridge

topo_upd
evgeny 2 months ago
parent
commit
13c6ef2210
  1. 2
      src/chat/member_sync.c
  2. 4
      src/transport_layer/stcp_link.c
  3. 1
      src/transport_layer/stcp_link.h
  4. 24
      tools/chatgui-android/jni_bridge/android_jni_bridge.c

2
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 {

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

1
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);

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

Loading…
Cancel
Save