From 6f90d45684206e5dfca3c4554a14a5784da49d92 Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Tue, 26 Jun 2012 18:53:30 +0000
Subject: [PATCH] Fix accidental struct copies on the stack in the old
 RNDISEthernet demo TCP code.

---
 .../ClassDriver/RNDISEthernet/Lib/TCP.c       | 74 +++++++++----------
 .../ClassDriver/RNDISEthernet/Lib/TCP.h       | 10 +--
 Demos/Device/LowLevel/RNDISEthernet/Lib/TCP.c | 72 +++++++++---------
 Demos/Device/LowLevel/RNDISEthernet/Lib/TCP.h | 10 +--
 4 files changed, 83 insertions(+), 83 deletions(-)

diff --git a/Demos/Device/ClassDriver/RNDISEthernet/Lib/TCP.c b/Demos/Device/ClassDriver/RNDISEthernet/Lib/TCP.c
index ca555caa5..ad79736f1 100644
--- a/Demos/Device/ClassDriver/RNDISEthernet/Lib/TCP.c
+++ b/Demos/Device/ClassDriver/RNDISEthernet/Lib/TCP.c
@@ -112,8 +112,8 @@ void TCP_TCPTask(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo,
 
 			ConnectionStateTable[CSTableEntry].Info.SequenceNumberOut += PacketSize;
 
-			TCPHeaderOUT->Checksum             = TCP_Checksum16(TCPHeaderOUT, ServerIPAddress,
-			                                                    ConnectionStateTable[CSTableEntry].RemoteAddress,
+			TCPHeaderOUT->Checksum             = TCP_Checksum16(TCPHeaderOUT, &ServerIPAddress,
+			                                                    &ConnectionStateTable[CSTableEntry].RemoteAddress,
 			                                                    (sizeof(TCP_Header_t) + PacketSize));
 
 			PacketSize += sizeof(TCP_Header_t);
@@ -250,7 +250,7 @@ uint8_t TCP_GetPortState(const uint16_t Port)
  *  \return Boolean true if the connection was updated or created, false otherwise (no more space in the connection state table)
  */
 bool TCP_SetConnectionState(const uint16_t Port,
-                            const IP_Address_t RemoteAddress,
+                            const IP_Address_t* RemoteAddress,
                             const uint16_t RemotePort,
                             const uint8_t State)
 {
@@ -260,7 +260,7 @@ bool TCP_SetConnectionState(const uint16_t Port,
 	{
 		/* Find port entry in the table */
 		if ((ConnectionStateTable[CSTableEntry].Port == Port) &&
-		     IP_COMPARE(&ConnectionStateTable[CSTableEntry].RemoteAddress, &RemoteAddress) &&
+		     IP_COMPARE(&ConnectionStateTable[CSTableEntry].RemoteAddress, RemoteAddress) &&
 			 ConnectionStateTable[CSTableEntry].RemotePort == RemotePort)
 		{
 			ConnectionStateTable[CSTableEntry].State = State;
@@ -274,7 +274,7 @@ bool TCP_SetConnectionState(const uint16_t Port,
 		if (ConnectionStateTable[CSTableEntry].State == TCP_Connection_Closed)
 		{
 			ConnectionStateTable[CSTableEntry].Port          = Port;
-			ConnectionStateTable[CSTableEntry].RemoteAddress = RemoteAddress;
+			ConnectionStateTable[CSTableEntry].RemoteAddress = *RemoteAddress;
 			ConnectionStateTable[CSTableEntry].RemotePort    = RemotePort;
 			ConnectionStateTable[CSTableEntry].State         = State;
 			return true;
@@ -293,7 +293,7 @@ bool TCP_SetConnectionState(const uint16_t Port,
  *  \return A value from the \ref TCP_ConnectionStates_t enum
  */
 uint8_t TCP_GetConnectionState(const uint16_t Port,
-                               const IP_Address_t RemoteAddress,
+                               const IP_Address_t* RemoteAddress,
                                const uint16_t RemotePort)
 {
 	/* Note, Port number should be specified in BIG endian to simplify network code */
@@ -302,7 +302,7 @@ uint8_t TCP_GetConnectionState(const uint16_t Port,
 	{
 		/* Find port entry in the table */
 		if ((ConnectionStateTable[CSTableEntry].Port == Port) &&
-		     IP_COMPARE(&ConnectionStateTable[CSTableEntry].RemoteAddress, &RemoteAddress) &&
+		     IP_COMPARE(&ConnectionStateTable[CSTableEntry].RemoteAddress, RemoteAddress) &&
 			 ConnectionStateTable[CSTableEntry].RemotePort == RemotePort)
 
 		{
@@ -322,7 +322,7 @@ uint8_t TCP_GetConnectionState(const uint16_t Port,
  *  \return ConnectionInfo structure of the connection if found, NULL otherwise
  */
 TCP_ConnectionInfo_t* TCP_GetConnectionInfo(const uint16_t Port,
-                                            const IP_Address_t RemoteAddress,
+                                            const IP_Address_t* RemoteAddress,
                                             const uint16_t RemotePort)
 {
 	/* Note, Port number should be specified in BIG endian to simplify network code */
@@ -331,7 +331,7 @@ TCP_ConnectionInfo_t* TCP_GetConnectionInfo(const uint16_t Port,
 	{
 		/* Find port entry in the table */
 		if ((ConnectionStateTable[CSTableEntry].Port == Port) &&
-		     IP_COMPARE(&ConnectionStateTable[CSTableEntry].RemoteAddress, &RemoteAddress) &&
+		     IP_COMPARE(&ConnectionStateTable[CSTableEntry].RemoteAddress, RemoteAddress) &&
 			 ConnectionStateTable[CSTableEntry].RemotePort == RemotePort)
 		{
 			return &ConnectionStateTable[CSTableEntry].Info;
@@ -371,12 +371,12 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart,
 	{
 		/* Detect SYN from host to start a connection */
 		if (TCPHeaderIN->Flags & TCP_FLAG_SYN)
-		  TCP_SetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress, TCPHeaderIN->SourcePort, TCP_Connection_Listen);
+		  TCP_SetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress, TCPHeaderIN->SourcePort, TCP_Connection_Listen);
 
 		/* Detect RST from host to abort existing connection */
 		if (TCPHeaderIN->Flags & TCP_FLAG_RST)
 		{
-			if (TCP_SetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+			if (TCP_SetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 			                           TCPHeaderIN->SourcePort, TCP_Connection_Closed))
 			{
 				TCPHeaderOUT->Flags = (TCP_FLAG_RST | TCP_FLAG_ACK);
@@ -386,18 +386,18 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart,
 		else
 		{
 			/* Process the incoming TCP packet based on the current connection state for the sender and port */
-			switch (TCP_GetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress, TCPHeaderIN->SourcePort))
+			switch (TCP_GetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress, TCPHeaderIN->SourcePort))
 			{
 				case TCP_Connection_Listen:
 					if (TCPHeaderIN->Flags == TCP_FLAG_SYN)
 					{
 						/* SYN connection starts a connection with a peer */
-						if (TCP_SetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+						if (TCP_SetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 						                           TCPHeaderIN->SourcePort, TCP_Connection_SYNReceived))
 						{
 							TCPHeaderOUT->Flags = (TCP_FLAG_SYN | TCP_FLAG_ACK);
 
-							ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress, TCPHeaderIN->SourcePort);
+							ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress, TCPHeaderIN->SourcePort);
 
 							ConnectionInfo->SequenceNumberIn  = (SwapEndian_32(TCPHeaderIN->SequenceNumber) + 1);
 							ConnectionInfo->SequenceNumberOut = 0;
@@ -417,10 +417,10 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart,
 					{
 						/* ACK during the connection process completes the connection to a peer */
 
-						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 											   TCPHeaderIN->SourcePort, TCP_Connection_Established);
 
-						ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+						ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 															   TCPHeaderIN->SourcePort);
 
 						ConnectionInfo->SequenceNumberOut++;
@@ -435,10 +435,10 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart,
 						TCPHeaderOUT->Flags = (TCP_FLAG_FIN | TCP_FLAG_ACK);
 						PacketResponse      = true;
 
-						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 											   TCPHeaderIN->SourcePort, TCP_Connection_CloseWait);
 
-						ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+						ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 															   TCPHeaderIN->SourcePort);
 
 						ConnectionInfo->SequenceNumberIn++;
@@ -446,7 +446,7 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart,
 					}
 					else if ((TCPHeaderIN->Flags == TCP_FLAG_ACK) || (TCPHeaderIN->Flags == (TCP_FLAG_ACK | TCP_FLAG_PSH)))
 					{
-						ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+						ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 															   TCPHeaderIN->SourcePort);
 
 						/* Check if the buffer is currently in use either by a buffered data to send, or receive */
@@ -492,7 +492,7 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart,
 
 					break;
 				case TCP_Connection_Closing:
-						ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+						ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 															   TCPHeaderIN->SourcePort);
 
 						TCPHeaderOUT->Flags = (TCP_FLAG_ACK | TCP_FLAG_FIN);
@@ -500,14 +500,14 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart,
 
 						ConnectionInfo->Buffer.InUse = false;
 
-						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 											   TCPHeaderIN->SourcePort, TCP_Connection_FINWait1);
 
 					break;
 				case TCP_Connection_FINWait1:
 					if (TCPHeaderIN->Flags == (TCP_FLAG_FIN | TCP_FLAG_ACK))
 					{
-						ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+						ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 															   TCPHeaderIN->SourcePort);
 
 						TCPHeaderOUT->Flags = TCP_FLAG_ACK;
@@ -516,12 +516,12 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart,
 						ConnectionInfo->SequenceNumberIn++;
 						ConnectionInfo->SequenceNumberOut++;
 
-						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 											   TCPHeaderIN->SourcePort, TCP_Connection_Closed);
 					}
 					else if (TCPHeaderIN->Flags == TCP_FLAG_ACK)
 					{
-						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 											   TCPHeaderIN->SourcePort, TCP_Connection_FINWait2);
 					}
 
@@ -529,7 +529,7 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart,
 				case TCP_Connection_FINWait2:
 					if (TCPHeaderIN->Flags == (TCP_FLAG_FIN | TCP_FLAG_ACK))
 					{
-						ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+						ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 															   TCPHeaderIN->SourcePort);
 
 						TCPHeaderOUT->Flags = TCP_FLAG_ACK;
@@ -538,7 +538,7 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart,
 						ConnectionInfo->SequenceNumberIn++;
 						ConnectionInfo->SequenceNumberOut++;
 
-						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 											   TCPHeaderIN->SourcePort, TCP_Connection_Closed);
 					}
 
@@ -546,7 +546,7 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart,
 				case TCP_Connection_CloseWait:
 					if (TCPHeaderIN->Flags == TCP_FLAG_ACK)
 					{
-						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 											   TCPHeaderIN->SourcePort, TCP_Connection_Closed);
 					}
 
@@ -564,7 +564,7 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart,
 	/* Check if we need to respond to the sent packet */
 	if (PacketResponse)
 	{
-		ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+		ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 		                                       TCPHeaderIN->SourcePort);
 
 		TCPHeaderOUT->SourcePort           = TCPHeaderIN->DestinationPort;
@@ -582,8 +582,8 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart,
 		TCPHeaderOUT->Checksum             = 0;
 		TCPHeaderOUT->Reserved             = 0;
 
-		TCPHeaderOUT->Checksum             = TCP_Checksum16(TCPHeaderOUT, IPHeaderIN->DestinationAddress,
-		                                                    IPHeaderIN->SourceAddress, sizeof(TCP_Header_t));
+		TCPHeaderOUT->Checksum             = TCP_Checksum16(TCPHeaderOUT, &IPHeaderIN->DestinationAddress,
+		                                                    &IPHeaderIN->SourceAddress, sizeof(TCP_Header_t));
 
 		return sizeof(TCP_Header_t);
 	}
@@ -602,19 +602,19 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart,
  *  \return A 16-bit TCP checksum value
  */
 static uint16_t TCP_Checksum16(void* TCPHeaderOutStart,
-                               const IP_Address_t SourceAddress,
-                               const IP_Address_t DestinationAddress,
-                               const uint16_t TCPOutSize)
+                               const IP_Address_t* SourceAddress,
+                               const IP_Address_t* DestinationAddress,
+                               uint16_t TCPOutSize)
 {
 	uint32_t Checksum = 0;
 
 	/* TCP/IP checksums are the addition of the one's compliment of each word including the IP pseudo-header,
 	   complimented */
 
-	Checksum += ((uint16_t*)&SourceAddress)[0];
-	Checksum += ((uint16_t*)&SourceAddress)[1];
-	Checksum += ((uint16_t*)&DestinationAddress)[0];
-	Checksum += ((uint16_t*)&DestinationAddress)[1];
+	Checksum += ((uint16_t*)SourceAddress)[0];
+	Checksum += ((uint16_t*)SourceAddress)[1];
+	Checksum += ((uint16_t*)DestinationAddress)[0];
+	Checksum += ((uint16_t*)DestinationAddress)[1];
 	Checksum += SwapEndian_16(PROTOCOL_TCP);
 	Checksum += SwapEndian_16(TCPOutSize);
 
diff --git a/Demos/Device/ClassDriver/RNDISEthernet/Lib/TCP.h b/Demos/Device/ClassDriver/RNDISEthernet/Lib/TCP.h
index f27db1526..d8122707c 100644
--- a/Demos/Device/ClassDriver/RNDISEthernet/Lib/TCP.h
+++ b/Demos/Device/ClassDriver/RNDISEthernet/Lib/TCP.h
@@ -236,14 +236,14 @@
 		                                       void (*Handler)(TCP_ConnectionState_t*, TCP_ConnectionBuffer_t*));
 		uint8_t               TCP_GetPortState(const uint16_t Port);
 		bool                  TCP_SetConnectionState(const uint16_t Port,
-		                                             const IP_Address_t RemoteAddress,
+		                                             const IP_Address_t* RemoteAddress,
 		                                             const uint16_t RemotePort,
 		                                             const uint8_t State);
 		uint8_t               TCP_GetConnectionState(const uint16_t Port,
-		                                             const IP_Address_t RemoteAddress,
+		                                             const IP_Address_t* RemoteAddress,
 		                                             const uint16_t RemotePort);
 		TCP_ConnectionInfo_t* TCP_GetConnectionInfo(const uint16_t Port,
-		                                            const IP_Address_t RemoteAddress,
+		                                            const IP_Address_t* RemoteAddress,
 		                                            const uint16_t RemotePort);
 		int16_t               TCP_ProcessTCPPacket(void* IPHeaderInStart,
 		                                           void* TCPHeaderInStart,
@@ -251,8 +251,8 @@
 
 		#if defined(INCLUDE_FROM_TCP_C)
 			static uint16_t TCP_Checksum16(void* TCPHeaderOutStart,
-			                               const IP_Address_t SourceAddress,
-										   const IP_Address_t DestinationAddress,
+			                               const IP_Address_t* SourceAddress,
+			                               const IP_Address_t* DestinationAddress,
 			                               uint16_t TCPOutSize);
 		#endif
 
diff --git a/Demos/Device/LowLevel/RNDISEthernet/Lib/TCP.c b/Demos/Device/LowLevel/RNDISEthernet/Lib/TCP.c
index 374a102bf..2e40cf54d 100644
--- a/Demos/Device/LowLevel/RNDISEthernet/Lib/TCP.c
+++ b/Demos/Device/LowLevel/RNDISEthernet/Lib/TCP.c
@@ -111,8 +111,8 @@ void TCP_Task(void)
 
 			ConnectionStateTable[CSTableEntry].Info.SequenceNumberOut += PacketSize;
 
-			TCPHeaderOUT->Checksum             = TCP_Checksum16(TCPHeaderOUT, ServerIPAddress,
-			                                                    ConnectionStateTable[CSTableEntry].RemoteAddress,
+			TCPHeaderOUT->Checksum             = TCP_Checksum16(TCPHeaderOUT, &ServerIPAddress,
+			                                                    &ConnectionStateTable[CSTableEntry].RemoteAddress,
 			                                                    (sizeof(TCP_Header_t) + PacketSize));
 
 			PacketSize += sizeof(TCP_Header_t);
@@ -249,7 +249,7 @@ uint8_t TCP_GetPortState(const uint16_t Port)
  *  \return Boolean true if the connection was updated or created, false otherwise (no more space in the connection state table)
  */
 bool TCP_SetConnectionState(const uint16_t Port,
-                            const IP_Address_t RemoteAddress,
+                            const IP_Address_t* RemoteAddress,
                             const uint16_t RemotePort,
                             const uint8_t State)
 {
@@ -259,7 +259,7 @@ bool TCP_SetConnectionState(const uint16_t Port,
 	{
 		/* Find port entry in the table */
 		if ((ConnectionStateTable[CSTableEntry].Port == Port) &&
-		     IP_COMPARE(&ConnectionStateTable[CSTableEntry].RemoteAddress, &RemoteAddress) &&
+		     IP_COMPARE(&ConnectionStateTable[CSTableEntry].RemoteAddress, RemoteAddress) &&
 			 ConnectionStateTable[CSTableEntry].RemotePort == RemotePort)
 		{
 			ConnectionStateTable[CSTableEntry].State = State;
@@ -273,7 +273,7 @@ bool TCP_SetConnectionState(const uint16_t Port,
 		if (ConnectionStateTable[CSTableEntry].State == TCP_Connection_Closed)
 		{
 			ConnectionStateTable[CSTableEntry].Port          = Port;
-			ConnectionStateTable[CSTableEntry].RemoteAddress = RemoteAddress;
+			ConnectionStateTable[CSTableEntry].RemoteAddress = *RemoteAddress;
 			ConnectionStateTable[CSTableEntry].RemotePort    = RemotePort;
 			ConnectionStateTable[CSTableEntry].State         = State;
 			return true;
@@ -292,7 +292,7 @@ bool TCP_SetConnectionState(const uint16_t Port,
  *  \return A value from the \ref TCP_ConnectionStates_t enum
  */
 uint8_t TCP_GetConnectionState(const uint16_t Port,
-                               const IP_Address_t RemoteAddress,
+                               const IP_Address_t* RemoteAddress,
                                const uint16_t RemotePort)
 {
 	/* Note, Port number should be specified in BIG endian to simplify network code */
@@ -301,7 +301,7 @@ uint8_t TCP_GetConnectionState(const uint16_t Port,
 	{
 		/* Find port entry in the table */
 		if ((ConnectionStateTable[CSTableEntry].Port == Port) &&
-		     IP_COMPARE(&ConnectionStateTable[CSTableEntry].RemoteAddress, &RemoteAddress) &&
+		     IP_COMPARE(&ConnectionStateTable[CSTableEntry].RemoteAddress, RemoteAddress) &&
 			 ConnectionStateTable[CSTableEntry].RemotePort == RemotePort)
 
 		{
@@ -321,7 +321,7 @@ uint8_t TCP_GetConnectionState(const uint16_t Port,
  *  \return ConnectionInfo structure of the connection if found, NULL otherwise
  */
 TCP_ConnectionInfo_t* TCP_GetConnectionInfo(const uint16_t Port,
-                                            const IP_Address_t RemoteAddress,
+                                            const IP_Address_t* RemoteAddress,
                                             const uint16_t RemotePort)
 {
 	/* Note, Port number should be specified in BIG endian to simplify network code */
@@ -330,7 +330,7 @@ TCP_ConnectionInfo_t* TCP_GetConnectionInfo(const uint16_t Port,
 	{
 		/* Find port entry in the table */
 		if ((ConnectionStateTable[CSTableEntry].Port == Port) &&
-		     IP_COMPARE(&ConnectionStateTable[CSTableEntry].RemoteAddress, &RemoteAddress) &&
+		     IP_COMPARE(&ConnectionStateTable[CSTableEntry].RemoteAddress, RemoteAddress) &&
 			 ConnectionStateTable[CSTableEntry].RemotePort == RemotePort)
 		{
 			return &ConnectionStateTable[CSTableEntry].Info;
@@ -370,12 +370,12 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart,
 	{
 		/* Detect SYN from host to start a connection */
 		if (TCPHeaderIN->Flags & TCP_FLAG_SYN)
-		  TCP_SetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress, TCPHeaderIN->SourcePort, TCP_Connection_Listen);
+		  TCP_SetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress, TCPHeaderIN->SourcePort, TCP_Connection_Listen);
 
 		/* Detect RST from host to abort existing connection */
 		if (TCPHeaderIN->Flags & TCP_FLAG_RST)
 		{
-			if (TCP_SetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+			if (TCP_SetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 			                           TCPHeaderIN->SourcePort, TCP_Connection_Closed))
 			{
 				TCPHeaderOUT->Flags = (TCP_FLAG_RST | TCP_FLAG_ACK);
@@ -385,18 +385,18 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart,
 		else
 		{
 			/* Process the incoming TCP packet based on the current connection state for the sender and port */
-			switch (TCP_GetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress, TCPHeaderIN->SourcePort))
+			switch (TCP_GetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress, TCPHeaderIN->SourcePort))
 			{
 				case TCP_Connection_Listen:
 					if (TCPHeaderIN->Flags == TCP_FLAG_SYN)
 					{
 						/* SYN connection starts a connection with a peer */
-						if (TCP_SetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+						if (TCP_SetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 						                           TCPHeaderIN->SourcePort, TCP_Connection_SYNReceived))
 						{
 							TCPHeaderOUT->Flags = (TCP_FLAG_SYN | TCP_FLAG_ACK);
 
-							ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress, TCPHeaderIN->SourcePort);
+							ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress, TCPHeaderIN->SourcePort);
 
 							ConnectionInfo->SequenceNumberIn  = (SwapEndian_32(TCPHeaderIN->SequenceNumber) + 1);
 							ConnectionInfo->SequenceNumberOut = 0;
@@ -416,10 +416,10 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart,
 					{
 						/* ACK during the connection process completes the connection to a peer */
 
-						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 											   TCPHeaderIN->SourcePort, TCP_Connection_Established);
 
-						ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+						ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 															   TCPHeaderIN->SourcePort);
 
 						ConnectionInfo->SequenceNumberOut++;
@@ -434,10 +434,10 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart,
 						TCPHeaderOUT->Flags = (TCP_FLAG_FIN | TCP_FLAG_ACK);
 						PacketResponse      = true;
 
-						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 											   TCPHeaderIN->SourcePort, TCP_Connection_CloseWait);
 
-						ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+						ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 															   TCPHeaderIN->SourcePort);
 
 						ConnectionInfo->SequenceNumberIn++;
@@ -445,7 +445,7 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart,
 					}
 					else if ((TCPHeaderIN->Flags == TCP_FLAG_ACK) || (TCPHeaderIN->Flags == (TCP_FLAG_ACK | TCP_FLAG_PSH)))
 					{
-						ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+						ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 															   TCPHeaderIN->SourcePort);
 
 						/* Check if the buffer is currently in use either by a buffered data to send, or receive */
@@ -491,7 +491,7 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart,
 
 					break;
 				case TCP_Connection_Closing:
-						ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+						ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 															   TCPHeaderIN->SourcePort);
 
 						TCPHeaderOUT->Flags = (TCP_FLAG_ACK | TCP_FLAG_FIN);
@@ -499,14 +499,14 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart,
 
 						ConnectionInfo->Buffer.InUse = false;
 
-						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 											   TCPHeaderIN->SourcePort, TCP_Connection_FINWait1);
 
 					break;
 				case TCP_Connection_FINWait1:
 					if (TCPHeaderIN->Flags == (TCP_FLAG_FIN | TCP_FLAG_ACK))
 					{
-						ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+						ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 															   TCPHeaderIN->SourcePort);
 
 						TCPHeaderOUT->Flags = TCP_FLAG_ACK;
@@ -515,12 +515,12 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart,
 						ConnectionInfo->SequenceNumberIn++;
 						ConnectionInfo->SequenceNumberOut++;
 
-						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 											   TCPHeaderIN->SourcePort, TCP_Connection_Closed);
 					}
 					else if (TCPHeaderIN->Flags == TCP_FLAG_ACK)
 					{
-						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 											   TCPHeaderIN->SourcePort, TCP_Connection_FINWait2);
 					}
 
@@ -528,7 +528,7 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart,
 				case TCP_Connection_FINWait2:
 					if (TCPHeaderIN->Flags == (TCP_FLAG_FIN | TCP_FLAG_ACK))
 					{
-						ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+						ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 															   TCPHeaderIN->SourcePort);
 
 						TCPHeaderOUT->Flags = TCP_FLAG_ACK;
@@ -537,7 +537,7 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart,
 						ConnectionInfo->SequenceNumberIn++;
 						ConnectionInfo->SequenceNumberOut++;
 
-						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 											   TCPHeaderIN->SourcePort, TCP_Connection_Closed);
 					}
 
@@ -545,7 +545,7 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart,
 				case TCP_Connection_CloseWait:
 					if (TCPHeaderIN->Flags == TCP_FLAG_ACK)
 					{
-						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+						TCP_SetConnectionState(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 											   TCPHeaderIN->SourcePort, TCP_Connection_Closed);
 					}
 
@@ -563,7 +563,7 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart,
 	/* Check if we need to respond to the sent packet */
 	if (PacketResponse)
 	{
-		ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, IPHeaderIN->SourceAddress,
+		ConnectionInfo = TCP_GetConnectionInfo(TCPHeaderIN->DestinationPort, &IPHeaderIN->SourceAddress,
 		                                       TCPHeaderIN->SourcePort);
 
 		TCPHeaderOUT->SourcePort           = TCPHeaderIN->DestinationPort;
@@ -581,8 +581,8 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart,
 		TCPHeaderOUT->Checksum             = 0;
 		TCPHeaderOUT->Reserved             = 0;
 
-		TCPHeaderOUT->Checksum             = TCP_Checksum16(TCPHeaderOUT, IPHeaderIN->DestinationAddress,
-		                                                    IPHeaderIN->SourceAddress, sizeof(TCP_Header_t));
+		TCPHeaderOUT->Checksum             = TCP_Checksum16(TCPHeaderOUT, &IPHeaderIN->DestinationAddress,
+		                                                    &IPHeaderIN->SourceAddress, sizeof(TCP_Header_t));
 
 		return sizeof(TCP_Header_t);
 	}
@@ -601,8 +601,8 @@ int16_t TCP_ProcessTCPPacket(void* IPHeaderInStart,
  *  \return A 16-bit TCP checksum value
  */
 static uint16_t TCP_Checksum16(void* TCPHeaderOutStart,
-                               const IP_Address_t SourceAddress,
-                               const IP_Address_t DestinationAddress,
+                               const IP_Address_t* SourceAddress,
+                               const IP_Address_t* DestinationAddress,
                                uint16_t TCPOutSize)
 {
 	uint32_t Checksum = 0;
@@ -610,10 +610,10 @@ static uint16_t TCP_Checksum16(void* TCPHeaderOutStart,
 	/* TCP/IP checksums are the addition of the one's compliment of each word including the IP pseudo-header,
 	   complimented */
 
-	Checksum += ((uint16_t*)&SourceAddress)[0];
-	Checksum += ((uint16_t*)&SourceAddress)[1];
-	Checksum += ((uint16_t*)&DestinationAddress)[0];
-	Checksum += ((uint16_t*)&DestinationAddress)[1];
+	Checksum += ((uint16_t*)SourceAddress)[0];
+	Checksum += ((uint16_t*)SourceAddress)[1];
+	Checksum += ((uint16_t*)DestinationAddress)[0];
+	Checksum += ((uint16_t*)DestinationAddress)[1];
 	Checksum += SwapEndian_16(PROTOCOL_TCP);
 	Checksum += SwapEndian_16(TCPOutSize);
 
diff --git a/Demos/Device/LowLevel/RNDISEthernet/Lib/TCP.h b/Demos/Device/LowLevel/RNDISEthernet/Lib/TCP.h
index e49433af9..4f901484e 100644
--- a/Demos/Device/LowLevel/RNDISEthernet/Lib/TCP.h
+++ b/Demos/Device/LowLevel/RNDISEthernet/Lib/TCP.h
@@ -236,14 +236,14 @@
 		                                       void (*Handler)(TCP_ConnectionState_t*, TCP_ConnectionBuffer_t*));
 		uint8_t               TCP_GetPortState(const uint16_t Port);
 		bool                  TCP_SetConnectionState(const uint16_t Port,
-		                                             const IP_Address_t RemoteAddress,
+		                                             const IP_Address_t* RemoteAddress,
 		                                             const uint16_t RemotePort,
 		                                             const uint8_t State);
 		uint8_t               TCP_GetConnectionState(const uint16_t Port,
-		                                             const IP_Address_t RemoteAddress,
+		                                             const IP_Address_t* RemoteAddress,
 		                                             const uint16_t RemotePort);
 		TCP_ConnectionInfo_t* TCP_GetConnectionInfo(const uint16_t Port,
-		                                            const IP_Address_t RemoteAddress,
+		                                            const IP_Address_t* RemoteAddress,
 		                                            const uint16_t RemotePort);
 		int16_t               TCP_ProcessTCPPacket(void* IPHeaderInStart,
 		                                           void* TCPHeaderInStart,
@@ -251,8 +251,8 @@
 
 		#if defined(INCLUDE_FROM_TCP_C)
 			static uint16_t TCP_Checksum16(void* TCPHeaderOutStart,
-			                               const IP_Address_t SourceAddress,
-			                               const IP_Address_t DestinationAddress,
+			                               const IP_Address_t* SourceAddress,
+			                               const IP_Address_t* DestinationAddress,
 			                               uint16_t TCPOutSize);
 		#endif
 
-- 
GitLab