// Define constants #ifndef NODE_H #define NODE_H #include #include #include #include #include #include #include #include "tlv.h" #include "hash.h" #include "parser.h" // On which port do we listen to #define LISTEN_PORT 1212 // The node ID #define NODE_ID 42675882021843277 // The number of neighbours // The neighbour table has 15 entries #define NEIGHBOUR_MAX 15 /* la table de voisins, qui est indexée par adresses de socket (des paires (IP, Port)), * et dont chaque entrée contient un booléen indiquant si le pair est permanent * (configuré au lancement) ou transitoire, et la date de dernière réception d’un * paquet de la part de ce pair ; */ typedef struct neighbour_peer { struct in6_addr ip; short port; char is_temporary; struct timeval last_seen; } neighbour_peer; // The strucuture to hold the messages /* It's a list of triplets, (Li,Si,Di) * Li : The Node ID of the publisher 64 bits * Si : the sequence number 16 bits * Di : the data of the message 192 bytes */ typedef struct pub_data { unsigned char length; long id; short seqno; char *data; } pub_data; // General list typedef struct list { void *data; void *next; } list; // Static variables static list *data_list; static list *neighbour_list; // TODO // fonctions signatures void listen_for_packets(); int check_header(char * received_datagram[], int buffer_len, struct packet * packet_to_return); int validate_tlvs(struct packet * pack, struct tlv_list * tlv_l); int update_neighbours(); int work_with_tlvs(char * data[], short packet_len, struct sockaddr_in6 sender); void add_tlv(struct packet *packet, union tlv *tlv, char type); // int send_packet(); /* Takes a TLV and sends it over to everyone in the list of addresses. * Returns -1 in case of error, 0 otherwise. */ int send_tlv(union tlv * tlv_to_send, int tlv_size, struct sockaddr_in6 * dest_list[], int dest_list_size, int socket_num); /* Takes a list of TLV and sends them over to everyone in the list of addresses. * Returns -1 in case of error, 0 otherwise. */ int send_tlvs(struct list * tlv_list, int tlv_size, struct sockaddr_in6 * dest_list[], int dest_list_size, int socket_num); // threaded functions void t_ask_for_more_peers(); void t_update_neighbours(); void t_get_network_state(); // Helper functions int len_list(list *l); neighbour_peer *get_random_neighbour(); // get data associated with id, if it doesn't exist return NULL pub_data *get_data(long id); // Take data as args and create a pub_data structure in the heap pub_data *copy_data(unsigned char len, long id, short seqno, char *data); // add new data to data list void add_data(unsigned char len, long id, short seqno, char *data); #endif