]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/FreeRTOS_UDP_IP.c
Sync FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP with the version in GitHub at (23665258ca...
[freertos] / FreeRTOS-Plus / Source / FreeRTOS-Plus-TCP / FreeRTOS_UDP_IP.c
index c26d7a10013b6c06b62c5e33fff23c5972f36fff..c8de69790f469edec6043da26c6e8926824fb5e9 100644 (file)
@@ -1,5 +1,5 @@
 /*\r
- * FreeRTOS+TCP V2.0.1\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
  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
  *\r
- * http://www.FreeRTOS.org\r
  * http://aws.amazon.com/freertos\r
- *\r
- * 1 tab == 4 spaces!\r
+ * http://www.FreeRTOS.org\r
  */\r
 \r
 /* Standard includes. */\r
@@ -80,10 +78,22 @@ UDPPacket_t *pxUDPPacket;
 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
@@ -111,7 +121,7 @@ uint32_t ulIPAddress = pxNetworkBuffer->ulIPAddress;
 \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
@@ -130,31 +140,31 @@ uint32_t ulIPAddress = pxNetworkBuffer->ulIPAddress;
                        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
                        {\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
                        #if( ipconfigUSE_LLMNR == 1 )\r
@@ -176,7 +186,7 @@ uint32_t ulIPAddress = pxNetworkBuffer->ulIPAddress;
 \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
@@ -240,9 +250,13 @@ BaseType_t xProcessReceivedUDPPacket( NetworkBufferDescriptor_t *pxNetworkBuffer
 {\r
 BaseType_t xReturn = pdPASS;\r
 FreeRTOS_Socket_t *pxSocket;\r
+configASSERT(pxNetworkBuffer);\r
+configASSERT(pxNetworkBuffer->pucEthernetBuffer);\r
+\r
 \r
 UDPPacket_t *pxUDPPacket = (UDPPacket_t *) pxNetworkBuffer->pucEthernetBuffer;\r
 \r
+       /* Caller must check for minimum packet size. */\r
        pxSocket = pxUDPSocketLookup( usPort );\r
 \r
        if( pxSocket )\r
@@ -266,10 +280,11 @@ UDPPacket_t *pxUDPPacket = (UDPPacket_t *) pxNetworkBuffer->pucEthernetBuffer;
                                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
-                                       &xSourceAddress, &destinationAddress ) != pdFALSE )\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; /* 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
@@ -346,7 +361,7 @@ UDPPacket_t *pxUDPPacket = (UDPPacket_t *) pxNetworkBuffer->pucEthernetBuffer;
                /* 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
+               #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
@@ -360,7 +375,7 @@ UDPPacket_t *pxUDPPacket = (UDPPacket_t *) pxNetworkBuffer->pucEthernetBuffer;
                #endif\r
 \r
                #if( ipconfigUSE_LLMNR == 1 )\r
-                       /* A 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