static int send_getnodes(const Group_Chat *chat, IP_Port ip_port, int peernum) { if ((uint32_t)peernum >= chat->numpeers) return -1; if (!is_timeout(chat->group[peernum].last_pinged, GROUP_PING_TIMEOUT)) return -1; getnodes_data contents; contents.pingid = random_64b(); chat->group[peernum].last_pinged = unix_time(); chat->group[peernum].pingid = contents.pingid; chat->group[peernum].ping_via = ip_port; if (chat->assoc) { IPPTs ippts; ippts.timestamp = unix_time(); ippts.ip_port = ip_port; Assoc_add_entry(chat->assoc, chat->group[peernum].client_id, &ippts, NULL, 1); } return send_groupchatpacket(chat, ip_port, chat->group[peernum].client_id, (uint8_t *)&contents, sizeof(contents), CRYPTO_PACKET_GROUP_CHAT_GET_NODES); }
/* * Send data to all peers in close peer list. * * return the number of peers the packet was sent to. */ static uint8_t sendto_allpeers(Group_Chat *chat, uint8_t *data, uint16_t length, uint8_t request_id) { uint16_t sent = 0; uint32_t i; for (i = 0; i < GROUP_CLOSE_CONNECTIONS; ++i) { if (ip_isset(&chat->close[i].ip_port.ip) && !is_timeout(chat->close[i].last_recv, BAD_GROUPNODE_TIMEOUT)) { if (send_groupchatpacket(chat, chat->close[i].ip_port, chat->close[i].client_id, data, length, request_id) == 0) ++sent; } } return sent; }
static int send_getnodes(Group_Chat *chat, IP_Port ip_port, int peernum) { if ((uint32_t)peernum >= chat->numpeers) return -1; if (!is_timeout(chat->group[peernum].last_pinged, PING_TIMEOUT)) return -1; getnodes_data contents; contents.pingid = ((uint64_t)random_int() << 32) + random_int(); chat->group[peernum].last_pinged = unix_time(); chat->group[peernum].pingid = contents.pingid; return send_groupchatpacket(chat, ip_port, chat->group[peernum].client_id, (uint8_t *)&contents, sizeof(contents), 48); }
static int send_sendnodes(Group_Chat *chat, IP_Port ip_port, int peernum, uint64_t pingid) { if ((uint32_t)peernum >= chat->numpeers) return -1; sendnodes_data contents; contents.pingid = pingid; uint32_t i, j = 0; for (i = 0; i < GROUP_CLOSE_CONNECTIONS; ++i) { if (!is_timeout(chat->close[i].last_recv, BAD_GROUPNODE_TIMEOUT)) { id_copy(contents.nodes[j].client_id, chat->close[i].client_id); contents.nodes[j].ip_port = chat->close[i].ip_port; ++j; } } return send_groupchatpacket(chat, ip_port, chat->group[peernum].client_id, (uint8_t *)&contents, sizeof(contents.pingid) + sizeof(groupchat_nodes) * j, CRYPTO_PACKET_GROUP_CHAT_SEND_NODES); }