source: network-demos/netdemo/test.c @ 7c81a8b

4.11netdemos-4-5-branchnetwork-demos-4-10-branchnetwork-demos-4-6-branchnetwork-demos-4-7-branchnetwork-demos-4-8-branchnetwork-demos-4-9-branchrtems-4-5-branch
Last change on this file since 7c81a8b was 7c81a8b, checked in by Joel Sherrill <joel.sherrill@…>, on Aug 12, 1998 at 11:06:16 PM

Cleaned up USE_BOOTP conditional for initialization.

Get info from usercfg.h now.

Added message indicating test is exitting.

  • Property mode set to 100644
File size: 8.2 KB
Line 
1/*
2 * Test KA9Q networking
3 *
4 * This program may be distributed and used for any purpose.
5 * I ask only that you:
6 *      1. Leave this author information intact.
7 *      2. Document any changes you make.
8 *
9 * W. Eric Norum
10 * Saskatchewan Accelerator Laboratory
11 * University of Saskatchewan
12 * Saskatoon, Saskatchewan, CANADA
13 * eric@skatter.usask.ca
14 *
15 * $Id$
16 */
17
18#include <stdio.h>
19#include <unistd.h>
20#include <rtems.h>
21#include <rtems/error.h>
22#include <socket.h>
23#include <sockaddr.h>
24#include <netuser.h>
25#include <rtems_ka9q.h>
26
27#include "../usercfg.h"
28
29/*
30 * Display the contents of several KA9Q tables
31 */
32static void
33show_ka9q_tables (void)
34{
35        printf ("\n****************** MALLOC Statistics ***************\n");
36        malloc_dump ();
37        printf ("\n****************** MBUF Statistics ***************\n");
38        mbufstat ();
39        mbufsizes ();
40        printf ("\n****************** Routing Table ***************\n");
41        rtems_ka9q_execute_command ("route");
42        printf ("\n****************** ARP Table ***************\n");
43        rtems_ka9q_execute_command ("arp");
44        printf ("\n****************** Driver Statistics ***************\n");
45        rtems_ka9q_execute_command ("ifconfig rtems");
46        printf ("\n****************** Ip Statistics ***************\n");
47        rtems_ka9q_execute_command ("ip status");
48        printf ("\n****************** ICMP Statistics ***************\n");
49        rtems_ka9q_execute_command ("icmp status");
50        printf ("\n****************** UDP Statistics ***************\n");
51        rtems_ka9q_execute_command ("udp status");
52        printf ("\n****************** TCP Statistics ***************\n");
53        rtems_ka9q_execute_command ("tcp status");
54}
55
56/*
57 * Stress the transmit queue -- send a large number of UDP packets
58 */
59static void
60transmitUdp (void)
61{
62        int s;
63        int i;
64        static struct sockaddr_in myAddr, farAddr;
65        static char cbuf[800];
66        static char bigbuf[20000];
67
68        printf ("Create socket.\n");
69        s = socket (AF_INET, SOCK_DGRAM, 0);
70        if (s < 0)
71                rtems_panic ("Can't create socket: %s", strerror (errno));
72        myAddr.sin_family = AF_INET;
73        myAddr.sin_port = 1234;
74        myAddr.sin_addr.s_addr = INADDR_ANY;
75        printf ("Bind socket.\n");
76        if (bind (s, (struct sockaddr *)&myAddr, sizeof myAddr) < 0)
77                rtems_panic ("Can't bind socket: %s", strerror (errno));
78        farAddr.sin_family = AF_INET;
79        farAddr.sin_port = 9;   /* The `discard' port */
80        farAddr.sin_addr.s_addr = 0xFFFFFFFF;
81        for (i = 0 ; i < 5 ; i++) {
82                if (sendto (s, cbuf, sizeof cbuf, 0, (struct sockaddr *)&farAddr, sizeof farAddr) < 0)
83                        rtems_panic ("Can't broadcast: %s", strerror (errno));
84        }
85        farAddr.sin_addr.s_addr = aton (DATA_SINK_HOST);
86        for (i = 0 ; i < 500 ; i++) {
87                if (sendto (s, cbuf, sizeof cbuf, 0, (struct sockaddr *)&farAddr, sizeof farAddr) < 0)
88                        rtems_panic ("Can't send: %s", strerror (errno));
89                if (sendto (s, cbuf, sizeof cbuf, 0, (struct sockaddr *)&farAddr, sizeof farAddr) < 0)
90                        rtems_panic ("Can't send: %s", strerror (errno));
91        }
92        for (i = 0 ; i < 2 ; i++) {
93                if (sendto (s, bigbuf, sizeof bigbuf, 0, (struct sockaddr *)&farAddr, sizeof farAddr) < 0)
94                        rtems_panic ("Can't send: %s", strerror (errno));
95                if (sendto (s, bigbuf, sizeof bigbuf, 0, (struct sockaddr *)&farAddr, sizeof farAddr) < 0)
96                        rtems_panic ("Can't send: %s", strerror (errno));
97        }
98        close (s);
99}
100       
101/*
102 * Stress the transmit queue -- send a large number of TCP packets
103 */
104static void
105transmitTcp (void)
106{
107        int s;
108        int i;
109        static struct sockaddr_in myAddr, farAddr;
110        static char cbuf[800];
111        static char bigbuf[20000];
112
113        printf ("Create socket.\n");
114        s = socket (AF_INET, SOCK_STREAM, 0);
115        if (s < 0)
116                rtems_panic ("Can't create socket: %s", strerror (errno));
117        myAddr.sin_family = AF_INET;
118        myAddr.sin_port = 1234;
119        myAddr.sin_addr.s_addr = INADDR_ANY;
120        printf ("Bind socket.\n");
121        if (bind (s, (struct sockaddr *)&myAddr, sizeof myAddr) < 0)
122                rtems_panic ("Can't bind socket: %s", strerror (errno));
123        farAddr.sin_family = AF_INET;
124        farAddr.sin_port = 9;   /* The `discard' port */
125        farAddr.sin_addr.s_addr = aton (DATA_SINK_HOST);
126        if (connect (s, (struct sockaddr *)&farAddr, sizeof farAddr) < 0) {
127                printf ("Can't connect socket: %s\n", strerror (errno));
128                close (s);
129                return;
130        }
131        for (i = 0 ; i < 500 ; i++) {
132                if (write (s, cbuf, sizeof cbuf) < 0)
133                        rtems_panic ("Can't send: %s", strerror (errno));
134        }
135        for (i = 0 ; i < 2 ; i++) {
136                if (write (s, bigbuf, sizeof bigbuf) < 0)
137                        rtems_panic ("Can't send: %s", strerror (errno));
138        }
139        close (s);
140}
141
142/*
143 * Echo characters back to a telnet session
144 *
145 * With this running on the test machine you can go to
146 * another machine on your network and run:
147 *      telnet test_machine the_port_number_with_which_this_function_was_started
148 * Everything you type should be echoed back.
149 */
150static void
151echoTask (rtems_task_argument fd)
152{
153        char cbuf[512];
154        int n;
155        rtems_status_code sc;
156
157  printf( "echoTask on %d\n", fd );
158        for (;;) {
159#if 0
160                n = read (fd, cbuf, sizeof cbuf);
161#else
162                n = read (fd, cbuf, 1);
163#endif
164                if (n == 0) {
165                        printf ("EOF\n");
166                        break;
167                }
168                else if (n < 0) {
169                        rtems_panic ("Error receiving message: %s", strerror (errno));
170                }
171                printf ("Received: %d\n", n);
172                if (send (fd, cbuf, n, 0) < 0)
173                        rtems_panic ("Error sending message: %s", strerror (errno));
174                if (cbuf[0] == '\007')
175                        show_ka9q_tables ();
176                if (cbuf[0] == 'Q')
177                        break;
178        }
179        if (close (fd) < 0)
180                rtems_panic ("Can't close connection: %s", strerror (errno));
181        sc = rtems_task_delete (RTEMS_SELF);
182        rtems_panic ("Task deletion failed: %s", rtems_status_text (sc));
183}
184
185static void
186echoServer (unsigned short port)
187{
188        int s, s1;
189        struct sockaddr_in myAddr, farAddr;
190        int addrlen;
191        rtems_id tid;
192        rtems_task_priority my_priority;
193        rtems_status_code sc;
194        char c = 'a';
195
196        printf ("Create socket.\n");
197        s = socket (AF_INET, SOCK_STREAM, 0);
198        if (s < 0)
199                rtems_panic ("Can't create socket: %s", strerror (errno));
200        myAddr.sin_family = AF_INET;
201        myAddr.sin_port = port;
202        myAddr.sin_addr.s_addr = INADDR_ANY;
203        memset (myAddr.sin_zero, '\0', sizeof myAddr.sin_zero);
204        printf ("Bind socket.\n");
205        if (bind (s, (struct sockaddr *)&myAddr, sizeof myAddr) < 0)
206                rtems_panic ("Can't bind socket: %s", strerror (errno));
207        printf ("Listen.\n");
208        if (listen (s, 2) < 0)
209                rtems_panic ("Can't listen on socket: %s", strerror (errno));
210        for (;;) {
211                printf ("Accept.\n");
212                addrlen = sizeof farAddr;
213                s1 = accept (s, (struct sockaddr *)&farAddr, &addrlen);
214                if (s1 < 0)
215                        rtems_panic ("Can't accept connection: %s", strerror (errno));
216                else
217                        printf ("ACCEPTED:%lX\n", farAddr.sin_addr.s_addr);
218
219                /*
220                 * Start an echo task
221                 */
222                rtems_task_set_priority (RTEMS_SELF, RTEMS_CURRENT_PRIORITY, &my_priority);
223                sc = rtems_task_create (rtems_build_name ('E', 'C', 'H', c),
224                        my_priority,
225                        8*1024,
226                        RTEMS_PREEMPT|RTEMS_NO_TIMESLICE|RTEMS_NO_ASR|RTEMS_INTERRUPT_LEVEL(0),
227                        RTEMS_NO_FLOATING_POINT|RTEMS_LOCAL,
228                        &tid);
229                if (sc != RTEMS_SUCCESSFUL)
230                        rtems_panic ("Can't create echo task; %s\n", rtems_status_text (sc));
231                if (c == 'z')
232                        c = 'a';
233                else
234                        c++;
235                sc = rtems_task_start (tid, echoTask, s1);
236                if (sc != RTEMS_SUCCESSFUL)
237                        rtems_panic ("Can't start echo task; %s\n", rtems_status_text (sc));
238        }
239}
240
241/*
242 * Run an echo server
243 */
244static void
245runEchoServer (rtems_task_argument arg)
246{
247        echoServer (arg);
248        rtems_task_delete (RTEMS_SELF);
249}
250
251/*
252 * Test some socket stuff
253 */
254void
255doSocket (void)
256{
257        int i;
258        rtems_status_code sc;
259        rtems_task_priority my_priority;
260
261        /*
262         * Spawn other servers
263         */
264        rtems_task_set_priority (RTEMS_SELF, RTEMS_CURRENT_PRIORITY, &my_priority);
265        for (i = 0 ; i < NSERVER ; i++) {
266                rtems_id tid;
267                sc = rtems_task_create (rtems_build_name ('S', 'R', 'V', 'A' + i),
268                        my_priority - 1,
269                        8*1024,
270                        RTEMS_PREEMPT|RTEMS_NO_TIMESLICE|RTEMS_NO_ASR|RTEMS_INTERRUPT_LEVEL(0),
271                        RTEMS_NO_FLOATING_POINT|RTEMS_LOCAL,
272                        &tid);
273                if (sc != RTEMS_SUCCESSFUL) {
274                        printf ("Can't create server; %s\n", rtems_status_text (sc));
275                        return;
276                }
277                sc = rtems_task_start (tid, runEchoServer, BASE_PORT + i);
278                if (sc != RTEMS_SUCCESSFUL) {
279                        printf ("Can't start server; %s\n", rtems_status_text (sc));
280                        return;
281                }
282        }
283
284        /*
285         * Wait for characters from console terminal
286         */
287        for (;;) {
288                switch (getchar ()) {
289                case '\004':
290                        printf( "Exiting test\n" );
291                        return;
292
293                case 't':
294                        /*
295                         * Test the transmit queues
296                         */
297                        transmitTcp ();
298                        break;
299
300                case 'u':
301                        /*
302                         * Test the transmit queues
303                         */
304                        transmitUdp ();
305                        break;
306
307                case 's':
308                        /*
309                         * Show what's been accomplished
310                         */
311                        show_ka9q_tables ();
312                        break;
313                }
314        }
315}
Note: See TracBrowser for help on using the repository browser.