X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fmeshlink.h;h=75c4932715b6e23eaed4f373cc0b6e0c6c8dfb86;hb=ccab719af183f8d28fd3380f03b0ec5f494d55ae;hp=e9c531ff27008bed4a6518aa095a6a8984434d9a;hpb=1bcadbde8302683f9803129f847ded42a4f66d27;p=meshlink diff --git a/src/meshlink.h b/src/meshlink.h index e9c531ff..75c49327 100644 --- a/src/meshlink.h +++ b/src/meshlink.h @@ -48,6 +48,9 @@ typedef struct meshlink_handle meshlink_handle_t; /// A handle for a MeshLink node. typedef struct meshlink_node meshlink_node_t; +/// A handle for a MeshLink edge. +typedef struct meshlink_edge meshlink_edge_t; + /// A handle for a MeshLink channel. typedef struct meshlink_channel meshlink_channel_t; @@ -85,10 +88,8 @@ extern __thread meshlink_errno_t meshlink_errno; #ifndef MESHLINK_INTERNAL_H struct meshlink_handle { - char *name; - char *appname; - dev_class_t devclass; - void *priv; + char *name; ///< Textual name of ourself. It is stored in a nul-terminated C string, which is allocated by MeshLink. + void *priv; ///< Private pointer which may be set freely by the application, and is never used or modified by MeshLink. }; struct meshlink_node { @@ -97,10 +98,28 @@ struct meshlink_node { }; struct meshlink_channel { + struct meshlink_node *node; ///< Pointer to the peer of this channel. + void *priv; ///< Private pointer which may be set freely by the application, and is never used or modified by MeshLink. }; #endif // MESHLINK_INTERNAL_H +/// An edge in the meshlink network. +struct meshlink_edge { + struct meshlink_node *from; ///< Pointer to a node. Node memory is + // owned by meshlink and should not be + // deallocated. Node contents may be + // changed by meshlink. + struct meshlink_node *to; ///< Pointer to a node. Node memory is + // owned by meshlink and should not be + // deallocated. Node contents may be + // changed by meshlink. + struct sockaddr_storage address;///< The address information associated + // with this edge. + uint32_t options; ///< Edge options. @TODO what are edge options? + int weight; ///< Weight assigned to this edge. +}; + /// Get the text for the given MeshLink error code. /** This function returns a pointer to the string containing the description of the given error code. * @@ -161,6 +180,7 @@ extern bool meshlink_start(meshlink_handle_t *mesh); * close all sockets, and shut down its own thread. * * This function always succeeds. It is allowed to call meshlink_stop() even if MeshLink is already stopped or has never been started. + * Channels that are still open will remain valid, but any communication via channels will stop as well. * * @param mesh A handle which represents an instance of MeshLink. */ @@ -168,7 +188,7 @@ extern void meshlink_stop(meshlink_handle_t *mesh); /// Close the MeshLink handle. /** This function calls meshlink_stop() if necessary, - * and frees the struct meshlink_handle and all associacted memory allocated by MeshLink. + * and frees the struct meshlink_handle and all associacted memory allocated by MeshLink, including all channels. * Afterwards, the handle and any pointers to a struct meshlink_node or struct meshlink_channel are invalid. * * It is allowed to call this function at any time on a valid handle, except inside callback functions. @@ -459,9 +479,21 @@ extern void meshlink_blacklist(meshlink_handle_t *mesh, meshlink_node_t *node); * and will send data to it and accept any data received from it. * * @param mesh A handle which represents an instance of MeshLink. - * @param node A pointer to a meshlink_node_t describing the node to be blacklisted. + * @param node A pointer to a meshlink_node_t describing the node to be whitelisted. */ -extern void meshlink_blacklist(meshlink_handle_t *mesh, meshlink_node_t *node); +extern void meshlink_whitelist(meshlink_handle_t *mesh, meshlink_node_t *node); + +/// Set whether new nodes are blacklisted by default. +/** This function sets the blacklist behaviour for newly discovered nodes. + * If set to true, new nodes will be automatically blacklisted. + * If set to false, which is the default, new nodes are automatically whitelisted. + * The whitelist/blacklist status of a node may be changed afterwards with the + * meshlink_whitelist() and meshlink_blacklist() functions. + * + * @param mesh A handle which represents an instance of MeshLink. + * @param blacklist True if new nodes are to be blacklisted, false if whitelisted. + */ +extern void meshlink_set_default_blacklist(meshlink_handle_t *mesh, bool blacklist); /// A callback for accepting incoming channels. /** This function is called whenever a remote node wants to open a channel to the local node. @@ -478,8 +510,6 @@ extern void meshlink_blacklist(meshlink_handle_t *mesh, meshlink_node_t *node); * If the application rejects the incoming channel by returning false, * then this handle is invalid after the callback returns * (the callback does not need to call meshlink_channel_close() itself in this case). - * @param node The node from which this channel is being initiated. - * The pointer is guaranteed to be valid until meshlink_close() is called. * @param port The port number the peer wishes to connect to. * @param data A pointer to a buffer containing data already received, or NULL in case no data has been received yet. (Not yet used.) * The pointer is only valid during the lifetime of the callback. @@ -489,7 +519,7 @@ extern void meshlink_blacklist(meshlink_handle_t *mesh, meshlink_node_t *node); * @return This function should return true if the application accepts the incoming channel, false otherwise. * If returning false, the channel is invalid and may not be used anymore. */ -typedef bool (*meshlink_channel_accept_cb_t)(meshlink_handle_t *mesh, meshlink_channel_t *channel, meshlink_node_t *node, uint16_t port, const void *data, size_t len); +typedef bool (*meshlink_channel_accept_cb_t)(meshlink_handle_t *mesh, meshlink_channel_t *channel, uint16_t port, const void *data, size_t len); /// A callback for receiving data from a channel. /** This function is called whenever data is received from a remote node on a channel. @@ -507,6 +537,15 @@ typedef bool (*meshlink_channel_accept_cb_t)(meshlink_handle_t *mesh, meshlink_c */ typedef void (*meshlink_channel_receive_cb_t)(meshlink_handle_t *mesh, meshlink_channel_t *channel, const void *data, size_t len); +/// A callback informing the application when data can be sent on a channel. +/** This function is called whenever there is enough free buffer space so a call to meshlink_channel_send() will succeed. + * + * @param mesh A handle which represents an instance of MeshLink. + * @param channel A handle for the channel. + * @param len The maximum amount of data that is guaranteed to be accepted by meshlink_channel_send(). + */ +typedef void (*meshlink_channel_poll_cb_t)(meshlink_handle_t *mesh, meshlink_channel_t *channel, size_t len); + /// Set the accept callback. /** This functions sets the callback that is called whenever another node sends data to the local node. * The callback is run in MeshLink's own thread. @@ -536,6 +575,20 @@ extern void meshlink_set_channel_accept_cb(meshlink_handle_t *mesh, meshlink_cha */ extern void meshlink_set_channel_receive_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, meshlink_channel_receive_cb_t cb); +/// Set the poll callback. +/** This functions sets the callback that is called whenever data can be sent to another node. + * The callback is run in MeshLink's own thread. + * It is therefore important that the callback uses apprioriate methods (queues, pipes, locking, etc.) + * to pass data to or from the application's thread. + * The callback should also not block itself and return as quickly as possible. + * + * @param mesh A handle which represents an instance of MeshLink. + * @param channel A handle for the channel. + * @param cb A pointer to the function which will be called when data can be sent to another node. + * If a NULL pointer is given, the callback will be disabled. + */ +extern void meshlink_set_channel_poll_cb(meshlink_handle_t *mesh, meshlink_channel_t *channel, meshlink_channel_poll_cb_t cb); + /// Open a reliable stream channel to another node. /** This function is called whenever a remote node wants to open a channel to the local node. * The application then has to decide whether to accept or reject this channel. @@ -612,6 +665,43 @@ extern ssize_t meshlink_channel_send(meshlink_handle_t *mesh, meshlink_channel_t */ extern void meshlink_hint_address(meshlink_handle_t *mesh, meshlink_node_t *node, const struct sockaddr *addr); +/// Get a list of edges. +/** This function returns an array with copies of all known bidirectional edges. + * The edges are copied to capture the mesh state at call time, since edges + * mutate frequently. The nodes pointed to within the meshlink_edge_t type + * are not copies; these are the same pointers that one would get from a call + * to meshlink_get_all_nodes(). + * + * @param mesh A handle which represents an instance of MeshLink. + * @param edges A pointer to a previously allocated array of pointers to + * meshlink_edge_t, or NULL in which case MeshLink will + * allocate a new array. The application CANNOT supply an + * array it allocated itself with malloc, but CAN use + * the return value from the previous call to this function + * (which is the preferred way). + * The pointers in the array are valid until meshlink_close() is called. + * ATTENTION: The pointers and values should never be modified + * by the application!!! + * @param nmemb A pointer to a variable holding the number of nodes that + * are stored in the array. In case the @a nodes @a + * argument is not NULL, MeshLink might call realloc() + * on the array to change its size. + * The contents of this variable will be changed to reflect + * the new size of the array. + * @return A pointer to an array containing pointers to all known + * edges, or NULL in case of an error. + * If the @a edges @a argument was not NULL, then the + * retun value can be either the same value or a different + * value. If the new values is NULL, then the old array + * will have been freed by Meshlink. + * The caller must call free() on each element of this + * array (but not the contents of said elements), + * as well as the array itself when it is finished. + * ATTENTION: The pointers and values should never be modified + * by the application!!! + */ +extern meshlink_edge_t **meshlink_get_all_edges_state(meshlink_handle_t *mesh, meshlink_edge_t **edges, size_t *nmemb); + #ifdef __cplusplus } #endif