1 #include "tx_api.h"
2 #include "nx_api.h"
3
4 extern void test_control_return(UINT status);
5
6 #if defined __PRODUCT_NETXDUO__ && (NX_MAX_PHYSICAL_INTERFACES > 1) && !defined NX_DISABLE_IPV4 && !defined NX_MDNS_DISABLE_CLIENT
7 #include "nxd_mdns.h"
8
9 #define DEMO_STACK_SIZE 2048
10 #define BUFFER_SIZE 10240
11 #define LOCAL_FULL_SERVICE_COUNT 16
12 #define PEER_FULL_SERVICE_COUNT 16
13 #define PEER_PARTIAL_SERVICE_COUNT 32
14
15 /* Define the ThreadX and NetX object control blocks... */
16
17 static TX_THREAD ntest_0;
18
19 static NX_PACKET_POOL pool_0;
20 static NX_IP ip_0;
21
22 /* Define the NetX MDNS object control blocks. */
23
24 static NX_MDNS mdns_0;
25 static UCHAR buffer[BUFFER_SIZE];
26 static ULONG current_buffer_size;
27 static UCHAR mdns_data[] = {
28 0x01, 0x00, 0x5e, 0x00, 0x00, 0xfb, 0x00, 0x0c, /* ..^..... */
29 0x29, 0x01, 0xd4, 0x79, 0x08, 0x00, 0x45, 0x00, /* )..y..E. */
30 0x00, 0xd1, 0x00, 0x00, 0x40, 0x00, 0xff, 0x11, /* ....@... */
31 0xd9, 0x0e, 0xc0, 0xa8, 0x00, 0x69, 0xe0, 0x00, /* .....i.. */
32 0x00, 0xfb, 0x14, 0xe9, 0x14, 0xe9, 0x00, 0xbd, /* ........ */
33 0xc6, 0xe4, 0x00, 0x00, 0x84, 0x00, 0x00, 0x00, /* ........ */
34 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x11, 0x53, /* .......S */
35 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x57, 0x65, /* imple We */
36 0x62, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, /* b Server */
37 0x05, 0x5f, 0x68, 0x74, 0x74, 0x70, 0x04, 0x5f, /* ._http._ */
38 0x74, 0x63, 0x70, 0x05, 0x6c, 0x6f, 0x63, 0x61, /* tcp.loca */
39 0x6c, 0x00, 0x00, 0x10, 0x80, 0x01, 0x00, 0x00, /* l....... */
40 0x11, 0x94, 0x00, 0x01, 0x00, 0xc0, 0x1e, 0x00, /* ........ */
41 0x0c, 0x00, 0x01, 0x00, 0x00, 0x11, 0x94, 0x00, /* ........ */
42 0x02, 0xc0, 0x0c, 0xc0, 0x0c, 0x00, 0x21, 0x80, /* ......!. */
43 0x01, 0x00, 0x00, 0x00, 0x78, 0x00, 0x0f, 0x00, /* ....x... */
44 0x00, 0x00, 0x00, 0x00, 0x50, 0x06, 0x75, 0x62, /* ....P.ub */
45 0x75, 0x6e, 0x74, 0x75, 0xc0, 0x29, 0xc0, 0x5b, /* untu.).[ */
46 0x00, 0x1c, 0x80, 0x01, 0x00, 0x00, 0x00, 0x78, /* .......x */
47 0x00, 0x10, 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, /* ........ */
48 0x00, 0x00, 0x02, 0x0c, 0x29, 0xff, 0xfe, 0x01, /* ....)... */
49 0xd4, 0x79, 0xc0, 0x5b, 0x00, 0x01, 0x80, 0x01, /* .y.[.... */
50 0x00, 0x00, 0x00, 0x78, 0x00, 0x04, 0xc0, 0xa8, /* ...x.... */
51 0x00, 0x69, 0x09, 0x5f, 0x73, 0x65, 0x72, 0x76, /* .i._serv */
52 0x69, 0x63, 0x65, 0x73, 0x07, 0x5f, 0x64, 0x6e, /* ices._dn */
53 0x73, 0x2d, 0x73, 0x64, 0x04, 0x5f, 0x75, 0x64, /* s-sd._ud */
54 0x70, 0xc0, 0x29, 0x00, 0x0c, 0x00, 0x01, 0x00, /* p.)..... */
55 0x00, 0x11, 0x94, 0x00, 0x02, 0xc0, 0x1e /* ....... */
56 };
57
58 /* Define the counters used in the test application... */
59
60 static ULONG error_counter;
61 static CHAR *pointer;
62
63 /* Define thread prototypes. */
64
65 static void ntest_0_entry(ULONG thread_input);
66 extern VOID _nx_ram_network_driver_1500(NX_IP_DRIVER *driver_req_ptr);
67 static void check_empty_buffer(UCHAR *buffer_ptr, ULONG buffer_size, UCHAR expect_empty);
68
69 /* Define what the initial system looks like. */
70
71 #ifdef CTEST
test_application_define(void * first_unused_memory)72 VOID test_application_define(void *first_unused_memory)
73 #else
74 void netx_mdns_interface_test(void *first_unused_memory)
75 #endif
76 {
77
78 UINT status;
79
80 /* Setup the working pointer. */
81 pointer = (CHAR *) first_unused_memory;
82 error_counter = 0;
83
84 /* Initialize the NetX system. */
85 nx_system_initialize();
86
87 /* Create a packet pool. */
88 status = nx_packet_pool_create(&pool_0, "NetX Main Packet Pool", 512, pointer, 8192);
89 pointer = pointer + 8192;
90
91 if(status)
92 error_counter++;
93
94 /* Create an IP instance. */
95 status = nx_ip_create(&ip_0, "NetX IP Instance 0", IP_ADDRESS(1, 2, 3, 4), 0xFFFFFF00UL, &pool_0,
96 _nx_ram_network_driver_1500, pointer, 2048, 1);
97 pointer = pointer + 2048;
98
99 status += nx_ip_interface_attach(&ip_0, "Second Interface", IP_ADDRESS(2, 2, 3, 4), 0xFFFFFF00UL, _nx_ram_network_driver_1500);
100
101 /* Check for IP create errors. */
102 if (status)
103 error_counter++;
104
105 /* Enable ARP and supply ARP cache memory for IP Instance 0. */
106 status = nx_arp_enable(&ip_0, (void *) pointer, 1024);
107 pointer = pointer + 1024;
108
109 if(status)
110 error_counter++;
111
112 /* Enable UDP processing for both IP instances. */
113 status = nx_udp_enable(&ip_0);
114
115 /* Check UDP enable status. */
116 if(status)
117 error_counter++;
118
119 status = nx_igmp_enable(&ip_0);
120
121 /* Check status. */
122 if(status)
123 error_counter++;
124
125 /* Create the test thread. */
126 tx_thread_create(&ntest_0, "thread 0", ntest_0_entry, NX_NULL,
127 pointer, DEMO_STACK_SIZE,
128 3, 3, TX_NO_TIME_SLICE, TX_AUTO_START);
129 pointer = pointer + DEMO_STACK_SIZE;
130 }
131
132 /* Define the test threads. */
133
ntest_0_entry(ULONG thread_input)134 static void ntest_0_entry(ULONG thread_input)
135 {
136 UINT status;
137 ULONG actual_status;
138 NX_PACKET *my_packet;
139
140 printf("NetX Test: MDNS Interface Test.......................................");
141
142 /* Ensure the IP instance has been initialized. */
143 status = nx_ip_status_check(&ip_0, NX_IP_INITIALIZE_DONE, &actual_status, 100);
144
145 /* Check status. */
146 if(status != NX_SUCCESS)
147 {
148 printf("ERROR!\n");
149 test_control_return(1);
150 }
151
152 /* Create mDNS. */
153 current_buffer_size = (BUFFER_SIZE >> 1);
154 status = nx_mdns_create(&mdns_0, &ip_0, &pool_0, 2, pointer, DEMO_STACK_SIZE, "NETX-MDNS",
155 buffer, current_buffer_size, buffer + current_buffer_size, current_buffer_size, NX_NULL);
156 pointer = pointer + DEMO_STACK_SIZE;
157
158 /* Check status. */
159 if(status != NX_SUCCESS)
160 {
161 printf("ERROR!\n");
162 test_control_return(1);
163 }
164
165 /* Enable mDNS. */
166 status = nx_mdns_enable(&mdns_0, 1);
167
168 /* Check status. */
169 if(status != NX_SUCCESS)
170 {
171 printf("ERROR!\n");
172 test_control_return(1);
173 }
174
175 /* Inject mDNS response to primary interface of ip_0. */
176 status = nx_packet_allocate(&pool_0, &my_packet, 16, 100);
177 status += nx_packet_data_append(my_packet, mdns_data + 14, sizeof(mdns_data) - 14, &pool_0, 100);
178 my_packet -> nx_packet_ip_interface = &ip_0.nx_ip_interface[0];
179 _nx_ip_packet_deferred_receive(&ip_0, my_packet);
180
181 /* Check status. */
182 if(status)
183 error_counter++;
184
185 /* Sleep one second to then check whether it is received. */
186 tx_thread_sleep(100);
187 check_empty_buffer(buffer + current_buffer_size, current_buffer_size, NX_TRUE);
188
189 /* Enable secondary interface for ip_0. */
190 nx_mdns_disable(&mdns_0, 1);
191 nx_mdns_enable(&mdns_0, 0);
192
193 /* Inject mDNS response to primary interface of ip_0. */
194 status = nx_packet_allocate(&pool_0, &my_packet, 16, 100);
195 status += nx_packet_data_append(my_packet, mdns_data + 14, sizeof(mdns_data) - 14, &pool_0, 100);
196 my_packet -> nx_packet_ip_interface = &ip_0.nx_ip_interface[0];
197 _nx_ip_packet_deferred_receive(&ip_0, my_packet);
198
199 /* Check status. */
200 if(status)
201 error_counter++;
202
203 /* Sleep one second to then check whether it is received. */
204 tx_thread_sleep(100);
205 check_empty_buffer(buffer + current_buffer_size, current_buffer_size, NX_FALSE);
206
207 /* Determine if the test was successful. */
208 if(error_counter)
209 {
210 printf("ERROR!\n");
211 test_control_return(1);
212 }
213 else
214 {
215 printf("SUCCESS!\n");
216 test_control_return(0);
217 }
218 }
219
check_empty_buffer(UCHAR * buffer_ptr,ULONG buffer_size,UCHAR expect_empty)220 static void check_empty_buffer(UCHAR *buffer_ptr, ULONG buffer_size, UCHAR expect_empty)
221 {
222
223 ULONG *tail, *head;
224
225 tx_mutex_get(&mdns_0.nx_mdns_mutex, TX_WAIT_FOREVER);
226
227 /* Check head. */
228 head = (ULONG*)buffer_ptr;
229 if((*head == (ULONG)(head + 1)) && (expect_empty == NX_FALSE))
230 error_counter++;
231 else if((*head != (ULONG)(head + 1)) && (expect_empty == NX_TRUE))
232 error_counter++;
233
234 /* Check tail. */
235 tail = (ULONG*)buffer_ptr + (buffer_size >> 2) - 1;
236 if((tail == (ULONG*)(*tail)) && (expect_empty == NX_FALSE))
237 error_counter++;
238 else if((tail != (ULONG*)(*tail)) && (expect_empty == NX_TRUE))
239 error_counter++;
240
241 tx_mutex_put(&mdns_0.nx_mdns_mutex);
242 }
243 #else
244 #ifdef CTEST
test_application_define(void * first_unused_memory)245 VOID test_application_define(void *first_unused_memory)
246 #else
247 void netx_mdns_interface_test(void *first_unused_memory)
248 #endif
249 {
250 printf("NetX Test: MDNS Interface Test.......................................N/A\n");
251 test_control_return(3);
252 }
253 #endif
254