]> 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 8112e335819155546dedf7e5b27a00b14ad74de1..c8de69790f469edec6043da26c6e8926824fb5e9 100644 (file)
@@ -1,5 +1,5 @@
 /*\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
@@ -78,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
@@ -109,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
@@ -143,16 +155,14 @@ uint32_t ulIPAddress = pxNetworkBuffer->ulIPAddress;
                        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
@@ -240,13 +250,12 @@ BaseType_t xProcessReceivedUDPPacket( NetworkBufferDescriptor_t *pxNetworkBuffer
 {\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
@@ -271,7 +280,8 @@ UDPPacket_t *pxUDPPacket;
                                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
@@ -351,6 +361,19 @@ UDPPacket_t *pxUDPPacket;
                /* 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