Sergey Pastor / 1

Dependents:   Nucleo

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers mdns_responder.h Source File

mdns_responder.h

Go to the documentation of this file.
00001 /**
00002  * @file mdns_responder.h
00003  * @brief mDNS responder (Multicast DNS)
00004  *
00005  * @section License
00006  *
00007  * Copyright (C) 2010-2017 Oryx Embedded SARL. All rights reserved.
00008  *
00009  * This file is part of CycloneTCP Open.
00010  *
00011  * This program is free software; you can redistribute it and/or
00012  * modify it under the terms of the GNU General Public License
00013  * as published by the Free Software Foundation; either version 2
00014  * of the License, or (at your option) any later version.
00015  *
00016  * This program is distributed in the hope that it will be useful,
00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019  * GNU General Public License for more details.
00020  *
00021  * You should have received a copy of the GNU General Public License
00022  * along with this program; if not, write to the Free Software Foundation,
00023  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
00024  *
00025  * @author Oryx Embedded SARL (www.oryx-embedded.com)
00026  * @version 1.7.6
00027  **/
00028 
00029 #ifndef _MDNS_RESPONDER_H
00030 #define _MDNS_RESPONDER_H
00031 
00032 //Dependencies
00033 #include "core/net.h"
00034 #include "core/udp.h"
00035 #include "dns/dns_common.h"
00036 #include "mdns/mdns_common.h"
00037 
00038 //mDNS responder support
00039 #ifndef MDNS_RESPONDER_SUPPORT
00040    #define MDNS_RESPONDER_SUPPORT DISABLED
00041 #elif (MDNS_RESPONDER_SUPPORT != ENABLED && MDNS_RESPONDER_SUPPORT != DISABLED)
00042    #error MDNS_RESPONDER_SUPPORT parameter is not valid
00043 #endif
00044 
00045 //mDNS responder tick interval
00046 #ifndef MDNS_RESPONDER_TICK_INTERVAL
00047    #define MDNS_RESPONDER_TICK_INTERVAL 250
00048 #elif (MDNS_RESPONDER_TICK_INTERVAL < 10)
00049    #error MDNS_RESPONDER_TICK_INTERVAL parameter is not valid
00050 #endif
00051 
00052 //Maximum length of host name
00053 #ifndef MDNS_RESPONDER_MAX_HOSTNAME_LEN
00054    #define MDNS_RESPONDER_MAX_HOSTNAME_LEN 32
00055 #elif (MDNS_RESPONDER_MAX_HOSTNAME_LEN < 1)
00056    #error MDNS_RESPONDER_MAX_HOSTNAME_LEN parameter is not valid
00057 #endif
00058 
00059 //Maximum waiting delay
00060 #ifndef MDNS_MAX_WAITING_DELAY
00061    #define MDNS_MAX_WAITING_DELAY 10000
00062 #elif (MDNS_MAX_WAITING_DELAY < 0)
00063    #error MDNS_MAX_WAITING_DELAY parameter is not valid
00064 #endif
00065 
00066 //Initial random delay (minimum value)
00067 #ifndef MDNS_RAND_DELAY_MIN
00068    #define MDNS_RAND_DELAY_MIN 0
00069 #elif (MDNS_RAND_DELAY_MIN < 0)
00070    #error MDNS_RAND_DELAY_MIN parameter is not valid
00071 #endif
00072 
00073 //Initial random delay (maximum value)
00074 #ifndef MDNS_RAND_DELAY_MAX
00075    #define MDNS_RAND_DELAY_MAX 250
00076 #elif (MDNS_RAND_DELAY_MAX < 0)
00077    #error MDNS_RAND_DELAY_MAX parameter is not valid
00078 #endif
00079 
00080 //Number of probe packets
00081 #ifndef MDNS_PROBE_NUM
00082    #define MDNS_PROBE_NUM 3
00083 #elif (MDNS_PROBE_NUM < 1)
00084    #error MDNS_PROBE_NUM parameter is not valid
00085 #endif
00086 
00087 //Time interval between subsequent probe packets
00088 #ifndef MDNS_PROBE_DELAY
00089    #define MDNS_PROBE_DELAY 250
00090 #elif (MDNS_PROBE_DELAY < 100)
00091    #error MDNS_PROBE_DELAY parameter is not valid
00092 #endif
00093 
00094 //Delay before probing again when deferring to the winning host
00095 #ifndef MDNS_PROBE_DEFER
00096    #define MDNS_PROBE_DEFER 1000
00097 #elif (MDNS_PROBE_DEFER < 100)
00098    #error MDNS_PROBE_DEFER parameter is not valid
00099 #endif
00100 
00101 //Number of announcement packets
00102 #ifndef MDNS_ANNOUNCE_NUM
00103    #define MDNS_ANNOUNCE_NUM 2
00104 #elif (MDNS_ANNOUNCE_NUM < 1)
00105    #error MDNS_ANNOUNCE_NUM parameter is not valid
00106 #endif
00107 
00108 //Time interval between subsequent announcement packets
00109 #ifndef MDNS_ANNOUNCE_DELAY
00110    #define MDNS_ANNOUNCE_DELAY 1000
00111 #elif (MDNS_ANNOUNCE_DELAY < 100)
00112    #error MDNS_ANNOUNCE_DELAY parameter is not valid
00113 #endif
00114 
00115 //Forward declaration of DnsSdContext structure
00116 struct _MdnsResponderContext;
00117 #define MdnsResponderContext struct _MdnsResponderContext
00118 
00119 
00120 /**
00121  * @brief mDNS responder states
00122  **/
00123 
00124 typedef enum
00125 {
00126    MDNS_STATE_INIT,
00127    MDNS_STATE_WAITING,
00128    MDNS_STATE_PROBING,
00129    MDNS_STATE_ANNOUNCING,
00130    MDNS_STATE_IDLE
00131 } MdnsState;
00132 
00133 
00134 /**
00135  * @brief FSM state change callback
00136  **/
00137 
00138 typedef void (*MdnsResponderStateChangeCallback)(MdnsResponderContext *context,
00139    NetInterface *interface, MdnsState state);
00140 
00141 
00142 /**
00143  * @brief mDNS responder settings
00144  **/
00145 
00146 typedef struct
00147 {
00148    NetInterface *interface;                           ///<Underlying network interface
00149    uint_t numAnnouncements;                           ///<Number of announcement packets
00150    uint32_t ttl;                                      ///<TTL resource record
00151    MdnsResponderStateChangeCallback stateChangeEvent; ///<FSM state change event
00152 } MdnsResponderSettings;
00153 
00154 
00155 /**
00156  * @brief mDNS responder context
00157  **/
00158 
00159 struct _MdnsResponderContext
00160 {
00161    MdnsResponderSettings settings;                            ///<DNS-SD settings
00162    bool_t running;                                            ///<mDNS responder is currently running
00163    MdnsState state;                                           ///<FSM state
00164    bool_t conflict;                                           ///<Conflict detected
00165    bool_t tieBreakLost;                                       ///<Tie-break lost
00166    systime_t timestamp;                                       ///<Timestamp to manage retransmissions
00167    systime_t timeout;                                         ///<Timeout value
00168    uint_t retransmitCount;                                    ///<Retransmission counter
00169    char_t hostname[MDNS_RESPONDER_MAX_HOSTNAME_LEN + 1];      ///<Hostname
00170 #if (IPV4_SUPPORT == ENABLED)
00171    char_t ipv4ReverseName[DNS_MAX_IPV4_REVERSE_NAME_LEN + 1]; ///<Reverse DNS lookup for IPv4
00172    MdnsMessage ipv4Response;                                  ///<IPv4 response message
00173 #endif
00174 #if (IPV6_SUPPORT == ENABLED)
00175    char_t ipv6ReverseName[DNS_MAX_IPV6_REVERSE_NAME_LEN + 1]; ///<Reverse DNS lookup for IPv6
00176    MdnsMessage ipv6Response;                                  ///<IPv6 response message
00177 #endif
00178 };
00179 
00180 
00181 //Tick counter to handle periodic operations
00182 extern systime_t mdnsResponderTickCounter;
00183 
00184 //mDNS related functions
00185 void mdnsResponderGetDefaultSettings(MdnsResponderSettings *settings);
00186 
00187 error_t mdnsResponderInit(MdnsResponderContext *context,
00188    const MdnsResponderSettings *settings);
00189 
00190 error_t mdnsResponderStart(MdnsResponderContext *context);
00191 error_t mdnsResponderStop(MdnsResponderContext *context);
00192 MdnsState mdnsResponderGetState(MdnsResponderContext *context);
00193 
00194 error_t mdnsResponderSetHostname(MdnsResponderContext *context,
00195    const char_t *hostname);
00196 
00197 error_t mdnsResponderSetIpv4ReverseName(MdnsResponderContext *context);
00198 error_t mdnsResponderSetIpv6ReverseName(MdnsResponderContext *context);
00199 
00200 error_t mdnsResponderStartProbing(MdnsResponderContext *context);
00201 
00202 void mdnsResponderTick(MdnsResponderContext *context);
00203 void mdnsResponderLinkChangeEvent(MdnsResponderContext *context);
00204 
00205 void mdnsResponderChangeState(MdnsResponderContext *context,
00206    MdnsState newState, systime_t delay);
00207 
00208 void mdnsResponderChangeHostname(MdnsResponderContext *context);
00209 
00210 error_t mdnsResponderSendProbe(MdnsResponderContext *context);
00211 error_t mdnsResponderSendAnnouncement(MdnsResponderContext *context);
00212 error_t mdnsResponderSendGoodbye(MdnsResponderContext *context);
00213 
00214 void mdnsResponderProcessQuery(NetInterface *interface, MdnsMessage *query);
00215 
00216 error_t mdnsResponderParseQuestion(NetInterface *interface, const MdnsMessage *query,
00217    size_t offset, const DnsQuestion *question, MdnsMessage *response);
00218 
00219 void mdnsResponderParseKnownAnRecord(NetInterface *interface, const MdnsMessage *query,
00220    size_t queryOffset, const DnsResourceRecord *queryRecord, MdnsMessage *response);
00221 
00222 void mdnsResponderParseNsRecord(NetInterface *interface,
00223    const MdnsMessage *query, size_t offset, const DnsResourceRecord *record);
00224 
00225 void mdnsResponderParseAnRecord(NetInterface *interface,
00226    const MdnsMessage *response, size_t offset, const DnsResourceRecord *record);
00227 
00228 void mdnsResponderGenerateAdditionalRecords(NetInterface *interface,
00229    MdnsMessage *response, bool_t legacyUnicast);
00230 
00231 error_t mdnsResponderAddIpv4AddrRecord(NetInterface *interface,
00232    MdnsMessage *message, bool_t cacheFlush, uint32_t ttl);
00233 
00234 error_t mdnsResponderAddIpv6AddrRecord(NetInterface *interface,
00235    MdnsMessage *message, bool_t cacheFlush, uint32_t ttl);
00236 
00237 error_t mdnsResponderAddIpv4ReversePtrRecord(NetInterface *interface,
00238    MdnsMessage *message, bool_t cacheFlush, uint32_t ttl);
00239 
00240 error_t mdnsResponderAddIpv6ReversePtrRecord(NetInterface *interface,
00241    MdnsMessage *message, bool_t cacheFlush, uint32_t ttl);
00242 
00243 error_t mdnsResponderAddNsecRecord(NetInterface *interface,
00244    MdnsMessage *message, bool_t cacheFlush, uint32_t ttl);
00245 
00246 #endif
00247