1 
2 #include    "tx_api.h"
3 #include    "fx_api.h"
4 #include    "nx_api.h"
5 #include    "nx_tcp.h"
6 #include    "nxd_ftp_client.h"
7 #include    "nxd_ftp_server.h"
8 
9 extern void     test_control_return(UINT);
10 
11 #if !defined(NX_DISABLE_IPV4)
12 
13 #define     DEMO_STACK_SIZE         4096
14 
15 /* Define the ThreadX, NetX, and FileX object control blocks...  */
16 static TX_THREAD               server_thread;
17 static TX_THREAD               client_thread;
18 static NX_PACKET_POOL          server_pool;
19 static NX_IP                   server_ip;
20 static NX_PACKET_POOL          client_pool;
21 static NX_IP                   client_ip;
22 static FX_MEDIA                ram_disk;
23 
24 
25 /* Define the NetX FTP object control blocks.  */
26 static NX_FTP_CLIENT           ftp_client;
27 static NX_FTP_SERVER           ftp_server;
28 
29 /* Define the counters used in the demo application...  */
30 static ULONG                   error_counter = 0;
31 static UINT                    test_done = NX_FALSE;
32 
33 /* Define the memory area for the FileX RAM disk.  */
34 static UCHAR                   ram_disk_memory[32000];
35 static UCHAR                   ram_disk_sector_cache[512];
36 
37 
38 #define FTP_SERVER_ADDRESS  IP_ADDRESS(1,2,3,4)
39 #define FTP_CLIENT_ADDRESS  IP_ADDRESS(1,2,3,5)
40 
41 extern UINT  _fx_media_format(FX_MEDIA *media_ptr, VOID (*driver)(FX_MEDIA *media), VOID *driver_info_ptr, UCHAR *memory_ptr, UINT memory_size,
42                         CHAR *volume_name, UINT number_of_fats, UINT directory_entries, UINT hidden_sectors,
43                         ULONG total_sectors, UINT bytes_per_sector, UINT sectors_per_cluster,
44                         UINT heads, UINT sectors_per_track);
45 
46 /* Define the FileX and NetX driver entry functions.  */
47 extern void     _fx_ram_driver(FX_MEDIA *media_ptr);
48 extern void     _nx_ram_network_driver_512(NX_IP_DRIVER *driver_req_ptr);
49 
50 static void    client_thread_entry(ULONG thread_input);
51 static void    thread_server_entry(ULONG thread_input);
52 
53 
54 /* Define server login/logout functions.  These are stubs for functions that would
55    validate a client login request.   */
56 static UINT    server_login(struct NX_FTP_SERVER_STRUCT *ftp_server_ptr, ULONG client_ip_address, UINT client_port, CHAR *name, CHAR *password, CHAR *extra_info);
57 static UINT    server_logout(struct NX_FTP_SERVER_STRUCT *ftp_server_ptr, ULONG client_ip_address, UINT client_port, CHAR *name, CHAR *password, CHAR *extra_info);
58 extern VOID  _nx_ftp_server_command_present(NX_TCP_SOCKET *control_socket_ptr);
59 
60 #ifdef CTEST
test_application_define(void * first_unused_memory)61 VOID test_application_define(void *first_unused_memory)
62 #else
63 void    netx_ftp_server_abnormal_packet_test_application_define(void *first_unused_memory)
64 #endif
65 {
66 
67 UINT    status;
68 UCHAR   *pointer;
69 
70 
71     /* Setup the working pointer.  */
72     pointer =  (UCHAR *) first_unused_memory;
73 
74     /* Create a helper thread for the server. */
75     tx_thread_create(&server_thread, "FTP Server thread", thread_server_entry, 0,
76                      pointer, DEMO_STACK_SIZE,
77                      4, 4, TX_NO_TIME_SLICE, TX_AUTO_START);
78 
79     pointer =  pointer + DEMO_STACK_SIZE;
80 
81     /* Initialize NetX.  */
82     nx_system_initialize();
83 
84     /* Create the packet pool for the FTP Server.  */
85     status = nx_packet_pool_create(&server_pool, "NetX Server Packet Pool", 512, pointer, 8192);
86     pointer = pointer + 8192;
87     if (status)
88         error_counter++;
89 
90     /* Create the IP instance for the FTP Server.  */
91     status = nx_ip_create(&server_ip, "NetX Server IP Instance", FTP_SERVER_ADDRESS, 0xFFFFFF00UL,
92                                         &server_pool, _nx_ram_network_driver_512, pointer, 2048, 1);
93     pointer = pointer + 2048;
94     if (status)
95         error_counter++;
96 
97     /* Enable ARP and supply ARP cache memory for server IP instance.  */
98     status = nx_arp_enable(&server_ip, (void *) pointer, 1024);
99     pointer = pointer + 1024;
100     if (status)
101         error_counter++;
102 
103     /* Enable TCP.  */
104     status = nx_tcp_enable(&server_ip);
105     if (status)
106         error_counter++;
107 
108     /* Create the FTP server.  */
109     status =  nx_ftp_server_create(&ftp_server, "FTP Server Instance", &server_ip, &ram_disk, pointer, DEMO_STACK_SIZE, &server_pool,
110                                    server_login, server_logout);
111     pointer =  pointer + DEMO_STACK_SIZE;
112     if (status)
113         error_counter++;
114 
115     /* Now set up the FTP Client. */
116 
117     /* Create the main FTP client thread.  */
118     status = tx_thread_create(&client_thread, "FTP Client thread ", client_thread_entry, 0,
119             pointer, DEMO_STACK_SIZE,
120             6, 6, TX_NO_TIME_SLICE, TX_AUTO_START);
121     pointer = pointer + DEMO_STACK_SIZE ;
122     if (status)
123         error_counter++;
124 
125     /* Create a packet pool for the FTP client.  */
126     status =  nx_packet_pool_create(&client_pool, "NetX Client Packet Pool", 256, pointer, 8192);
127     pointer =  pointer + 8192;
128     if (status)
129         error_counter++;
130 
131     /* Create an IP instance for the FTP client.  */
132     status = nx_ip_create(&client_ip, "NetX Client IP Instance", FTP_CLIENT_ADDRESS, 0xFFFFFF00UL,
133                                                 &client_pool, _nx_ram_network_driver_512, pointer, 2048, 1);
134     pointer = pointer + 2048;
135     if (status)
136         error_counter++;
137 
138     /* Enable ARP and supply ARP cache memory for the FTP Client IP.  */
139     status = nx_arp_enable(&client_ip, (void *) pointer, 1024);
140     pointer = pointer + 1024;
141     if (status)
142         error_counter++;
143 
144     /* Enable TCP for client IP instance.  */
145     status = nx_tcp_enable(&client_ip);
146     if (status)
147         error_counter++;
148 
149 }
150 
151 static UCHAR valid_buffer[4];
152 static UCHAR *valid_data_ptr = NX_NULL;
tcp_receive_callback(NX_TCP_SOCKET * tcp_socket)153 static VOID tcp_receive_callback(NX_TCP_SOCKET *tcp_socket)
154 {
155 NX_PACKET *packet_ptr = tcp_socket -> nx_tcp_socket_receive_queue_head;
156 UCHAR *buffer_ptr;
157 
158     _nx_ftp_server_command_present(tcp_socket);
159 
160     if (!packet_ptr)
161         return;
162 
163     buffer_ptr = packet_ptr -> nx_packet_prepend_ptr;
164     if (buffer_ptr[20] == 'C')
165     {
166 
167         /* Move payload to the end of the packet.  */
168         memmove(packet_ptr -> nx_packet_data_end - packet_ptr -> nx_packet_length, buffer_ptr, packet_ptr -> nx_packet_length);
169         packet_ptr -> nx_packet_prepend_ptr = packet_ptr -> nx_packet_data_end - packet_ptr -> nx_packet_length;
170         packet_ptr -> nx_packet_append_ptr = packet_ptr -> nx_packet_data_end;
171         valid_data_ptr = packet_ptr -> nx_packet_data_end;
172         memcpy(valid_buffer, valid_data_ptr, sizeof(valid_buffer));
173     }
174 }
175 
176 /* Define the FTP client thread.  */
client_thread_entry(ULONG thread_input)177 void    client_thread_entry(ULONG thread_input)
178 {
179 
180 NX_PACKET   *my_packet;
181 UINT        status;
182 UCHAR       *buffer_ptr;
183 
184     /* Format the RAM disk - the memory for the RAM disk was defined above.  */
185     status = _fx_media_format(&ram_disk,
186                             _fx_ram_driver,                  /* Driver entry                */
187                             ram_disk_memory,                 /* RAM disk memory pointer     */
188                             ram_disk_sector_cache,           /* Media buffer pointer        */
189                             sizeof(ram_disk_sector_cache),   /* Media buffer size           */
190                             "MY_RAM_DISK",                   /* Volume Name                 */
191                             1,                               /* Number of FATs              */
192                             32,                              /* Directory Entries           */
193                             0,                               /* Hidden sectors              */
194                             256,                             /* Total sectors               */
195                             128,                             /* Sector size                 */
196                             1,                               /* Sectors per cluster         */
197                             1,                               /* Heads                       */
198                             1);                              /* Sectors per track           */
199 
200     /* Check status.  */
201     if (status)
202         error_counter++;
203 
204     /* Open the RAM disk.  */
205     status = fx_media_open(&ram_disk, "RAM DISK", _fx_ram_driver, ram_disk_memory, ram_disk_sector_cache, sizeof(ram_disk_sector_cache));
206     if (status)
207         error_counter++;
208 
209     /* Create an FTP client.  */
210     status =  nx_ftp_client_create(&ftp_client, "FTP Client", &client_ip, 2000, &client_pool);
211     if (status)
212         error_counter++;
213 
214     /* Now connect with the NetX FTP (IPv4) server. */
215     status =  nx_ftp_client_connect(&ftp_client, FTP_SERVER_ADDRESS, "name", "password", NX_IP_PERIODIC_RATE);
216     if (status)
217         error_counter++;
218 
219     /* Allocate packet.  */
220     status = _nx_ftp_client_packet_allocate(&ftp_client, &my_packet, NX_IP_PERIODIC_RATE);
221     if (status)
222         error_counter++;
223 
224     ftp_server.nx_ftp_server_client_list[0].nx_ftp_client_request_control_socket.nx_tcp_receive_callback = tcp_receive_callback;
225     buffer_ptr =  my_packet -> nx_packet_prepend_ptr;
226 
227     /* Build "CDUP" message.  */
228     buffer_ptr[0] =  'C';
229     buffer_ptr[1] =  'D';
230     buffer_ptr[2] =  'U';
231     buffer_ptr[3] =  'P';
232     buffer_ptr[4] =  ' ';
233 
234     /* Set the packet length.  */
235     my_packet -> nx_packet_length = 5;
236     my_packet -> nx_packet_append_ptr = my_packet -> nx_packet_prepend_ptr + my_packet -> nx_packet_length;
237 
238     /* Send the packet.  */
239     status =  nx_tcp_socket_send(&(ftp_client.nx_ftp_client_control_socket), my_packet, NX_IP_PERIODIC_RATE);
240     if (status)
241     {
242         nx_packet_release(my_packet);
243         error_counter++;
244         test_done = NX_TRUE;
245         return;
246     }
247 
248     /* Wait for response from the FTP server.  */
249     status =  nx_tcp_socket_receive(&(ftp_client.nx_ftp_client_control_socket), &my_packet, NX_IP_PERIODIC_RATE);
250     if (status)
251     {
252         error_counter++;
253     }
254     else
255     {
256         nx_packet_release(my_packet);
257     }
258 
259     /* Check if the buffer was modified.  */
260     if (valid_data_ptr)
261     {
262         if (memcmp(valid_buffer, valid_data_ptr, sizeof(valid_buffer)) != 0)
263             error_counter++;
264     }
265 
266     /* Set the flag.  */
267     test_done = NX_TRUE;
268 }
269 
270 
271 /* Define the helper FTP server thread.  */
thread_server_entry(ULONG thread_input)272 void    thread_server_entry(ULONG thread_input)
273 {
274 
275 UINT    status;
276 
277     /* Print out test information banner.  */
278     printf("NetX Test:   FTP Server Abnormal Packet Test...........................");
279 
280     /* Check for earlier error. */
281     if(error_counter)
282     {
283         printf("ERROR!\n");
284         test_control_return(1);
285     }
286 
287     /* OK to start the ftp Server.   */
288     status = nx_ftp_server_start(&ftp_server);
289     if (status)
290         error_counter++;
291 
292     /* OK to restart the ftp Server.   */
293     status = nx_ftp_server_stop(&ftp_server);
294     status += nx_ftp_server_start(&ftp_server);
295     if (status)
296         error_counter++;
297 
298     /* Wait for test.  */
299     while(test_done == NX_FALSE)
300         tx_thread_sleep(NX_IP_PERIODIC_RATE);
301 
302     status = nx_ftp_server_delete(&ftp_server);
303     if(status)
304         error_counter++;
305 
306     if(error_counter)
307     {
308         printf("ERROR!\n");
309         test_control_return(1);
310     }
311     else
312     {
313         printf("SUCCESS!\n");
314         test_control_return(0);
315     }
316 }
317 
318 
server_login(struct NX_FTP_SERVER_STRUCT * ftp_server_ptr,ULONG client_ip_address,UINT client_port,CHAR * name,CHAR * password,CHAR * extra_info)319 static UINT  server_login(struct NX_FTP_SERVER_STRUCT *ftp_server_ptr, ULONG client_ip_address, UINT client_port, CHAR *name, CHAR *password, CHAR *extra_info)
320 {
321     /* Always return success.  */
322     return(NX_SUCCESS);
323 }
324 
server_logout(struct NX_FTP_SERVER_STRUCT * ftp_server_ptr,ULONG client_ip_address,UINT client_port,CHAR * name,CHAR * password,CHAR * extra_info)325 static UINT  server_logout(struct NX_FTP_SERVER_STRUCT *ftp_server_ptr, ULONG client_ip_address, UINT client_port, CHAR *name, CHAR *password, CHAR *extra_info)
326 {
327     /* Always return success.  */
328     return(NX_SUCCESS);
329 }
330 #else
331 
332 #ifdef CTEST
test_application_define(void * first_unused_memory)333 VOID test_application_define(void *first_unused_memory)
334 #else
335 void    netx_ftp_server_abnormal_packet_test_application_define(void *first_unused_memory)
336 #endif
337 {
338 
339     /* Print out test information banner.  */
340     printf("NetX Test:   FTP Server Abnormal Packet Test...........................N/A\n");
341 
342     test_control_return(3);
343 }
344 #endif