/*\r
- * FreeRTOS+TCP V2.0.11\r
+ * FreeRTOS+TCP V2.2.0\r
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.\r
*\r
* Permission is hereby granted, free of charge, to any person obtaining a copy of\r
IPHeader_t *pxIPHeader;\r
eARPLookupResult_t eReturned;\r
uint32_t ulIPAddress = pxNetworkBuffer->ulIPAddress;\r
+size_t uxPayloadSize;\r
\r
/* Map the UDP packet onto the start of the frame. */\r
pxUDPPacket = ( UDPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;\r
\r
+#if ipconfigSUPPORT_OUTGOING_PINGS == 1\r
+ if( pxNetworkBuffer->usPort == ipPACKET_CONTAINS_ICMP_DATA )\r
+ {\r
+ uxPayloadSize = pxNetworkBuffer->xDataLength - sizeof( ICMPPacket_t );\r
+ }\r
+ else\r
+#endif\r
+ {\r
+ uxPayloadSize = pxNetworkBuffer->xDataLength - sizeof( UDPPacket_t );\r
+ }\r
+\r
/* Determine the ARP cache status for the requested IP address. */\r
eReturned = eARPGetCacheEntry( &( ulIPAddress ), &( pxUDPPacket->xEthernetHeader.xDestinationAddress ) );\r
\r
\r
pxUDPHeader->usDestinationPort = pxNetworkBuffer->usPort;\r
pxUDPHeader->usSourcePort = pxNetworkBuffer->usBoundPort;\r
- pxUDPHeader->usLength = ( uint16_t ) ( pxNetworkBuffer->xDataLength + sizeof( UDPHeader_t ) );\r
+ pxUDPHeader->usLength = ( uint16_t ) ( uxPayloadSize + sizeof( UDPHeader_t ) );\r
pxUDPHeader->usLength = FreeRTOS_htons( pxUDPHeader->usLength );\r
pxUDPHeader->usChecksum = 0u;\r
}\r
if( pxNetworkBuffer->usPort == ipPACKET_CONTAINS_ICMP_DATA )\r
{\r
pxIPHeader->ucProtocol = ipPROTOCOL_ICMP;\r
- pxIPHeader->usLength = ( uint16_t ) ( pxNetworkBuffer->xDataLength + sizeof( IPHeader_t ) );\r
+ pxIPHeader->usLength = ( uint16_t ) ( uxPayloadSize + sizeof( IPHeader_t ) + sizeof( ICMPHeader_t ) );\r
}\r
else\r
#endif /* ipconfigSUPPORT_OUTGOING_PINGS */\r
{\r
- pxIPHeader->usLength = ( uint16_t ) ( pxNetworkBuffer->xDataLength + sizeof( IPHeader_t ) + sizeof( UDPHeader_t ) );\r
+ pxIPHeader->usLength = ( uint16_t ) ( uxPayloadSize + sizeof( IPHeader_t ) + sizeof( UDPHeader_t ) );\r
}\r
\r
- /* The total transmit size adds on the Ethernet header. */\r
- pxNetworkBuffer->xDataLength = pxIPHeader->usLength + sizeof( EthernetHeader_t );\r
pxIPHeader->usLength = FreeRTOS_htons( pxIPHeader->usLength );\r
/* HT:endian: changed back to network endian */\r
pxIPHeader->ulDestinationIPAddress = pxNetworkBuffer->ulIPAddress;\r
{\r
BaseType_t xReturn = pdPASS;\r
FreeRTOS_Socket_t *pxSocket;\r
-UDPPacket_t *pxUDPPacket;\r
+configASSERT(pxNetworkBuffer);\r
+configASSERT(pxNetworkBuffer->pucEthernetBuffer);\r
\r
- configASSERT( pxNetworkBuffer );\r
- configASSERT( pxNetworkBuffer->pucEthernetBuffer );\r
\r
- pxUDPPacket = ( UDPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;\r
- \r
+UDPPacket_t *pxUDPPacket = (UDPPacket_t *) pxNetworkBuffer->pucEthernetBuffer;\r
+\r
/* Caller must check for minimum packet size. */\r
pxSocket = pxUDPSocketLookup( usPort );\r
\r
destinationAddress.sin_port = usPort;\r
destinationAddress.sin_addr = pxUDPPacket->xIPHeader.ulDestinationIPAddress;\r
\r
- if( xHandler( ( Socket_t * ) pxSocket, ( void* ) pcData, ( size_t ) pxNetworkBuffer->xDataLength,\r
+ /* The value of 'xDataLength' was proven to be at least the size of a UDP packet in prvProcessIPPacket(). */\r
+ if( xHandler( ( Socket_t ) pxSocket, ( void* ) pcData, ( size_t ) ( pxNetworkBuffer->xDataLength - ipUDP_PAYLOAD_OFFSET_IPv4 ),\r
&xSourceAddress, &destinationAddress ) )\r
{\r
xReturn = pdFAIL; /* FAIL means that we did not consume or release the buffer */\r
/* There is no socket listening to the target port, but still it might\r
be for this node. */\r
\r
+ #if( ipconfigUSE_DNS == 1 ) && ( ipconfigDNS_USE_CALLBACKS == 1 )\r
+ /* A DNS reply, check for the source port. Although the DNS client\r
+ does open a UDP socket to send a messages, this socket will be\r
+ closed after a short timeout. Messages that come late (after the\r
+ socket is closed) will be treated here. */\r
+ if( FreeRTOS_ntohs( pxUDPPacket->xUDPHeader.usSourcePort ) == ipDNS_PORT )\r
+ {\r
+ vARPRefreshCacheEntry( &( pxUDPPacket->xEthernetHeader.xSourceAddress ), pxUDPPacket->xIPHeader.ulSourceIPAddress );\r
+ xReturn = ( BaseType_t )ulDNSHandlePacket( pxNetworkBuffer );\r
+ }\r
+ else\r
+ #endif\r
+\r
#if( ipconfigUSE_LLMNR == 1 )\r
/* a LLMNR request, check for the destination port. */\r
if( ( usPort == FreeRTOS_ntohs( ipLLMNR_PORT ) ) ||\r