X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fmeshlink.h;h=7cf1f4445a5e780f20472dbfdac61b5432232381;hb=e4e5a81447142da0fb1291b2d2119ed6981b89e5;hp=4468fd0079e4c9a0b1da1b43de0eddadfb20d1ad;hpb=e401f4fcb9bf48e4efd04f9671a7c6cf44ff0439;p=meshlink diff --git a/src/meshlink.h b/src/meshlink.h index 4468fd00..7cf1f444 100644 --- a/src/meshlink.h +++ b/src/meshlink.h @@ -25,6 +25,13 @@ #include #include +#if defined(_WIN32) +#include +#else +#include +#include +#endif + #ifdef __cplusplus extern "C" { #endif @@ -32,12 +39,18 @@ extern "C" { /// The length in bytes of a signature made with meshlink_sign() #define MESHLINK_SIGLEN (64) +// The maximum length of fingerprints +#define MESHLINK_FINGERPRINTLEN (64) + /// A handle for an instance of MeshLink. 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; @@ -55,6 +68,15 @@ typedef enum { MESHLINK_EPEER, ///< A peer caused an error } meshlink_errno_t; +/// Device class +typedef enum { + DEV_CLASS_BACKBONE = 0, + DEV_CLASS_STATIONARY = 1, + DEV_CLASS_PORTABLE = 2, + DEV_CLASS_UNKNOWN = 3, + _DEV_CLASS_MAX = 3 +} dev_class_t; + /// A variable holding the last encountered error from MeshLink. /** This is a thread local variable that contains the error code of the most recent error * encountered by a MeshLink API function called in the current thread. @@ -66,12 +88,14 @@ extern __thread meshlink_errno_t meshlink_errno; #ifndef MESHLINK_INTERNAL_H struct meshlink_handle { - const char *name; + char *name; + char *appname; + dev_class_t devclass; void *priv; }; struct meshlink_node { - const char *name; ///< Textual name of this node. It is stored in a nul-terminated C string, which is allocated by MeshLink. + char *name; ///< Textual name of this node. 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. }; @@ -80,6 +104,22 @@ struct meshlink_channel { #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. * @@ -111,11 +151,17 @@ extern const char *meshlink_strerror(meshlink_errno_t err); * After the function returns, the application is free to overwrite or free @a confbase @a. * @param name The name which this instance of the application will use in the mesh. * After the function returns, the application is free to overwrite or free @a name @a. + * @param appname The application name which will be used in the mesh. + * After the function returns, the application is free to overwrite or free @a name @a. + * @param devclass The device class which will be used in the mesh. * * @return A pointer to a meshlink_handle_t which represents this instance of MeshLink, or NULL in case of an error. * The pointer is valid until meshlink_close() is called. */ -extern meshlink_handle_t *meshlink_open(const char *confbase, const char *name); +extern meshlink_handle_t *meshlink_open(const char *confbase, const char *name, const char* appname, dev_class_t devclass); + +/// is used by the C++ wrapper to allocate more memory behind the handle +extern meshlink_handle_t *meshlink_open_with_size(const char *confbase, const char *name, const char* appname, dev_class_t devclass, size_t size); /// Start MeshLink. /** This function causes MeshLink to open network sockets, make outgoing connections, and @@ -206,7 +252,7 @@ typedef enum { } meshlink_log_level_t; /// A callback for receiving log messages generated by MeshLink. -/** @param mesh A handle which represents an instance of MeshLink. +/** @param mesh A handle which represents an instance of MeshLink, or NULL. * @param level An enum describing the severity level of the message. * @param text A pointer to a nul-terminated C string containing the textual log message. * This pointer is only valid for the duration of the callback. @@ -217,12 +263,21 @@ typedef void (*meshlink_log_cb_t)(meshlink_handle_t *mesh, meshlink_log_level_t /// Set the log callback. /** This functions sets the callback that is called whenever MeshLink has some information to log. - * The callback is run in MeshLink's own thread. + * + * The @a mesh @a parameter can either be a valid MeshLink handle, or NULL. + * In case it is NULL, the callback will be called for errors that happen outside the context of a valid mesh instance. + * Otherwise, it will be called for errors that happen in the context of the given mesh instance. + * + * If @a mesh @a is not NULL, then the callback is run in MeshLink's own thread. * It is important that the callback uses apprioriate methods (queues, pipes, locking, etc.) * to hand the data over to 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. + * The @a mesh @a parameter can either be a valid MeshLink handle, or NULL. + * In case it is NULL, the callback will be called for errors that happen outside the context of a valid mesh instance. + * Otherwise, it will be called for errors that happen in the context of the given mesh instance. + * + * @param mesh A handle which represents an instance of MeshLink, or NULL. * @param level An enum describing the minimum severity level. Debugging information with a lower level will not trigger the callback. * @param cb A pointer to the function which will be called when another node sends data to the local node. * If a NULL pointer is given, the callback will be disabled. @@ -574,7 +629,41 @@ extern ssize_t meshlink_channel_send(meshlink_handle_t *mesh, meshlink_channel_t * given hostname. The caller is free to overwrite or free * this memory once meshlink returns. */ -extern void meshlink_hint_address(meshlink_handle_t *mesh, const char *hostname, struct sockaddr *addr); +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. + * @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. + */ +extern meshlink_edge_t **meshlink_get_all_edges_state(meshlink_handle_t *mesh, meshlink_edge_t **edges, size_t *nmemb); #ifdef __cplusplus }