#pragma once #include "routing.h" #include #include // 192.0.2.0 #define UNDEF_ADDR (struct in_addr){0xC0000200} #define MAX_DISC 32 #define MAX_INFLIGHT 32 #define PROTO_UNCTM 60 #define PROTO_TMOUT 5 struct ping { struct nodeid remote_id; int attempt; bool is_new; }; union message_cont { struct ping ping; }; struct dht; struct msgbuff; #define PROCESS_REPONSE(NAME) int (NAME)(struct dht* dht, time_t now, union message_cont* cont, char* packet, size_t packet_len, int socket, struct sockaddr* remote, socklen_t remote_len, struct msgbuff* msgbuff) typedef PROCESS_REPONSE(resp); #define PROCESS_TIMEOUT(NAME) int (NAME)(struct dht* dht, struct nodeid* self, time_t now, union message_cont* cont, struct msgbuff* msgbuff) typedef PROCESS_TIMEOUT(tmout); struct dht { struct nodeid self; int sfd; bool pause; bool reqalloc[MAX_INFLIGHT]; struct { struct sockaddr_storage addr; socklen_t addr_len; resp* fun; time_t timeout; tmout* timeout_fun; union message_cont cont; } requestdata[MAX_INFLIGHT]; }; // @HACK: This isn't true anymore // The longest message we can send is probably a response to find_node which // consists of: // d1:t <-- 4 bytes // <-- 2 bytes // : <-- 1 byte // <-- 16 bytes* // 1:y1:r1:r <-- 9 bytes // d2:id20: <-- 8 bytes // <-- 20 bytes // 5:nodes208: <-- 11 bytes // <-- 208 bytes // ee <-- 2 bytes // TOTAL 281 bytes struct message { <<<<<<< HEAD char payload[1024]; ======= char payload[281]; >>>>>>> 685b13e (I don't remember) size_t payload_len; struct sockaddr_storage dest; socklen_t dest_len; }; void proto_begin(struct dht* dht, time_t now, struct message** output, const struct message* const output_end); int proto_run(struct dht* dht, char* buffer, size_t buffer_len, struct sockaddr_in* remote, socklen_t remote_len, time_t now, struct message** output, const struct message* const output_end); void proto_end(struct dht* dht);