1 /* Include Unity header */
2 #include "unity.h"
3 
4 /* Include standard libraries */
5 #include <stdlib.h>
6 #include <string.h>
7 #include <stdint.h>
8 
9 #include "mock_FreeRTOS_IP.h"
10 #include "mock_FreeRTOS_IPv4.h"
11 #include "mock_FreeRTOS_Routing.h"
12 #include "mock_FreeRTOS_IP_Utils.h"
13 #include "mock_FreeRTOS_IPv4_Utils.h"
14 #include "mock_FreeRTOS_IP_Timers.h"
15 #include "mock_FreeRTOS_IP_Private.h"
16 #include "mock_FreeRTOS_ND.h"
17 #include "mock_task.h"
18 #include "mock_NetworkBufferManagement.h"
19 
20 #include "FreeRTOS_ARP.h"
21 
22 #include "FreeRTOS_ARP_stubs.c"
23 #include "catch_assert.h"
24 
25 #include "FreeRTOSIPConfig.h"
26 
27 /* ===========================  EXTERN VARIABLES  =========================== */
28 
29 extern ARPCacheRow_t xARPCache[ ipconfigARP_CACHE_ENTRIES ];
30 
31 extern NetworkBufferDescriptor_t * pxARPWaitingNetworkBuffer;
32 
33 extern BaseType_t xARPHadIPClash;
34 
35 /* ==============================  Test Cases  ============================== */
36 
37 /* Helper function to reset the uxARPClashCounter variable before a test is run. It
38  * cannot be directly reset since it is declared as static. */
vResetARPClashCounter(void)39 static void vResetARPClashCounter( void )
40 {
41     ARPPacket_t xARPFrame = { 0 };
42     eFrameProcessingResult_t eResult;
43     struct xNetworkEndPoint xEndPoint = { 0 };
44     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
45 
46     memset( &xARPFrame, 0, sizeof( ARPPacket_t ) );
47 
48     /* =================================================== */
49     /* Add settings required for ARP header to pass checks */
50     xARPFrame.xARPHeader.usHardwareType = ipARP_HARDWARE_TYPE_ETHERNET;
51     xARPFrame.xARPHeader.usProtocolType = ipARP_PROTOCOL_TYPE;
52     xARPFrame.xARPHeader.ucHardwareAddressLength = ipMAC_ADDRESS_LENGTH_BYTES;
53     xARPFrame.xARPHeader.ucProtocolAddressLength = ipIP_ADDRESS_LENGTH_BYTES;
54     /* Different protocol length. */
55     /*xARPFrame.xARPHeader.ucProtocolAddressLength = ipIP_ADDRESS_LENGTH_BYTES + 1; */
56 
57     xNetworkBuffer.pucEthernetBuffer = &xARPFrame;
58     xNetworkBuffer.xDataLength = sizeof( ARPPacket_t );
59 
60     /* Regardless of whether this is called or not, the test should not fail. */
61     xTaskCheckForTimeOut_IgnoreAndReturn( pdTRUE );
62 
63     eResult = eARPProcessPacket( &xNetworkBuffer );
64 
65     /* Stop ignoring after the helper function is called. */
66     xTaskCheckForTimeOut_StopIgnore();
67 }
68 
test_xCheckLoopback_NullNetworkBuffer(void)69 void test_xCheckLoopback_NullNetworkBuffer( void )
70 {
71     BaseType_t xResult;
72 
73     /* bReleaseAfterSend parameter doesn't matter here. */
74     xResult = xCheckLoopback( NULL, pdFALSE );
75     TEST_ASSERT_EQUAL( pdFALSE, xResult );
76     /* =================================================== */
77 }
78 
test_xCheckLoopback_DataLengthTooSmall(void)79 void test_xCheckLoopback_DataLengthTooSmall( void )
80 {
81     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
82     NetworkBufferDescriptor_t * const pxNetworkBuffer = &xNetworkBuffer;
83     uint8_t ucBuffer[ sizeof( IPPacket_t ) + ipBUFFER_PADDING ];
84     BaseType_t xResult;
85 
86     pxNetworkBuffer->pucEthernetBuffer = ucBuffer;
87     pxNetworkBuffer->xDataLength = sizeof( IPPacket_t ) - 1;
88 
89     IPPacket_t * pxIPPacket = ( IPPacket_t * ) ( pxNetworkBuffer->pucEthernetBuffer );
90 
91     /* =================================================== */
92     /* Let the frame-type be anything else than IPv4. */
93     pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
94     /* bReleaseAfterSend parameter doesn't matter here. */
95     xResult = xCheckLoopback( pxNetworkBuffer, pdFALSE );
96     TEST_ASSERT_EQUAL( pdFALSE, xResult );
97     /* =================================================== */
98 }
99 
test_xCheckLoopback_IncorrectFrameType(void)100 void test_xCheckLoopback_IncorrectFrameType( void )
101 {
102     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
103     NetworkBufferDescriptor_t * const pxNetworkBuffer = &xNetworkBuffer;
104     uint8_t ucBuffer[ sizeof( IPPacket_t ) + ipBUFFER_PADDING ];
105     BaseType_t xResult;
106 
107     pxNetworkBuffer->pucEthernetBuffer = ucBuffer;
108     pxNetworkBuffer->xDataLength = sizeof( IPPacket_t );
109 
110     IPPacket_t * pxIPPacket = ( IPPacket_t * ) ( pxNetworkBuffer->pucEthernetBuffer );
111 
112     /* =================================================== */
113     /* Let the frame-type be anything else than IPv4. */
114     pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE + 1;
115     /* bReleaseAfterSend parameter doesn't matter here. */
116     xResult = xCheckLoopback( pxNetworkBuffer, pdFALSE );
117     TEST_ASSERT_EQUAL( pdFALSE, xResult );
118     /* =================================================== */
119 }
120 
test_xCheckLoopback_NullEndPoint(void)121 void test_xCheckLoopback_NullEndPoint( void )
122 {
123     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
124     NetworkBufferDescriptor_t * const pxNetworkBuffer = &xNetworkBuffer;
125     uint8_t ucBuffer[ sizeof( IPPacket_t ) + ipBUFFER_PADDING ];
126     BaseType_t xResult;
127     NetworkEndPoint_t xEndPoint = { 0 };
128 
129     pxNetworkBuffer->pucEthernetBuffer = ucBuffer;
130     pxNetworkBuffer->xDataLength = sizeof( IPPacket_t );
131 
132     IPPacket_t * pxIPPacket = ( IPPacket_t * ) ( pxNetworkBuffer->pucEthernetBuffer );
133 
134     /* =================================================== */
135     /* Let the frame-type be IPv4. */
136     pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
137     /* But let the MAC address be different. */
138     memset( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, 0xAA, ipMAC_ADDRESS_LENGTH_BYTES );
139     /* bReleaseAfterSend parameter doesn't matter here. */
140     FreeRTOS_FindEndPointOnMAC_ExpectAnyArgsAndReturn( NULL );
141     xResult = xCheckLoopback( pxNetworkBuffer, pdFALSE );
142     TEST_ASSERT_EQUAL( pdFALSE, xResult );
143     /* =================================================== */
144 }
145 
test_xCheckLoopback_IncorrectMACAddress(void)146 void test_xCheckLoopback_IncorrectMACAddress( void )
147 {
148     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
149     NetworkBufferDescriptor_t * const pxNetworkBuffer = &xNetworkBuffer;
150     uint8_t ucBuffer[ sizeof( IPPacket_t ) + ipBUFFER_PADDING ];
151     BaseType_t xResult;
152     NetworkEndPoint_t xEndPoint = { 0 };
153 
154     pxNetworkBuffer->pucEthernetBuffer = ucBuffer;
155     pxNetworkBuffer->xDataLength = sizeof( IPPacket_t );
156 
157     IPPacket_t * pxIPPacket = ( IPPacket_t * ) ( pxNetworkBuffer->pucEthernetBuffer );
158 
159     /* =================================================== */
160     /* Let the frame-type be IPv4. */
161     pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
162     /* But let the MAC address be different. */
163     memset( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, 0xAA, ipMAC_ADDRESS_LENGTH_BYTES );
164     /* bReleaseAfterSend parameter doesn't matter here. */
165     FreeRTOS_FindEndPointOnMAC_ExpectAnyArgsAndReturn( &xEndPoint );
166     xResult = xCheckLoopback( pxNetworkBuffer, pdFALSE );
167     TEST_ASSERT_EQUAL( pdFALSE, xResult );
168     /* =================================================== */
169 }
170 
test_xCheckLoopback_HappyCase(void)171 void test_xCheckLoopback_HappyCase( void )
172 {
173     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
174     NetworkBufferDescriptor_t * const pxNetworkBuffer = &xNetworkBuffer;
175     uint8_t ucBuffer[ sizeof( IPPacket_t ) + ipBUFFER_PADDING ];
176     BaseType_t xResult;
177     NetworkEndPoint_t xEndPoint = { 0 };
178     uint8_t ucBytes[ ipMAC_ADDRESS_LENGTH_BYTES ] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 };
179 
180     pxNetworkBuffer->pucEthernetBuffer = ucBuffer;
181     pxNetworkBuffer->xDataLength = sizeof( IPPacket_t );
182 
183 
184     IPPacket_t * pxIPPacket = ( IPPacket_t * ) ( pxNetworkBuffer->pucEthernetBuffer );
185 
186     /* =================================================== */
187     /* Let the frame-type be IPv4. */
188     pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
189     FreeRTOS_FindEndPointOnMAC_ExpectAnyArgsAndReturn( &xEndPoint );
190     /* Make the MAC address same. */
191     memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, ucBytes, ipMAC_ADDRESS_LENGTH_BYTES );
192     memcpy( xEndPoint.xMACAddress.ucBytes, ucBytes, ipMAC_ADDRESS_LENGTH_BYTES );
193     pxDuplicateNetworkBufferWithDescriptor_ExpectAndReturn( pxNetworkBuffer, pxNetworkBuffer->xDataLength, pxNetworkBuffer );
194     xSendEventStructToIPTask_IgnoreAndReturn( pdTRUE );
195 
196     xResult = xCheckLoopback( pxNetworkBuffer, pdFALSE );
197     TEST_ASSERT_EQUAL( pdTRUE, xResult );
198     /* =================================================== */
199 }
200 
test_xCheckLoopback_DuplicationFails(void)201 void test_xCheckLoopback_DuplicationFails( void )
202 {
203     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
204     NetworkBufferDescriptor_t * const pxNetworkBuffer = &xNetworkBuffer;
205     uint8_t ucBuffer[ sizeof( IPPacket_t ) + ipBUFFER_PADDING ];
206     BaseType_t xResult;
207     NetworkEndPoint_t xEndPoint = { 0 };
208     uint8_t ucBytes[ ipMAC_ADDRESS_LENGTH_BYTES ] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 };
209 
210     pxNetworkBuffer->pucEthernetBuffer = ucBuffer;
211     pxNetworkBuffer->xDataLength = sizeof( IPPacket_t );
212 
213     IPPacket_t * pxIPPacket = ( IPPacket_t * ) ( pxNetworkBuffer->pucEthernetBuffer );
214 
215     FreeRTOS_FindEndPointOnMAC_ExpectAnyArgsAndReturn( &xEndPoint );
216     /* =================================================== */
217     /* Let the frame-type be IPv4. */
218     pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
219     /* Make the MAC address same. */
220     memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, ucBytes, ipMAC_ADDRESS_LENGTH_BYTES );
221     memcpy( xEndPoint.xMACAddress.ucBytes, ucBytes, ipMAC_ADDRESS_LENGTH_BYTES );
222     /* Make buffer duplication fail. */
223     pxDuplicateNetworkBufferWithDescriptor_ExpectAndReturn( pxNetworkBuffer, pxNetworkBuffer->xDataLength, NULL );
224     xResult = xCheckLoopback( pxNetworkBuffer, pdFALSE );
225     TEST_ASSERT_EQUAL( pdTRUE, xResult );
226     /* =================================================== */
227 }
228 
229 
test_xCheckLoopback_SendEventToIPTaskFails(void)230 void test_xCheckLoopback_SendEventToIPTaskFails( void )
231 {
232     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
233     NetworkBufferDescriptor_t * const pxNetworkBuffer = &xNetworkBuffer;
234     uint8_t ucBuffer[ sizeof( IPPacket_t ) + ipBUFFER_PADDING ];
235     BaseType_t xResult;
236     NetworkEndPoint_t xEndPoint = { 0 };
237     uint8_t ucBytes[ ipMAC_ADDRESS_LENGTH_BYTES ] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 };
238 
239     pxNetworkBuffer->pucEthernetBuffer = ucBuffer;
240     pxNetworkBuffer->xDataLength = sizeof( IPPacket_t );
241 
242     IPPacket_t * pxIPPacket = ( IPPacket_t * ) ( pxNetworkBuffer->pucEthernetBuffer );
243 
244 
245     FreeRTOS_FindEndPointOnMAC_ExpectAnyArgsAndReturn( &xEndPoint );
246     /* =================================================== */
247     /* Let the frame-type be IPv4. */
248     pxIPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
249     /* Make the MAC address same. */
250     memcpy( pxIPPacket->xEthernetHeader.xDestinationAddress.ucBytes, ucBytes, ipMAC_ADDRESS_LENGTH_BYTES );
251     memcpy( xEndPoint.xMACAddress.ucBytes, ucBytes, ipMAC_ADDRESS_LENGTH_BYTES );
252 
253     xSendEventStructToIPTask_IgnoreAndReturn( pdFALSE );
254     vReleaseNetworkBufferAndDescriptor_Expect( pxNetworkBuffer );
255 
256     xResult = xCheckLoopback( pxNetworkBuffer, pdTRUE );
257     TEST_ASSERT_EQUAL( pdTRUE, xResult );
258     /* =================================================== */
259 }
260 
test_eARPProcessPacket_DifferentHardwareAddress(void)261 void test_eARPProcessPacket_DifferentHardwareAddress( void )
262 {
263     ARPPacket_t xARPFrame = { 0 };
264     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
265     NetworkBufferDescriptor_t * const pxNetworkBuffer = &xNetworkBuffer;
266     uint8_t ucBuffer[ sizeof( IPPacket_t ) + ipBUFFER_PADDING ];
267     eFrameProcessingResult_t eResult;
268 
269     memset( &xARPFrame, 0, sizeof( ARPPacket_t ) );
270 
271     /* =================================================== */
272     /* Different Hardware address. */
273     xARPFrame.xARPHeader.usHardwareType = ipARP_HARDWARE_TYPE_ETHERNET + 1;
274     pxNetworkBuffer->pucEthernetBuffer = &xARPFrame;
275 
276     /* When the local IP address is 0, we should not process any ARP Packets. */
277     *ipLOCAL_IP_ADDRESS_POINTER = 0UL;
278     eResult = eARPProcessPacket( pxNetworkBuffer );
279     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
280     /* =================================================== */
281 }
282 
test_eARPProcessPacket_DifferentProtocolType(void)283 void test_eARPProcessPacket_DifferentProtocolType( void )
284 {
285     ARPPacket_t xARPFrame = { 0 };
286     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
287     NetworkBufferDescriptor_t * const pxNetworkBuffer = &xNetworkBuffer;
288     uint8_t ucBuffer[ sizeof( IPPacket_t ) + ipBUFFER_PADDING ];
289     eFrameProcessingResult_t eResult;
290 
291     memset( &xARPFrame, 0, sizeof( ARPPacket_t ) );
292 
293     /* =================================================== */
294     xARPFrame.xARPHeader.usHardwareType = ipARP_HARDWARE_TYPE_ETHERNET;
295     /* Different protocol type */
296     xARPFrame.xARPHeader.usProtocolType = ipARP_PROTOCOL_TYPE + 1;
297     pxNetworkBuffer->pucEthernetBuffer = &xARPFrame;
298 
299     /* When the local IP address is 0, we should not process any ARP Packets. */
300     *ipLOCAL_IP_ADDRESS_POINTER = 0UL;
301     eResult = eARPProcessPacket( pxNetworkBuffer );
302     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
303     /* =================================================== */
304 }
305 
test_eARPProcessPacket_DifferentHardwareLength(void)306 void test_eARPProcessPacket_DifferentHardwareLength( void )
307 {
308     ARPPacket_t xARPFrame = { 0 };
309     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
310     NetworkBufferDescriptor_t * const pxNetworkBuffer = &xNetworkBuffer;
311     uint8_t ucBuffer[ sizeof( IPPacket_t ) + ipBUFFER_PADDING ];
312     eFrameProcessingResult_t eResult;
313 
314     memset( &xARPFrame, 0, sizeof( ARPPacket_t ) );
315 
316     /* =================================================== */
317     xARPFrame.xARPHeader.usHardwareType = ipARP_HARDWARE_TYPE_ETHERNET;
318     xARPFrame.xARPHeader.usProtocolType = ipARP_PROTOCOL_TYPE;
319     /* Different MAC address length. */
320     xARPFrame.xARPHeader.ucHardwareAddressLength = ipMAC_ADDRESS_LENGTH_BYTES + 1;
321     pxNetworkBuffer->pucEthernetBuffer = &xARPFrame;
322 
323     /* When the local IP address is 0, we should not process any ARP Packets. */
324     *ipLOCAL_IP_ADDRESS_POINTER = 0UL;
325     eResult = eARPProcessPacket( pxNetworkBuffer );
326     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
327     /* =================================================== */
328 }
329 
test_eARPProcessPacket_DifferentProtocolLength(void)330 void test_eARPProcessPacket_DifferentProtocolLength( void )
331 {
332     ARPPacket_t xARPFrame = { 0 };
333     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
334     NetworkBufferDescriptor_t * const pxNetworkBuffer = &xNetworkBuffer;
335     uint8_t ucBuffer[ sizeof( IPPacket_t ) + ipBUFFER_PADDING ];
336     eFrameProcessingResult_t eResult;
337 
338     memset( &xARPFrame, 0, sizeof( ARPPacket_t ) );
339 
340     /* =================================================== */
341     /* Add settings required for ARP header to pass checks */
342     xARPFrame.xARPHeader.usHardwareType = ipARP_HARDWARE_TYPE_ETHERNET;
343     xARPFrame.xARPHeader.usProtocolType = ipARP_PROTOCOL_TYPE;
344     xARPFrame.xARPHeader.ucHardwareAddressLength = ipMAC_ADDRESS_LENGTH_BYTES;
345     /* Different protocol length. */
346     xARPFrame.xARPHeader.ucProtocolAddressLength = ipIP_ADDRESS_LENGTH_BYTES + 1;
347     pxNetworkBuffer->pucEthernetBuffer = &xARPFrame;
348 
349     /* When the local IP address is 0, we should not process any ARP Packets. */
350     *ipLOCAL_IP_ADDRESS_POINTER = 0UL;
351     eResult = eARPProcessPacket( pxNetworkBuffer );
352     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
353     /* =================================================== */
354 }
355 
test_eARPProcessPacket_SourceMACIsBroadcast(void)356 void test_eARPProcessPacket_SourceMACIsBroadcast( void )
357 {
358     ARPPacket_t xARPFrame = { 0 };
359     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
360     NetworkBufferDescriptor_t * const pxNetworkBuffer = &xNetworkBuffer;
361     uint8_t ucBuffer[ sizeof( IPPacket_t ) + ipBUFFER_PADDING ];
362     eFrameProcessingResult_t eResult;
363     NetworkEndPoint_t xEndPoint = { 0 };
364 
365     memset( &xARPFrame, 0, sizeof( ARPPacket_t ) );
366 
367     /* =================================================== */
368     /* Add settings required for ARP header to pass checks */
369     xARPFrame.xARPHeader.usHardwareType = ipARP_HARDWARE_TYPE_ETHERNET;
370     xARPFrame.xARPHeader.usProtocolType = ipARP_PROTOCOL_TYPE;
371     xARPFrame.xARPHeader.ucHardwareAddressLength = ipMAC_ADDRESS_LENGTH_BYTES;
372     xARPFrame.xARPHeader.ucProtocolAddressLength = ipIP_ADDRESS_LENGTH_BYTES;
373     pxNetworkBuffer->pucEthernetBuffer = &xARPFrame;
374 
375     /* Copy the broadcast MAC address into the sender hardware address. */
376     memcpy( &( xARPFrame.xARPHeader.xSenderHardwareAddress ), &xBroadcastMACAddress, sizeof( MACAddress_t ) );
377     pxNetworkBuffer->pucEthernetBuffer = &xARPFrame;
378 
379     eResult = eARPProcessPacket( pxNetworkBuffer );
380     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
381     /* =================================================== */
382 }
383 
test_eARPProcessPacket_SourceMACIsMulticast(void)384 void test_eARPProcessPacket_SourceMACIsMulticast( void )
385 {
386     ARPPacket_t xARPFrame = { 0 };
387     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
388     NetworkBufferDescriptor_t * const pxNetworkBuffer = &xNetworkBuffer;
389     uint8_t ucBuffer[ sizeof( IPPacket_t ) + ipBUFFER_PADDING ];
390     eFrameProcessingResult_t eResult;
391     NetworkEndPoint_t xEndPoint = { 0 };
392 
393     memset( &xARPFrame, 0, sizeof( ARPPacket_t ) );
394 
395     /* =================================================== */
396     /* Add settings required for ARP header to pass checks */
397     xARPFrame.xARPHeader.usHardwareType = ipARP_HARDWARE_TYPE_ETHERNET;
398     xARPFrame.xARPHeader.usProtocolType = ipARP_PROTOCOL_TYPE;
399     xARPFrame.xARPHeader.ucHardwareAddressLength = ipMAC_ADDRESS_LENGTH_BYTES;
400     xARPFrame.xARPHeader.ucProtocolAddressLength = ipIP_ADDRESS_LENGTH_BYTES;
401 
402     xARPFrame.xARPHeader.xSenderHardwareAddress.ucBytes[ 0 ] = 0x01;
403     pxNetworkBuffer->pucEthernetBuffer = &xARPFrame;
404 
405     eResult = eARPProcessPacket( pxNetworkBuffer );
406     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
407     /* =================================================== */
408 }
409 
test_eARPProcessPacket_IPIsLocalLoopBack(void)410 void test_eARPProcessPacket_IPIsLocalLoopBack( void )
411 {
412     ARPPacket_t xARPFrame = { 0 };
413     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
414     NetworkBufferDescriptor_t * const pxNetworkBuffer = &xNetworkBuffer;
415     uint8_t ucBuffer[ sizeof( IPPacket_t ) + ipBUFFER_PADDING ];
416     eFrameProcessingResult_t eResult;
417     NetworkEndPoint_t xEndPoint = { 0 };
418 
419     memset( &xARPFrame, 0, sizeof( ARPPacket_t ) );
420 
421     /* =================================================== */
422     /* Add settings required for ARP header to pass checks */
423     xARPFrame.xARPHeader.usHardwareType = ipARP_HARDWARE_TYPE_ETHERNET;
424     xARPFrame.xARPHeader.usProtocolType = ipARP_PROTOCOL_TYPE;
425     xARPFrame.xARPHeader.ucHardwareAddressLength = ipMAC_ADDRESS_LENGTH_BYTES;
426     xARPFrame.xARPHeader.ucProtocolAddressLength = ipIP_ADDRESS_LENGTH_BYTES;
427 
428     uint32_t ulSenderProtocolAddress = FreeRTOS_htonl( ipFIRST_LOOPBACK_IPv4 + 10 );
429 
430     memcpy( xARPFrame.xARPHeader.ucSenderProtocolAddress,
431             &ulSenderProtocolAddress,
432             sizeof( ulSenderProtocolAddress ) );
433     pxNetworkBuffer->pucEthernetBuffer = &xARPFrame;
434 
435     eResult = eARPProcessPacket( pxNetworkBuffer );
436     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
437     /* =================================================== */
438 }
439 
test_eARPProcessPacket_SenderIPLessThanLoopBack(void)440 void test_eARPProcessPacket_SenderIPLessThanLoopBack( void )
441 {
442     ARPPacket_t xARPFrame = { 0 };
443     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
444     NetworkBufferDescriptor_t * const pxNetworkBuffer = &xNetworkBuffer;
445     uint8_t ucBuffer[ sizeof( IPPacket_t ) + ipBUFFER_PADDING ];
446     eFrameProcessingResult_t eResult;
447     NetworkEndPoint_t xEndPoint = { 0 };
448 
449     memset( &xARPFrame, 0, sizeof( ARPPacket_t ) );
450 
451     /* =================================================== */
452     /* Add settings required for ARP header to pass checks */
453     xARPFrame.xARPHeader.usHardwareType = ipARP_HARDWARE_TYPE_ETHERNET;
454     xARPFrame.xARPHeader.usProtocolType = ipARP_PROTOCOL_TYPE;
455     xARPFrame.xARPHeader.ucHardwareAddressLength = ipMAC_ADDRESS_LENGTH_BYTES;
456     xARPFrame.xARPHeader.ucProtocolAddressLength = ipIP_ADDRESS_LENGTH_BYTES;
457 
458     uint32_t ulSenderProtocolAddress = FreeRTOS_htonl( ipFIRST_LOOPBACK_IPv4 - 10 );
459 
460     memcpy( xARPFrame.xARPHeader.ucSenderProtocolAddress,
461             &ulSenderProtocolAddress,
462             sizeof( ulSenderProtocolAddress ) );
463     pxNetworkBuffer->pucEthernetBuffer = &xARPFrame;
464     pxNetworkBuffer->pxEndPoint = &xEndPoint;
465 
466     eResult = eARPProcessPacket( pxNetworkBuffer );
467     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
468     /* =================================================== */
469 }
470 
test_eARPProcessPacket_LocalIPisZero(void)471 void test_eARPProcessPacket_LocalIPisZero( void )
472 {
473     ARPPacket_t xARPFrame = { 0 };
474     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
475     NetworkBufferDescriptor_t * const pxNetworkBuffer = &xNetworkBuffer;
476     uint8_t ucBuffer[ sizeof( IPPacket_t ) + ipBUFFER_PADDING ];
477     eFrameProcessingResult_t eResult;
478     NetworkEndPoint_t xEndPoint = { 0 };
479 
480     memset( &xARPFrame, 0, sizeof( ARPPacket_t ) );
481 
482     /* =================================================== */
483     /* Add settings required for ARP header to pass checks */
484     xARPFrame.xARPHeader.usHardwareType = ipARP_HARDWARE_TYPE_ETHERNET;
485     xARPFrame.xARPHeader.usProtocolType = ipARP_PROTOCOL_TYPE;
486     xARPFrame.xARPHeader.ucHardwareAddressLength = ipMAC_ADDRESS_LENGTH_BYTES;
487     xARPFrame.xARPHeader.ucProtocolAddressLength = ipIP_ADDRESS_LENGTH_BYTES;
488     memset( &xARPFrame.xARPHeader.ucSenderProtocolAddress, 0xC0, sizeof( xARPFrame.xARPHeader.ucSenderProtocolAddress ) );
489     xARPFrame.xARPHeader.ulTargetProtocolAddress = 0xC0C0C0C0;
490     pxNetworkBuffer->pucEthernetBuffer = &xARPFrame;
491     pxNetworkBuffer->pxEndPoint = &xEndPoint;
492     xEndPoint.ipv4_settings.ulIPAddress = 0;
493 
494     eResult = eARPProcessPacket( pxNetworkBuffer );
495     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
496     /* =================================================== */
497 }
498 
test_eARPProcessPacket_InvalidOperation(void)499 void test_eARPProcessPacket_InvalidOperation( void )
500 {
501     ARPPacket_t xARPFrame = { 0 };
502     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
503     NetworkBufferDescriptor_t * const pxNetworkBuffer = &xNetworkBuffer;
504     uint8_t ucBuffer[ sizeof( IPPacket_t ) + ipBUFFER_PADDING ];
505     eFrameProcessingResult_t eResult;
506     NetworkEndPoint_t xEndPoint = { 0 };
507 
508     xEndPoint.bits.bEndPointUp = pdTRUE_UNSIGNED;
509     xEndPoint.ipv4_settings.ulIPAddress = 0xAABBCCDD;
510 
511     memset( &xARPFrame, 0, sizeof( ARPPacket_t ) );
512     /* =================================================== */
513     /* Add settings required for ARP header to pass checks */
514     xARPFrame.xARPHeader.usHardwareType = ipARP_HARDWARE_TYPE_ETHERNET;
515     xARPFrame.xARPHeader.usProtocolType = ipARP_PROTOCOL_TYPE;
516     xARPFrame.xARPHeader.ucHardwareAddressLength = ipMAC_ADDRESS_LENGTH_BYTES;
517     xARPFrame.xARPHeader.ucProtocolAddressLength = ipIP_ADDRESS_LENGTH_BYTES;
518     xARPFrame.xARPHeader.ulTargetProtocolAddress = *ipLOCAL_IP_ADDRESS_POINTER + 0x11;
519     memcpy( xARPFrame.xARPHeader.ucSenderProtocolAddress, &( xARPFrame.xARPHeader.ulTargetProtocolAddress ), sizeof( xARPFrame.xARPHeader.ulTargetProtocolAddress ) );
520 
521     /* What if some invalid option is sent in the ARP Packet? */
522     *ipLOCAL_IP_ADDRESS_POINTER = 0xAABBCCDD;
523     /* Add invalid operation */
524     xARPFrame.xARPHeader.usOperation = ipARP_REQUEST | ipARP_REPLY;
525     pxNetworkBuffer->pucEthernetBuffer = &xARPFrame;
526     pxNetworkBuffer->pxEndPoint = &xEndPoint;
527 
528     eResult = eARPProcessPacket( pxNetworkBuffer );
529     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
530 }
531 
test_eARPProcessPacket_Request_DifferentIP(void)532 void test_eARPProcessPacket_Request_DifferentIP( void )
533 {
534     ARPPacket_t xARPFrame = { 0 };
535     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
536     NetworkBufferDescriptor_t * const pxNetworkBuffer = &xNetworkBuffer;
537     uint8_t ucBuffer[ sizeof( IPPacket_t ) + ipBUFFER_PADDING ];
538     eFrameProcessingResult_t eResult;
539     NetworkEndPoint_t xEndPoint = { 0 };
540 
541     memset( &xARPFrame, 0, sizeof( ARPPacket_t ) );
542 
543     /* Process an ARP request, but not meant for this node. */
544     /* Add settings required for ARP header to pass checks */
545     xARPFrame.xARPHeader.usHardwareType = ipARP_HARDWARE_TYPE_ETHERNET;
546     xARPFrame.xARPHeader.usProtocolType = ipARP_PROTOCOL_TYPE;
547     xARPFrame.xARPHeader.ucHardwareAddressLength = ipMAC_ADDRESS_LENGTH_BYTES;
548     xARPFrame.xARPHeader.ucProtocolAddressLength = ipIP_ADDRESS_LENGTH_BYTES;
549 
550     xEndPoint.ipv4_settings.ulIPAddress = 0xAABBCCDD;
551     /* Fill in the request option. */
552     xARPFrame.xARPHeader.usOperation = ipARP_REQUEST;
553     xARPFrame.xARPHeader.ulTargetProtocolAddress = *ipLOCAL_IP_ADDRESS_POINTER + 0x11;
554     pxNetworkBuffer->pucEthernetBuffer = &xARPFrame;
555     pxNetworkBuffer->pxEndPoint = &xEndPoint;
556     xEndPoint.bits.bEndPointUp = pdTRUE_UNSIGNED;
557 
558     FreeRTOS_FindEndPointOnNetMask_IgnoreAndReturn( 1 );
559     eResult = eARPProcessPacket( pxNetworkBuffer );
560     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
561     /* =================================================== */
562 }
563 
test_eARPProcessPacket_Request_SenderMACSameAsLocalMAC(void)564 void test_eARPProcessPacket_Request_SenderMACSameAsLocalMAC( void )
565 {
566     ARPPacket_t xARPFrame = { 0 };
567     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
568     NetworkBufferDescriptor_t * const pxNetworkBuffer = &xNetworkBuffer;
569     uint8_t ucBuffer[ sizeof( IPPacket_t ) + ipBUFFER_PADDING ];
570     eFrameProcessingResult_t eResult;
571     NetworkEndPoint_t xEndPoint = { 0 };
572 
573     memset( &xARPFrame, 0, sizeof( ARPPacket_t ) );
574 
575     /* Process an ARP request, but not meant for this node. */
576     /* Add settings required for ARP header to pass checks */
577     xARPFrame.xARPHeader.usHardwareType = ipARP_HARDWARE_TYPE_ETHERNET;
578     xARPFrame.xARPHeader.usProtocolType = ipARP_PROTOCOL_TYPE;
579     xARPFrame.xARPHeader.ucHardwareAddressLength = ipMAC_ADDRESS_LENGTH_BYTES;
580     xARPFrame.xARPHeader.ucProtocolAddressLength = ipIP_ADDRESS_LENGTH_BYTES;
581 
582     memset( ipLOCAL_MAC_ADDRESS, 0x22, sizeof( MACAddress_t ) );
583     memcpy( &( xARPFrame.xARPHeader.xSenderHardwareAddress ), ipLOCAL_MAC_ADDRESS, sizeof( MACAddress_t ) );
584 
585     xEndPoint.ipv4_settings.ulIPAddress = 0xAABBCCDD;
586     /* Fill in the request option. */
587     xARPFrame.xARPHeader.usOperation = ipARP_REQUEST;
588     xARPFrame.xARPHeader.ulTargetProtocolAddress = xEndPoint.ipv4_settings.ulIPAddress;
589     pxNetworkBuffer->pucEthernetBuffer = &xARPFrame;
590     pxNetworkBuffer->pxEndPoint = &xEndPoint;
591     xEndPoint.bits.bEndPointUp = pdTRUE_UNSIGNED;
592 
593     FreeRTOS_FindEndPointOnNetMask_IgnoreAndReturn( 1 );
594     eResult = eARPProcessPacket( pxNetworkBuffer );
595     TEST_ASSERT_EQUAL( eReturnEthernetFrame, eResult );
596 }
597 
test_eARPProcessPacket_Request_SenderAndTargetDifferent(void)598 void test_eARPProcessPacket_Request_SenderAndTargetDifferent( void )
599 {
600     ARPPacket_t xARPFrame = { 0 };
601     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
602     NetworkBufferDescriptor_t * const pxNetworkBuffer = &xNetworkBuffer;
603     uint8_t ucBuffer[ sizeof( IPPacket_t ) + ipBUFFER_PADDING ];
604     eFrameProcessingResult_t eResult;
605     NetworkEndPoint_t xEndPoint = { 0 };
606 
607     memset( &xARPFrame, 0, sizeof( ARPPacket_t ) );
608 
609     /* =================================================== */
610     /* Add settings required for ARP header to pass checks */
611     xARPFrame.xARPHeader.usHardwareType = ipARP_HARDWARE_TYPE_ETHERNET;
612     xARPFrame.xARPHeader.usProtocolType = ipARP_PROTOCOL_TYPE;
613     xARPFrame.xARPHeader.ucHardwareAddressLength = ipMAC_ADDRESS_LENGTH_BYTES;
614     xARPFrame.xARPHeader.ucProtocolAddressLength = ipIP_ADDRESS_LENGTH_BYTES;
615 
616     /* Process an ARP request - meant for this node with target and source different. */
617     xEndPoint.ipv4_settings.ulIPAddress = 0xAABBCCDD;
618     /* Fill in the request option. */
619     xARPFrame.xARPHeader.usOperation = ipARP_REQUEST;
620     xARPFrame.xARPHeader.ulTargetProtocolAddress = xEndPoint.ipv4_settings.ulIPAddress;
621     memcpy( xARPFrame.xARPHeader.ucSenderProtocolAddress, &( xARPFrame.xARPHeader.ulTargetProtocolAddress ), sizeof( xARPFrame.xARPHeader.ulTargetProtocolAddress ) );
622     /* Make sure the the destination and source IP addresses are different. */
623     xARPFrame.xARPHeader.ucSenderProtocolAddress[ 0 ]++;
624 
625     memset( &( xARPFrame.xARPHeader.xSenderHardwareAddress.ucBytes ), 0x22, sizeof( MACAddress_t ) );
626 
627     xEndPoint.bits.bEndPointUp = pdTRUE_UNSIGNED;
628     xNetworkBuffer.pucEthernetBuffer = &xARPFrame;
629     xNetworkBuffer.xDataLength = sizeof( ARPPacket_t );
630     xNetworkBuffer.pxEndPoint = &xEndPoint;
631     pxNetworkBuffer->pxEndPoint = &xEndPoint;
632 
633     FreeRTOS_FindEndPointOnNetMask_IgnoreAndReturn( 1 );
634     eResult = eARPProcessPacket( pxNetworkBuffer );
635     TEST_ASSERT_EQUAL( eReturnEthernetFrame, eResult );
636     /* =================================================== */
637 
638     /* Fill in the request option. */
639 
640     memcpy( &( xEndPoint.xMACAddress.ucBytes ), &( xARPFrame.xARPHeader.xSenderHardwareAddress.ucBytes ), ipMAC_ADDRESS_LENGTH_BYTES );
641     xEndPoint.ipv4_settings.ulIPAddress = xARPFrame.xARPHeader.ulTargetProtocolAddress;
642     xARPFrame.xARPHeader.usOperation = ipARP_REQUEST;
643 
644     eResult = eARPProcessPacket( &xNetworkBuffer );
645     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
646 }
647 
test_eARPProcessPacket_Request_SenderAndTargetSame(void)648 void test_eARPProcessPacket_Request_SenderAndTargetSame( void )
649 {
650     ARPPacket_t xARPFrame = { 0 };
651     eFrameProcessingResult_t eResult;
652     NetworkInterface_t xInterface;
653     struct xNetworkEndPoint xEndPoint = { 0 };
654     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
655 
656     memset( &xARPFrame, 0, sizeof( ARPPacket_t ) );
657 
658     /* =================================================== */
659     /* Add settings required for ARP header to pass checks */
660     xARPFrame.xARPHeader.usHardwareType = ipARP_HARDWARE_TYPE_ETHERNET;
661     xARPFrame.xARPHeader.usProtocolType = ipARP_PROTOCOL_TYPE;
662     xARPFrame.xARPHeader.ucHardwareAddressLength = ipMAC_ADDRESS_LENGTH_BYTES;
663     xARPFrame.xARPHeader.ucProtocolAddressLength = ipIP_ADDRESS_LENGTH_BYTES;
664 
665     /* Process an ARP request - meant for this node with target and source same. */
666     xEndPoint.ipv4_settings.ulIPAddress = 0xAABBCCDD;
667     /* Fill in the request option. */
668     xARPFrame.xARPHeader.usOperation = ipARP_REQUEST;
669     xARPFrame.xARPHeader.ulTargetProtocolAddress = xEndPoint.ipv4_settings.ulIPAddress;
670     memcpy( xARPFrame.xARPHeader.ucSenderProtocolAddress, &( xARPFrame.xARPHeader.ulTargetProtocolAddress ), sizeof( xARPFrame.xARPHeader.ulTargetProtocolAddress ) );
671 
672     memset( &( xARPFrame.xARPHeader.xSenderHardwareAddress.ucBytes ), 0x22, sizeof( MACAddress_t ) );
673 
674     /* Reset the private variable uxARPClashCounter. */
675     vResetARPClashCounter();
676 
677     FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, NULL );
678 
679     /* The value returned doesn't matter as this will determine when would the
680      * next timeout for Gratuitous ARP occur. And for this unit-test, that doesn't
681      * matter. */
682     xTaskGetTickCount_ExpectAndReturn( 100 );
683 
684     /* This function will setup the timeout which is used to limit the number of defensive
685      * ARPs. */
686     vTaskSetTimeOutState_ExpectAnyArgs();
687     FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( &xEndPoint );
688 
689     xNetworkBuffer.pucEthernetBuffer = &xARPFrame;
690     xNetworkBuffer.xDataLength = sizeof( ARPPacket_t );
691     xNetworkBuffer.pxEndPoint = &xEndPoint;
692     xEndPoint.bits.bEndPointUp = pdTRUE_UNSIGNED;
693 
694     eResult = eARPProcessPacket( &xNetworkBuffer );
695     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
696     /* =================================================== */
697 }
698 
699 /**
700  * @brief This function verify receiving Gratuitous ARP packet
701  *        and updating the ARP cache with respect to the new ARP request.
702  */
test_eARPProcessPacket_Request_GratuitousARP(void)703 void test_eARPProcessPacket_Request_GratuitousARP( void )
704 {
705     ARPPacket_t xARPFrame = { 0 };
706     eFrameProcessingResult_t eResult;
707     NetworkInterface_t xInterface;
708     struct xNetworkEndPoint xEndPoint = { 0 };
709     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
710     uint32_t ulTargetIP = 0xAACCDDBB;
711 
712     memset( &xARPFrame, 0, sizeof( ARPPacket_t ) );
713     memset( xARPCache, 0, sizeof( xARPCache ) );
714 
715     /* =================================================== */
716     /* Add settings required for ARP header to pass checks */
717     xARPFrame.xARPHeader.usHardwareType = ipARP_HARDWARE_TYPE_ETHERNET;
718     xARPFrame.xARPHeader.usProtocolType = ipARP_PROTOCOL_TYPE;
719     xARPFrame.xARPHeader.ucHardwareAddressLength = ipMAC_ADDRESS_LENGTH_BYTES;
720     xARPFrame.xARPHeader.ucProtocolAddressLength = ipIP_ADDRESS_LENGTH_BYTES;
721 
722     /* Process an ARP request - meant for this node with target and source same. */
723     xEndPoint.ipv4_settings.ulIPAddress = 0xAABBCCDD;
724     /* Fill in the request option. */
725     xARPFrame.xARPHeader.usOperation = ipARP_REQUEST;
726     xARPFrame.xARPHeader.ulTargetProtocolAddress = ulTargetIP;
727     memcpy( xARPFrame.xARPHeader.ucSenderProtocolAddress, &( xARPFrame.xARPHeader.ulTargetProtocolAddress ), sizeof( xARPFrame.xARPHeader.ulTargetProtocolAddress ) );
728 
729     memset( &( xARPFrame.xARPHeader.xSenderHardwareAddress.ucBytes ), 0x22, sizeof( MACAddress_t ) );
730 
731     xARPCache[ 0 ].ulIPAddress = ulTargetIP;
732     xARPCache[ 0 ].ucAge = 1;
733     xARPCache[ 0 ].ucValid = pdTRUE;
734     memset( xARPCache[ 0 ].xMACAddress.ucBytes, 0x34, sizeof( xARPCache[ 0 ].xMACAddress.ucBytes ) );
735     xARPCache[ 0 ].pxEndPoint = &xEndPoint;
736 
737     memset( &( xARPFrame.xARPHeader.xTargetHardwareAddress.ucBytes ), 0xff, sizeof( MACAddress_t ) );
738 
739     /* Reset the private variable uxARPClashCounter. */
740     vResetARPClashCounter();
741 
742     FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( &xEndPoint );
743     xIsIPv4Multicast_ExpectAndReturn( ulTargetIP, 0UL );
744     FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( &xEndPoint );
745     FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( &xEndPoint );
746 
747     xNetworkBuffer.pucEthernetBuffer = &xARPFrame;
748     xNetworkBuffer.xDataLength = sizeof( ARPPacket_t );
749     xNetworkBuffer.pxEndPoint = &xEndPoint;
750     xEndPoint.bits.bEndPointUp = pdTRUE_UNSIGNED;
751 
752     eResult = eARPProcessPacket( &xNetworkBuffer );
753     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
754     TEST_ASSERT_EQUAL( ulTargetIP, xARPCache[ 0 ].ulIPAddress );
755     TEST_ASSERT_EQUAL( ipconfigMAX_ARP_AGE, xARPCache[ 0 ].ucAge );
756     TEST_ASSERT_EQUAL( pdTRUE, xARPCache[ 0 ].ucValid );
757     TEST_ASSERT_EQUAL( &xEndPoint, xARPCache[ 0 ].pxEndPoint );
758     TEST_ASSERT_EQUAL_MEMORY( &( xARPFrame.xARPHeader.xSenderHardwareAddress.ucBytes ), xARPCache[ 0 ].xMACAddress.ucBytes, sizeof( xARPCache[ 0 ].xMACAddress.ucBytes ) );
759     /* =================================================== */
760 }
761 
762 /**
763  * @brief This function verify receiving Gratuitous ARP packet
764  *        and updating the ARP cache with respect to the new ARP request
765  *        where there is no change in the MAC address compared to what is present
766  *        in the ARP cache.
767  */
test_eARPProcessPacket_Request_GratuitousARP_MACUnchanged(void)768 void test_eARPProcessPacket_Request_GratuitousARP_MACUnchanged( void )
769 {
770     ARPPacket_t xARPFrame = { 0 };
771     eFrameProcessingResult_t eResult;
772     NetworkInterface_t xInterface;
773     struct xNetworkEndPoint xEndPoint = { 0 };
774     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
775     uint32_t ulTargetIP = 0xAACCDDBB;
776 
777     memset( &xARPFrame, 0, sizeof( ARPPacket_t ) );
778     memset( xARPCache, 0, sizeof( xARPCache ) );
779 
780     /* =================================================== */
781     /* Add settings required for ARP header to pass checks */
782     xARPFrame.xARPHeader.usHardwareType = ipARP_HARDWARE_TYPE_ETHERNET;
783     xARPFrame.xARPHeader.usProtocolType = ipARP_PROTOCOL_TYPE;
784     xARPFrame.xARPHeader.ucHardwareAddressLength = ipMAC_ADDRESS_LENGTH_BYTES;
785     xARPFrame.xARPHeader.ucProtocolAddressLength = ipIP_ADDRESS_LENGTH_BYTES;
786 
787     /* Process an ARP request - meant for this node with target and source same. */
788     xEndPoint.ipv4_settings.ulIPAddress = 0xAABBCCDD;
789     /* Fill in the request option. */
790     xARPFrame.xARPHeader.usOperation = ipARP_REQUEST;
791     xARPFrame.xARPHeader.ulTargetProtocolAddress = ulTargetIP;
792     memcpy( xARPFrame.xARPHeader.ucSenderProtocolAddress, &( xARPFrame.xARPHeader.ulTargetProtocolAddress ), sizeof( xARPFrame.xARPHeader.ulTargetProtocolAddress ) );
793 
794     memset( &( xARPFrame.xARPHeader.xSenderHardwareAddress.ucBytes ), 0x22, sizeof( MACAddress_t ) );
795 
796     xARPCache[ 0 ].ulIPAddress = ulTargetIP;
797     xARPCache[ 0 ].ucAge = 1;
798     xARPCache[ 0 ].ucValid = pdTRUE;
799     memset( xARPCache[ 0 ].xMACAddress.ucBytes, 0x22, sizeof( xARPCache[ 0 ].xMACAddress.ucBytes ) );
800     xARPCache[ 0 ].pxEndPoint = &xEndPoint;
801 
802     /* Reset the private variable uxARPClashCounter. */
803     vResetARPClashCounter();
804 
805     FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( &xEndPoint );
806     xIsIPv4Multicast_ExpectAndReturn( ulTargetIP, 0UL );
807     FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( &xEndPoint );
808     FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( &xEndPoint );
809 
810     xNetworkBuffer.pucEthernetBuffer = &xARPFrame;
811     xNetworkBuffer.xDataLength = sizeof( ARPPacket_t );
812     xNetworkBuffer.pxEndPoint = &xEndPoint;
813     xEndPoint.bits.bEndPointUp = pdTRUE_UNSIGNED;
814 
815     eResult = eARPProcessPacket( &xNetworkBuffer );
816     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
817     TEST_ASSERT_EQUAL( ulTargetIP, xARPCache[ 0 ].ulIPAddress );
818     TEST_ASSERT_EQUAL( ipconfigMAX_ARP_AGE, xARPCache[ 0 ].ucAge );
819     TEST_ASSERT_EQUAL( pdTRUE, xARPCache[ 0 ].ucValid );
820     TEST_ASSERT_EQUAL( &xEndPoint, xARPCache[ 0 ].pxEndPoint );
821     TEST_ASSERT_EQUAL_MEMORY( &( xARPFrame.xARPHeader.xSenderHardwareAddress.ucBytes ), xARPCache[ 0 ].xMACAddress.ucBytes, sizeof( xARPCache[ 0 ].xMACAddress.ucBytes ) );
822     /* =================================================== */
823 }
824 
825 /**
826  * @brief This function verify receiving Gratuitous ARP packet
827  *        but the sender protocol address is outside the subnet.
828  */
test_eARPProcessPacket_Request_GratuitousARP_OutOfSubnetIP(void)829 void test_eARPProcessPacket_Request_GratuitousARP_OutOfSubnetIP( void )
830 {
831     ARPPacket_t xARPFrame = { 0 };
832     eFrameProcessingResult_t eResult;
833     NetworkInterface_t xInterface;
834     struct xNetworkEndPoint xEndPoint = { 0 };
835     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
836     uint32_t ulTargetIP = 0xAACCDDBB;
837 
838     memset( &xARPFrame, 0, sizeof( ARPPacket_t ) );
839     memset( xARPCache, 0, sizeof( xARPCache ) );
840 
841     /* =================================================== */
842     /* Add settings required for ARP header to pass checks */
843     xARPFrame.xARPHeader.usHardwareType = ipARP_HARDWARE_TYPE_ETHERNET;
844     xARPFrame.xARPHeader.usProtocolType = ipARP_PROTOCOL_TYPE;
845     xARPFrame.xARPHeader.ucHardwareAddressLength = ipMAC_ADDRESS_LENGTH_BYTES;
846     xARPFrame.xARPHeader.ucProtocolAddressLength = ipIP_ADDRESS_LENGTH_BYTES;
847 
848     /* Process an ARP request - meant for this node with target and source same. */
849     xEndPoint.ipv4_settings.ulIPAddress = 0xAABBCCDD;
850     xEndPoint.ipv4_settings.ulNetMask = 0xFFFF0000;
851     /* Fill in the request option. */
852     xARPFrame.xARPHeader.usOperation = ipARP_REQUEST;
853     xARPFrame.xARPHeader.ulTargetProtocolAddress = ulTargetIP;
854     memcpy( xARPFrame.xARPHeader.ucSenderProtocolAddress, &( xARPFrame.xARPHeader.ulTargetProtocolAddress ), sizeof( xARPFrame.xARPHeader.ulTargetProtocolAddress ) );
855 
856     memset( &( xARPFrame.xARPHeader.xSenderHardwareAddress.ucBytes ), 0x22, sizeof( MACAddress_t ) );
857 
858     xARPCache[ 0 ].ulIPAddress = ulTargetIP;
859     xARPCache[ 0 ].ucAge = 1;
860     xARPCache[ 0 ].ucValid = pdTRUE;
861     memset( xARPCache[ 0 ].xMACAddress.ucBytes, 0x22, sizeof( xARPCache[ 0 ].xMACAddress.ucBytes ) );
862     xARPCache[ 0 ].pxEndPoint = &xEndPoint;
863 
864     /* Reset the private variable uxARPClashCounter. */
865     vResetARPClashCounter();
866 
867     xNetworkBuffer.pucEthernetBuffer = &xARPFrame;
868     xNetworkBuffer.xDataLength = sizeof( ARPPacket_t );
869     xNetworkBuffer.pxEndPoint = &xEndPoint;
870     xEndPoint.bits.bEndPointUp = pdTRUE_UNSIGNED;
871 
872     eResult = eARPProcessPacket( &xNetworkBuffer );
873     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
874     TEST_ASSERT_EQUAL( ulTargetIP, xARPCache[ 0 ].ulIPAddress );
875     TEST_ASSERT_EQUAL( 1, xARPCache[ 0 ].ucAge );
876     TEST_ASSERT_EQUAL( pdTRUE, xARPCache[ 0 ].ucValid );
877     TEST_ASSERT_EQUAL( &xEndPoint, xARPCache[ 0 ].pxEndPoint );
878     TEST_ASSERT_EQUAL_MEMORY( &( xARPFrame.xARPHeader.xSenderHardwareAddress.ucBytes ), xARPCache[ 0 ].xMACAddress.ucBytes, sizeof( xARPCache[ 0 ].xMACAddress.ucBytes ) );
879     /* =================================================== */
880 }
881 
882 /**
883  * @brief This function verify receiving Gratuitous ARP packet
884  *        but the new MAC address matches with the MAC address of the
885  *        endpoint.
886  */
test_eARPProcessPacket_Request_GratuitousARP_MACMatchesWithEndpoint(void)887 void test_eARPProcessPacket_Request_GratuitousARP_MACMatchesWithEndpoint( void )
888 {
889     ARPPacket_t xARPFrame = { 0 };
890     eFrameProcessingResult_t eResult;
891     NetworkInterface_t xInterface;
892     struct xNetworkEndPoint xEndPoint = { 0 };
893     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
894     uint32_t ulTargetIP = 0xAACCDDBB;
895 
896     memset( &xARPFrame, 0, sizeof( ARPPacket_t ) );
897     memset( xARPCache, 0, sizeof( xARPCache ) );
898 
899     /* =================================================== */
900     /* Add settings required for ARP header to pass checks */
901     xARPFrame.xARPHeader.usHardwareType = ipARP_HARDWARE_TYPE_ETHERNET;
902     xARPFrame.xARPHeader.usProtocolType = ipARP_PROTOCOL_TYPE;
903     xARPFrame.xARPHeader.ucHardwareAddressLength = ipMAC_ADDRESS_LENGTH_BYTES;
904     xARPFrame.xARPHeader.ucProtocolAddressLength = ipIP_ADDRESS_LENGTH_BYTES;
905 
906     /* Process an ARP request - meant for this node with target and source same. */
907     xEndPoint.ipv4_settings.ulIPAddress = 0xAABBCCDD;
908     xEndPoint.ipv4_settings.ulNetMask = 0;
909     memset( xEndPoint.xMACAddress.ucBytes, 0x22, sizeof( xARPCache[ 0 ].xMACAddress.ucBytes ) );
910     /* Fill in the request option. */
911     xARPFrame.xARPHeader.usOperation = ipARP_REQUEST;
912     xARPFrame.xARPHeader.ulTargetProtocolAddress = ulTargetIP;
913     memcpy( xARPFrame.xARPHeader.ucSenderProtocolAddress, &( xARPFrame.xARPHeader.ulTargetProtocolAddress ), sizeof( xARPFrame.xARPHeader.ulTargetProtocolAddress ) );
914 
915     memset( &( xARPFrame.xARPHeader.xSenderHardwareAddress.ucBytes ), 0x22, sizeof( MACAddress_t ) );
916 
917     xARPCache[ 0 ].ulIPAddress = ulTargetIP;
918     xARPCache[ 0 ].ucAge = 1;
919     xARPCache[ 0 ].ucValid = pdTRUE;
920     memset( xARPCache[ 0 ].xMACAddress.ucBytes, 0x22, sizeof( xARPCache[ 0 ].xMACAddress.ucBytes ) );
921     xARPCache[ 0 ].pxEndPoint = &xEndPoint;
922 
923     /* Reset the private variable uxARPClashCounter. */
924     vResetARPClashCounter();
925 
926     xNetworkBuffer.pucEthernetBuffer = &xARPFrame;
927     xNetworkBuffer.xDataLength = sizeof( ARPPacket_t );
928     xNetworkBuffer.pxEndPoint = &xEndPoint;
929     xEndPoint.bits.bEndPointUp = pdTRUE_UNSIGNED;
930 
931     eResult = eARPProcessPacket( &xNetworkBuffer );
932     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
933     TEST_ASSERT_EQUAL( ulTargetIP, xARPCache[ 0 ].ulIPAddress );
934     TEST_ASSERT_EQUAL( 1, xARPCache[ 0 ].ucAge );
935     TEST_ASSERT_EQUAL( pdTRUE, xARPCache[ 0 ].ucValid );
936     TEST_ASSERT_EQUAL( &xEndPoint, xARPCache[ 0 ].pxEndPoint );
937     TEST_ASSERT_EQUAL_MEMORY( &( xARPFrame.xARPHeader.xSenderHardwareAddress.ucBytes ), xARPCache[ 0 ].xMACAddress.ucBytes, sizeof( xARPCache[ 0 ].xMACAddress.ucBytes ) );
938     /* =================================================== */
939 }
940 
941 /**
942  * @brief This function verify receiving Gratuitous ARP packet
943  *        but the target MAC address in the ARP request is not a
944  *        broadcast address.
945  */
test_eARPProcessPacket_Request_GratuitousARP_TargetHWAddressNotBroadcast(void)946 void test_eARPProcessPacket_Request_GratuitousARP_TargetHWAddressNotBroadcast( void )
947 {
948     ARPPacket_t xARPFrame = { 0 };
949     eFrameProcessingResult_t eResult;
950     NetworkInterface_t xInterface;
951     struct xNetworkEndPoint xEndPoint = { 0 };
952     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
953     uint32_t ulTargetIP = 0xAACCDDBB;
954 
955     memset( &xARPFrame, 0, sizeof( ARPPacket_t ) );
956     memset( xARPCache, 0, sizeof( xARPCache ) );
957 
958     /* =================================================== */
959     /* Add settings required for ARP header to pass checks */
960     xARPFrame.xARPHeader.usHardwareType = ipARP_HARDWARE_TYPE_ETHERNET;
961     xARPFrame.xARPHeader.usProtocolType = ipARP_PROTOCOL_TYPE;
962     xARPFrame.xARPHeader.ucHardwareAddressLength = ipMAC_ADDRESS_LENGTH_BYTES;
963     xARPFrame.xARPHeader.ucProtocolAddressLength = ipIP_ADDRESS_LENGTH_BYTES;
964 
965     /* Process an ARP request - meant for this node with target and source same. */
966     xEndPoint.ipv4_settings.ulIPAddress = 0xAABBCCDD;
967     xEndPoint.ipv4_settings.ulNetMask = 0;
968     memset( xEndPoint.xMACAddress.ucBytes, 0x22, sizeof( xARPCache[ 0 ].xMACAddress.ucBytes ) );
969     /* Fill in the request option. */
970     xARPFrame.xARPHeader.usOperation = ipARP_REQUEST;
971     xARPFrame.xARPHeader.ulTargetProtocolAddress = ulTargetIP;
972     memcpy( xARPFrame.xARPHeader.ucSenderProtocolAddress, &( xARPFrame.xARPHeader.ulTargetProtocolAddress ), sizeof( xARPFrame.xARPHeader.ulTargetProtocolAddress ) );
973 
974     memset( &( xARPFrame.xARPHeader.xSenderHardwareAddress.ucBytes ), 0x22, sizeof( MACAddress_t ) );
975     memset( &( xARPFrame.xARPHeader.xTargetHardwareAddress.ucBytes ), 0x11, sizeof( MACAddress_t ) );
976 
977     xARPCache[ 0 ].ulIPAddress = ulTargetIP;
978     xARPCache[ 0 ].ucAge = 1;
979     xARPCache[ 0 ].ucValid = pdTRUE;
980     memset( xARPCache[ 0 ].xMACAddress.ucBytes, 0x22, sizeof( xARPCache[ 0 ].xMACAddress.ucBytes ) );
981     xARPCache[ 0 ].pxEndPoint = &xEndPoint;
982 
983     /* Reset the private variable uxARPClashCounter. */
984     vResetARPClashCounter();
985 
986     xNetworkBuffer.pucEthernetBuffer = &xARPFrame;
987     xNetworkBuffer.xDataLength = sizeof( ARPPacket_t );
988     xNetworkBuffer.pxEndPoint = &xEndPoint;
989     xEndPoint.bits.bEndPointUp = pdTRUE_UNSIGNED;
990 
991     eResult = eARPProcessPacket( &xNetworkBuffer );
992     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
993     TEST_ASSERT_EQUAL( ulTargetIP, xARPCache[ 0 ].ulIPAddress );
994     TEST_ASSERT_EQUAL( 1, xARPCache[ 0 ].ucAge );
995     TEST_ASSERT_EQUAL( pdTRUE, xARPCache[ 0 ].ucValid );
996     TEST_ASSERT_EQUAL( &xEndPoint, xARPCache[ 0 ].pxEndPoint );
997     TEST_ASSERT_EQUAL_MEMORY( &( xARPFrame.xARPHeader.xSenderHardwareAddress.ucBytes ), xARPCache[ 0 ].xMACAddress.ucBytes, sizeof( xARPCache[ 0 ].xMACAddress.ucBytes ) );
998     /* =================================================== */
999 }
1000 
1001 
1002 /**
1003  * @brief This function verify receiving Gratuitous ARP packet
1004  *        but the packet is received in a different endpoint compared
1005  *        to the entry present in the ARP cache. Hence its supposed to
1006  *        be not updated in the ARP cache.
1007  */
test_eARPProcessPacket_Request_GratuitousARP_NonMatchingEndpoint(void)1008 void test_eARPProcessPacket_Request_GratuitousARP_NonMatchingEndpoint( void )
1009 {
1010     ARPPacket_t xARPFrame = { 0 };
1011     eFrameProcessingResult_t eResult;
1012     NetworkInterface_t xInterface;
1013     struct xNetworkEndPoint xEndPoint = { 0 };
1014     struct xNetworkEndPoint xEndPoint2 = { 0 };
1015     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
1016     uint32_t ulTargetIP = 0xAACCDDBB;
1017     uint8_t ucMAC[ 6 ] = { 0x34, 0x34, 0x34, 0x34, 0x34, 0x34 };
1018 
1019     memset( &xARPFrame, 0, sizeof( ARPPacket_t ) );
1020     memset( xARPCache, 0, sizeof( xARPCache ) );
1021 
1022     /* =================================================== */
1023     /* Add settings required for ARP header to pass checks */
1024     xARPFrame.xARPHeader.usHardwareType = ipARP_HARDWARE_TYPE_ETHERNET;
1025     xARPFrame.xARPHeader.usProtocolType = ipARP_PROTOCOL_TYPE;
1026     xARPFrame.xARPHeader.ucHardwareAddressLength = ipMAC_ADDRESS_LENGTH_BYTES;
1027     xARPFrame.xARPHeader.ucProtocolAddressLength = ipIP_ADDRESS_LENGTH_BYTES;
1028 
1029     /* Process an ARP request - meant for this node with target and source same. */
1030     xEndPoint.ipv4_settings.ulIPAddress = 0xAABBCCDD;
1031     /* Fill in the request option. */
1032     xARPFrame.xARPHeader.usOperation = ipARP_REQUEST;
1033     xARPFrame.xARPHeader.ulTargetProtocolAddress = ulTargetIP;
1034     memcpy( xARPFrame.xARPHeader.ucSenderProtocolAddress, &( xARPFrame.xARPHeader.ulTargetProtocolAddress ), sizeof( xARPFrame.xARPHeader.ulTargetProtocolAddress ) );
1035 
1036     memset( &( xARPFrame.xARPHeader.xSenderHardwareAddress.ucBytes ), 0x22, sizeof( MACAddress_t ) );
1037 
1038     xARPCache[ 0 ].ulIPAddress = ulTargetIP;
1039     xARPCache[ 0 ].ucAge = 1;
1040     xARPCache[ 0 ].ucValid = pdTRUE;
1041     memset( xARPCache[ 0 ].xMACAddress.ucBytes, 0x34, sizeof( xARPCache[ 0 ].xMACAddress.ucBytes ) );
1042     xARPCache[ 0 ].pxEndPoint = &xEndPoint2;
1043 
1044     /* Reset the private variable uxARPClashCounter. */
1045     vResetARPClashCounter();
1046 
1047     FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( &xEndPoint );
1048     xIsIPv4Multicast_ExpectAndReturn( ulTargetIP, 0UL );
1049     FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( &xEndPoint );
1050 
1051     xNetworkBuffer.pucEthernetBuffer = &xARPFrame;
1052     xNetworkBuffer.xDataLength = sizeof( ARPPacket_t );
1053     xNetworkBuffer.pxEndPoint = &xEndPoint;
1054     xEndPoint.bits.bEndPointUp = pdTRUE_UNSIGNED;
1055 
1056     eResult = eARPProcessPacket( &xNetworkBuffer );
1057     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
1058     TEST_ASSERT_EQUAL( ulTargetIP, xARPCache[ 0 ].ulIPAddress );
1059     TEST_ASSERT_EQUAL( 1, xARPCache[ 0 ].ucAge );
1060     TEST_ASSERT_EQUAL( pdTRUE, xARPCache[ 0 ].ucValid );
1061     TEST_ASSERT_EQUAL( &xEndPoint2, xARPCache[ 0 ].pxEndPoint );
1062     TEST_ASSERT_EQUAL_MEMORY( ucMAC, xARPCache[ 0 ].xMACAddress.ucBytes, sizeof( xARPCache[ 0 ].xMACAddress.ucBytes ) );
1063     /* =================================================== */
1064 }
1065 
1066 /**
1067  * @brief This function verify receiving Gratuitous ARP packet
1068  *        but the ARP cache doesn't have an entry for the IP in the
1069  *        ARP request.
1070  */
test_eARPProcessPacket_Request_GratuitousARP_NonMatchingIP(void)1071 void test_eARPProcessPacket_Request_GratuitousARP_NonMatchingIP( void )
1072 {
1073     ARPPacket_t xARPFrame = { 0 };
1074     eFrameProcessingResult_t eResult;
1075     NetworkInterface_t xInterface;
1076     struct xNetworkEndPoint xEndPoint = { 0 };
1077     struct xNetworkEndPoint xEndPoint2 = { 0 };
1078     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
1079     uint32_t ulTargetIP = 0xAACCDDBB;
1080     uint8_t ucMAC[ 6 ] = { 0x34, 0x34, 0x34, 0x34, 0x34, 0x34 };
1081 
1082     memset( &xARPFrame, 0, sizeof( ARPPacket_t ) );
1083     memset( xARPCache, 0, sizeof( xARPCache ) );
1084 
1085     /* =================================================== */
1086     /* Add settings required for ARP header to pass checks */
1087     xARPFrame.xARPHeader.usHardwareType = ipARP_HARDWARE_TYPE_ETHERNET;
1088     xARPFrame.xARPHeader.usProtocolType = ipARP_PROTOCOL_TYPE;
1089     xARPFrame.xARPHeader.ucHardwareAddressLength = ipMAC_ADDRESS_LENGTH_BYTES;
1090     xARPFrame.xARPHeader.ucProtocolAddressLength = ipIP_ADDRESS_LENGTH_BYTES;
1091 
1092     /* Process an ARP request - meant for this node with target and source same. */
1093     xEndPoint.ipv4_settings.ulIPAddress = 0xAABBCCDD;
1094     /* Fill in the request option. */
1095     xARPFrame.xARPHeader.usOperation = ipARP_REQUEST;
1096     xARPFrame.xARPHeader.ulTargetProtocolAddress = ulTargetIP;
1097     memcpy( xARPFrame.xARPHeader.ucSenderProtocolAddress, &( xARPFrame.xARPHeader.ulTargetProtocolAddress ), sizeof( xARPFrame.xARPHeader.ulTargetProtocolAddress ) );
1098 
1099     memset( &( xARPFrame.xARPHeader.xSenderHardwareAddress.ucBytes ), 0x22, sizeof( MACAddress_t ) );
1100 
1101     xARPCache[ 0 ].ulIPAddress = 0xAABBCCDF;
1102     xARPCache[ 0 ].ucAge = 1;
1103     xARPCache[ 0 ].ucValid = pdTRUE;
1104     memset( xARPCache[ 0 ].xMACAddress.ucBytes, 0x34, sizeof( xARPCache[ 0 ].xMACAddress.ucBytes ) );
1105     xARPCache[ 0 ].pxEndPoint = &xEndPoint2;
1106 
1107     /* Reset the private variable uxARPClashCounter. */
1108     vResetARPClashCounter();
1109 
1110     FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( &xEndPoint );
1111     xIsIPv4Multicast_ExpectAndReturn( ulTargetIP, 0UL );
1112     FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( &xEndPoint );
1113 
1114     xNetworkBuffer.pucEthernetBuffer = &xARPFrame;
1115     xNetworkBuffer.xDataLength = sizeof( ARPPacket_t );
1116     xNetworkBuffer.pxEndPoint = &xEndPoint;
1117     xEndPoint.bits.bEndPointUp = pdTRUE_UNSIGNED;
1118 
1119     eResult = eARPProcessPacket( &xNetworkBuffer );
1120     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
1121     TEST_ASSERT_EQUAL( 0xAABBCCDF, xARPCache[ 0 ].ulIPAddress );
1122     TEST_ASSERT_EQUAL( 1, xARPCache[ 0 ].ucAge );
1123     TEST_ASSERT_EQUAL( pdTRUE, xARPCache[ 0 ].ucValid );
1124     TEST_ASSERT_EQUAL( &xEndPoint2, xARPCache[ 0 ].pxEndPoint );
1125     TEST_ASSERT_EQUAL_MEMORY( ucMAC, xARPCache[ 0 ].xMACAddress.ucBytes, sizeof( xARPCache[ 0 ].xMACAddress.ucBytes ) );
1126     /* =================================================== */
1127 }
1128 
test_eARPProcessPacket_Reply_TargetIPSameAsLocalIP(void)1129 void test_eARPProcessPacket_Reply_TargetIPSameAsLocalIP( void )
1130 {
1131     ARPPacket_t xARPFrame = { 0 };
1132     eFrameProcessingResult_t eResult;
1133     NetworkInterface_t xInterface;
1134     struct xNetworkEndPoint xEndPoint = { 0 };
1135     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
1136 
1137     memset( &xARPFrame, 0, sizeof( ARPPacket_t ) );
1138     memset( xARPCache, 0, sizeof( xARPCache ) );
1139 
1140     /* Process an ARP request, but not meant for this node. */
1141     /* Add settings required for ARP header to pass checks */
1142     xARPFrame.xARPHeader.usHardwareType = ipARP_HARDWARE_TYPE_ETHERNET;
1143     xARPFrame.xARPHeader.usProtocolType = ipARP_PROTOCOL_TYPE;
1144     xARPFrame.xARPHeader.ucHardwareAddressLength = ipMAC_ADDRESS_LENGTH_BYTES;
1145     xARPFrame.xARPHeader.ucProtocolAddressLength = ipIP_ADDRESS_LENGTH_BYTES;
1146 
1147     memset( ipLOCAL_MAC_ADDRESS, 0x22, sizeof( MACAddress_t ) );
1148     memcpy( &( xARPFrame.xARPHeader.xSenderHardwareAddress ), ipLOCAL_MAC_ADDRESS, sizeof( MACAddress_t ) );
1149 
1150     *ipLOCAL_IP_ADDRESS_POINTER = 0xAABBCCDD;
1151     /* Fill in the request option. */
1152     xARPFrame.xARPHeader.usOperation = ipARP_REPLY;
1153     xARPFrame.xARPHeader.ulTargetProtocolAddress = *ipLOCAL_IP_ADDRESS_POINTER;
1154 
1155     uint32_t ulSenderProtocolAddress = 0xFFAAEEBB;
1156 
1157     memcpy( &( xARPFrame.xARPHeader.ucSenderProtocolAddress ), &ulSenderProtocolAddress, sizeof( uint32_t ) );
1158 
1159     /* Reset the private variable uxARPClashCounter. */
1160     vResetARPClashCounter();
1161 
1162     FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( NULL );
1163 
1164     xEndPoint.bits.bEndPointUp = pdTRUE_UNSIGNED;
1165     xEndPoint.ipv4_settings.ulIPAddress = *ipLOCAL_IP_ADDRESS_POINTER;
1166     xNetworkBuffer.pucEthernetBuffer = &xARPFrame;
1167     xNetworkBuffer.xDataLength = sizeof( ARPPacket_t );
1168     xNetworkBuffer.pxEndPoint = &xEndPoint;
1169 
1170     eResult = eARPProcessPacket( &xNetworkBuffer );
1171     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
1172     TEST_ASSERT_EQUAL( pdTRUE, xIsIPInARPCache( ulSenderProtocolAddress ) );
1173     /* =================================================== */
1174 }
1175 
test_eARPProcessPacket_Reply_TargetIPNotSameAsLocalIP_ButEntryInCache(void)1176 void test_eARPProcessPacket_Reply_TargetIPNotSameAsLocalIP_ButEntryInCache( void )
1177 {
1178     ARPPacket_t xARPFrame = { 0 };
1179     eFrameProcessingResult_t eResult;
1180     NetworkInterface_t xInterface;
1181     struct xNetworkEndPoint xEndPoint = { 0 };
1182     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
1183 
1184     memset( &xARPFrame, 0, sizeof( ARPPacket_t ) );
1185     memset( xARPCache, 0, sizeof( xARPCache ) );
1186 
1187     /* Process an ARP request, but not meant for this node. */
1188     /* Add settings required for ARP header to pass checks */
1189     xARPFrame.xARPHeader.usHardwareType = ipARP_HARDWARE_TYPE_ETHERNET;
1190     xARPFrame.xARPHeader.usProtocolType = ipARP_PROTOCOL_TYPE;
1191     xARPFrame.xARPHeader.ucHardwareAddressLength = ipMAC_ADDRESS_LENGTH_BYTES;
1192     xARPFrame.xARPHeader.ucProtocolAddressLength = ipIP_ADDRESS_LENGTH_BYTES;
1193 
1194     memset( ipLOCAL_MAC_ADDRESS, 0x22, sizeof( MACAddress_t ) );
1195     memcpy( &( xARPFrame.xARPHeader.xSenderHardwareAddress ), ipLOCAL_MAC_ADDRESS, sizeof( MACAddress_t ) );
1196 
1197     *ipLOCAL_IP_ADDRESS_POINTER = 0xAABBCCDD;
1198     /* Fill in the request option. */
1199     xARPFrame.xARPHeader.usOperation = ipARP_REPLY;
1200     xARPFrame.xARPHeader.ulTargetProtocolAddress = *ipLOCAL_IP_ADDRESS_POINTER + 1;
1201 
1202     uint32_t ulSenderProtocolAddress = 0xFFAAEEBB;
1203 
1204     memcpy( &( xARPFrame.xARPHeader.ucSenderProtocolAddress ), &ulSenderProtocolAddress, sizeof( uint32_t ) );
1205 
1206     xARPCache[ 0 ].ulIPAddress = ulSenderProtocolAddress;
1207     xARPCache[ 0 ].ucAge = 1;
1208     xARPCache[ 0 ].ucValid = 1;
1209 
1210     /* Reset the private variable uxARPClashCounter. */
1211     vResetARPClashCounter();
1212 
1213     FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( NULL );
1214 
1215     xEndPoint.bits.bEndPointUp = pdTRUE_UNSIGNED;
1216     xNetworkBuffer.pucEthernetBuffer = &xARPFrame;
1217     xNetworkBuffer.xDataLength = sizeof( ARPPacket_t );
1218     xNetworkBuffer.pxEndPoint = &xEndPoint;
1219 
1220     eResult = eARPProcessPacket( &xNetworkBuffer );
1221     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
1222     TEST_ASSERT_EQUAL( pdTRUE, xIsIPInARPCache( ulSenderProtocolAddress ) );
1223     TEST_ASSERT_EQUAL( ipconfigMAX_ARP_AGE, xARPCache[ 0 ].ucAge );
1224     /* =================================================== */
1225 }
1226 
1227 
test_eARPProcessPacket_Reply_SenderAndTargetSame(void)1228 void test_eARPProcessPacket_Reply_SenderAndTargetSame( void )
1229 {
1230     ARPPacket_t xARPFrame = { 0 };
1231     eFrameProcessingResult_t eResult;
1232     NetworkInterface_t xInterface;
1233     struct xNetworkEndPoint xEndPoint = { 0 }, xEndPoint_2 = { 0 };
1234     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
1235 
1236     memset( &xARPFrame, 0, sizeof( ARPPacket_t ) );
1237 
1238     /* =================================================== */
1239     /* Add settings required for ARP header to pass checks */
1240     xARPFrame.xARPHeader.usHardwareType = ipARP_HARDWARE_TYPE_ETHERNET;
1241     xARPFrame.xARPHeader.usProtocolType = ipARP_PROTOCOL_TYPE;
1242     xARPFrame.xARPHeader.ucHardwareAddressLength = ipMAC_ADDRESS_LENGTH_BYTES;
1243     xARPFrame.xARPHeader.ucProtocolAddressLength = ipIP_ADDRESS_LENGTH_BYTES;
1244 
1245     /* Process an ARP reply - meant for this node with target and source same. */
1246     xEndPoint.ipv4_settings.ulIPAddress = 0xAABBCCDD;
1247     /* Fill in the request option. */
1248     xARPFrame.xARPHeader.usOperation = ipARP_REPLY;
1249     xARPFrame.xARPHeader.ulTargetProtocolAddress = xEndPoint.ipv4_settings.ulIPAddress;
1250     memcpy( xARPFrame.xARPHeader.ucSenderProtocolAddress, &( xARPFrame.xARPHeader.ulTargetProtocolAddress ), sizeof( xARPFrame.xARPHeader.ulTargetProtocolAddress ) );
1251 
1252     /* Reset the private variable uxARPClashCounter. */
1253     vResetARPClashCounter();
1254 
1255     xEndPoint.bits.bEndPointUp = pdTRUE_UNSIGNED;
1256     xNetworkBuffer.pucEthernetBuffer = &xARPFrame;
1257     xNetworkBuffer.xDataLength = sizeof( ARPPacket_t );
1258     xNetworkBuffer.pxEndPoint = &xEndPoint;
1259 
1260     FreeRTOS_FirstEndPoint_ExpectAnyArgsAndReturn( NULL );
1261 
1262     FreeRTOS_FindEndPointOnNetMask_IgnoreAndReturn( 1 );
1263     xTaskGetTickCount_ExpectAndReturn( 0 );
1264     vTaskSetTimeOutState_ExpectAnyArgs();
1265     FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( &xEndPoint );
1266 
1267     /* Reset the flag. */
1268     xARPHadIPClash = pdFALSE;
1269 
1270     eResult = eARPProcessPacket( &xNetworkBuffer );
1271     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
1272     TEST_ASSERT_EQUAL( pdTRUE, xARPHadIPClash );
1273     /* =================================================== */
1274 
1275     /* Reset the flag. */
1276     xARPHadIPClash = pdFALSE;
1277 
1278     /* Let there be no timeout. Let the EndPoint be NULL */
1279     xTaskCheckForTimeOut_ExpectAnyArgsAndReturn( pdFAIL );
1280     FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
1281 
1282     eResult = eARPProcessPacket( &xNetworkBuffer );
1283     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
1284     TEST_ASSERT_EQUAL( pdFALSE, xARPHadIPClash );
1285     /* =================================================== */
1286 
1287     /* Reset the flag. */
1288     xARPHadIPClash = pdFALSE;
1289     /* Let there be no timeout. */
1290     xTaskCheckForTimeOut_ExpectAnyArgsAndReturn( pdFAIL );
1291     FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( &xEndPoint );
1292 
1293     /* Call it again and do not expect the task functions to be called. */
1294     eResult = eARPProcessPacket( &xNetworkBuffer );
1295     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
1296     TEST_ASSERT_EQUAL( pdTRUE, xARPHadIPClash );
1297     /* =================================================== */
1298 
1299     /* Reset the flag. */
1300     xARPHadIPClash = pdFALSE;
1301     xEndPoint_2.ipv4_settings.ulIPAddress = xARPFrame.xARPHeader.ucSenderProtocolAddress + 0x11;
1302 
1303     /* Let there be no timeout. Let the EndPoint be NULL */
1304     xTaskCheckForTimeOut_ExpectAnyArgsAndReturn( pdFAIL );
1305     FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( &xEndPoint_2 );
1306 
1307     eResult = eARPProcessPacket( &xNetworkBuffer );
1308     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
1309     TEST_ASSERT_EQUAL( pdFALSE, xARPHadIPClash );
1310     /* =================================================== */
1311 }
1312 
test_eARPProcessPacket_Reply_DifferentIP(void)1313 void test_eARPProcessPacket_Reply_DifferentIP( void )
1314 {
1315     ARPPacket_t xARPFrame = { 0 };
1316     eFrameProcessingResult_t eResult;
1317     NetworkInterface_t xInterface;
1318     struct xNetworkEndPoint xEndPoint = { 0 };
1319     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
1320 
1321     memset( &xARPFrame, 0, sizeof( ARPPacket_t ) );
1322 
1323     /* =================================================== */
1324     /* Add settings required for ARP header to pass checks */
1325     xARPFrame.xARPHeader.usHardwareType = ipARP_HARDWARE_TYPE_ETHERNET;
1326     xARPFrame.xARPHeader.usProtocolType = ipARP_PROTOCOL_TYPE;
1327     xARPFrame.xARPHeader.ucHardwareAddressLength = ipMAC_ADDRESS_LENGTH_BYTES;
1328     xARPFrame.xARPHeader.ucProtocolAddressLength = ipIP_ADDRESS_LENGTH_BYTES;
1329 
1330     /* Process an ARP reply - not meant for this node. */
1331     *ipLOCAL_IP_ADDRESS_POINTER = 0xAABBCCDD;
1332     /* Fill in the request option. */
1333     xARPFrame.xARPHeader.usOperation = ipARP_REPLY;
1334     xARPFrame.xARPHeader.ulTargetProtocolAddress = *ipLOCAL_IP_ADDRESS_POINTER + 0x11;
1335     memcpy( xARPFrame.xARPHeader.ucSenderProtocolAddress, &( xARPFrame.xARPHeader.ulTargetProtocolAddress ), sizeof( xARPFrame.xARPHeader.ulTargetProtocolAddress ) );
1336 
1337     /* Reset the private variable uxARPClashCounter. */
1338     vResetARPClashCounter();
1339 
1340     xEndPoint.bits.bEndPointUp = pdTRUE_UNSIGNED;
1341     xNetworkBuffer.pucEthernetBuffer = &xARPFrame;
1342     xNetworkBuffer.xDataLength = sizeof( ARPPacket_t );
1343     xNetworkBuffer.pxEndPoint = &xEndPoint;
1344 
1345     eResult = eARPProcessPacket( &xNetworkBuffer );
1346     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
1347     /* =================================================== */
1348 }
1349 
test_eARPProcessPacket_Reply_DifferentIP_WaitingBufferNonNull(void)1350 void test_eARPProcessPacket_Reply_DifferentIP_WaitingBufferNonNull( void )
1351 {
1352     ARPPacket_t xARPFrame = { 0 };
1353     eFrameProcessingResult_t eResult;
1354     NetworkBufferDescriptor_t xLocalBuffer;
1355     uint8_t pucLocalEthernetBuffer[ 1500 ];
1356     NetworkInterface_t xInterface;
1357     struct xNetworkEndPoint xEndPoint = { 0 };
1358     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
1359 
1360     memset( &xARPFrame, 0, sizeof( ARPPacket_t ) );
1361 
1362     /* Clear the buffer. */
1363     memset( pucLocalEthernetBuffer, 0, sizeof( pucLocalEthernetBuffer ) );
1364 
1365     xLocalBuffer.pucEthernetBuffer = pucLocalEthernetBuffer;
1366     pxARPWaitingNetworkBuffer = &xLocalBuffer;
1367 
1368     /* =================================================== */
1369     /* Add settings required for ARP header to pass checks */
1370     xARPFrame.xARPHeader.usHardwareType = ipARP_HARDWARE_TYPE_ETHERNET;
1371     xARPFrame.xARPHeader.usProtocolType = ipARP_PROTOCOL_TYPE;
1372     xARPFrame.xARPHeader.ucHardwareAddressLength = ipMAC_ADDRESS_LENGTH_BYTES;
1373     xARPFrame.xARPHeader.ucProtocolAddressLength = ipIP_ADDRESS_LENGTH_BYTES;
1374 
1375     /* Process an ARP reply - not meant for this node. */
1376     *ipLOCAL_IP_ADDRESS_POINTER = 0xAABBCCDD;
1377     /* Fill in the request option. */
1378     xARPFrame.xARPHeader.usOperation = ipARP_REPLY;
1379     xARPFrame.xARPHeader.ulTargetProtocolAddress = *ipLOCAL_IP_ADDRESS_POINTER + 0x11;
1380     memcpy( xARPFrame.xARPHeader.ucSenderProtocolAddress, &( xARPFrame.xARPHeader.ulTargetProtocolAddress ), sizeof( xARPFrame.xARPHeader.ulTargetProtocolAddress ) );
1381 
1382     /* Reset the private variable uxARPClashCounter. */
1383     vResetARPClashCounter();
1384 
1385     xEndPoint.bits.bEndPointUp = pdTRUE_UNSIGNED;
1386     xNetworkBuffer.pucEthernetBuffer = &xARPFrame;
1387     xNetworkBuffer.xDataLength = sizeof( ARPPacket_t );
1388     xNetworkBuffer.pxEndPoint = &xEndPoint;
1389 
1390     uxIPHeaderSizePacket_IgnoreAndReturn( ipSIZE_OF_IPv4_HEADER );
1391 
1392     eResult = eARPProcessPacket( &xNetworkBuffer );
1393     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
1394     /* =================================================== */
1395 }
1396 
test_eARPProcessPacket_Reply_WaitingBufferIncorrectHeaderSize(void)1397 void test_eARPProcessPacket_Reply_WaitingBufferIncorrectHeaderSize( void )
1398 {
1399     ARPPacket_t xARPFrame = { 0 };
1400     eFrameProcessingResult_t eResult;
1401     NetworkBufferDescriptor_t xLocalBuffer;
1402     uint8_t pucLocalEthernetBuffer[ 1500 ];
1403     NetworkInterface_t xInterface;
1404     struct xNetworkEndPoint xEndPoint = { 0 };
1405     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
1406 
1407     memset( &xARPFrame, 0, sizeof( ARPPacket_t ) );
1408 
1409     /* Clear the buffer. */
1410     memset( pucLocalEthernetBuffer, 0, sizeof( pucLocalEthernetBuffer ) );
1411 
1412     xLocalBuffer.pucEthernetBuffer = pucLocalEthernetBuffer;
1413     pxARPWaitingNetworkBuffer = &xLocalBuffer;
1414 
1415     /* =================================================== */
1416     /* Add settings required for ARP header to pass checks */
1417     xARPFrame.xARPHeader.usHardwareType = ipARP_HARDWARE_TYPE_ETHERNET;
1418     xARPFrame.xARPHeader.usProtocolType = ipARP_PROTOCOL_TYPE;
1419     xARPFrame.xARPHeader.ucHardwareAddressLength = ipMAC_ADDRESS_LENGTH_BYTES;
1420     xARPFrame.xARPHeader.ucProtocolAddressLength = ipIP_ADDRESS_LENGTH_BYTES;
1421 
1422     /* Process an ARP reply - not meant for this node. */
1423     *ipLOCAL_IP_ADDRESS_POINTER = 0xAABBCCDD;
1424     /* Fill in the request option. */
1425     xARPFrame.xARPHeader.usOperation = ipARP_REPLY;
1426     xARPFrame.xARPHeader.ulTargetProtocolAddress = *ipLOCAL_IP_ADDRESS_POINTER + 0x11;
1427     memcpy( xARPFrame.xARPHeader.ucSenderProtocolAddress, &( xARPFrame.xARPHeader.ulTargetProtocolAddress ), sizeof( xARPFrame.xARPHeader.ulTargetProtocolAddress ) );
1428 
1429     /* Reset the private variable uxARPClashCounter. */
1430     vResetARPClashCounter();
1431 
1432     xEndPoint.bits.bEndPointUp = pdTRUE_UNSIGNED;
1433     xNetworkBuffer.pucEthernetBuffer = &xARPFrame;
1434     xNetworkBuffer.xDataLength = sizeof( ARPPacket_t );
1435     xNetworkBuffer.pxEndPoint = &xEndPoint;
1436 
1437     uxIPHeaderSizePacket_IgnoreAndReturn( ipSIZE_OF_IPv6_HEADER );
1438 
1439     eResult = eARPProcessPacket( &xNetworkBuffer );
1440     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
1441     /* =================================================== */
1442 }
1443 
test_eARPProcessPacket_Reply_WaitingBufferNonNull_MatchingAddress1(void)1444 void test_eARPProcessPacket_Reply_WaitingBufferNonNull_MatchingAddress1( void )
1445 {
1446     ARPPacket_t xARPFrame = { 0 };
1447     eFrameProcessingResult_t eResult;
1448     NetworkBufferDescriptor_t xLocalBuffer;
1449     NetworkInterface_t xInterface;
1450     struct xNetworkEndPoint xEndPoint = { 0 };
1451     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
1452 
1453     uint8_t pucLocalEthernetBuffer[ 1500 ];
1454     IPPacket_t * pxARPWaitingIPPacket = ( ( IPPacket_t * ) pucLocalEthernetBuffer );
1455     IPHeader_t * pxARPWaitingIPHeader = &( pxARPWaitingIPPacket->xIPHeader );
1456 
1457     memset( &xARPFrame, 0, sizeof( ARPPacket_t ) );
1458 
1459     /* Clear the buffer. */
1460     memset( pucLocalEthernetBuffer, 0, sizeof( pucLocalEthernetBuffer ) );
1461 
1462     xLocalBuffer.pucEthernetBuffer = pucLocalEthernetBuffer;
1463     pxARPWaitingNetworkBuffer = &xLocalBuffer;
1464 
1465     /* =================================================== */
1466     /* Add settings required for ARP header to pass checks */
1467     xARPFrame.xARPHeader.usHardwareType = ipARP_HARDWARE_TYPE_ETHERNET;
1468     xARPFrame.xARPHeader.usProtocolType = ipARP_PROTOCOL_TYPE;
1469     xARPFrame.xARPHeader.ucHardwareAddressLength = ipMAC_ADDRESS_LENGTH_BYTES;
1470     xARPFrame.xARPHeader.ucProtocolAddressLength = ipIP_ADDRESS_LENGTH_BYTES;
1471 
1472     /* Process an ARP reply - not meant for this node. */
1473     *ipLOCAL_IP_ADDRESS_POINTER = 0xAABBCCDD;
1474     /* Fill in the request option. */
1475     xARPFrame.xARPHeader.usOperation = ipARP_REPLY;
1476     xARPFrame.xARPHeader.ulTargetProtocolAddress = *ipLOCAL_IP_ADDRESS_POINTER + 0x11;
1477     memcpy( xARPFrame.xARPHeader.ucSenderProtocolAddress, &( xARPFrame.xARPHeader.ulTargetProtocolAddress ), sizeof( xARPFrame.xARPHeader.ulTargetProtocolAddress ) );
1478 
1479     memcpy( &( pxARPWaitingIPHeader->ulSourceIPAddress ), xARPFrame.xARPHeader.ucSenderProtocolAddress, sizeof( pxARPWaitingIPHeader->ulSourceIPAddress ) );
1480 
1481     /* Reset the private variable uxARPClashCounter. */
1482     vResetARPClashCounter();
1483 
1484     xEndPoint.bits.bEndPointUp = pdTRUE_UNSIGNED;
1485     xNetworkBuffer.pucEthernetBuffer = &xARPFrame;
1486     xNetworkBuffer.xDataLength = sizeof( ARPPacket_t );
1487     xNetworkBuffer.pxEndPoint = &xEndPoint;
1488 
1489     xSendEventStructToIPTask_IgnoreAndReturn( pdFAIL );
1490     vReleaseNetworkBufferAndDescriptor_Ignore();
1491     vIPSetARPResolutionTimerEnableState_Expect( pdFALSE );
1492 
1493     uxIPHeaderSizePacket_IgnoreAndReturn( ipSIZE_OF_IPv4_HEADER );
1494 
1495     eResult = eARPProcessPacket( &xNetworkBuffer );
1496     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
1497     TEST_ASSERT_EQUAL( NULL, pxARPWaitingNetworkBuffer );
1498     /* =================================================== */
1499 }
1500 
test_eARPProcessPacket_Reply_WaitingBufferNonNull_MatchingAddress2(void)1501 void test_eARPProcessPacket_Reply_WaitingBufferNonNull_MatchingAddress2( void )
1502 {
1503     ARPPacket_t xARPFrame = { 0 };
1504     eFrameProcessingResult_t eResult;
1505     NetworkBufferDescriptor_t xLocalBuffer;
1506     uint8_t pucLocalEthernetBuffer[ 1500 ];
1507     NetworkInterface_t xInterface;
1508     struct xNetworkEndPoint xEndPoint = { 0 };
1509     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
1510 
1511     IPPacket_t * pxARPWaitingIPPacket = ( ( IPPacket_t * ) pucLocalEthernetBuffer );
1512     IPHeader_t * pxARPWaitingIPHeader = &( pxARPWaitingIPPacket->xIPHeader );
1513 
1514     memset( &xARPFrame, 0, sizeof( ARPPacket_t ) );
1515 
1516     /* Clear the buffer. */
1517     memset( pucLocalEthernetBuffer, 0, sizeof( pucLocalEthernetBuffer ) );
1518 
1519     xLocalBuffer.pucEthernetBuffer = pucLocalEthernetBuffer;
1520     pxARPWaitingNetworkBuffer = &xLocalBuffer;
1521 
1522     /* =================================================== */
1523     /* Add settings required for ARP header to pass checks */
1524     xARPFrame.xARPHeader.usHardwareType = ipARP_HARDWARE_TYPE_ETHERNET;
1525     xARPFrame.xARPHeader.usProtocolType = ipARP_PROTOCOL_TYPE;
1526     xARPFrame.xARPHeader.ucHardwareAddressLength = ipMAC_ADDRESS_LENGTH_BYTES;
1527     xARPFrame.xARPHeader.ucProtocolAddressLength = ipIP_ADDRESS_LENGTH_BYTES;
1528 
1529     /* Process an ARP reply - not meant for this node. */
1530     *ipLOCAL_IP_ADDRESS_POINTER = 0xAABBCCDD;
1531     /* Fill in the request option. */
1532     xARPFrame.xARPHeader.usOperation = ipARP_REPLY;
1533     xARPFrame.xARPHeader.ulTargetProtocolAddress = *ipLOCAL_IP_ADDRESS_POINTER + 0x11;
1534     memcpy( xARPFrame.xARPHeader.ucSenderProtocolAddress, &( xARPFrame.xARPHeader.ulTargetProtocolAddress ), sizeof( xARPFrame.xARPHeader.ulTargetProtocolAddress ) );
1535 
1536     memcpy( &( pxARPWaitingIPHeader->ulSourceIPAddress ), xARPFrame.xARPHeader.ucSenderProtocolAddress, sizeof( pxARPWaitingIPHeader->ulSourceIPAddress ) );
1537 
1538     /* Reset the private variable uxARPClashCounter. */
1539     vResetARPClashCounter();
1540 
1541     xEndPoint.bits.bEndPointUp = pdTRUE_UNSIGNED;
1542     xNetworkBuffer.pucEthernetBuffer = &xARPFrame;
1543     xNetworkBuffer.xDataLength = sizeof( ARPPacket_t );
1544     xNetworkBuffer.pxEndPoint = &xEndPoint;
1545 
1546     xSendEventStructToIPTask_IgnoreAndReturn( pdPASS );
1547     vIPSetARPResolutionTimerEnableState_Expect( pdFALSE );
1548 
1549     uxIPHeaderSizePacket_IgnoreAndReturn( ipSIZE_OF_IPv4_HEADER );
1550 
1551     eResult = eARPProcessPacket( &xNetworkBuffer );
1552     TEST_ASSERT_EQUAL( eReleaseBuffer, eResult );
1553     TEST_ASSERT_EQUAL( NULL, pxARPWaitingNetworkBuffer );
1554     /* =================================================== */
1555 }
1556 
test_xIsIPInARPCache_NoMatchingIP(void)1557 void test_xIsIPInARPCache_NoMatchingIP( void )
1558 {
1559     uint32_t ulIPAddress = 0x1234ABCD;
1560     BaseType_t xResult;
1561 
1562     for( uint16_t x = 0; x < ipconfigARP_CACHE_ENTRIES; x++ )
1563     {
1564         xARPCache[ x ].ulIPAddress = 0;
1565     }
1566 
1567     xResult = xIsIPInARPCache( ulIPAddress );
1568 
1569     TEST_ASSERT_EQUAL( pdFALSE, xResult );
1570 }
1571 
test_xIsIPInARPCache_MatchingIPButEntryInvalid(void)1572 void test_xIsIPInARPCache_MatchingIPButEntryInvalid( void )
1573 {
1574     uint32_t ulIPAddress = 0x1234ABCD;
1575     BaseType_t xResult;
1576 
1577     for( uint16_t x = 0; x < ipconfigARP_CACHE_ENTRIES; x++ )
1578     {
1579         xARPCache[ x ].ulIPAddress = 0;
1580         xARPCache[ x ].ucValid = ( uint8_t ) pdFALSE;
1581     }
1582 
1583     xARPCache[ 0 ].ulIPAddress = ulIPAddress;
1584 
1585     xResult = xIsIPInARPCache( ulIPAddress );
1586 
1587     TEST_ASSERT_EQUAL( pdFALSE, xResult );
1588 }
1589 
test_xIsIPInARPCache_MatchingIP1(void)1590 void test_xIsIPInARPCache_MatchingIP1( void )
1591 {
1592     uint32_t ulIPAddress = 0x1234ABCD;
1593     BaseType_t xResult;
1594 
1595     for( uint16_t x = 0; x < ipconfigARP_CACHE_ENTRIES; x++ )
1596     {
1597         xARPCache[ x ].ulIPAddress = 0;
1598         xARPCache[ x ].ucValid = ( uint8_t ) pdTRUE;
1599     }
1600 
1601     xARPCache[ 0 ].ulIPAddress = ulIPAddress;
1602 
1603     xResult = xIsIPInARPCache( ulIPAddress );
1604 
1605     TEST_ASSERT_EQUAL( pdTRUE, xResult );
1606 }
1607 
test_xIsIPInARPCache_MatchingIP2(void)1608 void test_xIsIPInARPCache_MatchingIP2( void )
1609 {
1610     uint32_t ulIPAddress = 0x1234ABCD;
1611     BaseType_t xResult;
1612 
1613     for( uint16_t x = 0; x < ipconfigARP_CACHE_ENTRIES; x++ )
1614     {
1615         xARPCache[ x ].ulIPAddress = 0;
1616         xARPCache[ x ].ucValid = ( uint8_t ) pdTRUE;
1617     }
1618 
1619     xARPCache[ ipconfigARP_CACHE_ENTRIES - 1 ].ulIPAddress = ulIPAddress;
1620 
1621     xResult = xIsIPInARPCache( ulIPAddress );
1622 
1623     TEST_ASSERT_EQUAL( pdTRUE, xResult );
1624 }
1625 
test_xCheckRequiresARPResolution_NotOnLocalNetwork(void)1626 void test_xCheckRequiresARPResolution_NotOnLocalNetwork( void )
1627 {
1628     struct xNetworkEndPoint xEndPoint = { 0 };
1629     NetworkBufferDescriptor_t xNetworkBuffer, * pxNetworkBuffer;
1630     uint8_t ucEthernetBuffer[ ipconfigNETWORK_MTU ];
1631     BaseType_t xResult;
1632     NetworkInterface_t xInterface;
1633 
1634     pxNetworkBuffer = &xNetworkBuffer;
1635     pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
1636 
1637     IPPacket_t * pxIPPacket = ( ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer );
1638     IPHeader_t * pxIPHeader = &( pxIPPacket->xIPHeader );
1639 
1640     *ipLOCAL_IP_ADDRESS_POINTER = 0xABCD1234;
1641 
1642     xEndPoint.ipv4_settings.ulNetMask = 0xFFFFFF00;
1643     xNetworkBuffer.pxEndPoint = &xEndPoint;
1644 
1645     /* Make sure there is no match. */
1646     pxIPHeader->ulSourceIPAddress = ~( *ipLOCAL_IP_ADDRESS_POINTER & xEndPoint.ipv4_settings.ulNetMask );
1647 
1648     uxIPHeaderSizePacket_IgnoreAndReturn( ipSIZE_OF_IPv4_HEADER );
1649 
1650     xResult = xCheckRequiresARPResolution( pxNetworkBuffer );
1651 
1652     TEST_ASSERT_EQUAL( pdFALSE, xResult );
1653 }
1654 
test_xCheckRequiresARPResolution_NotOnLocalNetwork_InvalidHeader(void)1655 void test_xCheckRequiresARPResolution_NotOnLocalNetwork_InvalidHeader( void )
1656 {
1657     struct xNetworkEndPoint xEndPoint = { 0 };
1658     NetworkBufferDescriptor_t xNetworkBuffer, * pxNetworkBuffer;
1659     uint8_t ucEthernetBuffer[ ipconfigNETWORK_MTU ];
1660     BaseType_t xResult;
1661     NetworkInterface_t xInterface;
1662 
1663     pxNetworkBuffer = &xNetworkBuffer;
1664     pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
1665 
1666     IPPacket_t * pxIPPacket = ( ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer );
1667     IPHeader_t * pxIPHeader = &( pxIPPacket->xIPHeader );
1668 
1669     *ipLOCAL_IP_ADDRESS_POINTER = 0xABCD1234;
1670 
1671     xEndPoint.ipv4_settings.ulNetMask = 0xFFFFFF00;
1672     xNetworkBuffer.pxEndPoint = &xEndPoint;
1673 
1674     /* Make sure there is no match. */
1675     pxIPHeader->ulSourceIPAddress = ~( *ipLOCAL_IP_ADDRESS_POINTER & xEndPoint.ipv4_settings.ulNetMask );
1676 
1677     uxIPHeaderSizePacket_IgnoreAndReturn( ipSIZE_OF_IPv6_HEADER + ipSIZE_OF_IPv4_HEADER );
1678 
1679     xResult = xCheckRequiresARPResolution( pxNetworkBuffer );
1680 
1681     TEST_ASSERT_EQUAL( pdFALSE, xResult );
1682 }
1683 
test_xCheckRequiresARPResolution_NotOnLocalNetwork_IPv6(void)1684 void test_xCheckRequiresARPResolution_NotOnLocalNetwork_IPv6( void )
1685 {
1686     struct xNetworkEndPoint xEndPoint = { 0 };
1687     NetworkBufferDescriptor_t xNetworkBuffer, * pxNetworkBuffer;
1688     uint8_t ucEthernetBuffer[ ipconfigNETWORK_MTU ];
1689     BaseType_t xResult;
1690     NetworkInterface_t xInterface;
1691 
1692     pxNetworkBuffer = &xNetworkBuffer;
1693     pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
1694 
1695     IPPacket_t * pxIPPacket = ( ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer );
1696     IPHeader_t * pxIPHeader = &( pxIPPacket->xIPHeader );
1697 
1698     *ipLOCAL_IP_ADDRESS_POINTER = 0xABCD1234;
1699 
1700     xEndPoint.ipv4_settings.ulNetMask = 0xFFFFFF00;
1701     xNetworkBuffer.pxEndPoint = &xEndPoint;
1702 
1703     /* Make sure there is no match. */
1704     pxIPHeader->ulSourceIPAddress = ~( *ipLOCAL_IP_ADDRESS_POINTER & xEndPoint.ipv4_settings.ulNetMask );
1705 
1706     uxIPHeaderSizePacket_IgnoreAndReturn( ipSIZE_OF_IPv6_HEADER );
1707 
1708     xResult = xCheckRequiresARPResolution( pxNetworkBuffer );
1709 
1710     TEST_ASSERT_EQUAL( pdFALSE, xResult );
1711     /* =================================================== */
1712 
1713     IPPacket_IPv6_t * pxIPPacket_V6 = ( ( IPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer );
1714     IPHeader_IPv6_t * pxIPHeader_V6 = &( pxIPPacket_V6->xIPHeader );
1715     IPv6_Address_t * pxIPAddress = &( pxIPHeader_V6->xSourceAddress );
1716     pxIPHeader_V6->ucNextHeader = ipPROTOCOL_TCP;
1717 
1718     xIPv6_GetIPType_ExpectAnyArgsAndReturn( eIPv6_LinkLocal );
1719     eNDGetCacheEntry_ExpectAnyArgsAndReturn( eARPCacheHit );
1720 
1721     xResult = xCheckRequiresARPResolution( pxNetworkBuffer );
1722 
1723     TEST_ASSERT_EQUAL( pdFALSE, xResult );
1724     /* =================================================== */
1725 
1726     pxIPHeader_V6->ucNextHeader = ipPROTOCOL_UDP;
1727 
1728     xIPv6_GetIPType_ExpectAnyArgsAndReturn( eIPv6_LinkLocal );
1729     eNDGetCacheEntry_ExpectAnyArgsAndReturn( eARPCacheHit );
1730 
1731     xResult = xCheckRequiresARPResolution( pxNetworkBuffer );
1732 
1733     TEST_ASSERT_EQUAL( pdFALSE, xResult );
1734     /* =================================================== */
1735 
1736     xIPv6_GetIPType_ExpectAnyArgsAndReturn( eIPv6_LinkLocal );
1737     eNDGetCacheEntry_ExpectAnyArgsAndReturn( eARPCacheMiss );
1738     NetworkBufferDescriptor_t xTempBuffer = { 0 };
1739     pxGetNetworkBufferWithDescriptor_ExpectAnyArgsAndReturn( &xTempBuffer );
1740     vNDSendNeighbourSolicitation_Expect( &xTempBuffer, pxIPAddress );
1741 
1742     xResult = xCheckRequiresARPResolution( pxNetworkBuffer );
1743 
1744     TEST_ASSERT_EQUAL( pdTRUE, xResult );
1745     /* =================================================== */
1746 
1747     xIPv6_GetIPType_ExpectAnyArgsAndReturn( eIPv6_LinkLocal );
1748     eNDGetCacheEntry_ExpectAnyArgsAndReturn( eARPCacheMiss );
1749     pxGetNetworkBufferWithDescriptor_ExpectAnyArgsAndReturn( NULL );
1750 
1751     xResult = xCheckRequiresARPResolution( pxNetworkBuffer );
1752 
1753     TEST_ASSERT_EQUAL( pdTRUE, xResult );
1754     /* =================================================== */
1755 
1756     xIPv6_GetIPType_ExpectAnyArgsAndReturn( eIPv6_SiteLocal );
1757 
1758     xResult = xCheckRequiresARPResolution( pxNetworkBuffer );
1759 
1760     TEST_ASSERT_EQUAL( pdFALSE, xResult );
1761     /* =================================================== */
1762 }
1763 
test_xCheckRequiresARPResolution_OnLocalNetwork_NotInCache(void)1764 void test_xCheckRequiresARPResolution_OnLocalNetwork_NotInCache( void )
1765 {
1766     struct xNetworkEndPoint xEndPoint = { 0 };
1767     NetworkInterface_t xInterface;
1768     NetworkBufferDescriptor_t xNetworkBuffer, * pxNetworkBuffer;
1769     uint8_t ucEthernetBuffer[ ipconfigNETWORK_MTU ];
1770     BaseType_t xResult;
1771 
1772     pxNetworkBuffer = &xNetworkBuffer;
1773     pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
1774 
1775     IPPacket_t * pxIPPacket = ( ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer );
1776     IPHeader_t * pxIPHeader = &( pxIPPacket->xIPHeader );
1777 
1778     *ipLOCAL_IP_ADDRESS_POINTER = 0xABCD1234;
1779 
1780     xEndPoint.ipv4_settings.ulNetMask = 0xFFFFFF00;
1781     xNetworkBuffer.pxEndPoint = &xEndPoint;
1782 
1783     /* Make sure there is a match. */
1784     pxIPHeader->ulSourceIPAddress = *ipLOCAL_IP_ADDRESS_POINTER & xEndPoint.ipv4_settings.ulNetMask;
1785     xEndPoint.ipv4_settings.ulIPAddress = *ipLOCAL_IP_ADDRESS_POINTER & xEndPoint.ipv4_settings.ulNetMask;
1786     xEndPoint.bits.bIPv6 = pdFALSE_UNSIGNED;
1787 
1788     /* And that the IP is not in ARP cache. */
1789     for( uint16_t x = 0; x < ipconfigARP_CACHE_ENTRIES; x++ )
1790     {
1791         xARPCache[ x ].ulIPAddress = 0;
1792     }
1793 
1794     uxIPHeaderSizePacket_IgnoreAndReturn( ipSIZE_OF_IPv4_HEADER );
1795 
1796     FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
1797 
1798     /* For this unit-test, we do not concern ourselves with whether the ARP request
1799      * is actually sent or not. Effort is all that matters. */
1800     pxGetNetworkBufferWithDescriptor_ExpectAnyArgsAndReturn( NULL );
1801 
1802     FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoint, NULL );
1803 
1804     xResult = xCheckRequiresARPResolution( pxNetworkBuffer );
1805 
1806     TEST_ASSERT_EQUAL( pdTRUE, xResult );
1807 }
1808 
test_xCheckRequiresARPResolution_OnLocalNetwork_InCache(void)1809 void test_xCheckRequiresARPResolution_OnLocalNetwork_InCache( void )
1810 {
1811     struct xNetworkEndPoint xEndPoint = { 0 };
1812     NetworkBufferDescriptor_t xNetworkBuffer, * pxNetworkBuffer;
1813     uint8_t ucEthernetBuffer[ ipconfigNETWORK_MTU ];
1814     BaseType_t xResult;
1815 
1816     pxNetworkBuffer = &xNetworkBuffer;
1817     pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
1818 
1819     IPPacket_t * pxIPPacket = ( ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer );
1820     IPHeader_t * pxIPHeader = &( pxIPPacket->xIPHeader );
1821 
1822     xEndPoint.ipv4_settings.ulIPAddress = 0xABCD1234;
1823     xEndPoint.ipv4_settings.ulNetMask = 0xFFFFFF00;
1824 
1825     /* Make sure there is a match. */
1826     pxIPHeader->ulSourceIPAddress = xEndPoint.ipv4_settings.ulIPAddress & xEndPoint.ipv4_settings.ulNetMask;
1827 
1828     xNetworkBuffer.pxEndPoint = &xEndPoint;
1829 
1830     /* And that the IP is not in ARP cache. */
1831     for( uint16_t x = 0; x < ipconfigARP_CACHE_ENTRIES; x++ )
1832     {
1833         xARPCache[ x ].ulIPAddress = pxIPHeader->ulSourceIPAddress;
1834         xARPCache[ x ].ucValid = ( uint8_t ) pdTRUE;
1835     }
1836 
1837     uxIPHeaderSizePacket_IgnoreAndReturn( ipSIZE_OF_IPv4_HEADER );
1838 
1839     xResult = xCheckRequiresARPResolution( pxNetworkBuffer );
1840 
1841     TEST_ASSERT_EQUAL( pdFALSE, xResult );
1842 }
1843 
1844 
test_ulARPRemoveCacheEntryByMac_NoMatch(void)1845 void test_ulARPRemoveCacheEntryByMac_NoMatch( void )
1846 {
1847     uint32_t ulResult;
1848     const MACAddress_t xMACAddress = { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA };
1849     int i;
1850     BaseType_t xEntryToCheck;
1851     uint8_t ucBuffer[ sizeof( xARPCache[ 0 ] ) ];
1852 
1853     /* Catch some asserts. */
1854     catch_assert( ulARPRemoveCacheEntryByMac( NULL ) );
1855 
1856     /* =================================================== */
1857     /* Make sure no entry matches. */
1858     for( i = 0; i < ipconfigARP_CACHE_ENTRIES; i++ )
1859     {
1860         xARPCache[ i ].ulIPAddress = 0xAABBCCDD;
1861         memset( xARPCache[ i ].xMACAddress.ucBytes, 0x11, sizeof( xMACAddress.ucBytes ) );
1862     }
1863 
1864     ulResult = ulARPRemoveCacheEntryByMac( &xMACAddress );
1865     TEST_ASSERT_EQUAL( 0, ulResult );
1866     /* =================================================== */
1867 }
1868 
test_ulARPRemoveCacheEntryByMac_OneMatchingEntry(void)1869 void test_ulARPRemoveCacheEntryByMac_OneMatchingEntry( void )
1870 {
1871     uint32_t ulResult;
1872     const MACAddress_t xMACAddress = { 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA };
1873     int i;
1874     BaseType_t xEntryToCheck;
1875     uint8_t ucBuffer[ sizeof( xARPCache[ 0 ] ) ];
1876 
1877     /* =================================================== */
1878     /* Make sure only one entry matches. */
1879     for( i = 0; i < ipconfigARP_CACHE_ENTRIES; i++ )
1880     {
1881         xARPCache[ i ].ulIPAddress = 0xAABBCCDD;
1882         memset( xARPCache[ i ].xMACAddress.ucBytes, 0x11, sizeof( xMACAddress.ucBytes ) );
1883     }
1884 
1885     xEntryToCheck = 1;
1886     xARPCache[ xEntryToCheck ].ulIPAddress = 0xAABBCCEE;
1887     memset( xARPCache[ xEntryToCheck ].xMACAddress.ucBytes, 0xAA, sizeof( xMACAddress.ucBytes ) );
1888     memset( ucBuffer, 0, sizeof( xARPCache[ 0 ] ) );
1889     ulResult = ulARPRemoveCacheEntryByMac( &xMACAddress );
1890     TEST_ASSERT_EQUAL( 0xAABBCCEE, ulResult );
1891     TEST_ASSERT_EQUAL( 0, memcmp( ucBuffer, &xARPCache[ xEntryToCheck ], sizeof( xARPCache[ 0 ] ) ) );
1892 }
1893 
test_vARPRefreshCacheEntry_NULLMAC_NoMatchingEntry(void)1894 void test_vARPRefreshCacheEntry_NULLMAC_NoMatchingEntry( void )
1895 {
1896     MACAddress_t xMACAddress;
1897     uint32_t ulIPAddress;
1898     int i;
1899     BaseType_t xUseEntry;
1900     struct xNetworkEndPoint xEndPoint = { 0 };
1901 
1902     for( i = 0; i < ipconfigARP_CACHE_ENTRIES; i++ )
1903     {
1904         xARPCache[ i ].ulIPAddress = 0xAABBCCDD;
1905         xARPCache[ i ].ucAge = 255;
1906         xARPCache[ i ].ucValid = pdTRUE;
1907     }
1908 
1909     FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( NULL );
1910 
1911     ulIPAddress = 0x00;
1912     /* Pass a NULL MAC Address and an IP address which will not match. */
1913     vARPRefreshCacheEntry( NULL, ulIPAddress, &xEndPoint );
1914 
1915     /* Since no matching entry will be found with smallest age (i.e. oldest), 0th entry will be updated to have the below details. */
1916     TEST_ASSERT_EQUAL( xARPCache[ 0 ].ucAge, ( uint8_t ) ipconfigMAX_ARP_RETRANSMISSIONS );
1917     TEST_ASSERT_EQUAL( xARPCache[ 0 ].ucValid, ( uint8_t ) pdFALSE );
1918     /* =================================================== */
1919 }
1920 
test_vARPRefreshCacheEntry_NULLMAC_MatchingEntry(void)1921 void test_vARPRefreshCacheEntry_NULLMAC_MatchingEntry( void )
1922 {
1923     MACAddress_t xMACAddress;
1924     uint32_t ulIPAddress;
1925     int i;
1926     BaseType_t xUseEntry;
1927     struct xNetworkEndPoint xEndPoint = { 0 };
1928 
1929     /* =================================================== */
1930     for( i = 0; i < ipconfigARP_CACHE_ENTRIES; i++ )
1931     {
1932         xARPCache[ i ].ulIPAddress = 0xAABBCCDD;
1933         xARPCache[ i ].ucAge = 255;
1934         xARPCache[ i ].ucValid = pdTRUE;
1935     }
1936 
1937     xARPCache[ 1 ].ulIPAddress = 0xAABBCCEE;
1938 
1939     FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( NULL );
1940 
1941     ulIPAddress = 0xAABBCCEE;
1942     /* Pass a NULL MAC Address and an IP address which will match. */
1943     vARPRefreshCacheEntry( NULL, ulIPAddress, &xEndPoint );
1944 
1945     /* Since no matching entry will be found with smallest age (i.e. oldest), 0th entry will be updated to have the below details. */
1946     TEST_ASSERT_EQUAL( xARPCache[ 1 ].ucAge, 255 );
1947     TEST_ASSERT_EQUAL( xARPCache[ 1 ].ucValid, ( uint8_t ) pdTRUE );
1948     /* =================================================== */
1949 }
1950 
test_vARPRefreshCacheEntry_MACWontMatch_IPWillMatch(void)1951 void test_vARPRefreshCacheEntry_MACWontMatch_IPWillMatch( void )
1952 {
1953     MACAddress_t xMACAddress;
1954     uint32_t ulIPAddress;
1955     int i;
1956     BaseType_t xUseEntry;
1957     struct xNetworkEndPoint xEndPoint = { 0 };
1958 
1959     /* =================================================== */
1960     for( i = 0; i < ipconfigARP_CACHE_ENTRIES; i++ )
1961     {
1962         xARPCache[ i ].ulIPAddress = 0xAABBCCDD;
1963         xARPCache[ i ].ucAge = 255;
1964         xARPCache[ i ].ucValid = pdTRUE;
1965         memset( xARPCache[ i ].xMACAddress.ucBytes, 0x34, sizeof( xMACAddress.ucBytes ) );
1966     }
1967 
1968     xUseEntry = 1;
1969     xARPCache[ xUseEntry ].ulIPAddress = 0xAABBCCEE;
1970 
1971     ulIPAddress = 0xAABBCCEE;
1972     memset( xMACAddress.ucBytes, 0x11, ipMAC_ADDRESS_LENGTH_BYTES );
1973     /* Pass a MAC Address which won't match and an IP address which will match. */
1974 
1975     FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( NULL );
1976 
1977     vARPRefreshCacheEntry( &xMACAddress, ulIPAddress, &xEndPoint );
1978 
1979     /* Since no matching entry will be found with smallest age (i.e. oldest), 0th entry will be updated to have the below details. */
1980     TEST_ASSERT_EQUAL_MESSAGE( ipconfigMAX_ARP_AGE, xARPCache[ xUseEntry ].ucAge, "Test 3" );
1981     TEST_ASSERT_EQUAL( ( uint8_t ) pdTRUE, xARPCache[ xUseEntry ].ucValid );
1982     TEST_ASSERT_EQUAL_MEMORY( xMACAddress.ucBytes, xARPCache[ xUseEntry ].xMACAddress.ucBytes, sizeof( xMACAddress.ucBytes ) );
1983     /* =================================================== */
1984 }
1985 
test_vARPRefreshCacheEntry_MACAndIPWillMatch(void)1986 void test_vARPRefreshCacheEntry_MACAndIPWillMatch( void )
1987 {
1988     MACAddress_t xMACAddress;
1989     uint32_t ulIPAddress;
1990     int i;
1991     BaseType_t xUseEntry;
1992     struct xNetworkEndPoint xEndPoint = { 0 };
1993 
1994     /* =================================================== */
1995     for( i = 0; i < ipconfigARP_CACHE_ENTRIES; i++ )
1996     {
1997         xARPCache[ i ].ulIPAddress = 0xAABBCCDD;
1998         xARPCache[ i ].ucAge = 255;
1999         xARPCache[ i ].ucValid = pdFALSE;
2000         memset( xARPCache[ i ].xMACAddress.ucBytes, 0x34, sizeof( xMACAddress.ucBytes ) );
2001     }
2002 
2003     xUseEntry = 1;
2004     xARPCache[ xUseEntry ].ulIPAddress = 0xAABBCCEE;
2005     /* Set a MAC address which will match */
2006     memset( xARPCache[ xUseEntry ].xMACAddress.ucBytes, 0x11, sizeof( xMACAddress.ucBytes ) );
2007 
2008     ulIPAddress = 0xAABBCCEE;
2009     memset( xMACAddress.ucBytes, 0x11, ipMAC_ADDRESS_LENGTH_BYTES );
2010 
2011     FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( NULL );
2012 
2013     /* Pass a MAC Address which will match and an IP address which will match too. */
2014     vARPRefreshCacheEntry( &xMACAddress, ulIPAddress, &xEndPoint );
2015 
2016     /* Since no matching entry will be found with smallest age (i.e. oldest), 0th entry will be updated to have the below details. */
2017     TEST_ASSERT_EQUAL_MESSAGE( ipconfigMAX_ARP_AGE, xARPCache[ xUseEntry ].ucAge, "Test 4" );
2018     TEST_ASSERT_EQUAL( ( uint8_t ) pdTRUE, xARPCache[ xUseEntry ].ucValid );
2019     TEST_ASSERT_EQUAL_MEMORY( xMACAddress.ucBytes, xARPCache[ xUseEntry ].xMACAddress.ucBytes, sizeof( xMACAddress.ucBytes ) );
2020     /* =================================================== */
2021 }
2022 
2023 
test_vARPRefreshCacheEntry_IPOnADifferentSubnet(void)2024 void test_vARPRefreshCacheEntry_IPOnADifferentSubnet( void )
2025 {
2026     MACAddress_t xMACAddress;
2027     uint32_t ulIPAddress;
2028     int i;
2029     BaseType_t xUseEntry;
2030     struct xNetworkEndPoint xEndPoint = { 0 };
2031 
2032     /* =================================================== */
2033     for( i = 0; i < ipconfigARP_CACHE_ENTRIES; i++ )
2034     {
2035         xARPCache[ i ].ulIPAddress = 0xAABBCCDD;
2036         xARPCache[ i ].ucAge = 255;
2037         xARPCache[ i ].ucValid = pdFALSE;
2038         memset( xARPCache[ i ].xMACAddress.ucBytes, 0x34, sizeof( xMACAddress.ucBytes ) );
2039     }
2040 
2041     xUseEntry = 1;
2042     xARPCache[ xUseEntry ].ulIPAddress = 0xAABBCCEE;
2043     /* Set a MAC address which will match */
2044     memset( xARPCache[ xUseEntry ].xMACAddress.ucBytes, 0x11, sizeof( xMACAddress.ucBytes ) );
2045     /* Set a local IP address */
2046     *ipLOCAL_IP_ADDRESS_POINTER = 0xAABBCCEF;
2047 
2048     /* The IP address being passed should not be on the same subnet. */
2049     ulIPAddress = 0x00BBCCEE;
2050     memset( xMACAddress.ucBytes, 0x11, ipMAC_ADDRESS_LENGTH_BYTES );
2051     /* Pass a MAC Address which will match and an IP address which will match too. */
2052 
2053     FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( ( void * ) 124 );
2054     FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( NULL );
2055 
2056     vARPRefreshCacheEntry( &xMACAddress, ulIPAddress, &xEndPoint );
2057 
2058     /* Since no matching entry will be found with smallest age (i.e. oldest), 0th entry will be updated to have the below details. */
2059     TEST_ASSERT_EQUAL_MESSAGE( ipconfigMAX_ARP_AGE, xARPCache[ 0 ].ucAge, "Test 5" );
2060     TEST_ASSERT_EQUAL( ( uint8_t ) pdTRUE, xARPCache[ 0 ].ucValid );
2061     TEST_ASSERT_EQUAL_MEMORY( xMACAddress.ucBytes, xARPCache[ 0 ].xMACAddress.ucBytes, sizeof( xMACAddress.ucBytes ) );
2062     /* =================================================== */
2063 }
2064 
test_vARPRefreshCacheEntry_IPAndMACInDifferentLocations(void)2065 void test_vARPRefreshCacheEntry_IPAndMACInDifferentLocations( void )
2066 {
2067     MACAddress_t xMACAddress;
2068     uint32_t ulIPAddress;
2069     int i;
2070     BaseType_t xUseEntry;
2071     struct xNetworkEndPoint xEndPoint = { 0 };
2072 
2073     /* =================================================== */
2074     for( i = 0; i < ipconfigARP_CACHE_ENTRIES; i++ )
2075     {
2076         xARPCache[ i ].ulIPAddress = 0xAABBCCDD;
2077         xARPCache[ i ].ucAge = i + 1;
2078         xARPCache[ i ].ucValid = pdFALSE;
2079         memset( xARPCache[ i ].xMACAddress.ucBytes, 0x34, sizeof( xMACAddress.ucBytes ) );
2080     }
2081 
2082     xUseEntry = 0;
2083 
2084     /* Make sure an entry matches. */
2085     xARPCache[ xUseEntry ].ulIPAddress = 0xAABBCCEE;
2086     ulIPAddress = 0xAABBCCEE;
2087 
2088     /* Also make sure that a MAC address matches. But a different one. */
2089     memset( xARPCache[ xUseEntry + 1 ].xMACAddress.ucBytes, 0x22, sizeof( xMACAddress.ucBytes ) );
2090     memset( xMACAddress.ucBytes, 0x22, ipMAC_ADDRESS_LENGTH_BYTES );
2091 
2092     FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( ( void * ) 124 );
2093     FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( ( void * ) 124 );
2094 
2095     /* Pass a MAC and IP Address which won't match, but age is now a factor. */
2096     vARPRefreshCacheEntry( &xMACAddress, ulIPAddress, &xEndPoint );
2097 
2098     /* Since no matching entry will be found with smallest age (i.e. oldest), 0th entry will be updated to have the below details. */
2099     TEST_ASSERT_EQUAL( xARPCache[ xUseEntry + 1 ].ulIPAddress, ulIPAddress );
2100     TEST_ASSERT_EQUAL_MESSAGE( ipconfigMAX_ARP_AGE, xARPCache[ xUseEntry + 1 ].ucAge, "Test 9" );
2101     TEST_ASSERT_EQUAL( ( uint8_t ) pdTRUE, xARPCache[ xUseEntry + 1 ].ucValid );
2102 
2103     uint8_t MemoryCompare[ sizeof( ARPCacheRow_t ) ];
2104 
2105     memset( MemoryCompare, 0, sizeof( ARPCacheRow_t ) );
2106     TEST_ASSERT_EQUAL_MEMORY( MemoryCompare, &xARPCache[ xUseEntry ], sizeof( ARPCacheRow_t ) );
2107     /* =================================================== */
2108 }
2109 
test_vARPRefreshCacheEntry_IPAndMACInDifferentLocations1(void)2110 void test_vARPRefreshCacheEntry_IPAndMACInDifferentLocations1( void )
2111 {
2112     MACAddress_t xMACAddress;
2113     uint32_t ulIPAddress;
2114     int i;
2115     BaseType_t xUseEntry;
2116     struct xNetworkEndPoint xEndPoint = { 0 };
2117 
2118     /* =================================================== */
2119     for( i = 0; i < ipconfigARP_CACHE_ENTRIES; i++ )
2120     {
2121         xARPCache[ i ].ulIPAddress = 0xAABBCCDD;
2122         xARPCache[ i ].ucAge = i + 1;
2123         xARPCache[ i ].ucValid = pdFALSE;
2124         memset( xARPCache[ i ].xMACAddress.ucBytes, 0x34, sizeof( xMACAddress.ucBytes ) );
2125     }
2126 
2127     xUseEntry = 0;
2128 
2129     /* Make sure an entry matches. */
2130     xARPCache[ xUseEntry ].ulIPAddress = 0xAABBCCEA;
2131     ulIPAddress = 0xAABBCCEE;
2132 
2133     /* Also make sure that a MAC address matches. But a different one. */
2134     memset( xARPCache[ xUseEntry + 1 ].xMACAddress.ucBytes, 0x22, sizeof( xMACAddress.ucBytes ) );
2135     memset( xMACAddress.ucBytes, 0x22, ipMAC_ADDRESS_LENGTH_BYTES );
2136 
2137     FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( ( void * ) 0x1234 );
2138     FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( ( void * ) 0x1234 );
2139 
2140     /* Pass a MAC and IP Address which won't match, but age is now a factor. */
2141     vARPRefreshCacheEntry( &xMACAddress, ulIPAddress, &xEndPoint );
2142 
2143     /* Since no matching entry will be found with smallest age (i.e. oldest), 0th entry will be updated to have the below details. */
2144     TEST_ASSERT_EQUAL( xARPCache[ xUseEntry + 1 ].ulIPAddress, ulIPAddress );
2145     TEST_ASSERT_EQUAL_MESSAGE( ipconfigMAX_ARP_AGE, xARPCache[ xUseEntry + 1 ].ucAge, "Test 9" );
2146     TEST_ASSERT_EQUAL( ( uint8_t ) pdTRUE, xARPCache[ xUseEntry + 1 ].ucValid );
2147 }
2148 
test_eARPGetCacheEntryByMac_catchAssert(void)2149 void test_eARPGetCacheEntryByMac_catchAssert( void )
2150 {
2151     uint32_t ulIPAddress = 0x12345678, ulEntryToTest;
2152     eARPLookupResult_t eResult;
2153     MACAddress_t xMACAddress = { 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 };
2154     int i;
2155     struct xNetworkInterface * xInterface;
2156 
2157     /* Hit some asserts */
2158     catch_assert( eARPGetCacheEntryByMac( NULL, &ulIPAddress, &xInterface ) );
2159     catch_assert( eARPGetCacheEntryByMac( &xMACAddress, NULL, &xInterface ) );
2160 }
2161 
test_eARPGetCacheEntryByMac_NullInterface(void)2162 void test_eARPGetCacheEntryByMac_NullInterface( void )
2163 {
2164     uint32_t ulIPAddress = 0x12345678, ulEntryToTest;
2165     eARPLookupResult_t eResult;
2166     MACAddress_t xMACAddress = { 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 };
2167     int i;
2168     struct xNetworkInterface * xInterface;
2169 
2170     /* =================================================== */
2171     /* Make sure no entry matches. */
2172     for( i = 0; i < ipconfigARP_CACHE_ENTRIES; i++ )
2173     {
2174         xARPCache[ i ].ulIPAddress = 0xAABBCCDD;
2175         memset( xARPCache[ i ].xMACAddress.ucBytes, 0x11, sizeof( xMACAddress.ucBytes ) );
2176     }
2177 
2178     eResult = eARPGetCacheEntryByMac( &xMACAddress, &ulIPAddress, NULL );
2179     TEST_ASSERT_EQUAL( eARPCacheMiss, eResult );
2180     TEST_ASSERT_EQUAL( 0x12345678, ulIPAddress );
2181     /* =================================================== */
2182 }
2183 
test_eARPGetCacheEntryByMac_NoMatchingEntries(void)2184 void test_eARPGetCacheEntryByMac_NoMatchingEntries( void )
2185 {
2186     uint32_t ulIPAddress = 0x12345678, ulEntryToTest;
2187     eARPLookupResult_t eResult;
2188     MACAddress_t xMACAddress = { 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 };
2189     int i;
2190     struct xNetworkInterface * xInterface;
2191 
2192     /* =================================================== */
2193     /* Make sure no entry matches. */
2194     for( i = 0; i < ipconfigARP_CACHE_ENTRIES; i++ )
2195     {
2196         xARPCache[ i ].ulIPAddress = 0xAABBCCDD;
2197         memset( xARPCache[ i ].xMACAddress.ucBytes, 0x11, sizeof( xMACAddress.ucBytes ) );
2198     }
2199 
2200     eResult = eARPGetCacheEntryByMac( &xMACAddress, &ulIPAddress, &xInterface );
2201     TEST_ASSERT_EQUAL( eARPCacheMiss, eResult );
2202     TEST_ASSERT_EQUAL( 0x12345678, ulIPAddress );
2203     /* =================================================== */
2204 }
2205 
test_eARPGetCacheEntryByMac_OneMatchingEntry(void)2206 void test_eARPGetCacheEntryByMac_OneMatchingEntry( void )
2207 {
2208     uint32_t ulIPAddress = 0x12345678, ulEntryToTest;
2209     eARPLookupResult_t eResult;
2210     MACAddress_t xMACAddress = { 0x22, 0x22, 0x22, 0x22, 0x22, 0x22 };
2211     int i;
2212     struct xNetworkInterface * xInterface;
2213 
2214     /* =================================================== */
2215     /* Make sure one entry matches. */
2216     for( i = 0; i < ipconfigARP_CACHE_ENTRIES; i++ )
2217     {
2218         xARPCache[ i ].ulIPAddress = 0xAABBCCDD;
2219         memset( xARPCache[ i ].xMACAddress.ucBytes, 0x11, sizeof( xMACAddress.ucBytes ) );
2220     }
2221 
2222     ulEntryToTest = 1;
2223     memset( xARPCache[ ulEntryToTest ].xMACAddress.ucBytes, 0x22, sizeof( xMACAddress.ucBytes ) );
2224     xARPCache[ ulEntryToTest ].ulIPAddress = 0xAABBCCEE;
2225     eResult = eARPGetCacheEntryByMac( &xMACAddress, &ulIPAddress, &xInterface );
2226     TEST_ASSERT_EQUAL( eARPCacheHit, eResult );
2227     TEST_ASSERT_EQUAL( xARPCache[ ulEntryToTest ].ulIPAddress, ulIPAddress );
2228     /* =================================================== */
2229     eResult = eARPGetCacheEntryByMac( &xMACAddress, &ulIPAddress, NULL );
2230     TEST_ASSERT_EQUAL( eARPCacheHit, eResult );
2231     TEST_ASSERT_EQUAL( xARPCache[ ulEntryToTest ].ulIPAddress, ulIPAddress );
2232     /* =================================================== */
2233     xARPCache[ ulEntryToTest ].pxEndPoint = NULL;
2234     eResult = eARPGetCacheEntryByMac( &xMACAddress, &ulIPAddress, &xInterface );
2235     TEST_ASSERT_EQUAL( eARPCacheHit, eResult );
2236     TEST_ASSERT_EQUAL( xARPCache[ ulEntryToTest ].ulIPAddress, ulIPAddress );
2237     /* =================================================== */
2238 }
2239 
test_eARPGetCacheEntry_CatchAssert(void)2240 void test_eARPGetCacheEntry_CatchAssert( void )
2241 {
2242     uint32_t ulIPAddress;
2243     MACAddress_t xMACAddress;
2244     struct xNetworkInterface * xInterface;
2245 
2246     catch_assert( eARPGetCacheEntry( NULL, &xMACAddress, &xInterface ) );
2247     catch_assert( eARPGetCacheEntry( &ulIPAddress, NULL, &xInterface ) );
2248     catch_assert( eARPGetCacheEntry( &ulIPAddress, &xMACAddress, NULL ) );
2249 }
2250 
test_eARPGetCacheEntry_IPMatchesBroadcastAddr(void)2251 void test_eARPGetCacheEntry_IPMatchesBroadcastAddr( void )
2252 {
2253     uint32_t ulIPAddress;
2254     MACAddress_t xMACAddress;
2255     eARPLookupResult_t eResult;
2256     uint32_t ulSavedGatewayAddress;
2257     struct xNetworkEndPoint * pxEndPoint, xEndPoint;
2258 
2259     /* =================================================== */
2260     ulIPAddress = FreeRTOS_ntohl( xNetworkAddressing.ulBroadcastAddress );
2261     /* Not worried about what these functions do. */
2262     FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
2263     xIsIPv4Multicast_ExpectAndReturn( ulIPAddress, 0UL );
2264     FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( &xEndPoint );
2265     eResult = eARPGetCacheEntry( &ulIPAddress, &xMACAddress, &pxEndPoint );
2266 
2267     TEST_ASSERT_EQUAL_MESSAGE( eARPCacheHit, eResult, "Test 3" );
2268     TEST_ASSERT_EQUAL( pxEndPoint, &xEndPoint );
2269     TEST_ASSERT_EQUAL_MEMORY_MESSAGE( &xBroadcastMACAddress, &xMACAddress, sizeof( xMACAddress ), "Test 3" );
2270     /* =================================================== */
2271 }
2272 
test_eARPGetCacheEntry_IPMatchesBroadcastAddr_NullEndPointOnNetMask(void)2273 void test_eARPGetCacheEntry_IPMatchesBroadcastAddr_NullEndPointOnNetMask( void )
2274 {
2275     uint32_t ulIPAddress;
2276     MACAddress_t xMACAddress;
2277     eARPLookupResult_t eResult;
2278     uint32_t ulSavedGatewayAddress;
2279     struct xNetworkEndPoint * pxEndPoint, xEndPoint;
2280 
2281     /* =================================================== */
2282     ulIPAddress = FreeRTOS_ntohl( xNetworkAddressing.ulBroadcastAddress );
2283     /* Not worried about what these functions do. */
2284     FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
2285     xIsIPv4Multicast_ExpectAndReturn( ulIPAddress, 0UL );
2286     FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( NULL );
2287     eResult = eARPGetCacheEntry( &ulIPAddress, &xMACAddress, &pxEndPoint );
2288 
2289     TEST_ASSERT_EQUAL( eARPCacheHit, eResult );
2290     /* =================================================== */
2291 }
2292 
test_eARPGetCacheEntry_MultiCastAddr(void)2293 void test_eARPGetCacheEntry_MultiCastAddr( void )
2294 {
2295     uint32_t ulIPAddress;
2296     MACAddress_t xMACAddress;
2297     eARPLookupResult_t eResult;
2298     uint32_t ulSavedGatewayAddress;
2299     struct xNetworkEndPoint * pxEndPoint, xEndPoint;
2300 
2301     /* =================================================== */
2302     ulIPAddress = FreeRTOS_ntohl( xNetworkAddressing.ulBroadcastAddress );
2303     FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
2304     xIsIPv4Multicast_ExpectAndReturn( ulIPAddress, 1UL );
2305     vSetMultiCastIPv4MacAddress_Ignore();
2306     FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, NULL );
2307 
2308     eResult = eARPGetCacheEntry( &ulIPAddress, &xMACAddress, &pxEndPoint );
2309 
2310     TEST_ASSERT_EQUAL( eCantSendPacket, eResult );
2311     /* =================================================== */
2312 
2313     xEndPoint.bits.bIPv6 = 1;
2314     FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
2315     xIsIPv4Multicast_ExpectAndReturn( ulIPAddress, 1UL );
2316     vSetMultiCastIPv4MacAddress_Ignore();
2317     FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
2318     FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoint, NULL );
2319 
2320     eResult = eARPGetCacheEntry( &ulIPAddress, &xMACAddress, &pxEndPoint );
2321 
2322     TEST_ASSERT_EQUAL( eCantSendPacket, eResult );
2323     /* =================================================== */
2324 }
2325 
test_eARPGetCacheEntry_IPMatchesOtherBroadcastAddr(void)2326 void test_eARPGetCacheEntry_IPMatchesOtherBroadcastAddr( void )
2327 {
2328     uint32_t ulIPAddress;
2329     MACAddress_t xMACAddress;
2330     eARPLookupResult_t eResult;
2331     uint32_t ulSavedGatewayAddress;
2332     struct xNetworkInterface * xInterface;
2333     struct xNetworkEndPoint * pxEndPoint, xEndPoint;
2334 
2335     /* =================================================== */
2336     ulIPAddress = FreeRTOS_ntohl( ipBROADCAST_IP_ADDRESS );
2337     /* Not worried about what these functions do. */
2338     FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
2339     xIsIPv4Multicast_ExpectAndReturn( ulIPAddress, 0UL );
2340     FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( &xEndPoint );
2341     eResult = eARPGetCacheEntry( &ulIPAddress, &xMACAddress, &xInterface );
2342     TEST_ASSERT_EQUAL_MESSAGE( eARPCacheHit, eResult, "Test 3" );
2343     TEST_ASSERT_EQUAL_MEMORY_MESSAGE( &xBroadcastMACAddress, &xMACAddress, sizeof( xMACAddress ), "Test 3" );
2344     /* =================================================== */
2345 }
2346 
2347 /* TODO: _TJ_: For the time being test_eARPGetCacheEntry_LocalIPIsZero and test_eARPGetCacheEntry_LocalIPMatchesReceivedIP */
2348 /*             test cases are removed as we need to reevaluate if those cases are required for IPv6 */
2349 
test_eARPGetCacheEntry_MatchingInvalidEntry(void)2350 void test_eARPGetCacheEntry_MatchingInvalidEntry( void )
2351 {
2352     uint32_t ulIPAddress;
2353     MACAddress_t xMACAddress;
2354     eARPLookupResult_t eResult;
2355     uint32_t ulSavedGatewayAddress;
2356     struct xNetworkInterface * xInterface;
2357     struct xNetworkEndPoint * pxEndPoint, xEndPoint;
2358 
2359     /* =================================================== */
2360     ulIPAddress = 0x4321;
2361     /* Make both values (IP address and local IP pointer) different. */
2362     *ipLOCAL_IP_ADDRESS_POINTER = 0x1234;
2363     /* Add the IP address in the cache so that we'll have a cache hit. */
2364     xARPCache[ 1 ].ulIPAddress = xNetworkAddressing.ulGatewayAddress;
2365     /* But reset the valid bit. */
2366     xARPCache[ 1 ].ucValid = pdFALSE;
2367     /* Not worried about what these functions do. */
2368     xEndPoint.ipv4_settings.ulGatewayAddress = xNetworkAddressing.ulGatewayAddress;
2369     FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
2370     xIsIPv4Multicast_ExpectAndReturn( ulIPAddress, 0UL );
2371     FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( NULL );
2372     FreeRTOS_FindGateWay_ExpectAnyArgsAndReturn( &xEndPoint );
2373     eResult = eARPGetCacheEntry( &ulIPAddress, &xMACAddress, &xInterface );
2374     TEST_ASSERT_EQUAL_MESSAGE( eCantSendPacket, eResult, "Test 6" );
2375     /* =================================================== */
2376 }
2377 
test_eARPGetCacheEntry_MatchingValidEntry(void)2378 void test_eARPGetCacheEntry_MatchingValidEntry( void )
2379 {
2380     uint32_t ulIPAddress;
2381     MACAddress_t xMACAddress;
2382     eARPLookupResult_t eResult;
2383     uint32_t ulSavedGatewayAddress;
2384     struct xNetworkInterface * xInterface;
2385     struct xNetworkEndPoint * pxEndPoint, xEndPoint;
2386 
2387     /* =================================================== */
2388     ulIPAddress = 0x4321;
2389     /* Make both values (IP address and local IP pointer) different. */
2390     *ipLOCAL_IP_ADDRESS_POINTER = 0x1234;
2391     /* Add the IP address in the cache so that we'll have a cache hit. */
2392     xARPCache[ 1 ].ulIPAddress = xNetworkAddressing.ulGatewayAddress;
2393     /* Now try with a set valid bit. */
2394     xARPCache[ 1 ].ucValid = pdTRUE;
2395     /* Not worried about what these functions do. */
2396     xEndPoint.ipv4_settings.ulGatewayAddress = xNetworkAddressing.ulGatewayAddress;
2397     FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
2398     xIsIPv4Multicast_ExpectAndReturn( ulIPAddress, 0UL );
2399     FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( NULL );
2400     FreeRTOS_FindGateWay_ExpectAnyArgsAndReturn( &xEndPoint );
2401     eResult = eARPGetCacheEntry( &ulIPAddress, &xMACAddress, &xInterface );
2402     TEST_ASSERT_EQUAL_MESSAGE( eARPCacheHit, eResult, "Test 7" );
2403     TEST_ASSERT_EQUAL_MEMORY_MESSAGE( &xARPCache[ 1 ].xMACAddress, &xMACAddress, sizeof( xMACAddress ), "Test 7" );
2404     /* =================================================== */
2405 }
2406 
test_eARPGetCacheEntry_GatewayAddressZero(void)2407 void test_eARPGetCacheEntry_GatewayAddressZero( void )
2408 {
2409     uint32_t ulIPAddress;
2410     MACAddress_t xMACAddress;
2411     eARPLookupResult_t eResult;
2412     uint32_t ulSavedGatewayAddress;
2413     struct xNetworkInterface * xInterface;
2414     struct xNetworkEndPoint * pxEndPoint, xEndPoint;
2415 
2416     /* =================================================== */
2417     for( int i = 0; i < ipconfigARP_CACHE_ENTRIES; i++ )
2418     {
2419         xARPCache[ i ].ucValid = ( uint8_t ) pdFALSE;
2420     }
2421 
2422     *ipLOCAL_IP_ADDRESS_POINTER = 0x1234;
2423 
2424     ulIPAddress = 0x4321;
2425     /* Not worried about what these functions do. */
2426     xEndPoint.ipv4_settings.ulGatewayAddress = 0;
2427     FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
2428     xIsIPv4Multicast_ExpectAndReturn( ulIPAddress, 0UL );
2429     FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( NULL );
2430     FreeRTOS_FindGateWay_ExpectAnyArgsAndReturn( NULL );
2431     eResult = eARPGetCacheEntry( &ulIPAddress, &xMACAddress, &xInterface );
2432 
2433     TEST_ASSERT_EQUAL_MESSAGE( eARPCacheMiss, eResult, "Test 9" );
2434     /* =================================================== */
2435 }
2436 
test_eARPGetCacheEntry_AddressNotOnLocalAddress(void)2437 void test_eARPGetCacheEntry_AddressNotOnLocalAddress( void )
2438 {
2439     uint32_t ulIPAddress;
2440     MACAddress_t xMACAddress;
2441     eARPLookupResult_t eResult;
2442     uint32_t ulSavedGatewayAddress;
2443     struct xNetworkInterface * xInterface;
2444 
2445     /* =================================================== */
2446     ulIPAddress = 0;
2447     /* Make both values (IP address and local IP pointer) different. */
2448     /* Get any address on the same netmask. */
2449     *ipLOCAL_IP_ADDRESS_POINTER = 0x00000034;
2450 
2451     /* Not worried about what these functions do. */
2452     FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
2453     xIsIPv4Multicast_ExpectAndReturn( ulIPAddress, 0UL );
2454     FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( NULL );
2455     FreeRTOS_FindGateWay_ExpectAnyArgsAndReturn( NULL );
2456     eResult = eARPGetCacheEntry( &ulIPAddress, &xMACAddress, &xInterface );
2457     TEST_ASSERT_EQUAL_MESSAGE( eCantSendPacket, eResult, "Test 11" );
2458     /* =================================================== */
2459 }
2460 
test_eARPGetCacheEntry_NoCacheHit(void)2461 void test_eARPGetCacheEntry_NoCacheHit( void )
2462 {
2463     uint32_t ulIPAddress;
2464     MACAddress_t xMACAddress;
2465     eARPLookupResult_t eResult;
2466     uint32_t ulSavedGatewayAddress;
2467     struct xNetworkInterface * xInterface;
2468 
2469     /* =================================================== */
2470     for( int i = 0; i < ipconfigARP_CACHE_ENTRIES; i++ )
2471     {
2472         xARPCache[ i ].ulIPAddress = 0;
2473         xARPCache[ i ].ucValid = ( uint8_t ) pdTRUE;
2474     }
2475 
2476     ulSavedGatewayAddress = xNetworkAddressing.ulGatewayAddress;
2477     xNetworkAddressing.ulGatewayAddress = 0;
2478     /* Make IP address param == 0 */
2479     ulIPAddress = 0;
2480 
2481     /* Make both values (IP address and local IP pointer) different
2482      * and on different net masks. */
2483     *ipLOCAL_IP_ADDRESS_POINTER = 0x1234;
2484     /* Not worried about what these functions do. */
2485     FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
2486     xIsIPv4Multicast_ExpectAndReturn( ulIPAddress, 0UL );
2487     FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( NULL );
2488     eResult = eARPGetCacheEntry( &ulIPAddress, &xMACAddress, &xInterface );
2489     xNetworkAddressing.ulGatewayAddress = ulSavedGatewayAddress;
2490     TEST_ASSERT_EQUAL( eARPCacheHit, eResult );
2491     /* =================================================== */
2492 }
2493 
test_vARPAgeCache(void)2494 void test_vARPAgeCache( void )
2495 {
2496     NetworkEndPoint_t xEndPoint = { 0 };
2497     NetworkInterface_t xInterface;
2498 
2499     xEndPoint.pxNext = NULL;
2500     xEndPoint.bits.bIPv6 = pdFALSE_UNSIGNED;
2501 
2502     /* Invalidate the first cache entry. */
2503     for( int i = 0; i < ipconfigARP_CACHE_ENTRIES; i++ )
2504     {
2505         xARPCache[ i ].ucAge = 0;
2506     }
2507 
2508     uint8_t ucEntryToCheck = 1;
2509 
2510     pxNetworkEndPoints = &xEndPoint;
2511     xEndPoint.bits.bEndPointUp = pdTRUE_UNSIGNED;
2512     xEndPoint.ipv4_settings.ulIPAddress = 0x1234;
2513 
2514     /* =================================================== */
2515     /* Let the value returned first time be 0 such that the variable is reset. */
2516     xTaskGetTickCount_ExpectAndReturn( 0 );
2517 
2518     pxNetworkEndPoints = &xEndPoint;
2519 
2520     FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
2521 
2522     /* The function which calls 'pxGetNetworkBufferWithDescriptor' is 'FreeRTOS_OutputARPRequest'.
2523      * It doesn't return anything and will be tested separately. */
2524     pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, NULL );
2525 
2526     FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoint, NULL );
2527 
2528     vARPAgeCache();
2529     /* =================================================== */
2530 
2531     /* / * =================================================== * / */
2532     /* / * Make second entry invalid but with age > 1. * / */
2533     xARPCache[ ucEntryToCheck ].ucAge = 1;
2534     xARPCache[ ucEntryToCheck ].ucValid = pdFALSE;
2535     /* Set an IP address */
2536     xARPCache[ ucEntryToCheck ].ulIPAddress = 0xAAAAAAAA;
2537 
2538     FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
2539 
2540     /* The function which calls 'pxGetNetworkBufferWithDescriptor' is 'FreeRTOS_OutputARPRequest'.
2541      * It doesn't return anything and will be tested separately. */
2542     pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, NULL );
2543 
2544     FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoint, NULL );
2545 
2546     /* Let the value returned first time be 100. */
2547     xTaskGetTickCount_ExpectAndReturn( 100 );
2548 
2549     FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
2550 
2551     /* The function which calls 'pxGetNetworkBufferWithDescriptor' is 'FreeRTOS_OutputARPRequest'.
2552      * It doesn't return anything and will be tested separately. */
2553     pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, NULL );
2554 
2555     FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoint, NULL );
2556 
2557     vARPAgeCache();
2558     /* =================================================== */
2559 
2560     /* =================================================== */
2561     /* Make second entry invalid but with age > 1. */
2562     xARPCache[ ucEntryToCheck ].ucAge = 1;
2563     xARPCache[ ucEntryToCheck ].ucValid = pdTRUE;
2564     /* Set an IP address */
2565     xARPCache[ ucEntryToCheck ].ulIPAddress = 0xAAAAAAAA;
2566 
2567     FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
2568 
2569     /* The function which calls 'pxGetNetworkBufferWithDescriptor' is 'FreeRTOS_OutputARPRequest'.
2570      * It doesn't return anything and will be tested separately. */
2571     pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, NULL );
2572 
2573     FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoint, NULL );
2574 
2575     /* Let the value returned first time be 100. */
2576     xTaskGetTickCount_ExpectAndReturn( 100 );
2577 
2578     vARPAgeCache();
2579     /* =================================================== */
2580 
2581     /* =================================================== */
2582     /* Make second entry invalid but with age > 1. */
2583     xARPCache[ ucEntryToCheck ].ucAge = 100;
2584     xARPCache[ ucEntryToCheck ].ucValid = pdTRUE;
2585     /* Set an IP address */
2586     xARPCache[ ucEntryToCheck ].ulIPAddress = 0xAAAAAAAA;
2587 
2588     /* This time the pxGetNetworkBuffer will be called. */
2589     /* Let the value returned third time be 100000. */
2590     xTaskGetTickCount_ExpectAndReturn( 100000 );
2591 
2592     FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
2593 
2594     /* The function which calls 'pxGetNetworkBufferWithDescriptor' is 'FreeRTOS_OutputARPRequest'.
2595      * It doesn't return anything and will be tested separately. */
2596     pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, NULL );
2597 
2598     FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoint, NULL );
2599 
2600     vARPAgeCache();
2601     /* =================================================== */
2602 
2603     xEndPoint.bits.bEndPointUp = pdFALSE_UNSIGNED;
2604     /* Make second entry invalid but with age > 1. */
2605     xARPCache[ ucEntryToCheck ].ucAge = 100;
2606     xARPCache[ ucEntryToCheck ].ucValid = pdTRUE;
2607     /* Set an IP address */
2608     xARPCache[ ucEntryToCheck ].ulIPAddress = 0xAAAAAAAA;
2609 
2610     xTaskGetTickCount_ExpectAndReturn( 100 );
2611 
2612     vARPAgeCache();
2613     /* =================================================== */
2614 
2615     xEndPoint.bits.bEndPointUp = pdTRUE_UNSIGNED;
2616     xEndPoint.ipv4_settings.ulIPAddress = 0;
2617     /* Make second entry invalid but with age > 1. */
2618     xARPCache[ ucEntryToCheck ].ucAge = 0;
2619     xARPCache[ ucEntryToCheck ].ucValid = pdTRUE;
2620     /* Set an IP address */
2621     xARPCache[ ucEntryToCheck ].ulIPAddress = 0xAAAAAAAA;
2622 
2623     xTaskGetTickCount_ExpectAndReturn( 50000 );
2624 
2625     vARPAgeCache();
2626     /* =================================================== */
2627 
2628     xEndPoint.ipv4_settings.ulIPAddress = 0x1234;
2629     xEndPoint.bits.bIPv6 = pdTRUE_UNSIGNED;
2630     /* Make second entry invalid but with age > 1. */
2631     xARPCache[ ucEntryToCheck ].ucAge = 0;
2632     xARPCache[ ucEntryToCheck ].ucValid = pdTRUE;
2633     /* Set an IP address */
2634     xARPCache[ ucEntryToCheck ].ulIPAddress = 0xAAAAAAAA;
2635 
2636     xTaskGetTickCount_ExpectAndReturn( 100000 );
2637 
2638     FreeRTOS_OutputAdvertiseIPv6( &xEndPoint );
2639 
2640     vARPAgeCache();
2641     /* =================================================== */
2642 }
2643 
test_vARPSendGratuitous(void)2644 void test_vARPSendGratuitous( void )
2645 {
2646     /* The output is ignored. But we should check the input though. */
2647     xSendEventToIPTask_ExpectAndReturn( eARPTimerEvent, 0 );
2648     vARPSendGratuitous();
2649 }
2650 
2651 uint32_t xNetworkInterfaceOutput_ARP_STUB_CallCount = 0;
xNetworkInterfaceOutput_ARP_STUB(NetworkInterface_t * pxInterface,NetworkBufferDescriptor_t * const pxNetworkBuffer,BaseType_t bReleaseAfterSend)2652 BaseType_t xNetworkInterfaceOutput_ARP_STUB( NetworkInterface_t * pxInterface,
2653                                              NetworkBufferDescriptor_t * const pxNetworkBuffer,
2654                                              BaseType_t bReleaseAfterSend )
2655 {
2656     xNetworkInterfaceOutput_ARP_STUB_CallCount++;
2657     return pdTRUE_UNSIGNED;
2658 }
2659 
test_FreeRTOS_OutputARPRequest(void)2660 void test_FreeRTOS_OutputARPRequest( void )
2661 {
2662     NetworkEndPoint_t xEndPoint = { 0 };
2663     NetworkInterface_t xInterface;
2664     uint8_t ucBuffer[ sizeof( ARPPacket_t ) + ipBUFFER_PADDING + ipconfigETHERNET_MINIMUM_PACKET_BYTES ];
2665     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
2666     uint32_t ulIPAddress = 0xAAAAAAAA;
2667 
2668     xNetworkBuffer.pucEthernetBuffer = ucBuffer;
2669     xNetworkBuffer.xDataLength = sizeof( ARPPacket_t );
2670 
2671     xEndPoint.bits.bEndPointUp = pdTRUE_UNSIGNED;
2672     xEndPoint.ipv4_settings.ulIPAddress = 0x1234;
2673     xEndPoint.pxNetworkInterface = &xInterface;
2674     xEndPoint.pxNetworkInterface->pfOutput = xNetworkInterfaceOutput_ARP_STUB;
2675 
2676     /* =================================================== */
2677     xNetworkInterfaceOutput_ARP_STUB_CallCount = 0;
2678 
2679     FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
2680 
2681     pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, &xNetworkBuffer );
2682 
2683     xIsCallingFromIPTask_IgnoreAndReturn( pdTRUE );
2684 
2685     FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoint, NULL );
2686 
2687     FreeRTOS_OutputARPRequest( ulIPAddress );
2688     TEST_ASSERT_EQUAL( xNetworkInterfaceOutput_ARP_STUB_CallCount, 1 );
2689 
2690     /* =================================================== */
2691 
2692     /* =================================================== */
2693     xNetworkInterfaceOutput_ARP_STUB_CallCount = 0;
2694 
2695     FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
2696 
2697     pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, &xNetworkBuffer );
2698 
2699     xIsCallingFromIPTask_IgnoreAndReturn( pdFALSE );
2700     xSendEventStructToIPTask_IgnoreAndReturn( pdFAIL );
2701     vReleaseNetworkBufferAndDescriptor_Expect( &xNetworkBuffer );
2702     FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoint, NULL );
2703 
2704     FreeRTOS_OutputARPRequest( ulIPAddress );
2705     TEST_ASSERT_EQUAL( xNetworkInterfaceOutput_ARP_STUB_CallCount, 0 );
2706 
2707     /* =================================================== */
2708 
2709     /* =================================================== */
2710     xNetworkInterfaceOutput_ARP_STUB_CallCount = 0;
2711     FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
2712 
2713     pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, &xNetworkBuffer );
2714     xIsCallingFromIPTask_IgnoreAndReturn( pdFALSE );
2715     xSendEventStructToIPTask_IgnoreAndReturn( pdPASS );
2716     FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoint, NULL );
2717 
2718     FreeRTOS_OutputARPRequest( ulIPAddress );
2719 
2720     TEST_ASSERT_EQUAL( xNetworkInterfaceOutput_ARP_STUB_CallCount, 0 );
2721     /* =================================================== */
2722 
2723     /* =================================================== */
2724     xNetworkInterfaceOutput_ARP_STUB_CallCount = 0;
2725     xEndPoint.pxNetworkInterface = NULL;
2726 
2727     FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
2728 
2729     pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, &xNetworkBuffer );
2730     xIsCallingFromIPTask_IgnoreAndReturn( pdTRUE );
2731 
2732     FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoint, NULL );
2733 
2734     FreeRTOS_OutputARPRequest( ulIPAddress );
2735     TEST_ASSERT_EQUAL( xNetworkInterfaceOutput_ARP_STUB_CallCount, 0 );
2736     /* =================================================== */
2737 
2738     xEndPoint.pxNetworkInterface = &xInterface;
2739 
2740     /* =================================================== */
2741     xNetworkInterfaceOutput_ARP_STUB_CallCount = 0;
2742     xNetworkBuffer.xDataLength = ( size_t ) ipconfigETHERNET_MINIMUM_PACKET_BYTES;
2743 
2744     FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
2745 
2746     pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, &xNetworkBuffer );
2747     xIsCallingFromIPTask_IgnoreAndReturn( pdTRUE );
2748 
2749     FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoint, NULL );
2750 
2751     FreeRTOS_OutputARPRequest( ulIPAddress );
2752 
2753     TEST_ASSERT_EQUAL( xNetworkInterfaceOutput_ARP_STUB_CallCount, 1 );
2754     TEST_ASSERT_EQUAL( xNetworkBuffer.xDataLength, ( size_t ) ipconfigETHERNET_MINIMUM_PACKET_BYTES );
2755     /* =================================================== */
2756 
2757     /* =================================================== */
2758     xNetworkInterfaceOutput_ARP_STUB_CallCount = 0;
2759     xEndPoint.bits.bIPv6 = 1;
2760 
2761     FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
2762     FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoint, NULL );
2763 
2764     FreeRTOS_OutputARPRequest( ulIPAddress );
2765     TEST_ASSERT_EQUAL( xNetworkInterfaceOutput_ARP_STUB_CallCount, 0 );
2766     /* =================================================== */
2767 
2768     /* =================================================== */
2769     xNetworkInterfaceOutput_ARP_STUB_CallCount = 0;
2770 
2771     xEndPoint.bits.bIPv6 = 0;
2772     xEndPoint.ipv4_settings.ulIPAddress = 0U;
2773 
2774     FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
2775     FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoint, NULL );
2776 
2777     FreeRTOS_OutputARPRequest( ulIPAddress );
2778     TEST_ASSERT_EQUAL( xNetworkInterfaceOutput_ARP_STUB_CallCount, 0 );
2779     /* =================================================== */
2780 }
2781 
2782 
vStoreTimeValue(TimeOut_t * const timeout,int32_t callbacks)2783 void vStoreTimeValue( TimeOut_t * const timeout,
2784                       int32_t callbacks )
2785 {
2786     timeout->xOverflowCount = 0;
2787     timeout->xTimeOnEntering = 100;
2788 }
2789 
test_xARPWaitResolution_PrivateFunctionReturnsHit(void)2790 void test_xARPWaitResolution_PrivateFunctionReturnsHit( void )
2791 {
2792     uint32_t ulIPAddress = 0xAAAAAAAA;
2793     BaseType_t xResult;
2794     int i;
2795     struct xNetworkInterface * xInterface;
2796     NetworkEndPoint_t xEndPoint = { 0 };
2797 
2798     /* Catch the assertion for calling from IP task. */
2799     /* =================================================== */
2800     /* Assertion on calling from IP-task */
2801     xIsCallingFromIPTask_IgnoreAndReturn( pdTRUE );
2802     catch_assert( xARPWaitResolution( ulIPAddress, 0 ) );
2803     /* =================================================== */
2804 
2805 
2806     /* Make the resolution pass without any attempt by making
2807      * eARPGetCacheEntry return eARPCacheHit. */
2808     /* =================================================== */
2809     /* Assertion on calling from IP-task */
2810     xEndPoint.bits.bIPv6 = pdFALSE_UNSIGNED;
2811     xIsCallingFromIPTask_IgnoreAndReturn( pdFALSE );
2812     /* Not worried about what these functions do. */
2813     FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
2814     xIsIPv4Multicast_ExpectAndReturn( ulIPAddress, 1UL );
2815     vSetMultiCastIPv4MacAddress_Ignore();
2816     FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
2817 
2818     xResult = xARPWaitResolution( ulIPAddress, 0 );
2819     TEST_ASSERT_EQUAL( xResult, 0 );
2820     /* =================================================== */
2821 }
2822 
test_xARPWaitResolution_GNWFailsNoTimeout(void)2823 void test_xARPWaitResolution_GNWFailsNoTimeout( void )
2824 {
2825     uint32_t ulIPAddress = 0xAAAAAAAA;
2826     NetworkEndPoint_t xEndPoint = { 0 };
2827     NetworkInterface_t xInterface;
2828     BaseType_t xResult;
2829     int i;
2830 
2831     xEndPoint.bits.bIPv6 = pdFALSE_UNSIGNED;
2832     xEndPoint.ipv4_settings.ulIPAddress = 0xC0C0C0C0;
2833 
2834     /* Make the resolution fail with maximum tryouts. */
2835     /* =================================================== */
2836     /* Make sure that no address matches the IP address. */
2837     for( i = 0; i < ipconfigARP_CACHE_ENTRIES; i++ )
2838     {
2839         xARPCache[ i ].ulIPAddress = 0xAAAAAAAA;
2840     }
2841 
2842     ulIPAddress = 0x00000031;
2843     /* Make both values (IP address and local IP pointer) different. */
2844     /* Get any address on the same netmask. */
2845     *ipLOCAL_IP_ADDRESS_POINTER = 0x00000034;
2846 
2847     /* Assertion on calling from IP-task */
2848     FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
2849     xIsCallingFromIPTask_IgnoreAndReturn( pdFALSE );
2850     /* Not worried about what these functions do. */
2851     xIsIPv4Multicast_ExpectAndReturn( ulIPAddress, 0UL );
2852     FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( ( void * ) 1234 );
2853 
2854     vTaskSetTimeOutState_Stub( vStoreTimeValue );
2855 
2856     /* Make sure that there are enough stubs for all the repetitive calls. */
2857     for( i = 0; i < ipconfigMAX_ARP_RETRANSMISSIONS; i++ )
2858     {
2859         FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
2860         pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, NULL );
2861         FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoint, NULL );
2862         vTaskDelay_Expect( pdMS_TO_TICKS( 250U ) );
2863         FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
2864         xIsIPv4Multicast_ExpectAndReturn( ulIPAddress, 0UL );
2865         FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( ( void * ) 1234 );
2866         xTaskCheckForTimeOut_IgnoreAndReturn( pdFALSE );
2867     }
2868 
2869     xResult = xARPWaitResolution( ulIPAddress, 0 );
2870     TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EADDRNOTAVAIL, xResult );
2871     /* =================================================== */
2872 }
2873 
test_xARPWaitResolution(void)2874 void test_xARPWaitResolution( void )
2875 {
2876     NetworkInterface_t xInterface;
2877     NetworkEndPoint_t xEndPoint = { 0 };
2878     uint32_t ulIPAddress = 0xAAAAAAAA;
2879     BaseType_t xResult;
2880     int i;
2881 
2882     xEndPoint.bits.bIPv6 = pdFALSE_UNSIGNED;
2883     xEndPoint.ipv4_settings.ulIPAddress = 0xC0C0C0C0;
2884 
2885     /* Make the resolution fail after some attempts due to timeout. */
2886     /* =================================================== */
2887     /* Make sure that no address matches the IP address. */
2888     for( i = 0; i < ipconfigARP_CACHE_ENTRIES; i++ )
2889     {
2890         xARPCache[ i ].ulIPAddress = 0xAAAAAAAA;
2891     }
2892 
2893     ulIPAddress = 0x00000031;
2894     /* Make both values (IP address and local IP pointer) different. */
2895     /* Get any address on the same netmask. */
2896     *ipLOCAL_IP_ADDRESS_POINTER = 0x00000034;
2897 
2898     /* Assertion on calling from IP-task */
2899     FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
2900     xIsCallingFromIPTask_IgnoreAndReturn( pdFALSE );
2901     /* Not worried about what these functions do. */
2902     xIsIPv4Multicast_ExpectAndReturn( ulIPAddress, 0UL );
2903     FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( ( void * ) 1234 );
2904 
2905     vTaskSetTimeOutState_Stub( vStoreTimeValue );
2906 
2907     /* Make sure that there are enough stubs for all the repetitive calls. */
2908     for( i = 0; i < ( ipconfigMAX_ARP_RETRANSMISSIONS - 1 ); i++ )
2909     {
2910         FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
2911         pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, NULL );
2912         FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoint, NULL );
2913         vTaskDelay_Expect( pdMS_TO_TICKS( 250U ) );
2914         FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
2915         xIsIPv4Multicast_ExpectAndReturn( ulIPAddress, 0UL );
2916         FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( ( void * ) 1234 );
2917         xTaskCheckForTimeOut_IgnoreAndReturn( pdFALSE );
2918     }
2919 
2920     FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
2921     pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, NULL );
2922     FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoint, NULL );
2923     vTaskDelay_Expect( pdMS_TO_TICKS( 250U ) );
2924     FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
2925     xIsIPv4Multicast_ExpectAndReturn( ulIPAddress, 0UL );
2926     FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( ( void * ) 1234 );
2927     xTaskCheckForTimeOut_IgnoreAndReturn( pdTRUE );
2928 
2929     xResult = xARPWaitResolution( ulIPAddress, 0 );
2930     TEST_ASSERT_EQUAL( -pdFREERTOS_ERRNO_EADDRNOTAVAIL, xResult );
2931     /* =================================================== */
2932 
2933     /* Make the resolution pass after some attempts. */
2934     /* =================================================== */
2935     xEndPoint.bits.bIPv6 = 0;
2936 
2937     /* Make sure that no address matches the IP address. */
2938     for( i = 0; i < ipconfigARP_CACHE_ENTRIES; i++ )
2939     {
2940         xARPCache[ i ].ulIPAddress = 0xAAAAAAAA;
2941     }
2942 
2943     ulIPAddress = 0x00000031;
2944     /* Make both values (IP address and local IP pointer) different. */
2945     /* Get any address on the same netmask. */
2946     *ipLOCAL_IP_ADDRESS_POINTER = 0x00000034;
2947 
2948     /* Assertion on calling from IP-task */
2949     FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
2950     xIsCallingFromIPTask_IgnoreAndReturn( pdFALSE );
2951     /* Not worried about what these functions do. */
2952     xIsIPv4Multicast_ExpectAndReturn( ulIPAddress, 0UL );
2953     FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( ( void * ) 1234 );
2954 
2955     vTaskSetTimeOutState_Stub( vStoreTimeValue );
2956 
2957     /* Make sure that there are enough stubs for all the repetitive calls. */
2958     for( i = 0; i < ( ipconfigMAX_ARP_RETRANSMISSIONS - 2 ); i++ )
2959     {
2960         FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
2961         pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, NULL );
2962         FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoint, NULL );
2963         vTaskDelay_Expect( pdMS_TO_TICKS( 250U ) );
2964         FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
2965         xIsIPv4Multicast_ExpectAndReturn( ulIPAddress, 0UL );
2966         FreeRTOS_FindEndPointOnNetMask_ExpectAnyArgsAndReturn( ( void * ) 1234 );
2967         xTaskCheckForTimeOut_IgnoreAndReturn( pdFALSE );
2968     }
2969 
2970     FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
2971     pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, NULL );
2972     FreeRTOS_NextEndPoint_ExpectAndReturn( NULL, &xEndPoint, NULL );
2973     vTaskDelay_Expect( pdMS_TO_TICKS( 250U ) );
2974     FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
2975     xIsIPv4Multicast_ExpectAndReturn( ulIPAddress, 1UL );
2976     vSetMultiCastIPv4MacAddress_Ignore();
2977     FreeRTOS_FirstEndPoint_ExpectAndReturn( NULL, &xEndPoint );
2978     xTaskCheckForTimeOut_IgnoreAndReturn( pdFALSE );
2979 
2980     xResult = xARPWaitResolution( ulIPAddress, 0 );
2981     TEST_ASSERT_EQUAL( 0, xResult );
2982     /* =================================================== */
2983 }
2984 
test_vARPGenerateRequestPacket(void)2985 void test_vARPGenerateRequestPacket( void )
2986 {
2987     NetworkBufferDescriptor_t xNetworkBuffer = { 0 };
2988     NetworkEndPoint_t xEndPoint = { 0 };
2989 
2990     NetworkBufferDescriptor_t * const pxNetworkBuffer = &xNetworkBuffer;
2991 
2992 
2993     uint8_t ucBuffer[ sizeof( ARPPacket_t ) + ipBUFFER_PADDING ];
2994 
2995     pxNetworkBuffer->pucEthernetBuffer = ucBuffer;
2996     pxNetworkBuffer->xDataLength = sizeof( ARPPacket_t );
2997 
2998     /* Catch some asserts. */
2999     catch_assert( vARPGenerateRequestPacket( NULL ) );
3000 
3001     xNetworkBuffer.pxEndPoint = NULL;
3002     catch_assert( vARPGenerateRequestPacket( pxNetworkBuffer ) );
3003 
3004     xNetworkBuffer.pxEndPoint = &xEndPoint;
3005     pxNetworkBuffer->xDataLength = sizeof( ARPPacket_t ) - 10;
3006     catch_assert( vARPGenerateRequestPacket( pxNetworkBuffer ) );
3007 
3008     pxNetworkBuffer->xDataLength = sizeof( ARPPacket_t );
3009     vARPGenerateRequestPacket( pxNetworkBuffer );
3010 }
3011 
3012 
test_FreeRTOS_ClearARP(void)3013 void test_FreeRTOS_ClearARP( void )
3014 {
3015     struct xNetworkEndPoint xEndPoint = { 0 };
3016     uint8_t ucArray[ sizeof( xARPCache ) ];
3017 
3018     memset( ucArray, 0, sizeof( xARPCache ) );
3019 
3020     FreeRTOS_ClearARP( NULL );
3021     TEST_ASSERT_EQUAL_MEMORY( ucArray, xARPCache, sizeof( xARPCache ) );
3022 }
3023 
test_FreeRTOS_ClearARP_validEndPoint_Match(void)3024 void test_FreeRTOS_ClearARP_validEndPoint_Match( void )
3025 {
3026     struct xNetworkEndPoint xEndPoint = { 0 }, * pxEndPoint = &xEndPoint;
3027     uint8_t ucArray[ sizeof( xARPCache ) ];
3028 
3029     xEndPoint.bits.bIPv6 = 0;
3030 
3031     xARPCache[ 0 ].pxEndPoint = &xEndPoint;
3032     memset( ucArray, 0, sizeof( xARPCache ) );
3033 
3034     FreeRTOS_ClearARP( pxEndPoint );
3035     TEST_ASSERT_EQUAL_MEMORY( ucArray, &xARPCache[ 0 ], sizeof( ARPCacheRow_t ) );
3036 }
3037 
test_FreeRTOS_ClearARP_validEndPoint_NoMatch(void)3038 void test_FreeRTOS_ClearARP_validEndPoint_NoMatch( void )
3039 {
3040     struct xNetworkEndPoint xEndPoint = { 0 }, * pxEndPoint = &xEndPoint;
3041     uint8_t ucArray[ sizeof( xARPCache ) ];
3042 
3043     memset( ucArray, 0, sizeof( xARPCache ) );
3044 
3045     FreeRTOS_ClearARP( pxEndPoint );
3046     TEST_ASSERT_EQUAL_MEMORY( ucArray, xARPCache, sizeof( xARPCache ) );
3047 }
3048 
test_FreeRTOS_PrintARPCache(void)3049 void test_FreeRTOS_PrintARPCache( void )
3050 {
3051     int x;
3052 
3053     for( x = 0; x < ipconfigARP_CACHE_ENTRIES; x++ )
3054     {
3055         /* Anything except 0. */
3056         xARPCache[ x ].ulIPAddress = 0xAA;
3057         /* Anything except 0. */
3058         xARPCache[ x ].ucAge = x;
3059     }
3060 
3061     /* Nothing to actually unit-test here. */
3062     FreeRTOS_PrintARPCache();
3063 
3064     for( x = 0; x < ipconfigARP_CACHE_ENTRIES; x++ )
3065     {
3066         /* Anything except 0. */
3067         xARPCache[ x ].ulIPAddress = 0x00;
3068         /* Anything except 0. */
3069         xARPCache[ x ].ucAge = x;
3070     }
3071 
3072     /* Nothing to actually unit-test here. */
3073     FreeRTOS_PrintARPCache();
3074 }
3075 
3076 /**
3077  * @brief Check if vARPRefreshCacheEntryAge executes normally when pointer of MAC address is NULL.
3078  */
test_vARPRefreshCacheEntryAge_NullMAC(void)3079 void test_vARPRefreshCacheEntryAge_NullMAC( void )
3080 {
3081     vARPRefreshCacheEntryAge( NULL, 0U );
3082 }
3083 
3084 /**
3085  * @brief Check if vARPRefreshCacheEntryAge update the age of matching ARP cache correctly.
3086  */
test_vARPRefreshCacheEntryAge_MatchIPMaychMAC(void)3087 void test_vARPRefreshCacheEntryAge_MatchIPMaychMAC( void )
3088 {
3089     MACAddress_t xTargetMACAddress = { { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 } };
3090     uint32_t ulTargetIPAddress = 0x12345678U;
3091     BaseType_t xHitCacheIndex = ipconfigARP_CACHE_ENTRIES - 1;
3092 
3093     memset( xARPCache, 0, sizeof( xARPCache ) );
3094 
3095     xARPCache[ xHitCacheIndex ].ulIPAddress = ulTargetIPAddress;
3096     memcpy( xARPCache[ xHitCacheIndex ].xMACAddress.ucBytes, xTargetMACAddress.ucBytes, sizeof( MACAddress_t ) );
3097     xARPCache[ xHitCacheIndex ].ucAge = ipconfigMAX_ARP_AGE - 1U;
3098 
3099     vARPRefreshCacheEntryAge( &xTargetMACAddress, ulTargetIPAddress );
3100 
3101     TEST_ASSERT_EQUAL_UINT16( ipconfigMAX_ARP_AGE, xARPCache[ xHitCacheIndex ].ucAge );
3102 }
3103 
3104 /**
3105  * @brief Test the scenario that no cache matches.
3106  */
test_vARPRefreshCacheEntryAge_NotFound(void)3107 void test_vARPRefreshCacheEntryAge_NotFound( void )
3108 {
3109     MACAddress_t xTargetMACAddress = { { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 } };
3110     uint32_t ulTargetIPAddress = 0x12345678U;
3111     BaseType_t xCacheIndex;
3112 
3113     memset( xARPCache, 0, sizeof( xARPCache ) );
3114 
3115     xARPCache[ 0 ].ulIPAddress = ulTargetIPAddress;
3116 
3117     memcpy( xARPCache[ 1 ].xMACAddress.ucBytes, xTargetMACAddress.ucBytes, sizeof( MACAddress_t ) );
3118 
3119     vARPRefreshCacheEntryAge( &xTargetMACAddress, ulTargetIPAddress );
3120 
3121     for( xCacheIndex = 0; xCacheIndex < ipconfigARP_CACHE_ENTRIES; xCacheIndex++ )
3122     {
3123         TEST_ASSERT_EQUAL_UINT16( 0, xARPCache[ xCacheIndex ].ucAge );
3124     }
3125 }
3126