Merge pull request #247 from Jeffail/master

Refactored most of DHT.c, added local vim config
This commit is contained in:
irungentoo 2013-08-01 17:35:31 -07:00
commit 368ba8ed01
2 changed files with 95 additions and 74 deletions

9
_vimrc_local.vim Normal file
View File

@ -0,0 +1,9 @@
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" => Text, tab and indent related
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Use spaces instead of tabs
set expandtab
" 1 tab == 4 spaces
set shiftwidth=4
set tabstop=4

View File

@ -21,67 +21,98 @@
*
*/
#include "DHT.h"
/*----------------------------------------------------------------------------------*/
typedef struct {
uint8_t client_id[CLIENT_ID_SIZE];
IP_Port ip_port;
uint32_t timestamp;
uint32_t last_pinged;
IP_Port ret_ip_port;/* The ip_port returned by this node for the friend
(for nodes in friends_list) or us (for nodes in close_clientlist) */
uint32_t ret_timestamp;
} Client_data;
#include "DHT.h"
/* maximum number of clients stored per friend. */
#define MAX_FRIEND_CLIENTS 8
typedef struct {
uint8_t client_id[CLIENT_ID_SIZE];
Client_data client_list[MAX_FRIEND_CLIENTS];
uint32_t lastgetnode; /* time at which the last get_nodes request was sent. */
/*Symetric NAT hole punching stuff*/
uint8_t hole_punching; /*0 if not hole punching, 1 if currently hole punching */
uint32_t punching_index;
uint32_t punching_timestamp;
uint32_t recvNATping_timestamp;
uint64_t NATping_id;
uint32_t NATping_timestamp;
} Friend;
typedef struct {
uint8_t client_id[CLIENT_ID_SIZE];
IP_Port ip_port;
} Node_format;
typedef struct {
IP_Port ip_port;
uint64_t ping_id;
uint32_t timestamp;
} Pinged;
/* Our client id/public key */
uint8_t self_public_key[CLIENT_ID_SIZE];
uint8_t self_secret_key[crypto_box_SECRETKEYBYTES];
/* TODO: Move these out of here and put them into the .c file.
A list of the clients mathematically closest to ours. */
/* A list of the clients mathematically closest to ours. */
#define LCLIENT_LIST 32
static Client_data close_clientlist[LCLIENT_LIST];
static Friend * friends_list;
static uint16_t num_friends;
/* The list of ip ports along with the ping_id of what we sent them and a timestamp */
#define LPING_ARRAY 256
static Pinged pings[LPING_ARRAY];
#define LSEND_NODES_ARRAY LPING_ARRAY/2
static Pinged send_nodes[LSEND_NODES_ARRAY];
/* the number of seconds for a non responsive node to become bad. */
#define BAD_NODE_TIMEOUT 70
/* the max number of nodes to send with send nodes. */
#define MAX_SENT_NODES 8
/* ping timeout in seconds */
#define PING_TIMEOUT 5
/* The timeout after which a node is discarded completely. */
#define Kill_NODE_TIMEOUT 300
/* ping interval in seconds for each node in our lists. */
#define PING_INTERVAL 60
/* ping interval in seconds for each random sending of a get nodes request. */
#define GET_NODE_INTERVAL 10
#define MAX_PUNCHING_PORTS 32
/*Interval in seconds between punching attempts*/
#define PUNCH_INTERVAL 10
/*----------------------------------------------------------------------------------*/
typedef struct {
uint8_t client_id[CLIENT_ID_SIZE];
IP_Port ip_port;
uint32_t timestamp;
uint32_t last_pinged;
/* Returned by this node. Either our friend or us */
IP_Port ret_ip_port;
uint32_t ret_timestamp;
} Client_data;
typedef struct {
uint8_t client_id[CLIENT_ID_SIZE];
Client_data client_list[MAX_FRIEND_CLIENTS];
/* time at which the last get_nodes request was sent. */
uint32_t lastgetnode;
/* Symetric NAT hole punching stuff */
/* 1 if currently hole punching, otherwise 0 */
uint8_t hole_punching;
uint32_t punching_index;
uint32_t punching_timestamp;
uint32_t recvNATping_timestamp;
uint64_t NATping_id;
uint32_t NATping_timestamp;
} Friend;
typedef struct {
uint8_t client_id[CLIENT_ID_SIZE];
IP_Port ip_port;
} Node_format;
typedef struct {
IP_Port ip_port;
uint64_t ping_id;
uint32_t timestamp;
} Pinged;
/*----------------------------------------------------------------------------------*/
/* Our client id/public key */
uint8_t self_public_key[CLIENT_ID_SIZE];
uint8_t self_secret_key[crypto_box_SECRETKEYBYTES];
static Client_data close_clientlist[LCLIENT_LIST];
static Friend * friends_list;
static uint16_t num_friends;
static Pinged pings[LPING_ARRAY];
static Pinged send_nodes[LSEND_NODES_ARRAY];
/*----------------------------------------------------------------------------------*/
/* Compares client_id1 and client_id2 with client_id
return 0 if both are same distance
@ -150,11 +181,6 @@ static int friend_number(uint8_t * client_id)
return -1;
}
/* the number of seconds for a non responsive node to become bad. */
#define BAD_NODE_TIMEOUT 70
/* the max number of nodes to send with send nodes. */
#define MAX_SENT_NODES 8
/* Find MAX_SENT_NODES nodes closest to the client_id for the send nodes request:
put them in the nodes_list and return how many were found.
TODO: Make this function much more efficient. */
@ -281,9 +307,6 @@ void returnedip_ports(IP_Port ip_port, uint8_t * client_id, uint8_t * nodeclient
}
}
/* ping timeout in seconds */
#define PING_TIMEOUT 5
/* check if we are currently pinging an ip_port and/or a ping_id
variables with values of zero will not be checked.
if we are already, return 1
@ -619,7 +642,8 @@ int handle_sendnodes(uint8_t * packet, uint32_t length, IP_Port source)
return 0;
}
/* END of packet handling functions */
/*----------------------------------------------------------------------------------*/
/*------------------------END of packet handling functions--------------------------*/
int DHT_addfriend(uint8_t * client_id)
{
@ -676,15 +700,6 @@ IP_Port DHT_getfriendip(uint8_t * client_id)
}
/* The timeout after which a node is discarded completely. */
#define Kill_NODE_TIMEOUT 300
/* ping interval in seconds for each node in our lists. */
#define PING_INTERVAL 60
/* ping interval in seconds for each random sending of a get nodes request. */
#define GET_NODE_INTERVAL 10
/* Ping each client in the "friends" list every 60 seconds.
Send a get nodes request every 20 seconds to a random good node for each "friend" in our "friends" list. */
void doDHTFriends()
@ -855,7 +870,8 @@ int friend_ips(IP_Port * ip_portlist, uint8_t * friend_id)
return -1;
}
/*BEGINNING OF NAT PUNCHING FUNCTIONS*/
/*----------------------------------------------------------------------------------*/
/*---------------------BEGINNING OF NAT PUNCHING FUNCTIONS--------------------------*/
int send_NATping(uint8_t * public_key, uint64_t ping_id, uint8_t type)
{
@ -955,8 +971,6 @@ static uint16_t NAT_getports(uint16_t * portlist, IP_Port * ip_portlist, uint16_
return num;
}
#define MAX_PUNCHING_PORTS 32
static void punch_holes(IP ip, uint16_t * port_list, uint16_t numports, uint16_t friend_num)
{
if(numports > MAX_FRIEND_CLIENTS || numports == 0)
@ -972,9 +986,6 @@ static void punch_holes(IP ip, uint16_t * port_list, uint16_t numports, uint16_t
friends_list[friend_num].punching_index = i;
}
/*Interval in seconds between punching attempts*/
#define PUNCH_INTERVAL 10
static void doNAT()
{
uint32_t i;
@ -1008,7 +1019,8 @@ static void doNAT()
}
}
/*END OF NAT PUNCHING FUNCTIONS*/
/*----------------------------------------------------------------------------------*/
/*-----------------------END OF NAT PUNCHING FUNCTIONS------------------------------*/
int DHT_handlepacket(uint8_t * packet, uint32_t length, IP_Port source)
{