/*\r
- * FreeRTOS+TCP V2.0.3\r
+ * FreeRTOS+TCP V2.0.7\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
and\r
xIPHeader.usHeaderChecksum\r
*/\r
-\r
/* Save options now, as they will be overwritten by memcpy */\r
#if( ipconfigDRIVER_INCLUDED_TX_IP_CHECKSUM == 0 )\r
- {\r
ucSocketOptions = pxNetworkBuffer->pucEthernetBuffer[ ipSOCKET_OPTIONS_OFFSET ];\r
- }\r
#endif\r
-\r
- memcpy( ( void *) &( pxUDPPacket->xEthernetHeader.xSourceAddress ), ( void * ) xDefaultPartUDPPacketHeader.ucBytes, sizeof( xDefaultPartUDPPacketHeader ) );\r
+ /*\r
+ * Offset the memcpy by the size of a MAC address to start at the packet's\r
+ * Ethernet header 'source' MAC address; the preceding 'destination' should not be altered.\r
+ */\r
+ char *pxUdpSrcAddrOffset = ( char *) pxUDPPacket + sizeof( MACAddress_t );\r
+ memcpy( pxUdpSrcAddrOffset, xDefaultPartUDPPacketHeader.ucBytes, sizeof( xDefaultPartUDPPacketHeader ) );\r
\r
#if ipconfigSUPPORT_OUTGOING_PINGS == 1\r
if( pxNetworkBuffer->usPort == ipPACKET_CONTAINS_ICMP_DATA )\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
#if( ipconfigUSE_LLMNR == 1 )\r
\r
if( ( ucSocketOptions & ( uint8_t ) FREERTOS_SO_UDPCKSUM_OUT ) != 0u )\r
{\r
- usGenerateProtocolChecksum( (uint8_t*)pxUDPPacket, pdTRUE );\r
+ usGenerateProtocolChecksum( (uint8_t*)pxUDPPacket, pxNetworkBuffer->xDataLength, pdTRUE );\r
}\r
else\r
{\r
\r
UDPPacket_t *pxUDPPacket = (UDPPacket_t *) pxNetworkBuffer->pucEthernetBuffer;\r
\r
- pxSocket = pxUDPSocketLookup( usPort );\r
+ /* Caller must check for minimum packet size. */\r
+ pxSocket = pxUDPSocketLookup( usPort );\r
\r
if( pxSocket )\r
{\r
destinationAddress.sin_addr = pxUDPPacket->xIPHeader.ulDestinationIPAddress;\r
\r
if( xHandler( ( Socket_t * ) pxSocket, ( void* ) pcData, ( size_t ) pxNetworkBuffer->xDataLength,\r
- &xSourceAddress, &destinationAddress ) != pdFALSE )\r
+ &xSourceAddress, &destinationAddress ) )\r
{\r
- xReturn = pdFAIL; /* xHandler has consumed the data, do not add it to .xWaitingPacketsList'. */\r
+ xReturn = pdFAIL; /* FAIL means that we did not consume or release the buffer */\r
}\r
}\r
}\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 )\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
- /* An LLMNR request, check for the destination port. */\r
+ /* a LLMNR request, check for the destination port. */\r
if( ( usPort == FreeRTOS_ntohs( ipLLMNR_PORT ) ) ||\r
( pxUDPPacket->xUDPHeader.usSourcePort == FreeRTOS_ntohs( ipLLMNR_PORT ) ) )\r
{\r