summaryrefslogtreecommitdiff
path: root/core/DHT.c
diff options
context:
space:
mode:
authorJeffail <ash.jeffs@gmail.com>2013-08-02 10:49:54 +0100
committerJeffail <ash.jeffs@gmail.com>2013-08-02 10:49:54 +0100
commitf9816b43f329045b1ea6e699f87f3e3b13a37d0d (patch)
tree1460365520eb6ef86967307102d55a78a99556ca /core/DHT.c
parentcef8a3e4e58b7a1939c5b806f780f4e56ec3fac7 (diff)
Refactored DHT.c down to line 881
Diffstat (limited to 'core/DHT.c')
-rw-r--r--core/DHT.c62
1 files changed, 37 insertions, 25 deletions
diff --git a/core/DHT.c b/core/DHT.c
index 611bf53e..53c0e9f9 100644
--- a/core/DHT.c
+++ b/core/DHT.c
@@ -785,12 +785,13 @@ int DHT_addfriend(uint8_t * client_id)
785{ 785{
786 Friend * temp; 786 Friend * temp;
787 temp = realloc(friends_list, sizeof(Friend) * (num_friends + 1)); 787 temp = realloc(friends_list, sizeof(Friend) * (num_friends + 1));
788 if(temp == NULL) 788 if (temp == NULL)
789 return 1; 789 return 1;
790 790
791 friends_list = temp; 791 friends_list = temp;
792 memset(&friends_list[num_friends], 0, sizeof(Friend)); 792 memset(&friends_list[num_friends], 0, sizeof(Friend));
793 memcpy(friends_list[num_friends].client_id, client_id, CLIENT_ID_SIZE); 793 memcpy(friends_list[num_friends].client_id, client_id, CLIENT_ID_SIZE);
794
794 friends_list[num_friends].NATping_id = ((uint64_t)random_int() << 32) + random_int(); 795 friends_list[num_friends].NATping_id = ((uint64_t)random_int() << 32) + random_int();
795 ++num_friends; 796 ++num_friends;
796 return 0; 797 return 0;
@@ -800,17 +801,21 @@ int DHT_delfriend(uint8_t * client_id)
800{ 801{
801 uint32_t i; 802 uint32_t i;
802 Friend * temp; 803 Friend * temp;
803 for(i = 0; i < num_friends; ++i) 804 for (i = 0; i < num_friends; ++i) {
804 /* Equal */ 805 /* Equal */
805 if(memcmp(friends_list[i].client_id, client_id, CLIENT_ID_SIZE) == 0) { 806 if (memcmp(friends_list[i].client_id, client_id, CLIENT_ID_SIZE) == 0) {
806 --num_friends; 807 --num_friends;
807 if(num_friends != i) 808 if (num_friends != i) {
808 memcpy(friends_list[i].client_id, friends_list[num_friends].client_id, CLIENT_ID_SIZE); 809 memcpy( friends_list[i].client_id,
810 friends_list[num_friends].client_id,
811 CLIENT_ID_SIZE );
812 }
809 temp = realloc(friends_list, sizeof(Friend) * (num_friends)); 813 temp = realloc(friends_list, sizeof(Friend) * (num_friends));
810 if(temp != NULL) 814 if (temp != NULL)
811 friends_list = temp; 815 friends_list = temp;
812 return 0; 816 return 0;
813 } 817 }
818 }
814 819
815 return 1; 820 return 1;
816} 821}
@@ -818,26 +823,29 @@ int DHT_delfriend(uint8_t * client_id)
818/* TODO: Optimize this. */ 823/* TODO: Optimize this. */
819IP_Port DHT_getfriendip(uint8_t * client_id) 824IP_Port DHT_getfriendip(uint8_t * client_id)
820{ 825{
821 uint32_t i, j; 826 uint32_t i, j, temp_time = unix_time();
822 IP_Port empty = {{{0}}, 0}; 827 IP_Port empty = {{{0}}, 0};
823 uint32_t temp_time = unix_time(); 828
824 for(i = 0; i < num_friends; ++i) 829 for (i = 0; i < num_friends; ++i) {
825 /* Equal */ 830 /* Equal */
826 if(memcmp(friends_list[i].client_id, client_id, CLIENT_ID_SIZE) == 0) { 831 if (memcmp(friends_list[i].client_id, client_id, CLIENT_ID_SIZE) == 0) {
827 for(j = 0; j < MAX_FRIEND_CLIENTS; ++j) 832 for (j = 0; j < MAX_FRIEND_CLIENTS; ++j) {
828 if(memcmp(friends_list[i].client_list[j].client_id, client_id, CLIENT_ID_SIZE) == 0 && 833 if (memcmp( friends_list[i].client_list[j].client_id,
834 client_id,
835 CLIENT_ID_SIZE ) == 0 &&
829 friends_list[i].client_list[j].timestamp + BAD_NODE_TIMEOUT > temp_time) 836 friends_list[i].client_list[j].timestamp + BAD_NODE_TIMEOUT > temp_time)
830 return friends_list[i].client_list[j].ip_port; 837 return friends_list[i].client_list[j].ip_port;
831 838 }
832 return empty; 839 return empty;
833 } 840 }
841 }
834 empty.ip.i = 1; 842 empty.ip.i = 1;
835 return empty; 843 return empty;
836
837} 844}
838 845
839/* Ping each client in the "friends" list every 60 seconds. 846/* Ping each client in the "friends" list every 60 seconds. Send a get nodes request
840 Send a get nodes request every 20 seconds to a random good node for each "friend" in our "friends" list. */ 847 * every 20 seconds to a random good node for each "friend" in our "friends" list.
848 */
841void doDHTFriends() 849void doDHTFriends()
842{ 850{
843 uint32_t i, j; 851 uint32_t i, j;
@@ -845,24 +853,28 @@ void doDHTFriends()
845 uint32_t rand_node; 853 uint32_t rand_node;
846 uint32_t index[MAX_FRIEND_CLIENTS]; 854 uint32_t index[MAX_FRIEND_CLIENTS];
847 855
848 for(i = 0; i < num_friends; ++i) { 856 for (i = 0; i < num_friends; ++i) {
849 uint32_t num_nodes = 0; 857 uint32_t num_nodes = 0;
850 for(j = 0; j < MAX_FRIEND_CLIENTS; ++j) 858 for (j = 0; j < MAX_FRIEND_CLIENTS; ++j) {
851 if(friends_list[i].client_list[j].timestamp + Kill_NODE_TIMEOUT > temp_time) { /* if node is not dead. */ 859 /* if node is not dead. */
852 if((friends_list[i].client_list[j].last_pinged + PING_INTERVAL) <= temp_time) { 860 if (friends_list[i].client_list[j].timestamp + Kill_NODE_TIMEOUT > temp_time) {
853 pingreq(friends_list[i].client_list[j].ip_port, friends_list[i].client_list[j].client_id); 861 if ((friends_list[i].client_list[j].last_pinged + PING_INTERVAL) <= temp_time) {
862 pingreq( friends_list[i].client_list[j].ip_port,
863 friends_list[i].client_list[j].client_id );
854 friends_list[i].client_list[j].last_pinged = temp_time; 864 friends_list[i].client_list[j].last_pinged = temp_time;
855 } 865 }
856 if(friends_list[i].client_list[j].timestamp + BAD_NODE_TIMEOUT > temp_time) { /* if node is good. */ 866 /* if node is good. */
867 if (friends_list[i].client_list[j].timestamp + BAD_NODE_TIMEOUT > temp_time) {
857 index[num_nodes] = j; 868 index[num_nodes] = j;
858 ++num_nodes; 869 ++num_nodes;
859 } 870 }
860 } 871 }
872 }
861 if(friends_list[i].lastgetnode + GET_NODE_INTERVAL <= temp_time && num_nodes != 0) { 873 if(friends_list[i].lastgetnode + GET_NODE_INTERVAL <= temp_time && num_nodes != 0) {
862 rand_node = rand() % num_nodes; 874 rand_node = rand() % num_nodes;
863 getnodes(friends_list[i].client_list[index[rand_node]].ip_port, 875 getnodes( friends_list[i].client_list[index[rand_node]].ip_port,
864 friends_list[i].client_list[index[rand_node]].client_id, 876 friends_list[i].client_list[index[rand_node]].client_id,
865 friends_list[i].client_id); 877 friends_list[i].client_id );
866 friends_list[i].lastgetnode = temp_time; 878 friends_list[i].lastgetnode = temp_time;
867 } 879 }
868 } 880 }