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 "mock_task.h"
38 #include "mock_list.h"
39
40 /* This must come after list.h is included (in this case, indirectly
41 * by mock_list.h). */
42 #include "mock_IP_list_macros.h"
43 #include "mock_queue.h"
44 #include "mock_event_groups.h"
45 #include "mock_FreeRTOS_Stream_Buffer.h"
46
47 #include "mock_FreeRTOS_IP.h"
48 #include "mock_FreeRTOS_IP_Private.h"
49 #include "mock_FreeRTOS_IP_Utils.h"
50 #include "mock_FreeRTOS_IP_Timers.h"
51 #include "mock_FreeRTOS_TCP_IP.h"
52 #include "mock_FreeRTOS_ICMP.h"
53 #include "mock_FreeRTOS_ARP.h"
54 #include "mock_NetworkBufferManagement.h"
55 #include "mock_FreeRTOS_DHCP.h"
56 #include "mock_FreeRTOS_Sockets.h"
57 #include "mock_FreeRTOS_Routing.h"
58 #include "mock_FreeRTOS_DNS.h"
59 #include "mock_FreeRTOS_DNS_Cache.h"
60 #include "mock_FreeRTOS_UDP_IP.h"
61 #include "mock_FreeRTOS_ND.h"
62 #include "mock_FreeRTOS_IPv6.h"
63 #include "mock_FreeRTOS_IPv4.h"
64
65 #include "FreeRTOS_IP.h"
66
67 #include "FreeRTOS_IP_stubs.c"
68 #include "catch_assert.h"
69
70 #include "FreeRTOSIPConfig.h"
71
72 /* =========================== EXTERN VARIABLES =========================== */
73
74 extern NetworkInterface_t xInterfaces[ 1 ];
75 extern BaseType_t xIPTaskInitialised;
76 extern BaseType_t xNetworkDownEventPending;
77
78 void prvIPTask( void * pvParameters );
79 void prvProcessIPEventsAndTimers( void );
80 eFrameProcessingResult_t prvProcessIPPacket( IPPacket_t * pxIPPacket,
81 NetworkBufferDescriptor_t * const pxNetworkBuffer );
82 void prvProcessEthernetPacket( NetworkBufferDescriptor_t * const pxNetworkBuffer );
83
84 static BaseType_t NetworkInterfaceOutputFunction_Stub_Called = 0;
85
86 /* First IPv6 address is 2001:1234:5678::5 */
87 const IPv6_Address_t xIPAddressFive = { 0x20, 0x01, 0x12, 0x34, 0x56, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05 };
88
89 /* Second IPv6 address is 2001:1234:5678::10 */
90 const IPv6_Address_t xIPAddressTen = { 0x20, 0x01, 0x12, 0x34, 0x56, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10 };
91
92 /* MAC Address for endpoint. */
93 const uint8_t ucMACAddress[ ipMAC_ADDRESS_LENGTH_BYTES ] = { 0xab, 0xcd, 0xef, 0x11, 0x22, 0x33 };
94
95 /* ============================ Unity Fixtures ============================ */
96
97 /*! called before each test case */
setUp(void)98 void setUp( void )
99 {
100 pxNetworkEndPoints = NULL;
101 pxNetworkInterfaces = NULL;
102 xNetworkDownEventPending = pdFALSE;
103 }
104
105 /*! called after each test case */
tearDown(void)106 void tearDown( void )
107 {
108 }
109
110 /* ======================== Stub Callback Functions ========================= */
111
NetworkInterfaceOutputFunction_Stub(struct xNetworkInterface * pxDescriptor,NetworkBufferDescriptor_t * const pxNetworkBuffer,BaseType_t xReleaseAfterSend)112 static BaseType_t NetworkInterfaceOutputFunction_Stub( struct xNetworkInterface * pxDescriptor,
113 NetworkBufferDescriptor_t * const pxNetworkBuffer,
114 BaseType_t xReleaseAfterSend )
115 {
116 NetworkInterfaceOutputFunction_Stub_Called++;
117 return 0;
118 }
119
120 static uint8_t ReleaseTCPPayloadBuffer[ 1500 ];
121 static BaseType_t ReleaseTCPPayloadBufferxByteCount = 100;
StubuxStreamBufferGetPtr_ReturnBadAddress(StreamBuffer_t * pxBuffer,uint8_t ** ppucData,int lCounter)122 static size_t StubuxStreamBufferGetPtr_ReturnBadAddress( StreamBuffer_t * pxBuffer,
123 uint8_t ** ppucData,
124 int lCounter )
125 {
126 *ppucData = &ReleaseTCPPayloadBuffer[ 150 ];
127
128 return 0xFFFFFF;
129 }
130
StubuxStreamBufferGetPtr_ReturnIncorrectSize(StreamBuffer_t * pxBuffer,uint8_t ** ppucData,int lCounter)131 static size_t StubuxStreamBufferGetPtr_ReturnIncorrectSize( StreamBuffer_t * pxBuffer,
132 uint8_t ** ppucData,
133 int lCounter )
134 {
135 *ppucData = &ReleaseTCPPayloadBuffer[ 0 ];
136
137 return( ReleaseTCPPayloadBufferxByteCount >> 1 );
138 }
139
StubuxStreamBufferGetPtr_ReturnCorrectVals(StreamBuffer_t * pxBuffer,uint8_t ** ppucData,int lCounter)140 static size_t StubuxStreamBufferGetPtr_ReturnCorrectVals( StreamBuffer_t * pxBuffer,
141 uint8_t ** ppucData,
142 int lCounter )
143 {
144 *ppucData = &ReleaseTCPPayloadBuffer[ 0 ];
145
146 return ReleaseTCPPayloadBufferxByteCount;
147 }
148
149 /* ============================== Test Cases ============================== */
150
151 /**
152 * @brief test_vIPNetworkUpCalls
153 * To validate if vIPNetworkUpCalls calls corresponding APIs.
154 */
test_vIPNetworkUpCalls(void)155 void test_vIPNetworkUpCalls( void )
156 {
157 NetworkEndPoint_t xEndPoint = { 0 };
158
159 xEndPoint.bits.bEndPointUp = pdFALSE;
160
161 vApplicationIPNetworkEventHook_Multi_Expect( eNetworkUp, &xEndPoint );
162 vDNSInitialise_Expect();
163 vARPTimerReload_Expect( pdMS_TO_TICKS( 10000 ) );
164
165 vIPNetworkUpCalls( &xEndPoint );
166
167 TEST_ASSERT_EQUAL( pdTRUE, xEndPoint.bits.bEndPointUp );
168 }
169
170 /**
171 * @brief test_FreeRTOS_NetworkDown_SendToIPTaskSuccessful
172 * To validate if FreeRTOS_NetworkDown calls queue send when it's called from IP task.
173 */
test_FreeRTOS_NetworkDown_SendToIPTaskSuccessful(void)174 void test_FreeRTOS_NetworkDown_SendToIPTaskSuccessful( void )
175 {
176 struct xNetworkInterface xNetworkInterface;
177
178 xIsCallingFromIPTask_ExpectAndReturn( pdTRUE );
179
180 xQueueGenericSend_ExpectAnyArgsAndReturn( pdPASS );
181
182 FreeRTOS_NetworkDown( &xNetworkInterface );
183
184 TEST_ASSERT_EQUAL( pdFALSE, xIsNetworkDownEventPending() );
185 }
186
187 /**
188 * @brief test_FreeRTOS_NetworkDown_SendToIPTaskNotSuccessful
189 * To validate if FreeRTOS_NetworkDown set network down event correctly when queue send failed.
190 */
test_FreeRTOS_NetworkDown_SendToIPTaskNotSuccessful(void)191 void test_FreeRTOS_NetworkDown_SendToIPTaskNotSuccessful( void )
192 {
193 struct xNetworkInterface xNetworkInterface;
194
195 xIsCallingFromIPTask_ExpectAndReturn( pdTRUE );
196
197 xQueueGenericSend_ExpectAnyArgsAndReturn( pdFAIL );
198
199 FreeRTOS_NetworkDown( &xNetworkInterface );
200
201 TEST_ASSERT_EQUAL( pdTRUE, xIsNetworkDownEventPending() );
202 }
203
204 /**
205 * @brief test_FreeRTOS_NetworkDownFromISR_SendToIPTaskSuccessful
206 * FreeRTOS_NetworkDownFromISR sends by xQueueGenericSendFromISR and return value is true.
207 */
test_FreeRTOS_NetworkDownFromISR_SendToIPTaskSuccessful(void)208 void test_FreeRTOS_NetworkDownFromISR_SendToIPTaskSuccessful( void )
209 {
210 BaseType_t xHasPriorityTaskAwoken = pdTRUE;
211 BaseType_t xReturn;
212 struct xNetworkInterface xNetworkInterface;
213
214 xQueueGenericSendFromISR_ExpectAnyArgsAndReturn( pdPASS );
215 xQueueGenericSendFromISR_ReturnThruPtr_pxHigherPriorityTaskWoken( &xHasPriorityTaskAwoken );
216
217 xReturn = FreeRTOS_NetworkDownFromISR( &xNetworkInterface );
218
219 TEST_ASSERT_EQUAL( pdFALSE, xIsNetworkDownEventPending() );
220 TEST_ASSERT_EQUAL( pdTRUE, xReturn );
221 }
222
223 /**
224 * @brief test_FreeRTOS_NetworkDownFromISR_SendToIPTaskUnsuccessful
225 * To validate if FreeRTOS_NetworkDownFromISR set network down event correct when send queue failed.
226 */
test_FreeRTOS_NetworkDownFromISR_SendToIPTaskUnsuccessful(void)227 void test_FreeRTOS_NetworkDownFromISR_SendToIPTaskUnsuccessful( void )
228 {
229 BaseType_t xHasPriorityTaskAwoken = pdFALSE;
230 BaseType_t xReturn;
231 struct xNetworkInterface xNetworkInterface;
232
233 xQueueGenericSendFromISR_ExpectAnyArgsAndReturn( pdFAIL );
234 xQueueGenericSendFromISR_ReturnThruPtr_pxHigherPriorityTaskWoken( &xHasPriorityTaskAwoken );
235
236 xReturn = FreeRTOS_NetworkDownFromISR( &xNetworkInterface );
237
238 TEST_ASSERT_EQUAL( pdTRUE, xIsNetworkDownEventPending() );
239 TEST_ASSERT_EQUAL( pdFALSE, xReturn );
240 }
241
242 /**
243 * @brief test_FreeRTOS_GetUDPPayloadBuffer_BlockTimeEqualToConfig
244 * To validate if FreeRTOS_GetUDPPayloadBuffer_Multi can return correct network buffer with maximum block time.
245 */
test_FreeRTOS_GetUDPPayloadBuffer_BlockTimeEqualToConfig(void)246 void test_FreeRTOS_GetUDPPayloadBuffer_BlockTimeEqualToConfig( void )
247 {
248 size_t uxRequestedSizeBytes = 300;
249 TickType_t uxBlockTimeTicks = ipconfigUDP_MAX_SEND_BLOCK_TIME_TICKS;
250 void * pvReturn;
251 NetworkBufferDescriptor_t xNetworkBuffer, * pxNetworkBuffer = &xNetworkBuffer;
252 uint8_t pucEthernetBuffer[ 1500 ];
253
254 /* Put the ethernet buffer in place. */
255 pxNetworkBuffer->pucEthernetBuffer = pucEthernetBuffer;
256 pxNetworkBuffer->xDataLength = 0;
257
258 pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( UDPPacket_t ) + uxRequestedSizeBytes, uxBlockTimeTicks, pxNetworkBuffer );
259
260 pvReturn = FreeRTOS_GetUDPPayloadBuffer_Multi( uxRequestedSizeBytes, uxBlockTimeTicks, ipTYPE_IPv4 );
261
262 TEST_ASSERT_EQUAL( sizeof( UDPPacket_t ) + uxRequestedSizeBytes, pxNetworkBuffer->xDataLength );
263 TEST_ASSERT_EQUAL_PTR( &( pxNetworkBuffer->pucEthernetBuffer[ sizeof( UDPPacket_t ) ] ), pvReturn );
264 }
265
266 /**
267 * @brief test_FreeRTOS_GetUDPPayloadBuffer_BlockTimeLessThanConfig
268 * To validate if FreeRTOS_GetUDPPayloadBuffer_Multi can return correct network buffer with maximum block time - 1.
269 */
test_FreeRTOS_GetUDPPayloadBuffer_BlockTimeLessThanConfig(void)270 void test_FreeRTOS_GetUDPPayloadBuffer_BlockTimeLessThanConfig( void )
271 {
272 size_t uxRequestedSizeBytes = 300;
273 TickType_t uxBlockTimeTicks = ipconfigUDP_MAX_SEND_BLOCK_TIME_TICKS - 1;
274 void * pvReturn;
275 NetworkBufferDescriptor_t xNetworkBuffer, * pxNetworkBuffer = &xNetworkBuffer;
276 uint8_t pucEthernetBuffer[ 1500 ];
277
278 /* Put the ethernet buffer in place. */
279 pxNetworkBuffer->pucEthernetBuffer = pucEthernetBuffer;
280 pxNetworkBuffer->xDataLength = 0;
281
282 pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( UDPPacket_t ) + uxRequestedSizeBytes, uxBlockTimeTicks, pxNetworkBuffer );
283
284 pvReturn = FreeRTOS_GetUDPPayloadBuffer_Multi( uxRequestedSizeBytes, uxBlockTimeTicks, ipTYPE_IPv4 );
285
286 TEST_ASSERT_EQUAL( sizeof( UDPPacket_t ) + uxRequestedSizeBytes, pxNetworkBuffer->xDataLength );
287 TEST_ASSERT_EQUAL_PTR( &( pxNetworkBuffer->pucEthernetBuffer[ sizeof( UDPPacket_t ) ] ), pvReturn );
288 }
289
290 /**
291 * @brief test_FreeRTOS_GetUDPPayloadBuffer_BlockTimeMoreThanConfig
292 * To validate if FreeRTOS_GetUDPPayloadBuffer_Multi can return correct network buffer with maximum block time + 1.
293 * And the block time is reduced to maximum block time.
294 */
test_FreeRTOS_GetUDPPayloadBuffer_BlockTimeMoreThanConfig(void)295 void test_FreeRTOS_GetUDPPayloadBuffer_BlockTimeMoreThanConfig( void )
296 {
297 size_t uxRequestedSizeBytes = 300;
298 TickType_t uxBlockTimeTicks = ipconfigUDP_MAX_SEND_BLOCK_TIME_TICKS + 1;
299 void * pvReturn;
300 NetworkBufferDescriptor_t xNetworkBuffer, * pxNetworkBuffer = &xNetworkBuffer;
301 uint8_t pucEthernetBuffer[ 1500 ];
302
303 /* Put the ethernet buffer in place. */
304 pxNetworkBuffer->pucEthernetBuffer = pucEthernetBuffer;
305 pxNetworkBuffer->xDataLength = 0;
306
307 pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( UDPPacket_t ) + uxRequestedSizeBytes, ipconfigUDP_MAX_SEND_BLOCK_TIME_TICKS, pxNetworkBuffer );
308
309 pvReturn = FreeRTOS_GetUDPPayloadBuffer_Multi( uxRequestedSizeBytes, uxBlockTimeTicks, ipTYPE_IPv4 );
310
311 TEST_ASSERT_EQUAL( sizeof( UDPPacket_t ) + uxRequestedSizeBytes, pxNetworkBuffer->xDataLength );
312 TEST_ASSERT_EQUAL_PTR( &( pxNetworkBuffer->pucEthernetBuffer[ sizeof( UDPPacket_t ) ] ), pvReturn );
313 }
314
315 /**
316 * @brief test_FreeRTOS_GetUDPPayloadBuffer_BlockTimeMoreThanConfig_NULLBufferReturned
317 * To validate if FreeRTOS_GetUDPPayloadBuffer_Multi can return NULL when pxGetNetworkBufferWithDescriptor returns NULL.
318 */
test_FreeRTOS_GetUDPPayloadBuffer_BlockTimeMoreThanConfig_NULLBufferReturned(void)319 void test_FreeRTOS_GetUDPPayloadBuffer_BlockTimeMoreThanConfig_NULLBufferReturned( void )
320 {
321 size_t uxRequestedSizeBytes = 300;
322 TickType_t uxBlockTimeTicks = ipconfigUDP_MAX_SEND_BLOCK_TIME_TICKS + 1;
323 void * pvReturn;
324
325 pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( UDPPacket_t ) + uxRequestedSizeBytes, ipconfigUDP_MAX_SEND_BLOCK_TIME_TICKS, NULL );
326
327 pvReturn = FreeRTOS_GetUDPPayloadBuffer_Multi( uxRequestedSizeBytes, uxBlockTimeTicks, ipTYPE_IPv4 );
328
329 TEST_ASSERT_NULL( pvReturn );
330 }
331
332 /**
333 * @brief test_FreeRTOS_GetUDPPayloadBuffer_UnknownType
334 * To validate if FreeRTOS_GetUDPPayloadBuffer_Multi can trigger assertion when the input type is neither IPv4 nor IPv6.
335 */
test_FreeRTOS_GetUDPPayloadBuffer_UnknownType(void)336 void test_FreeRTOS_GetUDPPayloadBuffer_UnknownType( void )
337 {
338 size_t uxRequestedSizeBytes = 300;
339 TickType_t uxBlockTimeTicks = ipconfigUDP_MAX_SEND_BLOCK_TIME_TICKS;
340
341 catch_assert( FreeRTOS_GetUDPPayloadBuffer_Multi( uxRequestedSizeBytes, uxBlockTimeTicks, 0xFF ) );
342 }
343
344 /**
345 * @brief test_FreeRTOS_GetUDPPayloadBuffer_BlockTimeEqualToConfig_IPv6
346 * To validate if FreeRTOS_GetUDPPayloadBuffer_Multi can return correct network buffer for IPv6.
347 */
test_FreeRTOS_GetUDPPayloadBuffer_BlockTimeEqualToConfig_IPv6(void)348 void test_FreeRTOS_GetUDPPayloadBuffer_BlockTimeEqualToConfig_IPv6( void )
349 {
350 size_t uxRequestedSizeBytes = 300;
351 TickType_t uxBlockTimeTicks = ipconfigUDP_MAX_SEND_BLOCK_TIME_TICKS;
352 void * pvReturn;
353 NetworkBufferDescriptor_t xNetworkBuffer, * pxNetworkBuffer = &xNetworkBuffer;
354 uint8_t pucEthernetBuffer[ 1500 ];
355
356 /* Put the ethernet buffer in place. */
357 pxNetworkBuffer->pucEthernetBuffer = pucEthernetBuffer;
358 pxNetworkBuffer->xDataLength = 0;
359
360 pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( UDPPacket_IPv6_t ) + uxRequestedSizeBytes, uxBlockTimeTicks, pxNetworkBuffer );
361
362 pvReturn = FreeRTOS_GetUDPPayloadBuffer_Multi( uxRequestedSizeBytes, uxBlockTimeTicks, ipTYPE_IPv6 );
363
364 TEST_ASSERT_EQUAL( sizeof( UDPPacket_IPv6_t ) + uxRequestedSizeBytes, pxNetworkBuffer->xDataLength );
365 TEST_ASSERT_EQUAL_PTR( &( pxNetworkBuffer->pucEthernetBuffer[ sizeof( UDPPacket_IPv6_t ) ] ), pvReturn );
366 }
367
368 /**
369 * @brief test_FreeRTOS_ReleaseUDPPayloadBuffer
370 * To validate if FreeRTOS_ReleaseUDPPayloadBuffer release the correct pointer of buffer.
371 */
test_FreeRTOS_ReleaseUDPPayloadBuffer(void)372 void test_FreeRTOS_ReleaseUDPPayloadBuffer( void )
373 {
374 void * pvBuffer = ( void * ) 0xFFCDEA;
375
376 pxUDPPayloadBuffer_to_NetworkBuffer_ExpectAndReturn( pvBuffer, ( NetworkBufferDescriptor_t * ) 0x12123434 );
377 vReleaseNetworkBufferAndDescriptor_Expect( ( NetworkBufferDescriptor_t * ) 0x12123434 );
378
379 FreeRTOS_ReleaseUDPPayloadBuffer( pvBuffer );
380 }
381
382 /**
383 * @brief test_FreeRTOS_ReleaseUDPPayloadBuffer_NullNetworkDescriptor
384 * To validate if FreeRTOS_ReleaseUDPPayloadBuffer triggers assertion when network descriptor is NULL.
385 */
test_FreeRTOS_ReleaseUDPPayloadBuffer_NullNetworkDescriptor(void)386 void test_FreeRTOS_ReleaseUDPPayloadBuffer_NullNetworkDescriptor( void )
387 {
388 pxUDPPayloadBuffer_to_NetworkBuffer_ExpectAndReturn( NULL, ( NetworkBufferDescriptor_t * ) NULL );
389
390 catch_assert( FreeRTOS_ReleaseUDPPayloadBuffer( NULL ) );
391 }
392
393 /**
394 * @brief test_FreeRTOS_ReleaseTCPPayloadBuffer_IncorrectBufferAssert
395 * The input buffer pointer must be obtained by calling FreeRTOS_recv() with the FREERTOS_ZERO_COPY flag.
396 * Trigger assertion if the input buffer pointer is different from pointer returned from stream buffer API.
397 */
test_FreeRTOS_ReleaseTCPPayloadBuffer_IncorrectBufferAssert(void)398 void test_FreeRTOS_ReleaseTCPPayloadBuffer_IncorrectBufferAssert( void )
399 {
400 FreeRTOS_Socket_t xSocket;
401 BaseType_t xByteCount = 100;
402
403 memset( &xSocket, 0, sizeof( xSocket ) );
404
405 uxStreamBufferGetPtr_Stub( StubuxStreamBufferGetPtr_ReturnBadAddress );
406
407 catch_assert( FreeRTOS_ReleaseTCPPayloadBuffer( &xSocket, ReleaseTCPPayloadBuffer, xByteCount ) );
408 }
409
410 /**
411 * @brief test_FreeRTOS_ReleaseTCPPayloadBuffer_IncorrectSizeAssert
412 * To validate if FreeRTOS_ReleaseTCPPayloadBuffer triggers assertion when available buffer size
413 * is less than input length.
414 */
test_FreeRTOS_ReleaseTCPPayloadBuffer_IncorrectSizeAssert(void)415 void test_FreeRTOS_ReleaseTCPPayloadBuffer_IncorrectSizeAssert( void )
416 {
417 FreeRTOS_Socket_t xSocket;
418
419 memset( &xSocket, 0, sizeof( xSocket ) );
420
421 uxStreamBufferGetPtr_Stub( StubuxStreamBufferGetPtr_ReturnIncorrectSize );
422
423 catch_assert( FreeRTOS_ReleaseTCPPayloadBuffer( &xSocket, ReleaseTCPPayloadBuffer, ReleaseTCPPayloadBufferxByteCount ) );
424 }
425
426 /**
427 * @brief test_FreeRTOS_ReleaseTCPPayloadBuffer_IncorrectBytesReleasedAssert
428 * To validate if FreeRTOS_ReleaseTCPPayloadBuffer triggers assertion when bytes
429 * released from FreeRTOS_recv() is different from request.
430 */
test_FreeRTOS_ReleaseTCPPayloadBuffer_IncorrectBytesReleasedAssert(void)431 void test_FreeRTOS_ReleaseTCPPayloadBuffer_IncorrectBytesReleasedAssert( void )
432 {
433 FreeRTOS_Socket_t xSocket;
434
435 memset( &xSocket, 0, sizeof( xSocket ) );
436
437 uxStreamBufferGetPtr_Stub( StubuxStreamBufferGetPtr_ReturnCorrectVals );
438
439 FreeRTOS_recv_ExpectAndReturn( &xSocket, NULL, ReleaseTCPPayloadBufferxByteCount, FREERTOS_MSG_DONTWAIT, ( ReleaseTCPPayloadBufferxByteCount >> 1 ) );
440
441 catch_assert( FreeRTOS_ReleaseTCPPayloadBuffer( &xSocket, ReleaseTCPPayloadBuffer, ReleaseTCPPayloadBufferxByteCount ) );
442 }
443
444 /**
445 * @brief test_FreeRTOS_ReleaseTCPPayloadBuffer_HappyPath
446 * To validate happy path for FreeRTOS_ReleaseTCPPayloadBuffer.
447 */
test_FreeRTOS_ReleaseTCPPayloadBuffer_HappyPath(void)448 void test_FreeRTOS_ReleaseTCPPayloadBuffer_HappyPath( void )
449 {
450 FreeRTOS_Socket_t xSocket;
451 BaseType_t xReturn;
452
453 memset( &xSocket, 0, sizeof( xSocket ) );
454
455 uxStreamBufferGetPtr_Stub( StubuxStreamBufferGetPtr_ReturnCorrectVals );
456
457 FreeRTOS_recv_ExpectAndReturn( &xSocket, NULL, ReleaseTCPPayloadBufferxByteCount, FREERTOS_MSG_DONTWAIT, ReleaseTCPPayloadBufferxByteCount );
458
459 xReturn = FreeRTOS_ReleaseTCPPayloadBuffer( &xSocket, ReleaseTCPPayloadBuffer, ReleaseTCPPayloadBufferxByteCount );
460
461 TEST_ASSERT_EQUAL( pdPASS, xReturn );
462 }
463
464 /**
465 * @brief test_prvIPTask
466 * Check if prvIPTask() initialize functionalities and state variables as expected.
467 */
test_prvIPTask(void)468 void test_prvIPTask( void )
469 {
470 /* Reset the static variable. */
471 xIPTaskInitialised = pdFALSE;
472
473 /* In prvIPTask_Initialise. */
474 vNetworkTimerReload_Ignore();
475
476 /* In prvIPTask_Initialise. */
477 vTCPTimerReload_ExpectAnyArgs();
478 vIPSetARPResolutionTimerEnableState_Expect( pdFALSE );
479 vDNSInitialise_Ignore();
480 FreeRTOS_dnsclear_Ignore();
481
482 /* In prvIPTask. */
483 ipFOREVER_ExpectAndReturn( 0 );
484
485 /* Parameters do not matter here. */
486 prvIPTask( NULL );
487
488 TEST_ASSERT_EQUAL( pdTRUE, xIPTaskInitialised );
489 TEST_ASSERT_EQUAL( pdFALSE, xNetworkDownEventPending );
490 }
491
492 /**
493 * @brief test_prvIPTask_NetworkDown
494 * Check if prvIPTask() handles the network down event normally.
495 */
test_prvIPTask_NetworkDown(void)496 void test_prvIPTask_NetworkDown( void )
497 {
498 NetworkInterface_t xNetworkInterface;
499 IPStackEvent_t xDownEvent;
500
501 memset( &xNetworkInterface, 0, sizeof( xNetworkInterface ) );
502 pxNetworkInterfaces = &xNetworkInterface;
503
504 xDownEvent.eEventType = eNetworkDownEvent;
505 xDownEvent.pvData = &xNetworkInterface;
506
507 /* Reset the static variable. */
508 xIPTaskInitialised = pdFALSE;
509
510 /* In prvIPTask_Initialise. */
511 vNetworkTimerReload_Ignore();
512
513 /* In FreeRTOS_NetworkDown. */
514 xIsCallingFromIPTask_ExpectAndReturn( pdTRUE );
515 xQueueGenericSend_ExpectAnyArgsAndReturn( pdPASS );
516
517 /* In prvIPTask_Initialise. */
518 vTCPTimerReload_ExpectAnyArgs();
519 vIPSetARPResolutionTimerEnableState_Expect( pdFALSE );
520 vDNSInitialise_Ignore();
521 FreeRTOS_dnsclear_Ignore();
522
523 /* In prvIPTask. */
524 ipFOREVER_ExpectAndReturn( pdTRUE );
525
526 /* In prvProcessIPEventsAndTimers. */
527 vCheckNetworkTimers_Ignore();
528 xCalculateSleepTime_ExpectAndReturn( 0 );
529 xQueueReceive_ExpectAnyArgsAndReturn( pdTRUE );
530 xQueueReceive_ReturnMemThruPtr_pvBuffer( &xDownEvent, sizeof( xDownEvent ) );
531 prvProcessNetworkDownEvent_Expect( &xNetworkInterface );
532
533 /* In prvIPTask. */
534 ipFOREVER_ExpectAndReturn( pdFALSE );
535
536 /* Parameters do not matter here. */
537 prvIPTask( NULL );
538
539 TEST_ASSERT_EQUAL( pdTRUE, xIPTaskInitialised );
540 }
541
542 /**
543 * @brief test_prvProcessIPEventsAndTimers_NoEventReceived
544 * Check if prvProcessIPEventsAndTimers() runs normally without events.
545 */
test_prvProcessIPEventsAndTimers_NoEventReceived(void)546 void test_prvProcessIPEventsAndTimers_NoEventReceived( void )
547 {
548 vCheckNetworkTimers_Expect();
549
550 xCalculateSleepTime_ExpectAndReturn( 0 );
551
552 /* No event received. */
553 xQueueReceive_ExpectAnyArgsAndReturn( pdFALSE );
554
555 prvProcessIPEventsAndTimers();
556 }
557
558 /**
559 * @brief test_prvProcessIPEventsAndTimers_eNetworkRxEventNULL
560 * Check if prvProcessIPEventsAndTimers() triggers assertion when data pointer is NULL in eNetworkRxEvent.
561 */
test_prvProcessIPEventsAndTimers_eNetworkRxEventNULL(void)562 void test_prvProcessIPEventsAndTimers_eNetworkRxEventNULL( void )
563 {
564 IPStackEvent_t xReceivedEvent;
565
566 xReceivedEvent.eEventType = eNetworkRxEvent;
567 xReceivedEvent.pvData = NULL;
568
569 /* prvProcessIPEventsAndTimers */
570 vCheckNetworkTimers_Expect();
571 xCalculateSleepTime_ExpectAndReturn( 0 );
572 xQueueReceive_ExpectAnyArgsAndReturn( pdTRUE );
573 xQueueReceive_ReturnMemThruPtr_pvBuffer( &xReceivedEvent, sizeof( xReceivedEvent ) );
574
575 catch_assert( prvProcessIPEventsAndTimers() );
576 }
577
578 /**
579 * @brief test_prvProcessIPEventsAndTimers_eNetworkRxEvent
580 * Check if prvProcessIPEventsAndTimers() triggers assertion when data pointer is NULL in eNetworkRxEvent.
581 */
test_prvProcessIPEventsAndTimers_eNetworkRxEvent(void)582 void test_prvProcessIPEventsAndTimers_eNetworkRxEvent( void )
583 {
584 IPStackEvent_t xReceivedEvent;
585 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
586 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
587 EthernetHeader_t * pxEthernetHeader;
588
589 pxNetworkBuffer = &xNetworkBuffer;
590 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
591 pxNetworkBuffer->xDataLength = sizeof( EthernetHeader_t ) - 1;
592 pxEthernetHeader = ( EthernetHeader_t * ) pxNetworkBuffer->pucEthernetBuffer;
593
594 xReceivedEvent.eEventType = eNetworkRxEvent;
595 xReceivedEvent.pvData = pxNetworkBuffer;
596
597 /* Put an unknown frame type for prvProcessEthernetPacket to release buffer directly. */
598 pxEthernetHeader->usFrameType = 0xFF;
599
600 /* prvProcessIPEventsAndTimers */
601 vCheckNetworkTimers_Expect();
602 xCalculateSleepTime_ExpectAndReturn( 0 );
603 xQueueReceive_ExpectAnyArgsAndReturn( pdTRUE );
604 xQueueReceive_ReturnMemThruPtr_pvBuffer( &xReceivedEvent, sizeof( xReceivedEvent ) );
605
606 /* prvProcessEthernetPacket */
607 vReleaseNetworkBufferAndDescriptor_Expect( pxNetworkBuffer );
608
609 prvProcessIPEventsAndTimers();
610 }
611
612 /**
613 * @brief test_prvProcessIPEventsAndTimers_eNetworkTxEvent
614 * Check if prvProcessIPEventsAndTimers() transmits data through network interface with eNetworkTxEvent.
615 */
test_prvProcessIPEventsAndTimers_eNetworkTxEvent(void)616 void test_prvProcessIPEventsAndTimers_eNetworkTxEvent( void )
617 {
618 struct xNetworkInterface xInterface;
619 IPStackEvent_t xReceivedEvent;
620 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
621 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
622
623 pxNetworkBuffer = &xNetworkBuffer;
624 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
625 pxNetworkBuffer->xDataLength = sizeof( EthernetHeader_t ) - 1;
626 pxNetworkBuffer->pxInterface = &xInterface;
627
628 NetworkInterfaceOutputFunction_Stub_Called = 0;
629 pxNetworkBuffer->pxInterface->pfOutput = &NetworkInterfaceOutputFunction_Stub;
630
631 xReceivedEvent.eEventType = eNetworkTxEvent;
632 xReceivedEvent.pvData = pxNetworkBuffer;
633 xNetworkDownEventPending = pdFALSE;
634
635 /* prvProcessIPEventsAndTimers */
636 vCheckNetworkTimers_Expect();
637 xCalculateSleepTime_ExpectAndReturn( 0 );
638 xQueueReceive_ExpectAnyArgsAndReturn( pdTRUE );
639 xQueueReceive_ReturnMemThruPtr_pvBuffer( &xReceivedEvent, sizeof( xReceivedEvent ) );
640
641 NetworkInterfaceOutputFunction_Stub_Called = 0;
642
643 prvProcessIPEventsAndTimers();
644
645 TEST_ASSERT_EQUAL( 1, NetworkInterfaceOutputFunction_Stub_Called );
646 }
647
648 /**
649 * @brief test_prvProcessIPEventsAndTimers_eNetworkTxEvent_NullInterface
650 * Check if prvProcessIPEventsAndTimers() skip transmitting data through network interface
651 * when network interface pointer is NULL.
652 */
test_prvProcessIPEventsAndTimers_eNetworkTxEvent_NullInterface(void)653 void test_prvProcessIPEventsAndTimers_eNetworkTxEvent_NullInterface( void )
654 {
655 IPStackEvent_t xReceivedEvent;
656 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
657 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
658
659 pxNetworkBuffer = &xNetworkBuffer;
660 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
661 pxNetworkBuffer->xDataLength = sizeof( EthernetHeader_t ) - 1;
662 pxNetworkBuffer->pxInterface = NULL;
663
664 NetworkInterfaceOutputFunction_Stub_Called = 0;
665
666 xReceivedEvent.eEventType = eNetworkTxEvent;
667 xReceivedEvent.pvData = pxNetworkBuffer;
668 xNetworkDownEventPending = pdFALSE;
669
670 /* prvProcessIPEventsAndTimers */
671 vCheckNetworkTimers_Expect();
672 xCalculateSleepTime_ExpectAndReturn( 0 );
673 xQueueReceive_ExpectAnyArgsAndReturn( pdTRUE );
674 xQueueReceive_ReturnMemThruPtr_pvBuffer( &xReceivedEvent, sizeof( xReceivedEvent ) );
675
676 prvProcessIPEventsAndTimers();
677 }
678
679 /**
680 * @brief test_prvProcessIPEventsAndTimers_eARPTimerEvent
681 * Check if prvProcessIPEventsAndTimers() updates the cache for ARP/ND when timeout event triggered.
682 */
test_prvProcessIPEventsAndTimers_eARPTimerEvent(void)683 void test_prvProcessIPEventsAndTimers_eARPTimerEvent( void )
684 {
685 IPStackEvent_t xReceivedEvent;
686
687 xReceivedEvent.eEventType = eARPTimerEvent;
688 xReceivedEvent.pvData = NULL;
689
690 /* prvProcessIPEventsAndTimers */
691 vCheckNetworkTimers_Expect();
692 xCalculateSleepTime_ExpectAndReturn( 0 );
693 xQueueReceive_ExpectAnyArgsAndReturn( pdTRUE );
694 xQueueReceive_ReturnMemThruPtr_pvBuffer( &xReceivedEvent, sizeof( xReceivedEvent ) );
695 vARPAgeCache_Expect();
696 vNDAgeCache_Expect();
697
698 prvProcessIPEventsAndTimers();
699 }
700
701 /**
702 * @brief test_prvProcessIPEventsAndTimers_eSocketBindEvent
703 * To validate if prvProcessIPEventsAndTimers() binds IPv4 socket with its address/port successfully
704 * with eSocketBindEvent.
705 */
test_prvProcessIPEventsAndTimers_eSocketBindEvent(void)706 void test_prvProcessIPEventsAndTimers_eSocketBindEvent( void )
707 {
708 IPStackEvent_t xReceivedEvent;
709 FreeRTOS_Socket_t xSocket;
710
711 xReceivedEvent.eEventType = eSocketBindEvent;
712 xReceivedEvent.pvData = &xSocket;
713
714 xSocket.usLocalPort = ( uint16_t ) ~0U;
715 xSocket.xEventBits = 0;
716 xSocket.bits.bIsIPv6 = pdFALSE_UNSIGNED;
717
718 /* prvProcessIPEventsAndTimers */
719 vCheckNetworkTimers_Expect();
720 xCalculateSleepTime_ExpectAndReturn( 0 );
721 xQueueReceive_ExpectAnyArgsAndReturn( pdTRUE );
722 xQueueReceive_ReturnMemThruPtr_pvBuffer( &xReceivedEvent, sizeof( xReceivedEvent ) );
723 vSocketBind_ExpectAndReturn( &xSocket, NULL, sizeof( struct freertos_sockaddr ), pdFALSE, 0 );
724 vSocketBind_IgnoreArg_pxBindAddress();
725 vSocketWakeUpUser_Expect( &xSocket );
726
727 prvProcessIPEventsAndTimers();
728
729 TEST_ASSERT_EQUAL( 0, xSocket.usLocalPort );
730 TEST_ASSERT_EQUAL( eSOCKET_BOUND, xSocket.xEventBits | eSOCKET_BOUND );
731 }
732
733 /**
734 * @brief test_prvProcessIPEventsAndTimers_eSocketBindEvent_IPv6
735 * To validate if prvProcessIPEventsAndTimers() binds IPv6 socket with its address/port successfully
736 * with eSocketBindEvent.
737 */
test_prvProcessIPEventsAndTimers_eSocketBindEvent_IPv6(void)738 void test_prvProcessIPEventsAndTimers_eSocketBindEvent_IPv6( void )
739 {
740 IPStackEvent_t xReceivedEvent;
741 FreeRTOS_Socket_t xSocket;
742
743 xReceivedEvent.eEventType = eSocketBindEvent;
744 xReceivedEvent.pvData = &xSocket;
745
746 xSocket.usLocalPort = ( uint16_t ) ~0U;
747 xSocket.xEventBits = 0;
748 xSocket.bits.bIsIPv6 = pdTRUE_UNSIGNED;
749
750 /* prvProcessIPEventsAndTimers */
751 vCheckNetworkTimers_Expect();
752 xCalculateSleepTime_ExpectAndReturn( 0 );
753 xQueueReceive_ExpectAnyArgsAndReturn( pdTRUE );
754 xQueueReceive_ReturnMemThruPtr_pvBuffer( &xReceivedEvent, sizeof( xReceivedEvent ) );
755 vSocketBind_ExpectAndReturn( &xSocket, NULL, sizeof( struct freertos_sockaddr ), pdFALSE, 0 );
756 vSocketBind_IgnoreArg_pxBindAddress();
757 vSocketWakeUpUser_Expect( &xSocket );
758
759 prvProcessIPEventsAndTimers();
760
761 TEST_ASSERT_EQUAL( 0, xSocket.usLocalPort );
762 TEST_ASSERT_EQUAL( eSOCKET_BOUND, xSocket.xEventBits | eSOCKET_BOUND );
763 }
764
765 /**
766 * @brief test_prvProcessIPEventsAndTimers_eSocketCloseEvent
767 * To validate if prvProcessIPEventsAndTimers() close socket successfully with eSocketCloseEvent.
768 */
test_prvProcessIPEventsAndTimers_eSocketCloseEvent(void)769 void test_prvProcessIPEventsAndTimers_eSocketCloseEvent( void )
770 {
771 IPStackEvent_t xReceivedEvent;
772 FreeRTOS_Socket_t xSocket;
773
774 xReceivedEvent.eEventType = eSocketCloseEvent;
775 xReceivedEvent.pvData = &xSocket;
776
777 xSocket.usLocalPort = ( uint16_t ) ~0U;
778 xSocket.xEventBits = 0;
779
780 /* prvProcessIPEventsAndTimers */
781 vCheckNetworkTimers_Expect();
782 xCalculateSleepTime_ExpectAndReturn( 0 );
783 xQueueReceive_ExpectAnyArgsAndReturn( pdTRUE );
784 xQueueReceive_ReturnMemThruPtr_pvBuffer( &xReceivedEvent, sizeof( xReceivedEvent ) );
785 vSocketClose_ExpectAndReturn( &xSocket, 0 );
786
787 prvProcessIPEventsAndTimers();
788 }
789
790 /**
791 * @brief test_prvProcessIPEventsAndTimers_eStackTxEvent
792 * To validate if prvProcessIPEventsAndTimers() calls vProcessGeneratedUDPPacket() to handle
793 * eStackTxEvent for sending UDP/ping.
794 */
test_prvProcessIPEventsAndTimers_eStackTxEvent(void)795 void test_prvProcessIPEventsAndTimers_eStackTxEvent( void )
796 {
797 IPStackEvent_t xReceivedEvent;
798 NetworkBufferDescriptor_t xNetworkBuffer;
799
800 xReceivedEvent.eEventType = eStackTxEvent;
801 xReceivedEvent.pvData = &xNetworkBuffer;
802
803 /* prvProcessIPEventsAndTimers */
804 vCheckNetworkTimers_Expect();
805 xCalculateSleepTime_ExpectAndReturn( 0 );
806 xQueueReceive_ExpectAnyArgsAndReturn( pdTRUE );
807 xQueueReceive_ReturnMemThruPtr_pvBuffer( &xReceivedEvent, sizeof( xReceivedEvent ) );
808 vProcessGeneratedUDPPacket_Expect( &xNetworkBuffer );
809
810 prvProcessIPEventsAndTimers();
811 }
812
813 /**
814 * @brief test_prvProcessIPEventsAndTimers_eDHCPEvent
815 * To validate if prvProcessIPEventsAndTimers() calls vDHCPProcess() to handle eDHCPEvent.
816 */
test_prvProcessIPEventsAndTimers_eDHCPEvent(void)817 void test_prvProcessIPEventsAndTimers_eDHCPEvent( void )
818 {
819 IPStackEvent_t xReceivedEvent;
820 uint32_t ulDHCPEvent = 0x1234;
821 NetworkEndPoint_t xEndPoints, * pxEndPoints = &xEndPoints;
822
823 memset( pxEndPoints, 0, sizeof( NetworkEndPoint_t ) );
824 pxEndPoints->bits.bWantDHCP = pdTRUE_UNSIGNED;
825 pxEndPoints->bits.bIPv6 = pdFALSE_UNSIGNED;
826
827 xReceivedEvent.eEventType = eDHCPEvent;
828 xReceivedEvent.pvData = pxEndPoints;
829
830 /* prvProcessIPEventsAndTimers */
831 vCheckNetworkTimers_Expect();
832 xCalculateSleepTime_ExpectAndReturn( 0 );
833 xQueueReceive_ExpectAnyArgsAndReturn( pdTRUE );
834 xQueueReceive_ReturnMemThruPtr_pvBuffer( &xReceivedEvent, sizeof( xReceivedEvent ) );
835 vDHCPProcess_Expect( pdFALSE, pxEndPoints );
836
837 prvProcessIPEventsAndTimers();
838 }
839
840 /**
841 * @brief test_prvProcessIPEventsAndTimers_eSocketSelectEvent
842 * To validate if prvProcessIPEventsAndTimers() calls vSocketSelect() to handle eSocketSelectEvent.
843 */
test_prvProcessIPEventsAndTimers_eSocketSelectEvent(void)844 void test_prvProcessIPEventsAndTimers_eSocketSelectEvent( void )
845 {
846 IPStackEvent_t xReceivedEvent;
847 uint32_t ulData = 0x1234;
848
849 xReceivedEvent.eEventType = eSocketSelectEvent;
850 xReceivedEvent.pvData = ( void * ) ulData;
851
852 /* prvProcessIPEventsAndTimers */
853 vCheckNetworkTimers_Expect();
854 xCalculateSleepTime_ExpectAndReturn( 0 );
855 xQueueReceive_ExpectAnyArgsAndReturn( pdTRUE );
856 xQueueReceive_ReturnMemThruPtr_pvBuffer( &xReceivedEvent, sizeof( xReceivedEvent ) );
857 vSocketSelect_Expect( ( SocketSelect_t * ) ulData );
858
859 prvProcessIPEventsAndTimers();
860 }
861
862 /**
863 * @brief test_prvProcessIPEventsAndTimers_eSocketSelectEvent
864 * To validate if prvProcessIPEventsAndTimers() calls FreeRTOS_SignalSocket() to handle eSocketSignalEvent.
865 */
test_prvProcessIPEventsAndTimers_eSocketSignalEvent(void)866 void test_prvProcessIPEventsAndTimers_eSocketSignalEvent( void )
867 {
868 IPStackEvent_t xReceivedEvent;
869 uint32_t ulData = 0x1234;
870
871 xReceivedEvent.eEventType = eSocketSignalEvent;
872 xReceivedEvent.pvData = ( void * ) ulData;
873
874 /* prvProcessIPEventsAndTimers */
875 vCheckNetworkTimers_Expect();
876 xCalculateSleepTime_ExpectAndReturn( 0 );
877 xQueueReceive_ExpectAnyArgsAndReturn( pdTRUE );
878 xQueueReceive_ReturnMemThruPtr_pvBuffer( &xReceivedEvent, sizeof( xReceivedEvent ) );
879 FreeRTOS_SignalSocket_ExpectAndReturn( ( Socket_t ) ulData, 0 );
880
881 prvProcessIPEventsAndTimers();
882 }
883
884 /**
885 * @brief test_prvProcessIPEventsAndTimers_eTCPTimerEvent
886 * To validate if prvProcessIPEventsAndTimers() calls vIPSetTCPTimerExpiredState() to handle eTCPTimerEvent.
887 */
test_prvProcessIPEventsAndTimers_eTCPTimerEvent(void)888 void test_prvProcessIPEventsAndTimers_eTCPTimerEvent( void )
889 {
890 IPStackEvent_t xReceivedEvent;
891
892 xReceivedEvent.eEventType = eTCPTimerEvent;
893
894 /* prvProcessIPEventsAndTimers */
895 vCheckNetworkTimers_Expect();
896 xCalculateSleepTime_ExpectAndReturn( 0 );
897 xQueueReceive_ExpectAnyArgsAndReturn( pdTRUE );
898 xQueueReceive_ReturnMemThruPtr_pvBuffer( &xReceivedEvent, sizeof( xReceivedEvent ) );
899 vIPSetTCPTimerExpiredState_Expect( pdTRUE );
900
901 prvProcessIPEventsAndTimers();
902 }
903
904 /**
905 * @brief test_prvProcessIPEventsAndTimers_eTCPTimerEvent
906 * To validate if prvProcessIPEventsAndTimers() calls xTCPCheckNewClient() to handle eTCPAcceptEvent
907 * without new client comes.
908 */
test_prvProcessIPEventsAndTimers_eTCPAcceptEvent_NoNewClient(void)909 void test_prvProcessIPEventsAndTimers_eTCPAcceptEvent_NoNewClient( void )
910 {
911 IPStackEvent_t xReceivedEvent;
912 FreeRTOS_Socket_t xSocket;
913
914 xReceivedEvent.eEventType = eTCPAcceptEvent;
915 xReceivedEvent.pvData = &xSocket;
916
917 xSocket.xEventBits = 0;
918
919 /* prvProcessIPEventsAndTimers */
920 vCheckNetworkTimers_Expect();
921 xCalculateSleepTime_ExpectAndReturn( 0 );
922 xQueueReceive_ExpectAnyArgsAndReturn( pdTRUE );
923 xQueueReceive_ReturnMemThruPtr_pvBuffer( &xReceivedEvent, sizeof( xReceivedEvent ) );
924 xTCPCheckNewClient_ExpectAndReturn( &xSocket, pdFALSE );
925
926 prvProcessIPEventsAndTimers();
927
928 TEST_ASSERT_EQUAL( 0, xSocket.xEventBits );
929 }
930
931 /**
932 * @brief test_prvProcessIPEventsAndTimers_eTCPTimerEvent
933 * To validate if prvProcessIPEventsAndTimers() calls xTCPCheckNewClient() to handle eTCPAcceptEvent
934 * with new client comes.
935 */
test_prvProcessIPEventsAndTimers_eTCPAcceptEvent_NewClient(void)936 void test_prvProcessIPEventsAndTimers_eTCPAcceptEvent_NewClient( void )
937 {
938 IPStackEvent_t xReceivedEvent;
939 FreeRTOS_Socket_t xSocket;
940
941 xReceivedEvent.eEventType = eTCPAcceptEvent;
942 xReceivedEvent.pvData = &xSocket;
943
944 xSocket.xEventBits = 0;
945
946 /* prvProcessIPEventsAndTimers */
947 vCheckNetworkTimers_Expect();
948 xCalculateSleepTime_ExpectAndReturn( 0 );
949 xQueueReceive_ExpectAnyArgsAndReturn( pdTRUE );
950 xQueueReceive_ReturnMemThruPtr_pvBuffer( &xReceivedEvent, sizeof( xReceivedEvent ) );
951 xTCPCheckNewClient_ExpectAndReturn( &xSocket, pdTRUE );
952 vSocketWakeUpUser_Expect( &xSocket );
953
954 prvProcessIPEventsAndTimers();
955
956 TEST_ASSERT_EQUAL( eSOCKET_ACCEPT, xSocket.xEventBits | eSOCKET_ACCEPT );
957 }
958
959 /**
960 * @brief test_prvProcessIPEventsAndTimers_eTCPNetStat
961 * To validate if prvProcessIPEventsAndTimers() calls vTCPNetStat() to handle eTCPNetStat.
962 */
test_prvProcessIPEventsAndTimers_eTCPNetStat(void)963 void test_prvProcessIPEventsAndTimers_eTCPNetStat( void )
964 {
965 IPStackEvent_t xReceivedEvent;
966
967 xReceivedEvent.eEventType = eTCPNetStat;
968
969 /* prvProcessIPEventsAndTimers */
970 vCheckNetworkTimers_Expect();
971 xCalculateSleepTime_ExpectAndReturn( 0 );
972 xQueueReceive_ExpectAnyArgsAndReturn( pdTRUE );
973 xQueueReceive_ReturnMemThruPtr_pvBuffer( &xReceivedEvent, sizeof( xReceivedEvent ) );
974 vTCPNetStat_Expect();
975
976 prvProcessIPEventsAndTimers();
977 }
978
979 /**
980 * @brief test_prvProcessIPEventsAndTimers_eSocketSetDeleteEvent
981 * To validate if prvProcessIPEventsAndTimers() calls vEventGroupDelete() to handle eSocketSetDeleteEvent.
982 */
test_prvProcessIPEventsAndTimers_eSocketSetDeleteEvent(void)983 void test_prvProcessIPEventsAndTimers_eSocketSetDeleteEvent( void )
984 {
985 IPStackEvent_t xReceivedEvent;
986 SocketSelect_t * pxSocketSet = malloc( sizeof( SocketSelect_t ) );
987
988 xReceivedEvent.eEventType = eSocketSetDeleteEvent;
989 xReceivedEvent.pvData = pxSocketSet;
990
991 /* prvProcessIPEventsAndTimers */
992 vCheckNetworkTimers_Expect();
993 xCalculateSleepTime_ExpectAndReturn( 0 );
994 xQueueReceive_ExpectAnyArgsAndReturn( pdTRUE );
995 xQueueReceive_ReturnMemThruPtr_pvBuffer( &xReceivedEvent, sizeof( xReceivedEvent ) );
996 vEventGroupDelete_Expect( pxSocketSet->xSelectGroup );
997
998 prvProcessIPEventsAndTimers();
999 }
1000
1001 /**
1002 * @brief test_prvProcessIPEventsAndTimers_eSocketSetDeleteEvent_NetDownPending
1003 * To validate if prvProcessIPEventsAndTimers() handles pending network down events at the end function.
1004 */
test_prvProcessIPEventsAndTimers_eSocketSetDeleteEvent_NetDownPending(void)1005 void test_prvProcessIPEventsAndTimers_eSocketSetDeleteEvent_NetDownPending( void )
1006 {
1007 IPStackEvent_t xReceivedEvent;
1008 NetworkInterface_t xNetworkInterface[ 2 ], * pxInterface = &xNetworkInterface[ 1 ];
1009 SocketSelect_t * pxSocketSet = malloc( sizeof( SocketSelect_t ) );
1010
1011 xNetworkDownEventPending = pdTRUE;
1012 xNetworkInterface[ 0 ].bits.bCallDownEvent = pdFALSE_UNSIGNED;
1013 xNetworkInterface[ 1 ].bits.bCallDownEvent = pdTRUE_UNSIGNED;
1014
1015 xReceivedEvent.eEventType = eSocketSetDeleteEvent;
1016 xReceivedEvent.pvData = pxSocketSet;
1017
1018 /* prvProcessIPEventsAndTimers */
1019 vCheckNetworkTimers_Expect();
1020 xCalculateSleepTime_ExpectAndReturn( 0 );
1021 xQueueReceive_ExpectAnyArgsAndReturn( pdTRUE );
1022 xQueueReceive_ReturnMemThruPtr_pvBuffer( &xReceivedEvent, sizeof( xReceivedEvent ) );
1023 vEventGroupDelete_Expect( pxSocketSet->xSelectGroup );
1024
1025 /* prvIPTask_CheckPendingEvents */
1026 FreeRTOS_FirstNetworkInterface_ExpectAndReturn( &xNetworkInterface[ 0 ] );
1027 FreeRTOS_NextNetworkInterface_ExpectAndReturn( &xNetworkInterface[ 0 ], pxInterface );
1028 /* Since network down event is pending, a call to this function should be expected. */
1029 prvProcessNetworkDownEvent_Expect( pxInterface );
1030 FreeRTOS_NextNetworkInterface_ExpectAndReturn( pxInterface, NULL );
1031
1032 prvProcessIPEventsAndTimers();
1033
1034 TEST_ASSERT_EQUAL( pxInterface->bits.bCallDownEvent, pdFALSE_UNSIGNED );
1035 }
1036
1037 /**
1038 * @brief test_prvProcessIPEventsAndTimers_Error
1039 * To validate if prvProcessIPEventsAndTimers() ignores unknown event.
1040 */
test_prvProcessIPEventsAndTimers_Error(void)1041 void test_prvProcessIPEventsAndTimers_Error( void )
1042 {
1043 IPStackEvent_t xReceivedEvent;
1044
1045 xNetworkDownEventPending = pdFALSE;
1046
1047 xReceivedEvent.eEventType = eSocketSetDeleteEvent + 1;
1048
1049 /* prvProcessIPEventsAndTimers */
1050 vCheckNetworkTimers_Expect();
1051 xCalculateSleepTime_ExpectAndReturn( 0 );
1052 xQueueReceive_ExpectAnyArgsAndReturn( pdTRUE );
1053 xQueueReceive_ReturnMemThruPtr_pvBuffer( &xReceivedEvent, sizeof( xReceivedEvent ) );
1054
1055 prvProcessIPEventsAndTimers();
1056 }
1057
1058 /**
1059 * @brief test_FreeRTOS_SendPingRequest_HappyPath
1060 * To validate if FreeRTOS_SendPingRequest() prepares ping request and send an event to IP task.
1061 */
test_FreeRTOS_SendPingRequest_HappyPath(void)1062 void test_FreeRTOS_SendPingRequest_HappyPath( void )
1063 {
1064 BaseType_t xReturn;
1065 uint32_t ulIPAddress = 0xC0AB0101;
1066 /* 32 byte ping to send. */
1067 size_t uxNumberOfBytesToSend = 32;
1068 ICMPHeader_t * pxICMPHeader;
1069 EthernetHeader_t * pxEthernetHeader;
1070
1071 /* The value of blocking time doesn't matter since the test doesn't
1072 * actually block. */
1073 TickType_t uxBlockTimeTicks = 100;
1074
1075 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
1076 uint8_t pucEthernetBuffer[ ipconfigNETWORK_MTU - ( sizeof( IPHeader_t ) + sizeof( ICMPHeader_t ) ) ];
1077
1078 pxNetworkBuffer = &xNetworkBuffer;
1079 pxNetworkBuffer->pucEthernetBuffer = pucEthernetBuffer;
1080
1081 pxICMPHeader = ( ICMPHeader_t * ) &( pxNetworkBuffer->pucEthernetBuffer[ ipIP_PAYLOAD_OFFSET ] );
1082 pxEthernetHeader = ( EthernetHeader_t * ) pxNetworkBuffer->pucEthernetBuffer;
1083
1084 xIPTaskInitialised = pdTRUE;
1085
1086 /* FreeRTOS_SendPingRequest */
1087 /* At least 4 free network buffers must be there to send a ping. */
1088 uxGetNumberOfFreeNetworkBuffers_ExpectAndReturn( 4U );
1089 pxGetNetworkBufferWithDescriptor_ExpectAndReturn( uxNumberOfBytesToSend + sizeof( ICMPPacket_t ), uxBlockTimeTicks, pxNetworkBuffer );
1090
1091 /* xSendEventStructToIPTask */
1092 xIsCallingFromIPTask_ExpectAndReturn( pdTRUE );
1093 xQueueGenericSend_ExpectAnyArgsAndReturn( pdPASS );
1094
1095 xReturn = FreeRTOS_SendPingRequest( ulIPAddress, uxNumberOfBytesToSend, uxBlockTimeTicks );
1096
1097 TEST_ASSERT_EQUAL( 1, xReturn );
1098 TEST_ASSERT_EQUAL( 8 /* ipICMP_ECHO_REQUEST */, pxICMPHeader->ucTypeOfMessage );
1099 TEST_ASSERT_EQUAL( 0, pxICMPHeader->ucTypeOfService );
1100 TEST_ASSERT_EQUAL( 1, pxICMPHeader->usIdentifier );
1101 TEST_ASSERT_EQUAL( 1, pxICMPHeader->usSequenceNumber );
1102 TEST_ASSERT_EQUAL( ipIPv4_FRAME_TYPE, pxEthernetHeader->usFrameType );
1103 TEST_ASSERT_EQUAL( FREERTOS_SO_UDPCKSUM_OUT, pxNetworkBuffer->pucEthernetBuffer[ ipSOCKET_OPTIONS_OFFSET ] );
1104 TEST_ASSERT_EQUAL( ulIPAddress, pxNetworkBuffer->xIPAddress.ulIP_IPv4 );
1105 TEST_ASSERT_EQUAL( ipPACKET_CONTAINS_ICMP_DATA, pxNetworkBuffer->usPort );
1106 }
1107
1108 /**
1109 * @brief test_FreeRTOS_SendPingRequest_SendingToIPTaskFails
1110 * To validate if FreeRTOS_SendPingRequest() release the ping request packet when fail to send event.
1111 */
test_FreeRTOS_SendPingRequest_SendingToIPTaskFails(void)1112 void test_FreeRTOS_SendPingRequest_SendingToIPTaskFails( void )
1113 {
1114 BaseType_t xReturn;
1115 uint32_t ulIPAddress = 0xC0AB0101;
1116 /* 32 byte ping to send. */
1117 size_t uxNumberOfBytesToSend = 32;
1118 ICMPHeader_t * pxICMPHeader;
1119 EthernetHeader_t * pxEthernetHeader;
1120
1121 /* The value of blocking time doesn't matter since the test doesn't
1122 * actually block. */
1123 TickType_t uxBlockTimeTicks = 100;
1124
1125 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
1126 uint8_t pucEthernetBuffer[ ipconfigNETWORK_MTU - ( sizeof( IPHeader_t ) + sizeof( ICMPHeader_t ) ) ];
1127
1128 pxNetworkBuffer = &xNetworkBuffer;
1129 pxNetworkBuffer->pucEthernetBuffer = pucEthernetBuffer;
1130
1131 pxICMPHeader = ( ICMPHeader_t * ) &( pxNetworkBuffer->pucEthernetBuffer[ ipIP_PAYLOAD_OFFSET ] );
1132 pxEthernetHeader = ( EthernetHeader_t * ) pxNetworkBuffer->pucEthernetBuffer;
1133
1134 /* FreeRTOS_SendPingRequest */
1135 /* At least 4 free network buffers must be there to send a ping. */
1136 uxGetNumberOfFreeNetworkBuffers_ExpectAndReturn( 4U );
1137 pxGetNetworkBufferWithDescriptor_ExpectAndReturn( uxNumberOfBytesToSend + sizeof( ICMPPacket_t ), uxBlockTimeTicks, pxNetworkBuffer );
1138
1139 /* xSendEventStructToIPTask */
1140 xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
1141 xQueueGenericSend_ExpectAnyArgsAndReturn( pdFAIL );
1142
1143 /* FreeRTOS_SendPingRequest */
1144 vReleaseNetworkBufferAndDescriptor_Expect( pxNetworkBuffer );
1145
1146 xReturn = FreeRTOS_SendPingRequest( ulIPAddress, uxNumberOfBytesToSend, uxBlockTimeTicks );
1147
1148 TEST_ASSERT_EQUAL( pdFAIL, xReturn );
1149 TEST_ASSERT_EQUAL( 8 /* ipICMP_ECHO_REQUEST */, pxICMPHeader->ucTypeOfMessage );
1150 TEST_ASSERT_EQUAL( 0, pxICMPHeader->ucTypeOfService );
1151 TEST_ASSERT_EQUAL( 1, pxICMPHeader->usIdentifier );
1152 TEST_ASSERT_EQUAL( 1, pxICMPHeader->usSequenceNumber );
1153 TEST_ASSERT_EQUAL( ipIPv4_FRAME_TYPE, pxEthernetHeader->usFrameType );
1154 TEST_ASSERT_EQUAL( FREERTOS_SO_UDPCKSUM_OUT, pxNetworkBuffer->pucEthernetBuffer[ ipSOCKET_OPTIONS_OFFSET ] );
1155 TEST_ASSERT_EQUAL( ulIPAddress, pxNetworkBuffer->xIPAddress.ulIP_IPv4 );
1156 TEST_ASSERT_EQUAL( ipPACKET_CONTAINS_ICMP_DATA, pxNetworkBuffer->usPort );
1157 }
1158
1159 /**
1160 * @brief test_FreeRTOS_SendPingRequest_TooManyBytes
1161 * To validate if FreeRTOS_SendPingRequest() returns fail when input bytes is too large.
1162 */
test_FreeRTOS_SendPingRequest_TooManyBytes(void)1163 void test_FreeRTOS_SendPingRequest_TooManyBytes( void )
1164 {
1165 BaseType_t xReturn;
1166 uint32_t ulIPAddress = 0xC0AB0101;
1167 size_t uxNumberOfBytesToSend = ipconfigNETWORK_MTU - ( sizeof( IPHeader_t ) + sizeof( ICMPHeader_t ) );
1168
1169 /* The value of blocking time doesn't matter since the test doesn't
1170 * actually block. */
1171 TickType_t uxBlockTimeTicks = 100;
1172
1173 /* FreeRTOS_SendPingRequest */
1174 /* At least 4 free network buffers must be there to send a ping. */
1175 uxGetNumberOfFreeNetworkBuffers_ExpectAndReturn( 4U );
1176
1177 xReturn = FreeRTOS_SendPingRequest( ulIPAddress, uxNumberOfBytesToSend, uxBlockTimeTicks );
1178
1179 TEST_ASSERT_EQUAL( pdFAIL, xReturn );
1180 }
1181
1182 /**
1183 * @brief test_FreeRTOS_SendPingRequest_TooManyBytes
1184 * To validate if FreeRTOS_SendPingRequest() returns fail when input bytes is 0.
1185 */
test_FreeRTOS_SendPingRequest_TooLessBytes(void)1186 void test_FreeRTOS_SendPingRequest_TooLessBytes( void )
1187 {
1188 BaseType_t xReturn;
1189 uint32_t ulIPAddress = 0xC0AB0101;
1190 size_t uxNumberOfBytesToSend = 0;
1191
1192 /* The value of blocking time doesn't matter since the test doesn't
1193 * actually block. */
1194 TickType_t uxBlockTimeTicks = 100;
1195
1196 /* FreeRTOS_SendPingRequest */
1197 /* At least 4 free network buffers must be there to send a ping. */
1198 uxGetNumberOfFreeNetworkBuffers_ExpectAndReturn( 4U );
1199
1200 xReturn = FreeRTOS_SendPingRequest( ulIPAddress, uxNumberOfBytesToSend, uxBlockTimeTicks );
1201
1202 TEST_ASSERT_EQUAL( pdFAIL, xReturn );
1203 }
1204
1205 /**
1206 * @brief test_FreeRTOS_SendPingRequest_NotEnoughFreeBuffers
1207 * To validate if FreeRTOS_SendPingRequest() returns fail when buffer size is not enough for input bytes.
1208 */
test_FreeRTOS_SendPingRequest_NotEnoughFreeBuffers(void)1209 void test_FreeRTOS_SendPingRequest_NotEnoughFreeBuffers( void )
1210 {
1211 BaseType_t xReturn;
1212 uint32_t ulIPAddress = 0xC0AB0101;
1213 /* 32 byte ping to send. */
1214 size_t uxNumberOfBytesToSend = 32;
1215
1216 /* The value of blocking time doesn't matter since the test doesn't
1217 * actually block. */
1218 TickType_t uxBlockTimeTicks = 100;
1219
1220 /* FreeRTOS_SendPingRequest */
1221 uxGetNumberOfFreeNetworkBuffers_ExpectAndReturn( 3U );
1222
1223 xReturn = FreeRTOS_SendPingRequest( ulIPAddress, uxNumberOfBytesToSend, uxBlockTimeTicks );
1224
1225 TEST_ASSERT_EQUAL( pdFAIL, xReturn );
1226 }
1227
1228 /**
1229 * @brief test_FreeRTOS_SendPingRequest_NetworkBufferFailure
1230 * To validate if FreeRTOS_SendPingRequest() returns fail to get network buffer descriptor.
1231 */
test_FreeRTOS_SendPingRequest_NetworkBufferFailure(void)1232 void test_FreeRTOS_SendPingRequest_NetworkBufferFailure( void )
1233 {
1234 BaseType_t xReturn;
1235 uint32_t ulIPAddress = 0xC0AB0101;
1236 /* 32 byte ping to send. */
1237 size_t uxNumberOfBytesToSend = 32;
1238
1239 /* The value of blocking time doesn't matter since the test doesn't
1240 * actually block. */
1241 TickType_t uxBlockTimeTicks = 100;
1242
1243 /* FreeRTOS_SendPingRequest */
1244 uxGetNumberOfFreeNetworkBuffers_ExpectAndReturn( 4U );
1245 pxGetNetworkBufferWithDescriptor_ExpectAndReturn( uxNumberOfBytesToSend + sizeof( ICMPPacket_t ), uxBlockTimeTicks, NULL );
1246
1247 xReturn = FreeRTOS_SendPingRequest( ulIPAddress, uxNumberOfBytesToSend, uxBlockTimeTicks );
1248
1249 TEST_ASSERT_EQUAL( pdFAIL, xReturn );
1250 }
1251
1252 /**
1253 * @brief test_xSendEventToIPTask
1254 * To validate if xSendEventToIPTask() returns fail when IP task was not initialized.
1255 */
test_xSendEventToIPTask(void)1256 void test_xSendEventToIPTask( void )
1257 {
1258 BaseType_t xReturn;
1259 eIPEvent_t eEvent = eNetworkRxEvent;
1260
1261 xIPTaskInitialised = pdFALSE;
1262
1263 xReturn = xSendEventToIPTask( eEvent );
1264
1265 TEST_ASSERT_EQUAL( pdFAIL, xReturn );
1266 }
1267
1268 /**
1269 * @brief test_xSendEventStructToIPTask_IPTaskNotInit_NoNetworkDownEvent
1270 * To validate if xSendEventToIPTask() returns fail when IP task was not initialized
1271 * and the event is not eNetworkDownEvent.
1272 */
test_xSendEventStructToIPTask_IPTaskNotInit_NoNetworkDownEvent(void)1273 void test_xSendEventStructToIPTask_IPTaskNotInit_NoNetworkDownEvent( void )
1274 {
1275 BaseType_t xReturn;
1276 IPStackEvent_t xEvent;
1277 TickType_t uxTimeout;
1278
1279 xIPTaskInitialised = pdFALSE;
1280
1281 xEvent.eEventType = eNetworkDownEvent + 1;
1282
1283 xReturn = xSendEventStructToIPTask( &xEvent, uxTimeout );
1284
1285 TEST_ASSERT_EQUAL( pdFAIL, xReturn );
1286 }
1287
1288 /**
1289 * @brief test_xSendEventStructToIPTask_IPTaskNotInit_NoNetworkDownEvent
1290 * To validate if xSendEventToIPTask() returns pass when the event is eNetworkDownEvent
1291 * even though IP task was not initialized.
1292 */
test_xSendEventStructToIPTask_IPTaskNotInit_NetworkDownEvent(void)1293 void test_xSendEventStructToIPTask_IPTaskNotInit_NetworkDownEvent( void )
1294 {
1295 BaseType_t xReturn;
1296 IPStackEvent_t xEvent;
1297 TickType_t uxTimeout = 0;
1298
1299 xIPTaskInitialised = pdFALSE;
1300 xEvent.eEventType = eNetworkDownEvent;
1301
1302 /* xSendEventStructToIPTask */
1303 xIsCallingFromIPTask_ExpectAndReturn( pdTRUE );
1304 xQueueGenericSend_ExpectAndReturn( xNetworkEventQueue, &xEvent, 0, 0, pdPASS );
1305
1306 xReturn = xSendEventStructToIPTask( &xEvent, uxTimeout );
1307
1308 TEST_ASSERT_EQUAL( pdPASS, xReturn );
1309 }
1310
1311 /**
1312 * @brief test_xSendEventStructToIPTask_IPTaskNotInit_NetworkDownEventInIPTask
1313 * To validate if xSendEventToIPTask() changes the timeout value to 0 when it's happening
1314 * in IP task.
1315 */
test_xSendEventStructToIPTask_IPTaskNotInit_NetworkDownEventInIPTask(void)1316 void test_xSendEventStructToIPTask_IPTaskNotInit_NetworkDownEventInIPTask( void )
1317 {
1318 BaseType_t xReturn;
1319 IPStackEvent_t xEvent;
1320 TickType_t uxTimeout = 1;
1321
1322 xIPTaskInitialised = pdFALSE;
1323 xEvent.eEventType = eNetworkDownEvent;
1324
1325 /* xSendEventStructToIPTask */
1326 xIsCallingFromIPTask_ExpectAndReturn( pdTRUE );
1327 xQueueGenericSend_ExpectAndReturn( xNetworkEventQueue, &xEvent, 0, 0, pdPASS );
1328
1329 xReturn = xSendEventStructToIPTask( &xEvent, uxTimeout );
1330
1331 TEST_ASSERT_EQUAL( pdPASS, xReturn );
1332 }
1333
1334 /**
1335 * @brief test_xSendEventStructToIPTask_IPTaskNotInit_NetworkDownEventNotIPTask
1336 * To validate if xSendEventToIPTask() returns pass when the event is eNetworkDownEvent
1337 * and it's not happening in IP task.
1338 */
test_xSendEventStructToIPTask_IPTaskNotInit_NetworkDownEventNotIPTask(void)1339 void test_xSendEventStructToIPTask_IPTaskNotInit_NetworkDownEventNotIPTask( void )
1340 {
1341 BaseType_t xReturn;
1342 IPStackEvent_t xEvent;
1343 TickType_t uxTimeout = 0;
1344
1345 xIPTaskInitialised = pdFALSE;
1346 xEvent.eEventType = eNetworkDownEvent;
1347
1348 /* xSendEventStructToIPTask */
1349 xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
1350 xQueueGenericSend_ExpectAndReturn( xNetworkEventQueue, &xEvent, 0, 0, pdPASS );
1351
1352 xReturn = xSendEventStructToIPTask( &xEvent, uxTimeout );
1353
1354 TEST_ASSERT_EQUAL( pdPASS, xReturn );
1355 }
1356
1357 /**
1358 * @brief test_xSendEventStructToIPTask_IPTaskNotInit_NetworkDownEventNotIPTaskTimeout
1359 * To validate if xSendEventToIPTask() keeps input timeout value to send event when it's
1360 * not happening in IP task.
1361 */
test_xSendEventStructToIPTask_IPTaskNotInit_NetworkDownEventNotIPTaskTimeout(void)1362 void test_xSendEventStructToIPTask_IPTaskNotInit_NetworkDownEventNotIPTaskTimeout( void )
1363 {
1364 BaseType_t xReturn;
1365 IPStackEvent_t xEvent;
1366 TickType_t uxTimeout = 10;
1367
1368 xIPTaskInitialised = pdFALSE;
1369 xEvent.eEventType = eNetworkDownEvent;
1370
1371 /* xSendEventStructToIPTask */
1372 xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
1373 xQueueGenericSend_ExpectAndReturn( xNetworkEventQueue, &xEvent, 10, 0, pdPASS );
1374
1375 xReturn = xSendEventStructToIPTask( &xEvent, uxTimeout );
1376
1377 TEST_ASSERT_EQUAL( pdPASS, xReturn );
1378 }
1379
1380 /**
1381 * @brief test_xSendEventStructToIPTask_IPTaskInit_NetworkDownEvent
1382 * To validate if xSendEventToIPTask() sends eNetworkDownEvent to IP task successfully from other tasks.
1383 */
test_xSendEventStructToIPTask_IPTaskInit_NetworkDownEvent(void)1384 void test_xSendEventStructToIPTask_IPTaskInit_NetworkDownEvent( void )
1385 {
1386 BaseType_t xReturn;
1387 IPStackEvent_t xEvent;
1388 TickType_t uxTimeout = 10;
1389
1390 xIPTaskInitialised = pdTRUE;
1391 xEvent.eEventType = eNetworkDownEvent;
1392
1393 /* xSendEventStructToIPTask */
1394 xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
1395 xQueueGenericSend_ExpectAndReturn( xNetworkEventQueue, &xEvent, 10, 0, pdPASS );
1396
1397 xReturn = xSendEventStructToIPTask( &xEvent, uxTimeout );
1398
1399 TEST_ASSERT_EQUAL( pdPASS, xReturn );
1400 }
1401
1402 /**
1403 * @brief test_xSendEventStructToIPTask_IPTaskInit_eTCPTimerEvent
1404 * To validate if xSendEventToIPTask() sends eTCPTimerEvent to IP task successfully from other tasks
1405 * when no pending events in queue.
1406 */
test_xSendEventStructToIPTask_IPTaskInit_eTCPTimerEvent(void)1407 void test_xSendEventStructToIPTask_IPTaskInit_eTCPTimerEvent( void )
1408 {
1409 BaseType_t xReturn;
1410 IPStackEvent_t xEvent;
1411 TickType_t uxTimeout = 10;
1412
1413 xIPTaskInitialised = pdTRUE;
1414 xEvent.eEventType = eTCPTimerEvent;
1415
1416 /* xSendEventStructToIPTask */
1417 vIPSetTCPTimerExpiredState_Expect( pdTRUE );
1418 uxQueueMessagesWaiting_ExpectAndReturn( xNetworkEventQueue, 0 );
1419 xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
1420 xQueueGenericSend_ExpectAndReturn( xNetworkEventQueue, &xEvent, 10, 0, pdPASS );
1421
1422 xReturn = xSendEventStructToIPTask( &xEvent, uxTimeout );
1423
1424 TEST_ASSERT_EQUAL( pdPASS, xReturn );
1425 }
1426
1427 /**
1428 * @brief test_xSendEventStructToIPTask_IPTaskInit_eTCPTimerEventFail
1429 * To validate if xSendEventToIPTask() fails to send eTCPTimerEvent to IP task from other tasks.
1430 */
test_xSendEventStructToIPTask_IPTaskInit_eTCPTimerEventFail(void)1431 void test_xSendEventStructToIPTask_IPTaskInit_eTCPTimerEventFail( void )
1432 {
1433 BaseType_t xReturn;
1434 IPStackEvent_t xEvent;
1435 TickType_t uxTimeout = 10;
1436
1437 xIPTaskInitialised = pdTRUE;
1438 xEvent.eEventType = eTCPTimerEvent;
1439
1440 /* xSendEventStructToIPTask */
1441 vIPSetTCPTimerExpiredState_Expect( pdTRUE );
1442 uxQueueMessagesWaiting_ExpectAndReturn( xNetworkEventQueue, 0 );
1443 xIsCallingFromIPTask_ExpectAndReturn( pdFALSE );
1444 xQueueGenericSend_ExpectAndReturn( xNetworkEventQueue, &xEvent, 10, 0, pdFAIL );
1445
1446 xReturn = xSendEventStructToIPTask( &xEvent, uxTimeout );
1447
1448 TEST_ASSERT_EQUAL( pdFAIL, xReturn );
1449 }
1450
1451 /**
1452 * @brief test_xSendEventStructToIPTask_IPTaskInit_eTCPTimerEventWithEventInQueue
1453 * To validate if xSendEventToIPTask() skip to send eTCPTimerEvent because there are
1454 * other pending events in queue.
1455 */
test_xSendEventStructToIPTask_IPTaskInit_eTCPTimerEventWithEventInQueue(void)1456 void test_xSendEventStructToIPTask_IPTaskInit_eTCPTimerEventWithEventInQueue( void )
1457 {
1458 BaseType_t xReturn;
1459 IPStackEvent_t xEvent;
1460 TickType_t uxTimeout = 10;
1461
1462 xIPTaskInitialised = pdTRUE;
1463 xEvent.eEventType = eTCPTimerEvent;
1464
1465 /* xSendEventStructToIPTask */
1466 vIPSetTCPTimerExpiredState_Expect( pdTRUE );
1467 uxQueueMessagesWaiting_ExpectAndReturn( xNetworkEventQueue, 1 );
1468
1469 xReturn = xSendEventStructToIPTask( &xEvent, uxTimeout );
1470
1471 TEST_ASSERT_EQUAL( pdPASS, xReturn );
1472 }
1473
1474 /**
1475 * @brief test_eConsiderFrameForProcessing_NullBufferDescriptor
1476 * eConsiderFrameForProcessing must return eReleaseBuffer with NULL input.
1477 */
test_eConsiderFrameForProcessing_NullBufferDescriptor(void)1478 void test_eConsiderFrameForProcessing_NullBufferDescriptor( void )
1479 {
1480 eFrameProcessingResult_t eResult;
1481
1482 eResult = eConsiderFrameForProcessing( NULL );
1483
1484 TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
1485 }
1486
1487 /**
1488 * @brief test_eConsiderFrameForProcessing_LocalMACMatch
1489 * eConsiderFrameForProcessing must return eProcessBuffer when the MAC address in packet
1490 * matches endpoint's MAC address and the frame type is valid.
1491 */
test_eConsiderFrameForProcessing_LocalMACMatch(void)1492 void test_eConsiderFrameForProcessing_LocalMACMatch( void )
1493 {
1494 eFrameProcessingResult_t eResult;
1495 NetworkEndPoint_t xEndPoint, * pxEndPoint = &xEndPoint;
1496 uint8_t ucEthernetBuffer[ ipconfigTCP_MSS ];
1497 EthernetHeader_t * pxEthernetHeader;
1498
1499 /* eConsiderFrameForProcessing */
1500 FreeRTOS_FindEndPointOnMAC_ExpectAnyArgsAndReturn( pxEndPoint );
1501
1502 /* Map the buffer onto Ethernet Header struct for easy access to fields. */
1503 pxEthernetHeader = ( EthernetHeader_t * ) ucEthernetBuffer;
1504
1505 memset( ucEthernetBuffer, 0x00, ipconfigTCP_MSS );
1506
1507 /* Align endpoint's & packet's MAC address. */
1508 memset( pxEndPoint->xMACAddress.ucBytes, 0xAA, sizeof( MACAddress_t ) );
1509 memcpy( pxEthernetHeader->xDestinationAddress.ucBytes, pxEndPoint->xMACAddress.ucBytes, sizeof( MACAddress_t ) );
1510 pxEthernetHeader->usFrameType = FreeRTOS_htons( 0x0800 );
1511
1512 eResult = eConsiderFrameForProcessing( ucEthernetBuffer );
1513
1514 TEST_ASSERT_EQUAL( eProcessBuffer, eResult );
1515 }
1516
1517 /**
1518 * @brief test_eConsiderFrameForProcessing_LocalMACMatchInvalidFrameType
1519 * eConsiderFrameForProcessing must return eReleaseBuffer when the frame type is unknown
1520 * even though the MAC address in packet matches endpoint's MAC address.
1521 */
test_eConsiderFrameForProcessing_LocalMACMatchInvalidFrameType(void)1522 void test_eConsiderFrameForProcessing_LocalMACMatchInvalidFrameType( void )
1523 {
1524 eFrameProcessingResult_t eResult;
1525 NetworkEndPoint_t xEndPoint, * pxEndPoint = &xEndPoint;
1526 uint8_t ucEthernetBuffer[ ipconfigTCP_MSS ];
1527 EthernetHeader_t * pxEthernetHeader;
1528
1529 /* eConsiderFrameForProcessing */
1530 FreeRTOS_FindEndPointOnMAC_ExpectAnyArgsAndReturn( pxEndPoint );
1531
1532 /* Map the buffer onto Ethernet Header struct for easy access to fields. */
1533 pxEthernetHeader = ( EthernetHeader_t * ) ucEthernetBuffer;
1534
1535 memset( ucEthernetBuffer, 0x00, ipconfigTCP_MSS );
1536
1537 /* Align endpoint's & packet's MAC address. */
1538 memset( pxEndPoint->xMACAddress.ucBytes, 0xAA, sizeof( MACAddress_t ) );
1539 memcpy( pxEthernetHeader->xDestinationAddress.ucBytes, pxEndPoint->xMACAddress.ucBytes, sizeof( MACAddress_t ) );
1540 pxEthernetHeader->usFrameType = FreeRTOS_htons( 0 );
1541
1542 eResult = eConsiderFrameForProcessing( ucEthernetBuffer );
1543
1544 TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
1545 }
1546
1547 /**
1548 * @brief test_eConsiderFrameForProcessing_LocalMACMatchInvalidFrameType1
1549 * eConsiderFrameForProcessing must return eReleaseBuffer when the frame type is unknown
1550 * even though the MAC address in packet matches endpoint's MAC address.
1551 */
test_eConsiderFrameForProcessing_LocalMACMatchInvalidFrameType1(void)1552 void test_eConsiderFrameForProcessing_LocalMACMatchInvalidFrameType1( void )
1553 {
1554 eFrameProcessingResult_t eResult;
1555 NetworkEndPoint_t xEndPoint, * pxEndPoint = &xEndPoint;
1556 uint8_t ucEthernetBuffer[ ipconfigTCP_MSS ];
1557 EthernetHeader_t * pxEthernetHeader;
1558
1559 /* eConsiderFrameForProcessing */
1560 FreeRTOS_FindEndPointOnMAC_ExpectAnyArgsAndReturn( pxEndPoint );
1561
1562 /* Map the buffer onto Ethernet Header struct for easy access to fields. */
1563 pxEthernetHeader = ( EthernetHeader_t * ) ucEthernetBuffer;
1564
1565 memset( ucEthernetBuffer, 0x00, ipconfigTCP_MSS );
1566
1567 /* Align endpoint's & packet's MAC address. */
1568 memset( pxEndPoint->xMACAddress.ucBytes, 0xAA, sizeof( MACAddress_t ) );
1569 memcpy( pxEthernetHeader->xDestinationAddress.ucBytes, pxEndPoint->xMACAddress.ucBytes, sizeof( MACAddress_t ) );
1570 pxEthernetHeader->usFrameType = 0x0600;
1571
1572 eResult = eConsiderFrameForProcessing( ucEthernetBuffer );
1573
1574 TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
1575 }
1576
1577 /**
1578 * @brief test_eConsiderFrameForProcessing_BroadCastMACMatch
1579 * eConsiderFrameForProcessing must return eProcessBuffer when the MAC address in packet
1580 * matches broadcast MAC address and the frame type is valid.
1581 */
test_eConsiderFrameForProcessing_BroadCastMACMatch(void)1582 void test_eConsiderFrameForProcessing_BroadCastMACMatch( void )
1583 {
1584 eFrameProcessingResult_t eResult;
1585 uint8_t ucEthernetBuffer[ ipconfigTCP_MSS ];
1586 EthernetHeader_t * pxEthernetHeader;
1587
1588 /* eConsiderFrameForProcessing */
1589 FreeRTOS_FindEndPointOnMAC_ExpectAnyArgsAndReturn( NULL );
1590
1591 /* Map the buffer onto Ethernet Header struct for easy access to fields. */
1592 pxEthernetHeader = ( EthernetHeader_t * ) ucEthernetBuffer;
1593
1594 memset( ucEthernetBuffer, 0x00, ipconfigTCP_MSS );
1595
1596 memcpy( pxEthernetHeader->xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
1597 pxEthernetHeader->usFrameType = 0xFFFF;
1598
1599 eResult = eConsiderFrameForProcessing( ucEthernetBuffer );
1600
1601 TEST_ASSERT_EQUAL( eProcessBuffer, eResult );
1602 }
1603
1604 /**
1605 * @brief test_eConsiderFrameForProcessing_BroadCastMACMatch
1606 * eConsiderFrameForProcessing must return eProcessBuffer when the MAC address in packet
1607 * matches LLMNR MAC address and the frame type is valid.
1608 */
test_eConsiderFrameForProcessing_LLMNR_MACMatch(void)1609 void test_eConsiderFrameForProcessing_LLMNR_MACMatch( void )
1610 {
1611 eFrameProcessingResult_t eResult;
1612 uint8_t ucEthernetBuffer[ ipconfigTCP_MSS ];
1613 EthernetHeader_t * pxEthernetHeader;
1614
1615 /* eConsiderFrameForProcessing */
1616 FreeRTOS_FindEndPointOnMAC_ExpectAnyArgsAndReturn( NULL );
1617
1618 /* Map the buffer onto Ethernet Header struct for easy access to fields. */
1619 pxEthernetHeader = ( EthernetHeader_t * ) ucEthernetBuffer;
1620
1621 memset( ucEthernetBuffer, 0x00, ipconfigTCP_MSS );
1622
1623 memcpy( pxEthernetHeader->xDestinationAddress.ucBytes, xLLMNR_MacAdress.ucBytes, sizeof( MACAddress_t ) );
1624 pxEthernetHeader->usFrameType = 0xFFFF;
1625
1626 eResult = eConsiderFrameForProcessing( ucEthernetBuffer );
1627
1628 TEST_ASSERT_EQUAL( eProcessBuffer, eResult );
1629 }
1630
1631 /**
1632 * @brief test_eConsiderFrameForProcessing_NotMatch
1633 * eConsiderFrameForProcessing must return eReleaseBuffer when the MAC address
1634 * in packet doesn't match any endpoint.
1635 */
test_eConsiderFrameForProcessing_NotMatch(void)1636 void test_eConsiderFrameForProcessing_NotMatch( void )
1637 {
1638 eFrameProcessingResult_t eResult;
1639 uint8_t ucEthernetBuffer[ ipconfigTCP_MSS ];
1640 EthernetHeader_t * pxEthernetHeader;
1641 MACAddress_t xMACAddress = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 };
1642
1643 /* eConsiderFrameForProcessing */
1644 FreeRTOS_FindEndPointOnMAC_ExpectAnyArgsAndReturn( NULL );
1645
1646 /* Map the buffer onto Ethernet Header struct for easy access to fields. */
1647 pxEthernetHeader = ( EthernetHeader_t * ) ucEthernetBuffer;
1648
1649 memset( ucEthernetBuffer, 0x00, ipconfigTCP_MSS );
1650
1651 memcpy( pxEthernetHeader->xDestinationAddress.ucBytes, &xMACAddress, sizeof( MACAddress_t ) );
1652 pxEthernetHeader->usFrameType = 0xFFFF;
1653
1654 eResult = eConsiderFrameForProcessing( ucEthernetBuffer );
1655
1656 TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
1657 }
1658
1659 /**
1660 * @brief test_eConsiderFrameForProcessing_IPv6BroadCastMACMatch
1661 * eConsiderFrameForProcessing must return eProcessBuffer when the MAC address in packet
1662 * matches IPv6 broadcast MAC address and the frame type is valid.
1663 */
test_eConsiderFrameForProcessing_IPv6BroadCastMACMatch(void)1664 void test_eConsiderFrameForProcessing_IPv6BroadCastMACMatch( void )
1665 {
1666 eFrameProcessingResult_t eResult;
1667 uint8_t ucEthernetBuffer[ ipconfigTCP_MSS ];
1668 EthernetHeader_t * pxEthernetHeader;
1669
1670 /* eConsiderFrameForProcessing */
1671 FreeRTOS_FindEndPointOnMAC_ExpectAnyArgsAndReturn( NULL );
1672
1673 /* Map the buffer onto Ethernet Header struct for easy access to fields. */
1674 pxEthernetHeader = ( EthernetHeader_t * ) ucEthernetBuffer;
1675
1676 memset( ucEthernetBuffer, 0x00, ipconfigTCP_MSS );
1677
1678 pxEthernetHeader->xDestinationAddress.ucBytes[ 0 ] = ipMULTICAST_MAC_ADDRESS_IPv6_0;
1679 pxEthernetHeader->xDestinationAddress.ucBytes[ 1 ] = ipMULTICAST_MAC_ADDRESS_IPv6_1;
1680 pxEthernetHeader->usFrameType = 0xFFFF;
1681
1682 eResult = eConsiderFrameForProcessing( ucEthernetBuffer );
1683
1684 TEST_ASSERT_EQUAL( eProcessBuffer, eResult );
1685 }
1686
1687 /**
1688 * @brief test_eConsiderFrameForProcessing_IPv6BroadCastMACPartialMatch
1689 * eConsiderFrameForProcessing must return eReleaseBuffer when the MAC address in packet
1690 * doesn't matches IPv6 broadcast MAC address.
1691 */
test_eConsiderFrameForProcessing_IPv6BroadCastMACPartialMatch(void)1692 void test_eConsiderFrameForProcessing_IPv6BroadCastMACPartialMatch( void )
1693 {
1694 eFrameProcessingResult_t eResult;
1695 uint8_t ucEthernetBuffer[ ipconfigTCP_MSS ];
1696 EthernetHeader_t * pxEthernetHeader;
1697
1698 /* eConsiderFrameForProcessing */
1699 FreeRTOS_FindEndPointOnMAC_ExpectAnyArgsAndReturn( NULL );
1700
1701 /* Map the buffer onto Ethernet Header struct for easy access to fields. */
1702 pxEthernetHeader = ( EthernetHeader_t * ) ucEthernetBuffer;
1703
1704 memset( ucEthernetBuffer, 0x00, ipconfigTCP_MSS );
1705
1706 pxEthernetHeader->xDestinationAddress.ucBytes[ 0 ] = ipMULTICAST_MAC_ADDRESS_IPv6_0;
1707 pxEthernetHeader->xDestinationAddress.ucBytes[ 1 ] = 0x00;
1708 pxEthernetHeader->usFrameType = 0xFFFF;
1709
1710 eResult = eConsiderFrameForProcessing( ucEthernetBuffer );
1711
1712 TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
1713 }
1714
1715 /**
1716 * @brief test_prvProcessEthernetPacket_NoData
1717 * To validate if prvProcessEthernetPacket calls vReleaseNetworkBufferAndDescriptor
1718 * to release the network buffer descriptor.
1719 */
test_prvProcessEthernetPacket_NoData(void)1720 void test_prvProcessEthernetPacket_NoData( void )
1721 {
1722 NetworkBufferDescriptor_t xNetworkBuffer;
1723 NetworkBufferDescriptor_t * pxNetworkBuffer = &xNetworkBuffer;
1724
1725 pxNetworkBuffer->xDataLength = 0;
1726 pxNetworkBuffer->pucEthernetBuffer = NULL;
1727
1728 vReleaseNetworkBufferAndDescriptor_Expect( pxNetworkBuffer );
1729
1730 prvProcessEthernetPacket( pxNetworkBuffer );
1731 }
1732
1733 /**
1734 * @brief test_prvProcessEthernetPacket_NullNetworkBufferDescriptor
1735 * To validate if prvProcessEthernetPacket triggers assertion when input is NULL.
1736 */
test_prvProcessEthernetPacket_NullNetworkBufferDescriptor(void)1737 void test_prvProcessEthernetPacket_NullNetworkBufferDescriptor( void )
1738 {
1739 catch_assert( prvProcessEthernetPacket( NULL ) );
1740 }
1741
1742 /**
1743 * @brief test_prvProcessEthernetPacket_UnknownFrameType
1744 * To validate if prvProcessEthernetPacket calls vReleaseNetworkBufferAndDescriptor
1745 * to release the network buffer descriptor when the ethernet frame type is unknown.
1746 */
test_prvProcessEthernetPacket_UnknownFrameType(void)1747 void test_prvProcessEthernetPacket_UnknownFrameType( void )
1748 {
1749 NetworkBufferDescriptor_t xNetworkBuffer;
1750 NetworkBufferDescriptor_t * pxNetworkBuffer = &xNetworkBuffer;
1751 uint8_t ucEtherBuffer[ ipconfigTCP_MSS ];
1752 EthernetHeader_t * pxEthernetHeader;
1753
1754 pxNetworkBuffer->xDataLength = ipconfigTCP_MSS;
1755 pxNetworkBuffer->pucEthernetBuffer = ucEtherBuffer;
1756 pxEthernetHeader = ( EthernetHeader_t * ) ucEtherBuffer;
1757 pxEthernetHeader->usFrameType = 0xFFFF;
1758
1759 memset( pxNetworkBuffer->pucEthernetBuffer, 0, ipconfigTCP_MSS );
1760
1761 vReleaseNetworkBufferAndDescriptor_Expect( pxNetworkBuffer );
1762
1763 prvProcessEthernetPacket( pxNetworkBuffer );
1764 }
1765
1766 /**
1767 * @brief test_prvProcessEthernetPacket_ARPFrameType1
1768 * To validate the flow to handle ARP packets but eARPProcessPacket() returns eReleaseBuffer.
1769 */
test_prvProcessEthernetPacket_ARPFrameType1(void)1770 void test_prvProcessEthernetPacket_ARPFrameType1( void )
1771 {
1772 NetworkBufferDescriptor_t xNetworkBuffer;
1773 NetworkBufferDescriptor_t * pxNetworkBuffer = &xNetworkBuffer;
1774 uint8_t ucEtherBuffer[ ipconfigTCP_MSS ];
1775 EthernetHeader_t * pxEthernetHeader;
1776
1777 pxNetworkBuffer->xDataLength = ipconfigTCP_MSS;
1778 pxNetworkBuffer->pucEthernetBuffer = ucEtherBuffer;
1779
1780 pxEthernetHeader = ( EthernetHeader_t * ) pxNetworkBuffer->pucEthernetBuffer;
1781
1782 memset( pxNetworkBuffer->pucEthernetBuffer, 0, ipconfigTCP_MSS );
1783
1784 pxEthernetHeader->usFrameType = ipARP_FRAME_TYPE;
1785
1786 eARPProcessPacket_ExpectAndReturn( pxNetworkBuffer, eReleaseBuffer );
1787
1788 vReleaseNetworkBufferAndDescriptor_Expect( pxNetworkBuffer );
1789
1790 prvProcessEthernetPacket( pxNetworkBuffer );
1791 }
1792
1793 /**
1794 * @brief test_prvProcessEthernetPacket_ARPFrameType2
1795 * To validate the flow to handle ARP packets but eARPProcessPacket() returns eProcessBuffer.
1796 */
test_prvProcessEthernetPacket_ARPFrameType2(void)1797 void test_prvProcessEthernetPacket_ARPFrameType2( void )
1798 {
1799 NetworkBufferDescriptor_t xNetworkBuffer;
1800 NetworkBufferDescriptor_t * pxNetworkBuffer = &xNetworkBuffer;
1801 uint8_t ucEtherBuffer[ ipconfigTCP_MSS ];
1802 EthernetHeader_t * pxEthernetHeader;
1803
1804 pxNetworkBuffer->xDataLength = ipconfigTCP_MSS;
1805 pxNetworkBuffer->pucEthernetBuffer = ucEtherBuffer;
1806
1807 pxEthernetHeader = ( EthernetHeader_t * ) pxNetworkBuffer->pucEthernetBuffer;
1808
1809 memset( pxNetworkBuffer->pucEthernetBuffer, 0, ipconfigTCP_MSS );
1810
1811 pxEthernetHeader->usFrameType = ipARP_FRAME_TYPE;
1812
1813 eARPProcessPacket_ExpectAndReturn( pxNetworkBuffer, eProcessBuffer );
1814
1815 vReleaseNetworkBufferAndDescriptor_Expect( pxNetworkBuffer );
1816
1817 prvProcessEthernetPacket( pxNetworkBuffer );
1818 }
1819
1820 /**
1821 * @brief test_prvProcessEthernetPacket_ARPFrameType_WaitingARPResolution
1822 * To validate the flow to handle ARP packets but eARPProcessPacket() returns eWaitingARPResolution
1823 * without pxARPWaitingNetworkBuffer.
1824 */
test_prvProcessEthernetPacket_ARPFrameType_WaitingARPResolution(void)1825 void test_prvProcessEthernetPacket_ARPFrameType_WaitingARPResolution( void )
1826 {
1827 NetworkBufferDescriptor_t xNetworkBuffer;
1828 NetworkBufferDescriptor_t * pxNetworkBuffer = &xNetworkBuffer;
1829 uint8_t ucEtherBuffer[ ipconfigTCP_MSS ];
1830 EthernetHeader_t * pxEthernetHeader;
1831
1832 pxNetworkBuffer->xDataLength = ipconfigTCP_MSS;
1833 pxNetworkBuffer->pucEthernetBuffer = ucEtherBuffer;
1834
1835 pxARPWaitingNetworkBuffer = NULL;
1836
1837 pxEthernetHeader = ( EthernetHeader_t * ) pxNetworkBuffer->pucEthernetBuffer;
1838
1839 memset( pxNetworkBuffer->pucEthernetBuffer, 0, ipconfigTCP_MSS );
1840
1841 pxEthernetHeader->usFrameType = ipARP_FRAME_TYPE;
1842
1843 eARPProcessPacket_ExpectAndReturn( pxNetworkBuffer, eWaitingARPResolution );
1844
1845 vIPTimerStartARPResolution_ExpectAnyArgs();
1846
1847 prvProcessEthernetPacket( pxNetworkBuffer );
1848 }
1849
1850 /**
1851 * @brief test_prvProcessEthernetPacket_ARPFrameType_WaitingARPResolution2
1852 * To validate the flow to handle ARP packets but eARPProcessPacket() returns eWaitingARPResolution
1853 * with pxARPWaitingNetworkBuffer.
1854 */
test_prvProcessEthernetPacket_ARPFrameType_WaitingARPResolution2(void)1855 void test_prvProcessEthernetPacket_ARPFrameType_WaitingARPResolution2( void )
1856 {
1857 NetworkBufferDescriptor_t xNetworkBuffer;
1858 NetworkBufferDescriptor_t * pxNetworkBuffer = &xNetworkBuffer;
1859 uint8_t ucEtherBuffer[ ipconfigTCP_MSS ];
1860 EthernetHeader_t * pxEthernetHeader;
1861
1862 pxNetworkBuffer->xDataLength = ipconfigTCP_MSS;
1863 pxNetworkBuffer->pucEthernetBuffer = ucEtherBuffer;
1864
1865 pxARPWaitingNetworkBuffer = ( NetworkBufferDescriptor_t * ) 0x1234ABCD;
1866
1867 pxEthernetHeader = ( EthernetHeader_t * ) pxNetworkBuffer->pucEthernetBuffer;
1868
1869 memset( pxNetworkBuffer->pucEthernetBuffer, 0, ipconfigTCP_MSS );
1870
1871 pxEthernetHeader->usFrameType = ipARP_FRAME_TYPE;
1872
1873 eARPProcessPacket_ExpectAndReturn( pxNetworkBuffer, eWaitingARPResolution );
1874
1875 vReleaseNetworkBufferAndDescriptor_Expect( pxNetworkBuffer );
1876
1877 prvProcessEthernetPacket( pxNetworkBuffer );
1878 }
1879
1880 /**
1881 * @brief test_prvProcessEthernetPacket_ARPFrameType_eReturnEthernetFrame
1882 * To validate the flow to handle ARP packets but eARPProcessPacket() returns eReturnEthernetFrame.
1883 */
test_prvProcessEthernetPacket_ARPFrameType_eReturnEthernetFrame(void)1884 void test_prvProcessEthernetPacket_ARPFrameType_eReturnEthernetFrame( void )
1885 {
1886 struct xNetworkInterface xInterface, * pxInterface = &xInterface;
1887 NetworkBufferDescriptor_t xNetworkBuffer, xARPWaitingBuffer;
1888 NetworkBufferDescriptor_t * pxNetworkBuffer = &xNetworkBuffer;
1889 uint8_t ucEtherBuffer[ ipconfigTCP_MSS ];
1890 EthernetHeader_t * pxEthernetHeader;
1891 struct xNetworkEndPoint xEndPoint = { 0 };
1892
1893 pxNetworkBuffer->xDataLength = ipconfigTCP_MSS;
1894 pxNetworkBuffer->pucEthernetBuffer = ucEtherBuffer;
1895 pxNetworkBuffer->pxEndPoint = &xEndPoint;
1896 xEndPoint.pxNetworkInterface = &xInterfaces;
1897 xEndPoint.pxNetworkInterface->pfOutput = &NetworkInterfaceOutputFunction_Stub;
1898 NetworkInterfaceOutputFunction_Stub_Called = 0;
1899
1900 pxEthernetHeader = ( EthernetHeader_t * ) pxNetworkBuffer->pucEthernetBuffer;
1901
1902 memset( pxNetworkBuffer->pucEthernetBuffer, 0, ipconfigTCP_MSS );
1903
1904 pxEthernetHeader->usFrameType = ipARP_FRAME_TYPE;
1905
1906 eARPProcessPacket_ExpectAndReturn( pxNetworkBuffer, eReturnEthernetFrame );
1907
1908 xIsCallingFromIPTask_ExpectAndReturn( pdTRUE );
1909
1910 prvProcessEthernetPacket( pxNetworkBuffer );
1911
1912 TEST_ASSERT_EQUAL( 1, NetworkInterfaceOutputFunction_Stub_Called );
1913 }
1914
1915 /**
1916 * @brief test_prvProcessEthernetPacket_ARPFrameType_eReturnEthernetFrame
1917 * To validate the flow to handle ARP packets but eARPProcessPacket() returns eFrameConsumed.
1918 */
test_prvProcessEthernetPacket_ARPFrameType_eFrameConsumed(void)1919 void test_prvProcessEthernetPacket_ARPFrameType_eFrameConsumed( void )
1920 {
1921 NetworkBufferDescriptor_t xNetworkBuffer, xARPWaitingBuffer;
1922 NetworkBufferDescriptor_t * pxNetworkBuffer = &xNetworkBuffer;
1923 uint8_t ucEtherBuffer[ ipconfigTCP_MSS ];
1924 EthernetHeader_t * pxEthernetHeader;
1925
1926 pxNetworkBuffer->xDataLength = ipconfigTCP_MSS;
1927 pxNetworkBuffer->pucEthernetBuffer = ucEtherBuffer;
1928
1929 pxEthernetHeader = ( EthernetHeader_t * ) pxNetworkBuffer->pucEthernetBuffer;
1930
1931 memset( pxNetworkBuffer->pucEthernetBuffer, 0, ipconfigTCP_MSS );
1932
1933 pxEthernetHeader->usFrameType = ipARP_FRAME_TYPE;
1934
1935 eARPProcessPacket_ExpectAndReturn( pxNetworkBuffer, eFrameConsumed );
1936
1937 prvProcessEthernetPacket( pxNetworkBuffer );
1938 }
1939
1940 /**
1941 * @brief test_prvProcessEthernetPacket_ARPFrameType_SmallerDataLength
1942 * To validate the flow to handle ARP packets but the data length is smaller than
1943 * minimum size of ARP packet.
1944 */
test_prvProcessEthernetPacket_ARPFrameType_SmallerDataLength(void)1945 void test_prvProcessEthernetPacket_ARPFrameType_SmallerDataLength( void )
1946 {
1947 NetworkBufferDescriptor_t xNetworkBuffer;
1948 NetworkBufferDescriptor_t * pxNetworkBuffer = &xNetworkBuffer;
1949 uint8_t ucEtherBuffer[ ipconfigTCP_MSS ];
1950 EthernetHeader_t * pxEthernetHeader;
1951
1952 pxNetworkBuffer->xDataLength = sizeof( EthernetHeader_t );
1953 pxNetworkBuffer->pucEthernetBuffer = ucEtherBuffer;
1954
1955 pxEthernetHeader = ( EthernetHeader_t * ) pxNetworkBuffer->pucEthernetBuffer;
1956
1957 memset( pxNetworkBuffer->pucEthernetBuffer, 0, ipconfigTCP_MSS );
1958
1959 pxEthernetHeader->usFrameType = ipARP_FRAME_TYPE;
1960
1961 vReleaseNetworkBufferAndDescriptor_Expect( pxNetworkBuffer );
1962
1963 prvProcessEthernetPacket( pxNetworkBuffer );
1964 }
1965
1966 /**
1967 * @brief test_prvProcessEthernetPacket_IPv4FrameType_LessData
1968 * To validate the flow to handle IPv4 packets but the data length is smaller than
1969 * minimum size of IPv4 packet.
1970 */
test_prvProcessEthernetPacket_IPv4FrameType_LessData(void)1971 void test_prvProcessEthernetPacket_IPv4FrameType_LessData( void )
1972 {
1973 NetworkBufferDescriptor_t xNetworkBuffer;
1974 NetworkBufferDescriptor_t * pxNetworkBuffer = &xNetworkBuffer;
1975 uint8_t ucEtherBuffer[ ipconfigTCP_MSS ];
1976 EthernetHeader_t * pxEthernetHeader;
1977
1978 pxNetworkBuffer->xDataLength = sizeof( EthernetHeader_t );
1979 pxNetworkBuffer->pucEthernetBuffer = ucEtherBuffer;
1980
1981 pxEthernetHeader = ( EthernetHeader_t * ) pxNetworkBuffer->pucEthernetBuffer;
1982
1983 memset( pxNetworkBuffer->pucEthernetBuffer, 0, ipconfigTCP_MSS );
1984
1985 pxEthernetHeader->usFrameType = ipIPv4_FRAME_TYPE;
1986
1987 vReleaseNetworkBufferAndDescriptor_Expect( pxNetworkBuffer );
1988
1989 prvProcessEthernetPacket( pxNetworkBuffer );
1990 }
1991
1992 /**
1993 * @brief test_prvProcessEthernetPacket_IPv4FrameType_AptData
1994 * To validate the flow to handle IPv4 packets but the length in IP header is smaller than
1995 * minimum requirement.
1996 */
test_prvProcessEthernetPacket_IPv4FrameType_AptData(void)1997 void test_prvProcessEthernetPacket_IPv4FrameType_AptData( void )
1998 {
1999 NetworkBufferDescriptor_t xNetworkBuffer;
2000 NetworkBufferDescriptor_t * pxNetworkBuffer = &xNetworkBuffer;
2001 uint8_t ucEtherBuffer[ ipconfigTCP_MSS ];
2002 EthernetHeader_t * pxEthernetHeader;
2003 IPPacket_t * pxIPPacket;
2004 IPHeader_t * pxIPHeader;
2005
2006 memset( pxNetworkBuffer->pucEthernetBuffer, 0, ipconfigTCP_MSS );
2007
2008 pxNetworkBuffer->xDataLength = ipconfigTCP_MSS;
2009 pxNetworkBuffer->pucEthernetBuffer = ucEtherBuffer;
2010
2011 pxEthernetHeader = ( EthernetHeader_t * ) pxNetworkBuffer->pucEthernetBuffer;
2012 pxEthernetHeader->usFrameType = ipIPv4_FRAME_TYPE;
2013
2014 pxIPPacket = ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
2015 pxIPHeader = &( pxIPPacket->xIPHeader );
2016 pxIPHeader->ucVersionHeaderLength = 0xF0;
2017
2018 vReleaseNetworkBufferAndDescriptor_Expect( pxNetworkBuffer );
2019
2020 prvProcessEthernetPacket( pxNetworkBuffer );
2021 }
2022
2023 /**
2024 * @brief test_prvProcessIPPacket_HeaderLengthSmaller
2025 * To validate the flow to handle IPv4 packets but the length in IP header is smaller than
2026 * minimum requirement.
2027 */
test_prvProcessIPPacket_HeaderLengthSmaller(void)2028 void test_prvProcessIPPacket_HeaderLengthSmaller( void )
2029 {
2030 eFrameProcessingResult_t eResult;
2031 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
2032 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
2033 IPPacket_t * pxIPPacket;
2034 IPHeader_t * pxIPHeader;
2035
2036 memset( ucEthBuffer, 0, ipconfigTCP_MSS );
2037
2038 pxNetworkBuffer = &xNetworkBuffer;
2039 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
2040 pxIPPacket = ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
2041 pxIPHeader = &( pxIPPacket->xIPHeader );
2042 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
2043
2044 pxIPHeader->ucVersionHeaderLength = 0xF0;
2045
2046 eResult = prvProcessIPPacket( pxIPPacket, pxNetworkBuffer );
2047
2048 TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
2049 }
2050
2051 /**
2052 * @brief test_prvProcessIPPacket_HeaderLengthGreater
2053 * To validate the flow to handle IPv4 packets but the length in IP header is greater than
2054 * network buffer size.
2055 */
test_prvProcessIPPacket_HeaderLengthGreater(void)2056 void test_prvProcessIPPacket_HeaderLengthGreater( void )
2057 {
2058 eFrameProcessingResult_t eResult;
2059 IPPacket_t * pxIPPacket;
2060 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
2061 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
2062 IPHeader_t * pxIPHeader;
2063
2064 memset( ucEthBuffer, 0, ipconfigTCP_MSS );
2065
2066 pxNetworkBuffer = &xNetworkBuffer;
2067 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
2068 pxIPPacket = ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
2069 pxIPHeader = &( pxIPPacket->xIPHeader );
2070 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
2071
2072 pxIPHeader->ucVersionHeaderLength = 0xFF;
2073
2074 /* Let the data length be greater than the ethernet header but small
2075 * enough to make the IP header bigger than the total length. */
2076 pxNetworkBuffer->xDataLength = 30;
2077
2078 eResult = prvProcessIPPacket( pxIPPacket, pxNetworkBuffer );
2079
2080 TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
2081 }
2082
2083 /**
2084 * @brief test_prvProcessIPPacket_UnknownFrameType
2085 * To validate the flow to handle unknown ethernet frame type.
2086 */
test_prvProcessIPPacket_UnknownFrameType(void)2087 void test_prvProcessIPPacket_UnknownFrameType( void )
2088 {
2089 eFrameProcessingResult_t eResult;
2090 IPPacket_t * pxIPPacket;
2091 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
2092 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
2093 IPHeader_t * pxIPHeader;
2094
2095 memset( ucEthBuffer, 0, ipconfigTCP_MSS );
2096
2097 pxNetworkBuffer = &xNetworkBuffer;
2098 pxNetworkBuffer->xDataLength = ipconfigTCP_MSS;
2099 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
2100 pxIPPacket = ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
2101 pxIPPacket->xEthernetHeader.usFrameType = 0xFF;
2102
2103 eResult = prvProcessIPPacket( pxIPPacket, pxNetworkBuffer );
2104
2105 TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
2106 }
2107
2108 /**
2109 * @brief test_prvProcessIPPacket_ValidHeader_ARPResolutionReqd
2110 * To validate the flow to handle a valid IPv4 packet but need ARP resolution.
2111 */
test_prvProcessIPPacket_ValidHeader_ARPResolutionReqd(void)2112 void test_prvProcessIPPacket_ValidHeader_ARPResolutionReqd( void )
2113 {
2114 eFrameProcessingResult_t eResult;
2115 IPPacket_t * pxIPPacket;
2116 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
2117 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
2118 IPHeader_t * pxIPHeader;
2119
2120 memset( ucEthBuffer, 0, ipconfigTCP_MSS );
2121
2122 /* Initialize network buffer descriptor. */
2123 pxNetworkBuffer = &xNetworkBuffer;
2124 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
2125
2126 /* Initialize ethernet layer. */
2127 pxIPPacket = ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
2128 pxIPHeader = &( pxIPPacket->xIPHeader );
2129 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
2130 memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
2131
2132 /* Initialize IP layer. */
2133 pxIPHeader->ucVersionHeaderLength = 0x45;
2134
2135 prvAllowIPPacketIPv4_ExpectAndReturn( pxIPPacket, pxNetworkBuffer, ( pxIPHeader->ucVersionHeaderLength & 0x0FU ) << 2, eProcessBuffer );
2136 xCheckRequiresARPResolution_ExpectAndReturn( pxNetworkBuffer, pdTRUE );
2137
2138 eResult = prvProcessIPPacket( pxIPPacket, pxNetworkBuffer );
2139
2140 TEST_ASSERT_EQUAL( eWaitingARPResolution, eResult );
2141 }
2142
2143 /**
2144 * @brief test_prvProcessIPPacket_ARPResolutionNotReqd_InvalidProt
2145 * To validate the flow to handle a valid IPv4 packet but invalid protocol.
2146 */
test_prvProcessIPPacket_ARPResolutionNotReqd_InvalidProt(void)2147 void test_prvProcessIPPacket_ARPResolutionNotReqd_InvalidProt( void )
2148 {
2149 eFrameProcessingResult_t eResult;
2150 IPPacket_t * pxIPPacket;
2151 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
2152 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
2153 IPHeader_t * pxIPHeader;
2154
2155 memset( ucEthBuffer, 0, ipconfigTCP_MSS );
2156
2157 /* Initialize network buffer descriptor. */
2158 pxNetworkBuffer = &xNetworkBuffer;
2159 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
2160 pxNetworkBuffer->xDataLength = ipconfigTCP_MSS;
2161
2162 /* Initialize ethernet layer. */
2163 pxIPPacket = ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
2164 pxIPHeader = &( pxIPPacket->xIPHeader );
2165 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
2166 memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
2167
2168 /* Initialize IP layer. */
2169 pxIPHeader->ucVersionHeaderLength = 0x46;
2170 pxIPHeader->ucProtocol = 0xFF;
2171
2172 prvAllowIPPacketIPv4_ExpectAndReturn( pxIPPacket, pxNetworkBuffer, ( pxIPHeader->ucVersionHeaderLength & 0x0FU ) << 2, eProcessBuffer );
2173 prvCheckIP4HeaderOptions_ExpectAndReturn( pxNetworkBuffer, eProcessBuffer );
2174 xCheckRequiresARPResolution_ExpectAndReturn( pxNetworkBuffer, pdFALSE );
2175 vARPRefreshCacheEntryAge_ExpectAnyArgs();
2176
2177 eResult = prvProcessIPPacket( pxIPPacket, pxNetworkBuffer );
2178
2179 TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
2180 }
2181
2182 /**
2183 * @brief test_prvProcessIPPacket_ARPResolutionNotReqd_ICMPRelease
2184 * To validate the flow to handle a valid ICMPv4 packet. Then ProcessICMPPacket() returns eReleaseBuffer.
2185 */
test_prvProcessIPPacket_ARPResolutionNotReqd_ICMPRelease(void)2186 void test_prvProcessIPPacket_ARPResolutionNotReqd_ICMPRelease( void )
2187 {
2188 eFrameProcessingResult_t eResult;
2189 IPPacket_t * pxIPPacket;
2190 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
2191 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
2192 IPHeader_t * pxIPHeader;
2193
2194 memset( ucEthBuffer, 0, ipconfigTCP_MSS );
2195
2196 /* Initialize network buffer descriptor. */
2197 pxNetworkBuffer = &xNetworkBuffer;
2198 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
2199 pxNetworkBuffer->xDataLength = ipconfigTCP_MSS;
2200
2201 /* Initialize ethernet layer. */
2202 pxIPPacket = ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
2203 pxIPHeader = &( pxIPPacket->xIPHeader );
2204 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
2205 memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
2206
2207 /* Initialize IP layer. */
2208 pxIPHeader->ucVersionHeaderLength = 0x46;
2209 pxIPHeader->ucProtocol = ipPROTOCOL_ICMP;
2210
2211 prvAllowIPPacketIPv4_ExpectAndReturn( pxIPPacket, pxNetworkBuffer, ( pxIPHeader->ucVersionHeaderLength & 0x0FU ) << 2, eProcessBuffer );
2212 prvCheckIP4HeaderOptions_ExpectAndReturn( pxNetworkBuffer, eProcessBuffer );
2213 xCheckRequiresARPResolution_ExpectAndReturn( pxNetworkBuffer, pdFALSE );
2214 vARPRefreshCacheEntryAge_ExpectAnyArgs();
2215 ProcessICMPPacket_ExpectAndReturn( pxNetworkBuffer, eReleaseBuffer );
2216
2217 eResult = prvProcessIPPacket( pxIPPacket, pxNetworkBuffer );
2218
2219 TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
2220 }
2221
2222 /**
2223 * @brief test_prvProcessIPPacket_ARPResolutionNotReqd_ICMPProcess
2224 * To validate the flow to handle a valid ICMPv4 packet. Then ProcessICMPPacket() returns eProcessBuffer.
2225 */
test_prvProcessIPPacket_ARPResolutionNotReqd_ICMPProcess(void)2226 void test_prvProcessIPPacket_ARPResolutionNotReqd_ICMPProcess( void )
2227 {
2228 eFrameProcessingResult_t eResult;
2229 IPPacket_t * pxIPPacket;
2230 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
2231 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
2232 IPHeader_t * pxIPHeader;
2233
2234 memset( ucEthBuffer, 0, ipconfigTCP_MSS );
2235
2236 /* Initialize network buffer descriptor. */
2237 pxNetworkBuffer = &xNetworkBuffer;
2238 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
2239 pxNetworkBuffer->xDataLength = ipconfigTCP_MSS;
2240
2241 /* Initialize ethernet layer. */
2242 pxIPPacket = ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
2243 pxIPHeader = &( pxIPPacket->xIPHeader );
2244 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
2245 memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
2246
2247 /* Initialize IP layer. */
2248 pxIPHeader->ucVersionHeaderLength = 0x46;
2249 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_ICMP;
2250
2251 prvAllowIPPacketIPv4_ExpectAndReturn( pxIPPacket, pxNetworkBuffer, ( pxIPHeader->ucVersionHeaderLength & 0x0FU ) << 2, eProcessBuffer );
2252 prvCheckIP4HeaderOptions_ExpectAndReturn( pxNetworkBuffer, eProcessBuffer );
2253 xCheckRequiresARPResolution_ExpectAndReturn( pxNetworkBuffer, pdFALSE );
2254 vARPRefreshCacheEntryAge_ExpectAnyArgs();
2255 ProcessICMPPacket_ExpectAndReturn( pxNetworkBuffer, eProcessBuffer );
2256
2257 eResult = prvProcessIPPacket( pxIPPacket, pxNetworkBuffer );
2258
2259 TEST_ASSERT_EQUAL( eProcessBuffer, eResult );
2260 }
2261
2262 /**
2263 * @brief test_prvProcessIPPacket_ARPResolutionNotReqd_UDPZeroLength
2264 * To validate the flow to handle a UDPv4 packet with 0 length in UDP header.
2265 */
test_prvProcessIPPacket_ARPResolutionNotReqd_UDPZeroLength(void)2266 void test_prvProcessIPPacket_ARPResolutionNotReqd_UDPZeroLength( void )
2267 {
2268 eFrameProcessingResult_t eResult;
2269 IPPacket_t * pxIPPacket;
2270 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
2271 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
2272 IPHeader_t * pxIPHeader;
2273 UDPPacket_t * pxUDPPacket;
2274
2275 memset( ucEthBuffer, 0, ipconfigTCP_MSS );
2276
2277 /* Initialize network buffer descriptor. */
2278 pxNetworkBuffer = &xNetworkBuffer;
2279 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
2280 pxNetworkBuffer->xDataLength = ipconfigTCP_MSS;
2281
2282 /* Initialize ethernet layer. */
2283 pxIPPacket = ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
2284 pxIPHeader = &( pxIPPacket->xIPHeader );
2285 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
2286 memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
2287
2288 /* Initialize IP layer. */
2289 pxIPHeader->ucVersionHeaderLength = 0x46;
2290 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_UDP;
2291
2292 /* Initialize UDP layer. */
2293 pxUDPPacket = ( UDPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
2294 pxUDPPacket->xUDPHeader.usLength = FreeRTOS_htons( 0 );
2295
2296 prvAllowIPPacketIPv4_ExpectAndReturn( pxIPPacket, pxNetworkBuffer, ( pxIPHeader->ucVersionHeaderLength & 0x0FU ) << 2, eProcessBuffer );
2297 prvCheckIP4HeaderOptions_ExpectAndReturn( pxNetworkBuffer, eProcessBuffer );
2298
2299 eResult = prvProcessIPPacket( pxIPPacket, pxNetworkBuffer );
2300
2301 TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
2302 }
2303
2304 /**
2305 * @brief test_prvProcessIPPacket_ARPResolutionNotReqd_UDPLengthGreaterThanIPHeader
2306 * To validate the flow to handle a UDPv4 packet when length of UDP header is greater
2307 * than the length in IP header.
2308 */
test_prvProcessIPPacket_ARPResolutionNotReqd_UDPLengthGreaterThanIPHeader(void)2309 void test_prvProcessIPPacket_ARPResolutionNotReqd_UDPLengthGreaterThanIPHeader( void )
2310 {
2311 eFrameProcessingResult_t eResult;
2312 IPPacket_t * pxIPPacket;
2313 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
2314 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
2315 IPHeader_t * pxIPHeader;
2316 UDPPacket_t * pxUDPPacket;
2317
2318 memset( ucEthBuffer, 0, ipconfigTCP_MSS );
2319
2320 /* Initialize network buffer descriptor. */
2321 pxNetworkBuffer = &xNetworkBuffer;
2322 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
2323 pxNetworkBuffer->xDataLength = ipconfigTCP_MSS;
2324
2325 /* Initialize ethernet layer. */
2326 pxUDPPacket = ( ( UDPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer );
2327 pxIPPacket = ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
2328 pxIPHeader = &( pxIPPacket->xIPHeader );
2329 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
2330 memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
2331
2332 /* Initialize IP layer. */
2333 pxIPHeader->ucVersionHeaderLength = 0x45;
2334 pxIPHeader->usLength = FreeRTOS_htons( ipconfigTCP_MSS );
2335 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_UDP;
2336
2337 /* Initialize UDP layer. */
2338 /* The length in IP header contains IP header + UDP. So UDP length shouldn't be same as length in IP header. */
2339 pxUDPPacket->xUDPHeader.usLength = FreeRTOS_htons( ipconfigTCP_MSS );
2340
2341 prvAllowIPPacketIPv4_ExpectAndReturn( pxIPPacket, pxNetworkBuffer, ( pxIPHeader->ucVersionHeaderLength & 0x0FU ) << 2, eProcessBuffer );
2342
2343 eResult = prvProcessIPPacket( pxIPPacket, pxNetworkBuffer );
2344
2345 TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
2346 }
2347
2348 /**
2349 * @brief test_prvProcessIPPacket_ARPResolutionNotReqd_UDPHappyPath
2350 * To validate the flow to handle a valid UDPv4 packet.
2351 */
test_prvProcessIPPacket_ARPResolutionNotReqd_UDPHappyPath(void)2352 void test_prvProcessIPPacket_ARPResolutionNotReqd_UDPHappyPath( void )
2353 {
2354 eFrameProcessingResult_t eResult;
2355 IPPacket_t * pxIPPacket;
2356 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
2357 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
2358 IPHeader_t * pxIPHeader;
2359 UDPPacket_t * pxUDPPacket;
2360
2361 memset( ucEthBuffer, 0, ipconfigTCP_MSS );
2362
2363 /* Initialize network buffer descriptor. */
2364 pxNetworkBuffer = &xNetworkBuffer;
2365 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
2366 pxNetworkBuffer->xDataLength = ipconfigTCP_MSS;
2367
2368 /* Initialize ethernet layer. */
2369 pxUDPPacket = ( UDPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
2370 pxIPPacket = ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
2371 pxIPHeader = &( pxIPPacket->xIPHeader );
2372 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
2373 memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
2374
2375 /* Initialize IP layer. */
2376 pxIPHeader->ucVersionHeaderLength = 0x45;
2377 pxIPHeader->usLength = FreeRTOS_htons( ipconfigTCP_MSS );
2378 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_UDP;
2379
2380 /* Initialize UDP layer. */
2381 pxUDPPacket->xUDPHeader.usLength = FreeRTOS_ntohs( sizeof( UDPPacket_t ) );
2382
2383 prvAllowIPPacketIPv4_ExpectAndReturn( pxIPPacket, pxNetworkBuffer, ( pxIPHeader->ucVersionHeaderLength & 0x0FU ) << 2, eProcessBuffer );
2384 xProcessReceivedUDPPacket_ExpectAnyArgsAndReturn( pdPASS );
2385
2386 eResult = prvProcessIPPacket( pxIPPacket, pxNetworkBuffer );
2387
2388 TEST_ASSERT_EQUAL( eFrameConsumed, eResult );
2389 }
2390
2391 /**
2392 * @brief test_prvProcessIPPacket_ARPResolutionNotReqd_UDPProcessFail
2393 * To validate the flow to handle a valid UDPv4 packet but got failure while calling xProcessReceivedUDPPacket().
2394 */
test_prvProcessIPPacket_ARPResolutionNotReqd_UDPProcessFail(void)2395 void test_prvProcessIPPacket_ARPResolutionNotReqd_UDPProcessFail( void )
2396 {
2397 eFrameProcessingResult_t eResult;
2398 IPPacket_t * pxIPPacket;
2399 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
2400 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
2401 IPHeader_t * pxIPHeader;
2402 UDPPacket_t * pxUDPPacket;
2403
2404 memset( ucEthBuffer, 0, ipconfigTCP_MSS );
2405
2406 /* Initialize network buffer descriptor. */
2407 pxNetworkBuffer = &xNetworkBuffer;
2408 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
2409 pxNetworkBuffer->xDataLength = ipconfigTCP_MSS;
2410
2411 /* Initialize ethernet layer. */
2412 pxUDPPacket = ( UDPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
2413 pxIPPacket = ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
2414 pxIPHeader = &( pxIPPacket->xIPHeader );
2415 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
2416 memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
2417
2418 /* Initialize IP layer. */
2419 pxIPHeader->ucVersionHeaderLength = 0x45;
2420 pxIPHeader->usLength = FreeRTOS_htons( ipconfigTCP_MSS );
2421 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_UDP;
2422
2423 /* Initialize UDP layer. */
2424 pxUDPPacket->xUDPHeader.usLength = FreeRTOS_ntohs( sizeof( UDPPacket_t ) );
2425
2426 prvAllowIPPacketIPv4_ExpectAndReturn( pxIPPacket, pxNetworkBuffer, ( pxIPHeader->ucVersionHeaderLength & 0x0FU ) << 2, eProcessBuffer );
2427 xProcessReceivedUDPPacket_ExpectAnyArgsAndReturn( pdFAIL );
2428
2429 eResult = prvProcessIPPacket( pxIPPacket, pxNetworkBuffer );
2430
2431 TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
2432 }
2433
2434 /**
2435 * @brief test_prvProcessIPPacket_ARPResolutionNotReqd_UDPProcessFail
2436 * To validate the flow to handle a valid UDPv4 packet but got failure while calling xProcessReceivedUDPPacket()
2437 * because of waiting ARP resolution.
2438 */
test_prvProcessIPPacket_ARPResolutionReqd_UDP(void)2439 void test_prvProcessIPPacket_ARPResolutionReqd_UDP( void )
2440 {
2441 eFrameProcessingResult_t eResult;
2442 IPPacket_t * pxIPPacket;
2443 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
2444 UBaseType_t uxHeaderLength = 0;
2445 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
2446 IPHeader_t * pxIPHeader;
2447 UDPPacket_t * pxUDPPacket;
2448 BaseType_t xReturnValue = pdTRUE;
2449
2450 memset( ucEthBuffer, 0, ipconfigTCP_MSS );
2451
2452 /* Initialize network buffer descriptor. */
2453 pxNetworkBuffer = &xNetworkBuffer;
2454 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
2455 pxNetworkBuffer->xDataLength = ipconfigTCP_MSS;
2456
2457 /* Initialize ethernet layer. */
2458 pxUDPPacket = ( UDPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
2459 pxIPPacket = ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
2460 pxIPHeader = &( pxIPPacket->xIPHeader );
2461 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
2462 memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
2463
2464 /* Initialize IP layer. */
2465 pxIPHeader->ucVersionHeaderLength = 0x45;
2466 pxIPHeader->usLength = FreeRTOS_htons( ipconfigTCP_MSS );
2467 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_UDP;
2468
2469 /* Initialize UDP layer. */
2470 pxUDPPacket->xUDPHeader.usLength = FreeRTOS_ntohs( sizeof( UDPPacket_t ) );
2471
2472 prvAllowIPPacketIPv4_ExpectAndReturn( pxIPPacket, pxNetworkBuffer, ( pxIPHeader->ucVersionHeaderLength & 0x0FU ) << 2, eProcessBuffer );
2473 xProcessReceivedUDPPacket_ExpectAndReturn( pxNetworkBuffer, pxUDPPacket->xUDPHeader.usDestinationPort, NULL, pdFAIL );
2474 xProcessReceivedUDPPacket_IgnoreArg_pxIsWaitingForARPResolution();
2475 xProcessReceivedUDPPacket_ReturnThruPtr_pxIsWaitingForARPResolution( &xReturnValue );
2476
2477 eResult = prvProcessIPPacket( pxIPPacket, pxNetworkBuffer );
2478
2479 TEST_ASSERT_EQUAL( eWaitingARPResolution, eResult );
2480 TEST_ASSERT_EQUAL( FreeRTOS_ntohs( pxUDPPacket->xUDPHeader.usLength ) - sizeof( UDPHeader_t ) + sizeof( UDPPacket_t ), pxNetworkBuffer->xDataLength );
2481 TEST_ASSERT_EQUAL( pxNetworkBuffer->usPort, pxUDPPacket->xUDPHeader.usSourcePort );
2482 TEST_ASSERT_EQUAL( pxNetworkBuffer->xIPAddress.ulIP_IPv4, pxUDPPacket->xIPHeader.ulSourceIPAddress );
2483 }
2484
2485 /**
2486 * @brief test_prvProcessIPPacket_ARPResolutionNotReqd_UDPProcessFail
2487 * To validate the flow to handle a valid UDPv4 packet but got failure while calling xProcessReceivedUDPPacket()
2488 * because of waiting ARP resolution. And the network buffer size is small than UDP header.
2489 */
test_prvProcessIPPacket_ARPResolutionReqd_UDP1(void)2490 void test_prvProcessIPPacket_ARPResolutionReqd_UDP1( void )
2491 {
2492 eFrameProcessingResult_t eResult;
2493 IPPacket_t * pxIPPacket;
2494 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
2495 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
2496 IPHeader_t * pxIPHeader;
2497 UDPPacket_t * pxUDPPacket;
2498 BaseType_t xReturnValue = pdTRUE;
2499
2500 memset( ucEthBuffer, 0, ipconfigTCP_MSS );
2501
2502 /* Initialize network buffer descriptor. */
2503 pxNetworkBuffer = &xNetworkBuffer;
2504 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
2505 pxNetworkBuffer->xDataLength = sizeof( UDPPacket_t );
2506
2507 /* Initialize ethernet layer. */
2508 pxUDPPacket = ( UDPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
2509 pxIPPacket = ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
2510 pxIPHeader = &( pxIPPacket->xIPHeader );
2511 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
2512 memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
2513
2514 /* Initialize IP layer. */
2515 pxIPHeader->ucVersionHeaderLength = 0x45;
2516 pxIPHeader->usLength = FreeRTOS_htons( ipconfigTCP_MSS );
2517 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_UDP;
2518
2519 /* Initialize UDP layer. */
2520 pxUDPPacket->xUDPHeader.usLength = FreeRTOS_ntohs( sizeof( UDPPacket_t ) );
2521
2522 prvAllowIPPacketIPv4_ExpectAndReturn( pxIPPacket, pxNetworkBuffer, ( pxIPHeader->ucVersionHeaderLength & 0x0FU ) << 2, eProcessBuffer );
2523 xProcessReceivedUDPPacket_ExpectAndReturn( pxNetworkBuffer, pxUDPPacket->xUDPHeader.usDestinationPort, NULL, pdFAIL );
2524 xProcessReceivedUDPPacket_IgnoreArg_pxIsWaitingForARPResolution();
2525 xProcessReceivedUDPPacket_ReturnThruPtr_pxIsWaitingForARPResolution( &xReturnValue );
2526
2527 eResult = prvProcessIPPacket( pxIPPacket, pxNetworkBuffer );
2528
2529 TEST_ASSERT_EQUAL( eWaitingARPResolution, eResult );
2530 TEST_ASSERT_EQUAL( pxNetworkBuffer->usPort, pxUDPPacket->xUDPHeader.usSourcePort );
2531 TEST_ASSERT_EQUAL( pxNetworkBuffer->xIPAddress.ulIP_IPv4, pxUDPPacket->xIPHeader.ulSourceIPAddress );
2532 }
2533
2534 /**
2535 * @brief test_prvProcessIPPacket_TCP
2536 * To validate the flow to handle a valid TCPv4 packet and no ARP resolution needed.
2537 */
test_prvProcessIPPacket_TCP(void)2538 void test_prvProcessIPPacket_TCP( void )
2539 {
2540 eFrameProcessingResult_t eResult;
2541 IPPacket_t * pxIPPacket;
2542 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
2543 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
2544 IPHeader_t * pxIPHeader;
2545 BaseType_t xReturnValue = pdTRUE;
2546 uint32_t backup = xProcessedTCPMessage;
2547
2548 memset( ucEthBuffer, 0, ipconfigTCP_MSS );
2549
2550 /* Initialize network buffer descriptor. */
2551 pxNetworkBuffer = &xNetworkBuffer;
2552 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
2553 pxNetworkBuffer->xDataLength = sizeof( UDPPacket_t );
2554
2555 /* Initialize ethernet layer. */
2556 pxIPPacket = ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
2557 pxIPHeader = &( pxIPPacket->xIPHeader );
2558 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
2559 memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
2560
2561 /* Initialize IP layer. */
2562 pxIPHeader->ucVersionHeaderLength = 0x45;
2563 pxIPHeader->usLength = FreeRTOS_htons( ipconfigTCP_MSS );
2564 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_TCP;
2565
2566 prvAllowIPPacketIPv4_ExpectAndReturn( pxIPPacket, pxNetworkBuffer, ( pxIPHeader->ucVersionHeaderLength & 0x0FU ) << 2, eProcessBuffer );
2567 xCheckRequiresARPResolution_ExpectAndReturn( pxNetworkBuffer, pdFALSE );
2568 vARPRefreshCacheEntryAge_ExpectAnyArgs();
2569 xProcessReceivedTCPPacket_ExpectAndReturn( pxNetworkBuffer, pdPASS );
2570
2571 eResult = prvProcessIPPacket( pxIPPacket, pxNetworkBuffer );
2572
2573 TEST_ASSERT_EQUAL( eFrameConsumed, eResult );
2574 TEST_ASSERT_EQUAL( backup + 1, xProcessedTCPMessage );
2575 }
2576
2577 /**
2578 * @brief test_prvProcessIPPacket_TCPProcessFail
2579 * To validate the flow to handle a valid TCPv4 packet and no ARP resolution needed.
2580 * Got failure while calling xProcessReceivedTCPPacket().
2581 */
test_prvProcessIPPacket_TCPProcessFail(void)2582 void test_prvProcessIPPacket_TCPProcessFail( void )
2583 {
2584 eFrameProcessingResult_t eResult;
2585 IPPacket_t * pxIPPacket;
2586 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
2587 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
2588 IPHeader_t * pxIPHeader;
2589 BaseType_t xReturnValue = pdTRUE;
2590 uint32_t backup = xProcessedTCPMessage;
2591 NetworkEndPoint_t xEndPoint = { 0 };
2592
2593 memset( ucEthBuffer, 0, ipconfigTCP_MSS );
2594
2595 /* Initialize network buffer descriptor. */
2596 pxNetworkBuffer = &xNetworkBuffer;
2597 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
2598 pxNetworkBuffer->xDataLength = sizeof( UDPPacket_t );
2599
2600 /* Initialize ethernet layer. */
2601 pxIPPacket = ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
2602 pxIPHeader = &( pxIPPacket->xIPHeader );
2603 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
2604 memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
2605
2606 /* Initialize IP layer. */
2607 pxIPHeader->ucVersionHeaderLength = 0x45;
2608 pxIPHeader->usLength = FreeRTOS_htons( ipconfigTCP_MSS );
2609 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_TCP;
2610
2611 prvAllowIPPacketIPv4_ExpectAndReturn( pxIPPacket, pxNetworkBuffer, ( pxIPHeader->ucVersionHeaderLength & 0x0FU ) << 2, eProcessBuffer );
2612 xCheckRequiresARPResolution_ExpectAndReturn( pxNetworkBuffer, pdFALSE );
2613 vARPRefreshCacheEntryAge_ExpectAnyArgs();
2614 xProcessReceivedTCPPacket_ExpectAndReturn( pxNetworkBuffer, pdFAIL );
2615
2616 eResult = prvProcessIPPacket( pxIPPacket, pxNetworkBuffer );
2617
2618 TEST_ASSERT_EQUAL( eProcessBuffer, eResult );
2619 TEST_ASSERT_EQUAL( backup + 1, xProcessedTCPMessage );
2620 }
2621
2622 /**
2623 * @brief test_prvProcessIPPacket_UDP_ExternalLoopback
2624 * To validate the flow to handle a UDPv4 packet but the destination IP address
2625 * is loop-back address.
2626 */
test_prvProcessIPPacket_UDP_ExternalLoopback(void)2627 void test_prvProcessIPPacket_UDP_ExternalLoopback( void )
2628 {
2629 eFrameProcessingResult_t eResult;
2630 IPPacket_t * pxIPPacket;
2631 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
2632 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
2633 IPHeader_t * pxIPHeader;
2634
2635 memset( ucEthBuffer, 0, ipconfigTCP_MSS );
2636
2637 /* Initialize network buffer descriptor. */
2638 pxNetworkBuffer = &xNetworkBuffer;
2639 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
2640 pxNetworkBuffer->xDataLength = ipconfigTCP_MSS;
2641
2642 /* Initialize ethernet layer. */
2643 pxIPPacket = ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
2644 pxIPHeader = &( pxIPPacket->xIPHeader );
2645 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
2646 memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
2647
2648 /* Initialize IP layer. */
2649 pxIPHeader->ucVersionHeaderLength = 0x45;
2650 pxIPHeader->ulDestinationIPAddress = FreeRTOS_htonl( ipFIRST_LOOPBACK_IPv4 );
2651 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_UDP;
2652
2653 prvAllowIPPacketIPv4_ExpectAndReturn( pxIPPacket, pxNetworkBuffer, ( pxIPHeader->ucVersionHeaderLength & 0x0FU ) << 2, eProcessBuffer );
2654
2655 eResult = prvProcessIPPacket( pxIPPacket, pxNetworkBuffer );
2656
2657 TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
2658 }
2659
2660 /**
2661 * @brief test_prvProcessIPPacket_UDP_GreaterLoopbackAddress
2662 * To validate the flow to handle a UDPv4 packet but the destination IP address
2663 * is greater than loop-back address.
2664 */
test_prvProcessIPPacket_UDP_GreaterLoopbackAddress(void)2665 void test_prvProcessIPPacket_UDP_GreaterLoopbackAddress( void )
2666 {
2667 eFrameProcessingResult_t eResult;
2668 IPPacket_t * pxIPPacket;
2669 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
2670 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
2671 IPHeader_t * pxIPHeader;
2672
2673 memset( ucEthBuffer, 0, ipconfigTCP_MSS );
2674
2675 /* Initialize network buffer descriptor. */
2676 pxNetworkBuffer = &xNetworkBuffer;
2677 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
2678 pxNetworkBuffer->xDataLength = 0;
2679
2680 /* Initialize ethernet layer. */
2681 pxIPPacket = ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
2682 pxIPHeader = &( pxIPPacket->xIPHeader );
2683 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
2684 memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
2685
2686 /* Initialize IP layer. */
2687 pxIPHeader->ucVersionHeaderLength = 0x45;
2688 pxIPHeader->ulDestinationIPAddress = FreeRTOS_htonl( ipLAST_LOOPBACK_IPv4 );
2689 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_UDP;
2690
2691 prvAllowIPPacketIPv4_ExpectAndReturn( pxIPPacket, pxNetworkBuffer, ( pxIPHeader->ucVersionHeaderLength & 0x0FU ) << 2, eProcessBuffer );
2692
2693 eResult = prvProcessIPPacket( pxIPPacket, pxNetworkBuffer );
2694
2695 TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
2696 }
2697
2698 /**
2699 * @brief test_prvProcessIPPacket_UDP_LessLoopbackAddress
2700 * To validate the flow to handle a UDPv4 packet but the destination IP address
2701 * is less than loop-back address.
2702 */
test_prvProcessIPPacket_UDP_LessLoopbackAddress(void)2703 void test_prvProcessIPPacket_UDP_LessLoopbackAddress( void )
2704 {
2705 eFrameProcessingResult_t eResult;
2706 IPPacket_t * pxIPPacket;
2707 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
2708 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
2709 IPHeader_t * pxIPHeader;
2710
2711 memset( ucEthBuffer, 0, ipconfigTCP_MSS );
2712
2713 /* Initialize network buffer descriptor. */
2714 pxNetworkBuffer = &xNetworkBuffer;
2715 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
2716 pxNetworkBuffer->xDataLength = 0;
2717
2718 /* Initialize ethernet layer. */
2719 pxIPPacket = ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
2720 pxIPHeader = &( pxIPPacket->xIPHeader );
2721 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
2722 memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, xBroadcastMACAddress.ucBytes, sizeof( MACAddress_t ) );
2723
2724 /* Initialize IP layer. */
2725 pxIPHeader->ucVersionHeaderLength = 0x45;
2726 pxIPHeader->ulDestinationIPAddress = FreeRTOS_htonl( ipFIRST_LOOPBACK_IPv4 - 1 );
2727 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_UDP;
2728
2729 prvAllowIPPacketIPv4_ExpectAndReturn( pxIPPacket, pxNetworkBuffer, ( pxIPHeader->ucVersionHeaderLength & 0x0FU ) << 2, eProcessBuffer );
2730
2731 eResult = prvProcessIPPacket( pxIPPacket, pxNetworkBuffer );
2732
2733 TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
2734 }
2735
2736 /**
2737 * @brief test_prvProcessIPPacket_UDP_IPHeaderLengthTooLarge
2738 * To validate the flow to handle a UDPv4 packet but the header length in
2739 * IP header is greater than buffer size.
2740 */
test_prvProcessIPPacket_UDP_IPHeaderLengthTooLarge(void)2741 void test_prvProcessIPPacket_UDP_IPHeaderLengthTooLarge( void )
2742 {
2743 eFrameProcessingResult_t eResult;
2744 IPPacket_t * pxIPPacket;
2745 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
2746 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
2747 IPHeader_t * pxIPHeader;
2748
2749 memset( ucEthBuffer, 0, ipconfigTCP_MSS );
2750
2751 /* Initialize network buffer descriptor. */
2752 pxNetworkBuffer = &xNetworkBuffer;
2753 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
2754 pxNetworkBuffer->xDataLength = ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv4_HEADER;
2755
2756 /* Initialize ethernet layer. */
2757 pxIPPacket = ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
2758 pxIPHeader = &( pxIPPacket->xIPHeader );
2759 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
2760
2761 /* Initialize IP layer. */
2762 /* The length in IP header is larger than buffer size. */
2763 pxIPHeader->ucVersionHeaderLength = 0x4F;
2764 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_UDP;
2765
2766 eResult = prvProcessIPPacket( pxIPPacket, pxNetworkBuffer );
2767
2768 TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
2769 }
2770
2771 /**
2772 * @brief test_prvProcessIPPacket_UDP_IPv6_HappyPath
2773 * To validate the flow to handle a UDPv6 packet successfully.
2774 */
test_prvProcessIPPacket_UDP_IPv6_HappyPath(void)2775 void test_prvProcessIPPacket_UDP_IPv6_HappyPath( void )
2776 {
2777 eFrameProcessingResult_t eResult;
2778 IPPacket_IPv6_t * pxIPPacket;
2779 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
2780 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
2781 IPHeader_IPv6_t * pxIPHeader;
2782 UDPPacket_IPv6_t * pxUDPPacket;
2783 BaseType_t xReturnValue = pdTRUE;
2784
2785 memset( ucEthBuffer, 0, ipconfigTCP_MSS );
2786
2787 /* Initialize network buffer descriptor. */
2788 pxNetworkBuffer = &xNetworkBuffer;
2789 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
2790 pxNetworkBuffer->xDataLength = ipconfigTCP_MSS;
2791
2792 /* Initialize ethernet layer. */
2793 pxUDPPacket = ( UDPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
2794 pxIPPacket = ( IPHeader_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
2795 pxIPHeader = &( pxIPPacket->xIPHeader );
2796 pxIPPacket->xEthernetHeader.usFrameType = ipIPv6_FRAME_TYPE;
2797 memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, ucMACAddress, sizeof( MACAddress_t ) );
2798
2799 /* Initialize IP layer. */
2800 pxIPHeader->ucVersionTrafficClass = 0x60;
2801 pxIPHeader->usPayloadLength = FreeRTOS_htons( ipconfigTCP_MSS ) - sizeof( IPPacket_IPv6_t );
2802 pxIPPacket->xIPHeader.ucNextHeader = ipPROTOCOL_UDP;
2803
2804 /* Initialize UDP layer. */
2805 pxUDPPacket->xUDPHeader.usLength = FreeRTOS_ntohs( FreeRTOS_htons( ipconfigTCP_MSS ) - sizeof( UDPPacket_IPv6_t ) );
2806
2807 prvAllowIPPacketIPv6_ExpectAndReturn( pxIPHeader, pxNetworkBuffer, ipSIZE_OF_IPv6_HEADER, eProcessBuffer );
2808 xGetExtensionOrder_ExpectAndReturn( ipPROTOCOL_UDP, 0U, 0 );
2809 xProcessReceivedUDPPacket_ExpectAnyArgsAndReturn( pdPASS );
2810
2811 eResult = prvProcessIPPacket( pxIPPacket, pxNetworkBuffer );
2812
2813 TEST_ASSERT_EQUAL( eFrameConsumed, eResult );
2814 }
2815
2816 /**
2817 * @brief test_prvProcessIPPacket_UDP_IPv6_ExtensionHappyPath
2818 * To validate the flow to handle a UDPv6 packet with extension header successfully.
2819 */
test_prvProcessIPPacket_UDP_IPv6_ExtensionHappyPath(void)2820 void test_prvProcessIPPacket_UDP_IPv6_ExtensionHappyPath( void )
2821 {
2822 eFrameProcessingResult_t eResult;
2823 IPPacket_IPv6_t * pxIPPacket;
2824 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
2825 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
2826 IPHeader_IPv6_t * pxIPHeader;
2827 UDPPacket_IPv6_t * pxUDPPacket;
2828 BaseType_t xReturnValue = pdTRUE;
2829
2830 memset( ucEthBuffer, 0, ipconfigTCP_MSS );
2831
2832 /* Initialize network buffer descriptor. */
2833 pxNetworkBuffer = &xNetworkBuffer;
2834 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
2835 pxNetworkBuffer->xDataLength = ipconfigTCP_MSS;
2836
2837 /* Initialize ethernet layer. */
2838 pxUDPPacket = ( UDPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
2839 pxIPPacket = ( IPHeader_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
2840 pxIPHeader = &( pxIPPacket->xIPHeader );
2841 pxIPPacket->xEthernetHeader.usFrameType = ipIPv6_FRAME_TYPE;
2842 memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, ucMACAddress, sizeof( MACAddress_t ) );
2843
2844 pxIPHeader->ucVersionTrafficClass = 0x60;
2845
2846 pxIPHeader->usPayloadLength = FreeRTOS_htons( ipconfigTCP_MSS ) - sizeof( IPPacket_IPv6_t );
2847
2848 /* Packet not meant for this node. */
2849 memcpy( pxIPHeader->xSourceAddress.ucBytes, xIPAddressTen.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
2850 memcpy( pxIPHeader->xDestinationAddress.ucBytes, xIPAddressFive.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
2851
2852 /* Set the protocol to be IPv6 UDP. */
2853 pxIPPacket->xIPHeader.ucNextHeader = ipPROTOCOL_UDP;
2854
2855 pxUDPPacket->xUDPHeader.usLength = FreeRTOS_ntohs( FreeRTOS_htons( ipconfigTCP_MSS ) - sizeof( UDPPacket_IPv6_t ) );
2856
2857 prvAllowIPPacketIPv6_ExpectAndReturn( pxIPHeader, pxNetworkBuffer, ipSIZE_OF_IPv6_HEADER, eProcessBuffer );
2858 xGetExtensionOrder_ExpectAndReturn( ipPROTOCOL_UDP, 0U, 1 );
2859 eHandleIPv6ExtensionHeaders_ExpectAndReturn( pxNetworkBuffer, pdTRUE, eProcessBuffer );
2860 xProcessReceivedUDPPacket_ExpectAnyArgsAndReturn( pdPASS );
2861
2862 eResult = prvProcessIPPacket( pxIPPacket, pxNetworkBuffer );
2863
2864 TEST_ASSERT_EQUAL( eFrameConsumed, eResult );
2865 }
2866
2867 /**
2868 * @brief test_prvProcessIPPacket_UDP_IPv6_ExtensionHandleFail
2869 * To validate the flow to handle a UDPv6 packet with extension header but got failure
2870 * while handling extension header.
2871 */
test_prvProcessIPPacket_UDP_IPv6_ExtensionHandleFail(void)2872 void test_prvProcessIPPacket_UDP_IPv6_ExtensionHandleFail( void )
2873 {
2874 eFrameProcessingResult_t eResult;
2875 IPPacket_IPv6_t * pxIPPacket;
2876 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
2877 UBaseType_t uxHeaderLength = 0;
2878 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
2879 IPHeader_IPv6_t * pxIPHeader;
2880 UDPPacket_IPv6_t * pxUDPPacket;
2881 BaseType_t xReturnValue = pdTRUE;
2882
2883 memset( ucEthBuffer, 0, ipconfigTCP_MSS );
2884
2885 pxNetworkBuffer = &xNetworkBuffer;
2886 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
2887 pxNetworkBuffer->xDataLength = ipconfigTCP_MSS;
2888
2889 pxUDPPacket = ( UDPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
2890
2891 pxIPPacket = ( IPHeader_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
2892 pxIPHeader = &( pxIPPacket->xIPHeader );
2893 pxIPHeader->ucVersionTrafficClass = 0x60;
2894
2895 pxIPHeader->usPayloadLength = FreeRTOS_htons( ipconfigTCP_MSS ) - sizeof( IPPacket_IPv6_t );
2896
2897 /* Packet not meant for this node. */
2898 memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, ucMACAddress, sizeof( MACAddress_t ) );
2899 memcpy( pxIPHeader->xSourceAddress.ucBytes, xIPAddressTen.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
2900 memcpy( pxIPHeader->xDestinationAddress.ucBytes, xIPAddressFive.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
2901
2902 /* Set the protocol to be IPv6 UDP. */
2903 pxIPPacket->xEthernetHeader.usFrameType = ipIPv6_FRAME_TYPE;
2904 pxIPPacket->xIPHeader.ucNextHeader = ipPROTOCOL_UDP;
2905
2906 pxUDPPacket->xUDPHeader.usLength = FreeRTOS_ntohs( FreeRTOS_htons( ipconfigTCP_MSS ) - sizeof( UDPPacket_IPv6_t ) );
2907
2908 prvAllowIPPacketIPv6_ExpectAndReturn( pxIPHeader, pxNetworkBuffer, ipSIZE_OF_IPv6_HEADER, eProcessBuffer );
2909 xGetExtensionOrder_ExpectAndReturn( ipPROTOCOL_UDP, 0U, 1 );
2910 eHandleIPv6ExtensionHeaders_ExpectAndReturn( pxNetworkBuffer, pdTRUE, eReleaseBuffer );
2911
2912 eResult = prvProcessIPPacket( pxIPPacket, pxNetworkBuffer );
2913
2914 TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
2915 }
2916
2917 /**
2918 * @brief test_prvProcessIPPacket_TCP_IPv6_HappyPath
2919 * To validate the flow to handle a TCPv6 packet successfully.
2920 */
test_prvProcessIPPacket_TCP_IPv6_HappyPath(void)2921 void test_prvProcessIPPacket_TCP_IPv6_HappyPath( void )
2922 {
2923 eFrameProcessingResult_t eResult;
2924 IPPacket_IPv6_t * pxIPPacket;
2925 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
2926 UBaseType_t uxHeaderLength = 0;
2927 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
2928 IPHeader_IPv6_t * pxIPHeader;
2929 TCPPacket_IPv6_t * pxTCPPacket;
2930 BaseType_t xReturnValue = pdTRUE;
2931
2932 memset( ucEthBuffer, 0, ipconfigTCP_MSS );
2933
2934 pxNetworkBuffer = &xNetworkBuffer;
2935 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
2936 pxNetworkBuffer->xDataLength = ipconfigTCP_MSS;
2937
2938 pxTCPPacket = ( TCPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
2939
2940 pxIPPacket = ( IPHeader_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
2941 pxIPHeader = &( pxIPPacket->xIPHeader );
2942 pxIPHeader->ucVersionTrafficClass = 0x60;
2943
2944 pxIPHeader->usPayloadLength = FreeRTOS_htons( ipconfigTCP_MSS ) - sizeof( IPPacket_IPv6_t );
2945
2946 /* Packet not meant for this node. */
2947 memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, ucMACAddress, sizeof( MACAddress_t ) );
2948 memcpy( pxIPHeader->xSourceAddress.ucBytes, xIPAddressTen.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
2949 memcpy( pxIPHeader->xDestinationAddress.ucBytes, xIPAddressFive.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
2950
2951 /* Set the protocol to be IPv6 UDP. */
2952 pxIPPacket->xEthernetHeader.usFrameType = ipIPv6_FRAME_TYPE;
2953 pxIPPacket->xIPHeader.ucNextHeader = ipPROTOCOL_TCP;
2954
2955 prvAllowIPPacketIPv6_ExpectAndReturn( pxIPHeader, pxNetworkBuffer, ipSIZE_OF_IPv6_HEADER, eProcessBuffer );
2956 xGetExtensionOrder_ExpectAndReturn( ipPROTOCOL_TCP, 0U, 0 );
2957 xCheckRequiresARPResolution_ExpectAndReturn( pxNetworkBuffer, pdFALSE );
2958 vNDRefreshCacheEntry_Ignore();
2959 xProcessReceivedTCPPacket_ExpectAnyArgsAndReturn( pdPASS );
2960
2961 eResult = prvProcessIPPacket( pxIPPacket, pxNetworkBuffer );
2962
2963 TEST_ASSERT_EQUAL( eFrameConsumed, eResult );
2964 }
2965
2966 /**
2967 * @brief test_prvProcessIPPacket_TCP_IPv6_HappyPath
2968 * To validate the flow to handle a TCPv6 packet successfully.
2969 * Then it needs to update ND resolution.
2970 */
test_prvProcessIPPacket_TCP_IPv6_ARPResolution(void)2971 void test_prvProcessIPPacket_TCP_IPv6_ARPResolution( void )
2972 {
2973 eFrameProcessingResult_t eResult;
2974 IPPacket_IPv6_t * pxIPPacket;
2975 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
2976 UBaseType_t uxHeaderLength = 0;
2977 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
2978 IPHeader_IPv6_t * pxIPHeader;
2979 TCPPacket_IPv6_t * pxTCPPacket;
2980 BaseType_t xReturnValue = pdTRUE;
2981
2982 memset( ucEthBuffer, 0, ipconfigTCP_MSS );
2983
2984 pxNetworkBuffer = &xNetworkBuffer;
2985 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
2986 pxNetworkBuffer->xDataLength = ipconfigTCP_MSS;
2987
2988 pxTCPPacket = ( TCPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
2989
2990 pxIPPacket = ( IPHeader_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
2991 pxIPHeader = &( pxIPPacket->xIPHeader );
2992 pxIPHeader->ucVersionTrafficClass = 0x60;
2993
2994 pxIPHeader->usPayloadLength = FreeRTOS_htons( ipconfigTCP_MSS ) - sizeof( IPPacket_IPv6_t );
2995
2996 /* Packet not meant for this node. */
2997 memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, ucMACAddress, sizeof( MACAddress_t ) );
2998 memcpy( pxIPHeader->xSourceAddress.ucBytes, xIPAddressTen.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
2999 memcpy( pxIPHeader->xDestinationAddress.ucBytes, xIPAddressFive.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
3000
3001 /* Set the protocol to be IPv6 UDP. */
3002 pxIPPacket->xEthernetHeader.usFrameType = ipIPv6_FRAME_TYPE;
3003 pxIPPacket->xIPHeader.ucNextHeader = ipPROTOCOL_TCP;
3004
3005 prvAllowIPPacketIPv6_ExpectAndReturn( pxIPHeader, pxNetworkBuffer, ipSIZE_OF_IPv6_HEADER, eProcessBuffer );
3006 xGetExtensionOrder_ExpectAndReturn( ipPROTOCOL_TCP, 0U, 0 );
3007 xCheckRequiresARPResolution_ExpectAndReturn( pxNetworkBuffer, pdTRUE );
3008
3009 eResult = prvProcessIPPacket( pxIPPacket, pxNetworkBuffer );
3010
3011 TEST_ASSERT_EQUAL( eWaitingARPResolution, eResult );
3012 }
3013
3014 /**
3015 * @brief test_prvProcessIPPacket_ICMP_IPv6_HappyPath
3016 * To validate the flow to handle a ICMPv6 packet successfully.
3017 */
test_prvProcessIPPacket_ICMP_IPv6_HappyPath(void)3018 void test_prvProcessIPPacket_ICMP_IPv6_HappyPath( void )
3019 {
3020 eFrameProcessingResult_t eResult;
3021 IPPacket_IPv6_t * pxIPPacket;
3022 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
3023 UBaseType_t uxHeaderLength = 0;
3024 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
3025 IPHeader_IPv6_t * pxIPHeader;
3026 ICMPPacket_IPv6_t * pxICMPPacket;
3027 BaseType_t xReturnValue = pdTRUE;
3028
3029 memset( ucEthBuffer, 0, ipconfigTCP_MSS );
3030
3031 pxNetworkBuffer = &xNetworkBuffer;
3032 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
3033 pxNetworkBuffer->xDataLength = ipconfigTCP_MSS;
3034
3035 pxICMPPacket = ( ICMPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
3036
3037 pxIPPacket = ( IPHeader_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
3038 pxIPHeader = &( pxIPPacket->xIPHeader );
3039 pxIPHeader->ucVersionTrafficClass = 0x60;
3040
3041 pxIPHeader->usPayloadLength = FreeRTOS_htons( ipconfigTCP_MSS ) - sizeof( IPPacket_IPv6_t );
3042
3043 /* Packet not meant for this node. */
3044 memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, ucMACAddress, sizeof( MACAddress_t ) );
3045 memcpy( pxIPHeader->xSourceAddress.ucBytes, xIPAddressTen.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
3046 memcpy( pxIPHeader->xDestinationAddress.ucBytes, xIPAddressFive.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
3047
3048 /* Set the protocol to be IPv6 UDP. */
3049 pxIPPacket->xEthernetHeader.usFrameType = ipIPv6_FRAME_TYPE;
3050 pxIPPacket->xIPHeader.ucNextHeader = ipPROTOCOL_ICMP_IPv6;
3051
3052 prvAllowIPPacketIPv6_ExpectAndReturn( pxIPHeader, pxNetworkBuffer, ipSIZE_OF_IPv6_HEADER, eProcessBuffer );
3053 xGetExtensionOrder_ExpectAndReturn( ipPROTOCOL_ICMP_IPv6, 0U, 0 );
3054 xCheckRequiresARPResolution_ExpectAndReturn( pxNetworkBuffer, pdFALSE );
3055 vNDRefreshCacheEntry_Ignore();
3056 prvProcessICMPMessage_IPv6_ExpectAnyArgsAndReturn( eReleaseBuffer );
3057
3058 eResult = prvProcessIPPacket( pxIPPacket, pxNetworkBuffer );
3059
3060 TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
3061 }
3062
3063 /**
3064 * @brief The packet size is less than IPv6 minimum packet size.
3065 */
test_prvProcessIPPacket_IPv6_LessPacketSize(void)3066 void test_prvProcessIPPacket_IPv6_LessPacketSize( void )
3067 {
3068 eFrameProcessingResult_t eResult;
3069 IPPacket_IPv6_t * pxIPPacket;
3070 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
3071 UBaseType_t uxHeaderLength = 0;
3072 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
3073 IPHeader_IPv6_t * pxIPHeader;
3074 BaseType_t xReturnValue = pdTRUE;
3075
3076 memset( ucEthBuffer, 0, ipconfigTCP_MSS );
3077
3078 pxNetworkBuffer = &xNetworkBuffer;
3079 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
3080 pxNetworkBuffer->xDataLength = sizeof( IPPacket_IPv6_t ) - 1;
3081
3082 pxIPPacket = ( IPHeader_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
3083 pxIPPacket->xEthernetHeader.usFrameType = ipIPv6_FRAME_TYPE;
3084
3085 eResult = prvProcessIPPacket( pxIPPacket, pxNetworkBuffer );
3086
3087 TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
3088 }
3089
3090 /**
3091 * @brief test_vReturnEthernetFrame
3092 * To validate if vReturnEthernetFrame changes the source/destination MAC addresses correctly
3093 * and transmits though network interface.
3094 */
test_vReturnEthernetFrame(void)3095 void test_vReturnEthernetFrame( void )
3096 {
3097 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
3098 BaseType_t xReleaseAfterSend = pdFALSE;
3099 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
3100 EthernetHeader_t * pxEthernetHeader;
3101 NetworkEndPoint_t xEndPoint, * pxEndPoint = &xEndPoint;
3102
3103 pxNetworkBuffer = &xNetworkBuffer;
3104 pxNetworkBuffer->pxEndPoint = &xEndPoint;
3105
3106 memset( pxNetworkBuffer, 0, sizeof( NetworkBufferDescriptor_t ) );
3107
3108 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
3109 pxNetworkBuffer->pxEndPoint = pxEndPoint;
3110 xEndPoint.pxNetworkInterface = &xInterfaces;
3111 xEndPoint.pxNetworkInterface->pfOutput = &NetworkInterfaceOutputFunction_Stub;
3112 memset( pxEndPoint->xMACAddress.ucBytes, 0x11, sizeof( pxEndPoint->xMACAddress ) );
3113 NetworkInterfaceOutputFunction_Stub_Called = 0;
3114
3115 memset( ucEthBuffer, 0xAA, ipconfigTCP_MSS );
3116
3117 pxEthernetHeader = ( EthernetHeader_t * ) pxNetworkBuffer->pucEthernetBuffer;
3118 memset( &pxEthernetHeader->xDestinationAddress, 0, sizeof( pxEthernetHeader->xDestinationAddress ) );
3119 memset( &pxEthernetHeader->xSourceAddress, 0x22, sizeof( pxEthernetHeader->xSourceAddress ) );
3120
3121 pxNetworkBuffer->xDataLength = ipconfigETHERNET_MINIMUM_PACKET_BYTES - 10;
3122
3123 FreeRTOS_FindEndPointOnNetMask_IgnoreAndReturn( pxNetworkBuffer->pxEndPoint );
3124
3125 xIsCallingFromIPTask_ExpectAndReturn( pdTRUE );
3126
3127 vReturnEthernetFrame( pxNetworkBuffer, xReleaseAfterSend );
3128
3129 TEST_ASSERT_EQUAL( ipconfigETHERNET_MINIMUM_PACKET_BYTES, pxNetworkBuffer->xDataLength );
3130 TEST_ASSERT_EACH_EQUAL_UINT8( 0, &ucEthBuffer[ ipconfigETHERNET_MINIMUM_PACKET_BYTES - 10 ], 10 );
3131 TEST_ASSERT_EACH_EQUAL_UINT8( 0x22, &pxEthernetHeader->xDestinationAddress, sizeof( pxEthernetHeader->xDestinationAddress ) );
3132 TEST_ASSERT_EACH_EQUAL_UINT8( 0x11, &pxEthernetHeader->xSourceAddress, sizeof( pxEthernetHeader->xSourceAddress ) );
3133 TEST_ASSERT_EQUAL_MEMORY( pxNetworkBuffer->pxEndPoint->xMACAddress.ucBytes, &pxEthernetHeader->xSourceAddress, sizeof( pxEthernetHeader->xSourceAddress ) );
3134 TEST_ASSERT_EQUAL( 1, NetworkInterfaceOutputFunction_Stub_Called );
3135 }
3136
3137 /**
3138 * @brief test_vReturnEthernetFrame_DataLenMoreThanRequired
3139 * To validate if vReturnEthernetFrame changes the source/destination MAC addresses correctly
3140 * and transmits though network interface. And the buffer length is equal to ipconfigETHERNET_MINIMUM_PACKET_BYTES.
3141 */
test_vReturnEthernetFrame_DataLenMoreThanRequired(void)3142 void test_vReturnEthernetFrame_DataLenMoreThanRequired( void )
3143 {
3144 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
3145 BaseType_t xReleaseAfterSend = pdFALSE;
3146 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
3147 EthernetHeader_t * pxEthernetHeader;
3148 NetworkEndPoint_t xEndPoint, * pxEndPoint = &xEndPoint;
3149
3150 pxNetworkBuffer = &xNetworkBuffer;
3151 memset( pxNetworkBuffer, 0, sizeof( NetworkBufferDescriptor_t ) );
3152
3153 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
3154 pxNetworkBuffer->pxEndPoint = pxEndPoint;
3155 xEndPoint.pxNetworkInterface = &xInterfaces;
3156 xEndPoint.pxNetworkInterface->pfOutput = &NetworkInterfaceOutputFunction_Stub;
3157 NetworkInterfaceOutputFunction_Stub_Called = 0;
3158 memset( ucEthBuffer, 0xAA, ipconfigTCP_MSS );
3159
3160 pxEthernetHeader = ( EthernetHeader_t * ) pxNetworkBuffer->pucEthernetBuffer;
3161 memset( &pxEthernetHeader->xDestinationAddress, 0x11, sizeof( pxEthernetHeader->xDestinationAddress ) );
3162 memset( &pxEthernetHeader->xSourceAddress, 0x22, sizeof( pxEthernetHeader->xSourceAddress ) );
3163
3164 pxNetworkBuffer->xDataLength = ipconfigETHERNET_MINIMUM_PACKET_BYTES;
3165
3166 FreeRTOS_FindEndPointOnNetMask_IgnoreAndReturn( pxNetworkBuffer->pxEndPoint );
3167
3168 xIsCallingFromIPTask_ExpectAndReturn( pdTRUE );
3169
3170 vReturnEthernetFrame( pxNetworkBuffer, xReleaseAfterSend );
3171
3172 TEST_ASSERT_EQUAL( ipconfigETHERNET_MINIMUM_PACKET_BYTES, pxNetworkBuffer->xDataLength );
3173 TEST_ASSERT_EACH_EQUAL_UINT8( 0xAA, &ucEthBuffer[ ipconfigETHERNET_MINIMUM_PACKET_BYTES - 10 ], 10 );
3174 TEST_ASSERT_EACH_EQUAL_UINT8( 0x22, &pxEthernetHeader->xDestinationAddress, sizeof( pxEthernetHeader->xDestinationAddress ) );
3175 TEST_ASSERT_EQUAL_MEMORY( pxNetworkBuffer->pxEndPoint->xMACAddress.ucBytes, &pxEthernetHeader->xSourceAddress, sizeof( pxEthernetHeader->xSourceAddress ) );
3176 TEST_ASSERT_EQUAL( 1, NetworkInterfaceOutputFunction_Stub_Called );
3177 }
3178
3179 /**
3180 * @brief test_vReturnEthernetFrame_ReleaseAfterSend
3181 * To validate if vReturnEthernetFrame changes the source/destination MAC addresses correctly
3182 * and send the event to IP task.
3183 */
test_vReturnEthernetFrame_ReleaseAfterSend(void)3184 void test_vReturnEthernetFrame_ReleaseAfterSend( void )
3185 {
3186 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
3187 BaseType_t xReleaseAfterSend = pdTRUE;
3188 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
3189 EthernetHeader_t * pxEthernetHeader;
3190 NetworkEndPoint_t xEndPoint, * pxEndPoint = &xEndPoint;
3191
3192 pxNetworkBuffer = &xNetworkBuffer;
3193 pxNetworkBuffer->pxEndPoint = &xEndPoint;
3194
3195 memset( pxNetworkBuffer, 0, sizeof( NetworkBufferDescriptor_t ) );
3196
3197 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
3198 pxNetworkBuffer->pxEndPoint = pxEndPoint;
3199 xEndPoint.pxNetworkInterface = &xInterfaces;
3200 xEndPoint.pxNetworkInterface->pfOutput = &NetworkInterfaceOutputFunction_Stub;
3201 NetworkInterfaceOutputFunction_Stub_Called = 0;
3202
3203 memset( ucEthBuffer, 0xAA, ipconfigTCP_MSS );
3204
3205 pxEthernetHeader = ( EthernetHeader_t * ) pxNetworkBuffer->pucEthernetBuffer;
3206 memset( &pxEthernetHeader->xDestinationAddress, 0x11, sizeof( pxEthernetHeader->xDestinationAddress ) );
3207 memset( &pxEthernetHeader->xSourceAddress, 0x22, sizeof( pxEthernetHeader->xSourceAddress ) );
3208
3209 pxNetworkBuffer->xDataLength = ipconfigETHERNET_MINIMUM_PACKET_BYTES;
3210
3211 FreeRTOS_FindEndPointOnNetMask_IgnoreAndReturn( pxNetworkBuffer->pxEndPoint );
3212
3213 xIPTaskInitialised = pdTRUE;
3214 xIsCallingFromIPTask_IgnoreAndReturn( pdFALSE );
3215 xIsCallingFromIPTask_IgnoreAndReturn( pdFALSE );
3216 xQueueGenericSend_IgnoreAndReturn( pdPASS );
3217
3218 vReturnEthernetFrame( pxNetworkBuffer, xReleaseAfterSend );
3219
3220 TEST_ASSERT_EACH_EQUAL_UINT8( 0xAA, &ucEthBuffer[ ipconfigETHERNET_MINIMUM_PACKET_BYTES - 10 ], 10 );
3221 TEST_ASSERT_EACH_EQUAL_UINT8( 0x22, &pxEthernetHeader->xDestinationAddress, sizeof( pxEthernetHeader->xDestinationAddress ) );
3222 TEST_ASSERT_EQUAL_MEMORY( pxNetworkBuffer->pxEndPoint->xMACAddress.ucBytes, &pxEthernetHeader->xSourceAddress, sizeof( pxEthernetHeader->xSourceAddress ) );
3223 TEST_ASSERT_EQUAL( 0, NetworkInterfaceOutputFunction_Stub_Called );
3224 }
3225
3226 /**
3227 * @brief test_vReturnEthernetFrame_ReleaseAfterSendFail
3228 * To validate if vReturnEthernetFrame changes the source/destination MAC addresses correctly
3229 * but fail to send the event to IP task.
3230 */
test_vReturnEthernetFrame_ReleaseAfterSendFail(void)3231 void test_vReturnEthernetFrame_ReleaseAfterSendFail( void )
3232 {
3233 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
3234 BaseType_t xReleaseAfterSend = pdTRUE;
3235 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
3236 EthernetHeader_t * pxEthernetHeader;
3237 NetworkEndPoint_t xEndPoint, * pxEndPoint = &xEndPoint;
3238
3239 pxNetworkBuffer = &xNetworkBuffer;
3240 pxNetworkBuffer->pxEndPoint = &xEndPoint;
3241
3242 memset( pxNetworkBuffer, 0, sizeof( NetworkBufferDescriptor_t ) );
3243
3244 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
3245 pxNetworkBuffer->pxEndPoint = pxEndPoint;
3246 xEndPoint.pxNetworkInterface = &xInterfaces;
3247 xEndPoint.pxNetworkInterface->pfOutput = &NetworkInterfaceOutputFunction_Stub;
3248 NetworkInterfaceOutputFunction_Stub_Called = 0;
3249
3250 memset( ucEthBuffer, 0xAA, ipconfigTCP_MSS );
3251
3252 pxEthernetHeader = ( EthernetHeader_t * ) pxNetworkBuffer->pucEthernetBuffer;
3253 memset( &pxEthernetHeader->xDestinationAddress, 0x11, sizeof( pxEthernetHeader->xDestinationAddress ) );
3254 memset( &pxEthernetHeader->xSourceAddress, 0x22, sizeof( pxEthernetHeader->xSourceAddress ) );
3255
3256 pxNetworkBuffer->xDataLength = ipconfigETHERNET_MINIMUM_PACKET_BYTES;
3257
3258 FreeRTOS_FindEndPointOnNetMask_IgnoreAndReturn( pxNetworkBuffer->pxEndPoint );
3259
3260 xIPTaskInitialised = pdTRUE;
3261 xIsCallingFromIPTask_IgnoreAndReturn( pdFALSE );
3262 xIsCallingFromIPTask_IgnoreAndReturn( pdFALSE );
3263 xQueueGenericSend_IgnoreAndReturn( pdFAIL );
3264 vReleaseNetworkBufferAndDescriptor_Expect( pxNetworkBuffer );
3265
3266 vReturnEthernetFrame( pxNetworkBuffer, xReleaseAfterSend );
3267
3268 TEST_ASSERT_EACH_EQUAL_UINT8( 0xAA, &ucEthBuffer[ ipconfigETHERNET_MINIMUM_PACKET_BYTES - 10 ], 10 );
3269 TEST_ASSERT_EACH_EQUAL_UINT8( 0x22, &pxEthernetHeader->xDestinationAddress, sizeof( pxEthernetHeader->xDestinationAddress ) );
3270 TEST_ASSERT_EQUAL_MEMORY( pxNetworkBuffer->pxEndPoint->xMACAddress.ucBytes, &pxEthernetHeader->xSourceAddress, sizeof( pxEthernetHeader->xSourceAddress ) );
3271 TEST_ASSERT_EQUAL( 0, NetworkInterfaceOutputFunction_Stub_Called );
3272 }
3273
3274 /**
3275 * @brief test_vReturnEthernetFrame_NeitherIPTaskNorReleaseAfterSend
3276 * To validate if vReturnEthernetFrame triggers assertion when it's neither called from IP task
3277 * nor ReleaseAfterSend.
3278 */
test_vReturnEthernetFrame_NeitherIPTaskNorReleaseAfterSend(void)3279 void test_vReturnEthernetFrame_NeitherIPTaskNorReleaseAfterSend( void )
3280 {
3281 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
3282 BaseType_t xReleaseAfterSend = pdFALSE;
3283 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
3284 EthernetHeader_t * pxEthernetHeader;
3285 NetworkEndPoint_t xEndPoint, * pxEndPoint = &xEndPoint;
3286
3287 pxNetworkBuffer = &xNetworkBuffer;
3288 pxNetworkBuffer->pxEndPoint = &xEndPoint;
3289
3290 memset( pxNetworkBuffer, 0, sizeof( NetworkBufferDescriptor_t ) );
3291
3292 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
3293 pxNetworkBuffer->pxEndPoint = pxEndPoint;
3294 xEndPoint.pxNetworkInterface = &xInterfaces;
3295 xEndPoint.pxNetworkInterface->pfOutput = &NetworkInterfaceOutputFunction_Stub;
3296 NetworkInterfaceOutputFunction_Stub_Called = 0;
3297
3298 memset( ucEthBuffer, 0xAA, ipconfigTCP_MSS );
3299
3300 pxEthernetHeader = ( EthernetHeader_t * ) pxNetworkBuffer->pucEthernetBuffer;
3301 memset( &pxEthernetHeader->xDestinationAddress, 0x11, sizeof( pxEthernetHeader->xDestinationAddress ) );
3302 memset( &pxEthernetHeader->xSourceAddress, 0x22, sizeof( pxEthernetHeader->xSourceAddress ) );
3303
3304 pxNetworkBuffer->xDataLength = ipconfigETHERNET_MINIMUM_PACKET_BYTES - 10;
3305
3306 FreeRTOS_FindEndPointOnNetMask_IgnoreAndReturn( pxNetworkBuffer->pxEndPoint );
3307
3308 xIPTaskInitialised = pdTRUE;
3309 xIsCallingFromIPTask_IgnoreAndReturn( pdFALSE );
3310
3311 catch_assert( vReturnEthernetFrame( pxNetworkBuffer, xReleaseAfterSend ) );
3312 }
3313
3314 /**
3315 * @brief test_vReturnEthernetFrame_UnknownFrameType
3316 * To validate if vReturnEthernetFrame handles unknown ethernet frame type.
3317 */
test_vReturnEthernetFrame_UnknownFrameType(void)3318 void test_vReturnEthernetFrame_UnknownFrameType( void )
3319 {
3320 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
3321 BaseType_t xReleaseAfterSend = pdFALSE;
3322 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
3323 EthernetHeader_t * pxEthernetHeader;
3324
3325 pxNetworkBuffer = &xNetworkBuffer;
3326 pxNetworkBuffer->pxEndPoint = NULL;
3327
3328 memset( pxNetworkBuffer, 0, sizeof( NetworkBufferDescriptor_t ) );
3329
3330 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
3331 pxNetworkBuffer->pxEndPoint = NULL;
3332
3333 memset( ucEthBuffer, 0xAA, ipconfigTCP_MSS );
3334
3335 pxEthernetHeader = ( EthernetHeader_t * ) pxNetworkBuffer->pucEthernetBuffer;
3336 memset( &pxEthernetHeader->xDestinationAddress, 0x11, sizeof( pxEthernetHeader->xDestinationAddress ) );
3337 memset( &pxEthernetHeader->xSourceAddress, 0x22, sizeof( pxEthernetHeader->xSourceAddress ) );
3338 pxEthernetHeader->usFrameType = 0xFF;
3339
3340 pxNetworkBuffer->xDataLength = ipconfigETHERNET_MINIMUM_PACKET_BYTES;
3341
3342 FreeRTOS_FindEndPointOnNetMask_IgnoreAndReturn( NULL );
3343
3344 vReturnEthernetFrame( pxNetworkBuffer, xReleaseAfterSend );
3345 }
3346
3347 /**
3348 * @brief test_vReturnEthernetFrame_IPv6NoEndpoint
3349 * To validate if vReturnEthernetFrame handles IPv6 ethernet frame without endpoint.
3350 */
test_vReturnEthernetFrame_IPv6NoEndpoint(void)3351 void test_vReturnEthernetFrame_IPv6NoEndpoint( void )
3352 {
3353 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
3354 BaseType_t xReleaseAfterSend = pdFALSE;
3355 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
3356 EthernetHeader_t * pxEthernetHeader;
3357
3358 pxNetworkBuffer = &xNetworkBuffer;
3359 pxNetworkBuffer->pxEndPoint = NULL;
3360
3361 memset( pxNetworkBuffer, 0, sizeof( NetworkBufferDescriptor_t ) );
3362
3363 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
3364 pxNetworkBuffer->pxEndPoint = NULL;
3365
3366 memset( ucEthBuffer, 0xAA, ipconfigTCP_MSS );
3367
3368 pxEthernetHeader = ( EthernetHeader_t * ) pxNetworkBuffer->pucEthernetBuffer;
3369 memset( &pxEthernetHeader->xDestinationAddress, 0x11, sizeof( pxEthernetHeader->xDestinationAddress ) );
3370 memset( &pxEthernetHeader->xSourceAddress, 0x22, sizeof( pxEthernetHeader->xSourceAddress ) );
3371 pxEthernetHeader->usFrameType = ipIPv6_FRAME_TYPE;
3372
3373 pxNetworkBuffer->xDataLength = ipconfigETHERNET_MINIMUM_PACKET_BYTES;
3374
3375 vReturnEthernetFrame( pxNetworkBuffer, xReleaseAfterSend );
3376 }
3377
3378 /**
3379 * @brief test_FreeRTOS_GetIPAddress
3380 * To validate if FreeRTOS_GetIPAddress returns correct IP address stored in first endpoint.
3381 */
test_FreeRTOS_GetIPAddress(void)3382 void test_FreeRTOS_GetIPAddress( void )
3383 {
3384 uint32_t ulIPAddress;
3385
3386 NetworkEndPoint_t xEndPoint = { 0 };
3387
3388 memset( &xEndPoint, 0, sizeof( NetworkEndPoint_t ) );
3389
3390 xEndPoint.ipv4_settings.ulIPAddress = 0xAB12CD34;
3391
3392 FreeRTOS_FirstEndPoint_ExpectAnyArgsAndReturn( &xEndPoint );
3393
3394 ulIPAddress = FreeRTOS_GetIPAddress();
3395
3396 TEST_ASSERT_EQUAL( 0xAB12CD34, ulIPAddress );
3397 }
3398
3399 /**
3400 * @brief test_FreeRTOS_GetIPAddress
3401 * To validate if FreeRTOS_GetIPAddress returns correct IP address
3402 * in ipv4_defaults instead of ipv4_settings.
3403 */
test_FreeRTOS_GetIPAddress_DefaultSetting(void)3404 void test_FreeRTOS_GetIPAddress_DefaultSetting( void )
3405 {
3406 uint32_t ulIPAddress;
3407
3408 NetworkEndPoint_t xEndPoint = { 0 };
3409
3410 memset( &xEndPoint, 0, sizeof( NetworkEndPoint_t ) );
3411
3412 xEndPoint.ipv4_settings.ulIPAddress = 0;
3413 xEndPoint.ipv4_defaults.ulIPAddress = 0xAB12CD34;
3414
3415 FreeRTOS_FirstEndPoint_ExpectAnyArgsAndReturn( &xEndPoint );
3416
3417 ulIPAddress = FreeRTOS_GetIPAddress();
3418
3419 TEST_ASSERT_EQUAL( 0xAB12CD34, ulIPAddress );
3420 }
3421
3422 /**
3423 * @brief test_FreeRTOS_GetIPAddress_NullEndpoint
3424 * To validate if FreeRTOS_GetIPAddress returns 0 when no endpoint.
3425 */
test_FreeRTOS_GetIPAddress_NullEndpoint(void)3426 void test_FreeRTOS_GetIPAddress_NullEndpoint( void )
3427 {
3428 uint32_t ulIPAddress;
3429
3430 FreeRTOS_FirstEndPoint_ExpectAnyArgsAndReturn( NULL );
3431
3432 ulIPAddress = FreeRTOS_GetIPAddress();
3433
3434 TEST_ASSERT_EQUAL( 0, ulIPAddress );
3435 }
3436
3437 /**
3438 * @brief test_FreeRTOS_GetIPAddress_MultipleEndpoints
3439 * To validate if FreeRTOS_GetIPAddress returns IP address of first IPv4 endpoint.
3440 */
test_FreeRTOS_GetIPAddress_MultipleEndpoints(void)3441 void test_FreeRTOS_GetIPAddress_MultipleEndpoints( void )
3442 {
3443 uint32_t ulIPAddress;
3444 NetworkEndPoint_t xEndPoints[ 2 ]; /* IPv6->IPv4 */
3445
3446 memset( &xEndPoints[ 0 ], 0, sizeof( NetworkEndPoint_t ) );
3447 xEndPoints[ 0 ].bits.bIPv6 = pdTRUE;
3448 memset( &xEndPoints[ 1 ], 0, sizeof( NetworkEndPoint_t ) );
3449 xEndPoints[ 1 ].bits.bIPv6 = pdFALSE;
3450 xEndPoints[ 1 ].ipv4_settings.ulIPAddress = 0xAB12CD34;
3451
3452 FreeRTOS_FirstEndPoint_ExpectAnyArgsAndReturn( &xEndPoints[ 0 ] );
3453 FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoints[ 0 ], &xEndPoints[ 1 ] );
3454
3455 ulIPAddress = FreeRTOS_GetIPAddress();
3456
3457 TEST_ASSERT_EQUAL( 0xAB12CD34, ulIPAddress );
3458 }
3459
3460 /**
3461 * @brief test_FreeRTOS_GetIPAddress_NoValidEndpoints
3462 * To validate if FreeRTOS_GetIPAddress returns 0 when no IPv4 endpoint.
3463 */
test_FreeRTOS_GetIPAddress_NoValidEndpoints(void)3464 void test_FreeRTOS_GetIPAddress_NoValidEndpoints( void )
3465 {
3466 uint32_t ulIPAddress;
3467 NetworkEndPoint_t xEndPoints[ 2 ]; /* IPv6->IPv6 */
3468
3469 memset( &xEndPoints[ 0 ], 0, sizeof( NetworkEndPoint_t ) );
3470 xEndPoints[ 0 ].bits.bIPv6 = pdTRUE;
3471 memset( &xEndPoints[ 1 ], 0, sizeof( NetworkEndPoint_t ) );
3472 xEndPoints[ 1 ].bits.bIPv6 = pdTRUE;
3473
3474 FreeRTOS_FirstEndPoint_ExpectAnyArgsAndReturn( &xEndPoints[ 0 ] );
3475 FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoints[ 0 ], &xEndPoints[ 1 ] );
3476 FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoints[ 1 ], NULL );
3477
3478 ulIPAddress = FreeRTOS_GetIPAddress();
3479
3480 TEST_ASSERT_EQUAL( 0, ulIPAddress );
3481 }
3482
3483 /**
3484 * @brief test_CastingFunctions
3485 * Casting.
3486 */
test_CastingFunctions(void)3487 void test_CastingFunctions( void )
3488 {
3489 void * pvPtr;
3490
3491 const IPPacket_t * pxIPPacket = ( ( const IPPacket_t * ) pvPtr );
3492 const IPHeader_t * pxIPHeader = ( ( const IPHeader_t * ) pvPtr );
3493 const TCPPacket_t * pxConstTCPPacket = ( ( const TCPPacket_t * ) pvPtr );
3494 TCPPacket_t * pxTCPPacket = ( ( TCPPacket_t * ) pvPtr );
3495 ProtocolPacket_t * pxProtPacket = ( ( ProtocolPacket_t * ) pvPtr );
3496 const ProtocolPacket_t * pxConstProtPacket = ( ( const ProtocolPacket_t * ) pvPtr );
3497 const SocketSelect_t * pxSockSelPtr = ( ( const SocketSelect_t * ) pvPtr );
3498 const SocketSelectMessage_t * pxConstSockSelMsgPtr = ( ( const SocketSelectMessage_t * ) pvPtr );
3499 SocketSelectMessage_t * pxSockSelMsgPtr = ( ( SocketSelectMessage_t * ) pvPtr );
3500 NetworkBufferDescriptor_t * pxNetworkBuffer = ( ( NetworkBufferDescriptor_t * ) pvPtr );
3501 ListItem_t * pxList = ( ( ListItem_t * ) pvPtr );
3502 const ListItem_t * pxConstList = ( ( const ListItem_t * ) pvPtr );
3503 const FreeRTOS_Socket_t * pxSocket = ( ( const FreeRTOS_Socket_t * ) pvPtr );
3504 const ProtocolHeaders_t * pxConstProtHeader = ( ( const ProtocolHeaders_t * ) pvPtr );
3505 ProtocolHeaders_t * pxProtHeader = ( ( ProtocolHeaders_t * ) pvPtr );
3506 }
3507
3508 /**
3509 * @brief test_FreeRTOS_IPInit_Multi_NoInterface
3510 * To validate if FreeRTOS_IPInit_Multi() triggers assertion when no endpoint.
3511 */
test_FreeRTOS_IPInit_Multi_NoInterface(void)3512 void test_FreeRTOS_IPInit_Multi_NoInterface( void )
3513 {
3514 FreeRTOS_FirstNetworkInterface_IgnoreAndReturn( NULL );
3515 catch_assert( FreeRTOS_IPInit_Multi() );
3516 }
3517
3518 /**
3519 * @brief test_FreeRTOS_GetEndPointConfiguration_AllSettings
3520 * To validate if FreeRTOS_GetEndPointConfiguration() returns all settings in endpoint.
3521 */
test_FreeRTOS_GetEndPointConfiguration_AllSettings(void)3522 void test_FreeRTOS_GetEndPointConfiguration_AllSettings( void )
3523 {
3524 uint32_t ulIPAddress;
3525 uint32_t ulNetMask;
3526 uint32_t ulGatewayAddress;
3527 uint32_t ulDNSServerAddress;
3528 NetworkEndPoint_t xEndPoint;
3529
3530 memset( &xEndPoint, 0, sizeof( xEndPoint ) );
3531
3532 xEndPoint.ipv4_settings.ulIPAddress = 1;
3533 xEndPoint.ipv4_settings.ulNetMask = 2;
3534 xEndPoint.ipv4_settings.ulGatewayAddress = 3;
3535 xEndPoint.ipv4_settings.ulDNSServerAddresses[ 0 ] = 4;
3536
3537 FreeRTOS_GetEndPointConfiguration( &ulIPAddress, &ulNetMask, &ulGatewayAddress, &ulDNSServerAddress, &xEndPoint );
3538 TEST_ASSERT_EQUAL( 1, ulIPAddress );
3539 TEST_ASSERT_EQUAL( 2, ulNetMask );
3540 TEST_ASSERT_EQUAL( 3, ulGatewayAddress );
3541 TEST_ASSERT_EQUAL( 4, ulDNSServerAddress );
3542 }
3543
3544 /**
3545 * @brief test_FreeRTOS_GetEndPointConfiguration_AllSettings
3546 * To validate if FreeRTOS_GetEndPointConfiguration() supports NULL pointers in API.
3547 */
test_FreeRTOS_GetEndPointConfiguration_AllNull(void)3548 void test_FreeRTOS_GetEndPointConfiguration_AllNull( void )
3549 {
3550 NetworkEndPoint_t xEndPoint;
3551
3552 memset( &xEndPoint, 0, sizeof( xEndPoint ) );
3553
3554 xEndPoint.ipv4_settings.ulIPAddress = 1;
3555 xEndPoint.ipv4_settings.ulNetMask = 2;
3556 xEndPoint.ipv4_settings.ulGatewayAddress = 3;
3557 xEndPoint.ipv4_settings.ulDNSServerAddresses[ 0 ] = 4;
3558
3559 FreeRTOS_GetEndPointConfiguration( NULL, NULL, NULL, NULL, &xEndPoint );
3560 }
3561
3562 /**
3563 * @brief test_FreeRTOS_GetEndPointConfiguration_IPv6Endpoint
3564 * To validate if FreeRTOS_GetEndPointConfiguration() skips IPv6 endpoint.
3565 */
test_FreeRTOS_GetEndPointConfiguration_IPv6Endpoint(void)3566 void test_FreeRTOS_GetEndPointConfiguration_IPv6Endpoint( void )
3567 {
3568 uint32_t ulIPAddress = 0;
3569 uint32_t ulNetMask = 0;
3570 uint32_t ulGatewayAddress = 0;
3571 uint32_t ulDNSServerAddress = 0;
3572 NetworkEndPoint_t xEndPoint;
3573
3574 memset( &xEndPoint, 0, sizeof( xEndPoint ) );
3575 xEndPoint.bits.bIPv6 = pdTRUE;
3576
3577 FreeRTOS_GetEndPointConfiguration( &ulIPAddress, &ulNetMask, &ulGatewayAddress, &ulDNSServerAddress, &xEndPoint );
3578 TEST_ASSERT_EQUAL( 0, ulIPAddress );
3579 TEST_ASSERT_EQUAL( 0, ulNetMask );
3580 TEST_ASSERT_EQUAL( 0, ulGatewayAddress );
3581 TEST_ASSERT_EQUAL( 0, ulDNSServerAddress );
3582 }
3583
3584 /**
3585 * @brief test_FreeRTOS_GetEndPointConfiguration_IPv6Endpoint
3586 * To validate if FreeRTOS_GetEndPointConfiguration() supports NULL endpoint.
3587 */
test_FreeRTOS_GetEndPointConfiguration_NullEndpoint(void)3588 void test_FreeRTOS_GetEndPointConfiguration_NullEndpoint( void )
3589 {
3590 uint32_t ulIPAddress = 0;
3591 uint32_t ulNetMask = 0;
3592 uint32_t ulGatewayAddress = 0;
3593 uint32_t ulDNSServerAddress = 0;
3594
3595 FreeRTOS_GetEndPointConfiguration( &ulIPAddress, &ulNetMask, &ulGatewayAddress, &ulDNSServerAddress, NULL );
3596 TEST_ASSERT_EQUAL( 0, ulIPAddress );
3597 TEST_ASSERT_EQUAL( 0, ulNetMask );
3598 TEST_ASSERT_EQUAL( 0, ulGatewayAddress );
3599 TEST_ASSERT_EQUAL( 0, ulDNSServerAddress );
3600 }
3601
3602 /**
3603 * @brief test_FreeRTOS_SetEndPointConfiguration_AllSettings
3604 * To validate if FreeRTOS_SetEndPointConfiguration() sets all settings in endpoint correctly.
3605 */
test_FreeRTOS_SetEndPointConfiguration_AllSettings(void)3606 void test_FreeRTOS_SetEndPointConfiguration_AllSettings( void )
3607 {
3608 uint32_t ulIPAddress = 1;
3609 uint32_t ulNetMask = 2;
3610 uint32_t ulGatewayAddress = 3;
3611 uint32_t ulDNSServerAddress = 4;
3612 NetworkEndPoint_t xEndPoint;
3613
3614 memset( &xEndPoint, 0, sizeof( xEndPoint ) );
3615
3616 FreeRTOS_SetEndPointConfiguration( &ulIPAddress, &ulNetMask, &ulGatewayAddress, &ulDNSServerAddress, &xEndPoint );
3617 TEST_ASSERT_EQUAL( 1, xEndPoint.ipv4_settings.ulIPAddress );
3618 TEST_ASSERT_EQUAL( 2, xEndPoint.ipv4_settings.ulNetMask );
3619 TEST_ASSERT_EQUAL( 3, xEndPoint.ipv4_settings.ulGatewayAddress );
3620 TEST_ASSERT_EQUAL( 4, xEndPoint.ipv4_settings.ulDNSServerAddresses[ 0 ] );
3621 }
3622
3623 /**
3624 * @brief test_FreeRTOS_SetEndPointConfiguration_AllNull
3625 * To validate if FreeRTOS_SetEndPointConfiguration() supports NULL input.
3626 */
test_FreeRTOS_SetEndPointConfiguration_AllNull(void)3627 void test_FreeRTOS_SetEndPointConfiguration_AllNull( void )
3628 {
3629 NetworkEndPoint_t xEndPoint;
3630
3631 memset( &xEndPoint, 0, sizeof( xEndPoint ) );
3632
3633 FreeRTOS_SetEndPointConfiguration( NULL, NULL, NULL, NULL, &xEndPoint );
3634 }
3635
3636 /**
3637 * @brief test_FreeRTOS_SetEndPointConfiguration_IPv6Endpoint
3638 * To validate if FreeRTOS_SetEndPointConfiguration() returns 0 when endpoint is not IPv4.
3639 */
test_FreeRTOS_SetEndPointConfiguration_IPv6Endpoint(void)3640 void test_FreeRTOS_SetEndPointConfiguration_IPv6Endpoint( void )
3641 {
3642 uint32_t ulIPAddress = 1;
3643 uint32_t ulNetMask = 2;
3644 uint32_t ulGatewayAddress = 3;
3645 uint32_t ulDNSServerAddress = 4;
3646 NetworkEndPoint_t xEndPoint;
3647
3648 memset( &xEndPoint, 0, sizeof( xEndPoint ) );
3649 xEndPoint.bits.bIPv6 = pdTRUE;
3650
3651 FreeRTOS_SetEndPointConfiguration( &ulIPAddress, &ulNetMask, &ulGatewayAddress, &ulDNSServerAddress, &xEndPoint );
3652 TEST_ASSERT_EQUAL( 0, xEndPoint.ipv4_settings.ulIPAddress );
3653 TEST_ASSERT_EQUAL( 0, xEndPoint.ipv4_settings.ulNetMask );
3654 TEST_ASSERT_EQUAL( 0, xEndPoint.ipv4_settings.ulGatewayAddress );
3655 TEST_ASSERT_EQUAL( 0, xEndPoint.ipv4_settings.ulDNSServerAddresses[ 0 ] );
3656 }
3657
3658 /**
3659 * @brief test_FreeRTOS_SetEndPointConfiguration_NullEndpoint
3660 * To validate if FreeRTOS_SetEndPointConfiguration() supports NULL endpoint.
3661 */
test_FreeRTOS_SetEndPointConfiguration_NullEndpoint(void)3662 void test_FreeRTOS_SetEndPointConfiguration_NullEndpoint( void )
3663 {
3664 FreeRTOS_SetEndPointConfiguration( NULL, NULL, NULL, NULL, NULL );
3665 }
3666
3667 /**
3668 * @brief test_FreeRTOS_IsNetworkUp
3669 * To validate if FreeRTOS_IsNetworkUp() returns pdTRUE when
3670 * the endpoint in global endpoint list is up.
3671 */
test_FreeRTOS_IsNetworkUp()3672 void test_FreeRTOS_IsNetworkUp()
3673 {
3674 BaseType_t xReturn;
3675 NetworkEndPoint_t xEndpoint, * pxEndpoint = &xEndpoint;
3676
3677 memset( pxEndpoint, 0, sizeof( xEndpoint ) );
3678 pxEndpoint->bits.bEndPointUp = pdTRUE;
3679
3680 pxNetworkEndPoints = pxEndpoint;
3681
3682 xReturn = FreeRTOS_IsNetworkUp();
3683
3684 TEST_ASSERT_EQUAL( pdTRUE, xReturn );
3685 }
3686
3687 /**
3688 * @brief test_FreeRTOS_IsEndPointUp
3689 * To validate if FreeRTOS_IsEndPointUp() returns pdTRUE when
3690 * input endpoint is up.
3691 */
test_FreeRTOS_IsEndPointUp()3692 void test_FreeRTOS_IsEndPointUp()
3693 {
3694 BaseType_t xReturn;
3695 NetworkEndPoint_t xEndpoint, * pxEndpoint = &xEndpoint;
3696
3697 memset( pxEndpoint, 0, sizeof( xEndpoint ) );
3698 pxEndpoint->bits.bEndPointUp = pdTRUE;
3699
3700 xReturn = FreeRTOS_IsEndPointUp( pxEndpoint );
3701
3702 TEST_ASSERT_EQUAL( pdTRUE, xReturn );
3703 }
3704
3705 /**
3706 * @brief test_FreeRTOS_AllEndPointsUp_NoEndpoints
3707 * To validate if FreeRTOS_AllEndPointsUp() returns pdTRUE when
3708 * no endpoint stored in global endpoint list.
3709 */
test_FreeRTOS_AllEndPointsUp_NoEndpoints()3710 void test_FreeRTOS_AllEndPointsUp_NoEndpoints()
3711 {
3712 BaseType_t xReturn;
3713
3714 xReturn = FreeRTOS_AllEndPointsUp( NULL );
3715
3716 TEST_ASSERT_EQUAL( pdTRUE, xReturn );
3717 }
3718
3719 /**
3720 * @brief test_FreeRTOS_AllEndPointsUp_SpecificInterface
3721 * To validate if FreeRTOS_AllEndPointsUp() returns correctly
3722 * with input interface pointer.
3723 */
test_FreeRTOS_AllEndPointsUp_SpecificInterface()3724 void test_FreeRTOS_AllEndPointsUp_SpecificInterface()
3725 {
3726 BaseType_t xReturn;
3727 NetworkEndPoint_t xEndpoint[ 3 ];
3728 NetworkInterface_t xInterface[ 2 ];
3729
3730 /* Three endpoints: e0, e1, e2. And 2 interfaces: i0, i1.
3731 * - e0: Attach to i0
3732 * - e1: Attach to i1, and it's up.
3733 * - e2: Attach to i1, and it's down.
3734 * */
3735 memset( &xInterface[ 0 ], 0, sizeof( NetworkInterface_t ) );
3736 memset( &xInterface[ 1 ], 0, sizeof( NetworkInterface_t ) );
3737
3738 memset( &xEndpoint[ 0 ], 0, sizeof( NetworkEndPoint_t ) );
3739 memset( &xEndpoint[ 1 ], 0, sizeof( NetworkEndPoint_t ) );
3740 memset( &xEndpoint[ 2 ], 0, sizeof( NetworkEndPoint_t ) );
3741
3742 xEndpoint[ 0 ].pxNetworkInterface = &xInterface[ 0 ];
3743 xEndpoint[ 0 ].bits.bEndPointUp = pdTRUE;
3744
3745 xEndpoint[ 1 ].pxNetworkInterface = &xInterface[ 1 ];
3746 xEndpoint[ 1 ].bits.bEndPointUp = pdTRUE;
3747
3748 xEndpoint[ 2 ].pxNetworkInterface = &xInterface[ 1 ];
3749 xEndpoint[ 2 ].bits.bEndPointUp = pdFALSE;
3750
3751 /* Append e0~e2 into global endpoint list. */
3752 pxNetworkEndPoints = &xEndpoint[ 0 ];
3753 pxNetworkEndPoints->pxNext = &xEndpoint[ 1 ];
3754 pxNetworkEndPoints->pxNext->pxNext = &xEndpoint[ 2 ];
3755
3756 xReturn = FreeRTOS_AllEndPointsUp( &xInterface[ 1 ] );
3757
3758 TEST_ASSERT_EQUAL( pdFALSE, xReturn );
3759 }
3760
3761 /**
3762 * @brief test_uxIPHeaderSizeSocket_IPv4
3763 * To validate if uxIPHeaderSizeSocket() returns ipSIZE_OF_IPv4_HEADER
3764 * when the socket is an IPv4 socket handler.
3765 */
test_uxIPHeaderSizeSocket_IPv4()3766 void test_uxIPHeaderSizeSocket_IPv4()
3767 {
3768 size_t xReturn;
3769 FreeRTOS_Socket_t xSocket;
3770
3771 memset( &xSocket, 0, sizeof( xSocket ) );
3772 xSocket.bits.bIsIPv6 = pdFALSE;
3773
3774 xReturn = uxIPHeaderSizeSocket( &xSocket );
3775 TEST_ASSERT_EQUAL( ipSIZE_OF_IPv4_HEADER, xReturn );
3776 }
3777
3778 /**
3779 * @brief test_uxIPHeaderSizeSocket_NullSocket
3780 * To validate if uxIPHeaderSizeSocket() returns ipSIZE_OF_IPv4_HEADER
3781 * when input socket is NULL.
3782 */
test_uxIPHeaderSizeSocket_NullSocket()3783 void test_uxIPHeaderSizeSocket_NullSocket()
3784 {
3785 size_t xReturn;
3786
3787 xReturn = uxIPHeaderSizeSocket( NULL );
3788 TEST_ASSERT_EQUAL( ipSIZE_OF_IPv4_HEADER, xReturn );
3789 }
3790
3791 /**
3792 * @brief test_uxIPHeaderSizeSocket_IPv6
3793 * To validate if uxIPHeaderSizeSocket() returns ipSIZE_OF_IPv6_HEADER
3794 * when input socket is an IPv6 handler.
3795 */
test_uxIPHeaderSizeSocket_IPv6()3796 void test_uxIPHeaderSizeSocket_IPv6()
3797 {
3798 size_t xReturn;
3799 FreeRTOS_Socket_t xSocket;
3800
3801 memset( &xSocket, 0, sizeof( xSocket ) );
3802 xSocket.bits.bIsIPv6 = pdTRUE;
3803
3804 xReturn = uxIPHeaderSizeSocket( &xSocket );
3805 TEST_ASSERT_EQUAL( ipSIZE_OF_IPv6_HEADER, xReturn );
3806 }
3807