source: network-demos/netdemo/test.c @ a9d2986

4.11network-demos-4-10-branchnetwork-demos-4-8-branchnetwork-demos-4-9-branch
Last change on this file since a9d2986 was a9d2986, checked in by Joel Sherrill <joel.sherrill@…>, on 06/21/07 at 18:26:18

2007-06-21 Joel Sherrill <joel.sherrill@…>

  • test.c: More warnings removed.
  • Property mode set to 100644
File size: 8.2 KB
Line 
1/*
2 * Test RTEMS 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 <string.h>
20#include <errno.h>
21#include <unistd.h>
22#include <rtems.h>
23#include <rtems/rtems_bsdnet.h>
24#include <rtems/error.h>
25#include <sys/types.h>
26#include <sys/socket.h>
27#include <netinet/in.h>
28
29#define NSERVER         2
30#define BASE_PORT       24742
31
32#define DATA_SINK_HOST  ((128 << 24) | (233 << 16) | (14 << 8) | 60)
33
34void showbroad(int s)
35{
36        int opt;
37        socklen_t optlen = sizeof opt;
38
39        if (getsockopt (s, SOL_SOCKET, SO_BROADCAST, &opt, &optlen) < 0)
40                printf ("getsockopt failed: %s\n", strerror (errno));
41        printf ("Opt:%d    Optlen:%ld\n", opt, (long)optlen);
42}
43
44static
45void
46showStatistics (void)
47{
48        rtems_bsdnet_show_inet_routes ();
49        rtems_bsdnet_show_mbuf_stats ();
50        rtems_bsdnet_show_if_stats ();
51        rtems_bsdnet_show_ip_stats ();
52        rtems_bsdnet_show_icmp_stats ();
53        rtems_bsdnet_show_udp_stats ();
54        rtems_bsdnet_show_tcp_stats ();
55}
56
57/*
58 * Stress the transmit queue -- send a large number of UDP packets
59 */
60static void
61transmitUdp (void)
62{
63        int s;
64        int i;
65        int opt;
66        static struct sockaddr_in myAddr, farAddr;
67        static char cbuf[800];
68        static char bigbuf[9000];
69
70        printf ("Create socket.\n");
71        s = socket (AF_INET, SOCK_DGRAM, 0);
72        if (s < 0)
73                rtems_panic ("Can't create socket: %s", strerror (errno));
74        myAddr.sin_family = AF_INET;
75        myAddr.sin_port = htons (1234);
76        myAddr.sin_addr.s_addr = htonl (INADDR_ANY);
77        printf ("Bind socket.\n");
78        if (bind (s, (struct sockaddr *)&myAddr, sizeof myAddr) < 0)
79                rtems_panic ("Can't bind socket: %s", strerror (errno));
80        farAddr.sin_family = AF_INET;
81        farAddr.sin_port = htons (9);   /* The `discard' port */
82#if 1
83        farAddr.sin_addr.s_addr = htonl (0xFFFFFFFF);
84        if (sendto (s, cbuf, sizeof cbuf, 0, (struct sockaddr *)&farAddr, sizeof farAddr) >= 0)
85                printf ("Broadcast succeeded, but should not have!\n");
86showbroad (s);
87        opt = 1;
88        if (setsockopt (s, SOL_SOCKET, SO_BROADCAST, &opt, sizeof opt) < 0)
89                rtems_panic ("Can't set socket broadcast: %s", strerror (errno));
90showbroad (s);
91        for (i = 0 ; i < 5 ; i++) {
92                if (sendto (s, cbuf, sizeof cbuf, 0, (struct sockaddr *)&farAddr, sizeof farAddr) < 0)
93                        rtems_panic ("Can't broadcast: %s", strerror (errno));
94        }
95#endif
96        farAddr.sin_addr.s_addr = htonl (DATA_SINK_HOST);
97#if 1
98        for (i = 0 ; i < 500 ; i++) {
99                if (sendto (s, cbuf, sizeof cbuf, 0, (struct sockaddr *)&farAddr, sizeof farAddr) < 0)
100                        rtems_panic ("Can't send: %s", strerror (errno));
101                if (sendto (s, cbuf, sizeof cbuf, 0, (struct sockaddr *)&farAddr, sizeof farAddr) < 0)
102                        rtems_panic ("Can't send: %s", strerror (errno));
103        }
104#endif
105#if 1
106        for (i = 0 ; i < 2 ; i++) {
107                if (sendto (s, bigbuf, sizeof bigbuf, 0, (struct sockaddr *)&farAddr, sizeof farAddr) < 0)
108                        rtems_panic ("Can't send: %s", strerror (errno));
109                if (sendto (s, bigbuf, sizeof bigbuf, 0, (struct sockaddr *)&farAddr, sizeof farAddr) < 0)
110                        rtems_panic ("Can't send: %s", strerror (errno));
111        }
112#endif
113        close (s);
114}
115       
116/*
117 * Stress the transmit queue -- send a large number of TCP packets
118 */
119static void
120transmitTcp (void)
121{
122        int s;
123        int i;
124        static struct sockaddr_in myAddr, farAddr;
125        static char cbuf[800];
126        static char bigbuf[20000];
127
128        printf ("Create socket.\n");
129        s = socket (AF_INET, SOCK_STREAM, 0);
130        if (s < 0)
131                rtems_panic ("Can't create socket: %s", strerror (errno));
132        myAddr.sin_family = AF_INET;
133        myAddr.sin_port = htons (1234);
134        myAddr.sin_addr.s_addr = htonl (INADDR_ANY);
135        printf ("Bind socket.\n");
136        if (bind (s, (struct sockaddr *)&myAddr, sizeof myAddr) < 0)
137                rtems_panic ("Can't bind socket: %s", strerror (errno));
138        farAddr.sin_family = AF_INET;
139        farAddr.sin_port = htons (9);   /* The `discard' port */
140        farAddr.sin_addr.s_addr = htonl (DATA_SINK_HOST);
141        printf ("Connect socket.\n");
142        if (connect (s, (struct sockaddr *)&farAddr, sizeof farAddr) < 0) {
143                printf ("Can't connect socket: %s\n", strerror (errno));
144                close (s);
145                return;
146        }
147        printf ("Write to socket.\n");
148        for (i = 0 ; i < 500 ; i++) {
149                if (write (s, cbuf, sizeof cbuf) < 0)
150                        rtems_panic ("Can't send: %s", strerror (errno));
151        }
152        for (i = 0 ; i < 2 ; i++) {
153                if (write (s, bigbuf, sizeof bigbuf) < 0)
154                        rtems_panic ("Can't send: %s", strerror (errno));
155        }
156        close (s);
157}
158
159/*
160 * Echo characters back to a telnet session
161 *
162 * With this running on the test machine you can go to
163 * another machine on your network and run:
164 *      telnet test_machine the_port_number_with_which_this_function_was_started
165 * Everything you type should be echoed back.
166 */
167static void
168echoTask (rtems_task_argument fd)
169{
170        char cbuf[512];
171        int n;
172        rtems_status_code sc;
173
174        for (;;) {
175#if 1
176                n = read (fd, cbuf, sizeof cbuf);
177#else
178                n = read (fd, cbuf, 1);
179#endif
180                if (n == 0) {
181                        printf ("EOF\n");
182                        break;
183                }
184                else if (n < 0) {
185                        rtems_panic ("Error receiving message: %s", strerror (errno));
186                }
187                printf ("Received: %d\n", n);
188                if (send (fd, cbuf, n, 0) < 0)
189                        rtems_panic ("Error sending message: %s", strerror (errno));
190                if (cbuf[0] == 'Q')
191                        break;
192        }
193        if (close (fd) < 0)
194                rtems_panic ("Can't close connection: %s", strerror (errno));
195        sc = rtems_task_delete (RTEMS_SELF);
196        rtems_panic ("Task deletion failed: %s", rtems_status_text (sc));
197}
198
199static void
200echoServer (unsigned short port)
201{
202        int s, s1;
203        struct sockaddr_in myAddr, farAddr;
204        socklen_t addrlen;
205        rtems_id tid;
206        rtems_task_priority my_priority;
207        rtems_status_code sc;
208        char c = 'a';
209
210        printf ("Create socket.\n");
211        s = socket (AF_INET, SOCK_STREAM, 0);
212        if (s < 0)
213                rtems_panic ("Can't create socket: %s", strerror (errno));
214        myAddr.sin_family = AF_INET;
215        myAddr.sin_port = htons (port);
216        myAddr.sin_addr.s_addr = INADDR_ANY;
217        memset (myAddr.sin_zero, '\0', sizeof myAddr.sin_zero);
218        printf ("Bind socket.\n");
219        if (bind (s, (struct sockaddr *)&myAddr, sizeof myAddr) < 0)
220                rtems_panic ("Can't bind socket: %s", strerror (errno));
221        printf ("Listen.\n");
222        if (listen (s, 2) < 0)
223                rtems_panic ("Can't listen on socket: %s", strerror (errno));
224        for (;;) {
225                printf ("Accept.\n");
226                addrlen = sizeof farAddr;
227                s1 = accept (s, (struct sockaddr *)&farAddr, &addrlen);
228                if (s1 < 0)
229                        rtems_panic ("Can't accept connection: %s", strerror (errno));
230                else
231                        printf ("ACCEPTED:%lX\n", ntohl (farAddr.sin_addr.s_addr));
232
233                /*
234                 * Start an echo task
235                 */
236                rtems_task_set_priority (RTEMS_SELF, RTEMS_CURRENT_PRIORITY, &my_priority);
237                sc = rtems_task_create (rtems_build_name ('E', 'C', 'H', c),
238                        my_priority,
239                        8*1024,
240                        RTEMS_PREEMPT|RTEMS_NO_TIMESLICE|RTEMS_NO_ASR|RTEMS_INTERRUPT_LEVEL(0),
241                        RTEMS_NO_FLOATING_POINT|RTEMS_LOCAL,
242                        &tid);
243                if (sc != RTEMS_SUCCESSFUL)
244                        rtems_panic ("Can't create echo task; %s\n", rtems_status_text (sc));
245                if (c == 'z')
246                        c = 'a';
247                else
248                        c++;
249                sc = rtems_task_start (tid, echoTask, s1);
250                if (sc != RTEMS_SUCCESSFUL)
251                        rtems_panic ("Can't start echo task; %s\n", rtems_status_text (sc));
252        }
253}
254
255/*
256 * Run an echo server
257 */
258static void
259runEchoServer (rtems_task_argument arg)
260{
261        echoServer (arg);
262        rtems_task_delete (RTEMS_SELF);
263}
264
265/*
266 * Test some socket stuff
267 */
268void
269doSocket (void)
270{
271        int i;
272        rtems_status_code sc;
273        rtems_task_priority my_priority;
274
275#if 1
276        /*
277         * Spawn other servers
278         */
279        rtems_task_set_priority (RTEMS_SELF, RTEMS_CURRENT_PRIORITY, &my_priority);
280        for (i = 0 ; i < NSERVER ; i++) {
281                rtems_id tid;
282                sc = rtems_task_create (rtems_build_name ('S', 'R', 'V', 'A' + i),
283                        my_priority - 1,
284                        8*1024,
285                        RTEMS_PREEMPT|RTEMS_NO_TIMESLICE|RTEMS_NO_ASR|RTEMS_INTERRUPT_LEVEL(0),
286                        RTEMS_NO_FLOATING_POINT|RTEMS_LOCAL,
287                        &tid);
288                if (sc != RTEMS_SUCCESSFUL) {
289                        printf ("Can't create server; %s\n", rtems_status_text (sc));
290                        return;
291                }
292                sc = rtems_task_start (tid, runEchoServer, BASE_PORT + i);
293                if (sc != RTEMS_SUCCESSFUL) {
294                        printf ("Can't start server; %s\n", rtems_status_text (sc));
295                        return;
296                }
297        }
298#endif
299
300        /*
301         * Wait for characters from console terminal
302         */
303        for (;;) {
304                switch (getchar ()) {
305                case '\004':
306                        return;
307
308                case 't':
309                        /*
310                         * Test the transmit queues
311                         */
312                        transmitTcp ();
313                        break;
314
315                case 'u':
316                        /*
317                         * Test the transmit queues
318                         */
319                        transmitUdp ();
320                        break;
321
322                case 's':
323                        showStatistics ();
324                        break;
325                }
326        }
327}
Note: See TracBrowser for help on using the repository browser.