Skip to content

Commit 3287009

Browse files
DNS local lookups using mDNS repaired (FreeRTOS#1118)
* DNS local lookups using mDNS or LLMNR * Fix unit tests * Add decriptions to new tests * Fix formatting * API changes * Add UTs for new API * Fix doxygen * Fix doxygen * Fix formatting --------- Co-authored-by: Tony Josi <[email protected]>
1 parent ba6ba81 commit 3287009

File tree

6 files changed

+244
-24
lines changed

6 files changed

+244
-24
lines changed

source/FreeRTOS_DNS.c

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1249,17 +1249,6 @@
12491249
/* Make sure all fields of the 'sockaddr' are cleared. */
12501250
( void ) memset( ( void * ) &xAddress, 0, sizeof( xAddress ) );
12511251

1252-
#if ( ipconfigUSE_IPv6 != 0 )
1253-
if( xFamily == ( BaseType_t ) FREERTOS_AF_INET6 )
1254-
{
1255-
xDNS_IP_Preference = xPreferenceIPv6;
1256-
}
1257-
else
1258-
{
1259-
xDNS_IP_Preference = xPreferenceIPv4;
1260-
}
1261-
#endif /* ( ipconfigUSE_IPv6 != 0 ) */
1262-
12631252
pxEndPoint = prvFillSockAddress( &xAddress, pcHostName );
12641253

12651254
if( pxEndPoint != NULL )
@@ -1648,6 +1637,42 @@
16481637

16491638
/*-----------------------------------------------------------*/
16501639

1640+
/**
1641+
* @brief Sets the DNS IP preference while doing DNS lookup to indicate the preference
1642+
* for a DNS server: either IPv4 or IPv6. Defaults to xPreferenceIPv4
1643+
* @param[in] eIPPreference IP preference, can be either xPreferenceIPv4 or
1644+
* xPreferenceIPv6
1645+
* @return pdPASS on success and pdFAIL on failure.
1646+
*/
1647+
BaseType_t FreeRTOS_SetDNSIPPreference( IPPreference_t eIPPreference )
1648+
{
1649+
BaseType_t xReturn = pdPASS;
1650+
1651+
switch( eIPPreference )
1652+
{
1653+
#if ( ipconfigUSE_IPv4 != 0 )
1654+
case xPreferenceIPv4:
1655+
xDNS_IP_Preference = xPreferenceIPv4;
1656+
break;
1657+
#endif
1658+
1659+
#if ( ipconfigUSE_IPv6 != 0 )
1660+
case xPreferenceIPv6:
1661+
xDNS_IP_Preference = xPreferenceIPv6;
1662+
break;
1663+
#endif
1664+
1665+
default:
1666+
xReturn = pdFAIL;
1667+
FreeRTOS_printf( ( "Invalid DNS IPPreference_t\n" ) );
1668+
break;
1669+
}
1670+
1671+
return xReturn;
1672+
}
1673+
1674+
/*-----------------------------------------------------------*/
1675+
16511676
#endif /* ipconfigUSE_DNS != 0 */
16521677

16531678
/*-----------------------------------------------------------*/

source/FreeRTOS_DNS_Parser.c

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -295,21 +295,52 @@
295295
{
296296
size_t uxBytesRead = 0U;
297297
size_t uxResult;
298+
BaseType_t xIsResponse = pdFALSE;
298299

299300
/* Start at the first byte after the header. */
300301
xSet.pucUDPPayloadBuffer = pucUDPPayloadBuffer;
302+
/* Skip 12-byte header. */
301303
xSet.pucByte = &( pucUDPPayloadBuffer[ sizeof( DNSMessage_t ) ] );
302304
xSet.uxSourceBytesRemaining -= sizeof( DNSMessage_t );
303305

304-
/* Skip any question records. */
306+
/* The number of questions supplied. */
305307
xSet.usQuestions = FreeRTOS_ntohs( xSet.pxDNSMessageHeader->usQuestions );
308+
/* The number of answer records. */
309+
xSet.usAnswers = FreeRTOS_ntohs( xSet.pxDNSMessageHeader->usAnswers );
306310

307-
if( xSet.usQuestions == 0U )
311+
if( ( xSet.pxDNSMessageHeader->usFlags & dnsRX_FLAGS_MASK ) == dnsEXPECTED_RX_FLAGS )
308312
{
309-
/* The IP-stack will only accept DNS replies that have a copy
310-
* of the questions. */
311-
xReturn = pdFALSE;
312-
break;
313+
xIsResponse = pdTRUE;
314+
315+
if( xSet.usAnswers == 0U )
316+
{
317+
/* This is a response that does not include answers. */
318+
xReturn = pdFALSE;
319+
break;
320+
}
321+
322+
if( xSet.usQuestions == 0U )
323+
{
324+
#if ( ( ipconfigUSE_LLMNR == 1 ) || ( ipconfigUSE_MDNS == 1 ) )
325+
{
326+
xSet.pcRequestedName = ( char * ) xSet.pucByte;
327+
}
328+
#endif
329+
330+
#if ( ipconfigUSE_DNS_CACHE == 1 ) || ( ipconfigDNS_USE_CALLBACKS == 1 )
331+
uxResult = DNS_ReadNameField( &xSet,
332+
sizeof( xSet.pcName ) );
333+
#endif
334+
}
335+
}
336+
else
337+
{
338+
if( xSet.usQuestions == 0U )
339+
{
340+
/* This is a query that does not include any question. */
341+
xReturn = pdFALSE;
342+
break;
343+
}
313344
}
314345

315346
for( x = 0U; x < xSet.usQuestions; x++ )
@@ -376,13 +407,9 @@
376407
break;
377408
}
378409

379-
/* Search through the answer records. */
380-
xSet.pxDNSMessageHeader->usAnswers =
381-
FreeRTOS_ntohs( xSet.pxDNSMessageHeader->usAnswers );
382-
383-
if( ( xSet.pxDNSMessageHeader->usFlags & dnsRX_FLAGS_MASK )
384-
== dnsEXPECTED_RX_FLAGS )
410+
if( xIsResponse == pdTRUE )
385411
{
412+
/* Search through the answer records. */
386413
ulIPAddress = parseDNSAnswer( &( xSet ), ppxAddressInfo, &uxBytesRead );
387414
}
388415

@@ -608,7 +635,7 @@
608635

609636
struct freertos_addrinfo * pxNewAddress = NULL;
610637

611-
for( x = 0U; x < pxSet->pxDNSMessageHeader->usAnswers; x++ )
638+
for( x = 0U; x < pxSet->usAnswers; x++ )
612639
{
613640
BaseType_t xDoAccept = pdFALSE;
614641

source/include/FreeRTOS_DNS.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,10 @@ BaseType_t FreeRTOS_getaddrinfo( const char * pcName, /* Th
154154
*/
155155
void FreeRTOS_freeaddrinfo( struct freertos_addrinfo * pxInfo );
156156

157+
/* Sets the DNS IP preference while doing DNS lookup to indicate the preference
158+
* for a DNS server: either IPv4 or IPv6. Defaults to xPreferenceIPv4 */
159+
BaseType_t FreeRTOS_SetDNSIPPreference( IPPreference_t eIPPreference );
160+
157161
#if ( ipconfigDNS_USE_CALLBACKS == 1 )
158162

159163
/*

source/include/FreeRTOS_DNS_Globals.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@
172172
{
173173
DNSMessage_t * pxDNSMessageHeader; /**< A pointer to the UDP payload buffer where the DNS message is stored. */
174174
uint16_t usQuestions; /**< The number of DNS questions that were asked. */
175+
uint16_t usAnswers; /**< The number of DNS answers that were given. */
175176
uint8_t * pucUDPPayloadBuffer; /**< A pointer to the original UDP load buffer. */
176177
uint8_t * pucByte; /**< A pointer that is used while parsing. */
177178
size_t uxBufferLength; /**< The total number of bytes received in the UDP payload. */

test/unit-test/FreeRTOS_DNS/FreeRTOS_DNS_utest.c

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1040,6 +1040,8 @@ void test_FreeRTOS_getaddrinfo_a_IPv6Random_BindFailWithDot( void )
10401040
struct xSOCKET xDNSSocket;
10411041
NetworkEndPoint_t xEndPoint[ 5 ];
10421042

1043+
xDNS_IP_Preference = xPreferenceIPv6;
1044+
10431045
memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
10441046
memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
10451047
memset( &xDNSSocket, 0, sizeof( struct xSOCKET ) );
@@ -1154,6 +1156,8 @@ void test_FreeRTOS_getaddrinfo_a_IPv6Random_BindFailWODot( void )
11541156
struct xSOCKET xDNSSocket;
11551157
NetworkEndPoint_t xEndPoint[ 2 ];
11561158

1159+
xDNS_IP_Preference = xPreferenceIPv6;
1160+
11571161
memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
11581162
memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
11591163
memset( &xDNSSocket, 0, sizeof( struct xSOCKET ) );
@@ -1237,6 +1241,8 @@ void test_FreeRTOS_getaddrinfo_a_IPv6Random_InvalidDNSServerIndex( void )
12371241
struct xSOCKET xDNSSocket;
12381242
NetworkEndPoint_t xEndPoint;
12391243

1244+
xDNS_IP_Preference = xPreferenceIPv6;
1245+
12401246
memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
12411247
memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
12421248
memset( &xDNSSocket, 0, sizeof( struct xSOCKET ) );
@@ -1323,6 +1329,8 @@ void test_FreeRTOS_getaddrinfo_a_IPv6Random_DNSReplySuccess( void )
13231329
struct xDNSBuffer xReceiveBuffer;
13241330
DNSMessage_t * pxDNSMessageHeader = NULL;
13251331

1332+
xDNS_IP_Preference = xPreferenceIPv6;
1333+
13261334
memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
13271335
memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
13281336
memset( &xExpectedAddress, 0, sizeof( struct freertos_addrinfo ) );
@@ -1407,6 +1415,8 @@ void test_FreeRTOS_getaddrinfo_a_IPv6Random_RetryExhaust( void )
14071415
DNSMessage_t * pxDNSMessageHeader = NULL;
14081416
int i;
14091417

1418+
xDNS_IP_Preference = xPreferenceIPv6;
1419+
14101420
memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
14111421
memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
14121422
memset( &xExpectedAddress, 0, sizeof( struct freertos_addrinfo ) );
@@ -1576,6 +1586,8 @@ void test_FreeRTOS_getaddrinfo_a_IPv6Random_LocalDNSSuccess( void )
15761586
DNSMessage_t * pxDNSMessageHeader = NULL;
15771587
int i;
15781588

1589+
xDNS_IP_Preference = xPreferenceIPv6;
1590+
15791591
memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
15801592
memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
15811593
memset( &xExpectedAddress, 0, sizeof( struct freertos_addrinfo ) );
@@ -1661,6 +1673,8 @@ void test_FreeRTOS_getaddrinfo_a_IPv4Random_LocalDNSUnknownPreference( void )
16611673
DNSMessage_t * pxDNSMessageHeader = NULL;
16621674
int i;
16631675

1676+
xDNS_IP_Preference = xPreferenceIPv6;
1677+
16641678
memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
16651679
memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
16661680
memset( &xExpectedAddress, 0, sizeof( struct freertos_addrinfo ) );
@@ -1732,6 +1746,8 @@ void test_FreeRTOS_getaddrinfo_a_IPv6Random_LLMNRDNSSuccess( void )
17321746
DNSMessage_t * pxDNSMessageHeader = NULL;
17331747
int i;
17341748

1749+
xDNS_IP_Preference = xPreferenceIPv6;
1750+
17351751
memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
17361752
memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
17371753
memset( &xExpectedAddress, 0, sizeof( struct freertos_addrinfo ) );
@@ -2025,6 +2041,8 @@ void test_FreeRTOS_getaddrinfo_a_IPv6Random_LLMNRFail( void )
20252041
DNSMessage_t * pxDNSMessageHeader = NULL;
20262042
int i;
20272043

2044+
xDNS_IP_Preference = xPreferenceIPv6;
2045+
20282046
memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
20292047
memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
20302048
memset( &xExpectedAddress, 0, sizeof( struct freertos_addrinfo ) );
@@ -2125,6 +2143,8 @@ void test_FreeRTOS_getaddrinfo_a_IPv4Random_PortSpecified( void )
21252143
DNSMessage_t * pxDNSMessageHeader = NULL;
21262144
uint16_t usExpectPort = 0x1234;
21272145

2146+
xDNS_IP_Preference = xPreferenceIPv6;
2147+
21282148
memset( &xAddress, 0, sizeof( struct freertos_addrinfo ) );
21292149
memset( &xHint, 0, sizeof( struct freertos_addrinfo ) );
21302150
memset( &xExpectedAddress, 0, sizeof( struct freertos_addrinfo ) );
@@ -2224,3 +2244,38 @@ void test_FreeRTOS_freeaddrinfo_NullInput( void )
22242244
{
22252245
FreeRTOS_freeaddrinfo( NULL );
22262246
}
2247+
2248+
/**
2249+
* @brief Preference is IPv6
2250+
*/
2251+
void test_FreeRTOS_SetDNSIPPreference_IPv4( void )
2252+
{
2253+
BaseType_t xReturn;
2254+
2255+
xReturn = FreeRTOS_SetDNSIPPreference( xPreferenceIPv4 );
2256+
TEST_ASSERT_EQUAL( pdPASS, xReturn );
2257+
TEST_ASSERT_EQUAL( xPreferenceIPv4, xDNS_IP_Preference );
2258+
}
2259+
2260+
/**
2261+
* @brief Preference is IPv6
2262+
*/
2263+
void test_FreeRTOS_SetDNSIPPreference_IPv6( void )
2264+
{
2265+
BaseType_t xReturn;
2266+
2267+
xReturn = FreeRTOS_SetDNSIPPreference( xPreferenceIPv6 );
2268+
TEST_ASSERT_EQUAL( pdPASS, xReturn );
2269+
TEST_ASSERT_EQUAL( xPreferenceIPv6, xDNS_IP_Preference );
2270+
}
2271+
2272+
/**
2273+
* @brief Preference is None
2274+
*/
2275+
void test_FreeRTOS_SetDNSIPPreference_None( void )
2276+
{
2277+
BaseType_t xReturn;
2278+
2279+
xReturn = FreeRTOS_SetDNSIPPreference( xPreferenceNone );
2280+
TEST_ASSERT_EQUAL( pdFAIL, xReturn );
2281+
}

0 commit comments

Comments
 (0)