annotate packages/net/autotest/current/tests/routeping.inl @ 2729:74dbf4c3f2e1 after-copyright-change-20090129

Update all copyright banners to reflect FSF ownership; fix and improve licence text.
author jlarmour
date Thu, 29 Jan 2009 17:47:46 +0000
parents b0b9630950c9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2138
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
1 //==========================================================================
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
2 //
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
3 // autotest/current/tests/routeping.inl
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
4 //
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
5 // Simple pinging test, the server pings me and I ping her.
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
6 //
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
7 //==========================================================================
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
8 // ####ECOSGPLCOPYRIGHTBEGIN####
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
9 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
2138
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
12 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
13 // eCos is free software; you can redistribute it and/or modify it under
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
14 // the terms of the GNU General Public License as published by the Free
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
15 // Software Foundation; either version 2 or (at your option) any later
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
16 // version.
2138
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
17 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
18 // eCos is distributed in the hope that it will be useful, but WITHOUT
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
19 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
21 // for more details.
2138
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
22 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
23 // You should have received a copy of the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
24 // along with eCos; if not, write to the Free Software Foundation, Inc.,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
25 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
2138
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
26 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
27 // As a special exception, if other files instantiate templates or use
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
28 // macros or inline functions from this file, or you compile this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
29 // and link it with other works to produce a work based on this file,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
30 // this file does not by itself cause the resulting work to be covered by
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
31 // the GNU General Public License. However the source code for this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
32 // must still be made available in accordance with section (3) of the GNU
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
33 // General Public License v2.
2138
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
34 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
35 // This exception does not invalidate any other reasons why a work based
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
36 // on this file might be covered by the GNU General Public License.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
37 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
38 // ####ECOSGPLCOPYRIGHTEND####
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
39 // ####BSDALTCOPYRIGHTBEGIN####
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
40 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
41 // Portions of this software may have been derived from FreeBSD, OpenBSD,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
42 // or other sources, and if so are covered by the appropriate copyright
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
43 // and license included herein.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
44 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2138
diff changeset
45 // ####BSDALTCOPYRIGHTEND####
2138
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
46 //==========================================================================
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
47 //#####DESCRIPTIONBEGIN####
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
48 //
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
49 // Author(s): hmt,gthomas
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
50 // Contributors: hmt,gthomas
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
51 // Date: 2000-10-23
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
52 // Purpose:
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
53 // Description:
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
54 //
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
55 //
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
56 //####DESCRIPTIONEND####
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
57 //
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
58 //==========================================================================
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
59
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
60 #include <pkgconf/system.h>
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
61
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
62 #include <cyg/infra/testcase.h> // testing infrastructure
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
63
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
64 #include <pkgconf/net.h>
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
65
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
66 #ifdef CYGBLD_DEVS_ETH_DEVICE_H // Get the device config if it exists
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
67 #include CYGBLD_DEVS_ETH_DEVICE_H // May provide CYGTST_DEVS_ETH_TEST_NET_REALTIME
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
68 #endif
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
69
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
70 #ifdef CYGPKG_NET_TESTS_USE_RT_TEST_HARNESS // do we use the rt test?
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
71 # ifdef CYGTST_DEVS_ETH_TEST_NET_REALTIME // Get the test ancilla if it exists
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
72 # include CYGTST_DEVS_ETH_TEST_NET_REALTIME
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
73 # endif
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
74 #endif
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
75
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
76
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
77 // Fill in the blanks if necessary
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
78 #ifndef TNR_OFF
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
79 # define TNR_OFF()
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
80 #endif
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
81 #ifndef TNR_ON
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
82 # define TNR_ON()
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
83 #endif
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
84 #ifndef TNR_INIT
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
85 # define TNR_INIT()
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
86 #endif
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
87 #ifndef TNR_PRINT_ACTIVITY
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
88 # define TNR_PRINT_ACTIVITY()
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
89 #endif
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
90
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
91 // ------------------------------------------------------------------------
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
92
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
93 #include <errno.h>
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
94 #include <network.h>
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
95
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
96 #include "autohost.inl"
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
97
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
98 // ------------------------------------------------------------------------
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
99
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
100 externC int sscanf( char * /* str */, const char * /* format */, ... );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
101
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
102 // ------------------------------------------------------------------------
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
103
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
104 static int route_add_s( struct sockaddr_in *target,
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
105 struct sockaddr_in *gw,
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
106 int maskbits,
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
107 int metric )
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
108 {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
109 struct ecos_rtentry route;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
110 struct sockaddr_in mask;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
111
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
112 int s;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
113
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
114 memcpy( &mask, gw, sizeof(*gw) );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
115 maskbits--;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
116 mask.sin_addr.s_addr = htonl( (0xfffffffful ^ ((0x80000000ul >> maskbits)-1)) );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
117
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
118 memset( &route, 0, sizeof(route) );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
119
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
120 memcpy( &route.rt_dst , target, sizeof(*target) );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
121 memcpy( &route.rt_gateway, gw , sizeof(*gw) );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
122 memcpy( &route.rt_genmask, &mask , sizeof(mask) );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
123
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
124 route.rt_flags = RTF_UP|RTF_GATEWAY;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
125 route.rt_metric = metric;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
126
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
127 route.rt_dev = NULL;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
128
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
129 diag_printf("INFO:<Route - dst: %s",
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
130 inet_ntoa(((struct sockaddr_in *)&route.rt_dst)->sin_addr));
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
131 diag_printf(", mask: %s",
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
132 inet_ntoa(((struct sockaddr_in *)&route.rt_genmask)->sin_addr));
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
133 diag_printf(", gateway: %s>\n",
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
134 inet_ntoa(((struct sockaddr_in *)&route.rt_gateway)->sin_addr));
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
135
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
136 s = socket( AF_INET, SOCK_DGRAM, 0 );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
137 if (s < 0) {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
138 perror( "socket" );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
139 return false;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
140 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
141 if (ioctl(s, SIOCADDRT, &route)) {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
142 perror("SIOCADDRT");
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
143 close(s);
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
144 return false;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
145 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
146 diag_printf( "PASS:<Route added OK>\n" );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
147 close(s);
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
148 return true;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
149 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
150
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
151
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
152
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
153 int route_add( char *target,
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
154 char *gw,
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
155 int maskbits,
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
156 int metric )
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
157 {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
158 struct sockaddr_in t_s, gw_s;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
159 int ints[4];
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
160
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
161 memset( &t_s, 0, sizeof(t_s) );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
162 memset( &gw_s, 0, sizeof(gw_s) );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
163
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
164 t_s.sin_len = gw_s.sin_len = sizeof(t_s);
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
165 t_s.sin_family = gw_s.sin_family = AF_INET;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
166
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
167 if ( 4 != sscanf( target, "%d.%d.%d.%d", ints, ints+1, ints+2, ints+3 ) )
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
168 CYG_TEST_FAIL( "sscanf of target IP addr" );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
169 else
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
170 t_s.sin_addr.s_addr = htonl(
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
171 (ints[0] << 24) |
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
172 (ints[1] << 16) |
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
173 (ints[2] << 8) |
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
174 (ints[3] ) );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
175
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
176 if ( 4 != sscanf( gw, "%d.%d.%d.%d", ints, ints+1, ints+2, ints+3 ) )
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
177 CYG_TEST_FAIL( "sscanf of target IP addr" );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
178 else
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
179 gw_s.sin_addr.s_addr = htonl(
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
180 (ints[0] << 24) |
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
181 (ints[1] << 16) |
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
182 (ints[2] << 8) |
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
183 (ints[3] ) );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
184
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
185 return route_add_s( &t_s, &gw_s, maskbits, metric );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
186 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
187
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
188 // ------------------------------------------------------------------------
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
189
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
190 #define NUM_PINGS 16
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
191 #define MAX_PACKET 4096
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
192 #define MIN_PACKET 64
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
193 #define MAX_SEND 4000
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
194
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
195 #define PACKET_ADD ((MAX_SEND - MIN_PACKET)/NUM_PINGS)
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
196 #define nPACKET_ADD 1
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
197
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
198 static unsigned char pkt1[MAX_PACKET], pkt2[MAX_PACKET];
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
199
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
200 #define UNIQUEID 0x1234
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
201
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
202 // Compute INET checksum
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
203 int
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
204 inet_cksum(u_short *addr, int len)
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
205 {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
206 register int nleft = len;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
207 register u_short *w = addr;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
208 register u_short answer;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
209 register u_int sum = 0;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
210 u_short odd_byte = 0;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
211
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
212 /*
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
213 * Our algorithm is simple, using a 32 bit accumulator (sum),
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
214 * we add sequential 16 bit words to it, and at the end, fold
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
215 * back all the carry bits from the top 16 bits into the lower
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
216 * 16 bits.
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
217 */
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
218 while( nleft > 1 ) {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
219 sum += *w++;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
220 nleft -= 2;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
221 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
222
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
223 /* mop up an odd byte, if necessary */
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
224 if( nleft == 1 ) {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
225 *(u_char *)(&odd_byte) = *(u_char *)w;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
226 sum += odd_byte;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
227 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
228
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
229 /*
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
230 * add back carry outs from top 16 bits to low 16 bits
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
231 */
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
232 sum = (sum >> 16) + (sum & 0x0000ffff); /* add hi 16 to low 16 */
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
233 sum += (sum >> 16); /* add carry */
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
234 answer = ~sum; /* truncate to 16 bits */
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
235 return (answer);
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
236 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
237
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
238 static int
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
239 errshorts, errinvalids, errbadids, errwronghosts, errsendtos, errrecvfroms;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
240 #define ERRRESET() \
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
241 errshorts=errinvalids=errbadids=errwronghosts=errsendtos=errrecvfroms=0
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
242
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
243 static int
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
244 check_icmp(unsigned char *pkt, int len,
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
245 struct sockaddr_in *from, struct sockaddr_in *to)
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
246 {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
247 cyg_tick_count_t *tp, tv;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
248 struct ip *ip;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
249 struct icmp *icmp;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
250 tv = cyg_current_time();
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
251 ip = (struct ip *)pkt;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
252 if (len < sizeof(*ip))
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
253 if (ip->ip_v != IPVERSION) {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
254 errshorts++;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
255 return 0;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
256 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
257 icmp = (struct icmp *)(pkt + sizeof(*ip));
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
258 len -= (sizeof(*ip) + 8);
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
259 tp = (cyg_tick_count_t *)&icmp->icmp_data;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
260 if (icmp->icmp_type != ICMP_ECHOREPLY) {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
261 errinvalids++;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
262 return 0;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
263 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
264 if (icmp->icmp_id != UNIQUEID) {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
265 errbadids++;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
266 return 0;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
267 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
268 if (from->sin_addr.s_addr != to->sin_addr.s_addr) {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
269 errwronghosts++;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
270 return 0;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
271 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
272 return 1;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
273 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
274
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
275 // expect is
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
276 // 0 - require failure
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
277 // 1 - require success
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
278 // 2 - don't care
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
279
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
280 #define FAILURE_REQUIRED 0
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
281 #define SUCCESS_REQUIRED 1
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
282 #define NOTHING_REQUIRED 2
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
283
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
284 static void
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
285 ping_host(int s, struct sockaddr_in *host, int expect )
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
286 {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
287 struct icmp *icmp = (struct icmp *)pkt1;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
288 int icmp_len = MIN_PACKET;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
289 int seq, ok_recv, bogus_recv;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
290 cyg_tick_count_t *tp;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
291 long *dp;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
292 struct sockaddr_in from;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
293 int i, len, fromlen;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
294
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
295 ERRRESET();
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
296 ok_recv = 0;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
297 bogus_recv = 0;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
298 TNR_OFF();
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
299 diag_printf("INFO:<PING server %s ....>\n", inet_ntoa(host->sin_addr));
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
300 for (seq = 0; seq < NUM_PINGS; seq++, icmp_len += PACKET_ADD ) {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
301 TNR_ON();
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
302 cyg_thread_delay( 47 ); // Half a second...
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
303 // Build ICMP packet
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
304 icmp->icmp_type = ICMP_ECHO;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
305 icmp->icmp_code = 0;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
306 icmp->icmp_cksum = 0;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
307 icmp->icmp_seq = seq;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
308 icmp->icmp_id = 0x1234;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
309 // Set up ping data
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
310 tp = (cyg_tick_count_t *)&icmp->icmp_data;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
311 *tp++ = cyg_current_time();
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
312 dp = (long *)tp;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
313 for (i = sizeof(*tp); i < icmp_len; i += sizeof(*dp)) {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
314 *dp++ = i;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
315 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
316 // Add checksum
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
317 icmp->icmp_cksum = inet_cksum( (u_short *)icmp, icmp_len+8);
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
318 // Send it off
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
319 if (sendto(s, icmp, icmp_len+8, 0, (struct sockaddr *)host, sizeof(*host)) < 0) {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
320 errsendtos++;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
321 continue;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
322 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
323 // Wait for a response
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
324 fromlen = sizeof(from);
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
325 len = recvfrom(s, pkt2, sizeof(pkt2), 0, (struct sockaddr *)&from, &fromlen);
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
326 if (len < 0) {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
327 errrecvfroms++;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
328 icmp_len = MIN_PACKET - PACKET_ADD; // just in case - long routes
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
329 } else {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
330 if ( check_icmp(pkt2, len, &from, host) )
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
331 ok_recv++;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
332 else
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
333 bogus_recv++;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
334 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
335 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
336 TNR_OFF();
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
337 diag_printf("INFO:<Sent %d packets, received %d OK, %d bad>\n", NUM_PINGS, ok_recv, bogus_recv);
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
338 if ( errsendtos + errrecvfroms )
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
339 diag_printf("INFO:<%d sendto errors, %d recvfrom errors>\n", errsendtos, errrecvfroms );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
340
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
341 if ( SUCCESS_REQUIRED == expect ) {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
342 CYG_TEST_CHECK( 0 < ok_recv, "No pings succeeded" );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
343 CYG_TEST_CHECK( 0 == errsendtos, "Sendto failures" );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
344 #ifndef XFAIL
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
345 CYG_TEST_CHECK( NUM_PINGS/2 < ok_recv, "Not enough pings succeeded" );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
346 CYG_TEST_CHECK( NUM_PINGS/2 > bogus_recv, "Too many pings failed" );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
347 #endif
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
348 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
349 if ( FAILURE_REQUIRED == expect ) {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
350 CYG_TEST_CHECK( 0 == ok_recv, "Pings succeeded" );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
351 CYG_TEST_CHECK( bogus_recv + errsendtos + errrecvfroms == NUM_PINGS, "Not enough failures" );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
352 #ifndef XFAIL
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
353 CYG_TEST_CHECK( 0 == bogus_recv, "Some pings got bogus recv" );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
354 #endif
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
355 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
356 CYG_TEST_PASS( SUCCESS_REQUIRED == expect ? "Expected successful ping behaviour" :
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
357 FAILURE_REQUIRED == expect ? "Expected failure ping behaviour" :
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
358 "Non-predicted ping behaviour" );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
359
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
360 TNR_ON();
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
361 return;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
362 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
363
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
364 static void
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
365 ping_test(struct bootp *bp)
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
366 {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
367 struct protoent *p;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
368 struct timeval tv;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
369 struct sockaddr_in host;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
370 int s;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
371
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
372 if ((p = getprotobyname("icmp")) == (struct protoent *)0) {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
373 pexit("getprotobyname");
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
374 return;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
375 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
376 s = socket(AF_INET, SOCK_RAW, p->p_proto);
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
377 if (s < 0) {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
378 pexit("socket");
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
379 return;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
380 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
381 tv.tv_sec = 1;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
382 tv.tv_usec = 0;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
383 setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
384 // Set up host address
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
385 host.sin_family = AF_INET;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
386 host.sin_len = sizeof(host);
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
387 host.sin_addr = bp->bp_siaddr;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
388 host.sin_port = 0;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
389 ping_host(s, &host, SUCCESS_REQUIRED );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
390 // Now try a bogus host
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
391 host.sin_addr.s_addr = htonl(ntohl(host.sin_addr.s_addr) + 32);
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
392 ping_host(s, &host, NOTHING_REQUIRED ); // Success is optional
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
393 close(s);
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
394 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
395
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
396 static void
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
397 station_ping(char *name, int expect)
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
398 {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
399 struct protoent *p;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
400 struct timeval tv;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
401 struct sockaddr_in host;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
402 int s;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
403
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
404 int ints[4];
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
405
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
406 if ((p = getprotobyname("icmp")) == (struct protoent *)0) {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
407 pexit("getprotobyname");
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
408 return;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
409 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
410 s = socket(AF_INET, SOCK_RAW, p->p_proto);
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
411 if (s < 0) {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
412 pexit("socket");
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
413 return;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
414 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
415 tv.tv_sec = 1;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
416 tv.tv_usec = 0;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
417 setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
418 // Set up host address
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
419 host.sin_family = AF_INET;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
420 host.sin_len = sizeof(host);
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
421 host.sin_port = 0;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
422
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
423 if ( 4 != sscanf( name, "%d.%d.%d.%d", ints, ints+1, ints+2, ints+3 ) )
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
424 CYG_TEST_FAIL( "sscanf of host IP addr" );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
425 else {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
426 host.sin_addr.s_addr = htonl(
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
427 (ints[0] << 24) |
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
428 (ints[1] << 16) |
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
429 (ints[2] << 8) |
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
430 (ints[3] ) );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
431
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
432 ping_host(s, &host, expect );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
433
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
434 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
435 close(s);
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
436 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
437
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
438 // ------------------------------------------------------------------------
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
439
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
440 #define STACK_SIZE (CYGNUM_HAL_STACK_SIZE_TYPICAL + 0x10000)
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
441 static char stack[STACK_SIZE];
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
442 static cyg_thread thread_data;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
443 static cyg_handle_t thread_handle;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
444
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
445 static void
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
446 do_ping_tests(struct bootp *bp, int N, int testtime, int filesize)
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
447 {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
448 int i;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
449 char order[256];
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
450 diag_printf( "INFO: telling %s to run %d pings for %d seconds, %d bytes and up\n",
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
451 inet_ntoa(bp->bp_siaddr), N, testtime, filesize );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
452
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
453 // For 2nd and subsequent orders, we vary the ping data size:
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
454 for ( i = 0; i < N; i++ ) {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
455 sprintf( order, "%s %s %d %d", "SLOW_PING",
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
456 inet_ntoa(bp->bp_yiaddr),
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
457 testtime,
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
458 filesize + 100 * i );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
459 autohost_tell( bp, order );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
460 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
461 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
462
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
463 #define TESTTIME (5 * 60) // Seconds
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
464
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
465 #define NUM_SESSIONS 10 // why not?
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
466
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
467 // ------------------------------------------------------------------------
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
468 //
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
469 // The plan is as follows:
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
470 //
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
471 // The host(s) will be set up so as to have additional interfaces as follows:
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
472 //
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
473 // eth0-host -> 10.0.3.1 and maybe others
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
474 // eth1-host -> 10.0.4.1 and maybe others
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
475 // 10.0.5.x should not exist
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
476 //
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
477 // These additional addresses can exist as extra loopback addresses, lo0:0,
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
478 // lo0:1 and so on in a linux box.
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
479 //
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
480 // We want to ping all of the following:
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
481 //
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
482 // eth0-host should always work
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
483 // eth0-host+32 not expected to work
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
484 // eth1-host should always work
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
485 // eth1-host+32 not expected to work
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
486 // www.cygnus.com should always work if default gw is correct
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
487 // 10.0.3.1 should only work if route via eth0-host is added
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
488 // 10.0.3.99 might work if route via eth0-host is added
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
489 // 10.0.4.1 should only work if route via eth0-host is added
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
490 // 10.0.4.99 might work if route via eth0-host is added
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
491 // 10.0.5.1 should never work
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
492 // 10.0.5.99 should never work
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
493 //
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
494 // So we test those places in the following contexts:
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
495 //
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
496 // 1) No special routing added
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
497 // 2) route via eth0-host to 10.0.3.x is added
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
498 // 3) route via eth1-host to 10.0.4.x is added
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
499 // 4) Both routes are added
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
500 //
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
501 // and check for correct operation and correct failure in all cases.
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
502 //
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
503 // Because of the time taken, these are separate test cases which include
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
504 // this INL file after making suitable #defines.
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
505 //
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
506 // All the while, the hosts shall ping us, and when all is going we loop for
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
507 // the rest of the test time.
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
508 //
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
509
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
510 void
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
511 net_test(cyg_addrword_t param)
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
512 {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
513 #ifdef DOHOSTPINGS
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
514 int i;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
515 int numtests;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
516 #endif
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
517 int net3expect = FAILURE_REQUIRED;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
518 int net4expect = FAILURE_REQUIRED;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
519
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
520 cyg_tick_count_t ticks;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
521 CYG_TEST_INIT();
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
522 CYG_TEST_INFO("Start PING routing test");
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
523 init_all_network_interfaces();
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
524
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
525 autohost_init();
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
526
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
527 TNR_INIT();
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
528
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
529 #ifdef ADDROUTETONET_10_0_3_x
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
530 #ifdef CYGHWR_NET_DRIVER_ETH0
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
531 if (eth0_up) {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
532 route_add( "10.0.3.0", inet_ntoa(eth0_bootp_data.bp_siaddr), 24, 1 );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
533 net3expect = SUCCESS_REQUIRED;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
534 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
535 #endif
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
536 #endif // ADDROUTETONET_10_0_3_x
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
537
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
538 #ifdef ADDROUTETONET_10_0_4_x
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
539 #ifdef CYGHWR_NET_DRIVER_ETH1
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
540 if (eth1_up) {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
541 route_add( "10.0.4.0", inet_ntoa(eth1_bootp_data.bp_siaddr), 24, 1 );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
542 net4expect = SUCCESS_REQUIRED;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
543 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
544 #endif
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
545 #endif // ADDROUTETONET_10_0_4_x
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
546
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
547 numtests = NUM_SESSIONS; // The number of pingers started OK
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
548 i = numtests;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
549 #ifdef DOHOSTPINGS
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
550 // Now command the host to do ping to us...
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
551 #ifdef CYGHWR_NET_DRIVER_ETH0
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
552 if (eth0_up) {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
553 do_ping_tests(&eth0_bootp_data, 1, TESTTIME, 64);
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
554 do_ping_tests(&eth0_bootp_data, 1, TESTTIME, 2000);
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
555 i -= 2;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
556 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
557 #endif
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
558 #ifdef CYGHWR_NET_DRIVER_ETH1
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
559 if (eth1_up && i > 0) {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
560 do_ping_tests(&eth1_bootp_data, 1, TESTTIME, 100);
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
561 do_ping_tests(&eth1_bootp_data, 1, TESTTIME, 1800);
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
562 i -= 2;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
563 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
564 #endif
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
565 #endif // DOHOSTPINGS
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
566 numtests -= i; // Adjust to how many we *actually* requested
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
567
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
568 ticks = cyg_current_time() + TESTTIME * 100; // FIXME - assume cS clock.
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
569
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
570 // Let the server run for 5 minutes
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
571 TNR_ON();
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
572
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
573 while (1) {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
574 #ifdef CYGHWR_NET_DRIVER_ETH0
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
575 if (eth0_up)
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
576 ping_test(&eth0_bootp_data);
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
577 if ( ticks < cyg_current_time() ) break;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
578 #endif
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
579 #ifdef CYGHWR_NET_DRIVER_ETH1
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
580 if (eth1_up)
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
581 ping_test(&eth1_bootp_data);
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
582 if ( ticks < cyg_current_time() ) break;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
583 #endif
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
584 #ifdef CYGHWR_NET_DRIVER_ETH0
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
585 if (eth0_up) {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
586 station_ping( "10.0.3.1", net3expect );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
587 if ( ticks < cyg_current_time() ) break;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
588 station_ping( "10.0.3.99", net3expect );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
589 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
590 if ( ticks < cyg_current_time() ) break;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
591 #endif
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
592 #ifdef CYGHWR_NET_DRIVER_ETH1
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
593 if (eth1_up) {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
594 station_ping( "10.0.4.1", net4expect );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
595 if ( ticks < cyg_current_time() ) break;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
596 station_ping( "10.0.4.99", net4expect );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
597 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
598 if ( ticks < cyg_current_time() ) break;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
599 #endif
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
600 station_ping( "10.0.5.1", FAILURE_REQUIRED ); // Not valid
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
601 if ( ticks < cyg_current_time() ) break;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
602 station_ping( "10.0.5.99", FAILURE_REQUIRED ); // Not valid
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
603 if ( ticks < cyg_current_time() ) break;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
604 #ifdef PING_WWW_CYGNUS_COM
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
605 station_ping( "205.180.83.41", NOTHING_REQUIRED ); // www.cygnus.com
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
606 if ( ticks < cyg_current_time() ) break;
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
607 #endif
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
608 };
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
609
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
610 // Additional delay 'cos host may be slower than us - and it has to
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
611 // complete a transfer anyway:
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
612 cyg_thread_delay( 30 *100); // FIXME - assume cS clock.
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
613 TNR_OFF();
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
614
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
615 autohost_end( 0 ); // check for N pass messages from hosts
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
616
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
617 TNR_PRINT_ACTIVITY();
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
618 CYG_TEST_EXIT("Done");
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
619 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
620
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
621 void
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
622 cyg_start(void)
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
623 {
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
624 // Create a main thread, so we can run the scheduler and have time 'pass'
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
625 cyg_thread_create(10, // Priority - just a number
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
626 net_test, // entry
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
627 0, // entry parameter
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
628 "Network test", // Name
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
629 &stack[0], // Stack
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
630 STACK_SIZE, // Size
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
631 &thread_handle, // Handle
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
632 &thread_data // Thread data structure
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
633 );
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
634 cyg_thread_resume(thread_handle); // Start it
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
635 cyg_scheduler_start();
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
636 }
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
637
b0b9630950c9 Add net/autotest
msalter
parents:
diff changeset
638 // EOF routeping.inl