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