Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
mdns_responder.h
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
Generated on Tue Jul 12 2022 17:10:14 by
1.7.2