1 /*
2  * FreeRTOS+TCP <DEVELOPMENT BRANCH>
3  * Copyright (C) 2022 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
4  *
5  * SPDX-License-Identifier: MIT
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a copy of
8  * this software and associated documentation files (the "Software"), to deal in
9  * the Software without restriction, including without limitation the rights to
10  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
11  * the Software, and to permit persons to whom the Software is furnished to do so,
12  * subject to the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be included in all
15  * copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
19  * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
20  * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
21  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23  *
24  * http://aws.amazon.com/freertos
25  * http://www.FreeRTOS.org
26  */
27 
28 
29 /* Include Unity header */
30 #include "unity.h"
31 
32 /* Include standard libraries */
33 #include <stdlib.h>
34 #include <string.h>
35 #include <stdint.h>
36 
37 #include "FreeRTOSIPConfig.h"
38 
39 #include "mock_task.h"
40 #include "mock_list.h"
41 
42 /* This must come after list.h is included (in this case, indirectly
43  * by mock_list.h). */
44 #include "mock_FreeRTOS_UDP_IPv4_list_macros.h"
45 #include "mock_queue.h"
46 #include "mock_event_groups.h"
47 #include "mock_FreeRTOS_ARP.h"
48 #include "mock_FreeRTOS_DHCP.h"
49 #include "mock_FreeRTOS_DNS.h"
50 #include "mock_FreeRTOS_IP_Utils.h"
51 #include "mock_FreeRTOS_Routing.h"
52 #include "mock_NetworkBufferManagement.h"
53 
54 #include "FreeRTOS_UDP_IPv4_stubs.c"
55 #include "catch_assert.h"
56 
57 /* ===========================  EXTERN VARIABLES  =========================== */
58 
59 const uint32_t ulDefaultIPv4Address = 0x12345678;
60 const uint16_t ulDefaultProtoChecksum = 0xABCD;
61 BaseType_t xIsIfOutCalled = 0;
62 
63 /* ============================  Unity Fixtures  ============================ */
64 
65 /*! called before each test case */
setUp(void)66 void setUp( void )
67 {
68     xIsIfOutCalled = 0;
69 }
70 
71 /* ==============================  Test Cases  ============================== */
72 
73 /**
74  * @brief Trigger assertion when input network buffer pointer is NULL.
75  */
test_xProcessReceivedUDPPacket_IPv4_NullInput()76 void test_xProcessReceivedUDPPacket_IPv4_NullInput()
77 {
78     BaseType_t xIsWaitingForARPResolution;
79 
80     catch_assert( xProcessReceivedUDPPacket_IPv4( NULL, 0, &xIsWaitingForARPResolution ) );
81 }
82 
83 /**
84  * @brief Trigger assertion when input buffer pointer in network buffer is NULL.
85  */
test_xProcessReceivedUDPPacket_IPv4_NullBufferPointer()86 void test_xProcessReceivedUDPPacket_IPv4_NullBufferPointer()
87 {
88     BaseType_t xIsWaitingForARPResolution;
89     NetworkBufferDescriptor_t xNetworkBuffer;
90 
91     memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
92 
93     catch_assert( xProcessReceivedUDPPacket_IPv4( &xNetworkBuffer, 0, &xIsWaitingForARPResolution ) );
94 }
95 
96 /**
97  * @brief To validate the scenario that receives DNS reply packet and pass.
98  */
test_xProcessReceivedUDPPacket_IPv4_DNSReplyPass()99 void test_xProcessReceivedUDPPacket_IPv4_DNSReplyPass()
100 {
101     BaseType_t xReturn;
102     uint16_t usSrcPort = ipDNS_PORT;
103     uint16_t usDestPort = 1024U;
104     uint16_t usDestPortNetworkEndian = FreeRTOS_htons( usDestPort );
105     BaseType_t xIsWaitingForARPResolution;
106     NetworkBufferDescriptor_t xNetworkBuffer;
107     uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
108     UDPPacket_t * pxUDPPacket;
109 
110     memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
111     memset( pucEthernetBuffer, 0, sizeof( pucEthernetBuffer ) );
112 
113     xNetworkBuffer.pucEthernetBuffer = pucEthernetBuffer;
114     pxUDPPacket = ( UDPPacket_t * ) pucEthernetBuffer;
115 
116     pxUDPPacket->xUDPHeader.usChecksum = 0x1234U;
117     pxUDPPacket->xUDPHeader.usSourcePort = FreeRTOS_htons( usSrcPort );
118     pxUDPPacket->xUDPHeader.usDestinationPort = usDestPortNetworkEndian;
119 
120     pxUDPSocketLookup_ExpectAndReturn( usDestPortNetworkEndian, NULL );
121     vARPRefreshCacheEntry_Expect( &( pxUDPPacket->xEthernetHeader.xSourceAddress ), pxUDPPacket->xIPHeader.ulSourceIPAddress, xNetworkBuffer.pxEndPoint );
122     ulDNSHandlePacket_ExpectAndReturn( &xNetworkBuffer, pdTRUE );
123 
124     xReturn = xProcessReceivedUDPPacket_IPv4( &xNetworkBuffer, usDestPortNetworkEndian, &xIsWaitingForARPResolution );
125 
126     TEST_ASSERT_EQUAL( pdTRUE, xReturn );
127 }
128 
129 /**
130  * @brief To validate the scenario that receives DNS reply packet and fail.
131  */
test_xProcessReceivedUDPPacket_IPv4_DNSReplyFail()132 void test_xProcessReceivedUDPPacket_IPv4_DNSReplyFail()
133 {
134     BaseType_t xReturn;
135     uint16_t usSrcPort = ipDNS_PORT;
136     uint16_t usDestPort = 1024U;
137     uint16_t usDestPortNetworkEndian = FreeRTOS_htons( usDestPort );
138     BaseType_t xIsWaitingForARPResolution;
139     NetworkBufferDescriptor_t xNetworkBuffer;
140     uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
141     UDPPacket_t * pxUDPPacket;
142 
143     memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
144     memset( pucEthernetBuffer, 0, sizeof( pucEthernetBuffer ) );
145 
146     xNetworkBuffer.pucEthernetBuffer = pucEthernetBuffer;
147     pxUDPPacket = ( UDPPacket_t * ) pucEthernetBuffer;
148 
149     pxUDPPacket->xUDPHeader.usChecksum = 0x1234U;
150     pxUDPPacket->xUDPHeader.usSourcePort = FreeRTOS_htons( usSrcPort );
151     pxUDPPacket->xUDPHeader.usDestinationPort = usDestPortNetworkEndian;
152 
153     pxUDPSocketLookup_ExpectAndReturn( usDestPortNetworkEndian, NULL );
154     vARPRefreshCacheEntry_Expect( &( pxUDPPacket->xEthernetHeader.xSourceAddress ), pxUDPPacket->xIPHeader.ulSourceIPAddress, xNetworkBuffer.pxEndPoint );
155     ulDNSHandlePacket_ExpectAndReturn( &xNetworkBuffer, pdFAIL );
156 
157     xReturn = xProcessReceivedUDPPacket_IPv4( &xNetworkBuffer, usDestPortNetworkEndian, &xIsWaitingForARPResolution );
158 
159     TEST_ASSERT_EQUAL( pdFAIL, xReturn );
160 }
161 
162 /**
163  * @brief To validate the scenario that receives LLMNR request packet and pass.
164  */
test_xProcessReceivedUDPPacket_IPv4_LLMNRRequestPass()165 void test_xProcessReceivedUDPPacket_IPv4_LLMNRRequestPass()
166 {
167     BaseType_t xReturn;
168     uint16_t usSrcPort = 1024U;
169     uint16_t usDestPort = ipLLMNR_PORT;
170     uint16_t usDestPortNetworkEndian = FreeRTOS_htons( usDestPort );
171     BaseType_t xIsWaitingForARPResolution;
172     NetworkBufferDescriptor_t xNetworkBuffer;
173     uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
174     UDPPacket_t * pxUDPPacket;
175 
176     memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
177     memset( pucEthernetBuffer, 0, sizeof( pucEthernetBuffer ) );
178 
179     xNetworkBuffer.pucEthernetBuffer = pucEthernetBuffer;
180     pxUDPPacket = ( UDPPacket_t * ) pucEthernetBuffer;
181 
182     pxUDPPacket->xUDPHeader.usChecksum = 0x1234U;
183     pxUDPPacket->xUDPHeader.usSourcePort = FreeRTOS_htons( usSrcPort );
184     pxUDPPacket->xUDPHeader.usDestinationPort = usDestPortNetworkEndian;
185 
186     pxUDPSocketLookup_ExpectAndReturn( usDestPortNetworkEndian, NULL );
187     vARPRefreshCacheEntry_Expect( &( pxUDPPacket->xEthernetHeader.xSourceAddress ), pxUDPPacket->xIPHeader.ulSourceIPAddress, xNetworkBuffer.pxEndPoint );
188     ulDNSHandlePacket_ExpectAndReturn( &xNetworkBuffer, pdTRUE );
189 
190     xReturn = xProcessReceivedUDPPacket_IPv4( &xNetworkBuffer, usDestPortNetworkEndian, &xIsWaitingForARPResolution );
191 
192     TEST_ASSERT_EQUAL( pdTRUE, xReturn );
193 }
194 
195 /**
196  * @brief To validate the scenario that receives LLMNR request packet and fail.
197  */
test_xProcessReceivedUDPPacket_IPv4_LLMNRRequestFail()198 void test_xProcessReceivedUDPPacket_IPv4_LLMNRRequestFail()
199 {
200     BaseType_t xReturn;
201     uint16_t usSrcPort = 1024U;
202     uint16_t usDestPort = ipLLMNR_PORT;
203     uint16_t usDestPortNetworkEndian = FreeRTOS_htons( usDestPort );
204     BaseType_t xIsWaitingForARPResolution;
205     NetworkBufferDescriptor_t xNetworkBuffer;
206     uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
207     UDPPacket_t * pxUDPPacket;
208 
209     memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
210     memset( pucEthernetBuffer, 0, sizeof( pucEthernetBuffer ) );
211 
212     xNetworkBuffer.pucEthernetBuffer = pucEthernetBuffer;
213     pxUDPPacket = ( UDPPacket_t * ) pucEthernetBuffer;
214 
215     pxUDPPacket->xUDPHeader.usChecksum = 0x1234U;
216     pxUDPPacket->xUDPHeader.usSourcePort = FreeRTOS_htons( usSrcPort );
217     pxUDPPacket->xUDPHeader.usDestinationPort = usDestPortNetworkEndian;
218 
219     pxUDPSocketLookup_ExpectAndReturn( usDestPortNetworkEndian, NULL );
220     vARPRefreshCacheEntry_Expect( &( pxUDPPacket->xEthernetHeader.xSourceAddress ), pxUDPPacket->xIPHeader.ulSourceIPAddress, xNetworkBuffer.pxEndPoint );
221     ulDNSHandlePacket_ExpectAndReturn( &xNetworkBuffer, pdFAIL );
222 
223     xReturn = xProcessReceivedUDPPacket_IPv4( &xNetworkBuffer, usDestPortNetworkEndian, &xIsWaitingForARPResolution );
224 
225     TEST_ASSERT_EQUAL( pdFAIL, xReturn );
226 }
227 
228 /**
229  * @brief To validate the scenario that receives LLMNR reply packet and pass.
230  */
test_xProcessReceivedUDPPacket_IPv4_LLMNRReplyPass()231 void test_xProcessReceivedUDPPacket_IPv4_LLMNRReplyPass()
232 {
233     BaseType_t xReturn;
234     uint16_t usSrcPort = ipLLMNR_PORT;
235     uint16_t usDestPort = 1024U;
236     uint16_t usDestPortNetworkEndian = FreeRTOS_htons( usDestPort );
237     BaseType_t xIsWaitingForARPResolution;
238     NetworkBufferDescriptor_t xNetworkBuffer;
239     uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
240     UDPPacket_t * pxUDPPacket;
241 
242     memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
243     memset( pucEthernetBuffer, 0, sizeof( pucEthernetBuffer ) );
244 
245     xNetworkBuffer.pucEthernetBuffer = pucEthernetBuffer;
246     pxUDPPacket = ( UDPPacket_t * ) pucEthernetBuffer;
247 
248     pxUDPPacket->xUDPHeader.usChecksum = 0x1234U;
249     pxUDPPacket->xUDPHeader.usSourcePort = FreeRTOS_htons( usSrcPort );
250     pxUDPPacket->xUDPHeader.usDestinationPort = usDestPortNetworkEndian;
251 
252     pxUDPSocketLookup_ExpectAndReturn( usDestPortNetworkEndian, NULL );
253     vARPRefreshCacheEntry_Expect( &( pxUDPPacket->xEthernetHeader.xSourceAddress ), pxUDPPacket->xIPHeader.ulSourceIPAddress, xNetworkBuffer.pxEndPoint );
254     ulDNSHandlePacket_ExpectAndReturn( &xNetworkBuffer, pdTRUE );
255 
256     xReturn = xProcessReceivedUDPPacket_IPv4( &xNetworkBuffer, usDestPortNetworkEndian, &xIsWaitingForARPResolution );
257 
258     TEST_ASSERT_EQUAL( pdTRUE, xReturn );
259 }
260 
261 /**
262  * @brief To validate the scenario that receives LLMNR reply packet and fail.
263  */
test_xProcessReceivedUDPPacket_IPv4_LLMNRReplyFail()264 void test_xProcessReceivedUDPPacket_IPv4_LLMNRReplyFail()
265 {
266     BaseType_t xReturn;
267     uint16_t usSrcPort = ipLLMNR_PORT;
268     uint16_t usDestPort = 1024U;
269     uint16_t usDestPortNetworkEndian = FreeRTOS_htons( usDestPort );
270     BaseType_t xIsWaitingForARPResolution;
271     NetworkBufferDescriptor_t xNetworkBuffer;
272     uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
273     UDPPacket_t * pxUDPPacket;
274 
275     memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
276     memset( pucEthernetBuffer, 0, sizeof( pucEthernetBuffer ) );
277 
278     xNetworkBuffer.pucEthernetBuffer = pucEthernetBuffer;
279     pxUDPPacket = ( UDPPacket_t * ) pucEthernetBuffer;
280 
281     pxUDPPacket->xUDPHeader.usChecksum = 0x1234U;
282     pxUDPPacket->xUDPHeader.usSourcePort = FreeRTOS_htons( usSrcPort );
283     pxUDPPacket->xUDPHeader.usDestinationPort = usDestPortNetworkEndian;
284 
285     pxUDPSocketLookup_ExpectAndReturn( usDestPortNetworkEndian, NULL );
286     vARPRefreshCacheEntry_Expect( &( pxUDPPacket->xEthernetHeader.xSourceAddress ), pxUDPPacket->xIPHeader.ulSourceIPAddress, xNetworkBuffer.pxEndPoint );
287     ulDNSHandlePacket_ExpectAndReturn( &xNetworkBuffer, pdFAIL );
288 
289     xReturn = xProcessReceivedUDPPacket_IPv4( &xNetworkBuffer, usDestPortNetworkEndian, &xIsWaitingForARPResolution );
290 
291     TEST_ASSERT_EQUAL( pdFAIL, xReturn );
292 }
293 
294 /**
295  * @brief To validate the scenario that receives MDNS request packet and pass.
296  */
test_xProcessReceivedUDPPacket_IPv4_MDNSRequestPass()297 void test_xProcessReceivedUDPPacket_IPv4_MDNSRequestPass()
298 {
299     BaseType_t xReturn;
300     uint16_t usSrcPort = 1024U;
301     uint16_t usDestPort = ipMDNS_PORT;
302     uint16_t usDestPortNetworkEndian = FreeRTOS_htons( usDestPort );
303     BaseType_t xIsWaitingForARPResolution;
304     NetworkBufferDescriptor_t xNetworkBuffer;
305     uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
306     UDPPacket_t * pxUDPPacket;
307 
308     memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
309     memset( pucEthernetBuffer, 0, sizeof( pucEthernetBuffer ) );
310 
311     xNetworkBuffer.pucEthernetBuffer = pucEthernetBuffer;
312     pxUDPPacket = ( UDPPacket_t * ) pucEthernetBuffer;
313 
314     pxUDPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
315 
316     pxUDPPacket->xUDPHeader.usChecksum = 0x1234U;
317     pxUDPPacket->xUDPHeader.usSourcePort = FreeRTOS_htons( usSrcPort );
318     pxUDPPacket->xUDPHeader.usDestinationPort = usDestPortNetworkEndian;
319 
320     pxUDPSocketLookup_ExpectAndReturn( usDestPortNetworkEndian, NULL );
321     vARPRefreshCacheEntry_Expect( &( pxUDPPacket->xEthernetHeader.xSourceAddress ), pxUDPPacket->xIPHeader.ulSourceIPAddress, xNetworkBuffer.pxEndPoint );
322     ulDNSHandlePacket_ExpectAndReturn( &xNetworkBuffer, pdTRUE );
323 
324     xReturn = xProcessReceivedUDPPacket_IPv4( &xNetworkBuffer, usDestPortNetworkEndian, &xIsWaitingForARPResolution );
325 
326     TEST_ASSERT_EQUAL( pdTRUE, xReturn );
327 }
328 
329 /**
330  * @brief To validate the scenario that receives MDNS request packet and fail.
331  */
test_xProcessReceivedUDPPacket_IPv4_MDNSRequestFail()332 void test_xProcessReceivedUDPPacket_IPv4_MDNSRequestFail()
333 {
334     BaseType_t xReturn;
335     uint16_t usSrcPort = 1024U;
336     uint16_t usDestPort = ipMDNS_PORT;
337     uint16_t usDestPortNetworkEndian = FreeRTOS_htons( usDestPort );
338     BaseType_t xIsWaitingForARPResolution;
339     NetworkBufferDescriptor_t xNetworkBuffer;
340     uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
341     UDPPacket_t * pxUDPPacket;
342 
343     memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
344     memset( pucEthernetBuffer, 0, sizeof( pucEthernetBuffer ) );
345 
346     xNetworkBuffer.pucEthernetBuffer = pucEthernetBuffer;
347     pxUDPPacket = ( UDPPacket_t * ) pucEthernetBuffer;
348 
349     pxUDPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
350 
351     pxUDPPacket->xUDPHeader.usChecksum = 0x1234U;
352     pxUDPPacket->xUDPHeader.usSourcePort = FreeRTOS_htons( usSrcPort );
353     pxUDPPacket->xUDPHeader.usDestinationPort = usDestPortNetworkEndian;
354 
355     pxUDPSocketLookup_ExpectAndReturn( usDestPortNetworkEndian, NULL );
356     vARPRefreshCacheEntry_Expect( &( pxUDPPacket->xEthernetHeader.xSourceAddress ), pxUDPPacket->xIPHeader.ulSourceIPAddress, xNetworkBuffer.pxEndPoint );
357     ulDNSHandlePacket_ExpectAndReturn( &xNetworkBuffer, pdFAIL );
358 
359     xReturn = xProcessReceivedUDPPacket_IPv4( &xNetworkBuffer, usDestPortNetworkEndian, &xIsWaitingForARPResolution );
360 
361     TEST_ASSERT_EQUAL( pdFAIL, xReturn );
362 }
363 
364 /**
365  * @brief To validate the scenario that receives MDNS Reply packet and pass.
366  */
test_xProcessReceivedUDPPacket_IPv4_MDNSReplyPass()367 void test_xProcessReceivedUDPPacket_IPv4_MDNSReplyPass()
368 {
369     BaseType_t xReturn;
370     uint16_t usSrcPort = ipMDNS_PORT;
371     uint16_t usDestPort = 1024U;
372     uint16_t usDestPortNetworkEndian = FreeRTOS_htons( usDestPort );
373     BaseType_t xIsWaitingForARPResolution;
374     NetworkBufferDescriptor_t xNetworkBuffer;
375     uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
376     UDPPacket_t * pxUDPPacket;
377 
378     memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
379     memset( pucEthernetBuffer, 0, sizeof( pucEthernetBuffer ) );
380 
381     xNetworkBuffer.pucEthernetBuffer = pucEthernetBuffer;
382     pxUDPPacket = ( UDPPacket_t * ) pucEthernetBuffer;
383 
384     pxUDPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
385 
386     pxUDPPacket->xUDPHeader.usChecksum = 0x1234U;
387     pxUDPPacket->xUDPHeader.usSourcePort = FreeRTOS_htons( usSrcPort );
388     pxUDPPacket->xUDPHeader.usDestinationPort = usDestPortNetworkEndian;
389 
390     pxUDPSocketLookup_ExpectAndReturn( usDestPortNetworkEndian, NULL );
391     vARPRefreshCacheEntry_Expect( &( pxUDPPacket->xEthernetHeader.xSourceAddress ), pxUDPPacket->xIPHeader.ulSourceIPAddress, xNetworkBuffer.pxEndPoint );
392     ulDNSHandlePacket_ExpectAndReturn( &xNetworkBuffer, pdTRUE );
393 
394     xReturn = xProcessReceivedUDPPacket_IPv4( &xNetworkBuffer, usDestPortNetworkEndian, &xIsWaitingForARPResolution );
395 
396     TEST_ASSERT_EQUAL( pdTRUE, xReturn );
397 }
398 
399 /**
400  * @brief To validate the scenario that receives MDNS Reply packet and fail.
401  */
test_xProcessReceivedUDPPacket_IPv4_MDNSReplyFail()402 void test_xProcessReceivedUDPPacket_IPv4_MDNSReplyFail()
403 {
404     BaseType_t xReturn;
405     uint16_t usSrcPort = ipMDNS_PORT;
406     uint16_t usDestPort = 1024U;
407     uint16_t usDestPortNetworkEndian = FreeRTOS_htons( usDestPort );
408     BaseType_t xIsWaitingForARPResolution;
409     NetworkBufferDescriptor_t xNetworkBuffer;
410     uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
411     UDPPacket_t * pxUDPPacket;
412 
413     memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
414     memset( pucEthernetBuffer, 0, sizeof( pucEthernetBuffer ) );
415 
416     xNetworkBuffer.pucEthernetBuffer = pucEthernetBuffer;
417     pxUDPPacket = ( UDPPacket_t * ) pucEthernetBuffer;
418 
419     pxUDPPacket->xEthernetHeader.usFrameType = ipIPv4_FRAME_TYPE;
420 
421     pxUDPPacket->xUDPHeader.usChecksum = 0x1234U;
422     pxUDPPacket->xUDPHeader.usSourcePort = FreeRTOS_htons( usSrcPort );
423     pxUDPPacket->xUDPHeader.usDestinationPort = usDestPortNetworkEndian;
424 
425     pxUDPSocketLookup_ExpectAndReturn( usDestPortNetworkEndian, NULL );
426     vARPRefreshCacheEntry_Expect( &( pxUDPPacket->xEthernetHeader.xSourceAddress ), pxUDPPacket->xIPHeader.ulSourceIPAddress, xNetworkBuffer.pxEndPoint );
427     ulDNSHandlePacket_ExpectAndReturn( &xNetworkBuffer, pdFAIL );
428 
429     xReturn = xProcessReceivedUDPPacket_IPv4( &xNetworkBuffer, usDestPortNetworkEndian, &xIsWaitingForARPResolution );
430 
431     TEST_ASSERT_EQUAL( pdFAIL, xReturn );
432 }
433 
434 /**
435  * @brief To validate the scenario that receives MDNS request packet and pass
436  * with IPv6 frame type in ethernet header.
437  */
test_xProcessReceivedUDPPacket_IPv4_MDNSRequestPassWithIPv6FrameType()438 void test_xProcessReceivedUDPPacket_IPv4_MDNSRequestPassWithIPv6FrameType()
439 {
440     BaseType_t xReturn;
441     uint16_t usSrcPort = 1024U;
442     uint16_t usDestPort = ipMDNS_PORT;
443     uint16_t usDestPortNetworkEndian = FreeRTOS_htons( usDestPort );
444     BaseType_t xIsWaitingForARPResolution;
445     NetworkBufferDescriptor_t xNetworkBuffer;
446     uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
447     UDPPacket_t * pxUDPPacket;
448 
449     memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
450     memset( pucEthernetBuffer, 0, sizeof( pucEthernetBuffer ) );
451 
452     xNetworkBuffer.pucEthernetBuffer = pucEthernetBuffer;
453     pxUDPPacket = ( UDPPacket_t * ) pucEthernetBuffer;
454 
455     pxUDPPacket->xEthernetHeader.usFrameType = ipIPv6_FRAME_TYPE;
456 
457     pxUDPPacket->xUDPHeader.usChecksum = 0x1234U;
458     pxUDPPacket->xUDPHeader.usSourcePort = FreeRTOS_htons( usSrcPort );
459     pxUDPPacket->xUDPHeader.usDestinationPort = usDestPortNetworkEndian;
460 
461     pxUDPSocketLookup_ExpectAndReturn( usDestPortNetworkEndian, NULL );
462     ulDNSHandlePacket_ExpectAndReturn( &xNetworkBuffer, pdTRUE );
463 
464     xReturn = xProcessReceivedUDPPacket_IPv4( &xNetworkBuffer, usDestPortNetworkEndian, &xIsWaitingForARPResolution );
465 
466     TEST_ASSERT_EQUAL( pdTRUE, xReturn );
467 }
468 
469 /**
470  * @brief To validate the scenario that receives NBNS request packet and pass.
471  */
test_xProcessReceivedUDPPacket_IPv4_NBNSRequestPass()472 void test_xProcessReceivedUDPPacket_IPv4_NBNSRequestPass()
473 {
474     BaseType_t xReturn;
475     uint16_t usSrcPort = 1024U;
476     uint16_t usDestPort = ipNBNS_PORT;
477     uint16_t usDestPortNetworkEndian = FreeRTOS_htons( usDestPort );
478     BaseType_t xIsWaitingForARPResolution;
479     NetworkBufferDescriptor_t xNetworkBuffer;
480     uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
481     UDPPacket_t * pxUDPPacket;
482 
483     memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
484     memset( pucEthernetBuffer, 0, sizeof( pucEthernetBuffer ) );
485 
486     xNetworkBuffer.pucEthernetBuffer = pucEthernetBuffer;
487     pxUDPPacket = ( UDPPacket_t * ) pucEthernetBuffer;
488 
489     pxUDPPacket->xUDPHeader.usChecksum = 0x1234U;
490     pxUDPPacket->xUDPHeader.usSourcePort = FreeRTOS_htons( usSrcPort );
491     pxUDPPacket->xUDPHeader.usDestinationPort = usDestPortNetworkEndian;
492 
493     pxUDPSocketLookup_ExpectAndReturn( usDestPortNetworkEndian, NULL );
494     vARPRefreshCacheEntry_Expect( &( pxUDPPacket->xEthernetHeader.xSourceAddress ), pxUDPPacket->xIPHeader.ulSourceIPAddress, xNetworkBuffer.pxEndPoint );
495     ulNBNSHandlePacket_ExpectAndReturn( &xNetworkBuffer, pdTRUE );
496 
497     xReturn = xProcessReceivedUDPPacket_IPv4( &xNetworkBuffer, usDestPortNetworkEndian, &xIsWaitingForARPResolution );
498 
499     TEST_ASSERT_EQUAL( pdTRUE, xReturn );
500 }
501 
502 /**
503  * @brief To validate the scenario that receives NBNS request packet and fail.
504  */
test_xProcessReceivedUDPPacket_IPv4_NBNSRequestFail()505 void test_xProcessReceivedUDPPacket_IPv4_NBNSRequestFail()
506 {
507     BaseType_t xReturn;
508     uint16_t usSrcPort = 1024U;
509     uint16_t usDestPort = ipNBNS_PORT;
510     uint16_t usDestPortNetworkEndian = FreeRTOS_htons( usDestPort );
511     BaseType_t xIsWaitingForARPResolution;
512     NetworkBufferDescriptor_t xNetworkBuffer;
513     uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
514     UDPPacket_t * pxUDPPacket;
515 
516     memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
517     memset( pucEthernetBuffer, 0, sizeof( pucEthernetBuffer ) );
518 
519     xNetworkBuffer.pucEthernetBuffer = pucEthernetBuffer;
520     pxUDPPacket = ( UDPPacket_t * ) pucEthernetBuffer;
521 
522     pxUDPPacket->xUDPHeader.usChecksum = 0x1234U;
523     pxUDPPacket->xUDPHeader.usSourcePort = FreeRTOS_htons( usSrcPort );
524     pxUDPPacket->xUDPHeader.usDestinationPort = usDestPortNetworkEndian;
525 
526     pxUDPSocketLookup_ExpectAndReturn( usDestPortNetworkEndian, NULL );
527     vARPRefreshCacheEntry_Expect( &( pxUDPPacket->xEthernetHeader.xSourceAddress ), pxUDPPacket->xIPHeader.ulSourceIPAddress, xNetworkBuffer.pxEndPoint );
528     ulNBNSHandlePacket_ExpectAndReturn( &xNetworkBuffer, pdFAIL );
529 
530     xReturn = xProcessReceivedUDPPacket_IPv4( &xNetworkBuffer, usDestPortNetworkEndian, &xIsWaitingForARPResolution );
531 
532     TEST_ASSERT_EQUAL( pdFAIL, xReturn );
533 }
534 
535 /**
536  * @brief To validate the scenario that receives NBNS Reply packet and pass.
537  */
test_xProcessReceivedUDPPacket_IPv4_NBNSReplyPass()538 void test_xProcessReceivedUDPPacket_IPv4_NBNSReplyPass()
539 {
540     BaseType_t xReturn;
541     uint16_t usSrcPort = ipNBNS_PORT;
542     uint16_t usDestPort = 1024U;
543     uint16_t usDestPortNetworkEndian = FreeRTOS_htons( usDestPort );
544     BaseType_t xIsWaitingForARPResolution;
545     NetworkBufferDescriptor_t xNetworkBuffer;
546     uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
547     UDPPacket_t * pxUDPPacket;
548 
549     memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
550     memset( pucEthernetBuffer, 0, sizeof( pucEthernetBuffer ) );
551 
552     xNetworkBuffer.pucEthernetBuffer = pucEthernetBuffer;
553     pxUDPPacket = ( UDPPacket_t * ) pucEthernetBuffer;
554 
555     pxUDPPacket->xUDPHeader.usChecksum = 0x1234U;
556     pxUDPPacket->xUDPHeader.usSourcePort = FreeRTOS_htons( usSrcPort );
557     pxUDPPacket->xUDPHeader.usDestinationPort = usDestPortNetworkEndian;
558 
559     pxUDPSocketLookup_ExpectAndReturn( usDestPortNetworkEndian, NULL );
560     vARPRefreshCacheEntry_Expect( &( pxUDPPacket->xEthernetHeader.xSourceAddress ), pxUDPPacket->xIPHeader.ulSourceIPAddress, xNetworkBuffer.pxEndPoint );
561     ulNBNSHandlePacket_ExpectAndReturn( &xNetworkBuffer, pdTRUE );
562 
563     xReturn = xProcessReceivedUDPPacket_IPv4( &xNetworkBuffer, usDestPortNetworkEndian, &xIsWaitingForARPResolution );
564 
565     TEST_ASSERT_EQUAL( pdTRUE, xReturn );
566 }
567 
568 /**
569  * @brief To validate the scenario that receives NBNS Reply packet and fail.
570  */
test_xProcessReceivedUDPPacket_IPv4_NBNSReplyFail()571 void test_xProcessReceivedUDPPacket_IPv4_NBNSReplyFail()
572 {
573     BaseType_t xReturn;
574     uint16_t usSrcPort = ipNBNS_PORT;
575     uint16_t usDestPort = 1024U;
576     uint16_t usDestPortNetworkEndian = FreeRTOS_htons( usDestPort );
577     BaseType_t xIsWaitingForARPResolution;
578     NetworkBufferDescriptor_t xNetworkBuffer;
579     uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
580     UDPPacket_t * pxUDPPacket;
581 
582     memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
583     memset( pucEthernetBuffer, 0, sizeof( pucEthernetBuffer ) );
584 
585     xNetworkBuffer.pucEthernetBuffer = pucEthernetBuffer;
586     pxUDPPacket = ( UDPPacket_t * ) pucEthernetBuffer;
587 
588     pxUDPPacket->xUDPHeader.usChecksum = 0x1234U;
589     pxUDPPacket->xUDPHeader.usSourcePort = FreeRTOS_htons( usSrcPort );
590     pxUDPPacket->xUDPHeader.usDestinationPort = usDestPortNetworkEndian;
591 
592     pxUDPSocketLookup_ExpectAndReturn( usDestPortNetworkEndian, NULL );
593     vARPRefreshCacheEntry_Expect( &( pxUDPPacket->xEthernetHeader.xSourceAddress ), pxUDPPacket->xIPHeader.ulSourceIPAddress, xNetworkBuffer.pxEndPoint );
594     ulNBNSHandlePacket_ExpectAndReturn( &xNetworkBuffer, pdFAIL );
595 
596     xReturn = xProcessReceivedUDPPacket_IPv4( &xNetworkBuffer, usDestPortNetworkEndian, &xIsWaitingForARPResolution );
597 
598     TEST_ASSERT_EQUAL( pdFAIL, xReturn );
599 }
600 
601 /**
602  * @brief To validate the scenario that no one is waiting for the packet.
603  */
test_xProcessReceivedUDPPacket_IPv4_NoSocket()604 void test_xProcessReceivedUDPPacket_IPv4_NoSocket()
605 {
606     BaseType_t xReturn;
607     uint16_t usSrcPort = 2048U;
608     uint16_t usDestPort = 1024U;
609     uint16_t usDestPortNetworkEndian = FreeRTOS_htons( usDestPort );
610     BaseType_t xIsWaitingForARPResolution;
611     NetworkBufferDescriptor_t xNetworkBuffer;
612     uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
613     UDPPacket_t * pxUDPPacket;
614 
615     memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
616     memset( pucEthernetBuffer, 0, sizeof( pucEthernetBuffer ) );
617 
618     xNetworkBuffer.pucEthernetBuffer = pucEthernetBuffer;
619     pxUDPPacket = ( UDPPacket_t * ) pucEthernetBuffer;
620 
621     pxUDPPacket->xUDPHeader.usChecksum = 0x1234U;
622     pxUDPPacket->xUDPHeader.usSourcePort = FreeRTOS_htons( usSrcPort );
623     pxUDPPacket->xUDPHeader.usDestinationPort = usDestPortNetworkEndian;
624 
625     pxUDPSocketLookup_ExpectAndReturn( usDestPortNetworkEndian, NULL );
626 
627     xReturn = xProcessReceivedUDPPacket_IPv4( &xNetworkBuffer, usDestPortNetworkEndian, &xIsWaitingForARPResolution );
628 
629     TEST_ASSERT_EQUAL( pdFAIL, xReturn );
630 }
631 
632 /**
633  * @brief To validate the flow that socket has NULL endpoint.
634  */
test_xProcessReceivedUDPPacket_IPv4_SocketNullEndpoint()635 void test_xProcessReceivedUDPPacket_IPv4_SocketNullEndpoint()
636 {
637     BaseType_t xReturn;
638     uint16_t usSrcPort = 2048U;
639     uint16_t usDestPort = 1024U;
640     uint16_t usDestPortNetworkEndian = FreeRTOS_htons( usDestPort );
641     BaseType_t xIsWaitingForARPResolution;
642     NetworkBufferDescriptor_t xNetworkBuffer;
643     uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
644     UDPPacket_t * pxUDPPacket;
645     FreeRTOS_Socket_t xSocket;
646 
647     memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
648     memset( pucEthernetBuffer, 0, sizeof( pucEthernetBuffer ) );
649     memset( &xSocket, 0, sizeof( xSocket ) );
650 
651     xNetworkBuffer.pucEthernetBuffer = pucEthernetBuffer;
652     xNetworkBuffer.pxEndPoint = NULL;
653 
654     pxUDPPacket = ( UDPPacket_t * ) pucEthernetBuffer;
655     pxUDPPacket->xUDPHeader.usChecksum = 0x1234U;
656     pxUDPPacket->xUDPHeader.usSourcePort = FreeRTOS_htons( usSrcPort );
657     pxUDPPacket->xUDPHeader.usDestinationPort = usDestPortNetworkEndian;
658 
659     pxUDPSocketLookup_ExpectAndReturn( usDestPortNetworkEndian, &xSocket );
660 
661     xReturn = xProcessReceivedUDPPacket_IPv4( &xNetworkBuffer, usDestPortNetworkEndian, &xIsWaitingForARPResolution );
662 
663     TEST_ASSERT_EQUAL( pdFAIL, xReturn );
664 }
665 
666 /**
667  * @brief To validate the flow that endpoint in socket handler has zero IP address.
668  */
test_xProcessReceivedUDPPacket_IPv4_SocketEndPointZeroIP()669 void test_xProcessReceivedUDPPacket_IPv4_SocketEndPointZeroIP()
670 {
671     BaseType_t xReturn;
672     uint16_t usSrcPort = 2048U;
673     uint16_t usDestPort = 1024U;
674     uint16_t usDestPortNetworkEndian = FreeRTOS_htons( usDestPort );
675     BaseType_t xIsWaitingForARPResolution;
676     NetworkBufferDescriptor_t xNetworkBuffer;
677     NetworkEndPoint_t xEndPoint;
678     uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
679     UDPPacket_t * pxUDPPacket;
680     FreeRTOS_Socket_t xSocket;
681 
682     memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
683     memset( pucEthernetBuffer, 0, sizeof( pucEthernetBuffer ) );
684     memset( &xSocket, 0, sizeof( xSocket ) );
685     memset( &xEndPoint, 0, sizeof( xEndPoint ) );
686 
687     xNetworkBuffer.pucEthernetBuffer = pucEthernetBuffer;
688     xNetworkBuffer.pxEndPoint = &xEndPoint;
689 
690     xEndPoint.ipv4_settings.ulIPAddress = 0U;
691 
692     pxUDPPacket = ( UDPPacket_t * ) pucEthernetBuffer;
693     pxUDPPacket->xUDPHeader.usChecksum = 0x1234U;
694     pxUDPPacket->xUDPHeader.usSourcePort = FreeRTOS_htons( usSrcPort );
695     pxUDPPacket->xUDPHeader.usDestinationPort = usDestPortNetworkEndian;
696 
697     pxUDPSocketLookup_ExpectAndReturn( usDestPortNetworkEndian, &xSocket );
698 
699     xReturn = xProcessReceivedUDPPacket_IPv4( &xNetworkBuffer, usDestPortNetworkEndian, &xIsWaitingForARPResolution );
700 
701     TEST_ASSERT_EQUAL( pdFAIL, xReturn );
702 }
703 
704 /**
705  * @brief To validate the flow that socket needs ARP discovery.
706  */
test_xProcessReceivedUDPPacket_IPv4_SocketNeedARP()707 void test_xProcessReceivedUDPPacket_IPv4_SocketNeedARP()
708 {
709     BaseType_t xReturn;
710     uint16_t usSrcPort = 2048U;
711     uint16_t usDestPort = 1024U;
712     uint16_t usDestPortNetworkEndian = FreeRTOS_htons( usDestPort );
713     BaseType_t xIsWaitingForARPResolution;
714     NetworkBufferDescriptor_t xNetworkBuffer;
715     NetworkEndPoint_t xEndPoint;
716     uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
717     UDPPacket_t * pxUDPPacket;
718     FreeRTOS_Socket_t xSocket;
719 
720     memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
721     memset( pucEthernetBuffer, 0, sizeof( pucEthernetBuffer ) );
722     memset( &xSocket, 0, sizeof( xSocket ) );
723     memset( &xEndPoint, 0, sizeof( xEndPoint ) );
724 
725     xNetworkBuffer.pucEthernetBuffer = pucEthernetBuffer;
726     xNetworkBuffer.pxEndPoint = &xEndPoint;
727 
728     xEndPoint.ipv4_settings.ulIPAddress = ulDefaultIPv4Address;
729 
730     pxUDPPacket = ( UDPPacket_t * ) pucEthernetBuffer;
731     pxUDPPacket->xUDPHeader.usChecksum = 0x1234U;
732     pxUDPPacket->xUDPHeader.usSourcePort = FreeRTOS_htons( usSrcPort );
733     pxUDPPacket->xUDPHeader.usDestinationPort = usDestPortNetworkEndian;
734 
735     pxUDPSocketLookup_ExpectAndReturn( usDestPortNetworkEndian, &xSocket );
736     xCheckRequiresARPResolution_ExpectAndReturn( &xNetworkBuffer, pdTRUE );
737 
738     xReturn = xProcessReceivedUDPPacket_IPv4( &xNetworkBuffer, usDestPortNetworkEndian, &xIsWaitingForARPResolution );
739 
740     TEST_ASSERT_EQUAL( pdFAIL, xReturn );
741     TEST_ASSERT_EQUAL( pdTRUE, xIsWaitingForARPResolution );
742 }
743 
744 /**
745  * @brief To validate the flow that socket receive handler returns fail.
746  */
test_xProcessReceivedUDPPacket_IPv4_SocketRecvHandlerFail()747 void test_xProcessReceivedUDPPacket_IPv4_SocketRecvHandlerFail()
748 {
749     BaseType_t xReturn;
750     uint16_t usSrcPort = 2048U;
751     uint16_t usDestPort = 1024U;
752     uint16_t usDestPortNetworkEndian = FreeRTOS_htons( usDestPort );
753     BaseType_t xIsWaitingForARPResolution;
754     NetworkBufferDescriptor_t xNetworkBuffer;
755     NetworkEndPoint_t xEndPoint;
756     uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
757     UDPPacket_t * pxUDPPacket;
758     FreeRTOS_Socket_t xSocket;
759 
760     memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
761     memset( pucEthernetBuffer, 0, sizeof( pucEthernetBuffer ) );
762     memset( &xSocket, 0, sizeof( xSocket ) );
763     memset( &xEndPoint, 0, sizeof( xEndPoint ) );
764 
765     xNetworkBuffer.pucEthernetBuffer = pucEthernetBuffer;
766     xNetworkBuffer.pxEndPoint = &xEndPoint;
767     xNetworkBuffer.usPort = FreeRTOS_htons( usSrcPort );
768     xNetworkBuffer.xDataLength = ipconfigTCP_MSS;
769 
770     xEndPoint.ipv4_settings.ulIPAddress = ulDefaultIPv4Address;
771 
772     pxUDPPacket = ( UDPPacket_t * ) pucEthernetBuffer;
773     pxUDPPacket->xIPHeader.usLength = xNetworkBuffer.xDataLength - ipSIZE_OF_ETH_HEADER;
774 
775     pxUDPPacket->xUDPHeader.usChecksum = 0x1234U;
776     pxUDPPacket->xUDPHeader.usSourcePort = FreeRTOS_htons( usSrcPort );
777     pxUDPPacket->xUDPHeader.usDestinationPort = usDestPortNetworkEndian;
778 
779     xSocket.u.xUDP.pxHandleReceive = xStubUDPReceiveHandler_Fail;
780 
781     pxUDPSocketLookup_ExpectAndReturn( usDestPortNetworkEndian, &xSocket );
782     xCheckRequiresARPResolution_ExpectAndReturn( &xNetworkBuffer, pdFALSE );
783     vARPRefreshCacheEntryAge_Ignore();
784 
785     xReturn = xProcessReceivedUDPPacket_IPv4( &xNetworkBuffer, usDestPortNetworkEndian, &xIsWaitingForARPResolution );
786 
787     TEST_ASSERT_EQUAL( pdFAIL, xReturn );
788 }
789 
790 /**
791  * @brief To validate the flow that list of the socket is full and return fail.
792  */
test_xProcessReceivedUDPPacket_IPv4_UDPListBufferFull()793 void test_xProcessReceivedUDPPacket_IPv4_UDPListBufferFull()
794 {
795     BaseType_t xReturn;
796     uint16_t usSrcPort = 2048U;
797     uint16_t usDestPort = 1024U;
798     uint16_t usDestPortNetworkEndian = FreeRTOS_htons( usDestPort );
799     BaseType_t xIsWaitingForARPResolution;
800     NetworkBufferDescriptor_t xNetworkBuffer;
801     NetworkEndPoint_t xEndPoint;
802     uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
803     UDPPacket_t * pxUDPPacket;
804     FreeRTOS_Socket_t xSocket;
805 
806     memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
807     memset( pucEthernetBuffer, 0, sizeof( pucEthernetBuffer ) );
808     memset( &xSocket, 0, sizeof( xSocket ) );
809     memset( &xEndPoint, 0, sizeof( xEndPoint ) );
810 
811     xNetworkBuffer.pucEthernetBuffer = pucEthernetBuffer;
812     xNetworkBuffer.pxEndPoint = &xEndPoint;
813     xNetworkBuffer.usPort = FreeRTOS_htons( usSrcPort );
814     xNetworkBuffer.xDataLength = ipconfigTCP_MSS;
815 
816     xEndPoint.ipv4_settings.ulIPAddress = ulDefaultIPv4Address;
817 
818     pxUDPPacket = ( UDPPacket_t * ) pucEthernetBuffer;
819     pxUDPPacket->xIPHeader.usLength = xNetworkBuffer.xDataLength - ipSIZE_OF_ETH_HEADER;
820 
821     pxUDPPacket->xUDPHeader.usChecksum = 0x1234U;
822     pxUDPPacket->xUDPHeader.usSourcePort = FreeRTOS_htons( usSrcPort );
823     pxUDPPacket->xUDPHeader.usDestinationPort = usDestPortNetworkEndian;
824 
825     xSocket.u.xUDP.pxHandleReceive = xStubUDPReceiveHandler_Pass;
826 
827     pxUDPSocketLookup_ExpectAndReturn( usDestPortNetworkEndian, &xSocket );
828     xCheckRequiresARPResolution_ExpectAndReturn( &xNetworkBuffer, pdFALSE );
829     vARPRefreshCacheEntryAge_Ignore();
830 
831     /* Set for listCURRENT_LIST_LENGTH */
832     xSocket.u.xUDP.xWaitingPacketsList.uxNumberOfItems = xSocket.u.xUDP.uxMaxPackets;
833 
834     xReturn = xProcessReceivedUDPPacket_IPv4( &xNetworkBuffer, usDestPortNetworkEndian, &xIsWaitingForARPResolution );
835 
836     TEST_ASSERT_EQUAL( pdFAIL, xReturn );
837 }
838 
839 /**
840  * @brief To validate the flow that all flows (list/event group/select/queue/DHCP) are all pass.
841  */
test_xProcessReceivedUDPPacket_IPv4_Pass()842 void test_xProcessReceivedUDPPacket_IPv4_Pass()
843 {
844     BaseType_t xReturn;
845     uint16_t usSrcPort = 2048U;
846     uint16_t usDestPort = 1024U;
847     uint16_t usDestPortNetworkEndian = FreeRTOS_htons( usDestPort );
848     BaseType_t xIsWaitingForARPResolution;
849     NetworkBufferDescriptor_t xNetworkBuffer;
850     NetworkEndPoint_t xEndPoint;
851     uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
852     UDPPacket_t * pxUDPPacket;
853     FreeRTOS_Socket_t xSocket;
854     EventGroupHandle_t xEventGroup;
855     struct xSOCKET_SET xSocketSet;
856     SemaphoreHandle_t xSocketSem;
857 
858     memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
859     memset( pucEthernetBuffer, 0, sizeof( pucEthernetBuffer ) );
860     memset( &xSocket, 0, sizeof( xSocket ) );
861     memset( &xEndPoint, 0, sizeof( xEndPoint ) );
862 
863     xNetworkBuffer.pucEthernetBuffer = pucEthernetBuffer;
864     xNetworkBuffer.pxEndPoint = &xEndPoint;
865     xNetworkBuffer.usPort = FreeRTOS_htons( usSrcPort );
866     xNetworkBuffer.xDataLength = ipconfigTCP_MSS;
867 
868     xEndPoint.ipv4_settings.ulIPAddress = ulDefaultIPv4Address;
869 
870     pxUDPPacket = ( UDPPacket_t * ) pucEthernetBuffer;
871     pxUDPPacket->xIPHeader.usLength = xNetworkBuffer.xDataLength - ipSIZE_OF_ETH_HEADER;
872 
873     pxUDPPacket->xUDPHeader.usChecksum = 0x1234U;
874     pxUDPPacket->xUDPHeader.usSourcePort = FreeRTOS_htons( usSrcPort );
875     pxUDPPacket->xUDPHeader.usDestinationPort = usDestPortNetworkEndian;
876 
877     xSocket.u.xUDP.pxHandleReceive = NULL;
878 
879     pxUDPSocketLookup_ExpectAndReturn( usDestPortNetworkEndian, &xSocket );
880     xCheckRequiresARPResolution_ExpectAndReturn( &xNetworkBuffer, pdFALSE );
881     vARPRefreshCacheEntryAge_Ignore();
882 
883     /* Set for listCURRENT_LIST_LENGTH */
884     xSocket.u.xUDP.uxMaxPackets = 255U;
885     xSocket.u.xUDP.xWaitingPacketsList.uxNumberOfItems = 0U;
886 
887     vTaskSuspendAll_Ignore();
888     vListInsertEnd_Expect( &( xSocket.u.xUDP.xWaitingPacketsList ), &( xNetworkBuffer.xBufferListItem ) );
889     xTaskResumeAll_ExpectAndReturn( pdPASS );
890 
891     xSocket.xEventGroup = xEventGroup;
892     xEventGroupSetBits_ExpectAndReturn( xSocket.xEventGroup, eSOCKET_RECEIVE, pdPASS );
893 
894     xSocket.pxSocketSet = &xSocketSet;
895     xSocket.xSelectBits |= eSELECT_READ;
896     xEventGroupSetBits_ExpectAndReturn( xSocket.pxSocketSet->xSelectGroup, eSELECT_READ, pdPASS );
897 
898     /* xSemaphoreGive is defined as xQueueGenericSend */
899     xSocket.pxUserSemaphore = ( SemaphoreHandle_t ) &xSocketSem;
900     xQueueGenericSend_ExpectAndReturn( xSocket.pxUserSemaphore, NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK, pdPASS );
901 
902     xIsDHCPSocket_ExpectAndReturn( &xSocket, pdTRUE );
903     xSendDHCPEvent_ExpectAndReturn( xNetworkBuffer.pxEndPoint, pdPASS );
904 
905     xReturn = xProcessReceivedUDPPacket_IPv4( &xNetworkBuffer, usDestPortNetworkEndian, &xIsWaitingForARPResolution );
906 
907     TEST_ASSERT_EQUAL( pdPASS, xReturn );
908 }
909 
910 /**
911  * @brief To validate the flow that all flows except for event group (list/select/queue/DHCP) are all pass.
912  */
test_xProcessReceivedUDPPacket_IPv4_PassNoEventGroup()913 void test_xProcessReceivedUDPPacket_IPv4_PassNoEventGroup()
914 {
915     BaseType_t xReturn;
916     uint16_t usSrcPort = 2048U;
917     uint16_t usDestPort = 1024U;
918     uint16_t usDestPortNetworkEndian = FreeRTOS_htons( usDestPort );
919     BaseType_t xIsWaitingForARPResolution;
920     NetworkBufferDescriptor_t xNetworkBuffer;
921     NetworkEndPoint_t xEndPoint;
922     uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
923     UDPPacket_t * pxUDPPacket;
924     FreeRTOS_Socket_t xSocket;
925     struct xSOCKET_SET xSocketSet;
926     SemaphoreHandle_t xSocketSem;
927 
928     memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
929     memset( pucEthernetBuffer, 0, sizeof( pucEthernetBuffer ) );
930     memset( &xSocket, 0, sizeof( xSocket ) );
931     memset( &xEndPoint, 0, sizeof( xEndPoint ) );
932 
933     xNetworkBuffer.pucEthernetBuffer = pucEthernetBuffer;
934     xNetworkBuffer.pxEndPoint = &xEndPoint;
935     xNetworkBuffer.usPort = FreeRTOS_htons( usSrcPort );
936     xNetworkBuffer.xDataLength = ipconfigTCP_MSS;
937 
938     xEndPoint.ipv4_settings.ulIPAddress = ulDefaultIPv4Address;
939 
940     pxUDPPacket = ( UDPPacket_t * ) pucEthernetBuffer;
941     pxUDPPacket->xIPHeader.usLength = xNetworkBuffer.xDataLength - ipSIZE_OF_ETH_HEADER;
942 
943     pxUDPPacket->xUDPHeader.usChecksum = 0x1234U;
944     pxUDPPacket->xUDPHeader.usSourcePort = FreeRTOS_htons( usSrcPort );
945     pxUDPPacket->xUDPHeader.usDestinationPort = usDestPortNetworkEndian;
946 
947     xSocket.u.xUDP.pxHandleReceive = NULL;
948     xSocket.xEventGroup = NULL;
949 
950     pxUDPSocketLookup_ExpectAndReturn( usDestPortNetworkEndian, &xSocket );
951     xCheckRequiresARPResolution_ExpectAndReturn( &xNetworkBuffer, pdFALSE );
952     vARPRefreshCacheEntryAge_Ignore();
953 
954     /* Set for listCURRENT_LIST_LENGTH */
955     xSocket.u.xUDP.uxMaxPackets = 255U;
956     xSocket.u.xUDP.xWaitingPacketsList.uxNumberOfItems = 0U;
957 
958     vTaskSuspendAll_Ignore();
959     vListInsertEnd_Expect( &( xSocket.u.xUDP.xWaitingPacketsList ), &( xNetworkBuffer.xBufferListItem ) );
960     xTaskResumeAll_ExpectAndReturn( pdPASS );
961 
962     xSocket.pxSocketSet = &xSocketSet;
963     xSocket.xSelectBits |= eSELECT_READ;
964     xEventGroupSetBits_ExpectAndReturn( xSocket.pxSocketSet->xSelectGroup, eSELECT_READ, pdPASS );
965 
966     /* xSemaphoreGive is defined as xQueueGenericSend */
967     xSocket.pxUserSemaphore = ( SemaphoreHandle_t ) &xSocketSem;
968     xQueueGenericSend_ExpectAndReturn( xSocket.pxUserSemaphore, NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK, pdPASS );
969 
970     xIsDHCPSocket_ExpectAndReturn( &xSocket, pdTRUE );
971     xSendDHCPEvent_ExpectAndReturn( xNetworkBuffer.pxEndPoint, pdPASS );
972 
973     xReturn = xProcessReceivedUDPPacket_IPv4( &xNetworkBuffer, usDestPortNetworkEndian, &xIsWaitingForARPResolution );
974 
975     TEST_ASSERT_EQUAL( pdPASS, xReturn );
976 }
977 
978 /**
979  * @brief To validate the flow that all flows except for select bit (list/event group/queue/DHCP) are all pass.
980  */
test_xProcessReceivedUDPPacket_IPv4_PassNoSelectBit()981 void test_xProcessReceivedUDPPacket_IPv4_PassNoSelectBit()
982 {
983     BaseType_t xReturn;
984     uint16_t usSrcPort = 2048U;
985     uint16_t usDestPort = 1024U;
986     uint16_t usDestPortNetworkEndian = FreeRTOS_htons( usDestPort );
987     BaseType_t xIsWaitingForARPResolution;
988     NetworkBufferDescriptor_t xNetworkBuffer;
989     uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
990     NetworkEndPoint_t xEndPoint;
991     UDPPacket_t * pxUDPPacket;
992     FreeRTOS_Socket_t xSocket;
993     EventGroupHandle_t xEventGroup;
994     struct xSOCKET_SET xSocketSet;
995     SemaphoreHandle_t xSocketSem;
996 
997     memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
998     memset( pucEthernetBuffer, 0, sizeof( pucEthernetBuffer ) );
999     memset( &xSocket, 0, sizeof( xSocket ) );
1000 
1001     xNetworkBuffer.pucEthernetBuffer = pucEthernetBuffer;
1002     xNetworkBuffer.pxEndPoint = &xEndPoint;
1003     xNetworkBuffer.usPort = FreeRTOS_htons( usSrcPort );
1004     xNetworkBuffer.xDataLength = ipconfigTCP_MSS;
1005 
1006     xEndPoint.ipv4_settings.ulIPAddress = ulDefaultIPv4Address;
1007 
1008     pxUDPPacket = ( UDPPacket_t * ) pucEthernetBuffer;
1009     pxUDPPacket->xIPHeader.usLength = xNetworkBuffer.xDataLength - ipSIZE_OF_ETH_HEADER;
1010 
1011     pxUDPPacket->xUDPHeader.usChecksum = 0x1234U;
1012     pxUDPPacket->xUDPHeader.usSourcePort = FreeRTOS_htons( usSrcPort );
1013     pxUDPPacket->xUDPHeader.usDestinationPort = usDestPortNetworkEndian;
1014 
1015     xSocket.u.xUDP.pxHandleReceive = NULL;
1016     xSocket.xEventGroup = xEventGroup;
1017 
1018     pxUDPSocketLookup_ExpectAndReturn( usDestPortNetworkEndian, &xSocket );
1019     xCheckRequiresARPResolution_ExpectAndReturn( &xNetworkBuffer, pdFALSE );
1020     vARPRefreshCacheEntryAge_Ignore();
1021 
1022     /* Set for listCURRENT_LIST_LENGTH */
1023     xSocket.u.xUDP.uxMaxPackets = 255U;
1024     xSocket.u.xUDP.xWaitingPacketsList.uxNumberOfItems = 0U;
1025 
1026     vTaskSuspendAll_Ignore();
1027     vListInsertEnd_Expect( &( xSocket.u.xUDP.xWaitingPacketsList ), &( xNetworkBuffer.xBufferListItem ) );
1028     xTaskResumeAll_ExpectAndReturn( pdPASS );
1029 
1030     xEventGroupSetBits_ExpectAndReturn( xSocket.xEventGroup, eSOCKET_RECEIVE, pdPASS );
1031 
1032     xSocket.pxSocketSet = &xSocketSet;
1033 
1034     /* xSemaphoreGive is defined as xQueueGenericSend */
1035     xSocket.pxUserSemaphore = ( SemaphoreHandle_t ) &xSocketSem;
1036     xQueueGenericSend_ExpectAndReturn( xSocket.pxUserSemaphore, NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK, pdPASS );
1037 
1038     xIsDHCPSocket_ExpectAndReturn( &xSocket, pdTRUE );
1039     xSendDHCPEvent_ExpectAndReturn( xNetworkBuffer.pxEndPoint, pdPASS );
1040 
1041     xReturn = xProcessReceivedUDPPacket_IPv4( &xNetworkBuffer, usDestPortNetworkEndian, &xIsWaitingForARPResolution );
1042 
1043     TEST_ASSERT_EQUAL( pdPASS, xReturn );
1044 }
1045 
1046 /**
1047  * @brief To validate the flow that all flows except for select set (list/event group/queue/DHCP) are all pass.
1048  */
test_xProcessReceivedUDPPacket_IPv4_PassNoSelectSet()1049 void test_xProcessReceivedUDPPacket_IPv4_PassNoSelectSet()
1050 {
1051     BaseType_t xReturn;
1052     uint16_t usSrcPort = 2048U;
1053     uint16_t usDestPort = 1024U;
1054     uint16_t usDestPortNetworkEndian = FreeRTOS_htons( usDestPort );
1055     BaseType_t xIsWaitingForARPResolution;
1056     NetworkBufferDescriptor_t xNetworkBuffer;
1057     NetworkEndPoint_t xEndPoint;
1058     uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1059     UDPPacket_t * pxUDPPacket;
1060     FreeRTOS_Socket_t xSocket;
1061     EventGroupHandle_t xEventGroup;
1062     SemaphoreHandle_t xSocketSem;
1063 
1064     memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
1065     memset( pucEthernetBuffer, 0, sizeof( pucEthernetBuffer ) );
1066     memset( &xSocket, 0, sizeof( xSocket ) );
1067     memset( &xEndPoint, 0, sizeof( xEndPoint ) );
1068 
1069     xNetworkBuffer.pucEthernetBuffer = pucEthernetBuffer;
1070     xNetworkBuffer.pxEndPoint = &xEndPoint;
1071     xNetworkBuffer.usPort = FreeRTOS_htons( usSrcPort );
1072     xNetworkBuffer.xDataLength = ipconfigTCP_MSS;
1073 
1074     xEndPoint.ipv4_settings.ulIPAddress = ulDefaultIPv4Address;
1075 
1076     pxUDPPacket = ( UDPPacket_t * ) pucEthernetBuffer;
1077     pxUDPPacket->xIPHeader.usLength = xNetworkBuffer.xDataLength - ipSIZE_OF_ETH_HEADER;
1078 
1079     pxUDPPacket->xUDPHeader.usChecksum = 0x1234U;
1080     pxUDPPacket->xUDPHeader.usSourcePort = FreeRTOS_htons( usSrcPort );
1081     pxUDPPacket->xUDPHeader.usDestinationPort = usDestPortNetworkEndian;
1082 
1083     xSocket.u.xUDP.pxHandleReceive = NULL;
1084     xSocket.xEventGroup = xEventGroup;
1085 
1086     pxUDPSocketLookup_ExpectAndReturn( usDestPortNetworkEndian, &xSocket );
1087     xCheckRequiresARPResolution_ExpectAndReturn( &xNetworkBuffer, pdFALSE );
1088     vARPRefreshCacheEntryAge_Ignore();
1089 
1090     /* Set for listCURRENT_LIST_LENGTH */
1091     xSocket.u.xUDP.uxMaxPackets = 255U;
1092     xSocket.u.xUDP.xWaitingPacketsList.uxNumberOfItems = 0U;
1093 
1094     vTaskSuspendAll_Ignore();
1095     vListInsertEnd_Expect( &( xSocket.u.xUDP.xWaitingPacketsList ), &( xNetworkBuffer.xBufferListItem ) );
1096     xTaskResumeAll_ExpectAndReturn( pdPASS );
1097 
1098     xEventGroupSetBits_ExpectAndReturn( xSocket.xEventGroup, eSOCKET_RECEIVE, pdPASS );
1099 
1100     /* xSemaphoreGive is defined as xQueueGenericSend */
1101     xSocket.pxUserSemaphore = ( SemaphoreHandle_t ) &xSocketSem;
1102     xQueueGenericSend_ExpectAndReturn( xSocket.pxUserSemaphore, NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK, pdPASS );
1103 
1104     xIsDHCPSocket_ExpectAndReturn( &xSocket, pdTRUE );
1105     xSendDHCPEvent_ExpectAndReturn( xNetworkBuffer.pxEndPoint, pdPASS );
1106 
1107     xReturn = xProcessReceivedUDPPacket_IPv4( &xNetworkBuffer, usDestPortNetworkEndian, &xIsWaitingForARPResolution );
1108 
1109     TEST_ASSERT_EQUAL( pdPASS, xReturn );
1110 }
1111 
1112 /**
1113  * @brief To validate the flow that all flows except for semaphore (list/event group/select/DHCP) are all pass.
1114  */
test_xProcessReceivedUDPPacket_IPv4_PassNoSem()1115 void test_xProcessReceivedUDPPacket_IPv4_PassNoSem()
1116 {
1117     BaseType_t xReturn;
1118     uint16_t usSrcPort = 2048U;
1119     uint16_t usDestPort = 1024U;
1120     uint16_t usDestPortNetworkEndian = FreeRTOS_htons( usDestPort );
1121     BaseType_t xIsWaitingForARPResolution;
1122     NetworkBufferDescriptor_t xNetworkBuffer;
1123     NetworkEndPoint_t xEndPoint;
1124     uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1125     UDPPacket_t * pxUDPPacket;
1126     FreeRTOS_Socket_t xSocket;
1127     EventGroupHandle_t xEventGroup;
1128     struct xSOCKET_SET xSocketSet;
1129 
1130     memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
1131     memset( pucEthernetBuffer, 0, sizeof( pucEthernetBuffer ) );
1132     memset( &xSocket, 0, sizeof( xSocket ) );
1133     memset( &xEndPoint, 0, sizeof( xEndPoint ) );
1134 
1135     xNetworkBuffer.pucEthernetBuffer = pucEthernetBuffer;
1136     xNetworkBuffer.pxEndPoint = &xEndPoint;
1137     xNetworkBuffer.usPort = FreeRTOS_htons( usSrcPort );
1138     xNetworkBuffer.xDataLength = ipconfigTCP_MSS;
1139 
1140     xEndPoint.ipv4_settings.ulIPAddress = ulDefaultIPv4Address;
1141 
1142     pxUDPPacket = ( UDPPacket_t * ) pucEthernetBuffer;
1143     pxUDPPacket->xIPHeader.usLength = xNetworkBuffer.xDataLength - ipSIZE_OF_ETH_HEADER;
1144 
1145     pxUDPPacket->xUDPHeader.usChecksum = 0x1234U;
1146     pxUDPPacket->xUDPHeader.usSourcePort = FreeRTOS_htons( usSrcPort );
1147     pxUDPPacket->xUDPHeader.usDestinationPort = usDestPortNetworkEndian;
1148 
1149     xSocket.u.xUDP.pxHandleReceive = NULL;
1150     xSocket.xEventGroup = xEventGroup;
1151 
1152     pxUDPSocketLookup_ExpectAndReturn( usDestPortNetworkEndian, &xSocket );
1153     xCheckRequiresARPResolution_ExpectAndReturn( &xNetworkBuffer, pdFALSE );
1154     vARPRefreshCacheEntryAge_Ignore();
1155 
1156     /* Set for listCURRENT_LIST_LENGTH */
1157     xSocket.u.xUDP.uxMaxPackets = 255U;
1158     xSocket.u.xUDP.xWaitingPacketsList.uxNumberOfItems = 0U;
1159 
1160     vTaskSuspendAll_Ignore();
1161     vListInsertEnd_Expect( &( xSocket.u.xUDP.xWaitingPacketsList ), &( xNetworkBuffer.xBufferListItem ) );
1162     xTaskResumeAll_ExpectAndReturn( pdPASS );
1163 
1164     xEventGroupSetBits_ExpectAndReturn( xSocket.xEventGroup, eSOCKET_RECEIVE, pdPASS );
1165 
1166     xSocket.pxSocketSet = &xSocketSet;
1167     xSocket.xSelectBits |= eSELECT_READ;
1168     xEventGroupSetBits_ExpectAndReturn( xSocket.pxSocketSet->xSelectGroup, eSELECT_READ, pdPASS );
1169 
1170     xIsDHCPSocket_ExpectAndReturn( &xSocket, pdTRUE );
1171     xSendDHCPEvent_ExpectAndReturn( xNetworkBuffer.pxEndPoint, pdPASS );
1172 
1173     xReturn = xProcessReceivedUDPPacket_IPv4( &xNetworkBuffer, usDestPortNetworkEndian, &xIsWaitingForARPResolution );
1174 
1175     TEST_ASSERT_EQUAL( pdPASS, xReturn );
1176 }
1177 
1178 /**
1179  * @brief To validate the flow that all flows except for DHCP (list/event group/select/queue) are all pass.
1180  */
test_xProcessReceivedUDPPacket_IPv4_PassNoDHCP()1181 void test_xProcessReceivedUDPPacket_IPv4_PassNoDHCP()
1182 {
1183     BaseType_t xReturn;
1184     uint16_t usSrcPort = 2048U;
1185     uint16_t usDestPort = 1024U;
1186     uint16_t usDestPortNetworkEndian = FreeRTOS_htons( usDestPort );
1187     BaseType_t xIsWaitingForARPResolution;
1188     NetworkBufferDescriptor_t xNetworkBuffer;
1189     NetworkEndPoint_t xEndPoint;
1190     uint8_t pucEthernetBuffer[ ipconfigTCP_MSS ];
1191     UDPPacket_t * pxUDPPacket;
1192     FreeRTOS_Socket_t xSocket;
1193     EventGroupHandle_t xEventGroup;
1194     struct xSOCKET_SET xSocketSet;
1195     SemaphoreHandle_t xSocketSem;
1196 
1197     memset( &xNetworkBuffer, 0, sizeof( xNetworkBuffer ) );
1198     memset( pucEthernetBuffer, 0, sizeof( pucEthernetBuffer ) );
1199     memset( &xSocket, 0, sizeof( xSocket ) );
1200     memset( &xEndPoint, 0, sizeof( xEndPoint ) );
1201 
1202     xNetworkBuffer.pucEthernetBuffer = pucEthernetBuffer;
1203     xNetworkBuffer.pxEndPoint = &xEndPoint;
1204     xNetworkBuffer.usPort = FreeRTOS_htons( usSrcPort );
1205     xNetworkBuffer.xDataLength = ipconfigTCP_MSS;
1206 
1207     xEndPoint.ipv4_settings.ulIPAddress = ulDefaultIPv4Address;
1208 
1209     pxUDPPacket = ( UDPPacket_t * ) pucEthernetBuffer;
1210     pxUDPPacket->xIPHeader.usLength = xNetworkBuffer.xDataLength - ipSIZE_OF_ETH_HEADER;
1211 
1212     pxUDPPacket->xUDPHeader.usChecksum = 0x1234U;
1213     pxUDPPacket->xUDPHeader.usSourcePort = FreeRTOS_htons( usSrcPort );
1214     pxUDPPacket->xUDPHeader.usDestinationPort = usDestPortNetworkEndian;
1215 
1216     xSocket.u.xUDP.pxHandleReceive = NULL;
1217     xSocket.xEventGroup = xEventGroup;
1218 
1219     pxUDPSocketLookup_ExpectAndReturn( usDestPortNetworkEndian, &xSocket );
1220     xCheckRequiresARPResolution_ExpectAndReturn( &xNetworkBuffer, pdFALSE );
1221     vARPRefreshCacheEntryAge_Ignore();
1222 
1223     /* Set for listCURRENT_LIST_LENGTH */
1224     xSocket.u.xUDP.uxMaxPackets = 255U;
1225     xSocket.u.xUDP.xWaitingPacketsList.uxNumberOfItems = 0U;
1226 
1227     vTaskSuspendAll_Ignore();
1228     vListInsertEnd_Expect( &( xSocket.u.xUDP.xWaitingPacketsList ), &( xNetworkBuffer.xBufferListItem ) );
1229     xTaskResumeAll_ExpectAndReturn( pdPASS );
1230 
1231     xEventGroupSetBits_ExpectAndReturn( xSocket.xEventGroup, eSOCKET_RECEIVE, pdPASS );
1232 
1233     xSocket.pxSocketSet = &xSocketSet;
1234     xSocket.xSelectBits |= eSELECT_READ;
1235     xEventGroupSetBits_ExpectAndReturn( xSocket.pxSocketSet->xSelectGroup, eSELECT_READ, pdPASS );
1236 
1237     /* xSemaphoreGive is defined as xQueueGenericSend */
1238     xSocket.pxUserSemaphore = ( SemaphoreHandle_t ) &xSocketSem;
1239     xQueueGenericSend_ExpectAndReturn( xSocket.pxUserSemaphore, NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK, pdPASS );
1240 
1241     xIsDHCPSocket_ExpectAndReturn( &xSocket, pdFALSE );
1242 
1243     xReturn = xProcessReceivedUDPPacket_IPv4( &xNetworkBuffer, usDestPortNetworkEndian, &xIsWaitingForARPResolution );
1244 
1245     TEST_ASSERT_EQUAL( pdPASS, xReturn );
1246 }
1247 
1248 /**
1249  * @brief To validate the flow to send ping message but get failure on ARP get entry.
1250  */
test_vProcessGeneratedUDPPacket_IPv4_ICMPPingCantSend()1251 void test_vProcessGeneratedUDPPacket_IPv4_ICMPPingCantSend()
1252 {
1253     BaseType_t xReturn;
1254     NetworkBufferDescriptor_t * pxNetworkBuffer;
1255     NetworkEndPoint_t * pxEndPoint;
1256     ICMPPacket_t * pxICMPPacket;
1257 
1258     pxNetworkBuffer = prvPrepareDefaultNetworkbuffer( ipPROTOCOL_ICMP );
1259     pxEndPoint = prvPrepareDefaultIPv4EndPoint();
1260 
1261     pxNetworkBuffer->usPort = ipPACKET_CONTAINS_ICMP_DATA;
1262 
1263     pxICMPPacket = ( ICMPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
1264 
1265     eARPGetCacheEntry_ExpectAndReturn( &( pxNetworkBuffer->xIPAddress.ulIP_IPv4 ), &( pxICMPPacket->xEthernetHeader.xDestinationAddress ), NULL, eCantSendPacket );
1266     eARPGetCacheEntry_IgnoreArg_ppxEndPoint();
1267     eARPGetCacheEntry_ReturnThruPtr_ppxEndPoint( &pxEndPoint );
1268     eARPGetCacheEntry_IgnoreArg_pulIPAddress();
1269     vReleaseNetworkBufferAndDescriptor_Expect( pxNetworkBuffer );
1270 
1271     vProcessGeneratedUDPPacket_IPv4( pxNetworkBuffer );
1272 }
1273 
1274 /**
1275  * @brief To validate the flow to send ping message but get an unknown ND return.
1276  */
test_vProcessGeneratedUDPPacket_IPv4_ICMPPingCacheUnknown()1277 void test_vProcessGeneratedUDPPacket_IPv4_ICMPPingCacheUnknown()
1278 {
1279     BaseType_t xReturn;
1280     NetworkBufferDescriptor_t * pxNetworkBuffer;
1281     NetworkEndPoint_t * pxEndPoint;
1282     ICMPPacket_t * pxICMPPacket;
1283 
1284     pxNetworkBuffer = prvPrepareDefaultNetworkbuffer( ipPROTOCOL_ICMP );
1285     pxEndPoint = prvPrepareDefaultIPv4EndPoint();
1286 
1287     pxNetworkBuffer->usPort = ipPACKET_CONTAINS_ICMP_DATA;
1288 
1289     pxICMPPacket = ( ICMPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
1290 
1291     eARPGetCacheEntry_ExpectAndReturn( &( pxNetworkBuffer->xIPAddress.ulIP_IPv4 ), &( pxICMPPacket->xEthernetHeader.xDestinationAddress ), NULL, 0xFF );
1292     eARPGetCacheEntry_IgnoreArg_ppxEndPoint();
1293     eARPGetCacheEntry_ReturnThruPtr_ppxEndPoint( &pxEndPoint );
1294     eARPGetCacheEntry_IgnoreArg_pulIPAddress();
1295     vReleaseNetworkBufferAndDescriptor_Expect( pxNetworkBuffer );
1296 
1297     vProcessGeneratedUDPPacket_IPv4( pxNetworkBuffer );
1298 }
1299 
1300 /**
1301  * @brief To validate the flow to send ping message and get a cache hit.
1302  */
test_vProcessGeneratedUDPPacket_IPv4_ICMPPingCacheHit()1303 void test_vProcessGeneratedUDPPacket_IPv4_ICMPPingCacheHit()
1304 {
1305     BaseType_t xReturn;
1306     NetworkBufferDescriptor_t * pxNetworkBuffer;
1307     NetworkEndPoint_t * pxEndPoint;
1308     ICMPPacket_t * pxICMPPacket;
1309 
1310     pxNetworkBuffer = prvPrepareDefaultNetworkbuffer( ipPROTOCOL_ICMP );
1311     pxEndPoint = prvPrepareDefaultIPv4EndPoint();
1312 
1313     /* To trigger checksum generation. */
1314     pxNetworkBuffer->pucEthernetBuffer[ ipSOCKET_OPTIONS_OFFSET ] |= FREERTOS_SO_UDPCKSUM_OUT;
1315 
1316     pxNetworkBuffer->usPort = ipPACKET_CONTAINS_ICMP_DATA;
1317 
1318     pxICMPPacket = ( ICMPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
1319 
1320     eARPGetCacheEntry_ExpectAndReturn( &( pxNetworkBuffer->xIPAddress.ulIP_IPv4 ), &( pxICMPPacket->xEthernetHeader.xDestinationAddress ), NULL, eARPCacheHit );
1321     eARPGetCacheEntry_IgnoreArg_ppxEndPoint();
1322     eARPGetCacheEntry_ReturnThruPtr_ppxEndPoint( &pxEndPoint );
1323     eARPGetCacheEntry_IgnoreArg_pulIPAddress();
1324     uxIPHeaderSizePacket_ExpectAndReturn( pxNetworkBuffer, ipSIZE_OF_IPv4_HEADER );
1325     usGenerateChecksum_ExpectAnyArgsAndReturn( ulDefaultProtoChecksum );
1326     usGenerateProtocolChecksum_ExpectAndReturn( pxNetworkBuffer->pucEthernetBuffer, pxNetworkBuffer->xDataLength, pdTRUE, ipCORRECT_CRC );
1327 
1328     vProcessGeneratedUDPPacket_IPv4( pxNetworkBuffer );
1329 
1330     TEST_ASSERT_EQUAL( pxEndPoint, pxNetworkBuffer->pxEndPoint );
1331     TEST_ASSERT_EQUAL( ipPROTOCOL_ICMP, pxICMPPacket->xIPHeader.ucProtocol );
1332     TEST_ASSERT_EQUAL( 1, xIsIfOutCalled );
1333 }
1334 
1335 /**
1336  * @brief To validate the flow to send UDP and get a cache hit.
1337  */
test_vProcessGeneratedUDPPacket_IPv4_UDPCacheHit()1338 void test_vProcessGeneratedUDPPacket_IPv4_UDPCacheHit()
1339 {
1340     BaseType_t xReturn;
1341     NetworkBufferDescriptor_t * pxNetworkBuffer;
1342     NetworkEndPoint_t * pxEndPoint;
1343     UDPPacket_t * pxUDPPacket;
1344 
1345     pxNetworkBuffer = prvPrepareDefaultNetworkbuffer( ipPROTOCOL_UDP );
1346     pxEndPoint = prvPrepareDefaultIPv4EndPoint();
1347 
1348     /* To trigger checksum generation. */
1349     pxNetworkBuffer->pucEthernetBuffer[ ipSOCKET_OPTIONS_OFFSET ] |= FREERTOS_SO_UDPCKSUM_OUT;
1350 
1351     pxUDPPacket = ( UDPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
1352 
1353     eARPGetCacheEntry_ExpectAndReturn( &( pxNetworkBuffer->xIPAddress.ulIP_IPv4 ), &( pxUDPPacket->xEthernetHeader.xDestinationAddress ), NULL, eARPCacheHit );
1354     eARPGetCacheEntry_IgnoreArg_ppxEndPoint();
1355     eARPGetCacheEntry_ReturnThruPtr_ppxEndPoint( &pxEndPoint );
1356     eARPGetCacheEntry_IgnoreArg_pulIPAddress();
1357     uxIPHeaderSizePacket_ExpectAndReturn( pxNetworkBuffer, ipSIZE_OF_IPv4_HEADER );
1358     usGenerateChecksum_ExpectAnyArgsAndReturn( ulDefaultProtoChecksum );
1359     usGenerateProtocolChecksum_ExpectAndReturn( pxNetworkBuffer->pucEthernetBuffer, pxNetworkBuffer->xDataLength, pdTRUE, ipCORRECT_CRC );
1360 
1361     vProcessGeneratedUDPPacket_IPv4( pxNetworkBuffer );
1362 
1363     TEST_ASSERT_EQUAL( pxEndPoint, pxNetworkBuffer->pxEndPoint );
1364     TEST_ASSERT_EQUAL( ipPROTOCOL_UDP, pxUDPPacket->xIPHeader.ucProtocol );
1365     TEST_ASSERT_EQUAL( pxNetworkBuffer->xDataLength - ( ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv4_HEADER ), FreeRTOS_ntohs( pxUDPPacket->xUDPHeader.usLength ) );
1366     TEST_ASSERT_EQUAL( pxNetworkBuffer->usBoundPort, pxUDPPacket->xUDPHeader.usSourcePort );
1367     TEST_ASSERT_EQUAL( pxNetworkBuffer->usPort, pxUDPPacket->xUDPHeader.usDestinationPort );
1368     TEST_ASSERT_EQUAL( ulDefaultIPv4Address, pxUDPPacket->xIPHeader.ulSourceIPAddress );
1369     TEST_ASSERT_EQUAL( 1, xIsIfOutCalled );
1370 }
1371 
1372 /**
1373  * @brief To validate the flow to send UDP and get a cache hit. But the buffer length is
1374  * less than minimum requirement.
1375  */
test_vProcessGeneratedUDPPacket_IPv4_UDPCacheHitLessBufferLength()1376 void test_vProcessGeneratedUDPPacket_IPv4_UDPCacheHitLessBufferLength()
1377 {
1378     BaseType_t xReturn;
1379     NetworkBufferDescriptor_t * pxNetworkBuffer;
1380     NetworkEndPoint_t * pxEndPoint;
1381     UDPPacket_t * pxUDPPacket;
1382     size_t xBufferLength = ipconfigETHERNET_MINIMUM_PACKET_BYTES - 1;
1383 
1384     pxNetworkBuffer = prvPrepareDefaultNetworkbuffer( ipPROTOCOL_UDP );
1385     pxEndPoint = prvPrepareDefaultIPv4EndPoint();
1386 
1387     /* To trigger checksum generation. */
1388     pxNetworkBuffer->pucEthernetBuffer[ ipSOCKET_OPTIONS_OFFSET ] |= FREERTOS_SO_UDPCKSUM_OUT;
1389     pxNetworkBuffer->xDataLength = xBufferLength;
1390 
1391     pxUDPPacket = ( UDPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
1392 
1393     eARPGetCacheEntry_ExpectAndReturn( &( pxNetworkBuffer->xIPAddress.ulIP_IPv4 ), &( pxUDPPacket->xEthernetHeader.xDestinationAddress ), NULL, eARPCacheHit );
1394     eARPGetCacheEntry_IgnoreArg_ppxEndPoint();
1395     eARPGetCacheEntry_ReturnThruPtr_ppxEndPoint( &pxEndPoint );
1396     eARPGetCacheEntry_IgnoreArg_pulIPAddress();
1397     uxIPHeaderSizePacket_ExpectAndReturn( pxNetworkBuffer, ipSIZE_OF_IPv4_HEADER );
1398     usGenerateChecksum_ExpectAnyArgsAndReturn( ulDefaultProtoChecksum );
1399     usGenerateProtocolChecksum_ExpectAndReturn( pxNetworkBuffer->pucEthernetBuffer, pxNetworkBuffer->xDataLength, pdTRUE, ipCORRECT_CRC );
1400 
1401     vProcessGeneratedUDPPacket_IPv4( pxNetworkBuffer );
1402 
1403     TEST_ASSERT_EQUAL( ipconfigETHERNET_MINIMUM_PACKET_BYTES, pxNetworkBuffer->xDataLength );
1404     TEST_ASSERT_EQUAL( pxEndPoint, pxNetworkBuffer->pxEndPoint );
1405     TEST_ASSERT_EQUAL( ipPROTOCOL_UDP, pxUDPPacket->xIPHeader.ucProtocol );
1406     TEST_ASSERT_EQUAL( xBufferLength - ( ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv4_HEADER ), FreeRTOS_ntohs( pxUDPPacket->xUDPHeader.usLength ) );
1407     TEST_ASSERT_EQUAL( pxNetworkBuffer->usBoundPort, pxUDPPacket->xUDPHeader.usSourcePort );
1408     TEST_ASSERT_EQUAL( pxNetworkBuffer->usPort, pxUDPPacket->xUDPHeader.usDestinationPort );
1409     TEST_ASSERT_EQUAL( ulDefaultIPv4Address, pxUDPPacket->xIPHeader.ulSourceIPAddress );
1410     TEST_ASSERT_EQUAL( 1, xIsIfOutCalled );
1411 }
1412 
1413 /**
1414  * @brief To validate the flow to send UDP and get a cache hit with different endpoint.
1415  */
test_vProcessGeneratedUDPPacket_IPv4_UDPCacheHitDiffEndPoint()1416 void test_vProcessGeneratedUDPPacket_IPv4_UDPCacheHitDiffEndPoint()
1417 {
1418     BaseType_t xReturn;
1419     NetworkBufferDescriptor_t * pxNetworkBuffer;
1420     NetworkEndPoint_t * pxEndPoint, xDifferentEndPoint, * pxDifferentEndPoint = &xDifferentEndPoint;
1421     UDPPacket_t * pxUDPPacket;
1422 
1423     memset( &xDifferentEndPoint, 0, sizeof( xDifferentEndPoint ) );
1424 
1425     pxNetworkBuffer = prvPrepareDefaultNetworkbuffer( ipPROTOCOL_UDP );
1426     pxEndPoint = prvPrepareDefaultIPv4EndPoint();
1427 
1428     pxNetworkBuffer->pxEndPoint = pxEndPoint;
1429 
1430     pxUDPPacket = ( UDPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
1431 
1432     eARPGetCacheEntry_ExpectAndReturn( &( pxNetworkBuffer->xIPAddress.ulIP_IPv4 ), &( pxUDPPacket->xEthernetHeader.xDestinationAddress ), NULL, eARPCacheHit );
1433     eARPGetCacheEntry_IgnoreArg_ppxEndPoint();
1434     eARPGetCacheEntry_ReturnThruPtr_ppxEndPoint( &pxDifferentEndPoint );
1435     eARPGetCacheEntry_IgnoreArg_pulIPAddress();
1436     uxIPHeaderSizePacket_ExpectAndReturn( pxNetworkBuffer, ipSIZE_OF_IPv4_HEADER );
1437     usGenerateChecksum_ExpectAnyArgsAndReturn( ulDefaultProtoChecksum );
1438 
1439     vProcessGeneratedUDPPacket_IPv4( pxNetworkBuffer );
1440 
1441     TEST_ASSERT_EQUAL( pxEndPoint, pxNetworkBuffer->pxEndPoint );
1442     TEST_ASSERT_EQUAL( ipPROTOCOL_UDP, pxUDPPacket->xIPHeader.ucProtocol );
1443     TEST_ASSERT_EQUAL( pxNetworkBuffer->xDataLength - ( ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv4_HEADER ), FreeRTOS_ntohs( pxUDPPacket->xUDPHeader.usLength ) );
1444     TEST_ASSERT_EQUAL( pxNetworkBuffer->usBoundPort, pxUDPPacket->xUDPHeader.usSourcePort );
1445     TEST_ASSERT_EQUAL( pxNetworkBuffer->usPort, pxUDPPacket->xUDPHeader.usDestinationPort );
1446     TEST_ASSERT_EQUAL( ulDefaultIPv4Address, pxUDPPacket->xIPHeader.ulSourceIPAddress );
1447     TEST_ASSERT_EQUAL( 1, xIsIfOutCalled );
1448 }
1449 
1450 /**
1451  * @brief To validate the flow to send LLMNR UDP and get a cache hit.
1452  */
test_vProcessGeneratedUDPPacket_IPv4_UDPCacheHitLLMNR()1453 void test_vProcessGeneratedUDPPacket_IPv4_UDPCacheHitLLMNR()
1454 {
1455     BaseType_t xReturn;
1456     NetworkBufferDescriptor_t * pxNetworkBuffer;
1457     NetworkEndPoint_t * pxEndPoint;
1458     UDPPacket_t * pxUDPPacket;
1459 
1460     pxNetworkBuffer = prvPrepareDefaultNetworkbuffer( ipPROTOCOL_UDP );
1461     pxEndPoint = prvPrepareDefaultIPv4EndPoint();
1462 
1463     /* To trigger checksum generation. */
1464     pxNetworkBuffer->pucEthernetBuffer[ ipSOCKET_OPTIONS_OFFSET ] |= FREERTOS_SO_UDPCKSUM_OUT;
1465     pxNetworkBuffer->xIPAddress.ulIP_IPv4 = ipLLMNR_IP_ADDR;
1466 
1467     pxUDPPacket = ( UDPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
1468 
1469     eARPGetCacheEntry_ExpectAndReturn( &( pxNetworkBuffer->xIPAddress.ulIP_IPv4 ), &( pxUDPPacket->xEthernetHeader.xDestinationAddress ), NULL, eARPCacheHit );
1470     eARPGetCacheEntry_IgnoreArg_ppxEndPoint();
1471     eARPGetCacheEntry_ReturnThruPtr_ppxEndPoint( &pxEndPoint );
1472     eARPGetCacheEntry_IgnoreArg_pulIPAddress();
1473     uxIPHeaderSizePacket_ExpectAndReturn( pxNetworkBuffer, ipSIZE_OF_IPv4_HEADER );
1474     usGenerateChecksum_ExpectAnyArgsAndReturn( ulDefaultProtoChecksum );
1475     usGenerateProtocolChecksum_ExpectAndReturn( pxNetworkBuffer->pucEthernetBuffer, pxNetworkBuffer->xDataLength, pdTRUE, ipCORRECT_CRC );
1476 
1477     vProcessGeneratedUDPPacket_IPv4( pxNetworkBuffer );
1478 
1479     TEST_ASSERT_EQUAL( pxEndPoint, pxNetworkBuffer->pxEndPoint );
1480     TEST_ASSERT_EQUAL( ipPROTOCOL_UDP, pxUDPPacket->xIPHeader.ucProtocol );
1481     TEST_ASSERT_EQUAL( pxNetworkBuffer->xDataLength - ( ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv4_HEADER ), FreeRTOS_ntohs( pxUDPPacket->xUDPHeader.usLength ) );
1482     TEST_ASSERT_EQUAL( pxNetworkBuffer->usBoundPort, pxUDPPacket->xUDPHeader.usSourcePort );
1483     TEST_ASSERT_EQUAL( pxNetworkBuffer->usPort, pxUDPPacket->xUDPHeader.usDestinationPort );
1484     TEST_ASSERT_EQUAL( ulDefaultIPv4Address, pxUDPPacket->xIPHeader.ulSourceIPAddress );
1485     TEST_ASSERT_EQUAL( 1, xIsIfOutCalled );
1486     TEST_ASSERT_EQUAL( 0x01, pxUDPPacket->xIPHeader.ucTimeToLive );
1487 }
1488 
1489 /**
1490  * @brief To validate the flow to send MDNS UDP and get a cache hit.
1491  */
test_vProcessGeneratedUDPPacket_IPv4_UDPCacheHitMDNS()1492 void test_vProcessGeneratedUDPPacket_IPv4_UDPCacheHitMDNS()
1493 {
1494     BaseType_t xReturn;
1495     NetworkBufferDescriptor_t * pxNetworkBuffer;
1496     NetworkEndPoint_t * pxEndPoint;
1497     UDPPacket_t * pxUDPPacket;
1498 
1499     pxNetworkBuffer = prvPrepareDefaultNetworkbuffer( ipPROTOCOL_UDP );
1500     pxEndPoint = prvPrepareDefaultIPv4EndPoint();
1501 
1502     /* To trigger checksum generation. */
1503     pxNetworkBuffer->pucEthernetBuffer[ ipSOCKET_OPTIONS_OFFSET ] |= FREERTOS_SO_UDPCKSUM_OUT;
1504     pxNetworkBuffer->xIPAddress.ulIP_IPv4 = ipMDNS_IP_ADDRESS;
1505 
1506     pxUDPPacket = ( UDPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
1507 
1508     eARPGetCacheEntry_ExpectAndReturn( &( pxNetworkBuffer->xIPAddress.ulIP_IPv4 ), &( pxUDPPacket->xEthernetHeader.xDestinationAddress ), NULL, eARPCacheHit );
1509     eARPGetCacheEntry_IgnoreArg_ppxEndPoint();
1510     eARPGetCacheEntry_ReturnThruPtr_ppxEndPoint( &pxEndPoint );
1511     eARPGetCacheEntry_IgnoreArg_pulIPAddress();
1512     uxIPHeaderSizePacket_ExpectAndReturn( pxNetworkBuffer, ipSIZE_OF_IPv4_HEADER );
1513     usGenerateChecksum_ExpectAnyArgsAndReturn( ulDefaultProtoChecksum );
1514     usGenerateProtocolChecksum_ExpectAndReturn( pxNetworkBuffer->pucEthernetBuffer, pxNetworkBuffer->xDataLength, pdTRUE, ipCORRECT_CRC );
1515 
1516     vProcessGeneratedUDPPacket_IPv4( pxNetworkBuffer );
1517 
1518     TEST_ASSERT_EQUAL( pxEndPoint, pxNetworkBuffer->pxEndPoint );
1519     TEST_ASSERT_EQUAL( ipPROTOCOL_UDP, pxUDPPacket->xIPHeader.ucProtocol );
1520     TEST_ASSERT_EQUAL( pxNetworkBuffer->xDataLength - ( ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv4_HEADER ), FreeRTOS_ntohs( pxUDPPacket->xUDPHeader.usLength ) );
1521     TEST_ASSERT_EQUAL( pxNetworkBuffer->usBoundPort, pxUDPPacket->xUDPHeader.usSourcePort );
1522     TEST_ASSERT_EQUAL( pxNetworkBuffer->usPort, pxUDPPacket->xUDPHeader.usDestinationPort );
1523     TEST_ASSERT_EQUAL( ulDefaultIPv4Address, pxUDPPacket->xIPHeader.ulSourceIPAddress );
1524     TEST_ASSERT_EQUAL( 1, xIsIfOutCalled );
1525     TEST_ASSERT_EQUAL( 0xFF, pxUDPPacket->xIPHeader.ucTimeToLive );
1526 }
1527 
1528 /**
1529  * @brief To validate the flow to send UDP and get a cache hit
1530  * but there is no network interface in endpoint.
1531  */
test_vProcessGeneratedUDPPacket_IPv4_UDPCacheHitNoInterface()1532 void test_vProcessGeneratedUDPPacket_IPv4_UDPCacheHitNoInterface()
1533 {
1534     BaseType_t xReturn;
1535     NetworkBufferDescriptor_t * pxNetworkBuffer;
1536     NetworkEndPoint_t * pxEndPoint;
1537     UDPPacket_t * pxUDPPacket;
1538 
1539     pxNetworkBuffer = prvPrepareDefaultNetworkbuffer( ipPROTOCOL_UDP );
1540     pxEndPoint = prvPrepareDefaultIPv4EndPoint();
1541     pxEndPoint->pxNetworkInterface = NULL;
1542 
1543     /* To trigger checksum generation. */
1544     pxNetworkBuffer->pucEthernetBuffer[ ipSOCKET_OPTIONS_OFFSET ] |= FREERTOS_SO_UDPCKSUM_OUT;
1545 
1546     pxUDPPacket = ( UDPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
1547 
1548     eARPGetCacheEntry_ExpectAndReturn( &( pxNetworkBuffer->xIPAddress.ulIP_IPv4 ), &( pxUDPPacket->xEthernetHeader.xDestinationAddress ), NULL, eARPCacheHit );
1549     eARPGetCacheEntry_IgnoreArg_ppxEndPoint();
1550     eARPGetCacheEntry_ReturnThruPtr_ppxEndPoint( &pxEndPoint );
1551     eARPGetCacheEntry_IgnoreArg_pulIPAddress();
1552     uxIPHeaderSizePacket_ExpectAndReturn( pxNetworkBuffer, ipSIZE_OF_IPv4_HEADER );
1553     usGenerateChecksum_ExpectAnyArgsAndReturn( ulDefaultProtoChecksum );
1554     usGenerateProtocolChecksum_ExpectAndReturn( pxNetworkBuffer->pucEthernetBuffer, pxNetworkBuffer->xDataLength, pdTRUE, ipCORRECT_CRC );
1555 
1556     vProcessGeneratedUDPPacket_IPv4( pxNetworkBuffer );
1557 
1558     TEST_ASSERT_EQUAL( pxEndPoint, pxNetworkBuffer->pxEndPoint );
1559     TEST_ASSERT_EQUAL( ipPROTOCOL_UDP, pxUDPPacket->xIPHeader.ucProtocol );
1560     TEST_ASSERT_EQUAL( pxNetworkBuffer->xDataLength - ( ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv4_HEADER ), FreeRTOS_ntohs( pxUDPPacket->xUDPHeader.usLength ) );
1561     TEST_ASSERT_EQUAL( pxNetworkBuffer->usBoundPort, pxUDPPacket->xUDPHeader.usSourcePort );
1562     TEST_ASSERT_EQUAL( pxNetworkBuffer->usPort, pxUDPPacket->xUDPHeader.usDestinationPort );
1563     TEST_ASSERT_EQUAL( ulDefaultIPv4Address, pxUDPPacket->xIPHeader.ulSourceIPAddress );
1564     TEST_ASSERT_EQUAL( 0, xIsIfOutCalled );
1565 }
1566 
1567 /**
1568  * @brief To validate the flow to send UDP and get a cache hit
1569  * but there is no output function in network interface.
1570  */
test_vProcessGeneratedUDPPacket_IPv4_UDPCacheHitInterfaceNoOutput()1571 void test_vProcessGeneratedUDPPacket_IPv4_UDPCacheHitInterfaceNoOutput()
1572 {
1573     BaseType_t xReturn;
1574     NetworkBufferDescriptor_t * pxNetworkBuffer;
1575     NetworkEndPoint_t * pxEndPoint;
1576     UDPPacket_t * pxUDPPacket;
1577 
1578     pxNetworkBuffer = prvPrepareDefaultNetworkbuffer( ipPROTOCOL_UDP );
1579     pxEndPoint = prvPrepareDefaultIPv4EndPoint();
1580     pxEndPoint->pxNetworkInterface->pfOutput = NULL;
1581 
1582     /* To trigger checksum generation. */
1583     pxNetworkBuffer->pucEthernetBuffer[ ipSOCKET_OPTIONS_OFFSET ] |= FREERTOS_SO_UDPCKSUM_OUT;
1584 
1585     pxUDPPacket = ( UDPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
1586 
1587     eARPGetCacheEntry_ExpectAndReturn( &( pxNetworkBuffer->xIPAddress.ulIP_IPv4 ), &( pxUDPPacket->xEthernetHeader.xDestinationAddress ), NULL, eARPCacheHit );
1588     eARPGetCacheEntry_IgnoreArg_ppxEndPoint();
1589     eARPGetCacheEntry_ReturnThruPtr_ppxEndPoint( &pxEndPoint );
1590     eARPGetCacheEntry_IgnoreArg_pulIPAddress();
1591     uxIPHeaderSizePacket_ExpectAndReturn( pxNetworkBuffer, ipSIZE_OF_IPv4_HEADER );
1592     usGenerateChecksum_ExpectAnyArgsAndReturn( ulDefaultProtoChecksum );
1593     usGenerateProtocolChecksum_ExpectAndReturn( pxNetworkBuffer->pucEthernetBuffer, pxNetworkBuffer->xDataLength, pdTRUE, ipCORRECT_CRC );
1594 
1595     vProcessGeneratedUDPPacket_IPv4( pxNetworkBuffer );
1596 
1597     TEST_ASSERT_EQUAL( pxEndPoint, pxNetworkBuffer->pxEndPoint );
1598     TEST_ASSERT_EQUAL( ipPROTOCOL_UDP, pxUDPPacket->xIPHeader.ucProtocol );
1599     TEST_ASSERT_EQUAL( pxNetworkBuffer->xDataLength - ( ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv4_HEADER ), FreeRTOS_ntohs( pxUDPPacket->xUDPHeader.usLength ) );
1600     TEST_ASSERT_EQUAL( pxNetworkBuffer->usBoundPort, pxUDPPacket->xUDPHeader.usSourcePort );
1601     TEST_ASSERT_EQUAL( pxNetworkBuffer->usPort, pxUDPPacket->xUDPHeader.usDestinationPort );
1602     TEST_ASSERT_EQUAL( ulDefaultIPv4Address, pxUDPPacket->xIPHeader.ulSourceIPAddress );
1603     TEST_ASSERT_EQUAL( 0, xIsIfOutCalled );
1604 }
1605 
1606 /**
1607  * @brief To validate the flow to send UDP and get a cache hit but no matching endpoint.
1608  */
test_vProcessGeneratedUDPPacket_IPv4_UDPCacheHitNoEndPoint()1609 void test_vProcessGeneratedUDPPacket_IPv4_UDPCacheHitNoEndPoint()
1610 {
1611     BaseType_t xReturn;
1612     NetworkBufferDescriptor_t * pxNetworkBuffer;
1613     NetworkEndPoint_t * pxEndPoint;
1614     UDPPacket_t * pxUDPPacket;
1615 
1616     pxNetworkBuffer = prvPrepareDefaultNetworkbuffer( ipPROTOCOL_UDP );
1617     pxEndPoint = NULL;
1618 
1619     pxUDPPacket = ( UDPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
1620 
1621     eARPGetCacheEntry_ExpectAndReturn( &( pxNetworkBuffer->xIPAddress.ulIP_IPv4 ), &( pxUDPPacket->xEthernetHeader.xDestinationAddress ), NULL, eARPCacheHit );
1622     eARPGetCacheEntry_IgnoreArg_ppxEndPoint();
1623     eARPGetCacheEntry_ReturnThruPtr_ppxEndPoint( &pxEndPoint );
1624     eARPGetCacheEntry_IgnoreArg_pulIPAddress();
1625     uxIPHeaderSizePacket_ExpectAndReturn( pxNetworkBuffer, ipSIZE_OF_IPv4_HEADER );
1626     usGenerateChecksum_ExpectAnyArgsAndReturn( ulDefaultProtoChecksum );
1627     vReleaseNetworkBufferAndDescriptor_Expect( pxNetworkBuffer );
1628 
1629     vProcessGeneratedUDPPacket_IPv4( pxNetworkBuffer );
1630 
1631     TEST_ASSERT_EQUAL( pxEndPoint, pxNetworkBuffer->pxEndPoint );
1632     TEST_ASSERT_EQUAL( ipPROTOCOL_UDP, pxUDPPacket->xIPHeader.ucProtocol );
1633     TEST_ASSERT_EQUAL( pxNetworkBuffer->xDataLength - ( ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv4_HEADER ), FreeRTOS_ntohs( pxUDPPacket->xUDPHeader.usLength ) );
1634     TEST_ASSERT_EQUAL( pxNetworkBuffer->usBoundPort, pxUDPPacket->xUDPHeader.usSourcePort );
1635     TEST_ASSERT_EQUAL( pxNetworkBuffer->usPort, pxUDPPacket->xUDPHeader.usDestinationPort );
1636     TEST_ASSERT_EQUAL( 0, xIsIfOutCalled );
1637 }
1638 
1639 /**
1640  * @brief To validate the flow to send UDP and get a cache miss but
1641  * matching endpoint is found.
1642  */
test_vProcessGeneratedUDPPacket_IPv4_UDPCacheMissEndPointFound()1643 void test_vProcessGeneratedUDPPacket_IPv4_UDPCacheMissEndPointFound()
1644 {
1645     BaseType_t xReturn;
1646     NetworkBufferDescriptor_t * pxNetworkBuffer;
1647     NetworkEndPoint_t * pxEndPoint, * pxEndPointNull = NULL;
1648     UDPPacket_t * pxUDPPacket;
1649 
1650     pxNetworkBuffer = prvPrepareDefaultNetworkbuffer( ipPROTOCOL_UDP );
1651     pxEndPoint = prvPrepareDefaultIPv4EndPoint();
1652 
1653     pxUDPPacket = ( UDPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
1654 
1655     eARPGetCacheEntry_ExpectAndReturn( &( pxNetworkBuffer->xIPAddress.ulIP_IPv4 ), &( pxUDPPacket->xEthernetHeader.xDestinationAddress ), NULL, eARPCacheMiss );
1656     eARPGetCacheEntry_IgnoreArg_ppxEndPoint();
1657     eARPGetCacheEntry_ReturnThruPtr_ppxEndPoint( &pxEndPointNull );
1658     eARPGetCacheEntry_IgnoreArg_pulIPAddress();
1659 
1660     vARPRefreshCacheEntry_Expect( NULL, pxNetworkBuffer->xIPAddress.ulIP_IPv4, NULL );
1661     FreeRTOS_FindEndPointOnNetMask_ExpectAndReturn( pxNetworkBuffer->xIPAddress.ulIP_IPv4, 0, pxEndPoint );
1662     FreeRTOS_FindEndPointOnNetMask_IgnoreArg_ulWhere();
1663 
1664     vARPGenerateRequestPacket_Expect( pxNetworkBuffer );
1665 
1666     vProcessGeneratedUDPPacket_IPv4( pxNetworkBuffer );
1667 
1668     TEST_ASSERT_EQUAL( pxEndPoint, pxNetworkBuffer->pxEndPoint );
1669     TEST_ASSERT_EQUAL( 1, xIsIfOutCalled );
1670 }
1671 
1672 /**
1673  * @brief To validate the flow to send UDP and get a cache miss and
1674  * matching endpoint is not found.
1675  */
test_vProcessGeneratedUDPPacket_IPv4_UDPCacheMissEndPointNotFound()1676 void test_vProcessGeneratedUDPPacket_IPv4_UDPCacheMissEndPointNotFound()
1677 {
1678     BaseType_t xReturn;
1679     NetworkBufferDescriptor_t * pxNetworkBuffer;
1680     NetworkEndPoint_t * pxEndPoint, * pxEndPointNull = NULL;
1681     UDPPacket_t * pxUDPPacket;
1682 
1683     pxNetworkBuffer = prvPrepareDefaultNetworkbuffer( ipPROTOCOL_UDP );
1684     pxEndPoint = prvPrepareDefaultIPv4EndPoint();
1685 
1686     pxUDPPacket = ( UDPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
1687 
1688     eARPGetCacheEntry_ExpectAndReturn( &( pxNetworkBuffer->xIPAddress.ulIP_IPv4 ), &( pxUDPPacket->xEthernetHeader.xDestinationAddress ), NULL, eARPCacheMiss );
1689     eARPGetCacheEntry_IgnoreArg_ppxEndPoint();
1690     eARPGetCacheEntry_ReturnThruPtr_ppxEndPoint( &pxEndPointNull );
1691     eARPGetCacheEntry_IgnoreArg_pulIPAddress();
1692 
1693     vARPRefreshCacheEntry_Expect( NULL, pxNetworkBuffer->xIPAddress.ulIP_IPv4, NULL );
1694     FreeRTOS_FindEndPointOnNetMask_ExpectAndReturn( pxNetworkBuffer->xIPAddress.ulIP_IPv4, 0, NULL );
1695     FreeRTOS_FindEndPointOnNetMask_IgnoreArg_ulWhere();
1696     vReleaseNetworkBufferAndDescriptor_Expect( pxNetworkBuffer );
1697 
1698     vProcessGeneratedUDPPacket_IPv4( pxNetworkBuffer );
1699 
1700     TEST_ASSERT_EQUAL( NULL, pxNetworkBuffer->pxEndPoint );
1701     TEST_ASSERT_EQUAL( 0, xIsIfOutCalled );
1702 }
1703