int DHT_handlepacket(char * packet, uint32_t length, IP_Port source) { switch (packet[0]) { case 0: return handle_pingreq(packet, length, source); case 1: return handle_pingres(packet, length, source); case 2: return handle_getnodes(packet, length, source); case 3: return handle_sendnodes(packet, length, source); default: return 1; } return 0; }
int handle_groupchatpacket(Group_Chat *chat, IP_Port source, uint8_t *packet, uint32_t length) { if (length > MAX_DATA_SIZE) return 1; uint8_t public_key[crypto_box_PUBLICKEYBYTES]; uint8_t data[MAX_DATA_SIZE]; uint8_t number; int len = handle_request(chat->self_public_key, chat->self_secret_key, public_key, data, &number, packet, length); if (len <= 0) return 1; if (id_equal(chat->self_public_key, public_key)) return 1; int peernum = peer_in_chat(chat, public_key); if (peernum == -1) return 1; switch (number) { case CRYPTO_PACKET_GROUP_CHAT_GET_NODES: return handle_getnodes(chat, source, peernum, data, len); case CRYPTO_PACKET_GROUP_CHAT_SEND_NODES: return handle_sendnodes(chat, source, peernum, data, len); case CRYPTO_PACKET_GROUP_CHAT_BROADCAST: return handle_data(chat, data, len); default: return 1; } return 1; }