From dac138c92a2b444e12b8b41d45f55c12391a9532 Mon Sep 17 00:00:00 2001 From: gonzalef Date: Fri, 24 Apr 2020 21:45:09 +0200 Subject: [PATCH] update neighbours --- src/node.c | 97 ++++++++++++++++++++++++++++++++++++++++++------------ src/node.h | 7 ++-- 2 files changed, 79 insertions(+), 25 deletions(-) diff --git a/src/node.c b/src/node.c index cb3e2fd..81c5dd6 100644 --- a/src/node.c +++ b/src/node.c @@ -52,7 +52,7 @@ neighbour_peer *get_random_neighbour() { } // Search for this peer in the neighbour table -neighbour_peer *get_neighbour(struct in6_addr *ip) { +neighbour_peer *get_neighbour(struct in6_addr *ip, int16_t port) { // Look for neighbour list *tmp = neighbour_list; neighbour_peer *peer; @@ -61,7 +61,7 @@ neighbour_peer *get_neighbour(struct in6_addr *ip) { // check for same ip and same port peer = (neighbour_peer*) tmp->data; - if(memcmp(&peer->ip, ip, sizeof(struct in6_addr)) == 0) + if(memcmp(&peer->ip, ip, sizeof(struct in6_addr)) == 0 && peer->port == port) return peer; // if they differ, get next peer @@ -72,9 +72,9 @@ neighbour_peer *get_neighbour(struct in6_addr *ip) { } // Return -1 if the peer could not be added, 0 if it could or if it was already in the table -int add_n_update_neighbour(struct in6_addr *ip) { - neighbour_peer *peer = get_neighbour(ip); - struct timeval curtime; +int add_n_update_neighbour(struct in6_addr *ip, int16_t port) { + neighbour_peer *peer = get_neighbour(ip, port); + time_t curtime; // peer is not in the neighbour list so we try to add it if(ip == NULL) { @@ -89,8 +89,8 @@ int add_n_update_neighbour(struct in6_addr *ip) { peer->is_temporary = 1; // set last_seen time - gettimeofday(&curtime, NULL); - memcpy(&peer->last_seen, &curtime, sizeof(struct timeval)); + time(&curtime); + peer->last_seen = curtime; // set new peer as head of list list *node = (list*) malloc(sizeof(list)); @@ -102,8 +102,8 @@ int add_n_update_neighbour(struct in6_addr *ip) { } // if the peer was already in the list, update it - gettimeofday(&curtime, NULL); - memcpy(&peer->last_seen, &curtime, sizeof(struct timeval)); + time(&curtime); + peer->last_seen = curtime; return 0; } @@ -225,6 +225,65 @@ void add_data(unsigned char len, int64_t id, int16_t seqno, char *data) { /* ---- Fin fonctions utilitaires ---- */ +// Update the neighbour list +int update_neighbours() { + list *tmp = neighbour_list, *last = NULL, *node_to_delete; + neighbour_peer *peer; + time_t curtime; + int deleted = 0; + + // check every neighbour + while(tmp != NULL) { + peer = (neighbour_peer*) tmp->data; + + // Check if peer is temporary + if(peer->is_temporary) { + // If it's been 70 seconds or more since we last received a packet from this peer then remove it from the list + time(&curtime); + + if(difftime(peer->last_seen, curtime) >= 70) { + // increase the count of deleted nodes + deleted++; + + // If head of the list + if(last == NULL) { + // Store node to delete + node_to_delete = tmp; + + // Update list + tmp = tmp->next; + neighbour_list = tmp; + + // Free allocated memory + free(node_to_delete->data); + free(node_to_delete); + + continue; + } + + // Store node to delete + node_to_delete = tmp; + + // Update list + tmp = tmp->next; + last->next = tmp; + + // Free allocated memory + free(node_to_delete->data); + free(node_to_delete); + + continue; + } + } + + last = tmp; + tmp = tmp->next; + } + + // returns the amount of nodes that were deleted + return deleted; +} + // Add TLV to packet, if it does not fit then send the packet and reset the packet buff to be able to add more TLVs that will be sent afterwards int add_tlv(packet *pack, tlv *tlv, struct sockaddr_in6 *dest, int socket_num) { char type = tlv->pad1->type, sent = 0, errval = 0; @@ -550,13 +609,6 @@ int check_header(char * received_data_buffer, int received_data_len, struct pack return 0; } -// If the sender is not in the neighbourhood, and we have 15 neighbours, we -// ignore the packet. Otherwise, we add him to the neighbourhood, marked as -// temporary. -int update_neighbours(){ - return 0; -}; - int add_message(char * message, int message_len){ return 0; } @@ -760,7 +812,10 @@ int listen_for_packets(char * received_data_buffer, int received_data_len, struc } // Neighbour check - if(add_n_update_neighbour(sender) == -1) { + struct in6_addr ip = sender->sin6_addr; + int16_t port = sender->sin6_port; + + if(add_n_update_neighbour(&ip, port) == -1) { fprintf(stderr, ">> Maximum number of neighbour peers reached, aborting this packet.\n"); return -1; } @@ -788,7 +843,7 @@ int t_get_network_state(list * neighbourhood, int sock_fd){ } int t_update_neighbours(list * neighbourhood){ - return 0; + return update_neighbours(); } int run_node(int sock_fd, list * neighbourhood){ @@ -802,7 +857,7 @@ int run_node(int sock_fd, list * neighbourhood){ // Init the ~20s delay for node update. srand(time(NULL)); - int delay = time(NULL) + 20; + time_t delay = time(NULL) + 20; /* Descriptor zero is stdin */ fds[0].fd = 0; @@ -815,7 +870,7 @@ int run_node(int sock_fd, list * neighbourhood){ */ while (1) { - if (time(NULL) >= delay) { + if(time(NULL) >= delay) { printf(">> Asking for more peers...\n"); t_ask_for_more_peers(neighbourhood, sock_fd); printf(">> Updating neighbours...\n"); @@ -935,7 +990,7 @@ int bootstrap_node(int * sock_fd, list * neighbourhood){ /* Make the first peer*/ struct neighbour_peer root_peer; - struct timeval root_peer_seen; + time_t root_peer_seen = time(NULL); int inet_p = inet_pton(AF_INET6, ROOT_PEER_ADDR, &root_peer.ip); if(inet_p < 1){ diff --git a/src/node.h b/src/node.h index 4f87d31..a90470c 100644 --- a/src/node.h +++ b/src/node.h @@ -10,7 +10,6 @@ #include #include #include -#include #include #include @@ -23,7 +22,7 @@ typedef struct neighbour_peer { struct in6_addr ip; int16_t port; char is_temporary; - struct timeval last_seen; + time_t last_seen; } neighbour_peer; // The strucuture to hold the messages @@ -123,10 +122,10 @@ int len_list(list *l); neighbour_peer *get_random_neighbour(); // Search for this peer in the neighbour table -neighbour_peer *get_neighbour(struct in6_addr *ip); +neighbour_peer *get_neighbour(struct in6_addr *ip, int16_t port); // Return -1 if the peer could not be added, 0 if it could or if it was already in the table -int add_n_update_neighbour(struct in6_addr *ip); +int add_n_update_neighbour(struct in6_addr *ip, int16_t port); // get data associated with id, if it doesn't exist return NULL pub_data *get_data(int64_t id);