X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fmeshlink_internal.h;h=15edba9ab9a1bf1c3452635c888dac1abe8bb9c7;hb=HEAD;hp=b31c16eb1cc3b92fef8bd1373f9c07573a11e2d9;hpb=230b5907e242aa48bb8c8d09450fbd3767e9c24a;p=meshlink diff --git a/src/meshlink_internal.h b/src/meshlink_internal.h index b31c16eb..b57f212c 100644 --- a/src/meshlink_internal.h +++ b/src/meshlink_internal.h @@ -32,40 +32,29 @@ #include "meshlink_queue.h" #include "sockaddr.h" #include "sptps.h" +#include "xoshiro.h" #include -#define MAXSOCKETS 8 /* Probably overkill... */ +#define MAXSOCKETS 4 /* Probably overkill... */ static const char meshlink_invitation_label[] = "MeshLink invitation"; static const char meshlink_tcp_label[] = "MeshLink TCP"; static const char meshlink_udp_label[] = "MeshLink UDP"; -#define MESHLINK_CONFIG_VERSION 1 -#define MESHLINK_INVITATION_VERSION 1 - -struct CattaServer; -struct CattaSServiceBrowser; -struct CattaSimplePoll; -struct CattaSEntryGroup; +#define MESHLINK_CONFIG_VERSION 2 +#define MESHLINK_INVITATION_VERSION 2 typedef struct listen_socket_t { struct io_t tcp; struct io_t udp; sockaddr_t sa; - bool bindto; + sockaddr_t broadcast_sa; } listen_socket_t; -typedef enum proxytype_t { - PROXY_NONE = 0, - PROXY_SOCKS4, - PROXY_SOCKS4A, - PROXY_SOCKS5, - PROXY_HTTP, -} proxytype_t; - struct meshlink_open_params { char *confbase; + char *lock_filename; char *appname; char *name; dev_class_t devclass; @@ -74,102 +63,139 @@ struct meshlink_open_params { const void *key; size_t keylen; + meshlink_storage_policy_t storage_policy; }; +/// Device class traits +typedef struct { + int pinginterval; + int pingtimeout; + int fast_retry_period; + int maxtimeout; + unsigned int min_connects; + unsigned int max_connects; + int edge_weight; +} dev_class_traits_t; + /// A handle for an instance of MeshLink. struct meshlink_handle { + // public members char *name; void *priv; - char *appname; - int32_t devclass; - - char *confbase; - FILE *conffile; - - meshlink_receive_cb_t receive_cb; - meshlink_node_status_cb_t node_status_cb; + // private members + pthread_mutex_t mutex; + event_loop_t loop; + struct node_t *self; meshlink_log_cb_t log_cb; meshlink_log_level_t log_level; + void *packet; - meshlink_channel_accept_cb_t channel_accept_cb; - meshlink_node_duplicate_cb_t node_duplicate_cb; - meshlink_connection_try_cb_t connection_try_cb; - - pthread_t thread; - bool threadstarted; - pthread_mutex_t mesh_mutex; - event_loop_t loop; - listen_socket_t listen_socket[MAXSOCKETS]; + // The most important network-related members come first + int reachable; int listen_sockets; + listen_socket_t listen_socket[MAXSOCKETS]; + + meshlink_receive_cb_t receive_cb; + meshlink_queue_t outpacketqueue; signal_t datafromapp; - struct node_t *self; + hash_t *node_udp_cache; - struct splay_tree_t *edges; struct splay_tree_t *nodes; + struct splay_tree_t *edges; struct list_t *connections; struct list_t *outgoings; struct list_t *submeshes; - meshlink_queue_t outpacketqueue; - + // Meta-connection-related members struct splay_tree_t *past_request_tree; timeout_t past_request_timeout; + int connection_burst; int contradicting_add_edge; int contradicting_del_edge; int sleeptime; - time_t last_config_check; + time_t connection_burst_time; + time_t last_hard_try; + time_t last_unreachable; timeout_t pingtimer; timeout_t periodictimer; - char *myport; + struct connection_t *everyone; + uint64_t prng_state[4]; + uint32_t session_id; - char *proxyhost; - char *proxyport; - char *proxyuser; - char *proxypass; - proxytype_t proxytype; + int next_pit; + int pits[10]; - bool discovery; // Whether Catta is enabled or not - bool localdiscovery; - sockaddr_t localdiscovery_address; + // Infrequently used callbacks + meshlink_node_status_cb_t node_status_cb; + meshlink_node_status_cb_t meta_status_cb; + meshlink_node_pmtu_cb_t node_pmtu_cb; + meshlink_channel_listen_cb_t channel_listen_cb; + meshlink_channel_accept_cb_t channel_accept_cb; + meshlink_node_duplicate_cb_t node_duplicate_cb; + meshlink_connection_try_cb_t connection_try_cb; + meshlink_error_cb_t error_cb; + meshlink_blacklisted_cb_t blacklisted_cb; + meshlink_thread_status_cb_t thread_status_cb; - bool default_blacklist; + // Mesh parameters + char *appname; + char *myport; - hash_t *node_udp_cache; - struct connection_t *everyone; struct ecdsa *private_key; struct ecdsa *invitation_key; - int invitation_timeout; - int pinginterval; /* seconds between pings */ - int pingtimeout; /* seconds to wait for response */ - int maxtimeout; + dev_class_t devclass; - int sock; - sptps_t sptps; - char cookie[18], hash[18]; - char *data; - size_t thedatalen; - bool success; - char line[4096]; - char buffer[4096]; - size_t blen; - - pthread_t discovery_thread; - bool discovery_threadstarted; - struct CattaServer *catta_server; - struct CattaSServiceBrowser *catta_browser; - struct CattaSimplePoll *catta_poll; - struct CattaSEntryGroup *catta_group; - char *catta_servicetype; - unsigned int catta_interfaces; + int invitation_timeout; + int udp_choice; + + dev_class_traits_t dev_class_traits[DEV_CLASS_COUNT]; int netns; + + bool default_blacklist; + bool inviter_commits_first; + + // Configuration + char *confbase; + FILE *lockfile; void *config_key; + char *external_address_url; + struct list_t *invitation_addresses; + meshlink_storage_policy_t storage_policy; + + // Thread management + pthread_t thread; + pthread_cond_t cond; + bool threadstarted; + + // mDNS discovery + struct { + bool enabled; + io_t pfroute_io; + int *ifaces; + struct discovery_address *addresses; + int iface_count; + int address_count; + io_t sockets[2]; + time_t last_update; +#ifdef __APPLE__ + pthread_t thread; + void *runloop; +#endif + } discovery; + + // ADNS + pthread_t adns_thread; + pthread_cond_t adns_cond; + meshlink_queue_t adns_queue; + meshlink_queue_t adns_done_queue; + signal_t adns_signal; }; /// A handle for a MeshLink node. @@ -184,12 +210,29 @@ struct meshlink_submesh { void *priv; }; +/// An AIO buffer. +typedef struct meshlink_aio_buffer { + const void *data; + int fd; + size_t len; + size_t done; + union { + meshlink_aio_cb_t buffer; + meshlink_aio_fd_cb_t fd; + } cb; + void *priv; + struct meshlink_aio_buffer *next; +} meshlink_aio_buffer_t; + /// A channel. struct meshlink_channel { struct node_t *node; void *priv; + bool in_callback; struct utcp_connection *c; + meshlink_aio_buffer_t *aio_send; + meshlink_aio_buffer_t *aio_receive; meshlink_channel_receive_cb_t receive_cb; meshlink_channel_poll_cb_t poll_cb; }; @@ -200,21 +243,22 @@ typedef struct meshlink_packethdr { uint8_t source[16]; } __attribute__((__packed__)) meshlink_packethdr_t; -extern void meshlink_send_from_queue(event_loop_t *el, meshlink_handle_t *mesh); -extern void update_node_status(meshlink_handle_t *mesh, struct node_t *n); +void meshlink_send_from_queue(event_loop_t *loop, void *mesh); +void update_node_status(meshlink_handle_t *mesh, struct node_t *n); +void update_node_pmtu(meshlink_handle_t *mesh, struct node_t *n); extern meshlink_log_level_t global_log_level; extern meshlink_log_cb_t global_log_cb; -extern int check_port(meshlink_handle_t *mesh); -extern void handle_duplicate_node(meshlink_handle_t *mesh, struct node_t *n); -extern void handle_network_change(meshlink_handle_t *mesh, bool online); - -/// Device class traits -typedef struct { - unsigned int min_connects; - unsigned int max_connects; - int edge_weight; -} dev_class_traits_t; - -extern dev_class_traits_t dev_class_traits[]; +void handle_duplicate_node(meshlink_handle_t *mesh, struct node_t *n); +void handle_network_change(meshlink_handle_t *mesh, bool online); +void call_error_cb(meshlink_handle_t *mesh, meshlink_errno_t meshlink_errno); +void channel_receive(meshlink_handle_t *mesh, meshlink_node_t *node, const void *data, size_t len); + +/// Per-instance PRNG +static inline int prng(meshlink_handle_t *mesh, uint64_t max) { + return xoshiro(mesh->prng_state) % max; +} + +/// Fudge value of ~0.1 seconds, in microseconds. +static const unsigned int TIMER_FUDGE = 0x8000000; #endif