/* See the DRL-LICENSE file for this file's software license. */ #ifndef _SWIM_H_ #define _SWIM_H_ #define AWOL (0) #define ALIVE (1) #define MAX_FRIENDS (5) #define UPDATE_THRESHOLD (3) #define FRIEND_THRESHOLD (4) #define SOURCE_THRESHOLD (8) static const uint16_t CHECK = 3; static const uint16_t CHECK_ACK = 4; static const uint16_t PING = 5; static const uint16_t PING_ACK = 6; /** Structs needed to maintain the list of nodes to which * ping messages have been sent. This list is maintained * by one of the "friend" nodes */ typedef struct ping_target { // node which has been targetted remote_node_t target; // node which requested the ping target // so that CHECK_ACK could be sent with ALIVE / AWOL remote_node_t source; // count of gossip rounds to keep timeout uint32_t count; // this has to be a list as well because we have to // remember all the suspects a particular node has // pinged and is waiting for a response struct ping_target *next; } ping_target_t; typedef struct update { /*Remote limiter whose update this is*/ remote_limiter_t *remote; /*Number of times, update has been piggy *backed on a gossip message*/ int count; struct update *next; } update_t; typedef struct swim_comm { /*Incarnation number of the node*/ uint32_t incarnation; /*List of updates currently held by the node*/ update_t *updates; int count_updates; /** Keep track of the ping messages being sent and wait for timeout */ ping_target_t *ping_targets; } swim_comm_t; int swim_init(comm_t *comm, uint32_t id); void swim_teardown(comm_t *comm); int swim_receive(comm_t *comm, uint32_t id, int sock, remote_limiter_t *remote, message_t *msg); int send_gossip_swim(comm_t *comm, uint32_t id, int sock); void swim_restart(comm_t *comm, int32_t view_number); #endif /* _SWIM_H_ */