source: network-demos/netdemo/test.c @ 0c9330e

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 0c9330e was 0c9330e, checked in by Joel Sherrill <joel.sherrill@…>, on Aug 21, 1998 at 1:22:35 PM

KA9Q -> FreeBSD changes from Eric Norum

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