#pragma once #include "lokinet_context.h" #ifdef __cplusplus extern "C" { #endif /// information about a udp flow struct lokinet_udp_flowinfo { /// remote endpoint's .loki or .snode address char remote_host[256]; /// remote endpont's port uint16_t remote_port; /// the socket id for this flow used for i/o purposes and closing this socket int socket_id; }; /// a result from a lokinet_udp_bind call struct lokinet_udp_bind_result { /// a socket id used to close a lokinet udp socket int socket_id; }; /// flow acceptor hook, return 0 success, return nonzero with errno on failure typedef int (*lokinet_udp_flow_filter)( void* userdata, const struct lokinet_udp_flowinfo* remote_address, void** flow_userdata, int* timeout_seconds); /// callback to make a new outbound flow typedef void(lokinet_udp_create_flow_func)( void* userdata, void** flow_userdata, int* timeout_seconds); /// hook function for handling packets typedef void (*lokinet_udp_flow_recv_func)( const struct lokinet_udp_flowinfo* remote_address, const char* pkt_data, size_t pkt_length, void* flow_userdata); /// hook function for flow timeout typedef void (*lokinet_udp_flow_timeout_func)( const struct lokinet_udp_flowinfo* remote_address, void* flow_userdata); /// inbound listen udp socket /// expose udp port exposePort to the void //// /// @param filter MUST be non null, pointing to a flow filter for accepting new udp flows, called /// with user data /// /// @param recv MUST be non null, pointing to a packet handler function for each flow, called /// with per flow user data provided by filter function if accepted /// /// @param timeout MUST be non null, /// pointing to a cleanup function to clean up a stale flow, staleness determined by the value /// given by the filter function returns 0 on success /// /// @returns nonzero on error in which it is an errno value int EXPORT lokinet_udp_bind( uint16_t exposedPort, lokinet_udp_flow_filter filter, lokinet_udp_flow_recv_func recv, lokinet_udp_flow_timeout_func timeout, void* user, struct lokinet_udp_bind_result* result, struct lokinet_context* ctx); /// @brief establish a udp flow to remote endpoint /// /// @param create_flow the callback to create the new flow if we establish one /// /// @param user passed to new_flow as user data /// /// @param remote the remote address to establish to /// /// @param ctx the lokinet context to use /// /// @return 0 on success, non zero errno on fail int EXPORT lokinet_udp_establish( lokinet_udp_create_flow_func create_flow, void* user, const struct lokinet_udp_flowinfo* remote, struct lokinet_context* ctx); /// @brief send on an established flow to remote endpoint /// blocks until we have sent the packet /// /// @param flowinfo remote flow to use for sending /// /// @param ptr pointer to data to send /// /// @param len the length of the data /// /// @param ctx the lokinet context to use /// /// @returns 0 on success and non zero errno on fail int EXPORT lokinet_udp_flow_send( const struct lokinet_udp_flowinfo* remote, const void* ptr, size_t len, struct lokinet_context* ctx); /// @brief close a bound udp socket /// closes all flows immediately /// /// @param socket_id the bound udp socket's id /// /// @param ctx lokinet context void EXPORT lokinet_udp_close(int socket_id, struct lokinet_context* ctx); #ifdef __cplusplus } #endif