int handle_getnodes(uint8_t * packet, uint32_t length, IP_Port source) { uint64_t ping_id; if(length != 1 + CLIENT_ID_SIZE + crypto_box_NONCEBYTES + sizeof(ping_id) + CLIENT_ID_SIZE + ENCRYPTION_PADDING) { return 1; } if(memcmp(packet + 1, self_public_key, CLIENT_ID_SIZE) == 0)//check if packet is from ourself. { return 1; } uint8_t plain[sizeof(ping_id) + CLIENT_ID_SIZE]; int len = decrypt_data(packet + 1, self_secret_key, packet + 1 + CLIENT_ID_SIZE, packet + 1 + CLIENT_ID_SIZE + crypto_box_NONCEBYTES, sizeof(ping_id) + CLIENT_ID_SIZE + ENCRYPTION_PADDING, plain); if(len != sizeof(ping_id) + CLIENT_ID_SIZE) { return 1; } memcpy(&ping_id, plain, sizeof(ping_id)); sendnodes(source, packet + 1, plain + sizeof(ping_id), ping_id); pingreq(source, packet + 1);//TODO: make this smarter? return 0; }
int handle_getnodes(char * packet, uint32_t length, IP_Port source) { if(length != (5 + CLIENT_ID_SIZE*2)) { return 1; } uint32_t ping_id; memcpy(&ping_id, packet + 1, 4); sendnodes(source, packet + 5 + CLIENT_ID_SIZE, ping_id); IP_Port bad_ip = {{{0}}, 0}; if(is_gettingnodes(bad_ip, ping_id))//check if packet is from ourself. { return 1; } pingreq(source); return 0; }