ask for peers

This commit is contained in:
gonzalef 2020-04-24 22:48:10 +02:00
parent dac138c92a
commit 481903c24a
2 changed files with 53 additions and 21 deletions

View File

@ -12,7 +12,6 @@
#include <fcntl.h> #include <fcntl.h>
#include <poll.h> #include <poll.h>
#include <unistd.h> #include <unistd.h>
#include "node.h" #include "node.h"
// Static variables // Static variables
@ -21,6 +20,39 @@ static list *neighbour_list;
/* ---- Fonctions utilitaires ---- */ /* ---- Fonctions utilitaires ---- */
// Looks for more peers
int ask_for_peers(int socket_num) {
// Only ask for more peers if the neighbour list is small enough
if(len_list(neighbour_list) >= 5)
return 0;
// Get random peer
neighbour_peer *peer = get_random_neighbour();
struct in6_addr ip = peer->ip;
int16_t port = peer->port;
int ifindex = if_nametoindex("eth0");
if(ifindex == 0) {
perror("if_nametoindex failed");
return -1;
}
// Initialize sockaddr
struct sockaddr_in6 dest;
memset(&dest, 0, sizeof(struct sockaddr_in6));
dest.sin6_family = AF_INET6;
memcpy(&dest.sin6_addr, &ip, 16);
dest.sin6_port = htons(port);
dest.sin6_scope_id = ifindex;
// Send neighbour request TLV
tlv neighbour_req;
build_neighbour_req(&neighbour_req);
return send_single_tlv(&neighbour_req, &dest, socket_num);
}
// Get list length // Get list length
int len_list(list *l) { int len_list(list *l) {
int len = 0; int len = 0;
@ -834,19 +866,19 @@ int listen_for_packets(char * received_data_buffer, int received_data_len, struc
} }
int t_ask_for_more_peers(list * neighbourhood, int sock_fd){ int t_ask_for_more_peers(int sock_fd){
return ask_for_peers(sock_fd);
}
int t_get_network_state(int sock_fd){
return 0; return 0;
} }
int t_get_network_state(list * neighbourhood, int sock_fd){ int t_update_neighbours(){
return 0;
}
int t_update_neighbours(list * neighbourhood){
return update_neighbours(); return update_neighbours();
} }
int run_node(int sock_fd, list * neighbourhood){ int run_node(int sock_fd){
printf(">> Running node...\n"); printf(">> Running node...\n");
int ret; int ret;
@ -872,11 +904,11 @@ int run_node(int sock_fd, list * neighbourhood){
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(sock_fd);
printf(">> Updating neighbours...\n"); printf(">> Updating neighbours...\n");
t_update_neighbours(neighbourhood); t_update_neighbours();
printf(">> Getting network state...\n"); printf(">> Getting network state...\n");
t_get_network_state(neighbourhood, sock_fd); t_get_network_state(sock_fd);
delay = time(NULL) + 20 + (rand() % 10); delay = time(NULL) + 20 + (rand() % 10);
} }
@ -966,7 +998,7 @@ int run_node(int sock_fd, list * neighbourhood){
// This function runs once, and sets the sock_fd as well as the neighbourhood // This function runs once, and sets the sock_fd as well as the neighbourhood
int bootstrap_node(int * sock_fd, list * neighbourhood){ int bootstrap_node(int * sock_fd){
printf(">> Boostraping node...\n"); printf(">> Boostraping node...\n");
struct sockaddr_in6 server_addr; struct sockaddr_in6 server_addr;
@ -1012,11 +1044,9 @@ int bootstrap_node(int * sock_fd, list * neighbourhood){
int main(int argc, const char *argv[]) { int main(int argc, const char *argv[]) {
printf(">> Starting node\n"); printf(">> Starting node\n");
list neighbourhood;
int sock_fd; int sock_fd;
bootstrap_node(&sock_fd, &neighbourhood); bootstrap_node(&sock_fd);
run_node(sock_fd, &neighbourhood); run_node(sock_fd);
close(sock_fd); close(sock_fd);
return 0; return 0;

View File

@ -73,6 +73,8 @@ int validate_tlv(char *data, int pos, int16_t packet_len);
int update_neighbours(); int update_neighbours();
int ask_for_peers(int socket_num);
int work_with_tlvs(char * data, int16_t packet_len, struct sockaddr_in6 *sender, int socket_num); int work_with_tlvs(char * data, int16_t packet_len, struct sockaddr_in6 *sender, int socket_num);
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);
@ -82,7 +84,7 @@ int send_packet(char *packet_buff, int16_t length, struct sockaddr_in6 *dest, in
int send_single_tlv(tlv *tlv, struct sockaddr_in6 *dest, int socket_num); int send_single_tlv(tlv *tlv, struct sockaddr_in6 *dest, int socket_num);
// This function is in charge of saying how and what goes where. // This function is in charge of saying how and what goes where.
int run_node(int sock_fd, list * neighbourhood); int run_node(int sock_fd);
/* Takes a TLV and sends it over to everyone in the list of addresses. /* Takes a TLV and sends it over to everyone in the list of addresses.
* Returns -1 in case of error, 0 otherwise. * Returns -1 in case of error, 0 otherwise.
@ -97,24 +99,24 @@ int send_tlvs(struct list * tlv_list, int16_t length, struct sockaddr_in6 * dest
/* Check our peer list. If we have less than 5 peers, send out a /* Check our peer list. If we have less than 5 peers, send out a
TLV NEIGHBOUR_REQUEST to a random peer TLV NEIGHBOUR_REQUEST to a random peer
*/ */
int t_ask_for_more_peers(list * neighbourhood, int sock_fd); int t_ask_for_more_peers(int sock_fd);
/* We look at every peer, if he is marked as is_temporary, AND we didn't get a /* We look at every peer, if he is marked as is_temporary, AND we didn't get a
packet from him in the last 70 sec, we remove him from the list. packet from him in the last 70 sec, we remove him from the list.
*/ */
int t_update_neighbours(list * neighbourhood); int t_update_neighbours();
/* We send out a TLV Network Hash to every peer, and we expect getting a TLV /* We send out a TLV Network Hash to every peer, and we expect getting a TLV
Network state from each of them. Network state from each of them.
*/ */
int t_get_network_state(list * neighbourhoodn, int sock_fd); int t_get_network_state(int sock_fd);
// This function adds a message to the message table. // This function adds a message to the message table.
int add_message(char * message, int message_len); int add_message(char * message, int message_len);
// This functions creates the structures needed for the rest of the project, // This functions creates the structures needed for the rest of the project,
// creates the socket, and returns all of it. // creates the socket, and returns all of it.
int bootstrap_node(int * sock_fd, list * neighbourhood); int bootstrap_node(int * sock_fd);
// Helper functions // Helper functions
int len_list(list *l); int len_list(list *l);