]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS-Plus/Source/FreeRTOS-Plus-TCP/FreeRTOS_UDP_IP.c
Fix some build issues in older kernel demo projects.
[freertos] / FreeRTOS-Plus / Source / FreeRTOS-Plus-TCP / FreeRTOS_UDP_IP.c
index 8262a51046dd582a08e8aa6f6a5019b32e00fee7..94a8e17f84ccda5e4d6f627d7331d8f6ee39e473 100644 (file)
@@ -1,5 +1,5 @@
 /*\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
@@ -128,15 +128,16 @@ 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
@@ -153,6 +154,7 @@ uint32_t ulIPAddress = pxNetworkBuffer->ulIPAddress;
                        /* 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
@@ -174,7 +176,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
@@ -241,7 +243,8 @@ FreeRTOS_Socket_t *pxSocket;
 \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
@@ -265,9 +268,9 @@ UDPPacket_t *pxUDPPacket = (UDPPacket_t *) pxNetworkBuffer->pucEthernetBuffer;
                                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
@@ -344,21 +347,8 @@ 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
-                       /* 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