update neighbours
This commit is contained in:
parent
c633955b54
commit
dac138c92a
97
src/node.c
97
src/node.c
@ -52,7 +52,7 @@ neighbour_peer *get_random_neighbour() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Search for this peer in the neighbour table
|
// 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
|
// Look for neighbour
|
||||||
list *tmp = neighbour_list;
|
list *tmp = neighbour_list;
|
||||||
neighbour_peer *peer;
|
neighbour_peer *peer;
|
||||||
@ -61,7 +61,7 @@ neighbour_peer *get_neighbour(struct in6_addr *ip) {
|
|||||||
// check for same ip and same port
|
// check for same ip and same port
|
||||||
peer = (neighbour_peer*) tmp->data;
|
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;
|
return peer;
|
||||||
|
|
||||||
// if they differ, get next 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
|
// 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) {
|
||||||
neighbour_peer *peer = get_neighbour(ip);
|
neighbour_peer *peer = get_neighbour(ip, port);
|
||||||
struct timeval curtime;
|
time_t curtime;
|
||||||
|
|
||||||
// peer is not in the neighbour list so we try to add it
|
// peer is not in the neighbour list so we try to add it
|
||||||
if(ip == NULL) {
|
if(ip == NULL) {
|
||||||
@ -89,8 +89,8 @@ int add_n_update_neighbour(struct in6_addr *ip) {
|
|||||||
peer->is_temporary = 1;
|
peer->is_temporary = 1;
|
||||||
|
|
||||||
// set last_seen time
|
// set last_seen time
|
||||||
gettimeofday(&curtime, NULL);
|
time(&curtime);
|
||||||
memcpy(&peer->last_seen, &curtime, sizeof(struct timeval));
|
peer->last_seen = curtime;
|
||||||
|
|
||||||
// set new peer as head of list
|
// set new peer as head of list
|
||||||
list *node = (list*) malloc(sizeof(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
|
// if the peer was already in the list, update it
|
||||||
gettimeofday(&curtime, NULL);
|
time(&curtime);
|
||||||
memcpy(&peer->last_seen, &curtime, sizeof(struct timeval));
|
peer->last_seen = curtime;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -225,6 +225,65 @@ void add_data(unsigned char len, int64_t id, int16_t seqno, char *data) {
|
|||||||
|
|
||||||
/* ---- Fin fonctions utilitaires ---- */
|
/* ---- 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
|
// 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) {
|
int add_tlv(packet *pack, tlv *tlv, struct sockaddr_in6 *dest, int socket_num) {
|
||||||
char type = tlv->pad1->type, sent = 0, errval = 0;
|
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;
|
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){
|
int add_message(char * message, int message_len){
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -760,7 +812,10 @@ int listen_for_packets(char * received_data_buffer, int received_data_len, struc
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Neighbour check
|
// 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");
|
fprintf(stderr, ">> Maximum number of neighbour peers reached, aborting this packet.\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -788,7 +843,7 @@ int t_get_network_state(list * neighbourhood, int sock_fd){
|
|||||||
}
|
}
|
||||||
|
|
||||||
int t_update_neighbours(list * neighbourhood){
|
int t_update_neighbours(list * neighbourhood){
|
||||||
return 0;
|
return update_neighbours();
|
||||||
}
|
}
|
||||||
|
|
||||||
int run_node(int sock_fd, list * neighbourhood){
|
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.
|
// Init the ~20s delay for node update.
|
||||||
srand(time(NULL));
|
srand(time(NULL));
|
||||||
int delay = time(NULL) + 20;
|
time_t delay = time(NULL) + 20;
|
||||||
|
|
||||||
/* Descriptor zero is stdin */
|
/* Descriptor zero is stdin */
|
||||||
fds[0].fd = 0;
|
fds[0].fd = 0;
|
||||||
@ -815,7 +870,7 @@ int run_node(int sock_fd, list * neighbourhood){
|
|||||||
*/
|
*/
|
||||||
while (1) {
|
while (1) {
|
||||||
|
|
||||||
if (time(NULL) >= delay) {
|
if(time(NULL) >= delay) {
|
||||||
printf(">> Asking for more peers...\n");
|
printf(">> Asking for more peers...\n");
|
||||||
t_ask_for_more_peers(neighbourhood, sock_fd);
|
t_ask_for_more_peers(neighbourhood, sock_fd);
|
||||||
printf(">> Updating neighbours...\n");
|
printf(">> Updating neighbours...\n");
|
||||||
@ -935,7 +990,7 @@ int bootstrap_node(int * sock_fd, list * neighbourhood){
|
|||||||
|
|
||||||
/* Make the first peer*/
|
/* Make the first peer*/
|
||||||
struct neighbour_peer root_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);
|
int inet_p = inet_pton(AF_INET6, ROOT_PEER_ADDR, &root_peer.ip);
|
||||||
if(inet_p < 1){
|
if(inet_p < 1){
|
||||||
|
@ -10,7 +10,6 @@
|
|||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <sys/time.h>
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <net/if.h>
|
#include <net/if.h>
|
||||||
|
|
||||||
@ -23,7 +22,7 @@ typedef struct neighbour_peer {
|
|||||||
struct in6_addr ip;
|
struct in6_addr ip;
|
||||||
int16_t port;
|
int16_t port;
|
||||||
char is_temporary;
|
char is_temporary;
|
||||||
struct timeval last_seen;
|
time_t last_seen;
|
||||||
} neighbour_peer;
|
} neighbour_peer;
|
||||||
|
|
||||||
// The strucuture to hold the messages
|
// The strucuture to hold the messages
|
||||||
@ -123,10 +122,10 @@ int len_list(list *l);
|
|||||||
neighbour_peer *get_random_neighbour();
|
neighbour_peer *get_random_neighbour();
|
||||||
|
|
||||||
// Search for this peer in the neighbour table
|
// 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
|
// 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
|
// get data associated with id, if it doesn't exist return NULL
|
||||||
pub_data *get_data(int64_t id);
|
pub_data *get_data(int64_t id);
|
||||||
|
Loading…
Reference in New Issue
Block a user