1 /*
2 * FreeRTOS+TCP <DEVELOPMENT BRANCH>
3 * Copyright (C) 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4 *
5 * SPDX-License-Identifier: MIT
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a copy of
8 * this software and associated documentation files (the "Software"), to deal in
9 * the Software without restriction, including without limitation the rights to
10 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
11 * the Software, and to permit persons to whom the Software is furnished to do so,
12 * subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included in all
15 * copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
19 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
20 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
21 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 *
24 * http://aws.amazon.com/freertos
25 * http://www.FreeRTOS.org
26 */
27
28
29 /* Include Unity header */
30 #include "unity.h"
31
32 /* Include standard libraries */
33 #include <stdlib.h>
34 #include <string.h>
35 #include <stdint.h>
36
37 #include "FreeRTOSIPConfig.h"
38
39 #include "mock_task.h"
40 #include "mock_list.h"
41
42 #include "mock_FreeRTOS_IP.h"
43 #include "mock_FreeRTOS_IP_Private.h"
44 #include "mock_NetworkBufferManagement.h"
45 #include "mock_FreeRTOS_DHCP.h"
46 #include "mock_FreeRTOS_TCP_Utils.h"
47 #include "mock_FreeRTOS_ND.h"
48
49 #include "FreeRTOS_TCP_Transmission.h"
50 #include "FreeRTOS_TCP_Transmission_IPv6_stubs.c"
51
52 #include "catch_assert.h"
53
54 /* =========================== EXTERN VARIABLES =========================== */
55
56 #define PACKET_LENGTH 50
57
58 uint8_t ucEthernetBuffer[ ipconfigNETWORK_MTU ];
59
60 /* =============================== Test Cases =============================== */
61
62 /**
63 * @brief This function verify handling when both
64 * 'pxNetworkBuffer' or 'pxSocket' is not defined.
65 * while returning a packet.
66 */
test_prvTCPReturnPacket_IPV6_BufferSocketNULL(void)67 void test_prvTCPReturnPacket_IPV6_BufferSocketNULL( void )
68 {
69 FreeRTOS_Socket_t * pxSocket = NULL;
70 NetworkBufferDescriptor_t * pxDescriptor = NULL;
71 uint32_t ulLen = PACKET_LENGTH;
72 BaseType_t xReleaseAfterSend = pdFALSE;
73
74 prvTCPReturnPacket_IPV6( pxSocket, pxDescriptor, ulLen, xReleaseAfterSend );
75 }
76
77 /**
78 * @brief This function verify handling case when
79 * only pxNetworkBuffer is NULL while
80 * returning a packet.
81 */
test_prvTCPReturnPacket_IPV6_BufferNULL(void)82 void test_prvTCPReturnPacket_IPV6_BufferNULL( void )
83 {
84 FreeRTOS_Socket_t xSocket;
85 NetworkBufferDescriptor_t * pxDescriptor = NULL;
86 uint32_t ulLen = PACKET_LENGTH;
87 BaseType_t xReleaseAfterSend = pdFALSE;
88
89 memset( &xSocket, 0, sizeof( FreeRTOS_Socket_t ) );
90
91 prvTCPReturnPacket_IPV6( &xSocket, pxDescriptor, ulLen, xReleaseAfterSend );
92 }
93
94 /**
95 * @brief This function verify asserting when
96 * ethernet buffer is not initialized.
97 */
test_prvTCPReturnPacket_IPV6_pucEthernetBuffer_Assert(void)98 void test_prvTCPReturnPacket_IPV6_pucEthernetBuffer_Assert( void )
99 {
100 FreeRTOS_Socket_t * pxSocket = NULL;
101 NetworkBufferDescriptor_t xDescriptor;
102 uint32_t ulLen = PACKET_LENGTH;
103 BaseType_t xReleaseAfterSend = pdFALSE;
104 NetworkEndPoint_t xEndPoint;
105
106 memset( &xDescriptor, 0, sizeof( NetworkBufferDescriptor_t ) );
107 memset( &xEndPoint, 0, sizeof( NetworkEndPoint_t ) );
108 xDescriptor.pxEndPoint = &xEndPoint;
109 xDescriptor.pucEthernetBuffer = NULL;
110
111 catch_assert( prvTCPReturnPacket_IPV6( pxSocket, &xDescriptor, ulLen, xReleaseAfterSend ) );
112 }
113
114 /**
115 * @brief This function verify handling case when
116 * only xSocket is NULL while
117 * returning a packet.
118 */
test_prvTCPReturnPacket_IPV6_SocketNULL(void)119 void test_prvTCPReturnPacket_IPV6_SocketNULL( void )
120 {
121 FreeRTOS_Socket_t * pxSocket = NULL;
122 NetworkBufferDescriptor_t xDescriptor;
123 uint32_t ulLen = PACKET_LENGTH;
124 BaseType_t xReleaseAfterSend = pdFALSE;
125 NetworkEndPoint_t xEndPoint;
126 NetworkInterface_t xNetworkInterfaces;
127
128 memset( &xDescriptor, 0, sizeof( NetworkBufferDescriptor_t ) );
129 xDescriptor.pxEndPoint = &xEndPoint;
130 xDescriptor.pucEthernetBuffer = ucEthernetBuffer;
131 xDescriptor.pxEndPoint->pxNetworkInterface = &xNetworkInterfaces;
132 xDescriptor.pxEndPoint->pxNetworkInterface->pfOutput = &NetworkInterfaceOutputFunction_Stub;
133
134 usGenerateProtocolChecksum_ExpectAnyArgsAndReturn( ipCORRECT_CRC );
135 eNDGetCacheEntry_ExpectAnyArgsAndReturn( eARPCacheHit );
136
137 prvTCPReturnPacket_IPV6( pxSocket, &xDescriptor, ulLen, xReleaseAfterSend );
138 }
139
140 /**
141 * @brief This function verify handling case with valid
142 * pxNetworkBuffer and pxSocket where as network end
143 * point is NULL while returning a packet.
144 */
test_prvTCPReturnPacket_IPV6_NoEP_Found(void)145 void test_prvTCPReturnPacket_IPV6_NoEP_Found( void )
146 {
147 FreeRTOS_Socket_t xSocket;
148 NetworkBufferDescriptor_t xDescriptor, * pxDescriptor = &xDescriptor;
149 uint32_t ulLen = PACKET_LENGTH;
150 BaseType_t xReleaseAfterSend = pdFALSE;
151 TCPPacket_IPv6_t * pxTCPPacket;
152
153 memset( &xSocket, 0, sizeof( FreeRTOS_Socket_t ) );
154 memset( pxDescriptor, 0, sizeof( NetworkBufferDescriptor_t ) );
155
156 xDescriptor.pucEthernetBuffer = ucEthernetBuffer;
157 pxTCPPacket = ( ( TCPPacket_IPv6_t * ) xDescriptor.pucEthernetBuffer );
158 xDescriptor.pxEndPoint = NULL;
159 xSocket.pxEndPoint = NULL;
160
161 prvTCPReturnPacket_IPV6( &xSocket, pxDescriptor, ulLen, xReleaseAfterSend );
162 }
163
164 /**
165 * @brief This function verify handling case with valid
166 * pxNetworkBuffer and pxSocket & set EndPoint is
167 * not able to find an Endpoint .
168 */
test_prvTCPReturnPacket_IPV6_NoEP_ReleaseAfterSend(void)169 void test_prvTCPReturnPacket_IPV6_NoEP_ReleaseAfterSend( void )
170 {
171 FreeRTOS_Socket_t xSocket;
172 NetworkBufferDescriptor_t xDescriptor, * pxDescriptor = &xDescriptor;
173 uint32_t ulLen = PACKET_LENGTH;
174 BaseType_t xReleaseAfterSend = pdTRUE;
175 TCPPacket_IPv6_t * pxTCPPacket;
176
177 memset( &xSocket, 0, sizeof( FreeRTOS_Socket_t ) );
178 memset( pxDescriptor, 0, sizeof( NetworkBufferDescriptor_t ) );
179
180 xDescriptor.pucEthernetBuffer = ucEthernetBuffer;
181 pxTCPPacket = ( ( TCPPacket_IPv6_t * ) xDescriptor.pucEthernetBuffer );
182 xDescriptor.pxEndPoint = NULL;
183
184 vReleaseNetworkBufferAndDescriptor_ExpectAnyArgs();
185
186 prvTCPReturnPacket_IPV6( &xSocket, pxDescriptor, ulLen, xReleaseAfterSend );
187 }
188
189 /**
190 * @brief This function verify handling case with valid
191 * pxNetworkBuffer and pxSocket where as network end
192 * point does not have a valid NetworkInterface
193 * while returning a packet.
194 */
test_prvTCPReturnPacket_IPV6_Assert1(void)195 void test_prvTCPReturnPacket_IPV6_Assert1( void )
196 {
197 FreeRTOS_Socket_t xSocket;
198 NetworkBufferDescriptor_t xDescriptor, * pxDescriptor = &xDescriptor;
199 uint32_t ulLen = PACKET_LENGTH;
200 BaseType_t xReleaseAfterSend = pdTRUE;
201 NetworkEndPoint_t xEndPoint;
202 TCPPacket_IPv6_t * pxTCPPacket;
203
204
205 memset( &xSocket, 0, sizeof( FreeRTOS_Socket_t ) );
206 memset( pxDescriptor, 0, sizeof( NetworkBufferDescriptor_t ) );
207 memset( &xEndPoint, 0, sizeof( NetworkEndPoint_t ) );
208
209 xDescriptor.pucEthernetBuffer = ucEthernetBuffer;
210 pxTCPPacket = ( ( TCPPacket_IPv6_t * ) xDescriptor.pucEthernetBuffer );
211 pxDescriptor->pxEndPoint = NULL;
212 pxDescriptor->xDataLength = ipconfigETHERNET_MINIMUM_PACKET_BYTES;
213 xSocket.pxEndPoint = &xEndPoint;
214 xSocket.pxEndPoint->pxNetworkInterface = NULL;
215
216 usGenerateProtocolChecksum_ExpectAnyArgsAndReturn( ipCORRECT_CRC );
217 eNDGetCacheEntry_ExpectAnyArgsAndReturn( eARPCacheHit );
218
219 catch_assert( prvTCPReturnPacket_IPV6( &xSocket, pxDescriptor, ulLen, xReleaseAfterSend ) );
220 }
221
222
223 /**
224 * @brief This function verify handling case with valid
225 * pxNetworkBuffer and pxSocket where as network end
226 * point does not have a valid NetworkInterface
227 * while returning a packet.
228 */
test_prvTCPReturnPacket_IPV6_Assert2(void)229 void test_prvTCPReturnPacket_IPV6_Assert2( void )
230 {
231 FreeRTOS_Socket_t xSocket;
232 NetworkBufferDescriptor_t xDescriptor, * pxDescriptor = &xDescriptor;
233 uint32_t ulLen = PACKET_LENGTH;
234 BaseType_t xReleaseAfterSend = pdTRUE;
235 NetworkEndPoint_t xEndPoint;
236 TCPPacket_IPv6_t * pxTCPPacket;
237 IPHeader_IPv6_t * pxIPHeader;
238 TCPWindow_t * pxTCPWindow = &( xSocket.u.xTCP.xTCPWindow );
239
240
241 memset( &xSocket, 0, sizeof( FreeRTOS_Socket_t ) );
242 memset( pxDescriptor, 0, sizeof( NetworkBufferDescriptor_t ) );
243 memset( &xEndPoint, 0, sizeof( NetworkEndPoint_t ) );
244
245 pxDescriptor->pucEthernetBuffer = ucEthernetBuffer;
246 pxDescriptor->pxEndPoint = &xEndPoint;
247 pxDescriptor->xDataLength = ipconfigETHERNET_MINIMUM_PACKET_BYTES;
248 pxDescriptor->pxEndPoint->pxNetworkInterface = NULL;
249 pxTCPPacket = ( ( TCPPacket_IPv6_t * ) pxDescriptor->pucEthernetBuffer );
250 pxIPHeader = &pxTCPPacket->xIPHeader;
251
252 usGenerateProtocolChecksum_ExpectAnyArgsAndReturn( ipCORRECT_CRC );
253 eNDGetCacheEntry_ExpectAnyArgsAndReturn( eARPCacheMiss );
254
255 catch_assert( prvTCPReturnPacket_IPV6( &xSocket, pxDescriptor, ulLen, xReleaseAfterSend ) );
256 }
257
258 /**
259 * @brief This function verify handling case with valid
260 * pxNetworkBuffer and pxSocket where as network end
261 * point does not have a valid NetworkInterface output
262 * function, while returning a packet.
263 */
test_prvTCPReturnPacket_IPV6_Assert3(void)264 void test_prvTCPReturnPacket_IPV6_Assert3( void )
265 {
266 FreeRTOS_Socket_t xSocket;
267 NetworkBufferDescriptor_t xDescriptor, * pxDescriptor = &xDescriptor;
268 uint32_t ulLen = PACKET_LENGTH;
269 BaseType_t xReleaseAfterSend = pdTRUE;
270 NetworkEndPoint_t xEndPoint;
271 TCPPacket_IPv6_t * pxTCPPacket;
272 IPHeader_IPv6_t * pxIPHeader;
273 TCPWindow_t * pxTCPWindow = &( xSocket.u.xTCP.xTCPWindow );
274 NetworkInterface_t xNetworkInterfaces;
275
276
277 memset( &xSocket, 0, sizeof( FreeRTOS_Socket_t ) );
278 memset( pxDescriptor, 0, sizeof( NetworkBufferDescriptor_t ) );
279 memset( &xEndPoint, 0, sizeof( NetworkEndPoint_t ) );
280
281 pxDescriptor->pucEthernetBuffer = ucEthernetBuffer;
282 pxDescriptor->pxEndPoint = &xEndPoint;
283 pxDescriptor->xDataLength = ipconfigETHERNET_MINIMUM_PACKET_BYTES;
284 pxDescriptor->pxEndPoint->pxNetworkInterface = &xNetworkInterfaces;
285 pxDescriptor->pxEndPoint->pxNetworkInterface->pfOutput = NULL;
286 pxTCPPacket = ( ( TCPPacket_IPv6_t * ) pxDescriptor->pucEthernetBuffer );
287 pxIPHeader = &pxTCPPacket->xIPHeader;
288
289 usGenerateProtocolChecksum_ExpectAnyArgsAndReturn( ipCORRECT_CRC );
290 eNDGetCacheEntry_ExpectAnyArgsAndReturn( eARPCacheHit );
291
292 catch_assert( prvTCPReturnPacket_IPV6( &xSocket, pxDescriptor, ulLen, xReleaseAfterSend ) );
293 }
294
295 /**
296 * @brief This function verify handling case with valid
297 * pxNetworkBuffer and pxSocket where as network end
298 * point does not have a valid NetworkInterface,
299 * while returning a packet.
300 */
test_prvTCPReturnPacket_IPV6_HappyPath_ReleaseAfterSend(void)301 void test_prvTCPReturnPacket_IPV6_HappyPath_ReleaseAfterSend( void )
302 {
303 FreeRTOS_Socket_t xSocket;
304 NetworkBufferDescriptor_t xDescriptor, * pxDescriptor = &xDescriptor;
305 uint32_t ulLen = ipconfigETHERNET_MINIMUM_PACKET_BYTES;
306 BaseType_t xReleaseAfterSend = pdTRUE;
307 NetworkEndPoint_t xEndPoint;
308 TCPPacket_IPv6_t * pxTCPPacket;
309 NetworkInterface_t xNetworkInterfaces;
310
311
312 memset( &xSocket, 0, sizeof( FreeRTOS_Socket_t ) );
313 memset( pxDescriptor, 0, sizeof( NetworkBufferDescriptor_t ) );
314 memset( &xEndPoint, 0, sizeof( NetworkEndPoint_t ) );
315 memset( &xNetworkInterfaces, 0, sizeof( NetworkInterface_t ) );
316
317 xDescriptor.pucEthernetBuffer = ucEthernetBuffer;
318 pxTCPPacket = ( ( TCPPacket_IPv6_t * ) xDescriptor.pucEthernetBuffer );
319 pxDescriptor->pxEndPoint = &xEndPoint;
320 pxDescriptor->xDataLength = ipconfigETHERNET_MINIMUM_PACKET_BYTES;
321 pxDescriptor->pxEndPoint->pxNetworkInterface = &xNetworkInterfaces;
322 pxDescriptor->pxEndPoint->pxNetworkInterface->pfOutput = &NetworkInterfaceOutputFunction_Stub;
323
324 usGenerateProtocolChecksum_ExpectAnyArgsAndReturn( ipCORRECT_CRC );
325 eNDGetCacheEntry_ExpectAnyArgsAndReturn( eARPCacheHit );
326
327 prvTCPReturnPacket_IPV6( &xSocket, pxDescriptor, ulLen, xReleaseAfterSend );
328 }
329
330 /**
331 * @brief This function verify handling case with valid
332 * pxNetworkBuffer and pxSocket where as network end
333 * point does not have a valid NetworkInterface,
334 * while returning a packet.
335 */
test_prvTCPReturnPacket_IPV6_HappyPath_NoReleaseAfterSend(void)336 void test_prvTCPReturnPacket_IPV6_HappyPath_NoReleaseAfterSend( void )
337 {
338 FreeRTOS_Socket_t xSocket;
339 NetworkBufferDescriptor_t xDescriptor, * pxDescriptor = &xDescriptor;
340 uint32_t ulLen = PACKET_LENGTH;
341 BaseType_t xReleaseAfterSend = pdFALSE;
342 NetworkEndPoint_t xEndPoint;
343 NetworkInterface_t xNetworkInterfaces;
344 uint8_t ucEthernetBuffer[ ipconfigNETWORK_MTU ];
345
346
347
348 memset( &xSocket, 0, sizeof( FreeRTOS_Socket_t ) );
349 memset( pxDescriptor, 0, sizeof( NetworkBufferDescriptor_t ) );
350 memset( &xEndPoint, 0, sizeof( NetworkEndPoint_t ) );
351 memset( &xNetworkInterfaces, 0, sizeof( NetworkInterface_t ) );
352
353 pxDescriptor->pucEthernetBuffer = ucEthernetBuffer;
354 pxDescriptor->pxEndPoint = &xEndPoint;
355 pxDescriptor->xDataLength = ipconfigETHERNET_MINIMUM_PACKET_BYTES;
356 pxDescriptor->pxEndPoint->pxNetworkInterface = &xNetworkInterfaces;
357 pxDescriptor->pxEndPoint->pxNetworkInterface->pfOutput = &NetworkInterfaceOutputFunction_Stub;
358
359 usGenerateProtocolChecksum_ExpectAnyArgsAndReturn( ipCORRECT_CRC );
360 eNDGetCacheEntry_ExpectAnyArgsAndReturn( eARPCacheHit );
361
362 prvTCPReturnPacket_IPV6( &xSocket, pxDescriptor, ulLen, xReleaseAfterSend );
363 }
364
365 /**
366 * @brief This function validates failure in creating a packet
367 * as failed to get ND Cache Entry and the End point
368 * was found to be NULL.
369 *
370 */
test_prvTCPPrepareConnect_IPV6_CacheMiss_NULLEP(void)371 void test_prvTCPPrepareConnect_IPV6_CacheMiss_NULLEP( void )
372 {
373 FreeRTOS_Socket_t xSocket, * pxSocket = &xSocket;
374 BaseType_t xReturn = pdFALSE;
375
376 eNDGetCacheEntry_ExpectAnyArgsAndReturn( eARPCacheMiss );
377
378 uxIPHeaderSizeSocket_ExpectAnyArgsAndReturn( ipSIZE_OF_IPv6_HEADER );
379
380 xReturn = prvTCPPrepareConnect_IPV6( pxSocket );
381
382 TEST_ASSERT_EQUAL( pdFAIL, xReturn );
383 }
384
385 /**
386 * @brief This function validates failure in creating a packet
387 * as after getting the ND Cache Entry, the
388 * End point was found to be NULL.
389 *
390 */
test_prvTCPPrepareConnect_IPV6_CacheHit_NULLEP(void)391 void test_prvTCPPrepareConnect_IPV6_CacheHit_NULLEP( void )
392 {
393 FreeRTOS_Socket_t xSocket, * pxSocket = &xSocket;
394 BaseType_t xReturn = pdFALSE;
395
396 eNDGetCacheEntry_ExpectAnyArgsAndReturn( eARPCacheHit );
397
398 uxIPHeaderSizeSocket_ExpectAnyArgsAndReturn( ipSIZE_OF_IPv6_HEADER );
399 ulApplicationGetNextSequenceNumber_ExpectAnyArgsAndReturn( 0 );
400
401 xReturn = prvTCPPrepareConnect_IPV6( pxSocket );
402
403 TEST_ASSERT_EQUAL( pdFAIL, xReturn );
404 }
405
406 /**
407 * @brief This function validates failure in creating a packet
408 * as after getting the ND Cache Entry, but there
409 * was random number generation error.
410 *
411 */
test_prvTCPPrepareConnect_IPV6_CacheHit_RandNumFail(void)412 void test_prvTCPPrepareConnect_IPV6_CacheHit_RandNumFail( void )
413 {
414 FreeRTOS_Socket_t xSocket, * pxSocket = &xSocket;
415 BaseType_t xReturn = pdFALSE;
416
417 eNDGetCacheEntry_ExpectAnyArgsAndReturn( eARPCacheHit );
418
419 uxIPHeaderSizeSocket_ExpectAnyArgsAndReturn( ipSIZE_OF_IPv6_HEADER );
420 ulApplicationGetNextSequenceNumber_ExpectAnyArgsAndReturn( 10 );
421
422 xReturn = prvTCPPrepareConnect_IPV6( pxSocket );
423
424 TEST_ASSERT_EQUAL( pdFAIL, xReturn );
425 }
426
427
428 /**
429 * @brief This function validates failure in creating a packet
430 * as there is no IP address, or an ARP is still in progress.
431 */
test_prvTCPPrepareConnect_IPV6_CantSendPacket_NULLEP(void)432 void test_prvTCPPrepareConnect_IPV6_CantSendPacket_NULLEP( void )
433 {
434 FreeRTOS_Socket_t xSocket, * pxSocket = &xSocket;
435 BaseType_t xReturn = pdFALSE;
436
437 eNDGetCacheEntry_ExpectAnyArgsAndReturn( eCantSendPacket );
438
439 uxIPHeaderSizeSocket_ExpectAnyArgsAndReturn( ipSIZE_OF_IPv6_HEADER );
440
441 xReturn = prvTCPPrepareConnect_IPV6( pxSocket );
442
443 TEST_ASSERT_EQUAL( pdFAIL, xReturn );
444 }
445
446 /**
447 * @brief This function validates failure in creating a packet
448 * as there is a cache miss but a valid Endpoint is found.
449 */
test_prvTCPPrepareConnect_IPV6_CacheMiss_ValidEP(void)450 void test_prvTCPPrepareConnect_IPV6_CacheMiss_ValidEP( void )
451 {
452 FreeRTOS_Socket_t xSocket, * pxSocket = &xSocket;
453 NetworkEndPoint_t xEndPoint, * pxEndPoint = &xEndPoint;
454 BaseType_t xReturn = pdFALSE;
455
456 memset( pxEndPoint, 0, sizeof( NetworkEndPoint_t ) );
457 eNDGetCacheEntry_ExpectAnyArgsAndReturn( eARPCacheMiss );
458 eNDGetCacheEntry_ReturnThruPtr_ppxEndPoint( &pxEndPoint );
459
460 uxIPHeaderSizeSocket_ExpectAnyArgsAndReturn( ipSIZE_OF_IPv6_HEADER );
461 pxGetNetworkBufferWithDescriptor_ExpectAnyArgsAndReturn( NULL );
462
463 prvSocketSetMSS_ExpectAnyArgs();
464
465 xReturn = prvTCPPrepareConnect_IPV6( pxSocket );
466
467 TEST_ASSERT_EQUAL( pdFAIL, xReturn );
468 TEST_ASSERT_EQUAL_MEMORY( pxSocket->pxEndPoint, pxEndPoint, sizeof( NetworkEndPoint_t ) );
469 }
470
471 /**
472 * @brief This function validates failure in creating a packet
473 * as cache get entry returns an unknown return value.
474 */
test_prvTCPPrepareConnect_IPV6_DefaultCase_ValidEP(void)475 void test_prvTCPPrepareConnect_IPV6_DefaultCase_ValidEP( void )
476 {
477 FreeRTOS_Socket_t xSocket, * pxSocket = &xSocket;
478 NetworkEndPoint_t xEndPoint, * pxEndPoint = &xEndPoint;
479 NetworkBufferDescriptor_t xNetworkBuffer;
480 BaseType_t xReturn = pdFALSE;
481
482 memset( pxEndPoint, 0, sizeof( NetworkEndPoint_t ) );
483 memset( &xNetworkBuffer, 0, sizeof( NetworkBufferDescriptor_t ) );
484 eNDGetCacheEntry_ExpectAnyArgsAndReturn( eCantSendPacket + 1 ); /* Default case */
485 eNDGetCacheEntry_ReturnThruPtr_ppxEndPoint( &pxEndPoint );
486
487 uxIPHeaderSizeSocket_ExpectAnyArgsAndReturn( ipSIZE_OF_IPv6_HEADER );
488 pxGetNetworkBufferWithDescriptor_ExpectAnyArgsAndReturn( &xNetworkBuffer );
489 vNDSendNeighbourSolicitation_ExpectAnyArgs();
490
491 prvSocketSetMSS_ExpectAnyArgs();
492
493 xReturn = prvTCPPrepareConnect_IPV6( pxSocket );
494
495 TEST_ASSERT_EQUAL( pdFAIL, xReturn );
496 TEST_ASSERT_EQUAL_MEMORY( pxSocket->pxEndPoint, pxEndPoint, sizeof( NetworkEndPoint_t ) );
497 }
498
499 /**
500 * @brief This function validates successfully created a
501 * packet and sending the first SYN with IPv4 frame type.
502 */
test_prvTCPPrepareConnect_IPV6_HappyPath_IPv4(void)503 void test_prvTCPPrepareConnect_IPV6_HappyPath_IPv4( void )
504 {
505 FreeRTOS_Socket_t xSocket, * pxSocket = &xSocket;
506 NetworkEndPoint_t xEndPoint, * pxEndPoint = &xEndPoint;
507 NetworkBufferDescriptor_t xNetworkBuffer;
508 BaseType_t xReturn = pdFALSE;
509
510 memset( pxEndPoint, 0, sizeof( NetworkEndPoint_t ) );
511 memset( &xNetworkBuffer, 0, sizeof( NetworkBufferDescriptor_t ) );
512 pxSocket->bits.bIsIPv6 = 0;
513
514 eNDGetCacheEntry_ExpectAnyArgsAndReturn( eARPCacheHit );
515 eNDGetCacheEntry_ReturnThruPtr_ppxEndPoint( &pxEndPoint );
516
517 uxIPHeaderSizeSocket_ExpectAnyArgsAndReturn( ipSIZE_OF_IPv4_HEADER );
518 ulApplicationGetNextSequenceNumber_ExpectAnyArgsAndReturn( 10 );
519
520 prvSocketSetMSS_ExpectAnyArgs();
521
522 xReturn = prvTCPPrepareConnect_IPV6( pxSocket );
523
524 TEST_ASSERT_EQUAL( pdPASS, xReturn );
525 TEST_ASSERT_EQUAL_MEMORY( pxSocket->pxEndPoint, pxEndPoint, sizeof( NetworkEndPoint_t ) );
526 }
527
528 /**
529 * @brief This function validates successfully created a
530 * packet and sending the first SYN with IPv6 frame type.
531 */
test_prvTCPPrepareConnect_IPV6_HappyPath_IPv6(void)532 void test_prvTCPPrepareConnect_IPV6_HappyPath_IPv6( void )
533 {
534 FreeRTOS_Socket_t xSocket, * pxSocket = &xSocket;
535 NetworkEndPoint_t xEndPoint, * pxEndPoint = &xEndPoint;
536 NetworkBufferDescriptor_t xNetworkBuffer;
537 BaseType_t xReturn = pdFALSE;
538
539 memset( pxEndPoint, 0, sizeof( NetworkEndPoint_t ) );
540 memset( &xNetworkBuffer, 0, sizeof( NetworkBufferDescriptor_t ) );
541 pxSocket->bits.bIsIPv6 = 1;
542 eNDGetCacheEntry_ExpectAnyArgsAndReturn( eARPCacheHit );
543 eNDGetCacheEntry_ReturnThruPtr_ppxEndPoint( &pxEndPoint );
544
545 uxIPHeaderSizeSocket_ExpectAnyArgsAndReturn( ipSIZE_OF_IPv6_HEADER );
546 ulApplicationGetNextSequenceNumber_ExpectAnyArgsAndReturn( 10 );
547
548 prvSocketSetMSS_ExpectAnyArgs();
549
550 xReturn = prvTCPPrepareConnect_IPV6( pxSocket );
551
552 TEST_ASSERT_EQUAL( pdPASS, xReturn );
553 TEST_ASSERT_EQUAL_MEMORY( pxSocket->pxEndPoint, pxEndPoint, sizeof( NetworkEndPoint_t ) );
554 }
555
556 /**
557 * @brief This function validates sending a TCP protocol control packet,
558 * when an un synchronised packet is received.
559 */
test_prvTCPSendSpecialPktHelper_IPV6(void)560 void test_prvTCPSendSpecialPktHelper_IPV6( void )
561 {
562 NetworkBufferDescriptor_t xNetworkBuffer, * pxNetworkBuffer = &xNetworkBuffer;
563 TCPPacket_IPv6_t * pxTCPPacket;
564 uint8_t ucTCPFlags = tcpTCP_FLAG_RST;
565 BaseType_t xReturn;
566
567 pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
568 pxTCPPacket = ( ( TCPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer );
569 pxTCPPacket->xTCPHeader.ucTCPFlags = 0;
570
571 xReturn = prvTCPSendSpecialPktHelper_IPV6( pxNetworkBuffer, ucTCPFlags );
572
573 TEST_ASSERT_EQUAL( pdFAIL, xReturn );
574 TEST_ASSERT_EQUAL( ucTCPFlags, pxTCPPacket->xTCPHeader.ucTCPFlags );
575 TEST_ASSERT_EQUAL( ( ipSIZE_OF_TCP_HEADER ) << 2, pxTCPPacket->xTCPHeader.ucTCPOffset );
576 }
577
578 /**
579 * @brief This function validates sending a TCP protocol control packet,
580 * when an synchronize packet is received.
581 */
test_prvTCPSendSpecialPktHelper_IPV6_Syn(void)582 void test_prvTCPSendSpecialPktHelper_IPV6_Syn( void )
583 {
584 NetworkBufferDescriptor_t xNetworkBuffer, * pxNetworkBuffer = &xNetworkBuffer;
585 TCPPacket_IPv6_t * pxTCPPacket;
586 uint8_t ucTCPFlags = tcpTCP_FLAG_RST;
587 BaseType_t xReturn;
588
589 xNetworkBuffer.pucEthernetBuffer = ucEthernetBuffer;
590 pxTCPPacket = ( ( TCPPacket_IPv6_t * ) xNetworkBuffer.pucEthernetBuffer );
591 pxTCPPacket->xTCPHeader.ucTCPFlags = tcpTCP_FLAG_SYN;
592
593 xReturn = prvTCPSendSpecialPktHelper_IPV6( pxNetworkBuffer, ucTCPFlags );
594
595 TEST_ASSERT_EQUAL( pdFAIL, xReturn );
596 TEST_ASSERT_EQUAL( ucTCPFlags, pxTCPPacket->xTCPHeader.ucTCPFlags );
597 TEST_ASSERT_EQUAL( ( ipSIZE_OF_TCP_HEADER ) << 2, pxTCPPacket->xTCPHeader.ucTCPOffset );
598 }
599