@@ -85,7 +85,7 @@ static const IPAddress MDNS_MULTICAST_ADDR(224, 0, 0, 251);
85
85
static const int MDNS_MULTICAST_TTL = 1 ;
86
86
static const int MDNS_PORT = 5353 ;
87
87
88
- MDNSResponder::MDNSResponder () : _conn(0 ) { _services = 0 ; _arduinoAuth = false ; }
88
+ MDNSResponder::MDNSResponder () : _conn(0 ) { _services = 0 ; }
89
89
MDNSResponder::~MDNSResponder () {}
90
90
91
91
bool MDNSResponder::begin (const char * domain){
@@ -138,6 +138,58 @@ void MDNSResponder::update() {
138
138
_parsePacket ();
139
139
}
140
140
141
+
142
+
143
+
144
+
145
+
146
+
147
+
148
+ bool MDNSResponder::addServiceTxt (char *name, char *proto, char *txt){
149
+ MDNSService* servicePtr;
150
+
151
+ // DEBUG Serial.printf("Starting addServiceTxt(name=%s,proto=%s,txt=%s)\n", name,proto,txt);
152
+ // DEBUG delay(20);
153
+ uint8_t txtLen = os_strlen (txt) + 1 ; // One accounts for length byte added when building the txt responce
154
+ if ( txtLen > 128 ) return false ;
155
+ // Find the service
156
+ for (servicePtr = _services; servicePtr; servicePtr = servicePtr->_next ) {
157
+ // DEBUG Serial.printf("Checking service name=%s,proto=%s\n", servicePtr->_name,servicePtr->_proto);
158
+ // DEBUG delay(20);
159
+ if (strcmp (servicePtr->_name , name) == 0 && strcmp (servicePtr->_proto , proto) == 0 ){
160
+ if (servicePtr->_txtLen + txtLen > 1300 ) return false ; // max txt record size
161
+ // DEBUG Serial.printf("found match service name=%s,proto=%s\n", servicePtr->_name,servicePtr->_proto);
162
+ // DEBUG delay(20);
163
+ struct MDNSTxt *newtxt = (struct MDNSTxt *)(os_malloc (sizeof (struct MDNSTxt )));
164
+ os_strcpy (newtxt->_txt , txt);
165
+ newtxt->_next = 0 ;
166
+ if (servicePtr->_txts == 0 ) { // no services have been added
167
+ servicePtr->_txts = newtxt;
168
+ servicePtr->_txtLen += txtLen;
169
+ // DEBUG Serial.printf("Adding First TXT of %s to service %s and proto %s\n", newtxt->_txt,servicePtr->_name,servicePtr->_proto);
170
+ // DEBUG Serial.printf("New txt length: %d\n",servicePtr->_txtLen);
171
+ return true ;
172
+ }
173
+ else {
174
+ MDNSTxt * txtPtr = servicePtr->_txts ;
175
+ while (txtPtr->_next !=0 ) {
176
+ txtPtr = txtPtr->_next ;
177
+ // DEBUG Serial.println("Incramenting txt pointer");
178
+ }
179
+ txtPtr->_next = newtxt;
180
+ servicePtr->_txtLen += txtLen;
181
+ // DEBUG Serial.printf("Adding Another TXT of %s to service %s and proto %s\n", newtxt->_txt,servicePtr->_name,servicePtr->_proto);
182
+ // DEBUG Serial.printf("New txt length: %d\n",servicePtr->_txtLen);
183
+ return true ;
184
+ }
185
+ /*
186
+ */
187
+ }
188
+ }
189
+ return false ;
190
+ // DEBUG Serial.println("No Service Found When adding a txt");
191
+ }
192
+
141
193
void MDNSResponder::addService (char *name, char *proto, uint16_t port){
142
194
if (_getServicePort (name, proto) != 0 ) return ;
143
195
if (os_strlen (name) > 32 || os_strlen (proto) != 3 ) return ; // bad arguments
@@ -146,15 +198,55 @@ void MDNSResponder::addService(char *name, char *proto, uint16_t port){
146
198
os_strcpy (srv->_proto , proto);
147
199
srv->_port = port;
148
200
srv->_next = 0 ;
149
-
201
+ srv->_txts = 0 ;
202
+ srv->_txtLen = 0 ;
203
+
150
204
if (_services == 0 ) _services = srv;
151
205
else {
152
206
MDNSService* servicePtr = _services;
153
207
while (servicePtr->_next !=0 ) servicePtr = servicePtr->_next ;
154
208
servicePtr->_next = srv;
155
209
}
210
+
211
+ }
212
+
213
+ MDNSTxt * MDNSResponder::_getServiceTxt (char *name, char *proto){
214
+ MDNSService* servicePtr;
215
+ for (servicePtr = _services; servicePtr; servicePtr = servicePtr->_next ) {
216
+ if (servicePtr->_port > 0 && strcmp (servicePtr->_name , name) == 0 && strcmp (servicePtr->_proto , proto) == 0 ){
217
+ if (servicePtr->_txts == 0 ) return false ;
218
+ else {
219
+ return servicePtr->_txts ;
220
+ }
221
+ }
222
+ }
223
+ return 0 ;
156
224
}
157
225
226
+ uint16_t MDNSResponder::_getServiceTxtLen (char *name, char *proto){
227
+ MDNSService* servicePtr;
228
+ for (servicePtr = _services; servicePtr; servicePtr = servicePtr->_next ) {
229
+ if (servicePtr->_port > 0 && strcmp (servicePtr->_name , name) == 0 && strcmp (servicePtr->_proto , proto) == 0 ){
230
+ if (servicePtr->_txts == 0 ) return false ;
231
+ else {
232
+ return servicePtr->_txtLen ;
233
+ }
234
+ }
235
+ }
236
+ return 0 ;
237
+ }
238
+
239
+
240
+
241
+
242
+
243
+
244
+
245
+
246
+
247
+
248
+
249
+
158
250
uint16_t MDNSResponder::_getServicePort (char *name, char *proto){
159
251
MDNSService* servicePtr;
160
252
for (servicePtr = _services; servicePtr; servicePtr = servicePtr->_next ) {
@@ -177,7 +269,7 @@ uint32_t MDNSResponder::_getOurIp(){
177
269
return staIpInfo.ip .addr ;
178
270
} else {
179
271
#ifdef MDNS_DEBUG_ERR
180
- os_printf (" ERR_NO_LOCAL_IP\n " );
272
+ Serial. printf (" ERR_NO_LOCAL_IP\n " );
181
273
#endif
182
274
return 0 ;
183
275
}
@@ -224,7 +316,7 @@ void MDNSResponder::_parsePacket(){
224
316
225
317
if (hostNameLen > 0 && strcmp (_hostName, hostName) != 0 ){
226
318
#ifdef MDNS_DEBUG_ERR
227
- os_printf (" ERR_NO_HOST: %s\n " , hostName);
319
+ Serial. printf (" ERR_NO_HOST: %s\n " , hostName);
228
320
#endif
229
321
_conn->flush ();
230
322
return ;
@@ -249,14 +341,14 @@ void MDNSResponder::_parsePacket(){
249
341
localParsed = true ;
250
342
} else {
251
343
#ifdef MDNS_DEBUG_ERR
252
- os_printf (" ERR_FQDN: %s\n " , serviceName);
344
+ Serial. printf (" ERR_FQDN: %s\n " , serviceName);
253
345
#endif
254
346
_conn->flush ();
255
347
return ;
256
348
}
257
349
} else {
258
350
#ifdef MDNS_DEBUG_ERR
259
- os_printf (" ERR_SERVICE: %s\n " , serviceName);
351
+ Serial. printf (" ERR_SERVICE: %s\n " , serviceName);
260
352
#endif
261
353
_conn->flush ();
262
354
return ;
@@ -273,7 +365,7 @@ void MDNSResponder::_parsePacket(){
273
365
protoParsed = true ;
274
366
} else {
275
367
#ifdef MDNS_DEBUG_ERR
276
- os_printf (" ERR_PROTO: %s\n " , protoName);
368
+ Serial. printf (" ERR_PROTO: %s\n " , protoName);
277
369
#endif
278
370
_conn->flush ();
279
371
return ;
@@ -290,7 +382,7 @@ void MDNSResponder::_parsePacket(){
290
382
localParsed = true ;
291
383
} else {
292
384
#ifdef MDNS_DEBUG_ERR
293
- os_printf (" ERR_FQDN: %s\n " , localName);
385
+ Serial. printf (" ERR_FQDN: %s\n " , localName);
294
386
#endif
295
387
_conn->flush ();
296
388
return ;
@@ -301,14 +393,14 @@ void MDNSResponder::_parsePacket(){
301
393
servicePort = _getServicePort (serviceName, protoName);
302
394
if (servicePort == 0 ){
303
395
#ifdef MDNS_DEBUG_ERR
304
- os_printf (" ERR_NO_SERVICE: %s\n " , serviceName);
396
+ Serial. printf (" ERR_NO_SERVICE: %s\n " , serviceName);
305
397
#endif
306
398
_conn->flush ();
307
399
return ;
308
400
}
309
401
} else if (serviceNameLen > 0 || protoNameLen > 0 ){
310
402
#ifdef MDNS_DEBUG_ERR
311
- os_printf (" ERR_SERVICE_PROTO: %s\n " , serviceName);
403
+ Serial. printf (" ERR_SERVICE_PROTO: %s\n " , serviceName);
312
404
#endif
313
405
_conn->flush ();
314
406
return ;
@@ -317,7 +409,7 @@ void MDNSResponder::_parsePacket(){
317
409
// RESPOND
318
410
319
411
#ifdef MDNS_DEBUG_RX
320
- os_printf (" RX: REQ, ID:%u, Q:%u, A:%u, NS:%u, ADD:%u\n " , packetHeader[0 ], packetHeader[2 ], packetHeader[3 ], packetHeader[4 ], packetHeader[5 ]);
412
+ Serial. printf (" RX: REQ, ID:%u, Q:%u, A:%u, NS:%u, ADD:%u\n " , packetHeader[0 ], packetHeader[2 ], packetHeader[3 ], packetHeader[4 ], packetHeader[5 ]);
321
413
#endif
322
414
323
415
uint16_t currentType;
@@ -344,24 +436,24 @@ void MDNSResponder::_parsePacket(){
344
436
}
345
437
346
438
#ifdef MDNS_DEBUG_RX
347
- os_printf (" REQ: " );
348
- if (hostNameLen > 0 ) os_printf (" %s." , hostName);
349
- if (serviceNameLen > 0 ) os_printf (" _%s." , serviceName);
350
- if (protoNameLen > 0 ) os_printf (" _%s." , protoName);
351
- os_printf (" local. " );
352
-
353
- if (currentType == MDNS_TYPE_AAAA) os_printf (" AAAA " );
354
- else if (currentType == MDNS_TYPE_A) os_printf (" A " );
355
- else if (currentType == MDNS_TYPE_PTR) os_printf (" PTR " );
356
- else if (currentType == MDNS_TYPE_SRV) os_printf (" SRV " );
357
- else if (currentType == MDNS_TYPE_TXT) os_printf (" TXT " );
358
- else os_printf (" 0x%04X " , currentType);
359
-
360
- if (currentClass == MDNS_CLASS_IN) os_printf (" IN " );
361
- else if (currentClass == MDNS_CLASS_IN_FLUSH_CACHE) os_printf (" IN[F] " );
362
- else os_printf (" 0x%04X " , currentClass);
363
-
364
- os_printf (" \n " );
439
+ Serial. printf (" REQ: " );
440
+ if (hostNameLen > 0 ) Serial. printf (" %s." , hostName);
441
+ if (serviceNameLen > 0 ) Serial. printf (" _%s." , serviceName);
442
+ if (protoNameLen > 0 ) Serial. printf (" _%s." , protoName);
443
+ Serial. printf (" local. " );
444
+
445
+ if (currentType == MDNS_TYPE_AAAA) Serial. printf (" AAAA " );
446
+ else if (currentType == MDNS_TYPE_A) Serial. printf (" A " );
447
+ else if (currentType == MDNS_TYPE_PTR) Serial. printf (" PTR " );
448
+ else if (currentType == MDNS_TYPE_SRV) Serial. printf (" SRV " );
449
+ else if (currentType == MDNS_TYPE_TXT) Serial. printf (" TXT " );
450
+ else Serial. printf (" 0x%04X " , currentType);
451
+
452
+ if (currentClass == MDNS_CLASS_IN) Serial. printf (" IN " );
453
+ else if (currentClass == MDNS_CLASS_IN_FLUSH_CACHE) Serial. printf (" IN[F] " );
454
+ else Serial. printf (" 0x%04X " , currentClass);
455
+
456
+ Serial. printf (" \n " );
365
457
#endif
366
458
}
367
459
uint8_t responseMask = 0 ;
@@ -376,8 +468,20 @@ void MDNSResponder::_parsePacket(){
376
468
}
377
469
378
470
void MDNSResponder::enableArduino (uint16_t port, bool auth){
379
- _arduinoAuth = auth;
471
+
472
+ char boardName[64 ];
473
+ const char *boardExtra = " board=" ;
474
+ os_sprintf (boardName, " %s%s" , boardExtra, ARDUINO_BOARD);
475
+
476
+ char authUpload[16 ];
477
+ const char *authUploadExtra = " auth_upload=" ;
478
+ os_sprintf (authUpload, " %s%s" , authUploadExtra, (auth) ? " yes" :" no" );
479
+
380
480
addService (" arduino" , " tcp" , port);
481
+ addServiceTxt (" arduino" , " tcp" , " tcp_check=no" );
482
+ addServiceTxt (" arduino" , " tcp" , " ssh_upload=no" );
483
+ addServiceTxt (" arduino" , " tcp" , (const char *)boardName);
484
+ addServiceTxt (" arduino" , " tcp" , (const char *)authUpload);
381
485
}
382
486
383
487
void MDNSResponder::_reply (uint8_t replyMask, char * service, char *proto, uint16_t port){
@@ -477,7 +581,7 @@ void MDNSResponder::_reply(uint8_t replyMask, char * service, char *proto, uint1
477
581
_conn->append (reinterpret_cast <const char *>(&terminator), 1 ); // terminator
478
582
479
583
// Send the type, class, ttl and rdata length
480
- uint8_t txtDataLen = 0 ;
584
+ uint8_t txtDataLen = _getServiceTxtLen (service,proto) ;
481
585
uint8_t txtAttrs[10 ] = {
482
586
0x00 , 0x10 , // TXT record query
483
587
0x00 , 0x01 , // Class IN
@@ -487,7 +591,15 @@ void MDNSResponder::_reply(uint8_t replyMask, char * service, char *proto, uint1
487
591
_conn->append (reinterpret_cast <const char *>(txtAttrs), 10 );
488
592
489
593
// Send the RData
490
- // TODO - Build TXT Redords
594
+ MDNSTxt * txtPtr = _getServiceTxt (service,proto);
595
+ while (txtPtr !=0 ){
596
+ uint8_t txtLen = os_strlen (txtPtr->_txt );
597
+ _conn->append (reinterpret_cast <const char *>(&txtLen), 1 ); // lenght of txt
598
+ _conn->append (reinterpret_cast <const char *>(txtPtr->_txt ), txtLen); // the txt
599
+ // DEBUG Serial.print("We have txts: ");
600
+ // DEBUG Serial.println(txtPtr->_txt);
601
+ txtPtr = txtPtr->_next ;
602
+ }
491
603
}
492
604
493
605
0 commit comments