#pragma once #include #include #include #include #include #include #include #include #include #include /* * man 7 udp about receive operation on UDP sockets: * * > All receive operations return only one packet. When the packet is smaller than the passed * > buffer, only that much data is returned; when it is bigger, the packet is truncated and the * > MSG_TRUNC flag is set. MSG_WAITALL is not supported. */ enum FD_STATE { FDS_READY, FDS_AGAIN, FDS_ERR }; enum BP_MODE { BP_READING, BP_WRITING }; enum PKT_CMD { CMD_HEALTH, CMD_CLEAR, CMD_XOR }; struct abstract_packet { char raw; struct { enum PKT_CMD cmd; uint16_t size; } headers; union { struct { uint16_t id; uint8_t bitfield; uint8_t prevlink; uint16_t deltat; } health; struct { uint16_t id; uint16_t port; char payload; } clear; } content; }; struct internet_packet { struct abstract_packet ap; char rest[1499]; // MTU = 1500, 1 byte in the union as payload }; struct buffer_packet { enum BP_MODE mode; uint8_t ap_count; uint16_t aread; uint16_t awrite; struct internet_packet ip; }; struct udp_target { struct sockaddr_in addr; socklen_t addrlen; int set; int ref_count; }; enum FD_STATE read_packet_from_tcp(int fd, struct buffer_packet* bp); enum FD_STATE write_packet_to_tcp(int fd, struct buffer_packet* bp); enum FD_STATE write_packet_to_udp(int fd, struct buffer_packet* bp, struct udp_target* udp_t); enum FD_STATE read_packet_from_udp (int fd, struct buffer_packet* bp, struct udp_target* udp_t);