1 /* This test concentrates on DTLS connections.  */
2 
3 #include   "nx_api.h"
4 #include   "nx_secure_dtls_api.h"
5 #include   "test_ca_cert.c"
6 #include   "test_device_cert.c"
7 
8 extern VOID    test_control_return(UINT status);
9 
10 
11 #if !defined(NX_SECURE_TLS_CLIENT_DISABLED) && !defined(NX_SECURE_TLS_SERVER_DISABLED) && defined(NX_SECURE_ENABLE_DTLS)
12 #define NUM_PACKETS                 24
13 #define PACKET_SIZE                 1536
14 #define PACKET_POOL_SIZE            (NUM_PACKETS * (PACKET_SIZE + sizeof(NX_PACKET)))
15 #define THREAD_STACK_SIZE           1024
16 #define ARP_CACHE_SIZE              1024
17 #define BUFFER_SIZE                 64
18 #define METADATA_SIZE               16000
19 #define CERT_BUFFER_SIZE            (2048 + sizeof(NX_SECURE_X509_CERT))
20 #define PSK                         "simple_psk"
21 #define PSK_IDENTITY                "psk_indentity"
22 #define PSK_HINT                    "psk_hint"
23 #define SERVER_PORT                 4433
24 #define WRONG_SERVER_PORT           4434
25 
26 /* Number of DTLS sessions to apply to DTLS server. */
27 #define NUM_SERVER_SESSIONS         2
28 
29 
30 /* Define the ThreadX and NetX object control blocks...  */
31 
32 static TX_THREAD                thread_0;
33 static TX_THREAD                thread_1;
34 static NX_PACKET_POOL           pool_0;
35 static NX_IP                    ip_0;
36 #ifdef FEATURE_NX_IPV6
37 static NXD_ADDRESS             address_0;
38 #endif /* FEATURE_NX_IPV6 */
39 static UINT                     error_counter;
40 
41 static NX_UDP_SOCKET            client_socket_0;
42 static NX_SECURE_DTLS_SESSION   dtls_client_session_0;
43 static NX_SECURE_DTLS_SERVER    dtls_server_0;
44 static NX_SECURE_X509_CERT      client_trusted_ca;
45 static NX_SECURE_X509_CERT      server_local_certificate;
46 extern const NX_SECURE_TLS_CRYPTO
47                                 nx_crypto_tls_ciphers;
48 
49 static ULONG                    pool_0_memory[PACKET_POOL_SIZE / sizeof(ULONG)];
50 static ULONG                    thread_0_stack[THREAD_STACK_SIZE / sizeof(ULONG)];
51 static ULONG                    thread_1_stack[THREAD_STACK_SIZE / sizeof(ULONG)];
52 static ULONG                    ip_0_stack[THREAD_STACK_SIZE / sizeof(ULONG)];
53 static ULONG                    arp_cache[ARP_CACHE_SIZE];
54 static UCHAR                    client_metadata[METADATA_SIZE];
55 static UCHAR                    server_metadata[METADATA_SIZE * NUM_SERVER_SESSIONS];
56 static UCHAR                    client_cert_buffer[CERT_BUFFER_SIZE];
57 
58 static UCHAR                    request_buffer[BUFFER_SIZE];
59 static UCHAR                    response_buffer[BUFFER_SIZE];
60 static UCHAR                    tls_packet_buffer[2][4000 * NUM_SERVER_SESSIONS];
61 
62 /* Session buffer for DTLS server. Must be equal to the size of NX_SECURE_DTLS_SESSION times the
63    number of desired DTLS sessions. */
64 static UCHAR                    server_session_buffer[sizeof(NX_SECURE_DTLS_SESSION) * NUM_SERVER_SESSIONS];
65 
66 /* Define thread prototypes.  */
67 
68 static VOID    ntest_0_entry(ULONG thread_input);
69 static VOID    ntest_1_entry(ULONG thread_input);
70 extern VOID    _nx_ram_network_driver_1500(struct NX_IP_DRIVER_STRUCT *driver_req);
71 
72 static TX_SEMAPHORE            semaphore_receive;
73 static TX_SEMAPHORE            semaphore_connect;
74 
75 
76 /* Define what the initial system looks like.  */
77 
78 #define ERROR_COUNTER() __ERROR_COUNTER(__FILE__, __LINE__)
79 
__ERROR_COUNTER(UCHAR * file,UINT line)80 static VOID    __ERROR_COUNTER(UCHAR *file, UINT line)
81 {
82     printf("\nError on line %d in %s\n", line, file);
83     error_counter++;
84 }
85 
86 #ifdef CTEST
87 void test_application_define(void *first_unused_memory);
test_application_define(void * first_unused_memory)88 void test_application_define(void *first_unused_memory)
89 #else
90 VOID    nx_secure_dtls_basic_test_application_define(void *first_unused_memory)
91 #endif
92 {
93 UINT     status;
94 CHAR    *pointer;
95 
96 
97     error_counter = 0;
98 
99 
100     /* Setup the working pointer.  */
101     pointer =  (CHAR *) first_unused_memory;
102 
103     /* Create the server thread.  */
104     tx_thread_create(&thread_0, "thread 0", ntest_0_entry, 0,
105                      thread_0_stack, sizeof(thread_0_stack),
106                      7, 7, TX_NO_TIME_SLICE, TX_AUTO_START);
107 
108     /* Create the client thread.  */
109     tx_thread_create(&thread_1, "thread 1", ntest_1_entry, 0,
110                      thread_1_stack, sizeof(thread_1_stack),
111                      8, 8, TX_NO_TIME_SLICE, TX_AUTO_START);
112 
113     tx_semaphore_create(&semaphore_receive, "semaphore receive", 0);
114     tx_semaphore_create(&semaphore_connect, "semaphore connect", 0);
115 
116     /* Initialize the NetX system.  */
117     nx_system_initialize();
118 
119     /* Create a packet pool.  */
120     status =  nx_packet_pool_create(&pool_0, "NetX Main Packet Pool", PACKET_SIZE,
121                                     pool_0_memory, PACKET_POOL_SIZE);
122     if (status)
123     {
124         ERROR_COUNTER();
125     }
126 
127     /* Create an IP instance.  */
128     status = nx_ip_create(&ip_0, "NetX IP Instance 0", IP_ADDRESS(1, 2, 3, 4), 0xFFFFFF00UL,
129                           &pool_0, _nx_ram_network_driver_1500,
130                           ip_0_stack, sizeof(ip_0_stack), 1);
131     if (status)
132     {
133         ERROR_COUNTER();
134     }
135 
136     /* Enable ARP and supply ARP cache memory for IP Instance 0.  */
137     status =  nx_arp_enable(&ip_0, (VOID *)arp_cache, sizeof(arp_cache));
138     if (status)
139     {
140         ERROR_COUNTER();
141     }
142 
143     /* Enable UDP traffic.  */
144     status =  nx_udp_enable(&ip_0);
145     if (status)
146     {
147         ERROR_COUNTER();
148     }
149 
150     nx_secure_tls_initialize();
151     nx_secure_dtls_initialize();
152 
153 #ifdef FEATURE_NX_IPV6
154     /* Enable IPv6 traffic.  */
155     status = nxd_ipv6_enable(&ip_0);
156     if (status)
157     {
158         ERROR_COUNTER();
159     }
160 
161     /* Enable ICMP processing.  */
162     status = nxd_icmp_enable(&ip_0);
163     if (status)
164     {
165         ERROR_COUNTER();
166     }
167 
168 
169     /* Set address with global address. */
170     address_0.nxd_ip_version = NX_IP_VERSION_V6;
171     address_0.nxd_ip_address.v6[0] = 0x20010000;
172     address_0.nxd_ip_address.v6[1] = 0x00000000;
173     address_0.nxd_ip_address.v6[2] = 0x00000000;
174     address_0.nxd_ip_address.v6[3] = 0x00000002;
175 
176     status = nxd_ipv6_address_set(&ip_0, 0, &address_0, 64, NX_NULL);
177     if (status)
178     {
179         ERROR_COUNTER();
180     }
181 #endif /* FEATURE_NX_IPV6 */
182 }
183 
client_dtls_setup(NX_SECURE_DTLS_SESSION * dtls_session_ptr)184 static VOID client_dtls_setup(NX_SECURE_DTLS_SESSION *dtls_session_ptr)
185 {
186 UINT status;
187 
188     status = nx_secure_dtls_session_create(dtls_session_ptr,
189                                            &nx_crypto_tls_ciphers,
190                                            client_metadata,
191                                            sizeof(client_metadata),
192                                            tls_packet_buffer[0], sizeof(tls_packet_buffer[0]),
193                                            1, client_cert_buffer, sizeof(client_cert_buffer));
194     if (status)
195     {
196         ERROR_COUNTER();
197     }
198 
199     status = nx_secure_x509_certificate_initialize(&client_trusted_ca,
200                                                    test_ca_cert_der,
201                                                    test_ca_cert_der_len, NX_NULL, 0, NULL, 0, NX_SECURE_X509_KEY_TYPE_NONE);
202     if (status)
203     {
204         ERROR_COUNTER();
205     }
206 
207     status = nx_secure_dtls_session_trusted_certificate_add(dtls_session_ptr, &client_trusted_ca, 1);
208     if (status)
209     {
210         ERROR_COUNTER();
211     }
212 
213 
214 
215 #if defined(NX_SECURE_ENABLE_PSK_CIPHERSUITES) || defined(NX_SECURE_ENABLE_ECJPAKE_CIPHERSUITE)
216     /* For PSK ciphersuites, add a PSK and identity hint.  */
217     nx_secure_dtls_psk_add(dtls_session_ptr, PSK, strlen(PSK),
218                          PSK_IDENTITY, strlen(PSK_IDENTITY), PSK_HINT, strlen(PSK_HINT));
219 #endif
220 }
221 
222 
223 /* Notification flags for DTLS server connect/receive. */
224 static UINT server_connect_notify_flag = NX_FALSE;
225 static UINT server_receive_notify_flag = NX_FALSE;
226 
227 static NX_SECURE_DTLS_SESSION *connect_session;
228 static NX_SECURE_DTLS_SESSION *receive_session;
229 
230 /* Connect notify callback for DTLS server - notifies the application thread that
231    a DTLS connection is ready to kickoff a handshake. */
server_connect_notify(NX_SECURE_DTLS_SESSION * dtls_session,NXD_ADDRESS * ip_address,UINT port)232 static UINT server_connect_notify(NX_SECURE_DTLS_SESSION *dtls_session, NXD_ADDRESS *ip_address, UINT port)
233 {
234     /* Drop connections if one is in progress. Better way would be to have
235      * an array of pointers to DTLS sessions and check the port/IP address
236      * to see if it's an existing connection. Application thread then loops
237      * through array servicing each session.
238      */
239     if (server_connect_notify_flag == NX_FALSE)
240     {
241         server_connect_notify_flag = NX_TRUE;
242         connect_session = dtls_session;
243         tx_semaphore_put(&semaphore_connect);
244     }
245 
246     return(NX_SUCCESS);
247 }
248 
249 /* Receive notify callback for DTLS server - notifies the application thread that
250    we have received a DTLS record over an established DTLS session. */
server_receive_notify(NX_SECURE_DTLS_SESSION * dtls_session)251 static UINT server_receive_notify(NX_SECURE_DTLS_SESSION *dtls_session)
252 {
253 
254     /* Drop records if more come in while processing one. Better would be to
255        service each session in a queue. */
256     if (server_receive_notify_flag == NX_FALSE)
257     {
258         server_receive_notify_flag = NX_TRUE;
259         receive_session = dtls_session;
260         tx_semaphore_put(&semaphore_receive);
261     }
262 
263     return(NX_SUCCESS);
264 }
265 
266 
server_dtls_setup(NX_SECURE_DTLS_SERVER * dtls_server_ptr)267 static VOID server_dtls_setup(NX_SECURE_DTLS_SERVER *dtls_server_ptr)
268 {
269 UINT status;
270 UINT i;
271 
272     status = nx_secure_dtls_server_create(dtls_server_ptr, &ip_0, SERVER_PORT, NX_IP_PERIODIC_RATE,
273                                           server_session_buffer, sizeof(server_session_buffer),
274                                           &nx_crypto_tls_ciphers, server_metadata, sizeof(server_metadata),
275                                           tls_packet_buffer[1], sizeof(tls_packet_buffer[1]),
276                                           server_connect_notify, server_receive_notify);
277     if (status)
278     {
279         ERROR_COUNTER();
280     }
281 
282     memset(&server_local_certificate, 0, sizeof(server_local_certificate));
283     status = nx_secure_x509_certificate_initialize(&server_local_certificate,
284                                                    test_device_cert_der, test_device_cert_der_len,
285                                                    NX_NULL, 0, test_device_cert_key_der,
286                                                    test_device_cert_key_der_len, NX_SECURE_X509_KEY_TYPE_RSA_PKCS1_DER);
287     if (status)
288     {
289         ERROR_COUNTER();
290     }
291 
292     status = nx_secure_dtls_server_local_certificate_add(dtls_server_ptr, &server_local_certificate, 1);
293     if (status)
294     {
295         ERROR_COUNTER();
296     }
297 
298 #if defined(NX_SECURE_ENABLE_PSK_CIPHERSUITES) || defined(NX_SECURE_ENABLE_ECJPAKE_CIPHERSUITE)
299 
300     for (i = 0; i < dtls_server_ptr -> nx_dtls_server_sessions_count; i++)
301     {
302 
303         /* For PSK ciphersuites, add a PSK and identity hint.  */
304         nx_secure_dtls_psk_add(&dtls_server_ptr -> nx_dtls_server_sessions[i], PSK, strlen(PSK),
305                                PSK_IDENTITY, strlen(PSK_IDENTITY), PSK_HINT, strlen(PSK_HINT));
306     }
307 
308 #endif
309 }
310 
ntest_0_entry(ULONG thread_input)311 static void ntest_0_entry(ULONG thread_input)
312 {
313 UINT status;
314 UINT i;
315 ULONG response_length;
316 NX_PACKET *packet_ptr;
317 
318     /* Print out test information banner.  */
319     printf("NetX Secure Test:   DTLS Basic Test....................................");
320 
321     server_dtls_setup(&dtls_server_0);
322 
323     /* Start DTLS session. */
324     status = nx_secure_dtls_server_start(&dtls_server_0);
325     if (status)
326     {
327         printf("Error in starting DTLS server: 0x%02X\n", status);
328         ERROR_COUNTER();
329     }
330 
331     /* Wait for connection attempt. */
332     tx_semaphore_get(&semaphore_connect, NX_IP_PERIODIC_RATE);
333     server_connect_notify_flag = NX_FALSE;
334 
335     status = nx_secure_dtls_server_session_start(connect_session, NX_WAIT_FOREVER);
336 
337     if(status)
338     {
339         printf("Error in establishing DTLS server session: 0x%02X\n", status);
340         ERROR_COUNTER();
341     }
342 
343     /* Wait for records to be received. */
344     tx_semaphore_get(&semaphore_receive, NX_IP_PERIODIC_RATE);
345 
346     status = nx_secure_dtls_session_receive(receive_session,
347                                              &packet_ptr, NX_WAIT_FOREVER);
348     if (status)
349     {
350         printf("Error in DTLS server session receive: 0x%02X\n", status);
351         ERROR_COUNTER();
352     }
353 
354     server_receive_notify_flag = NX_FALSE;
355 
356     nx_packet_data_retrieve(packet_ptr, response_buffer, &response_length);
357     nx_packet_release(packet_ptr);
358 
359     if ((response_length != sizeof(request_buffer)) ||
360         memcmp(request_buffer, response_buffer, response_length))
361     {
362         printf("Received data did not match expected in DTLS Server: %s\n", __FILE__);
363         ERROR_COUNTER();
364     }
365 
366     for(i = 0; i < NUM_SERVER_SESSIONS; ++i)
367     {
368         if(dtls_server_0.nx_dtls_server_sessions[i].nx_secure_dtls_session_in_use)
369         {
370             status = nx_secure_dtls_session_end(&dtls_server_0.nx_dtls_server_sessions[i], NX_IP_PERIODIC_RATE);
371             if(status)
372             {
373                 ERROR_COUNTER();
374             }
375         }
376     }
377 
378 #ifdef FEATURE_NX_IPV6
379 
380     /* Wait for connection attempt. */
381     tx_semaphore_get(&semaphore_connect, NX_IP_PERIODIC_RATE);
382     server_connect_notify_flag = NX_FALSE;
383 
384     /* Start DTLS session. */
385     status = nx_secure_dtls_server_session_start(connect_session, NX_WAIT_FOREVER);
386     if (status)
387     {
388         ERROR_COUNTER();
389     }
390 
391     /* Wait for records to be received. */
392     tx_semaphore_get(&semaphore_receive, NX_IP_PERIODIC_RATE);
393 
394     status = nx_secure_dtls_session_receive(receive_session, &packet_ptr, NX_WAIT_FOREVER);
395     if (status)
396     {
397         ERROR_COUNTER();
398     }
399 
400     server_receive_notify_flag = NX_FALSE;
401 
402     nx_packet_data_retrieve(packet_ptr, response_buffer, &response_length);
403     nx_packet_release(packet_ptr);
404     if ((response_length != sizeof(request_buffer)) ||
405         memcmp(request_buffer, response_buffer, response_length))
406     {
407         ERROR_COUNTER();
408     }
409 
410     for(i = 0; i < NUM_SERVER_SESSIONS; ++i)
411     {
412         if(dtls_server_0.nx_dtls_server_sessions[i].nx_secure_dtls_session_in_use)
413         {
414             status = nx_secure_dtls_session_end(&dtls_server_0.nx_dtls_server_sessions[i], NX_IP_PERIODIC_RATE);
415             if(status)
416             {
417                 ERROR_COUNTER();
418             }
419         }
420 
421     }
422 
423 #endif
424 
425     tx_thread_suspend(&thread_0);
426 
427     /* Shutdown DTLS server. */
428     nx_secure_dtls_server_stop(&dtls_server_0);
429 
430     /* Check packet leak.  */
431     if (pool_0.nx_packet_pool_available != pool_0.nx_packet_pool_total)
432     {
433         ERROR_COUNTER();
434     }
435 
436     /* Delete server. */
437     nx_secure_dtls_server_delete(&dtls_server_0);
438 
439     /* Check invalid packet release count.  */
440     if (pool_0.nx_packet_pool_invalid_releases != 0)
441     {
442         ERROR_COUNTER();
443     }
444 
445     if (error_counter)
446     {
447         printf("ERROR!\n");
448         test_control_return(1);
449     }
450     else
451     {
452         printf("SUCCESS!\n");
453         test_control_return(0);
454     }
455 }
456 
ntest_1_entry(ULONG thread_input)457 static void ntest_1_entry(ULONG thread_input)
458 {
459 UINT i;
460 UINT status;
461 NX_PACKET *packet_ptr;
462 NXD_ADDRESS server_address;
463 
464     for (i = 0; i < sizeof(request_buffer); i++)
465     {
466         request_buffer[i] = i;
467         response_buffer[i] = 0;
468     }
469 
470     server_address.nxd_ip_version = NX_IP_VERSION_V4;
471     server_address.nxd_ip_address.v4 = IP_ADDRESS(127, 0, 0, 1);
472 
473     /* Create UDP socket. */
474     status = nx_udp_socket_create(&ip_0, &client_socket_0, "Client socket", NX_IP_NORMAL,
475                                   NX_DONT_FRAGMENT, 0x80, 5);
476     if (status)
477     {
478         ERROR_COUNTER();
479     }
480 
481     status = nx_udp_socket_bind(&client_socket_0, NX_ANY_PORT, NX_NO_WAIT);
482     if (status)
483     {
484         ERROR_COUNTER();
485     }
486 
487     client_dtls_setup(&dtls_client_session_0);
488 
489     /* Start DTLS session. */
490     status = nx_secure_dtls_client_session_start(&dtls_client_session_0, &client_socket_0, &server_address, SERVER_PORT, NX_WAIT_FOREVER);
491     if (status)
492     {
493         ERROR_COUNTER();
494     }
495 
496     /* Prepare packet to send. */
497     status = nx_packet_allocate(&pool_0, &packet_ptr, NX_UDP_PACKET, NX_NO_WAIT);
498     if (status)
499     {
500         ERROR_COUNTER();
501     }
502 
503     packet_ptr -> nx_packet_prepend_ptr += NX_SECURE_DTLS_RECORD_HEADER_SIZE;
504     packet_ptr -> nx_packet_append_ptr = packet_ptr -> nx_packet_prepend_ptr;
505 
506     status = nx_packet_data_append(packet_ptr, request_buffer, sizeof(request_buffer),
507                                    &pool_0, NX_NO_WAIT);
508     if (status)
509     {
510         ERROR_COUNTER();
511     }
512 
513     /* Test send with wrong port. */
514     status = nx_secure_dtls_session_send(&dtls_client_session_0, packet_ptr,
515         &server_address, WRONG_SERVER_PORT);
516     if (!status)
517     {
518         ERROR_COUNTER();
519     }
520 
521     /* Test send with wrong IP. */
522     server_address.nxd_ip_address.v4 = IP_ADDRESS(1, 0, 0, 1);
523     status = nx_secure_dtls_session_send(&dtls_client_session_0, packet_ptr,
524         &server_address, SERVER_PORT);
525     if (!status)
526     {
527         ERROR_COUNTER();
528     }
529 
530     /* Test send with wrong IP version. */
531     server_address.nxd_ip_version = NX_IP_VERSION_V6;
532     status = nx_secure_dtls_session_send(&dtls_client_session_0, packet_ptr,
533         &server_address, SERVER_PORT);
534     if (!status)
535     {
536         ERROR_COUNTER();
537     }
538     server_address.nxd_ip_version = NX_IP_VERSION_V4;
539     server_address.nxd_ip_address.v4 = IP_ADDRESS(127, 0, 0, 1);
540 
541     /* Send the packet. */
542     status = nx_secure_dtls_session_send(&dtls_client_session_0, packet_ptr,
543                                         &server_address, SERVER_PORT);
544     if (status)
545     {
546         ERROR_COUNTER();
547     }
548 
549     /* Prepare packet to send. */
550     status = nx_packet_allocate(&pool_0, &packet_ptr, NX_UDP_PACKET, NX_NO_WAIT);
551     if (status)
552     {
553         ERROR_COUNTER();
554     }
555 
556     packet_ptr->nx_packet_prepend_ptr += NX_SECURE_DTLS_RECORD_HEADER_SIZE;
557     packet_ptr->nx_packet_append_ptr = packet_ptr->nx_packet_prepend_ptr;
558 
559     status = nx_packet_data_append(packet_ptr, request_buffer, sizeof(request_buffer),
560                                    &pool_0, NX_NO_WAIT);
561     if (status)
562     {
563         ERROR_COUNTER();
564     }
565 
566     /* Test 64-bit sequence number overflow. */
567     dtls_client_session_0.nx_secure_dtls_tls_session.nx_secure_tls_local_sequence_number[0] = 0xFFFFFFFF;
568     dtls_client_session_0.nx_secure_dtls_tls_session.nx_secure_tls_local_sequence_number[1] = 0xFFFFFFFF;
569 
570     status = nx_secure_dtls_session_send(&dtls_client_session_0, packet_ptr,
571                                          &server_address, SERVER_PORT);
572     if (status != NX_NOT_SUCCESSFUL)
573     {
574         ERROR_COUNTER();
575     }
576 
577     nx_packet_release(packet_ptr);
578 
579 
580     status = nx_secure_dtls_session_end(&dtls_client_session_0, NX_IP_PERIODIC_RATE);
581     if(status)
582     {
583         ERROR_COUNTER();
584     }
585 
586     nx_secure_dtls_session_delete(&dtls_client_session_0);
587 
588 #ifdef FEATURE_NX_IPV6
589 
590     server_address.nxd_ip_version = NX_IP_VERSION_V6;
591     server_address.nxd_ip_address.v6[0] = 0;
592     server_address.nxd_ip_address.v6[1] = 0;
593     server_address.nxd_ip_address.v6[2] = 0;
594     server_address.nxd_ip_address.v6[3] = 1;
595 
596     client_dtls_setup(&dtls_client_session_0);
597 
598     /* Start DTLS session. */
599     status = nx_secure_dtls_client_session_start(&dtls_client_session_0, &client_socket_0, &server_address, SERVER_PORT, NX_WAIT_FOREVER);
600     if (status)
601     {
602         ERROR_COUNTER();
603     }
604 
605     /* Prepare packet to send. */
606     status = nx_packet_allocate(&pool_0, &packet_ptr, NX_UDP_PACKET, NX_NO_WAIT);
607     if (status)
608     {
609         ERROR_COUNTER();
610     }
611 
612     packet_ptr->nx_packet_prepend_ptr += NX_SECURE_DTLS_RECORD_HEADER_SIZE;
613     packet_ptr->nx_packet_append_ptr = packet_ptr->nx_packet_prepend_ptr;
614 
615     status = nx_packet_data_append(packet_ptr, request_buffer, sizeof(request_buffer), &pool_0, NX_NO_WAIT);
616     if (status)
617     {
618         ERROR_COUNTER();
619     }
620 
621 
622     /* Test send with wrong IP. */
623     server_address.nxd_ip_address.v6[3] = 2;
624     status = nx_secure_dtls_session_send(&dtls_client_session_0, packet_ptr,
625         &server_address, SERVER_PORT);
626     if (!status)
627     {
628         ERROR_COUNTER();
629     }
630 
631     server_address.nxd_ip_address.v6[2] = 2;
632     status = nx_secure_dtls_session_send(&dtls_client_session_0, packet_ptr,
633         &server_address, SERVER_PORT);
634     if (!status)
635     {
636         ERROR_COUNTER();
637     }
638 
639     server_address.nxd_ip_address.v6[1] = 2;
640     status = nx_secure_dtls_session_send(&dtls_client_session_0, packet_ptr,
641         &server_address, SERVER_PORT);
642     if (!status)
643     {
644         ERROR_COUNTER();
645     }
646 
647     server_address.nxd_ip_address.v6[0] = 2;
648     status = nx_secure_dtls_session_send(&dtls_client_session_0, packet_ptr,
649         &server_address, SERVER_PORT);
650     if (!status)
651     {
652         ERROR_COUNTER();
653     }
654     server_address.nxd_ip_version = NX_IP_VERSION_V6;
655     server_address.nxd_ip_address.v6[0] = 0;
656     server_address.nxd_ip_address.v6[1] = 0;
657     server_address.nxd_ip_address.v6[2] = 0;
658     server_address.nxd_ip_address.v6[3] = 1;
659 
660     /* Send the packet. */
661     status = nx_secure_dtls_session_send(&dtls_client_session_0, packet_ptr,
662         &server_address, SERVER_PORT);
663     if (status)
664     {
665         ERROR_COUNTER();
666     }
667 
668     nx_secure_dtls_session_end(&dtls_client_session_0, NX_NO_WAIT);
669 
670     nx_secure_dtls_session_delete(&dtls_client_session_0);
671 #endif
672 
673     nx_udp_socket_unbind(&client_socket_0);
674 
675     nx_udp_socket_delete(&client_socket_0);
676 
677     tx_thread_resume(&thread_0);
678 }
679 #else
680 #ifdef CTEST
681 void test_application_define(void *first_unused_memory);
test_application_define(void * first_unused_memory)682 void test_application_define(void *first_unused_memory)
683 #else
684 VOID    nx_secure_dtls_basic_test_application_define(void *first_unused_memory)
685 #endif
686 {
687 
688     /* Print out test information banner.  */
689     printf("NetX Secure Test:   DTLS Basic Test....................................N/A\n");
690     test_control_return(3);
691 }
692 #endif
693