From 99d9ecf74cab43ca6ae24ab5dd62a3b758b3e666 Mon Sep 17 00:00:00 2001 From: plutooo Date: Mon, 5 Aug 2013 15:04:38 -0700 Subject: core: Move send ping packets functions to ping.c --- core/DHT.c | 84 ++++++++------------------------------------------------------ 1 file changed, 10 insertions(+), 74 deletions(-) (limited to 'core/DHT.c') diff --git a/core/DHT.c b/core/DHT.c index 01abfdd2..fa36d41f 100644 --- a/core/DHT.c +++ b/core/DHT.c @@ -24,6 +24,7 @@ /*----------------------------------------------------------------------------------*/ #include "DHT.h" +#include "packets.h" #include "ping.h" /* maximum number of clients stored per friend. */ @@ -472,71 +473,6 @@ static uint64_t add_gettingnodes(IP_Port ip_port) return 0; } -/* send a ping request, only works if none has been sent to that ip/port - * in the last 5 seconds. - */ -static int pingreq(IP_Port ip_port, uint8_t * public_key) -{ - /* check if packet is gonna be sent to ourself */ - if(id_equal(public_key, self_public_key) || is_pinging(ip_port, 0)) - return 1; - - uint64_t ping_id = add_ping(ip_port); - if(ping_id == 0) - return 1; - - uint8_t data[1 + CLIENT_ID_SIZE + crypto_box_NONCEBYTES + sizeof(ping_id) + ENCRYPTION_PADDING]; - uint8_t encrypt[sizeof(ping_id) + ENCRYPTION_PADDING]; - uint8_t nonce[crypto_box_NONCEBYTES]; - random_nonce(nonce); - - int len = encrypt_data( public_key, - self_secret_key, - nonce, - (uint8_t *)&ping_id, - sizeof(ping_id), - encrypt ); - - if(len != sizeof(ping_id) + ENCRYPTION_PADDING) - return -1; - - data[0] = 0; - memcpy(data + 1, self_public_key, CLIENT_ID_SIZE); - memcpy(data + 1 + CLIENT_ID_SIZE, nonce, crypto_box_NONCEBYTES); - memcpy(data + 1 + CLIENT_ID_SIZE + crypto_box_NONCEBYTES, encrypt, len); - - return sendpacket(ip_port, data, sizeof(data)); -} - -/* send a ping response */ -static int pingres(IP_Port ip_port, uint8_t * public_key, uint64_t ping_id) -{ - /* check if packet is gonna be sent to ourself */ - if(id_equal(public_key, self_public_key)) - return 1; - - uint8_t data[1 + CLIENT_ID_SIZE + crypto_box_NONCEBYTES + sizeof(ping_id) + ENCRYPTION_PADDING]; - uint8_t encrypt[sizeof(ping_id) + ENCRYPTION_PADDING]; - uint8_t nonce[crypto_box_NONCEBYTES]; - random_nonce(nonce); - - int len = encrypt_data( public_key, - self_secret_key, nonce, - (uint8_t *)&ping_id, - sizeof(ping_id), - encrypt ); - - if(len != sizeof(ping_id) + ENCRYPTION_PADDING) - return -1; - - data[0] = 1; - memcpy(data + 1, self_public_key, CLIENT_ID_SIZE); - memcpy(data + 1 + CLIENT_ID_SIZE, nonce, crypto_box_NONCEBYTES); - memcpy(data + 1 + CLIENT_ID_SIZE + crypto_box_NONCEBYTES, encrypt, len); - - return sendpacket(ip_port, data, sizeof(data)); -} - /* send a getnodes request */ static int getnodes(IP_Port ip_port, uint8_t * public_key, uint8_t * client_id) { @@ -641,8 +577,8 @@ static int handle_pingreq(uint8_t * packet, uint32_t length, IP_Port source) if(len != sizeof(ping_id)) return 1; - pingres(source, packet + 1, ping_id); - pingreq(source, packet + 1); /* TODO: make this smarter? */ + send_ping_response(source, (clientid_t*) (packet + 1), ping_id); + send_ping_request(source, (clientid_t*) (packet + 1)); /* TODO: make this smarter? */ return 0; } @@ -701,7 +637,7 @@ static int handle_getnodes(uint8_t * packet, uint32_t length, IP_Port source) 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? */ + send_ping_request(source, (clientid_t*) (packet + 1)); /* TODO: make this smarter? */ return 0; } @@ -741,7 +677,7 @@ static int handle_sendnodes(uint8_t * packet, uint32_t length, IP_Port source) uint32_t i; for(i = 0; i < num_nodes; ++i) { - pingreq(nodes_list[i].ip_port, nodes_list[i].client_id); + send_ping_request(nodes_list[i].ip_port, (clientid_t*) &nodes_list[i].client_id); returnedip_ports(nodes_list[i].ip_port, nodes_list[i].client_id, packet + 1); } @@ -831,8 +767,8 @@ static void doDHTFriends(void) /* if node is not dead. */ if (!is_timeout(temp_time, friends_list[i].client_list[j].timestamp, Kill_NODE_TIMEOUT)) { if ((friends_list[i].client_list[j].last_pinged + PING_INTERVAL) <= temp_time) { - pingreq( friends_list[i].client_list[j].ip_port, - friends_list[i].client_list[j].client_id ); + send_ping_request( friends_list[i].client_list[j].ip_port, + (clientid_t*) &friends_list[i].client_list[j].client_id ); friends_list[i].client_list[j].last_pinged = temp_time; } /* if node is good. */ @@ -869,8 +805,8 @@ static void doClose(void) /* if node is not dead. */ if (!is_timeout(temp_time, close_clientlist[i].timestamp, Kill_NODE_TIMEOUT)) { if ((close_clientlist[i].last_pinged + PING_INTERVAL) <= temp_time) { - pingreq( close_clientlist[i].ip_port, - close_clientlist[i].client_id ); + send_ping_request( close_clientlist[i].ip_port, + (clientid_t*) &close_clientlist[i].client_id ); close_clientlist[i].last_pinged = temp_time; } /* if node is good. */ @@ -1151,7 +1087,7 @@ static void punch_holes(IP ip, uint16_t * port_list, uint16_t numports, uint16_t /*TODO: improve port guessing algorithm*/ uint16_t port = port_list[(i/2) % numports] + (i/(2*numports))*((i % 2) ? -1 : 1); IP_Port pinging = {ip, htons(port)}; - pingreq(pinging, friends_list[friend_num].client_id); + send_ping_request(pinging, (clientid_t*) &friends_list[friend_num].client_id); } friends_list[friend_num].punching_index = i; } -- cgit v1.2.3 From 9e0ee5b7df3417b1ca6ae446aa3724106e447ed4 Mon Sep 17 00:00:00 2001 From: plutooo Date: Tue, 6 Aug 2013 13:09:14 -0700 Subject: core: Moved handle ping packets to ping.c --- core/DHT.c | 62 +++---------------------------------------------------------- core/DHT.h | 2 ++ core/ping.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ core/ping.h | 2 ++ 4 files changed, 63 insertions(+), 59 deletions(-) (limited to 'core/DHT.c') diff --git a/core/DHT.c b/core/DHT.c index fa36d41f..2db46962 100644 --- a/core/DHT.c +++ b/core/DHT.c @@ -352,7 +352,7 @@ static int replace_good( Client_data * list, /* Attempt to add client with ip_port and client_id to the friends client list * and close_clientlist */ -static void addto_lists(IP_Port ip_port, uint8_t * client_id) +void addto_lists(IP_Port ip_port, uint8_t * client_id) { uint32_t i; @@ -554,62 +554,6 @@ static int sendnodes(IP_Port ip_port, uint8_t * public_key, uint8_t * client_id, return sendpacket(ip_port, data, 1 + CLIENT_ID_SIZE + crypto_box_NONCEBYTES + len); } -/* Packet handling functions, one to handle each types of packets we receive - * Returns 0 if handled correctly, 1 if packet is bad. - */ -static int handle_pingreq(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) + ENCRYPTION_PADDING) - return 1; - - /* check if packet is from ourself. */ - if(id_equal(packet + 1, self_public_key)) - return 1; - - 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) + ENCRYPTION_PADDING, - (uint8_t *)&ping_id ); - - if(len != sizeof(ping_id)) - return 1; - - send_ping_response(source, (clientid_t*) (packet + 1), ping_id); - send_ping_request(source, (clientid_t*) (packet + 1)); /* TODO: make this smarter? */ - - return 0; -} - -static int handle_pingres(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) + ENCRYPTION_PADDING) - return 1; - - /* check if packet is from ourself. */ - if(id_equal(packet + 1, self_public_key)) - return 1; - - 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) + ENCRYPTION_PADDING, - (uint8_t *)&ping_id ); - - if(len != sizeof(ping_id)) - return 1; - - if(is_pinging(source, ping_id)) { - addto_lists(source, packet + 1); - return 0; - } - return 1; -} - static int handle_getnodes(uint8_t * packet, uint32_t length, IP_Port source) { uint64_t ping_id; @@ -1134,10 +1078,10 @@ int DHT_handlepacket(uint8_t * packet, uint32_t length, IP_Port source) { switch (packet[0]) { case 0: - return handle_pingreq(packet, length, source); + return handle_ping_request(packet, length, source); case 1: - return handle_pingres(packet, length, source); + return handle_ping_response(packet, length, source); case 2: return handle_getnodes(packet, length, source); diff --git a/core/DHT.h b/core/DHT.h index 0edaebf3..2308abd8 100644 --- a/core/DHT.h +++ b/core/DHT.h @@ -104,6 +104,8 @@ int DHT_load(uint8_t *data, uint32_t size); returns 1 if we are */ int DHT_isconnected(); +void addto_lists(IP_Port ip_port, uint8_t * client_id); + #ifdef __cplusplus } #endif diff --git a/core/ping.c b/core/ping.c index d1cc182f..3f70b26d 100644 --- a/core/ping.c +++ b/core/ping.c @@ -163,3 +163,59 @@ int send_ping_response(IP_Port ipp, clientid_t* client_id, uint64_t ping_id) return sendpacket(ipp, (uint8_t*) &pk, sizeof(pk)); } + +int handle_ping_request(uint8_t* packet, uint32_t length, IP_Port source) +{ + pingreq_t* p = (pingreq_t*) packet; + int rc; + uint64_t ping_id; + + if (length != sizeof(pingreq_t) || id_eq(&p->client_id, self_id)) + return 1; + + // Decrypt ping_id + rc = decrypt_data((uint8_t*) &p->client_id, + self_secret_key, + (uint8_t*) &p->nonce, + (uint8_t*) &p->ping_id, + sizeof(ping_id) + ENCRYPTION_PADDING, + (uint8_t*) &ping_id); + + if (rc != sizeof(ping_id)) + return 1; + + // Send response + send_ping_response(source, &p->client_id, ping_id); + send_ping_request(source, &p->client_id); // Make this smarter? + + return 0; +} + +int handle_ping_response(uint8_t* packet, uint32_t length, IP_Port source) +{ + pingres_t* p = (pingres_t*) packet; + int rc; + uint64_t ping_id; + + if (length != sizeof(pingres_t) || id_eq(&p->client_id, self_id)) + return 1; + + // Decrypt ping_id + rc = decrypt_data((uint8_t*) &p->client_id, + self_secret_key, + (uint8_t*) &p->nonce, + (uint8_t*) &p->ping_id, + sizeof(ping_id) + ENCRYPTION_PADDING, + (uint8_t*) &ping_id); + + if (rc != sizeof(ping_id)) + return 1; + + // Make sure ping_id is correct + if(!is_pinging(source, ping_id)) + return 1; + + // Associate source ip with client_id + addto_lists(source, (uint8_t*) &p->client_id); + return 0; +} diff --git a/core/ping.h b/core/ping.h index f2770a00..2cab7d59 100644 --- a/core/ping.h +++ b/core/ping.h @@ -12,3 +12,5 @@ uint64_t add_ping(IP_Port ipp); bool is_pinging(IP_Port ipp, uint64_t ping_id); int send_ping_request(IP_Port ipp, clientid_t* client_id); int send_ping_response(IP_Port ipp, clientid_t* client_id, uint64_t ping_id); +int handle_ping_request(uint8_t* packet, uint32_t length, IP_Port source); +int handle_ping_response(uint8_t* packet, uint32_t length, IP_Port source); -- cgit v1.2.3