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