diff options
Diffstat (limited to 'core/DHT.c')
-rw-r--r-- | core/DHT.c | 74 |
1 files changed, 26 insertions, 48 deletions
@@ -65,17 +65,6 @@ | |||
65 | 65 | ||
66 | typedef struct { | 66 | typedef struct { |
67 | uint8_t client_id[CLIENT_ID_SIZE]; | 67 | uint8_t client_id[CLIENT_ID_SIZE]; |
68 | IP_Port ip_port; | ||
69 | uint64_t timestamp; | ||
70 | uint64_t last_pinged; | ||
71 | |||
72 | /* Returned by this node. Either our friend or us */ | ||
73 | IP_Port ret_ip_port; | ||
74 | uint64_t ret_timestamp; | ||
75 | } Client_data; | ||
76 | |||
77 | typedef struct { | ||
78 | uint8_t client_id[CLIENT_ID_SIZE]; | ||
79 | Client_data client_list[MAX_FRIEND_CLIENTS]; | 68 | Client_data client_list[MAX_FRIEND_CLIENTS]; |
80 | 69 | ||
81 | /* time at which the last get_nodes request was sent. */ | 70 | /* time at which the last get_nodes request was sent. */ |
@@ -115,6 +104,12 @@ static Pinged send_nodes[LSEND_NODES_ARRAY]; | |||
115 | 104 | ||
116 | /*----------------------------------------------------------------------------------*/ | 105 | /*----------------------------------------------------------------------------------*/ |
117 | 106 | ||
107 | |||
108 | Client_data * DHT_get_close_list(void) | ||
109 | { | ||
110 | return close_clientlist; | ||
111 | } | ||
112 | |||
118 | /* Compares client_id1 and client_id2 with client_id | 113 | /* Compares client_id1 and client_id2 with client_id |
119 | * return 0 if both are same distance | 114 | * return 0 if both are same distance |
120 | * return 1 if client_id1 is closer | 115 | * return 1 if client_id1 is closer |
@@ -633,6 +628,8 @@ static int handle_sendnodes(IP_Port source, uint8_t * packet, uint32_t length) | |||
633 | 628 | ||
634 | int DHT_addfriend(uint8_t * client_id) | 629 | int DHT_addfriend(uint8_t * client_id) |
635 | { | 630 | { |
631 | if(friend_number(client_id) != -1) /*Is friend already in DHT?*/ | ||
632 | return 1; | ||
636 | Friend * temp; | 633 | Friend * temp; |
637 | temp = realloc(friends_list, sizeof(Friend) * (num_friends + 1)); | 634 | temp = realloc(friends_list, sizeof(Friend) * (num_friends + 1)); |
638 | if (temp == NULL) | 635 | if (temp == NULL) |
@@ -930,49 +927,30 @@ static int send_NATping(uint8_t * public_key, uint64_t ping_id, uint8_t type) | |||
930 | } | 927 | } |
931 | 928 | ||
932 | /* Handle a received ping request for */ | 929 | /* Handle a received ping request for */ |
933 | static int handle_NATping(IP_Port source, uint8_t * packet, uint32_t length) | 930 | static int handle_NATping(IP_Port source, uint8_t * source_pubkey, uint8_t * packet, uint32_t length) |
934 | { | 931 | { |
935 | if (length < crypto_box_PUBLICKEYBYTES * 2 + crypto_box_NONCEBYTES + ENCRYPTION_PADDING | 932 | uint64_t ping_id; |
936 | || length > MAX_DATA_SIZE + ENCRYPTION_PADDING) | 933 | memcpy(&ping_id, packet + 1, sizeof(uint64_t)); |
937 | return 1; | ||
938 | |||
939 | /* check if request is for us. */ | ||
940 | if (id_equal(packet + 1, self_public_key)) { | ||
941 | uint8_t public_key[crypto_box_PUBLICKEYBYTES]; | ||
942 | uint8_t data[MAX_DATA_SIZE]; | ||
943 | |||
944 | int len = handle_request(public_key, data, packet, length); | ||
945 | if (len != sizeof(uint64_t) + 1) | ||
946 | return 1; | ||
947 | |||
948 | uint64_t ping_id; | ||
949 | memcpy(&ping_id, data + 1, sizeof(uint64_t)); | ||
950 | 934 | ||
951 | int friendnumber = friend_number(public_key); | 935 | int friendnumber = friend_number(source_pubkey); |
952 | if (friendnumber == -1) | 936 | if (friendnumber == -1) |
953 | return 1; | 937 | return 1; |
954 | 938 | ||
955 | Friend * friend = &friends_list[friendnumber]; | 939 | Friend * friend = &friends_list[friendnumber]; |
956 | 940 | ||
957 | if (data[0] == 0) { | 941 | if (packet[0] == 0) { |
958 | /* 1 is reply */ | 942 | /* 1 is reply */ |
959 | send_NATping(public_key, ping_id, 1); | 943 | send_NATping(source_pubkey, ping_id, 1); |
960 | friend->recvNATping_timestamp = unix_time(); | 944 | friend->recvNATping_timestamp = unix_time(); |
945 | return 0; | ||
946 | } else if (packet[0] == 1) { | ||
947 | if (friend->NATping_id == ping_id) { | ||
948 | friend->NATping_id = ((uint64_t)random_int() << 32) + random_int(); | ||
949 | friend->hole_punching = 1; | ||
961 | return 0; | 950 | return 0; |
962 | } else if (data[0] == 1) { | ||
963 | if (friend->NATping_id == ping_id) { | ||
964 | friend->NATping_id = ((uint64_t)random_int() << 32) + random_int(); | ||
965 | friend->hole_punching = 1; | ||
966 | return 0; | ||
967 | } | ||
968 | } | 951 | } |
969 | return 1; | ||
970 | } | 952 | } |
971 | 953 | return 1; | |
972 | /* if request is not for us, try routing it. */ | ||
973 | route_packet(packet + 1, packet, length); | ||
974 | |||
975 | return 0; | ||
976 | } | 954 | } |
977 | 955 | ||
978 | /* Get the most common ip in the ip_portlist | 956 | /* Get the most common ip in the ip_portlist |
@@ -1080,7 +1058,7 @@ void DHT_init(void) | |||
1080 | networking_registerhandler(1, &handle_ping_response); | 1058 | networking_registerhandler(1, &handle_ping_response); |
1081 | networking_registerhandler(2, &handle_getnodes); | 1059 | networking_registerhandler(2, &handle_getnodes); |
1082 | networking_registerhandler(3, &handle_sendnodes); | 1060 | networking_registerhandler(3, &handle_sendnodes); |
1083 | networking_registerhandler(254, &handle_NATping); | 1061 | cryptopacket_registerhandler(254, &handle_NATping); |
1084 | } | 1062 | } |
1085 | 1063 | ||
1086 | void doDHT(void) | 1064 | void doDHT(void) |