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_Utils_list_macros.h"
43 #include "mock_queue.h"
44 #include "mock_event_groups.h"
45
46 #include "mock_FreeRTOS_IP.h"
47 #include "mock_FreeRTOS_IP_Private.h"
48 #include "mock_FreeRTOS_IP_Timers.h"
49 #include "mock_FreeRTOS_ARP.h"
50 #include "mock_FreeRTOS_DHCP.h"
51 #include "mock_FreeRTOS_DHCPv6.h"
52 #include "mock_FreeRTOS_Routing.h"
53 #include "mock_FreeRTOS_IPv4_Utils.h"
54 #include "mock_FreeRTOS_IPv6_Utils.h"
55 #include "mock_NetworkBufferManagement.h"
56
57 #include "FreeRTOS_IP_Utils.h"
58
59 #include "FreeRTOS_IP_Utils_stubs.c"
60 #include "catch_assert.h"
61
62 #include "FreeRTOSIPConfig.h"
63
64 /* =========================== EXTERN VARIABLES =========================== */
65
66 #define TEST_UDP_PAYLOAD_LENGTH ( 10U )
67
68 extern NetworkInterface_t xInterfaces[ 1 ];
69
70 #if ( ipconfigUSE_NETWORK_EVENT_HOOK == 1 )
71 extern BaseType_t xCallEventHook;
72 #endif
73
74 extern UBaseType_t uxLastMinBufferCount;
75 extern size_t uxMinLastSize;
76
77 extern NetworkBufferDescriptor_t * prvPacketBuffer_to_NetworkBuffer( const void * pvBuffer,
78 size_t uxOffset );
79 extern uint16_t prvGetChecksumFromPacket( const struct xPacketSummary * pxSet );
80 extern void prvSetChecksumInPacket( const struct xPacketSummary * pxSet,
81 uint16_t usChecksum );
82
83 /* ============================== Test Cases ============================== */
84
85 /**
86 * @brief test_xSendDHCPEvent
87 * To validate if xSendDHCPEvent returns correct result.
88 */
test_xSendDHCPEvent(void)89 void test_xSendDHCPEvent( void )
90 {
91 BaseType_t xReturn, xResult = 0x123;
92 struct xNetworkEndPoint xEndPoint = { 0 };
93
94 eGetDHCPState_ExpectAnyArgsAndReturn( 12 );
95
96 xSendEventStructToIPTask_ExpectAnyArgsAndReturn( xResult );
97
98 xReturn = xSendDHCPEvent( &xEndPoint );
99
100 TEST_ASSERT_EQUAL( xResult, xReturn );
101 }
102
103 /**
104 * @brief test_pxDuplicateNetworkBufferWithDescriptor_NULLReturned
105 * To validate if pxDuplicateNetworkBufferWithDescriptor returns NULL when
106 * it's not able to allocate a new network buffer.
107 */
test_pxDuplicateNetworkBufferWithDescriptor_NULLReturned(void)108 void test_pxDuplicateNetworkBufferWithDescriptor_NULLReturned( void )
109 {
110 NetworkBufferDescriptor_t * pxReturn;
111 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer;
112 size_t uxNewLength;
113
114 pxNetworkBuffer = &xNetworkBuffer;
115
116 pxGetNetworkBufferWithDescriptor_ExpectAndReturn( uxNewLength, 0, NULL );
117
118 pxReturn = pxDuplicateNetworkBufferWithDescriptor( pxNetworkBuffer, uxNewLength );
119
120 TEST_ASSERT_EQUAL( NULL, pxReturn );
121 }
122
123 /**
124 * @brief test_pxDuplicateNetworkBufferWithDescriptor_LargerBufferReturned
125 * To validate if pxDuplicateNetworkBufferWithDescriptor returns a network buffer
126 * with larger content size.
127 */
test_pxDuplicateNetworkBufferWithDescriptor_LargerBufferReturned(void)128 void test_pxDuplicateNetworkBufferWithDescriptor_LargerBufferReturned( void )
129 {
130 NetworkBufferDescriptor_t * pxReturn;
131 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer, xNetworkBuffer2;
132 size_t uxNewLength = 0x345;
133 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
134 uint8_t ucEthBuffer2[ ipconfigTCP_MSS ];
135
136 pxNetworkBuffer = &xNetworkBuffer;
137 memset( &xNetworkBuffer2, 0, sizeof( NetworkBufferDescriptor_t ) );
138
139 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
140 memset( ucEthBuffer, 0xAB, ipconfigTCP_MSS );
141 xNetworkBuffer2.pucEthernetBuffer = ucEthBuffer2;
142 memset( ucEthBuffer2, 0x00, ipconfigTCP_MSS );
143
144 pxNetworkBuffer->xDataLength = 0x123;
145 pxNetworkBuffer->xIPAddress.ulIP_IPv4 = 0xABCDEF56;
146 pxNetworkBuffer->usPort = 0x1234;
147 pxNetworkBuffer->usBoundPort = 0xFFAA;
148
149 pxGetNetworkBufferWithDescriptor_ExpectAndReturn( uxNewLength, 0, &xNetworkBuffer2 );
150 uxIPHeaderSizePacket_IgnoreAndReturn( ipSIZE_OF_IPv4_HEADER );
151
152 pxReturn = pxDuplicateNetworkBufferWithDescriptor( pxNetworkBuffer, uxNewLength );
153
154 TEST_ASSERT_EQUAL( &xNetworkBuffer2, pxReturn );
155 TEST_ASSERT_EQUAL( xNetworkBuffer2.xDataLength, uxNewLength );
156 TEST_ASSERT_EQUAL( xNetworkBuffer2.xIPAddress.ulIP_IPv4, pxNetworkBuffer->xIPAddress.ulIP_IPv4 );
157 TEST_ASSERT_EQUAL( xNetworkBuffer2.usPort, pxNetworkBuffer->usPort );
158 TEST_ASSERT_EQUAL( xNetworkBuffer2.usBoundPort, pxNetworkBuffer->usBoundPort );
159 TEST_ASSERT_EQUAL_MEMORY( pxNetworkBuffer->pucEthernetBuffer, xNetworkBuffer2.pucEthernetBuffer, pxNetworkBuffer->xDataLength );
160 }
161
162 /**
163 * @brief test_pxDuplicateNetworkBufferWithDescriptor_SmallerBufferReturned
164 * To validate if pxDuplicateNetworkBufferWithDescriptor returns a network buffer
165 * with smaller content size.
166 */
test_pxDuplicateNetworkBufferWithDescriptor_SmallerBufferReturned(void)167 void test_pxDuplicateNetworkBufferWithDescriptor_SmallerBufferReturned( void )
168 {
169 NetworkBufferDescriptor_t * pxReturn;
170 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer, xNetworkBuffer2;
171 size_t uxNewLength = 0x34;
172 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
173 uint8_t ucEthBuffer2[ ipconfigTCP_MSS ];
174
175 pxNetworkBuffer = &xNetworkBuffer;
176 memset( &xNetworkBuffer2, 0, sizeof( NetworkBufferDescriptor_t ) );
177
178 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
179 memset( ucEthBuffer, 0xAB, ipconfigTCP_MSS );
180 xNetworkBuffer2.pucEthernetBuffer = ucEthBuffer2;
181 memset( ucEthBuffer2, 0x00, ipconfigTCP_MSS );
182
183 pxNetworkBuffer->xDataLength = 0x123;
184 pxNetworkBuffer->xIPAddress.ulIP_IPv4 = 0xABCDEF56;
185 pxNetworkBuffer->usPort = 0x1234;
186 pxNetworkBuffer->usBoundPort = 0xFFAA;
187
188 pxGetNetworkBufferWithDescriptor_ExpectAndReturn( uxNewLength, 0, &xNetworkBuffer2 );
189 uxIPHeaderSizePacket_IgnoreAndReturn( ipSIZE_OF_IPv4_HEADER );
190
191 pxReturn = pxDuplicateNetworkBufferWithDescriptor( pxNetworkBuffer, uxNewLength );
192
193 TEST_ASSERT_EQUAL( &xNetworkBuffer2, pxReturn );
194 TEST_ASSERT_EQUAL( xNetworkBuffer2.xDataLength, uxNewLength );
195 TEST_ASSERT_EQUAL( xNetworkBuffer2.xIPAddress.ulIP_IPv4, pxNetworkBuffer->xIPAddress.ulIP_IPv4 );
196 TEST_ASSERT_EQUAL( xNetworkBuffer2.usPort, pxNetworkBuffer->usPort );
197 TEST_ASSERT_EQUAL( xNetworkBuffer2.usBoundPort, pxNetworkBuffer->usBoundPort );
198 TEST_ASSERT_EQUAL_MEMORY( pxNetworkBuffer->pucEthernetBuffer, xNetworkBuffer2.pucEthernetBuffer, uxNewLength );
199 }
200
201 /**
202 * @brief test_pxDuplicateNetworkBufferWithDescriptor_NullBufferReturned
203 * To validate if pxDuplicateNetworkBufferWithDescriptor returns a network buffer
204 * with NULL content pointer.
205 */
test_pxDuplicateNetworkBufferWithDescriptor_NullBufferReturned(void)206 void test_pxDuplicateNetworkBufferWithDescriptor_NullBufferReturned( void )
207 {
208 NetworkBufferDescriptor_t * pxReturn;
209 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer, xNetworkBuffer2;
210 size_t uxNewLength = 0x34;
211
212 pxNetworkBuffer = &xNetworkBuffer;
213 memset( &xNetworkBuffer2, 0, sizeof( NetworkBufferDescriptor_t ) );
214
215 pxNetworkBuffer->pucEthernetBuffer = NULL;
216
217 pxNetworkBuffer->xDataLength = uxNewLength;
218 pxNetworkBuffer->xIPAddress.ulIP_IPv4 = 0xABCDEF56;
219 pxNetworkBuffer->usPort = 0x1234;
220 pxNetworkBuffer->usBoundPort = 0xFFAA;
221
222 pxGetNetworkBufferWithDescriptor_ExpectAndReturn( uxNewLength, 0, pxNetworkBuffer );
223 uxIPHeaderSizePacket_IgnoreAndReturn( ipSIZE_OF_IPv4_HEADER );
224
225 catch_assert( pxDuplicateNetworkBufferWithDescriptor( pxNetworkBuffer, uxNewLength ) );
226 }
227
228 /**
229 * @brief test_pxDuplicateNetworkBufferWithDescriptor_IPv6
230 * To validate if pxDuplicateNetworkBufferWithDescriptor returns a network buffer
231 * for IPv6 packet.
232 */
test_pxDuplicateNetworkBufferWithDescriptor_IPv6(void)233 void test_pxDuplicateNetworkBufferWithDescriptor_IPv6( void )
234 {
235 NetworkBufferDescriptor_t * pxReturn;
236 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetworkBuffer, xNetworkBuffer2;
237 size_t uxNewLength = ipconfigTCP_MSS;
238 uint8_t ucEthBuffer[ ipconfigTCP_MSS ];
239 uint8_t ucEthBuffer2[ ipconfigTCP_MSS ];
240 IPv6_Address_t xIPv6Address = { { 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } };
241
242 pxNetworkBuffer = &xNetworkBuffer;
243 memset( &xNetworkBuffer2, 0, sizeof( NetworkBufferDescriptor_t ) );
244
245 pxNetworkBuffer->pucEthernetBuffer = ucEthBuffer;
246 memset( ucEthBuffer, 0xAB, ipconfigTCP_MSS );
247 xNetworkBuffer2.pucEthernetBuffer = ucEthBuffer2;
248 memset( ucEthBuffer2, 0x00, ipconfigTCP_MSS );
249
250 pxNetworkBuffer->xDataLength = uxNewLength;
251 memcpy( pxNetworkBuffer->xIPAddress.xIP_IPv6.ucBytes, xIPv6Address.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
252 pxNetworkBuffer->usPort = 0x1234;
253 pxNetworkBuffer->usBoundPort = 0xFFAA;
254
255 pxGetNetworkBufferWithDescriptor_ExpectAndReturn( uxNewLength, 0, &xNetworkBuffer2 );
256 uxIPHeaderSizePacket_IgnoreAndReturn( ipSIZE_OF_IPv6_HEADER );
257
258 pxReturn = pxDuplicateNetworkBufferWithDescriptor( pxNetworkBuffer, uxNewLength );
259
260 TEST_ASSERT_EQUAL( &xNetworkBuffer2, pxReturn );
261 TEST_ASSERT_EQUAL( xNetworkBuffer2.xDataLength, uxNewLength );
262 TEST_ASSERT_EQUAL_MEMORY( &xIPv6Address, &pxNetworkBuffer->xIPAddress.xIP_IPv6, ipSIZE_OF_IPv6_ADDRESS );
263 TEST_ASSERT_EQUAL( xNetworkBuffer2.usPort, pxNetworkBuffer->usPort );
264 TEST_ASSERT_EQUAL( xNetworkBuffer2.usBoundPort, pxNetworkBuffer->usBoundPort );
265 TEST_ASSERT_EQUAL_MEMORY( pxNetworkBuffer->pucEthernetBuffer, xNetworkBuffer2.pucEthernetBuffer, pxNetworkBuffer->xDataLength );
266 }
267
268 /**
269 * @brief test_prvPacketBuffer_to_NetworkBuffer_NULLParam
270 * To validate if prvPacketBuffer_to_NetworkBuffer returns NULL
271 * when input buffer pointer is NULL.
272 */
test_prvPacketBuffer_to_NetworkBuffer_NULLParam(void)273 void test_prvPacketBuffer_to_NetworkBuffer_NULLParam( void )
274 {
275 NetworkBufferDescriptor_t * pxNetworkBuffer;
276 const void * pvBuffer = NULL;
277 size_t uxOffset;
278
279 pxNetworkBuffer = prvPacketBuffer_to_NetworkBuffer( pvBuffer, uxOffset );
280
281 TEST_ASSERT_EQUAL( NULL, pxNetworkBuffer );
282 }
283
284 /**
285 * @brief test_prvPacketBuffer_to_NetworkBuffer_Unalligned
286 * To validate if prvPacketBuffer_to_NetworkBuffer returns NULL when byte not aligned.
287 */
test_prvPacketBuffer_to_NetworkBuffer_Unalligned(void)288 void test_prvPacketBuffer_to_NetworkBuffer_Unalligned( void )
289 {
290 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetBufferToReturn;
291 const void * pvBuffer;
292 size_t uxOffset = 12;
293 uint8_t ucEthBuf[ ipconfigTCP_MSS ];
294 uintptr_t uxAddrOfNetBuffer = ( uintptr_t ) &xNetBufferToReturn;
295
296 memcpy( ucEthBuf, &uxAddrOfNetBuffer, sizeof( uintptr_t ) );
297 pvBuffer = ( const void * ) ( uxAddrOfNetBuffer + uxOffset + ipBUFFER_PADDING + 1 );
298
299 pxNetworkBuffer = prvPacketBuffer_to_NetworkBuffer( pvBuffer, uxOffset );
300
301 TEST_ASSERT_EQUAL( NULL, pxNetworkBuffer );
302 }
303
304 /**
305 * @brief test_prvPacketBuffer_to_NetworkBuffer_Unalligned
306 * To validate if prvPacketBuffer_to_NetworkBuffer moves offset&padding correctly.
307 */
test_prvPacketBuffer_to_NetworkBuffer_Alligned(void)308 void test_prvPacketBuffer_to_NetworkBuffer_Alligned( void )
309 {
310 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetBufferToReturn;
311 const void * pvBuffer;
312 size_t uxOffset = 20;
313 uint8_t ucEthBuf[ ipBUFFER_PADDING + ipconfigTCP_MSS ];
314 NetworkBufferDescriptor_t * pxAddrOfNetBuffer = &xNetBufferToReturn;
315
316 pxAddrOfNetBuffer->pucEthernetBuffer = ucEthBuf;
317
318 *( ( NetworkBufferDescriptor_t ** ) pxAddrOfNetBuffer->pucEthernetBuffer ) = pxAddrOfNetBuffer;
319
320 pxAddrOfNetBuffer->pucEthernetBuffer += ( uxOffset + ipBUFFER_PADDING );
321
322 pxNetworkBuffer = prvPacketBuffer_to_NetworkBuffer( pxAddrOfNetBuffer->pucEthernetBuffer, uxOffset );
323
324 TEST_ASSERT_EQUAL_PTR( pxAddrOfNetBuffer, pxNetworkBuffer );
325 }
326
327 /**
328 * @brief test_pxUDPPayloadBuffer_to_NetworkBuffer
329 * To validate if pxUDPPayloadBuffer_to_NetworkBuffer returns correct network buffer pointer
330 * for an IPv4 UDP packet.
331 */
test_pxUDPPayloadBuffer_to_NetworkBuffer(void)332 void test_pxUDPPayloadBuffer_to_NetworkBuffer( void )
333 {
334 NetworkBufferDescriptor_t * pxNetworkBuffer, xNetBufferToReturn;
335 const void * pvBuffer;
336 size_t uxOffset = sizeof( UDPPacket_t );
337 uint8_t ucEthBuf[ ipBUFFER_PADDING + ipconfigTCP_MSS ];
338 uint8_t * pucIPType;
339 NetworkBufferDescriptor_t * pxAddrOfNetBuffer = &xNetBufferToReturn;
340
341 pxAddrOfNetBuffer->pucEthernetBuffer = ucEthBuf;
342
343 *( ( NetworkBufferDescriptor_t ** ) pxAddrOfNetBuffer->pucEthernetBuffer ) = pxAddrOfNetBuffer;
344
345 pxAddrOfNetBuffer->pucEthernetBuffer += ( uxOffset + ipBUFFER_PADDING );
346
347 pucIPType = ( pxAddrOfNetBuffer->pucEthernetBuffer ) - ipUDP_PAYLOAD_IP_TYPE_OFFSET;
348 *pucIPType = ( uint8_t ) ipTYPE_IPv4;
349
350 pxNetworkBuffer = pxUDPPayloadBuffer_to_NetworkBuffer( pxAddrOfNetBuffer->pucEthernetBuffer );
351
352 TEST_ASSERT_EQUAL_PTR( pxAddrOfNetBuffer, pxNetworkBuffer );
353 }
354
355 /**
356 * @brief test_pxUDPPayloadBuffer_to_NetworkBuffer_NullInput
357 * To validate if pxUDPPayloadBuffer_to_NetworkBuffer returns NULL when input is NULL.
358 */
test_pxUDPPayloadBuffer_to_NetworkBuffer_NullInput(void)359 void test_pxUDPPayloadBuffer_to_NetworkBuffer_NullInput( void )
360 {
361 NetworkBufferDescriptor_t * pxNetworkBuffer;
362
363 pxNetworkBuffer = pxUDPPayloadBuffer_to_NetworkBuffer( NULL );
364
365 TEST_ASSERT_EQUAL( NULL, pxNetworkBuffer );
366 }
367
368 /**
369 * @brief test_pxUDPPayloadBuffer_to_NetworkBuffer_UnknownIPType
370 * To validate if pxUDPPayloadBuffer_to_NetworkBuffer triggers assertion when IP type of buffer is unknown.
371 */
test_pxUDPPayloadBuffer_to_NetworkBuffer_UnknownIPType(void)372 void test_pxUDPPayloadBuffer_to_NetworkBuffer_UnknownIPType( void )
373 {
374 NetworkBufferDescriptor_t * pxNetBufferToReturn, xNetBufferToReturn;
375 size_t uxOffset = sizeof( UDPPacket_t );
376 uint8_t ucEthBuf[ ipBUFFER_PADDING + ipconfigTCP_MSS ];
377 uint8_t * pucIPType;
378
379 memset( ucEthBuf, 0, sizeof( ucEthBuf ) );
380 memset( &xNetBufferToReturn, 0, sizeof( xNetBufferToReturn ) );
381
382 pxNetBufferToReturn = &xNetBufferToReturn;
383
384 pxNetBufferToReturn->pucEthernetBuffer = ucEthBuf;
385
386 *( ( NetworkBufferDescriptor_t ** ) pxNetBufferToReturn->pucEthernetBuffer ) = pxNetBufferToReturn;
387
388 pxNetBufferToReturn->pucEthernetBuffer += ( uxOffset + ipBUFFER_PADDING );
389
390 pucIPType = ( pxNetBufferToReturn->pucEthernetBuffer ) - ipUDP_PAYLOAD_IP_TYPE_OFFSET;
391 *pucIPType = 0xFF;
392
393 catch_assert( pxUDPPayloadBuffer_to_NetworkBuffer( pxNetBufferToReturn->pucEthernetBuffer ) );
394 }
395
396 /**
397 * @brief test_pxUDPPayloadBuffer_to_NetworkBuffer_IPv6
398 * To validate if pxUDPPayloadBuffer_to_NetworkBuffer returns correct pointer to the network buffer.
399 */
test_pxUDPPayloadBuffer_to_NetworkBuffer_IPv6(void)400 void test_pxUDPPayloadBuffer_to_NetworkBuffer_IPv6( void )
401 {
402 NetworkBufferDescriptor_t * pxNetBufferToReturn, xNetBufferToReturn;
403 size_t uxOffset = sizeof( UDPPacket_IPv6_t );
404 uint8_t ucEthBuf[ ipBUFFER_PADDING + ipconfigTCP_MSS ];
405 uint8_t * pucIPType;
406 uint8_t * pucPayloadBuffer;
407 NetworkBufferDescriptor_t * pxNetworkBuffer;
408
409 memset( ucEthBuf, 0, sizeof( ucEthBuf ) );
410 memset( &xNetBufferToReturn, 0, sizeof( xNetBufferToReturn ) );
411
412 pxNetBufferToReturn = &xNetBufferToReturn;
413
414 pxNetBufferToReturn->pucEthernetBuffer = ucEthBuf;
415
416 *( ( NetworkBufferDescriptor_t ** ) pxNetBufferToReturn->pucEthernetBuffer ) = pxNetBufferToReturn;
417
418 pucPayloadBuffer = &ucEthBuf[ uxOffset + ipBUFFER_PADDING ];
419
420 pucIPType = pucPayloadBuffer - ipUDP_PAYLOAD_IP_TYPE_OFFSET;
421 *pucIPType = ipTYPE_IPv6;
422
423 pxNetworkBuffer = pxUDPPayloadBuffer_to_NetworkBuffer( pucPayloadBuffer );
424
425 TEST_ASSERT_EQUAL( pxNetBufferToReturn, pxNetworkBuffer );
426 }
427
428 /**
429 * @brief test_xIsCallingFromIPTask_NotCallingFromIPTask
430 * To validate if xIsCallingFromIPTask returns pdFALSE when task handles are different.
431 */
test_xIsCallingFromIPTask_NotCallingFromIPTask(void)432 void test_xIsCallingFromIPTask_NotCallingFromIPTask( void )
433 {
434 BaseType_t xReturn;
435 TaskHandle_t xHandleOfIPTask = ( TaskHandle_t ) 0xAABBCCDD, xHandleOfNotIPTask = ( TaskHandle_t ) 0xAABBCCDE;
436
437 xTaskGetCurrentTaskHandle_ExpectAndReturn( xHandleOfNotIPTask );
438 FreeRTOS_GetIPTaskHandle_ExpectAndReturn( xHandleOfIPTask );
439
440 xReturn = xIsCallingFromIPTask();
441
442 TEST_ASSERT_EQUAL( pdFALSE, xReturn );
443 }
444
445 /**
446 * @brief test_xIsCallingFromIPTask_IsCallingFromIPTask
447 * To validate if xIsCallingFromIPTask returns pdTRUE when task handles are same.
448 */
test_xIsCallingFromIPTask_IsCallingFromIPTask(void)449 void test_xIsCallingFromIPTask_IsCallingFromIPTask( void )
450 {
451 BaseType_t xReturn;
452 TaskHandle_t xHandleOfIPTask = ( TaskHandle_t ) 0xAABBCCDD;
453
454 xTaskGetCurrentTaskHandle_ExpectAndReturn( xHandleOfIPTask );
455 FreeRTOS_GetIPTaskHandle_ExpectAndReturn( xHandleOfIPTask );
456
457 xReturn = xIsCallingFromIPTask();
458
459 TEST_ASSERT_EQUAL( pdTRUE, xReturn );
460 }
461
462 /**
463 * @brief test_prvProcessNetworkDownEvent_Pass
464 * First prvProcessNetworkDownEvent call to validate if network down event reset
465 * endpoint's state. And second prvProcessNetworkDownEvent call to validate if it calls
466 * user's hook.
467 */
test_prvProcessNetworkDownEvent_Pass(void)468 void test_prvProcessNetworkDownEvent_Pass( void )
469 {
470 NetworkInterface_t xInterface;
471 NetworkEndPoint_t xEndPoint = { 0 };
472
473 xCallEventHook = pdFALSE;
474 xInterfaces[ 0 ].pfInitialise = &xNetworkInterfaceInitialise_returnTrue;
475 xEndPoint.bits.bWantDHCP = pdTRUE_UNSIGNED;
476 xEndPoint.bits.bCallDownHook = pdFALSE_UNSIGNED;
477
478 vIPSetARPTimerEnableState_Expect( pdFALSE );
479
480 FreeRTOS_FirstEndPoint_IgnoreAndReturn( &xEndPoint );
481 FreeRTOS_NextEndPoint_IgnoreAndReturn( NULL );
482
483 FreeRTOS_ClearARP_ExpectAnyArgs();
484
485 vDHCPProcess_Expect( pdTRUE, &xEndPoint );
486
487 prvProcessNetworkDownEvent( &xInterfaces[ 0 ] );
488
489 /* Run again to trigger a different path in the code. */
490
491 vIPSetARPTimerEnableState_Expect( pdFALSE );
492
493 FreeRTOS_FirstEndPoint_IgnoreAndReturn( &xEndPoint );
494 FreeRTOS_NextEndPoint_IgnoreAndReturn( NULL );
495
496 vApplicationIPNetworkEventHook_Multi_Expect( eNetworkDown, &xEndPoint );
497
498 FreeRTOS_ClearARP_Expect( &xEndPoint );
499
500 vDHCPProcess_Expect( pdTRUE, &xEndPoint );
501
502 prvProcessNetworkDownEvent( &xInterfaces[ 0 ] );
503 }
504
505 /**
506 * @brief test_prvProcessNetworkDownEvent_Fail
507 * To validate if prvProcessNetworkDownEvent skips hook and DHCP
508 * when bCallDownHook & bWantDHCP are both disabled.
509 */
test_prvProcessNetworkDownEvent_Fail(void)510 void test_prvProcessNetworkDownEvent_Fail( void )
511 {
512 NetworkInterface_t xInterface;
513 NetworkEndPoint_t xEndPoint = { 0 };
514
515 xCallEventHook = pdFALSE;
516 xInterfaces[ 0 ].pfInitialise = &xNetworkInterfaceInitialise_returnTrue;
517 xEndPoint.bits.bCallDownHook = pdFALSE_UNSIGNED;
518 xEndPoint.bits.bWantDHCP = pdFALSE_UNSIGNED;
519
520 vIPSetARPTimerEnableState_Expect( pdFALSE );
521
522 FreeRTOS_FirstEndPoint_IgnoreAndReturn( &xEndPoint );
523 FreeRTOS_NextEndPoint_IgnoreAndReturn( NULL );
524
525 FreeRTOS_ClearARP_Expect( &xEndPoint );
526
527 vIPNetworkUpCalls_Expect( &xEndPoint );
528
529 prvProcessNetworkDownEvent( &xInterfaces[ 0 ] );
530 }
531
532 /**
533 * @brief test_prvProcessNetworkDownEvent_NullInterface
534 * To validate if prvProcessNetworkDownEvent triggers assertion when
535 * input interface is NULL pointer.
536 */
test_prvProcessNetworkDownEvent_NullInterface(void)537 void test_prvProcessNetworkDownEvent_NullInterface( void )
538 {
539 catch_assert( prvProcessNetworkDownEvent( NULL ) );
540 }
541
542 /**
543 * @brief test_prvProcessNetworkDownEvent_NullInitialFunction
544 * To validate if prvProcessNetworkDownEvent triggers assertion when
545 * initialize function pointer of input interface is NULL.
546 */
test_prvProcessNetworkDownEvent_NullInitialFunction(void)547 void test_prvProcessNetworkDownEvent_NullInitialFunction( void )
548 {
549 NetworkInterface_t xInterface;
550
551 xInterface.pfInitialise = NULL;
552
553 catch_assert( prvProcessNetworkDownEvent( &xInterface ) );
554 }
555
556 /**
557 * @brief test_prvProcessNetworkDownEvent_InterfaceInitFail
558 * To validate if prvProcessNetworkDownEvent skips the following calls
559 * after interface initialization when it returns false.
560 */
test_prvProcessNetworkDownEvent_InterfaceInitFail(void)561 void test_prvProcessNetworkDownEvent_InterfaceInitFail( void )
562 {
563 NetworkInterface_t xInterface;
564 NetworkEndPoint_t xEndPoint = { 0 };
565
566 xCallEventHook = pdFALSE;
567 xInterface.pfInitialise = &xNetworkInterfaceInitialise_returnFalse;
568 xEndPoint.bits.bWantDHCP = pdTRUE_UNSIGNED;
569 xEndPoint.bits.bCallDownHook = pdFALSE_UNSIGNED;
570
571 vIPSetARPTimerEnableState_Expect( pdFALSE );
572
573 FreeRTOS_FirstEndPoint_IgnoreAndReturn( &xEndPoint );
574 FreeRTOS_NextEndPoint_IgnoreAndReturn( NULL );
575
576 FreeRTOS_ClearARP_ExpectAnyArgs();
577
578 prvProcessNetworkDownEvent( &xInterface );
579 }
580
581 /**
582 * @brief test_prvProcessNetworkDownEvent_PassDHCPv6
583 * To validate if prvProcessNetworkDownEvent runs DHCPv6 flow when
584 * the endpoint is configured for it.
585 */
test_prvProcessNetworkDownEvent_PassDHCPv6(void)586 void test_prvProcessNetworkDownEvent_PassDHCPv6( void )
587 {
588 NetworkInterface_t xInterface;
589 NetworkEndPoint_t xEndPoint = { 0 };
590
591 xCallEventHook = pdFALSE;
592 xInterface.pfInitialise = &xNetworkInterfaceInitialise_returnTrue;
593 xEndPoint.bits.bIPv6 = pdTRUE_UNSIGNED;
594 xEndPoint.bits.bWantDHCP = pdTRUE_UNSIGNED;
595 xEndPoint.bits.bCallDownHook = pdFALSE_UNSIGNED;
596
597 vIPSetARPTimerEnableState_Expect( pdFALSE );
598
599 FreeRTOS_FirstEndPoint_IgnoreAndReturn( &xEndPoint );
600 FreeRTOS_NextEndPoint_IgnoreAndReturn( NULL );
601
602 FreeRTOS_ClearARP_ExpectAnyArgs();
603
604 vDHCPv6Process_Expect( pdTRUE, &xEndPoint );
605
606 prvProcessNetworkDownEvent( &xInterface );
607 }
608
609 /**
610 * @brief test_prvProcessNetworkDownEvent_PassRA
611 * To validate if prvProcessNetworkDownEvent runs RA flow when
612 * the endpoint is configured for it.
613 */
test_prvProcessNetworkDownEvent_PassRA(void)614 void test_prvProcessNetworkDownEvent_PassRA( void )
615 {
616 NetworkInterface_t xInterface;
617 NetworkEndPoint_t xEndPoint = { 0 };
618
619 xCallEventHook = pdFALSE;
620 xInterface.pfInitialise = &xNetworkInterfaceInitialise_returnTrue;
621 xEndPoint.bits.bIPv6 = pdTRUE_UNSIGNED;
622 xEndPoint.bits.bWantRA = pdTRUE_UNSIGNED;
623 xEndPoint.bits.bCallDownHook = pdFALSE_UNSIGNED;
624
625 vIPSetARPTimerEnableState_Expect( pdFALSE );
626
627 FreeRTOS_FirstEndPoint_IgnoreAndReturn( &xEndPoint );
628 FreeRTOS_NextEndPoint_IgnoreAndReturn( NULL );
629
630 FreeRTOS_ClearARP_ExpectAnyArgs();
631
632 vRAProcess_Expect( pdTRUE, &xEndPoint );
633
634 prvProcessNetworkDownEvent( &xInterface );
635 }
636
637 /**
638 * @brief test_prvProcessNetworkDownEvent_PassStaticIP
639 * To validate if prvProcessNetworkDownEvent sets static IP address to endpoint.
640 */
test_prvProcessNetworkDownEvent_PassStaticIP(void)641 void test_prvProcessNetworkDownEvent_PassStaticIP( void )
642 {
643 NetworkInterface_t xInterface;
644 NetworkEndPoint_t xEndPoint = { 0 };
645 IPv6_Address_t xIPv6Address = { { 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 } };
646
647 xCallEventHook = pdFALSE;
648 xInterface.pfInitialise = &xNetworkInterfaceInitialise_returnTrue;
649 xEndPoint.bits.bIPv6 = pdTRUE_UNSIGNED;
650 xEndPoint.bits.bWantRA = pdFALSE_UNSIGNED;
651 xEndPoint.bits.bWantDHCP = pdFALSE_UNSIGNED;
652 xEndPoint.bits.bCallDownHook = pdFALSE_UNSIGNED;
653 memcpy( xEndPoint.ipv6_defaults.xIPAddress.ucBytes, xIPv6Address.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
654
655 vIPSetARPTimerEnableState_Expect( pdFALSE );
656
657 FreeRTOS_FirstEndPoint_IgnoreAndReturn( &xEndPoint );
658 FreeRTOS_NextEndPoint_IgnoreAndReturn( NULL );
659
660 FreeRTOS_ClearARP_ExpectAnyArgs();
661
662 vIPNetworkUpCalls_Expect( &xEndPoint );
663
664 prvProcessNetworkDownEvent( &xInterface );
665
666 TEST_ASSERT_EQUAL_MEMORY( xIPv6Address.ucBytes, xEndPoint.ipv6_settings.xIPAddress.ucBytes, ipSIZE_OF_IPv6_ADDRESS );
667 }
668
669 /**
670 * @brief test_vPreCheckConfigs_CatchAssertTaskNotReady
671 * To validate if vPreCheckConfigs triggers assertion when IP task is not ready.
672 */
test_vPreCheckConfigs_CatchAssertTaskNotReady(void)673 void test_vPreCheckConfigs_CatchAssertTaskNotReady( void )
674 {
675 xIPIsNetworkTaskReady_ExpectAndReturn( pdTRUE );
676
677 catch_assert( vPreCheckConfigs() );
678 }
679
680 /**
681 * @brief test_vPreCheckConfigs_CatchAssertNonEmptyEventQueue
682 * To validate if vPreCheckConfigs triggers assertion when network event queue is not NULL.
683 */
test_vPreCheckConfigs_CatchAssertNonEmptyEventQueue(void)684 void test_vPreCheckConfigs_CatchAssertNonEmptyEventQueue( void )
685 {
686 xIPIsNetworkTaskReady_ExpectAndReturn( pdFALSE );
687 xNetworkEventQueue = ( QueueHandle_t ) 0xAABBCCDD;
688
689 catch_assert( vPreCheckConfigs() );
690 }
691
692 /**
693 * @brief test_vPreCheckConfigs_CatchAssertNonNullTaskHandle
694 * To validate if vPreCheckConfigs triggers assertion when task handle is not NULL.
695 */
test_vPreCheckConfigs_CatchAssertNonNullTaskHandle(void)696 void test_vPreCheckConfigs_CatchAssertNonNullTaskHandle( void )
697 {
698 xIPIsNetworkTaskReady_ExpectAndReturn( pdFALSE );
699 xNetworkEventQueue = NULL;
700 FreeRTOS_GetIPTaskHandle_ExpectAndReturn( ( TaskHandle_t ) 0xAABBCCDD );
701
702 catch_assert( vPreCheckConfigs() );
703 }
704
705 /**
706 * @brief test_vPreCheckConfigs
707 * To validate vPreCheckConfigs pass path.
708 */
test_vPreCheckConfigs(void)709 void test_vPreCheckConfigs( void )
710 {
711 xIPIsNetworkTaskReady_ExpectAndReturn( pdFALSE );
712 xNetworkEventQueue = NULL;
713 FreeRTOS_GetIPTaskHandle_ExpectAndReturn( ( TaskHandle_t ) 0x00 );
714
715 vPreCheckConfigs();
716 }
717
718 /**
719 * @brief test_usGenerateProtocolChecksum_UnknownProtocol
720 * To validate usGenerateProtocolChecksum returns ipUNHANDLED_PROTOCOL if no valid protocol in IP header.
721 */
test_usGenerateProtocolChecksum_UnknownProtocol(void)722 void test_usGenerateProtocolChecksum_UnknownProtocol( void )
723 {
724 uint16_t usReturn;
725 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
726 BaseType_t xOutgoingPacket = pdFALSE;
727 uint8_t ucVersionHeaderLength = 20;
728 IPPacket_t * pxIPPacket;
729 uint16_t usLength = 100;
730 size_t uxBufferLength = usLength + ipSIZE_OF_ETH_HEADER;
731 ProtocolPacket_t * pxProtPack;
732
733 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
734
735 pxProtPack = ( ProtocolPacket_t * ) &( pucEthernetBuffer[ ucVersionHeaderLength - ipSIZE_OF_IPv4_HEADER ] );
736 pxIPPacket = ( IPPacket_t * ) pucEthernetBuffer;
737
738 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
739 pxIPPacket->xIPHeader.ucVersionHeaderLength = ( ucVersionHeaderLength >> 2 );
740 pxIPPacket->xIPHeader.usLength = FreeRTOS_htons( usLength );
741
742 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_TCP;
743
744 pxProtPack->xTCPPacket.xTCPHeader.ucTCPOffset = 0x50;
745
746 prvChecksumIPv4Checks_Stub( prvChecksumIPv4Checks_UnknownProtocol );
747
748 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
749
750 TEST_ASSERT_EQUAL( ipUNHANDLED_PROTOCOL, usReturn );
751 }
752
753 /**
754 * @brief test_usGenerateProtocolChecksum_InvalidLength
755 * To validate usGenerateProtocolChecksum returns ipINVALID_LENGTH if prvChecksumIPv4Checks returns non-zero.
756 */
test_usGenerateProtocolChecksum_InvalidLength(void)757 void test_usGenerateProtocolChecksum_InvalidLength( void )
758 {
759 uint16_t usReturn;
760 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
761 size_t uxBufferLength = sizeof( IPPacket_t ) - 1;
762 BaseType_t xOutgoingPacket;
763
764 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
765 ( ( IPPacket_t * ) pucEthernetBuffer )->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
766
767 prvChecksumIPv4Checks_Stub( prvChecksumIPv4Checks_InvalidLength );
768
769 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
770
771 TEST_ASSERT_EQUAL( usReturn, ipINVALID_LENGTH );
772 }
773
774 /**
775 * @brief test_usGenerateProtocolChecksum_UDPInvalidLength
776 * To validate usGenerateProtocolChecksum returns ipINVALID_LENGTH if
777 * length in IP header is less than UDP header size.
778 */
test_usGenerateProtocolChecksum_UDPInvalidLength(void)779 void test_usGenerateProtocolChecksum_UDPInvalidLength( void )
780 {
781 uint16_t usReturn;
782 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
783 BaseType_t xOutgoingPacket = pdFALSE;
784 uint8_t ucVersionHeaderLength = 20;
785 IPPacket_t * pxIPPacket;
786 uint16_t usLength = ucVersionHeaderLength;
787 size_t uxBufferLength = ucVersionHeaderLength + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_UDP_HEADER - 1;
788
789 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
790
791 pxIPPacket = ( IPPacket_t * ) pucEthernetBuffer;
792 pxIPPacket->xIPHeader.ucVersionHeaderLength = ( ucVersionHeaderLength >> 2 );
793 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
794 pxIPPacket->xIPHeader.usLength = FreeRTOS_htons( usLength );
795
796 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_UDP;
797
798 prvChecksumIPv4Checks_Stub( prvChecksumIPv4Checks_Valid );
799
800 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
801
802 TEST_ASSERT_EQUAL( ipINVALID_LENGTH, usReturn );
803 }
804
805 /**
806 * @brief test_usGenerateProtocolChecksum_UDPWrongCRCIncomingPacket
807 * To validate usGenerateProtocolChecksum returns ipWRONG_CRC if
808 * UDP checksum is zero and ipconfigUDP_PASS_ZERO_CHECKSUM_PACKETS is 0.
809 */
test_usGenerateProtocolChecksum_UDPWrongCRCIncomingPacket(void)810 void test_usGenerateProtocolChecksum_UDPWrongCRCIncomingPacket( void )
811 {
812 uint16_t usReturn;
813 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
814 BaseType_t xOutgoingPacket = pdFALSE;
815 uint8_t ucVersionHeaderLength = 20;
816 IPPacket_t * pxIPPacket;
817 uint16_t usLength = ucVersionHeaderLength + ipSIZE_OF_UDP_HEADER + TEST_UDP_PAYLOAD_LENGTH;
818 size_t uxBufferLength = ucVersionHeaderLength + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_UDP_HEADER;
819
820 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
821
822 pxIPPacket = ( IPPacket_t * ) pucEthernetBuffer;
823 pxIPPacket->xIPHeader.ucVersionHeaderLength = ( ucVersionHeaderLength >> 2 );
824 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
825 pxIPPacket->xIPHeader.usLength = FreeRTOS_htons( usLength );
826
827 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_UDP;
828
829 prvChecksumIPv4Checks_Stub( prvChecksumIPv4Checks_Valid );
830
831 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
832
833 TEST_ASSERT_EQUAL( ipWRONG_CRC, usReturn );
834 }
835
836 /**
837 * @brief test_usGenerateProtocolChecksum_UDPOutgoingPacketLessProtocolLength
838 * To validate usGenerateProtocolChecksum returns ipINVALID_LENGTH if
839 * length in IP header is less than UDP header size.
840 */
test_usGenerateProtocolChecksum_UDPOutgoingPacketLessProtocolLength(void)841 void test_usGenerateProtocolChecksum_UDPOutgoingPacketLessProtocolLength( void )
842 {
843 uint16_t usReturn;
844 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
845 BaseType_t xOutgoingPacket = pdTRUE;
846 uint8_t ucVersionHeaderLength = 20;
847 IPPacket_t * pxIPPacket;
848 uint16_t usLength = 10;
849 size_t uxBufferLength = ucVersionHeaderLength + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_UDP_HEADER;
850
851 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
852
853 pxIPPacket = ( IPPacket_t * ) pucEthernetBuffer;
854 pxIPPacket->xIPHeader.ucVersionHeaderLength = ( ucVersionHeaderLength >> 2 );
855 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
856 pxIPPacket->xIPHeader.usLength = FreeRTOS_htons( usLength );
857
858 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_UDP;
859
860 prvChecksumIPv4Checks_Stub( prvChecksumIPv4Checks_Valid );
861
862 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
863
864 TEST_ASSERT_EQUAL( ipINVALID_LENGTH, usReturn );
865 }
866
867 /**
868 * @brief test_usGenerateProtocolChecksum_UDPNonZeroChecksum
869 * To validate usGenerateProtocolChecksum returns ipWRONG_CRC if
870 * CRC in UDP header is wrong.
871 */
test_usGenerateProtocolChecksum_UDPNonZeroChecksum(void)872 void test_usGenerateProtocolChecksum_UDPNonZeroChecksum( void )
873 {
874 uint16_t usReturn;
875 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
876 BaseType_t xOutgoingPacket = pdFALSE;
877 uint8_t ucVersionHeaderLength = 20;
878 IPPacket_t * pxIPPacket;
879 uint16_t usLength = ucVersionHeaderLength + ipSIZE_OF_UDP_HEADER + TEST_UDP_PAYLOAD_LENGTH;
880 size_t uxBufferLength = ucVersionHeaderLength + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_UDP_HEADER;
881 ProtocolPacket_t * pxProtPack;
882
883 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
884
885 pxProtPack = ( ProtocolPacket_t * ) &( pucEthernetBuffer[ ucVersionHeaderLength - ipSIZE_OF_IPv4_HEADER ] );
886
887 pxIPPacket = ( IPPacket_t * ) pucEthernetBuffer;
888 pxIPPacket->xIPHeader.ucVersionHeaderLength = ( ucVersionHeaderLength >> 2 );
889 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
890 pxIPPacket->xIPHeader.usLength = FreeRTOS_htons( usLength );
891
892 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_UDP;
893
894 pxProtPack->xUDPPacket.xUDPHeader.usChecksum = 0x1234;
895
896 prvChecksumIPv4Checks_Stub( prvChecksumIPv4Checks_Valid );
897
898 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
899
900 TEST_ASSERT_EQUAL( ipWRONG_CRC, usReturn );
901 }
902
903 /**
904 * @brief test_usGenerateProtocolChecksum_UDPCorrectCRCOutgoingPacket
905 * To validate usGenerateProtocolChecksum returns ipCORRECT_CRC if
906 * it's a outgoing packet. And set the checksum to 0xFFFF because the calculated checksum was zero.
907 */
test_usGenerateProtocolChecksum_UDPCorrectCRCOutgoingPacket(void)908 void test_usGenerateProtocolChecksum_UDPCorrectCRCOutgoingPacket( void )
909 {
910 uint16_t usReturn;
911 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
912 BaseType_t xOutgoingPacket = pdTRUE;
913 uint8_t ucVersionHeaderLength = 20;
914 IPPacket_t * pxIPPacket;
915 uint16_t usLength = 100;
916 size_t uxBufferLength = usLength + ipSIZE_OF_ETH_HEADER;
917 ProtocolPacket_t * pxProtPack;
918
919 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
920
921 /* This is the checksum with zeroed out data. Fill it in to make the checksum 0. */
922 *( ( uint32_t * ) &pucEthernetBuffer[ usLength - sizeof( uint32_t ) ] ) = FreeRTOS_htonl( 0xFF9E );
923
924 pxProtPack = ( ProtocolPacket_t * ) &( pucEthernetBuffer[ ucVersionHeaderLength - ipSIZE_OF_IPv4_HEADER ] );
925
926 pxIPPacket = ( IPPacket_t * ) pucEthernetBuffer;
927 pxIPPacket->xIPHeader.ucVersionHeaderLength = ( ucVersionHeaderLength >> 2 );
928 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
929 pxIPPacket->xIPHeader.usLength = FreeRTOS_htons( usLength );
930
931 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_UDP;
932
933 pxProtPack->xUDPPacket.xUDPHeader.usChecksum = 0x00;
934
935 prvChecksumIPv4Checks_Stub( prvChecksumIPv4Checks_Valid );
936
937 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
938
939 TEST_ASSERT_EQUAL( ipCORRECT_CRC, usReturn );
940 TEST_ASSERT_EQUAL( 0xFFFF, pxProtPack->xUDPPacket.xUDPHeader.usChecksum );
941 }
942
943 /**
944 * @brief test_usGenerateProtocolChecksum_UDPLessBufferSizeOutgoingPacket
945 * To validate usGenerateProtocolChecksum returns ipINVALID_LENGTH if
946 * buffer size is less than minimum requirement.
947 */
test_usGenerateProtocolChecksum_UDPLessBufferSizeOutgoingPacket(void)948 void test_usGenerateProtocolChecksum_UDPLessBufferSizeOutgoingPacket( void )
949 {
950 uint16_t usReturn;
951 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
952 BaseType_t xOutgoingPacket = pdTRUE;
953 uint8_t ucVersionHeaderLength = 20;
954 IPPacket_t * pxIPPacket;
955 uint16_t usLength = 100;
956 size_t uxBufferLength = ipSIZE_OF_ETH_HEADER + ucVersionHeaderLength + ipSIZE_OF_UDP_HEADER - 1;
957 ProtocolPacket_t * pxProtPack;
958
959 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
960
961 pxProtPack = ( ProtocolPacket_t * ) &( pucEthernetBuffer[ ucVersionHeaderLength - ipSIZE_OF_IPv4_HEADER ] );
962
963 pxIPPacket = ( IPPacket_t * ) pucEthernetBuffer;
964 pxIPPacket->xIPHeader.ucVersionHeaderLength = ( ucVersionHeaderLength >> 2 );
965 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
966 pxIPPacket->xIPHeader.usLength = FreeRTOS_htons( usLength );
967
968 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_UDP;
969
970 pxProtPack->xUDPPacket.xUDPHeader.usChecksum = 0x00;
971
972 prvChecksumIPv4Checks_Stub( prvChecksumIPv4Checks_Valid );
973
974 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
975
976 TEST_ASSERT_EQUAL( ipINVALID_LENGTH, usReturn );
977 }
978
979 /**
980 * @brief test_usGenerateProtocolChecksum_UDPCorrectCRC
981 * To validate usGenerateProtocolChecksum returns ipCORRECT_CRC if
982 * it's a incoming packet.
983 */
test_usGenerateProtocolChecksum_UDPCorrectCRC(void)984 void test_usGenerateProtocolChecksum_UDPCorrectCRC( void )
985 {
986 uint16_t usReturn;
987 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
988 BaseType_t xOutgoingPacket = pdFALSE;
989 uint8_t ucVersionHeaderLength = 20;
990 IPPacket_t * pxIPPacket;
991 uint16_t usLength = 100;
992 size_t uxBufferLength = usLength + ipSIZE_OF_ETH_HEADER;
993 ProtocolPacket_t * pxProtPack;
994
995 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
996
997 pxProtPack = ( ProtocolPacket_t * ) &( pucEthernetBuffer[ ucVersionHeaderLength - ipSIZE_OF_IPv4_HEADER ] );
998
999 pxIPPacket = ( IPPacket_t * ) pucEthernetBuffer;
1000 pxIPPacket->xIPHeader.ucVersionHeaderLength = ( ucVersionHeaderLength >> 2 );
1001 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
1002 pxIPPacket->xIPHeader.usLength = FreeRTOS_htons( usLength );
1003
1004 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_UDP;
1005
1006 pxProtPack->xUDPPacket.xUDPHeader.usChecksum = 0x9EFF;
1007
1008 prvChecksumIPv4Checks_Stub( prvChecksumIPv4Checks_Valid );
1009
1010 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
1011
1012 TEST_ASSERT_EQUAL( ipCORRECT_CRC, usReturn );
1013 }
1014
1015 /**
1016 * @brief test_usGenerateProtocolChecksum_UDPIncorrectCRC
1017 * To validate usGenerateProtocolChecksum returns ipWRONG_CRC if
1018 * checksum in UDP header is wrong.
1019 */
test_usGenerateProtocolChecksum_UDPIncorrectCRC(void)1020 void test_usGenerateProtocolChecksum_UDPIncorrectCRC( void )
1021 {
1022 uint16_t usReturn;
1023 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1024 BaseType_t xOutgoingPacket = pdFALSE;
1025 uint8_t ucVersionHeaderLength = 20;
1026 IPPacket_t * pxIPPacket;
1027 uint16_t usLength = 100;
1028 size_t uxBufferLength = usLength + ipSIZE_OF_ETH_HEADER;
1029 ProtocolPacket_t * pxProtPack;
1030
1031 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
1032
1033 pxProtPack = ( ProtocolPacket_t * ) &( pucEthernetBuffer[ ucVersionHeaderLength - ipSIZE_OF_IPv4_HEADER ] );
1034
1035 pxIPPacket = ( IPPacket_t * ) pucEthernetBuffer;
1036 pxIPPacket->xIPHeader.ucVersionHeaderLength = ( ucVersionHeaderLength >> 2 );
1037 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
1038 pxIPPacket->xIPHeader.usLength = FreeRTOS_htons( usLength );
1039
1040 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_UDP;
1041
1042 pxProtPack->xUDPPacket.xUDPHeader.usChecksum = 0x01;
1043
1044 prvChecksumIPv4Checks_Stub( prvChecksumIPv4Checks_Valid );
1045
1046 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
1047
1048 TEST_ASSERT_EQUAL( ipWRONG_CRC, usReturn );
1049 }
1050
1051 /**
1052 * @brief test_usGenerateProtocolChecksum_TCPCorrectCRC
1053 * To validate usGenerateProtocolChecksum returns ipCORRECT_CRC if
1054 * checksum in TCP header is correct.
1055 */
test_usGenerateProtocolChecksum_TCPCorrectCRC(void)1056 void test_usGenerateProtocolChecksum_TCPCorrectCRC( void )
1057 {
1058 uint16_t usReturn;
1059 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1060 BaseType_t xOutgoingPacket = pdFALSE;
1061 uint8_t ucVersionHeaderLength = 20;
1062 IPPacket_t * pxIPPacket;
1063 uint16_t usLength = 100;
1064 size_t uxBufferLength = usLength + ipSIZE_OF_ETH_HEADER;
1065 ProtocolPacket_t * pxProtPack;
1066
1067 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
1068
1069 pxProtPack = ( ProtocolPacket_t * ) &( pucEthernetBuffer[ ucVersionHeaderLength - ipSIZE_OF_IPv4_HEADER ] );
1070
1071 pxIPPacket = ( IPPacket_t * ) pucEthernetBuffer;
1072 pxIPPacket->xIPHeader.ucVersionHeaderLength = ( ucVersionHeaderLength >> 2 );
1073 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
1074 pxIPPacket->xIPHeader.usLength = FreeRTOS_htons( usLength );
1075
1076 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_TCP;
1077
1078 pxProtPack->xTCPPacket.xTCPHeader.ucTCPOffset = 0x50;
1079 pxProtPack->xTCPPacket.xTCPHeader.usChecksum = 0xA9AF;
1080
1081 prvChecksumIPv4Checks_Stub( prvChecksumIPv4Checks_Valid );
1082
1083 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
1084
1085 TEST_ASSERT_EQUAL( ipCORRECT_CRC, usReturn );
1086 }
1087
1088 /**
1089 * @brief test_usGenerateProtocolChecksum_TCPCorrectCRCOutgoingPacket
1090 * To validate usGenerateProtocolChecksum returns ipCORRECT_CRC when it
1091 * generates correct CRC in TCP checksum.
1092 */
test_usGenerateProtocolChecksum_TCPCorrectCRCOutgoingPacket(void)1093 void test_usGenerateProtocolChecksum_TCPCorrectCRCOutgoingPacket( void )
1094 {
1095 uint16_t usReturn;
1096 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1097 BaseType_t xOutgoingPacket = pdTRUE;
1098 uint8_t ucVersionHeaderLength = 20;
1099 IPPacket_t * pxIPPacket;
1100 uint16_t usLength = 100;
1101 size_t uxBufferLength = usLength + ipSIZE_OF_ETH_HEADER;
1102 ProtocolPacket_t * pxProtPack;
1103
1104 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
1105
1106 /* This is the checksum with zeroed out data. Fill it in to make the checksum 0. */
1107 *( ( uint32_t * ) &pucEthernetBuffer[ usLength - sizeof( uint32_t ) ] ) = FreeRTOS_htonl( 0xFFA9 );
1108
1109 pxProtPack = ( ProtocolPacket_t * ) &( pucEthernetBuffer[ ucVersionHeaderLength - ipSIZE_OF_IPv4_HEADER ] );
1110
1111 pxIPPacket = ( IPPacket_t * ) pucEthernetBuffer;
1112 pxIPPacket->xIPHeader.ucVersionHeaderLength = ( ucVersionHeaderLength >> 2 );
1113 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
1114 pxIPPacket->xIPHeader.usLength = FreeRTOS_htons( usLength );
1115
1116 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_TCP;
1117
1118 pxProtPack->xTCPPacket.xTCPHeader.ucTCPOffset = 0x50;
1119 pxProtPack->xTCPPacket.xTCPHeader.usChecksum = 0x0000;
1120
1121 prvChecksumIPv4Checks_Stub( prvChecksumIPv4Checks_Valid );
1122
1123 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
1124
1125 TEST_ASSERT_EQUAL( ipCORRECT_CRC, usReturn );
1126 }
1127
1128 /**
1129 * @brief test_usGenerateProtocolChecksum_TCPCorrectCRCOutgoingPacketZeroChecksum
1130 * To validate usGenerateProtocolChecksum returns ipCORRECT_CRC if
1131 * it's a TCP outgoing packet. And the checksum is zero.
1132 */
test_usGenerateProtocolChecksum_TCPCorrectCRCOutgoingPacketZeroChecksum(void)1133 void test_usGenerateProtocolChecksum_TCPCorrectCRCOutgoingPacketZeroChecksum( void )
1134 {
1135 uint16_t usReturn;
1136 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1137 BaseType_t xOutgoingPacket = pdTRUE;
1138 uint8_t ucVersionHeaderLength = 20;
1139 IPPacket_t * pxIPPacket;
1140 uint16_t usLength = 100;
1141 size_t uxBufferLength = usLength + ipSIZE_OF_ETH_HEADER;
1142 ProtocolPacket_t * pxProtPack;
1143
1144 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
1145
1146 /* This is the checksum with zeroed out data. Fill it in to make the checksum 0. */
1147 *( ( uint32_t * ) &pucEthernetBuffer[ usLength - sizeof( uint32_t ) ] ) = FreeRTOS_htonl( 0xAFA9 );
1148
1149 pxProtPack = ( ProtocolPacket_t * ) &( pucEthernetBuffer[ ucVersionHeaderLength - ipSIZE_OF_IPv4_HEADER ] );
1150
1151 pxIPPacket = ( IPPacket_t * ) pucEthernetBuffer;
1152 pxIPPacket->xIPHeader.ucVersionHeaderLength = ( ucVersionHeaderLength >> 2 );
1153 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
1154 pxIPPacket->xIPHeader.usLength = FreeRTOS_htons( usLength );
1155
1156 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_TCP;
1157
1158 pxProtPack->xTCPPacket.xTCPHeader.ucTCPOffset = 0x50;
1159 pxProtPack->xTCPPacket.xTCPHeader.usChecksum = 0x00;
1160
1161 prvChecksumIPv4Checks_Stub( prvChecksumIPv4Checks_Valid );
1162
1163 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
1164
1165 TEST_ASSERT_EQUAL( ipCORRECT_CRC, usReturn );
1166 TEST_ASSERT_EQUAL( 0, pxProtPack->xTCPPacket.xTCPHeader.usChecksum );
1167 }
1168
1169 /**
1170 * @brief test_usGenerateProtocolChecksum_TCPIncorrectCRC_IncomingPacket
1171 * To validate usGenerateProtocolChecksum returns ipWRONG_CRC if
1172 * checksum in TCP header is incorrect.
1173 */
test_usGenerateProtocolChecksum_TCPIncorrectCRC_IncomingPacket(void)1174 void test_usGenerateProtocolChecksum_TCPIncorrectCRC_IncomingPacket( void )
1175 {
1176 uint16_t usReturn;
1177 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1178 BaseType_t xOutgoingPacket = pdFALSE;
1179 uint8_t ucVersionHeaderLength = 20;
1180 IPPacket_t * pxIPPacket;
1181 uint16_t usLength = 100;
1182 size_t uxBufferLength = usLength + ipSIZE_OF_ETH_HEADER;
1183 ProtocolPacket_t * pxProtPack;
1184
1185 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
1186
1187 pxProtPack = ( ProtocolPacket_t * ) &( pucEthernetBuffer[ ucVersionHeaderLength - ipSIZE_OF_IPv4_HEADER ] );
1188
1189 pxIPPacket = ( IPPacket_t * ) pucEthernetBuffer;
1190 pxIPPacket->xIPHeader.ucVersionHeaderLength = ( ucVersionHeaderLength >> 2 );
1191 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
1192 pxIPPacket->xIPHeader.usLength = FreeRTOS_htons( usLength );
1193
1194 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_TCP;
1195
1196 pxProtPack->xTCPPacket.xTCPHeader.ucTCPOffset = 0x50;
1197 pxProtPack->xTCPPacket.xTCPHeader.usChecksum = 0x0000;
1198
1199 prvChecksumIPv4Checks_Stub( prvChecksumIPv4Checks_Valid );
1200
1201 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
1202
1203 TEST_ASSERT_EQUAL( ipWRONG_CRC, usReturn );
1204 }
1205
1206 /**
1207 * @brief test_usGenerateProtocolChecksum_TCPLessBufferSize_OutgoingPacket
1208 * To validate usGenerateProtocolChecksum returns ipINVALID_LENGTH if
1209 * buffer size is less than TCP minimum requirement.
1210 */
test_usGenerateProtocolChecksum_TCPLessBufferSize_OutgoingPacket(void)1211 void test_usGenerateProtocolChecksum_TCPLessBufferSize_OutgoingPacket( void )
1212 {
1213 uint16_t usReturn;
1214 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1215 BaseType_t xOutgoingPacket = pdTRUE;
1216 uint8_t ucVersionHeaderLength = 20;
1217 IPPacket_t * pxIPPacket;
1218 uint16_t usLength = 100;
1219 size_t uxBufferLength = ipSIZE_OF_ETH_HEADER + ucVersionHeaderLength + ipSIZE_OF_TCP_HEADER - 1;
1220 ProtocolPacket_t * pxProtPack;
1221
1222 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
1223
1224 pxProtPack = ( ProtocolPacket_t * ) &( pucEthernetBuffer[ ucVersionHeaderLength - ipSIZE_OF_IPv4_HEADER ] );
1225
1226 pxIPPacket = ( IPPacket_t * ) pucEthernetBuffer;
1227 pxIPPacket->xIPHeader.ucVersionHeaderLength = ( ucVersionHeaderLength >> 2 );
1228 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
1229 pxIPPacket->xIPHeader.usLength = FreeRTOS_htons( usLength );
1230
1231 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_TCP;
1232
1233 pxProtPack->xTCPPacket.xTCPHeader.ucTCPOffset = 0x50;
1234 pxProtPack->xTCPPacket.xTCPHeader.usChecksum = 0x0000;
1235
1236 prvChecksumIPv4Checks_Stub( prvChecksumIPv4Checks_Valid );
1237
1238 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
1239
1240 TEST_ASSERT_EQUAL( ipINVALID_LENGTH, usReturn );
1241 }
1242
1243 /**
1244 * @brief test_usGenerateProtocolChecksum_TCPLessOffset_OutgoingPacket
1245 * To validate usGenerateProtocolChecksum returns ipINVALID_LENGTH if
1246 * offset in TCP header is less than minimum requirement.
1247 */
test_usGenerateProtocolChecksum_TCPLessOffset_OutgoingPacket(void)1248 void test_usGenerateProtocolChecksum_TCPLessOffset_OutgoingPacket( void )
1249 {
1250 uint16_t usReturn;
1251 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1252 BaseType_t xOutgoingPacket = pdTRUE;
1253 uint8_t ucVersionHeaderLength = 20;
1254 IPPacket_t * pxIPPacket;
1255 uint16_t usLength = 100;
1256 size_t uxBufferLength = usLength + ipSIZE_OF_ETH_HEADER;
1257 ProtocolPacket_t * pxProtPack;
1258
1259 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
1260
1261 pxProtPack = ( ProtocolPacket_t * ) &( pucEthernetBuffer[ ucVersionHeaderLength - ipSIZE_OF_IPv4_HEADER ] );
1262
1263 pxIPPacket = ( IPPacket_t * ) pucEthernetBuffer;
1264 pxIPPacket->xIPHeader.ucVersionHeaderLength = ( ucVersionHeaderLength >> 2 );
1265 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
1266 pxIPPacket->xIPHeader.usLength = FreeRTOS_htons( usLength );
1267
1268 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_TCP;
1269
1270 pxProtPack->xTCPPacket.xTCPHeader.ucTCPOffset = 0x40;
1271 pxProtPack->xTCPPacket.xTCPHeader.usChecksum = 0x0000;
1272
1273 prvChecksumIPv4Checks_Stub( prvChecksumIPv4Checks_Valid );
1274
1275 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
1276
1277 TEST_ASSERT_EQUAL( ipINVALID_LENGTH, usReturn );
1278 }
1279
1280 /**
1281 * @brief test_usGenerateProtocolChecksum_TCPLessBufferSize
1282 * To validate usGenerateProtocolChecksum returns ipINVALID_LENGTH if
1283 * buffer size is less than TCP minimum requirement.
1284 */
test_usGenerateProtocolChecksum_TCPLessBufferSize(void)1285 void test_usGenerateProtocolChecksum_TCPLessBufferSize( void )
1286 {
1287 uint16_t usReturn;
1288 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1289 BaseType_t xOutgoingPacket = pdTRUE;
1290 uint8_t ucVersionHeaderLength = 20;
1291 IPPacket_t * pxIPPacket;
1292 uint16_t usLength = ucVersionHeaderLength + ipSIZE_OF_TCP_HEADER - 1;
1293 size_t uxBufferLength = ucVersionHeaderLength + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_TCP_HEADER - 1;
1294 ProtocolPacket_t * pxProtPack;
1295
1296 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
1297
1298 pxProtPack = ( ProtocolPacket_t * ) &( pucEthernetBuffer[ ucVersionHeaderLength - ipSIZE_OF_IPv4_HEADER ] );
1299
1300 pxIPPacket = ( IPPacket_t * ) pucEthernetBuffer;
1301 pxIPPacket->xIPHeader.ucVersionHeaderLength = ( ucVersionHeaderLength >> 2 );
1302 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
1303 pxIPPacket->xIPHeader.usLength = FreeRTOS_htons( usLength );
1304
1305 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_TCP;
1306
1307 pxProtPack->xTCPPacket.xTCPHeader.ucTCPOffset = 0x50;
1308 pxProtPack->xTCPPacket.xTCPHeader.usChecksum = 0x0000;
1309
1310 prvChecksumIPv4Checks_Stub( prvChecksumIPv4Checks_Valid );
1311
1312 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
1313
1314 TEST_ASSERT_EQUAL( ipINVALID_LENGTH, usReturn );
1315 }
1316
1317 /**
1318 * @brief test_usGenerateProtocolChecksum_TCPLessHeaderLength
1319 * To validate usGenerateProtocolChecksum returns ipINVALID_LENGTH if
1320 * length in IP header is less than TCP minimum requirement.
1321 */
test_usGenerateProtocolChecksum_TCPLessHeaderLength(void)1322 void test_usGenerateProtocolChecksum_TCPLessHeaderLength( void )
1323 {
1324 uint16_t usReturn;
1325 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1326 BaseType_t xOutgoingPacket = pdTRUE;
1327 uint8_t ucVersionHeaderLength = 20;
1328 IPPacket_t * pxIPPacket;
1329 uint16_t usLength = ucVersionHeaderLength;
1330 size_t uxBufferLength = ucVersionHeaderLength + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_TCP_HEADER;
1331 ProtocolPacket_t * pxProtPack;
1332
1333 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
1334
1335 pxProtPack = ( ProtocolPacket_t * ) &( pucEthernetBuffer[ ucVersionHeaderLength - ipSIZE_OF_IPv4_HEADER ] );
1336
1337 pxIPPacket = ( IPPacket_t * ) pucEthernetBuffer;
1338 pxIPPacket->xIPHeader.ucVersionHeaderLength = ( ucVersionHeaderLength >> 2 );
1339 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
1340 pxIPPacket->xIPHeader.usLength = FreeRTOS_htons( usLength );
1341
1342 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_TCP;
1343
1344 pxProtPack->xTCPPacket.xTCPHeader.ucTCPOffset = 0x50;
1345 pxProtPack->xTCPPacket.xTCPHeader.usChecksum = 0x0000;
1346
1347 prvChecksumIPv4Checks_Stub( prvChecksumIPv4Checks_Valid );
1348
1349 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
1350
1351 TEST_ASSERT_EQUAL( ipINVALID_LENGTH, usReturn );
1352 }
1353
1354 /**
1355 * @brief test_usGenerateProtocolChecksum_TCPLargeBufferSize
1356 * To validate usGenerateProtocolChecksum returns ipINVALID_LENGTH if
1357 * buffer size is larger than MTU.
1358 */
test_usGenerateProtocolChecksum_TCPLargeBufferSize(void)1359 void test_usGenerateProtocolChecksum_TCPLargeBufferSize( void )
1360 {
1361 uint16_t usReturn;
1362 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1363 BaseType_t xOutgoingPacket = pdTRUE;
1364 uint8_t ucVersionHeaderLength = 20;
1365 IPPacket_t * pxIPPacket;
1366 uint16_t usLength = ipconfigNETWORK_MTU * 2;
1367 size_t uxBufferLength = ipSIZE_OF_ETH_HEADER + usLength;
1368 ProtocolPacket_t * pxProtPack;
1369
1370 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
1371
1372 pxProtPack = ( ProtocolPacket_t * ) &( pucEthernetBuffer[ ucVersionHeaderLength - ipSIZE_OF_IPv4_HEADER ] );
1373
1374 pxIPPacket = ( IPPacket_t * ) pucEthernetBuffer;
1375 pxIPPacket->xIPHeader.ucVersionHeaderLength = ( ucVersionHeaderLength >> 2 );
1376 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
1377 pxIPPacket->xIPHeader.usLength = FreeRTOS_htons( usLength );
1378
1379 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_TCP;
1380
1381 pxProtPack->xTCPPacket.xTCPHeader.ucTCPOffset = 0x50;
1382 pxProtPack->xTCPPacket.xTCPHeader.usChecksum = 0x0000;
1383
1384 prvChecksumIPv4Checks_Stub( prvChecksumIPv4Checks_Valid );
1385
1386 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
1387
1388 TEST_ASSERT_EQUAL( ipINVALID_LENGTH, usReturn );
1389 }
1390
1391 /**
1392 * @brief test_usGenerateProtocolChecksum_ICMPLargeBufferSize
1393 * To validate usGenerateProtocolChecksum returns ipINVALID_LENGTH if
1394 * buffer size is larger than MTU.
1395 */
test_usGenerateProtocolChecksum_ICMPLargeBufferSize(void)1396 void test_usGenerateProtocolChecksum_ICMPLargeBufferSize( void )
1397 {
1398 uint16_t usReturn;
1399 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1400 BaseType_t xOutgoingPacket = pdTRUE;
1401 uint8_t ucVersionHeaderLength = 20;
1402 IPPacket_t * pxIPPacket;
1403 uint16_t usLength = ipconfigNETWORK_MTU * 2;
1404 size_t uxBufferLength = ipSIZE_OF_ETH_HEADER + usLength;
1405 ProtocolPacket_t * pxProtPack;
1406
1407 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
1408
1409 pxProtPack = ( ProtocolPacket_t * ) &( pucEthernetBuffer[ ucVersionHeaderLength - ipSIZE_OF_IPv4_HEADER ] );
1410
1411 pxIPPacket = ( IPPacket_t * ) pucEthernetBuffer;
1412 pxIPPacket->xIPHeader.ucVersionHeaderLength = ( ucVersionHeaderLength >> 2 );
1413 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
1414 pxIPPacket->xIPHeader.usLength = FreeRTOS_htons( usLength );
1415
1416 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_ICMP;
1417
1418 pxProtPack->xICMPPacket.xICMPHeader.usChecksum = 0x0000;
1419
1420 prvChecksumIPv4Checks_Stub( prvChecksumIPv4Checks_Valid );
1421
1422 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
1423
1424 TEST_ASSERT_EQUAL( ipINVALID_LENGTH, usReturn );
1425 }
1426
1427 /**
1428 * @brief test_usGenerateProtocolChecksum_ICMPLessBufferSize
1429 * To validate usGenerateProtocolChecksum returns ipINVALID_LENGTH if
1430 * buffer size is less than ICMP minimum requirement.
1431 */
test_usGenerateProtocolChecksum_ICMPLessBufferSize(void)1432 void test_usGenerateProtocolChecksum_ICMPLessBufferSize( void )
1433 {
1434 uint16_t usReturn;
1435 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1436 BaseType_t xOutgoingPacket = pdTRUE;
1437 uint8_t ucVersionHeaderLength = 20;
1438 IPPacket_t * pxIPPacket;
1439 uint16_t usLength = ucVersionHeaderLength + ipSIZE_OF_ICMPv4_HEADER;
1440 size_t uxBufferLength = ucVersionHeaderLength + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_ICMPv4_HEADER - 1;
1441 ProtocolPacket_t * pxProtPack;
1442
1443 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
1444
1445 pxProtPack = ( ProtocolPacket_t * ) &( pucEthernetBuffer[ ucVersionHeaderLength - ipSIZE_OF_IPv4_HEADER ] );
1446
1447 pxIPPacket = ( IPPacket_t * ) pucEthernetBuffer;
1448 pxIPPacket->xIPHeader.ucVersionHeaderLength = ( ucVersionHeaderLength >> 2 );
1449 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
1450 pxIPPacket->xIPHeader.usLength = FreeRTOS_htons( usLength );
1451
1452 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_ICMP;
1453
1454 pxProtPack->xICMPPacket.xICMPHeader.usChecksum = 0x0000;
1455
1456 prvChecksumIPv4Checks_Stub( prvChecksumIPv4Checks_Valid );
1457
1458 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
1459
1460 TEST_ASSERT_EQUAL( ipINVALID_LENGTH, usReturn );
1461 }
1462
1463 /**
1464 * @brief test_usGenerateProtocolChecksum_ICMPOutgoingChecksum
1465 * To validate usGenerateProtocolChecksum returns ipCORRECT_CRC when it
1466 * generates correct CRC in ICMP checksum.
1467 */
test_usGenerateProtocolChecksum_ICMPOutgoingChecksum(void)1468 void test_usGenerateProtocolChecksum_ICMPOutgoingChecksum( void )
1469 {
1470 uint16_t usReturn;
1471 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1472 BaseType_t xOutgoingPacket = pdTRUE;
1473 uint8_t ucVersionHeaderLength = 20;
1474 IPPacket_t * pxIPPacket;
1475 uint16_t usLength = 100;
1476 size_t uxBufferLength = usLength + ipSIZE_OF_ETH_HEADER;
1477 ProtocolPacket_t * pxProtPack;
1478
1479 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
1480
1481 pxProtPack = ( ProtocolPacket_t * ) &( pucEthernetBuffer[ ucVersionHeaderLength - ipSIZE_OF_IPv4_HEADER ] );
1482
1483 pxIPPacket = ( IPPacket_t * ) pucEthernetBuffer;
1484 pxIPPacket->xIPHeader.ucVersionHeaderLength = ( ucVersionHeaderLength >> 2 );
1485 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
1486 pxIPPacket->xIPHeader.usLength = FreeRTOS_htons( usLength );
1487
1488 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_ICMP;
1489
1490 pxProtPack->xICMPPacket.xICMPHeader.usChecksum = 0x0000;
1491
1492 prvChecksumIPv4Checks_Stub( prvChecksumIPv4Checks_Valid );
1493
1494 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
1495
1496 TEST_ASSERT_EQUAL( ipCORRECT_CRC, usReturn );
1497 TEST_ASSERT_EQUAL( 65535, pxProtPack->xICMPPacket.xICMPHeader.usChecksum );
1498 }
1499
1500 /**
1501 * @brief test_usGenerateProtocolChecksum_ICMPIncomingIncorrectCRC
1502 * To validate usGenerateProtocolChecksum returns ipWRONG_CRC if
1503 * checksum in ICMP header is incorrect.
1504 */
test_usGenerateProtocolChecksum_ICMPIncomingIncorrectCRC(void)1505 void test_usGenerateProtocolChecksum_ICMPIncomingIncorrectCRC( void )
1506 {
1507 uint16_t usReturn;
1508 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1509 BaseType_t xOutgoingPacket = pdFALSE;
1510 uint8_t ucVersionHeaderLength = 20;
1511 IPPacket_t * pxIPPacket;
1512 uint16_t usLength = 100;
1513 size_t uxBufferLength = usLength + ipSIZE_OF_ETH_HEADER;
1514 ProtocolPacket_t * pxProtPack;
1515
1516 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
1517
1518 pxProtPack = ( ProtocolPacket_t * ) &( pucEthernetBuffer[ ucVersionHeaderLength - ipSIZE_OF_IPv4_HEADER ] );
1519
1520 pxIPPacket = ( IPPacket_t * ) pucEthernetBuffer;
1521 pxIPPacket->xIPHeader.ucVersionHeaderLength = ( ucVersionHeaderLength >> 2 );
1522 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
1523 pxIPPacket->xIPHeader.usLength = FreeRTOS_htons( usLength );
1524
1525 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_ICMP;
1526
1527 pxProtPack->xICMPPacket.xICMPHeader.usChecksum = 0x0000;
1528
1529 prvChecksumIPv4Checks_Stub( prvChecksumIPv4Checks_Valid );
1530
1531 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
1532
1533 TEST_ASSERT_EQUAL( ipWRONG_CRC, usReturn );
1534 TEST_ASSERT_EQUAL( 0, pxProtPack->xICMPPacket.xICMPHeader.usChecksum );
1535 }
1536
1537 /**
1538 * @brief test_usGenerateProtocolChecksum_ICMPIncomingCorrectCRC
1539 * To validate usGenerateProtocolChecksum returns ipCORRECT_CRC if
1540 * checksum in ICMP header is correct.
1541 */
test_usGenerateProtocolChecksum_ICMPIncomingCorrectCRC(void)1542 void test_usGenerateProtocolChecksum_ICMPIncomingCorrectCRC( void )
1543 {
1544 uint16_t usReturn;
1545 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1546 BaseType_t xOutgoingPacket = pdFALSE;
1547 uint8_t ucVersionHeaderLength = 20;
1548 IPPacket_t * pxIPPacket;
1549 uint16_t usLength = 100;
1550 size_t uxBufferLength = usLength + ipSIZE_OF_ETH_HEADER;
1551 ProtocolPacket_t * pxProtPack;
1552
1553 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
1554
1555 pxProtPack = ( ProtocolPacket_t * ) &( pucEthernetBuffer[ ucVersionHeaderLength - ipSIZE_OF_IPv4_HEADER ] );
1556
1557 pxIPPacket = ( IPPacket_t * ) pucEthernetBuffer;
1558 pxIPPacket->xIPHeader.ucVersionHeaderLength = ( ucVersionHeaderLength >> 2 );
1559 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
1560 pxIPPacket->xIPHeader.usLength = FreeRTOS_htons( usLength );
1561
1562 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_ICMP;
1563
1564 /* Fill in the checksum. */
1565 pxProtPack->xICMPPacket.xICMPHeader.usChecksum = FreeRTOS_htons( 0xFFFF );
1566
1567 prvChecksumIPv4Checks_Stub( prvChecksumIPv4Checks_Valid );
1568
1569 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
1570
1571 TEST_ASSERT_EQUAL( ipCORRECT_CRC, usReturn );
1572 }
1573
1574 /**
1575 * @brief test_usGenerateProtocolChecksum_IGMPLargeBufferSize
1576 * To validate usGenerateProtocolChecksum returns ipINVALID_LENGTH if
1577 * buffer size is larger than MTU.
1578 */
test_usGenerateProtocolChecksum_IGMPLargeBufferSize(void)1579 void test_usGenerateProtocolChecksum_IGMPLargeBufferSize( void )
1580 {
1581 uint16_t usReturn;
1582 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1583 BaseType_t xOutgoingPacket = pdTRUE;
1584 uint8_t ucVersionHeaderLength = 20;
1585 IPPacket_t * pxIPPacket;
1586 uint16_t usLength = ipconfigNETWORK_MTU * 2;
1587 size_t uxBufferLength = ipSIZE_OF_ETH_HEADER + usLength;
1588 ProtocolPacket_t * pxProtPack;
1589
1590 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
1591
1592 pxProtPack = ( ProtocolPacket_t * ) &( pucEthernetBuffer[ ucVersionHeaderLength - ipSIZE_OF_IPv4_HEADER ] );
1593
1594 pxIPPacket = ( IPPacket_t * ) pucEthernetBuffer;
1595 pxIPPacket->xIPHeader.ucVersionHeaderLength = ( ucVersionHeaderLength >> 2 );
1596 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
1597 pxIPPacket->xIPHeader.usLength = FreeRTOS_htons( usLength );
1598
1599 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_IGMP;
1600
1601 prvChecksumIPv4Checks_Stub( prvChecksumIPv4Checks_Valid );
1602
1603 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
1604
1605 TEST_ASSERT_EQUAL( ipINVALID_LENGTH, usReturn );
1606 }
1607
1608 /**
1609 * @brief test_usGenerateProtocolChecksum_IGMPLessBufferSize
1610 * To validate usGenerateProtocolChecksum returns ipINVALID_LENGTH if
1611 * buffer size is less than IGMP minimum requirement.
1612 */
test_usGenerateProtocolChecksum_IGMPLessBufferSize(void)1613 void test_usGenerateProtocolChecksum_IGMPLessBufferSize( void )
1614 {
1615 uint16_t usReturn;
1616 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1617 BaseType_t xOutgoingPacket = pdTRUE;
1618 uint8_t ucVersionHeaderLength = 20;
1619 IPPacket_t * pxIPPacket;
1620 uint16_t usLength = ucVersionHeaderLength;
1621 size_t uxBufferLength = ucVersionHeaderLength + ipSIZE_OF_ETH_HEADER + ipSIZE_OF_ICMPv4_HEADER - 1;
1622 ProtocolPacket_t * pxProtPack;
1623
1624 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
1625
1626 pxProtPack = ( ProtocolPacket_t * ) &( pucEthernetBuffer[ ucVersionHeaderLength - ipSIZE_OF_IPv4_HEADER ] );
1627
1628 pxIPPacket = ( IPPacket_t * ) pucEthernetBuffer;
1629 pxIPPacket->xIPHeader.ucVersionHeaderLength = ( ucVersionHeaderLength >> 2 );
1630 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
1631 pxIPPacket->xIPHeader.usLength = FreeRTOS_htons( usLength );
1632
1633 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_IGMP;
1634
1635 prvChecksumIPv4Checks_Stub( prvChecksumIPv4Checks_Valid );
1636
1637 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
1638
1639 TEST_ASSERT_EQUAL( ipINVALID_LENGTH, usReturn );
1640 }
1641
1642 /**
1643 * @brief test_usGenerateProtocolChecksum_IGMPOutgoingChecksum
1644 * To validate usGenerateProtocolChecksum returns ipINVALID_LENGTH if
1645 * buffer size is less than IGMP minimum requirement.
1646 */
test_usGenerateProtocolChecksum_IGMPOutgoingChecksum(void)1647 void test_usGenerateProtocolChecksum_IGMPOutgoingChecksum( void )
1648 {
1649 uint16_t usReturn;
1650 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1651 BaseType_t xOutgoingPacket = pdTRUE;
1652 uint8_t ucVersionHeaderLength = 20;
1653 IPPacket_t * pxIPPacket;
1654 uint16_t usLength = 100;
1655 size_t uxBufferLength = usLength + ipSIZE_OF_ETH_HEADER;
1656 ProtocolPacket_t * pxProtPack;
1657
1658 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
1659
1660 pxProtPack = ( ProtocolPacket_t * ) &( pucEthernetBuffer[ ucVersionHeaderLength - ipSIZE_OF_IPv4_HEADER ] );
1661
1662 pxIPPacket = ( IPPacket_t * ) pucEthernetBuffer;
1663 pxIPPacket->xIPHeader.ucVersionHeaderLength = ( ucVersionHeaderLength >> 2 );
1664 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
1665 pxIPPacket->xIPHeader.usLength = FreeRTOS_htons( usLength );
1666
1667 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_IGMP;
1668
1669 prvChecksumIPv4Checks_Stub( prvChecksumIPv4Checks_Valid );
1670
1671 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
1672
1673 TEST_ASSERT_EQUAL( ipCORRECT_CRC, usReturn );
1674 TEST_ASSERT_EQUAL( 65535, pxProtPack->xICMPPacket.xICMPHeader.usChecksum );
1675 }
1676
1677 /**
1678 * @brief test_usGenerateProtocolChecksum_IGMPIncomingIncorrectCRC
1679 * To validate usGenerateProtocolChecksum returns ipWRONG_CRC if
1680 * checksum in IGMP header is incorrect.
1681 */
test_usGenerateProtocolChecksum_IGMPIncomingIncorrectCRC(void)1682 void test_usGenerateProtocolChecksum_IGMPIncomingIncorrectCRC( void )
1683 {
1684 uint16_t usReturn;
1685 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1686 BaseType_t xOutgoingPacket = pdFALSE;
1687 uint8_t ucVersionHeaderLength = 20;
1688 IPPacket_t * pxIPPacket;
1689 uint16_t usLength = 100;
1690 size_t uxBufferLength = usLength + ipSIZE_OF_ETH_HEADER;
1691 ProtocolPacket_t * pxProtPack;
1692
1693 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
1694
1695 pxProtPack = ( ProtocolPacket_t * ) &( pucEthernetBuffer[ ucVersionHeaderLength - ipSIZE_OF_IPv4_HEADER ] );
1696
1697 pxIPPacket = ( IPPacket_t * ) pucEthernetBuffer;
1698 pxIPPacket->xIPHeader.ucVersionHeaderLength = ( ucVersionHeaderLength >> 2 );
1699 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
1700 pxIPPacket->xIPHeader.usLength = FreeRTOS_htons( usLength );
1701
1702 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_IGMP;
1703 pxProtPack->xICMPPacket.xICMPHeader.usChecksum = 0U;
1704
1705 prvChecksumIPv4Checks_Stub( prvChecksumIPv4Checks_Valid );
1706
1707 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
1708
1709 TEST_ASSERT_EQUAL( ipWRONG_CRC, usReturn );
1710 TEST_ASSERT_EQUAL( 0, pxProtPack->xICMPPacket.xICMPHeader.usChecksum );
1711 }
1712
1713 /**
1714 * @brief test_usGenerateProtocolChecksum_IGMPIncomingCorrectCRC
1715 * To validate usGenerateProtocolChecksum returns ipCORRECT_CRC if
1716 * checksum in IGMP header is correct.
1717 */
test_usGenerateProtocolChecksum_IGMPIncomingCorrectCRC(void)1718 void test_usGenerateProtocolChecksum_IGMPIncomingCorrectCRC( void )
1719 {
1720 uint16_t usReturn;
1721 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1722 BaseType_t xOutgoingPacket = pdFALSE;
1723 uint8_t ucVersionHeaderLength = 20;
1724 IPPacket_t * pxIPPacket;
1725 uint16_t usLength = 100;
1726 size_t uxBufferLength = usLength + ipSIZE_OF_ETH_HEADER;
1727 ProtocolPacket_t * pxProtPack;
1728
1729 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
1730
1731 pxProtPack = ( ProtocolPacket_t * ) &( pucEthernetBuffer[ ucVersionHeaderLength - ipSIZE_OF_IPv4_HEADER ] );
1732
1733 pxIPPacket = ( IPPacket_t * ) pucEthernetBuffer;
1734 pxIPPacket->xIPHeader.ucVersionHeaderLength = ( ucVersionHeaderLength >> 2 );
1735 pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
1736 pxIPPacket->xIPHeader.usLength = FreeRTOS_htons( usLength );
1737
1738 pxIPPacket->xIPHeader.ucProtocol = ipPROTOCOL_IGMP;
1739
1740 /* Fill in the checksum. */
1741 pxProtPack->xICMPPacket.xICMPHeader.usChecksum = FreeRTOS_htons( 0xFFFF );
1742
1743 prvChecksumIPv4Checks_Stub( prvChecksumIPv4Checks_Valid );
1744
1745 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
1746
1747 TEST_ASSERT_EQUAL( ipCORRECT_CRC, usReturn );
1748 }
1749
1750 /**
1751 * @brief test_usGenerateProtocolChecksum_UnknownEthernetType
1752 * To validate usGenerateProtocolChecksum triggers assertion when frame type in
1753 * ethernet header is unknown.
1754 */
test_usGenerateProtocolChecksum_UnknownEthernetType(void)1755 void test_usGenerateProtocolChecksum_UnknownEthernetType( void )
1756 {
1757 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1758 BaseType_t xOutgoingPacket = pdFALSE;
1759 IPPacket_t * pxIPPacket;
1760 ProtocolPacket_t * pxProtPack;
1761
1762 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
1763
1764 pxProtPack = ( ProtocolPacket_t * ) pucEthernetBuffer;
1765
1766 pxIPPacket = ( IPPacket_t * ) pucEthernetBuffer;
1767 pxIPPacket->xEthernetHeader.usFrameType = 0xFF;
1768
1769 catch_assert( usGenerateProtocolChecksum( pucEthernetBuffer, ipconfigTCP_MSS, xOutgoingPacket ) );
1770 }
1771
1772 /**
1773 * @brief test_usGenerateProtocolChecksum_ICMPv6IncomingCorrectCRC
1774 * To validate usGenerateProtocolChecksum returns ipCORRECT_CRC if
1775 * checksum in ICMPv6 header is correct.
1776 */
test_usGenerateProtocolChecksum_ICMPv6IncomingCorrectCRC(void)1777 void test_usGenerateProtocolChecksum_ICMPv6IncomingCorrectCRC( void )
1778 {
1779 uint16_t usReturn;
1780 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1781 BaseType_t xOutgoingPacket = pdFALSE;
1782 IPPacket_IPv6_t * pxIPPacket;
1783 ICMPPacket_IPv6_t * pxICMPv6Packet;
1784 uint16_t usLength = 100;
1785 size_t uxBufferLength = usLength + ipSIZE_OF_ETH_HEADER;
1786
1787 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
1788
1789 pxICMPv6Packet = ( ICMPPacket_IPv6_t * ) pucEthernetBuffer;
1790
1791 pxIPPacket = ( IPPacket_IPv6_t * ) pucEthernetBuffer;
1792 pxIPPacket->xEthernetHeader.usFrameType = ipIPv6_FRAME_TYPE;
1793
1794 pxIPPacket->xIPHeader.usPayloadLength = FreeRTOS_htons( usLength - ipSIZE_OF_IPv6_HEADER );
1795 pxIPPacket->xIPHeader.ucNextHeader = ipPROTOCOL_ICMP_IPv6;
1796 pxICMPv6Packet->xICMPHeaderIPv6.usChecksum = 0x89FF;
1797
1798 prvChecksumIPv6Checks_Stub( prvChecksumIPv6Checks_Valid );
1799 prvChecksumICMPv6Checks_Stub( prvChecksumICMPv6Checks_Valid );
1800
1801 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
1802
1803 TEST_ASSERT_EQUAL( ipCORRECT_CRC, usReturn );
1804 }
1805
1806 /**
1807 * @brief test_usGenerateProtocolChecksum_ICMPv6IncomingIncorrectCRC
1808 * To validate usGenerateProtocolChecksum returns ipWRONG_CRC if
1809 * checksum in ICMPv6 header is incorrect.
1810 */
test_usGenerateProtocolChecksum_ICMPv6IncomingIncorrectCRC(void)1811 void test_usGenerateProtocolChecksum_ICMPv6IncomingIncorrectCRC( void )
1812 {
1813 uint16_t usReturn;
1814 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1815 BaseType_t xOutgoingPacket = pdFALSE;
1816 IPPacket_IPv6_t * pxIPPacket;
1817 ICMPPacket_IPv6_t * pxICMPv6Packet;
1818 uint16_t usLength = 100;
1819 size_t uxBufferLength = usLength + ipSIZE_OF_ETH_HEADER;
1820
1821 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
1822
1823 pxICMPv6Packet = ( ICMPPacket_IPv6_t * ) pucEthernetBuffer;
1824
1825 pxIPPacket = ( IPPacket_IPv6_t * ) pucEthernetBuffer;
1826 pxIPPacket->xEthernetHeader.usFrameType = ipIPv6_FRAME_TYPE;
1827
1828 pxIPPacket->xIPHeader.usPayloadLength = FreeRTOS_htons( usLength - ipSIZE_OF_IPv6_HEADER );
1829 pxIPPacket->xIPHeader.ucNextHeader = ipPROTOCOL_ICMP_IPv6;
1830 pxICMPv6Packet->xICMPHeaderIPv6.usChecksum = 0;
1831
1832 prvChecksumIPv6Checks_Stub( prvChecksumIPv6Checks_Valid );
1833 prvChecksumICMPv6Checks_Stub( prvChecksumICMPv6Checks_Valid );
1834
1835 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
1836
1837 TEST_ASSERT_EQUAL( ipWRONG_CRC, usReturn );
1838 TEST_ASSERT_EQUAL( 0, pxICMPv6Packet->xICMPHeaderIPv6.usChecksum );
1839 }
1840
1841 /**
1842 * @brief test_usGenerateProtocolChecksum_UDPv6IncomingCorrectCRC
1843 * To validate usGenerateProtocolChecksum returns ipCORRECT_CRC if
1844 * checksum in UDPv6 header is correct.
1845 */
test_usGenerateProtocolChecksum_UDPv6IncomingCorrectCRC(void)1846 void test_usGenerateProtocolChecksum_UDPv6IncomingCorrectCRC( void )
1847 {
1848 uint16_t usReturn;
1849 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1850 BaseType_t xOutgoingPacket = pdFALSE;
1851 IPPacket_IPv6_t * pxIPPacket;
1852 UDPPacket_IPv6_t * pxUDPv6Packet;
1853 uint16_t usLength = 100;
1854 size_t uxBufferLength = usLength + ipSIZE_OF_ETH_HEADER;
1855
1856 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
1857
1858 pxUDPv6Packet = ( UDPPacket_IPv6_t * ) pucEthernetBuffer;
1859
1860 pxIPPacket = ( IPPacket_IPv6_t * ) pucEthernetBuffer;
1861 pxIPPacket->xEthernetHeader.usFrameType = ipIPv6_FRAME_TYPE;
1862
1863 pxIPPacket->xIPHeader.usPayloadLength = FreeRTOS_htons( usLength - ipSIZE_OF_IPv6_HEADER );
1864 pxIPPacket->xIPHeader.ucNextHeader = ipPROTOCOL_UDP;
1865 pxUDPv6Packet->xUDPHeader.usChecksum = 0xB2FF;
1866
1867 prvChecksumIPv6Checks_Stub( prvChecksumIPv6Checks_Valid );
1868
1869 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
1870
1871 TEST_ASSERT_EQUAL( ipCORRECT_CRC, usReturn );
1872 }
1873
1874 /**
1875 * @brief test_usGenerateProtocolChecksum_UDPv6IncomingIncorrectCRC
1876 * To validate usGenerateProtocolChecksum returns ipWRONG_CRC if
1877 * checksum in UDPv6 header is incorrect.
1878 */
test_usGenerateProtocolChecksum_UDPv6IncomingIncorrectCRC(void)1879 void test_usGenerateProtocolChecksum_UDPv6IncomingIncorrectCRC( void )
1880 {
1881 uint16_t usReturn;
1882 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1883 BaseType_t xOutgoingPacket = pdFALSE;
1884 IPPacket_IPv6_t * pxIPPacket;
1885 UDPPacket_IPv6_t * pxUDPv6Packet;
1886 uint16_t usLength = 100;
1887 size_t uxBufferLength = usLength + ipSIZE_OF_ETH_HEADER;
1888
1889 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
1890
1891 pxUDPv6Packet = ( UDPPacket_IPv6_t * ) pucEthernetBuffer;
1892
1893 pxIPPacket = ( IPPacket_IPv6_t * ) pucEthernetBuffer;
1894 pxIPPacket->xEthernetHeader.usFrameType = ipIPv6_FRAME_TYPE;
1895
1896 pxIPPacket->xIPHeader.usPayloadLength = FreeRTOS_htons( usLength - ipSIZE_OF_IPv6_HEADER );
1897 pxIPPacket->xIPHeader.ucNextHeader = ipPROTOCOL_UDP;
1898 pxUDPv6Packet->xUDPHeader.usChecksum = 0x1111;
1899
1900 prvChecksumIPv6Checks_Stub( prvChecksumIPv6Checks_Valid );
1901
1902 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
1903
1904 TEST_ASSERT_EQUAL( ipWRONG_CRC, usReturn );
1905 TEST_ASSERT_EQUAL( 0x1111, pxUDPv6Packet->xUDPHeader.usChecksum );
1906 }
1907
1908 /**
1909 * @brief test_usGenerateProtocolChecksum_TCPv6IncomingCorrectCRC
1910 * To validate usGenerateProtocolChecksum returns ipCORRECT_CRC if
1911 * checksum in TCPv6 header is correct.
1912 */
test_usGenerateProtocolChecksum_TCPv6IncomingCorrectCRC(void)1913 void test_usGenerateProtocolChecksum_TCPv6IncomingCorrectCRC( void )
1914 {
1915 uint16_t usReturn;
1916 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1917 BaseType_t xOutgoingPacket = pdFALSE;
1918 IPPacket_IPv6_t * pxIPPacket;
1919 TCPPacket_IPv6_t * pxTCPv6Packet;
1920 uint16_t usLength = 100;
1921 size_t uxBufferLength = usLength + ipSIZE_OF_ETH_HEADER;
1922
1923 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
1924
1925 pxTCPv6Packet = ( TCPPacket_IPv6_t * ) pucEthernetBuffer;
1926
1927 pxIPPacket = ( IPPacket_IPv6_t * ) pucEthernetBuffer;
1928 pxIPPacket->xEthernetHeader.usFrameType = ipIPv6_FRAME_TYPE;
1929
1930 pxIPPacket->xIPHeader.usPayloadLength = FreeRTOS_htons( usLength - ipSIZE_OF_IPv6_HEADER );
1931 pxIPPacket->xIPHeader.ucNextHeader = ipPROTOCOL_TCP;
1932 pxTCPv6Packet->xTCPHeader.ucTCPOffset = 0x50;
1933 pxTCPv6Packet->xTCPHeader.usChecksum = 0xBDAF;
1934
1935 prvChecksumIPv6Checks_Stub( prvChecksumIPv6Checks_Valid );
1936
1937 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
1938
1939 TEST_ASSERT_EQUAL( ipCORRECT_CRC, usReturn );
1940 }
1941
1942 /**
1943 * @brief test_usGenerateProtocolChecksum_TCPv6IncomingIncorrectCRC
1944 * To validate usGenerateProtocolChecksum returns ipWRONG_CRC if
1945 * checksum in UDPv6 header is incorrect.
1946 */
test_usGenerateProtocolChecksum_TCPv6IncomingIncorrectCRC(void)1947 void test_usGenerateProtocolChecksum_TCPv6IncomingIncorrectCRC( void )
1948 {
1949 uint16_t usReturn;
1950 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1951 BaseType_t xOutgoingPacket = pdFALSE;
1952 IPPacket_IPv6_t * pxIPPacket;
1953 TCPPacket_IPv6_t * pxTCPv6Packet;
1954 uint16_t usLength = 100;
1955 size_t uxBufferLength = usLength + ipSIZE_OF_ETH_HEADER;
1956
1957 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
1958
1959 pxTCPv6Packet = ( TCPPacket_IPv6_t * ) pucEthernetBuffer;
1960
1961 pxIPPacket = ( IPPacket_IPv6_t * ) pucEthernetBuffer;
1962 pxIPPacket->xEthernetHeader.usFrameType = ipIPv6_FRAME_TYPE;
1963
1964 pxIPPacket->xIPHeader.usPayloadLength = FreeRTOS_htons( usLength - ipSIZE_OF_IPv6_HEADER );
1965 pxIPPacket->xIPHeader.ucNextHeader = ipPROTOCOL_TCP;
1966 pxTCPv6Packet->xTCPHeader.ucTCPOffset = 0x50;
1967 pxTCPv6Packet->xTCPHeader.usChecksum = 0x1111;
1968
1969 prvChecksumIPv6Checks_Stub( prvChecksumIPv6Checks_Valid );
1970
1971 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
1972
1973 TEST_ASSERT_EQUAL( ipWRONG_CRC, usReturn );
1974 TEST_ASSERT_EQUAL( 0x1111, pxTCPv6Packet->xTCPHeader.usChecksum );
1975 }
1976
1977 /**
1978 * @brief test_usGenerateProtocolChecksum_TCPv6OutgoingCorrectCRC
1979 * To validate usGenerateProtocolChecksum returns ipCORRECT_CRC when it
1980 * generates correct CRC in TCP checksum.
1981 */
test_usGenerateProtocolChecksum_TCPv6OutgoingCorrectCRC(void)1982 void test_usGenerateProtocolChecksum_TCPv6OutgoingCorrectCRC( void )
1983 {
1984 uint16_t usReturn;
1985 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1986 BaseType_t xOutgoingPacket = pdTRUE;
1987 IPPacket_IPv6_t * pxIPPacket;
1988 TCPPacket_IPv6_t * pxTCPv6Packet;
1989 uint16_t usLength = 100;
1990 size_t uxBufferLength = usLength + ipSIZE_OF_ETH_HEADER;
1991
1992 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
1993
1994 pxTCPv6Packet = ( TCPPacket_IPv6_t * ) pucEthernetBuffer;
1995
1996 pxIPPacket = ( IPPacket_IPv6_t * ) pucEthernetBuffer;
1997 pxIPPacket->xEthernetHeader.usFrameType = ipIPv6_FRAME_TYPE;
1998
1999 pxIPPacket->xIPHeader.usPayloadLength = FreeRTOS_htons( usLength - ipSIZE_OF_IPv6_HEADER );
2000 pxIPPacket->xIPHeader.ucNextHeader = ipPROTOCOL_TCP;
2001 pxTCPv6Packet->xTCPHeader.ucTCPOffset = 0x50;
2002
2003 prvChecksumIPv6Checks_Stub( prvChecksumIPv6Checks_Valid );
2004
2005 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
2006
2007 TEST_ASSERT_EQUAL( ipCORRECT_CRC, usReturn );
2008 }
2009
2010 /**
2011 * @brief test_usGenerateProtocolChecksum_IPv6UnknownProtocol
2012 * To validate usGenerateProtocolChecksum returns ipUNHANDLED_PROTOCOL when
2013 * the protocol is unknown in IPv6 packet.
2014 */
test_usGenerateProtocolChecksum_IPv6UnknownProtocol(void)2015 void test_usGenerateProtocolChecksum_IPv6UnknownProtocol( void )
2016 {
2017 uint16_t usReturn;
2018 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
2019 BaseType_t xOutgoingPacket = pdFALSE;
2020 IPPacket_IPv6_t * pxIPPacket;
2021 TCPPacket_IPv6_t * pxTCPv6Packet;
2022 uint16_t usLength = 100;
2023 size_t uxBufferLength = usLength + ipSIZE_OF_ETH_HEADER;
2024
2025 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
2026
2027 pxTCPv6Packet = ( TCPPacket_IPv6_t * ) pucEthernetBuffer;
2028
2029 pxIPPacket = ( IPPacket_IPv6_t * ) pucEthernetBuffer;
2030 pxIPPacket->xEthernetHeader.usFrameType = ipIPv6_FRAME_TYPE;
2031
2032 pxIPPacket->xIPHeader.usPayloadLength = FreeRTOS_htons( usLength - ipSIZE_OF_IPv6_HEADER );
2033 pxIPPacket->xIPHeader.ucNextHeader = 0xFF;
2034
2035 prvChecksumIPv6Checks_Stub( prvChecksumIPv6Checks_Valid );
2036
2037 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
2038
2039 TEST_ASSERT_EQUAL( ipUNHANDLED_PROTOCOL, usReturn );
2040 }
2041
2042 /**
2043 * @brief test_usGenerateProtocolChecksum_ICMPv6LessHeaderLength
2044 * To validate usGenerateProtocolChecksum returns ipINVALID_LENGTH if
2045 * remaining bytes in packets is less than header size.
2046 */
test_usGenerateProtocolChecksum_ICMPv6LessHeaderLength(void)2047 void test_usGenerateProtocolChecksum_ICMPv6LessHeaderLength( void )
2048 {
2049 uint16_t usReturn;
2050 uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
2051 BaseType_t xOutgoingPacket = pdTRUE;
2052 IPPacket_IPv6_t * pxIPPacket;
2053 ICMPPacket_IPv6_t * pxICMPv6Packet;
2054 uint16_t usLength = 100;
2055 size_t uxBufferLength = usLength + ipSIZE_OF_ETH_HEADER;
2056
2057 memset( pucEthernetBuffer, 0, ipconfigTCP_MSS );
2058
2059 pxICMPv6Packet = ( ICMPPacket_IPv6_t * ) pucEthernetBuffer;
2060
2061 pxIPPacket = ( IPPacket_IPv6_t * ) pucEthernetBuffer;
2062 pxIPPacket->xEthernetHeader.usFrameType = ipIPv6_FRAME_TYPE;
2063
2064 pxIPPacket->xIPHeader.usPayloadLength = FreeRTOS_htons( usLength - ipSIZE_OF_IPv6_HEADER );
2065 pxIPPacket->xIPHeader.ucNextHeader = ipPROTOCOL_ICMP_IPv6;
2066 pxICMPv6Packet->xICMPHeaderIPv6.usChecksum = 0;
2067
2068 prvChecksumIPv6Checks_Stub( prvChecksumIPv6Checks_Valid );
2069 prvChecksumICMPv6Checks_Stub( prvChecksumICMPv6Checks_BigHeaderLength );
2070
2071 usReturn = usGenerateProtocolChecksum( pucEthernetBuffer, uxBufferLength, xOutgoingPacket );
2072
2073 TEST_ASSERT_EQUAL( ipINVALID_LENGTH, usReturn );
2074 }
2075
2076 /**
2077 * @brief test_usGenerateChecksum_UnallignedAccess
2078 * To toggle address that is not aligned in usGenerateChecksum.
2079 */
test_usGenerateChecksum_UnallignedAccess(void)2080 void test_usGenerateChecksum_UnallignedAccess( void )
2081 {
2082 uint16_t usResult;
2083 uint16_t usSum = 0;
2084 uint8_t pucNextData[ ipconfigTCP_MSS ];
2085 size_t uxByteCount = 10;
2086 size_t uxUnalligned = 0;
2087
2088 memset( pucNextData, 0xAB, ipconfigTCP_MSS );
2089
2090 for( uxUnalligned = 0; uxUnalligned < 4; uxUnalligned++ )
2091 {
2092 if( ( ( uintptr_t ) &pucNextData[ uxUnalligned ] ) & 0x01U )
2093 {
2094 break;
2095 }
2096 }
2097
2098 usResult = usGenerateChecksum( usSum, &pucNextData[ uxUnalligned ], uxByteCount );
2099
2100 TEST_ASSERT_EQUAL( 0x5A5A, usResult );
2101 }
2102
2103 /**
2104 * @brief test_usGenerateChecksum_OneByteToChecksum
2105 * To toggle address that is not aligned in usGenerateChecksum with one byte length.
2106 */
test_usGenerateChecksum_OneByteToChecksum(void)2107 void test_usGenerateChecksum_OneByteToChecksum( void )
2108 {
2109 uint16_t usResult;
2110 uint16_t usSum = 0;
2111 uint8_t pucNextData[ ipconfigTCP_MSS ];
2112 size_t uxByteCount = 1;
2113 size_t uxUnalligned = 0;
2114
2115 memset( pucNextData, 0xAB, ipconfigTCP_MSS );
2116
2117 for( uxUnalligned = 0; uxUnalligned < 4; uxUnalligned++ )
2118 {
2119 if( ( ( uintptr_t ) &pucNextData[ uxUnalligned ] ) & 0x01U )
2120 {
2121 break;
2122 }
2123 }
2124
2125 usResult = usGenerateChecksum( usSum, &pucNextData[ uxUnalligned ], uxByteCount );
2126
2127 TEST_ASSERT_EQUAL( 0xAB00, usResult );
2128 }
2129
2130 /**
2131 * @brief test_usGenerateChecksum_OneByteAllignedButZeroLength
2132 * To validate usGenerateChecksum with one byte align but zero length.
2133 */
test_usGenerateChecksum_OneByteAllignedButZeroLength(void)2134 void test_usGenerateChecksum_OneByteAllignedButZeroLength( void )
2135 {
2136 uint16_t usResult;
2137 uint16_t usSum = 0;
2138 uint8_t pucNextData[ ipconfigTCP_MSS ];
2139 size_t uxByteCount = 0;
2140 size_t uxUnalligned = 0;
2141
2142 memset( pucNextData, 0xAB, ipconfigTCP_MSS );
2143
2144 for( uxUnalligned = 0; uxUnalligned < 4; uxUnalligned++ )
2145 {
2146 if( ( ( uintptr_t ) &pucNextData[ uxUnalligned ] ) & 0x01U )
2147 {
2148 break;
2149 }
2150 }
2151
2152 usResult = usGenerateChecksum( usSum, &pucNextData[ uxUnalligned ], uxByteCount );
2153
2154 TEST_ASSERT_EQUAL( 0, usResult );
2155 }
2156
2157 /**
2158 * @brief test_usGenerateChecksum_TwoByteAlligned
2159 * To validate usGenerateChecksum with two byte align and 1 length.
2160 */
test_usGenerateChecksum_TwoByteAlligned(void)2161 void test_usGenerateChecksum_TwoByteAlligned( void )
2162 {
2163 uint16_t usResult;
2164 uint16_t usSum = 0;
2165 uint8_t pucNextData[ ipconfigTCP_MSS ];
2166 size_t uxByteCount = 1;
2167 size_t uxUnalligned = 0;
2168
2169 memset( pucNextData, 0xAB, ipconfigTCP_MSS );
2170
2171 for( uxUnalligned = 0; uxUnalligned < 4; uxUnalligned++ )
2172 {
2173 if( ( ( uintptr_t ) &pucNextData[ uxUnalligned ] ) & 0x02U )
2174 {
2175 break;
2176 }
2177 }
2178
2179 usResult = usGenerateChecksum( usSum, &pucNextData[ uxUnalligned ], uxByteCount );
2180
2181 TEST_ASSERT_EQUAL( 43776, usResult );
2182 }
2183
2184 /**
2185 * @brief test_usGenerateChecksum_TwoByteAllignedTwoLength
2186 * To validate usGenerateChecksum with two byte align and 2 length.
2187 */
test_usGenerateChecksum_TwoByteAllignedTwoLength(void)2188 void test_usGenerateChecksum_TwoByteAllignedTwoLength( void )
2189 {
2190 uint16_t usResult;
2191 uint16_t usSum = 0;
2192 uint8_t pucNextData[ ipconfigTCP_MSS ];
2193 size_t uxByteCount = 2;
2194 size_t uxUnalligned = 0;
2195
2196 memset( pucNextData, 0xAB, ipconfigTCP_MSS );
2197
2198 for( uxUnalligned = 0; uxUnalligned < 4; uxUnalligned++ )
2199 {
2200 if( ( ( uintptr_t ) &pucNextData[ uxUnalligned ] ) & 0x02U )
2201 {
2202 break;
2203 }
2204 }
2205
2206 usResult = usGenerateChecksum( usSum, &pucNextData[ uxUnalligned ], uxByteCount );
2207
2208 TEST_ASSERT_EQUAL( 43947, usResult );
2209 }
2210
2211 /**
2212 * @brief test_usGenerateChecksum_FourByteAlligned
2213 * To validate usGenerateChecksum with four byte align and 2 length.
2214 */
test_usGenerateChecksum_FourByteAlligned(void)2215 void test_usGenerateChecksum_FourByteAlligned( void )
2216 {
2217 uint16_t usResult;
2218 uint16_t usSum = 0;
2219 uint8_t pucNextData[ ipconfigTCP_MSS ];
2220 size_t uxByteCount = 2;
2221 size_t uxUnalligned = 0;
2222
2223 memset( pucNextData, 0xAB, ipconfigTCP_MSS );
2224
2225 for( uxUnalligned = 0; uxUnalligned < 4; uxUnalligned++ )
2226 {
2227 if( ( ( uintptr_t ) &pucNextData[ uxUnalligned ] ) & 0x04U )
2228 {
2229 break;
2230 }
2231 }
2232
2233 usResult = usGenerateChecksum( usSum, &pucNextData[ uxUnalligned ], uxByteCount );
2234
2235 TEST_ASSERT_EQUAL( 43947, usResult );
2236 }
2237
2238 /**
2239 * @brief test_usGenerateChecksum_FourByteAllignedSumOverflow
2240 * To validate usGenerateChecksum with four byte align and sum overflow.
2241 */
test_usGenerateChecksum_FourByteAllignedSumOverflow(void)2242 void test_usGenerateChecksum_FourByteAllignedSumOverflow( void )
2243 {
2244 uint16_t usResult;
2245 uint16_t usSum = FreeRTOS_htons( 0xFFFF - 0xAB );
2246 uint8_t pucNextData[ ipconfigTCP_MSS ];
2247 size_t uxByteCount = 20;
2248 size_t uxUnalligned = 0;
2249
2250 memset( pucNextData, 0xAB, ipconfigTCP_MSS );
2251
2252 for( uxUnalligned = 0; uxUnalligned < 4; uxUnalligned++ )
2253 {
2254 if( ( ( uintptr_t ) &pucNextData[ uxUnalligned ] ) & 0x04U )
2255 {
2256 break;
2257 }
2258 }
2259
2260 usResult = usGenerateChecksum( usSum, &pucNextData[ uxUnalligned ], uxByteCount );
2261
2262 TEST_ASSERT_EQUAL( 2484, usResult );
2263 }
2264
2265 /**
2266 * @brief test_usGenerateChecksum_FourByteAllignedSumOverflow2
2267 * To validate usGenerateChecksum with four byte align and sum overflow.
2268 */
test_usGenerateChecksum_FourByteAllignedSumOverflow2(void)2269 void test_usGenerateChecksum_FourByteAllignedSumOverflow2( void )
2270 {
2271 uint16_t usResult;
2272 uint16_t usSum = FreeRTOS_htons( 0xFFFF - 0xAB );
2273 uint8_t pucNextData[ ipconfigTCP_MSS ];
2274 size_t uxByteCount = 20;
2275 size_t uxUnalligned = 0;
2276
2277 memset( pucNextData, 0xFF, ipconfigTCP_MSS );
2278
2279 for( uxUnalligned = 0; uxUnalligned < 4; uxUnalligned++ )
2280 {
2281 if( ( ( uintptr_t ) &pucNextData[ uxUnalligned ] ) & 0x04U )
2282 {
2283 break;
2284 }
2285 }
2286
2287 usResult = usGenerateChecksum( usSum, &pucNextData[ uxUnalligned ], uxByteCount );
2288
2289 TEST_ASSERT_EQUAL( 21759, usResult );
2290 }
2291
2292 /**
2293 * @brief test_vPrintResourceStats_BufferCountMore
2294 * To validate vPrintResourceStats when minimum free network buffer
2295 * is greater than last record.
2296 */
test_vPrintResourceStats_BufferCountMore(void)2297 void test_vPrintResourceStats_BufferCountMore( void )
2298 {
2299 uxGetMinimumFreeNetworkBuffers_ExpectAndReturn( ipconfigNUM_NETWORK_BUFFER_DESCRIPTORS + 2 );
2300 xPortGetMinimumEverFreeHeapSize_ExpectAndReturn( 2 );
2301
2302 vPrintResourceStats();
2303 }
2304
2305 /**
2306 * @brief test_vPrintResourceStats_BufferCountMore
2307 * To validate vPrintResourceStats when minimum free network buffer
2308 * is less than last record.
2309 */
test_vPrintResourceStats_BufferCountLess(void)2310 void test_vPrintResourceStats_BufferCountLess( void )
2311 {
2312 uxGetMinimumFreeNetworkBuffers_ExpectAndReturn( ipconfigNUM_NETWORK_BUFFER_DESCRIPTORS - 2 );
2313 xPortGetMinimumEverFreeHeapSize_ExpectAndReturn( 2 );
2314
2315 vPrintResourceStats();
2316 TEST_ASSERT_EQUAL( ipconfigNUM_NETWORK_BUFFER_DESCRIPTORS - 2, uxLastMinBufferCount );
2317 }
2318
2319 /**
2320 * @brief test_vPrintResourceStats_LastBuffer_NE_0
2321 * To validate vPrintResourceStats when minimum ever free heap size
2322 * is less than last record.
2323 */
test_vPrintResourceStats_LastBuffer_NE_0(void)2324 void test_vPrintResourceStats_LastBuffer_NE_0( void )
2325 {
2326 uxLastMinBufferCount = ipconfigNUM_NETWORK_BUFFER_DESCRIPTORS;
2327 uxMinLastSize = 10u;
2328
2329 uxGetMinimumFreeNetworkBuffers_ExpectAndReturn( ipconfigNUM_NETWORK_BUFFER_DESCRIPTORS - 2 );
2330 xPortGetMinimumEverFreeHeapSize_ExpectAndReturn( 2 );
2331
2332 vPrintResourceStats();
2333
2334 TEST_ASSERT_EQUAL( 2, uxMinLastSize );
2335 }
2336
2337 /**
2338 * @brief test_vPrintResourceStats_LastBuffer_NE_0
2339 * To validate vPrintResourceStats when minimum ever free heap size
2340 * is greater than last record.
2341 */
test_vPrintResourceStats_MinSizeIsBigger(void)2342 void test_vPrintResourceStats_MinSizeIsBigger( void )
2343 {
2344 uxLastMinBufferCount = ipconfigNUM_NETWORK_BUFFER_DESCRIPTORS;
2345 uxMinLastSize = 10u;
2346
2347 uxGetMinimumFreeNetworkBuffers_ExpectAndReturn( ipconfigNUM_NETWORK_BUFFER_DESCRIPTORS - 2 );
2348 xPortGetMinimumEverFreeHeapSize_ExpectAndReturn( 1024U * 1025U );
2349
2350 vPrintResourceStats();
2351
2352 TEST_ASSERT_EQUAL( 10, uxMinLastSize );
2353 }
2354
2355 /**
2356 * @brief test_FreeRTOS_strerror_r_Invalid
2357 * To validate FreeRTOS_strerror_r with invalid errno.
2358 */
test_FreeRTOS_strerror_r_Invalid(void)2359 void test_FreeRTOS_strerror_r_Invalid( void )
2360 {
2361 const char * pucResult;
2362 BaseType_t xErrnum = 0;
2363 char pcBuffer[ 100 ];
2364 size_t uxLength = sizeof( pcBuffer );
2365
2366 memset( pcBuffer, 0, sizeof( pcBuffer ) );
2367
2368 pucResult = FreeRTOS_strerror_r( xErrnum, pcBuffer, uxLength );
2369
2370 TEST_ASSERT_EQUAL( pcBuffer, pucResult );
2371 TEST_ASSERT_EQUAL_STRING( "Errno 0x0", pcBuffer );
2372 }
2373
2374 /**
2375 * @brief test_FreeRTOS_strerror_r_EADDRINUSE
2376 * To validate FreeRTOS_strerror_r with pdFREERTOS_ERRNO_EADDRINUSE.
2377 */
test_FreeRTOS_strerror_r_EADDRINUSE(void)2378 void test_FreeRTOS_strerror_r_EADDRINUSE( void )
2379 {
2380 const char * pucResult;
2381 BaseType_t xErrnum = pdFREERTOS_ERRNO_EADDRINUSE;
2382 char pcBuffer[ 100 ];
2383 size_t uxLength = sizeof( pcBuffer );
2384
2385 memset( pcBuffer, 0, sizeof( pcBuffer ) );
2386
2387 pucResult = FreeRTOS_strerror_r( xErrnum, pcBuffer, uxLength );
2388
2389 TEST_ASSERT_EQUAL( pcBuffer, pucResult );
2390 TEST_ASSERT_EQUAL_STRING( "EADDRINUSE", pcBuffer );
2391 }
2392
2393 /**
2394 * @brief test_FreeRTOS_strerror_r_ENOMEM
2395 * To validate FreeRTOS_strerror_r with pdFREERTOS_ERRNO_ENOMEM.
2396 */
test_FreeRTOS_strerror_r_ENOMEM(void)2397 void test_FreeRTOS_strerror_r_ENOMEM( void )
2398 {
2399 const char * pucResult;
2400 BaseType_t xErrnum = pdFREERTOS_ERRNO_ENOMEM;
2401 char pcBuffer[ 100 ];
2402 size_t uxLength = sizeof( pcBuffer );
2403
2404 memset( pcBuffer, 0, sizeof( pcBuffer ) );
2405
2406 pucResult = FreeRTOS_strerror_r( xErrnum, pcBuffer, uxLength );
2407
2408 TEST_ASSERT_EQUAL( pcBuffer, pucResult );
2409 TEST_ASSERT_EQUAL_STRING( "ENOMEM", pcBuffer );
2410 }
2411
2412 /**
2413 * @brief test_FreeRTOS_strerror_r_EADDRNOTAVAIL
2414 * To validate FreeRTOS_strerror_r with pdFREERTOS_ERRNO_EADDRNOTAVAIL.
2415 */
test_FreeRTOS_strerror_r_EADDRNOTAVAIL(void)2416 void test_FreeRTOS_strerror_r_EADDRNOTAVAIL( void )
2417 {
2418 const char * pucResult;
2419 BaseType_t xErrnum = pdFREERTOS_ERRNO_EADDRNOTAVAIL;
2420 char pcBuffer[ 100 ];
2421 size_t uxLength = sizeof( pcBuffer );
2422
2423 memset( pcBuffer, 0, sizeof( pcBuffer ) );
2424
2425 pucResult = FreeRTOS_strerror_r( xErrnum, pcBuffer, uxLength );
2426
2427 TEST_ASSERT_EQUAL( pcBuffer, pucResult );
2428 TEST_ASSERT_EQUAL_STRING( "EADDRNOTAVAIL", pcBuffer );
2429 }
2430
2431 /**
2432 * @brief test_FreeRTOS_strerror_r_ENOPROTOOPT
2433 * To validate FreeRTOS_strerror_r with pdFREERTOS_ERRNO_ENOPROTOOPT.
2434 */
test_FreeRTOS_strerror_r_ENOPROTOOPT(void)2435 void test_FreeRTOS_strerror_r_ENOPROTOOPT( void )
2436 {
2437 const char * pucResult;
2438 BaseType_t xErrnum = pdFREERTOS_ERRNO_ENOPROTOOPT;
2439 char pcBuffer[ 100 ];
2440 size_t uxLength = sizeof( pcBuffer );
2441
2442 memset( pcBuffer, 0, sizeof( pcBuffer ) );
2443
2444 pucResult = FreeRTOS_strerror_r( xErrnum, pcBuffer, uxLength );
2445
2446 TEST_ASSERT_EQUAL( pcBuffer, pucResult );
2447 TEST_ASSERT_EQUAL_STRING( "ENOPROTOOPT", pcBuffer );
2448 }
2449
2450 /**
2451 * @brief test_FreeRTOS_strerror_r_EBADF
2452 * To validate FreeRTOS_strerror_r with pdFREERTOS_ERRNO_EBADF.
2453 */
test_FreeRTOS_strerror_r_EBADF(void)2454 void test_FreeRTOS_strerror_r_EBADF( void )
2455 {
2456 const char * pucResult;
2457 BaseType_t xErrnum = pdFREERTOS_ERRNO_EBADF;
2458 char pcBuffer[ 100 ];
2459 size_t uxLength = sizeof( pcBuffer );
2460
2461 memset( pcBuffer, 0, sizeof( pcBuffer ) );
2462
2463 pucResult = FreeRTOS_strerror_r( xErrnum, pcBuffer, uxLength );
2464
2465 TEST_ASSERT_EQUAL( pcBuffer, pucResult );
2466 TEST_ASSERT_EQUAL_STRING( "EBADF", pcBuffer );
2467 }
2468
2469 /**
2470 * @brief test_FreeRTOS_strerror_r_ENOSPC
2471 * To validate FreeRTOS_strerror_r with pdFREERTOS_ERRNO_ENOSPC.
2472 */
test_FreeRTOS_strerror_r_ENOSPC(void)2473 void test_FreeRTOS_strerror_r_ENOSPC( void )
2474 {
2475 const char * pucResult;
2476 BaseType_t xErrnum = pdFREERTOS_ERRNO_ENOSPC;
2477 char pcBuffer[ 100 ];
2478 size_t uxLength = sizeof( pcBuffer );
2479
2480 memset( pcBuffer, 0, sizeof( pcBuffer ) );
2481
2482 pucResult = FreeRTOS_strerror_r( xErrnum, pcBuffer, uxLength );
2483
2484 TEST_ASSERT_EQUAL( pcBuffer, pucResult );
2485 TEST_ASSERT_EQUAL_STRING( "ENOSPC", pcBuffer );
2486 }
2487
2488 /**
2489 * @brief test_FreeRTOS_strerror_r_ECANCELED
2490 * To validate FreeRTOS_strerror_r with pdFREERTOS_ERRNO_ECANCELED.
2491 */
test_FreeRTOS_strerror_r_ECANCELED(void)2492 void test_FreeRTOS_strerror_r_ECANCELED( void )
2493 {
2494 const char * pucResult;
2495 BaseType_t xErrnum = pdFREERTOS_ERRNO_ECANCELED;
2496 char pcBuffer[ 100 ];
2497 size_t uxLength = sizeof( pcBuffer );
2498
2499 memset( pcBuffer, 0, sizeof( pcBuffer ) );
2500
2501 pucResult = FreeRTOS_strerror_r( xErrnum, pcBuffer, uxLength );
2502
2503 TEST_ASSERT_EQUAL( pcBuffer, pucResult );
2504 TEST_ASSERT_EQUAL_STRING( "ECANCELED", pcBuffer );
2505 }
2506
2507 /**
2508 * @brief test_FreeRTOS_strerror_r_ENOTCONN
2509 * To validate FreeRTOS_strerror_r with pdFREERTOS_ERRNO_ENOTCONN.
2510 */
test_FreeRTOS_strerror_r_ENOTCONN(void)2511 void test_FreeRTOS_strerror_r_ENOTCONN( void )
2512 {
2513 const char * pucResult;
2514 BaseType_t xErrnum = pdFREERTOS_ERRNO_ENOTCONN;
2515 char pcBuffer[ 100 ];
2516 size_t uxLength = sizeof( pcBuffer );
2517
2518 memset( pcBuffer, 0, sizeof( pcBuffer ) );
2519
2520 pucResult = FreeRTOS_strerror_r( xErrnum, pcBuffer, uxLength );
2521
2522 TEST_ASSERT_EQUAL( pcBuffer, pucResult );
2523 TEST_ASSERT_EQUAL_STRING( "ENOTCONN", pcBuffer );
2524 }
2525
2526 /**
2527 * @brief test_FreeRTOS_strerror_r_EINPROGRESS
2528 * To validate FreeRTOS_strerror_r with pdFREERTOS_ERRNO_EINPROGRESS.
2529 */
test_FreeRTOS_strerror_r_EINPROGRESS(void)2530 void test_FreeRTOS_strerror_r_EINPROGRESS( void )
2531 {
2532 const char * pucResult;
2533 BaseType_t xErrnum = pdFREERTOS_ERRNO_EINPROGRESS;
2534 char pcBuffer[ 100 ];
2535 size_t uxLength = sizeof( pcBuffer );
2536
2537 memset( pcBuffer, 0, sizeof( pcBuffer ) );
2538
2539 pucResult = FreeRTOS_strerror_r( xErrnum, pcBuffer, uxLength );
2540
2541 TEST_ASSERT_EQUAL( pcBuffer, pucResult );
2542 TEST_ASSERT_EQUAL_STRING( "EINPROGRESS", pcBuffer );
2543 }
2544
2545 /**
2546 * @brief test_FreeRTOS_strerror_r_EOPNOTSUPP
2547 * To validate FreeRTOS_strerror_r with pdFREERTOS_ERRNO_EOPNOTSUPP.
2548 */
test_FreeRTOS_strerror_r_EOPNOTSUPP(void)2549 void test_FreeRTOS_strerror_r_EOPNOTSUPP( void )
2550 {
2551 const char * pucResult;
2552 BaseType_t xErrnum = pdFREERTOS_ERRNO_EOPNOTSUPP;
2553 char pcBuffer[ 100 ];
2554 size_t uxLength = sizeof( pcBuffer );
2555
2556 memset( pcBuffer, 0, sizeof( pcBuffer ) );
2557
2558 pucResult = FreeRTOS_strerror_r( xErrnum, pcBuffer, uxLength );
2559
2560 TEST_ASSERT_EQUAL( pcBuffer, pucResult );
2561 TEST_ASSERT_EQUAL_STRING( "EOPNOTSUPP", pcBuffer );
2562 }
2563
2564 /**
2565 * @brief test_FreeRTOS_strerror_r_EINTR
2566 * To validate FreeRTOS_strerror_r with pdFREERTOS_ERRNO_EINTR.
2567 */
test_FreeRTOS_strerror_r_EINTR(void)2568 void test_FreeRTOS_strerror_r_EINTR( void )
2569 {
2570 const char * pucResult;
2571 BaseType_t xErrnum = pdFREERTOS_ERRNO_EINTR;
2572 char pcBuffer[ 100 ];
2573 size_t uxLength = sizeof( pcBuffer );
2574
2575 memset( pcBuffer, 0, sizeof( pcBuffer ) );
2576
2577 pucResult = FreeRTOS_strerror_r( xErrnum, pcBuffer, uxLength );
2578
2579 TEST_ASSERT_EQUAL( pcBuffer, pucResult );
2580 TEST_ASSERT_EQUAL_STRING( "EINTR", pcBuffer );
2581 }
2582
2583 /**
2584 * @brief test_FreeRTOS_strerror_r_ETIMEDOUT
2585 * To validate FreeRTOS_strerror_r with pdFREERTOS_ERRNO_ETIMEDOUT.
2586 */
test_FreeRTOS_strerror_r_ETIMEDOUT(void)2587 void test_FreeRTOS_strerror_r_ETIMEDOUT( void )
2588 {
2589 const char * pucResult;
2590 BaseType_t xErrnum = pdFREERTOS_ERRNO_ETIMEDOUT;
2591 char pcBuffer[ 100 ];
2592 size_t uxLength = sizeof( pcBuffer );
2593
2594 memset( pcBuffer, 0, sizeof( pcBuffer ) );
2595
2596 pucResult = FreeRTOS_strerror_r( xErrnum, pcBuffer, uxLength );
2597
2598 TEST_ASSERT_EQUAL( pcBuffer, pucResult );
2599 TEST_ASSERT_EQUAL_STRING( "ETIMEDOUT", pcBuffer );
2600 }
2601
2602 /**
2603 * @brief test_FreeRTOS_strerror_r_EINVAL
2604 * To validate FreeRTOS_strerror_r with pdFREERTOS_ERRNO_EINVAL.
2605 */
test_FreeRTOS_strerror_r_EINVAL(void)2606 void test_FreeRTOS_strerror_r_EINVAL( void )
2607 {
2608 const char * pucResult;
2609 BaseType_t xErrnum = pdFREERTOS_ERRNO_EINVAL;
2610 char pcBuffer[ 100 ];
2611 size_t uxLength = sizeof( pcBuffer );
2612
2613 memset( pcBuffer, 0, sizeof( pcBuffer ) );
2614
2615 pucResult = FreeRTOS_strerror_r( xErrnum, pcBuffer, uxLength );
2616
2617 TEST_ASSERT_EQUAL( pcBuffer, pucResult );
2618 TEST_ASSERT_EQUAL_STRING( "EINVAL", pcBuffer );
2619 }
2620
2621 /**
2622 * @brief test_FreeRTOS_strerror_r_EWOULDBLOCK
2623 * To validate FreeRTOS_strerror_r with pdFREERTOS_ERRNO_EWOULDBLOCK.
2624 */
test_FreeRTOS_strerror_r_EWOULDBLOCK(void)2625 void test_FreeRTOS_strerror_r_EWOULDBLOCK( void )
2626 {
2627 const char * pucResult;
2628 BaseType_t xErrnum = pdFREERTOS_ERRNO_EWOULDBLOCK;
2629 char pcBuffer[ 100 ];
2630 size_t uxLength = sizeof( pcBuffer );
2631
2632 memset( pcBuffer, 0, sizeof( pcBuffer ) );
2633
2634 pucResult = FreeRTOS_strerror_r( xErrnum, pcBuffer, uxLength );
2635
2636 TEST_ASSERT_EQUAL( pcBuffer, pucResult );
2637 TEST_ASSERT_EQUAL_STRING( "EWOULDBLOCK", pcBuffer );
2638 }
2639
2640 /**
2641 * @brief test_FreeRTOS_strerror_r_EISCONN
2642 * To validate FreeRTOS_strerror_r with pdFREERTOS_ERRNO_EISCONN.
2643 */
test_FreeRTOS_strerror_r_EISCONN(void)2644 void test_FreeRTOS_strerror_r_EISCONN( void )
2645 {
2646 const char * pucResult;
2647 BaseType_t xErrnum = pdFREERTOS_ERRNO_EISCONN;
2648 char pcBuffer[ 100 ];
2649 size_t uxLength = sizeof( pcBuffer );
2650
2651 memset( pcBuffer, 0, sizeof( pcBuffer ) );
2652
2653 pucResult = FreeRTOS_strerror_r( xErrnum, pcBuffer, uxLength );
2654
2655 TEST_ASSERT_EQUAL( pcBuffer, pucResult );
2656 TEST_ASSERT_EQUAL_STRING( "EISCONN", pcBuffer );
2657 }
2658
2659 /**
2660 * @brief test_FreeRTOS_strerror_r_ZeroLengthBuffer
2661 * To validate FreeRTOS_strerror_r with zero length buffer.
2662 */
test_FreeRTOS_strerror_r_ZeroLengthBuffer(void)2663 void test_FreeRTOS_strerror_r_ZeroLengthBuffer( void )
2664 {
2665 const char * pucResult;
2666 BaseType_t xErrnum = pdFREERTOS_ERRNO_EISCONN;
2667 char pcBuffer[ 100 ];
2668 size_t uxLength = 0;
2669
2670 memset( pcBuffer, 0, sizeof( pcBuffer ) );
2671
2672 pucResult = FreeRTOS_strerror_r( xErrnum, pcBuffer, uxLength );
2673
2674 TEST_ASSERT_EQUAL( pcBuffer, pucResult );
2675 TEST_ASSERT_EQUAL_STRING( "", pcBuffer );
2676 }
2677
2678 /**
2679 * @brief test_FreeRTOS_strerror_r_NegativeErrno
2680 * To validate FreeRTOS_strerror_r with negative errno.
2681 */
test_FreeRTOS_strerror_r_NegativeErrno(void)2682 void test_FreeRTOS_strerror_r_NegativeErrno( void )
2683 {
2684 const char * pucResult;
2685 BaseType_t xErrnum = -pdFREERTOS_ERRNO_EISCONN;
2686 char pcBuffer[ 100 ];
2687 size_t uxLength = sizeof( pcBuffer );
2688
2689 memset( pcBuffer, 0, sizeof( pcBuffer ) );
2690
2691 pucResult = FreeRTOS_strerror_r( xErrnum, pcBuffer, uxLength );
2692
2693 TEST_ASSERT_EQUAL( pcBuffer, pucResult );
2694 TEST_ASSERT_EQUAL_STRING( "EISCONN", pcBuffer );
2695 }
2696
2697 /**
2698 * @brief test_FreeRTOS_max_int32
2699 * To validate FreeRTOS_max_int32.
2700 */
test_FreeRTOS_max_int32(void)2701 void test_FreeRTOS_max_int32( void )
2702 {
2703 int32_t lResult;
2704
2705 for( int i = -100; i < 100; i++ )
2706 {
2707 for( int j = -100; j <= i; j++ )
2708 {
2709 lResult = FreeRTOS_max_int32( i, j );
2710 TEST_ASSERT_EQUAL( i, lResult );
2711 }
2712 }
2713
2714 for( int i = ( 0x6FFFFFFF - 100 ); i < ( 0x6FFFFFFF + 100 ); i++ )
2715 {
2716 for( int j = ( 0x6FFFFFFF - 100 ); j <= i; j++ )
2717 {
2718 lResult = FreeRTOS_max_int32( i, j );
2719 TEST_ASSERT_EQUAL( i, lResult );
2720 }
2721 }
2722 }
2723
2724 /**
2725 * @brief test_FreeRTOS_max_uint32
2726 * To validate FreeRTOS_max_uint32.
2727 */
test_FreeRTOS_max_uint32(void)2728 void test_FreeRTOS_max_uint32( void )
2729 {
2730 uint32_t lResult;
2731
2732 for( uint32_t i = 0; i < 100; i++ )
2733 {
2734 for( uint32_t j = 0; j <= i; j++ )
2735 {
2736 lResult = FreeRTOS_max_uint32( i, j );
2737 TEST_ASSERT_EQUAL( i, lResult );
2738 }
2739 }
2740
2741 for( uint32_t i = ( 0xDFFFFFFF - 100 ); i < ( 0xDFFFFFFF + 100 ); i++ )
2742 {
2743 for( uint32_t j = ( 0xDFFFFFFF - 100 ); j <= i; j++ )
2744 {
2745 lResult = FreeRTOS_max_uint32( i, j );
2746 TEST_ASSERT_EQUAL( i, lResult );
2747 }
2748 }
2749 }
2750
2751 /**
2752 * @brief test_FreeRTOS_max_size_t
2753 * To validate FreeRTOS_max_size_t.
2754 */
test_FreeRTOS_max_size_t(void)2755 void test_FreeRTOS_max_size_t( void )
2756 {
2757 uint32_t lResult;
2758
2759 for( uint32_t i = 0; i < 100; i++ )
2760 {
2761 for( uint32_t j = 0; j <= i; j++ )
2762 {
2763 lResult = FreeRTOS_max_size_t( i, j );
2764 TEST_ASSERT_EQUAL( i, lResult );
2765 }
2766 }
2767
2768 for( uint32_t i = ( 0xDFFFFFFF - 100 ); i < ( 0xDFFFFFFF + 100 ); i++ )
2769 {
2770 for( uint32_t j = ( 0xDFFFFFFF - 100 ); j <= i; j++ )
2771 {
2772 lResult = FreeRTOS_max_size_t( i, j );
2773 TEST_ASSERT_EQUAL( i, lResult );
2774 }
2775 }
2776 }
2777
2778 /**
2779 * @brief test_FreeRTOS_min_int32
2780 * To validate FreeRTOS_min_int32.
2781 */
test_FreeRTOS_min_int32(void)2782 void test_FreeRTOS_min_int32( void )
2783 {
2784 int32_t lResult;
2785
2786 for( int i = -100; i < 100; i++ )
2787 {
2788 for( int j = -100; j <= i; j++ )
2789 {
2790 lResult = FreeRTOS_min_int32( i, j );
2791 TEST_ASSERT_EQUAL( j, lResult );
2792 }
2793 }
2794
2795 for( int i = ( 0x6FFFFFFF - 100 ); i < ( 0x6FFFFFFF + 100 ); i++ )
2796 {
2797 for( int j = ( 0x6FFFFFFF - 100 ); j <= i; j++ )
2798 {
2799 lResult = FreeRTOS_min_int32( i, j );
2800 TEST_ASSERT_EQUAL( j, lResult );
2801 }
2802 }
2803 }
2804
2805 /**
2806 * @brief test_FreeRTOS_min_uint32
2807 * To validate FreeRTOS_min_uint32.
2808 */
test_FreeRTOS_min_uint32(void)2809 void test_FreeRTOS_min_uint32( void )
2810 {
2811 uint32_t lResult;
2812
2813 for( uint32_t i = 0; i < 100; i++ )
2814 {
2815 for( uint32_t j = 0; j <= i; j++ )
2816 {
2817 lResult = FreeRTOS_min_uint32( i, j );
2818 TEST_ASSERT_EQUAL( j, lResult );
2819 }
2820 }
2821
2822 for( uint32_t i = ( 0xDFFFFFFF - 100 ); i < ( 0xDFFFFFFF + 100 ); i++ )
2823 {
2824 for( uint32_t j = ( 0xDFFFFFFF - 100 ); j <= i; j++ )
2825 {
2826 lResult = FreeRTOS_min_uint32( i, j );
2827 TEST_ASSERT_EQUAL( j, lResult );
2828 }
2829 }
2830 }
2831
2832 /**
2833 * @brief test_FreeRTOS_min_size_t
2834 * To validate FreeRTOS_min_size_t.
2835 */
test_FreeRTOS_min_size_t(void)2836 void test_FreeRTOS_min_size_t( void )
2837 {
2838 uint32_t lResult;
2839
2840 for( uint32_t i = 0; i < 100; i++ )
2841 {
2842 for( uint32_t j = 0; j <= i; j++ )
2843 {
2844 lResult = FreeRTOS_min_size_t( i, j );
2845 TEST_ASSERT_EQUAL( j, lResult );
2846 }
2847 }
2848
2849 for( uint32_t i = ( 0xDFFFFFFF - 100 ); i < ( 0xDFFFFFFF + 100 ); i++ )
2850 {
2851 for( uint32_t j = ( 0xDFFFFFFF - 100 ); j <= i; j++ )
2852 {
2853 lResult = FreeRTOS_min_size_t( i, j );
2854 TEST_ASSERT_EQUAL( j, lResult );
2855 }
2856 }
2857 }
2858
2859 /**
2860 * @brief test_FreeRTOS_round_up
2861 * To validate FreeRTOS_round_up.
2862 */
test_FreeRTOS_round_up(void)2863 void test_FreeRTOS_round_up( void )
2864 {
2865 uint32_t ulResult;
2866 uint32_t a, d;
2867
2868 a = 0;
2869 d = 0;
2870 catch_assert( FreeRTOS_round_up( a, d ) );
2871
2872 a = 32;
2873 d = 5;
2874 ulResult = FreeRTOS_round_up( a, d );
2875 TEST_ASSERT_EQUAL( 35, ulResult );
2876
2877 a = 0xFFFFFFF7;
2878 d = 3;
2879 ulResult = FreeRTOS_round_up( a, d );
2880 TEST_ASSERT_EQUAL( 0xFFFFFFF9, ulResult );
2881
2882 a = 0x123AB;
2883 d = 7;
2884 ulResult = FreeRTOS_round_up( a, d );
2885 TEST_ASSERT_EQUAL( 0x123AD, ulResult );
2886
2887 a = 0x123AD;
2888 d = 7;
2889 ulResult = FreeRTOS_round_up( a, d );
2890 TEST_ASSERT_EQUAL( 0x123AD, ulResult );
2891 }
2892
2893 /**
2894 * @brief test_FreeRTOS_round_down
2895 * To validate FreeRTOS_round_down.
2896 */
test_FreeRTOS_round_down(void)2897 void test_FreeRTOS_round_down( void )
2898 {
2899 uint32_t ulResult;
2900 uint32_t a, d;
2901
2902 a = 0;
2903 d = 0;
2904 catch_assert( FreeRTOS_round_down( a, d ) );
2905
2906 a = 32;
2907 d = 5;
2908 ulResult = FreeRTOS_round_down( a, d );
2909 TEST_ASSERT_EQUAL( 30, ulResult );
2910
2911 a = 0xFFFFFFF7;
2912 d = 3;
2913 ulResult = FreeRTOS_round_down( a, d );
2914 TEST_ASSERT_EQUAL( 0xFFFFFFF6, ulResult );
2915
2916 a = 0x123AB;
2917 d = 7;
2918 ulResult = FreeRTOS_round_down( a, d );
2919 TEST_ASSERT_EQUAL( 0x123A6, ulResult );
2920
2921 a = 0x123AD;
2922 d = 7;
2923 ulResult = FreeRTOS_round_down( a, d );
2924 TEST_ASSERT_EQUAL( 0x123AD, ulResult );
2925 }
2926
2927 /**
2928 * @brief test_ulChar2u32
2929 * To validate ulChar2u32.
2930 */
test_ulChar2u32(void)2931 void test_ulChar2u32( void )
2932 {
2933 uint32_t ulResult;
2934 uint8_t pucPtr[] = { 0xAA, 0x00, 0x12, 0xEF };
2935
2936 ulResult = ulChar2u32( pucPtr );
2937
2938 TEST_ASSERT_EQUAL_UINT32( 0xAA0012EF, ulResult );
2939 }
2940
2941 /**
2942 * @brief test_usChar2u16
2943 * To validate usChar2u16.
2944 */
test_usChar2u16(void)2945 void test_usChar2u16( void )
2946 {
2947 uint16_t usResult;
2948 uint8_t pucPtr[] = { 0xAA, 0x00, 0x12, 0xEF };
2949
2950 usResult = usChar2u16( pucPtr );
2951
2952 TEST_ASSERT_EQUAL_UINT16( 0xAA00, usResult );
2953
2954 usResult = usChar2u16( &pucPtr[ 2 ] );
2955
2956 TEST_ASSERT_EQUAL_UINT16( 0x12EF, usResult );
2957 }
2958
2959 /**
2960 * @brief test_prvGetChecksumFromPacket_UnhandledProtocol
2961 * To validate prvGetChecksumFromPacket returns ipUNHANDLED_PROTOCOL when
2962 * input set has unknown protocol.
2963 */
test_prvGetChecksumFromPacket_UnhandledProtocol()2964 void test_prvGetChecksumFromPacket_UnhandledProtocol()
2965 {
2966 struct xPacketSummary xSet;
2967 uint16_t usReturn;
2968
2969 memset( &xSet, 0, sizeof( xSet ) );
2970
2971 xSet.ucProtocol = 0xFF;
2972
2973 usReturn = prvGetChecksumFromPacket( &xSet );
2974 TEST_ASSERT_EQUAL( ipUNHANDLED_PROTOCOL, usReturn );
2975 }
2976
2977 /**
2978 * @brief test_prvGetChecksumFromPacket_IPv6UnhandledProtocol
2979 * To validate prvGetChecksumFromPacket returns ipUNHANDLED_PROTOCOL when
2980 * input set has unknown protocol.
2981 */
test_prvGetChecksumFromPacket_IPv6UnhandledProtocol()2982 void test_prvGetChecksumFromPacket_IPv6UnhandledProtocol()
2983 {
2984 struct xPacketSummary xSet;
2985 uint16_t usReturn;
2986
2987 memset( &xSet, 0, sizeof( xSet ) );
2988
2989 xSet.xIsIPv6 = pdTRUE;
2990 xSet.ucProtocol = 0xFF;
2991
2992 usReturn = prvGetChecksumFromPacket( &xSet );
2993 TEST_ASSERT_EQUAL( ipUNHANDLED_PROTOCOL, usReturn );
2994 }
2995
2996 /**
2997 * @brief test_prvSetChecksumInPacket_UnhandledProtocol
2998 * To validate prvSetChecksumInPacket returns ipUNHANDLED_PROTOCOL when
2999 * input set has unknown protocol.
3000 */
test_prvSetChecksumInPacket_UnhandledProtocol()3001 void test_prvSetChecksumInPacket_UnhandledProtocol()
3002 {
3003 struct xPacketSummary xSet;
3004
3005 memset( &xSet, 0, sizeof( xSet ) );
3006
3007 xSet.ucProtocol = 0xFF;
3008
3009 prvSetChecksumInPacket( &xSet, 0 );
3010 }
3011
3012 /**
3013 * @brief test_prvSetChecksumInPacket_IPv6UnhandledProtocol
3014 * To validate prvSetChecksumInPacket returns ipUNHANDLED_PROTOCOL when
3015 * input set has unknown protocol.
3016 */
test_prvSetChecksumInPacket_IPv6UnhandledProtocol()3017 void test_prvSetChecksumInPacket_IPv6UnhandledProtocol()
3018 {
3019 struct xPacketSummary xSet;
3020 uint16_t usReturn;
3021
3022 memset( &xSet, 0, sizeof( xSet ) );
3023
3024 xSet.xIsIPv6 = pdTRUE;
3025 xSet.ucProtocol = 0xFF;
3026
3027 prvSetChecksumInPacket( &xSet, 0 );
3028 }
3029