/* **************************************************************************** * PicoTCP. Copyright (c) 2014 TASS Belgium NV. Some rights reserved. * See LICENSE and COPYING for usage. * . * Author: Toon Stegen, Jelle De Vleeschouwer * ****************************************************************************/ #ifndef INCLUDE_PICO_MDNS #define INCLUDE_PICO_MDNS #include "pico_dns_common.h" #include "pico_tree.h" #include "pico_ipv4.h" /* ********************************* CONFIG ***********************************/ #define PICO_MDNS_PROBE_UNICAST 1 /* Probe queries as QU-questions */ #define PICO_MDNS_CONTINUOUS_REFRESH 0 /* Continuously update cache */ #define PICO_MDNS_ALLOW_CACHING 1 /* Enable caching on this host */ #define PICO_MDNS_DEFAULT_TTL 120 /* Default TTL of mDNS records */ #define PICO_MDNS_SERVICE_TTL 120 /* Default TTL of SRV/TXT/PTR/NSEC */ #define PICO_MDNS_PROBE_COUNT 4 /* Amount of probes to send */ #define PICO_MDNS_ANNOUNCEMENT_COUNT 3 /* Amount of announcements to send */ /* ****************************************************************************/ #define PICO_MDNS_DEST_ADDR4 "224.0.0.251" /* To make mDNS records unique or shared records */ #define PICO_MDNS_RECORD_UNIQUE 0x00u #define PICO_MDNS_RECORD_SHARED 0x01u /* Flag to check for when records are returned, to determine the hostname */ #define PICO_MDNS_RECORD_HOSTNAME 0x02u #define IS_HOSTNAME_RECORD(x) \ (((x)->flags) & PICO_MDNS_RECORD_HOSTNAME) ? (1) : (0) /* --- MDNS resource record --- */ struct pico_mdns_record { struct pico_dns_record *record; /* DNS Resource Record */ uint32_t current_ttl; /* Current TTL */ uint8_t flags; /* Resource Record flags */ uint8_t claim_id; /* Claim ID number */ }; /* **************************************************************************** * Compares 2 mDNS records by type, name AND rdata for a truly unique result * * @param ra mDNS record A * @param rb mDNS record B * @return 0 when records are equal, returns difference when they're not. * ****************************************************************************/ int pico_mdns_record_cmp( void *a, void *b ); /* **************************************************************************** * Deletes a single mDNS resource record. * * @param record Void-pointer to mDNS Resource Record. Can be used with pico_- * tree-destroy. * @return Returns 0 on success, something else on failure. * ****************************************************************************/ int pico_mdns_record_delete( void **record ); /* **************************************************************************** * Creates a single standalone mDNS resource record with given name, type and * data to register on the network. * * @param url DNS rrecord name in URL format. Will be converted to DNS * name notation format. * @param _rdata Memory buffer with data to insert in the resource record. If * data of record should contain a DNS name, the name in the * databuffer needs to be in URL-format. * @param datalen The exact length in bytes of the _rdata-buffer. If data of * record should contain a DNS name, datalen needs to be * pico_dns_strlen(_rdata). * @param rtype DNS type of the resource record to be. * @param rclass DNS class of the resource record to be. * @param rttl DNS ttl of the resource record to be. * @param flags You can specify if the mDNS record should be a shared record * rather than a unique record. * @return Pointer to newly created mDNS resource record. * ****************************************************************************/ struct pico_mdns_record * pico_mdns_record_create( const char *url, void *_rdata, uint16_t datalen, uint16_t rtype, uint32_t rttl, uint8_t flags ); /* **************************************************************************** * Definition of DNS record tree * ****************************************************************************/ typedef struct pico_tree pico_mdns_rtree; #define PICO_MDNS_RTREE_DECLARE(name) \ pico_mdns_rtree (name) = {&LEAF, pico_mdns_record_cmp} #define PICO_MDNS_RTREE_DESTROY(rtree) \ pico_tree_destroy((rtree), pico_mdns_record_delete) #define PICO_MDNS_RTREE_ADD(tree, record) \ pico_tree_insert((tree), (record)) /* **************************************************************************** * API-call to query a record with a certain URL and type. First checks the * Cache for this record. If no cache-entry is found, a query will be sent on * the wire for this record. * * @param url URL to query for. * @param type DNS type top query for. * @param callback Callback to call when records are found for the query. * @return 0 when query is correctly parsed, something else on failure. * ****************************************************************************/ int pico_mdns_getrecord( const char *url, uint16_t type, void (*callback)(pico_mdns_rtree *, char *, void *), void *arg ); /* **************************************************************************** * Claim all different mDNS records in a tree in a single API-call. All records * in tree are called in a single new claim-session. * * @param rtree mDNS record tree with records to claim * @param callback Callback to call when all record are properly claimed. * @return 0 When claiming didn't horribly fail. * ****************************************************************************/ int pico_mdns_claim( pico_mdns_rtree record_tree, void (*callback)(pico_mdns_rtree *, char *, void *), void *arg ); /* **************************************************************************** * Sets the hostname for this machine. Claims automatically a unique A record * with the IPv4-address of this host. The hostname won't be set directly when * this functions returns, but only if the claiming of the unique record succ- * eeded. Init-callback will be called when the hostname-record is successfully * registered. * * @param url URL to set the hostname to. * @param arg Argument to pass to the init-callback. * @return 0 when the host started registering the hostname-record successfully, * Returns something else when it didn't succeeded. * ****************************************************************************/ int pico_mdns_set_hostname( const char *url, void *arg ); /* **************************************************************************** * Get the current hostname for this machine. * * @return Returns the hostname for this machine when the module is initialised * Returns NULL when the module is not initialised. * ****************************************************************************/ const char * pico_mdns_get_hostname( void ); /* **************************************************************************** * Initialises the entire mDNS-module and sets the hostname for this machine. * Sets up the global mDNS socket properly and calls callback when succeeded. * Only when the module is properly initialised records can be registered on * the module. * * @param hostname URL to set the hostname to. * @param address IPv4-address of this host to bind to. * @param callback Callback to call when the hostname is registered and * also the global mDNS module callback. Gets called when * Passive conflicts occur, so changes in records can be * tracked in this callback. * @param arg Argument to pass to the init-callback. * @return 0 when the module is properly initialised and the host started regis- * tering the hostname. Returns something else went the host failed * initialising the module or registering the hostname. * ****************************************************************************/ int pico_mdns_init( const char *hostname, struct pico_ip4 address, void (*callback)(pico_mdns_rtree *, char *, void *), void *arg ); #endif /* _INCLUDE_PICO_MDNS */