Mercurial > flash_v2
annotate packages/redboot/current/src/net/ping.c @ 156:b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
| author | jlarmour |
|---|---|
| date | Fri, 06 Apr 2001 17:20:13 +0000 |
| parents | e2d866e32dac |
| children | f2545e5de153 |
| rev | line source |
|---|---|
|
150
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
1 //========================================================================== |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
2 // |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
3 // ping.c |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
4 // |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
5 // Network utility - ping |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
6 // |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
7 //========================================================================== |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
8 //####COPYRIGHTBEGIN#### |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
9 // |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
10 // ------------------------------------------- |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
11 // The contents of this file are subject to the Red Hat eCos Public License |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
12 // Version 1.1 (the "License"); you may not use this file except in |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
13 // compliance with the License. You may obtain a copy of the License at |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
14 // http://www.redhat.com/ |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
15 // |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
16 // Software distributed under the License is distributed on an "AS IS" |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
18 // License for the specific language governing rights and limitations under |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
19 // the License. |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
20 // |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
21 // The Original Code is eCos - Embedded Configurable Operating System, |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
22 // released September 30, 1998. |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
23 // |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
24 // The Initial Developer of the Original Code is Red Hat. |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
25 // Portions created by Red Hat are |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
26 // Copyright (C) 1998, 1999, 2000, 2001 Red Hat, Inc. |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
27 // All Rights Reserved. |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
28 // ------------------------------------------- |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
29 // |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
30 //####COPYRIGHTEND#### |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
31 //========================================================================== |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
32 //#####DESCRIPTIONBEGIN#### |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
33 // |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
34 // Author(s): gthomas |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
35 // Contributors: gthomas |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
36 // Date: 2001-01-22 |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
37 // Purpose: |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
38 // Description: |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
39 // |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
40 // This code is part of RedBoot (tm). |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
41 // |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
42 //####DESCRIPTIONEND#### |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
43 // |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
44 //========================================================================== |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
45 |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
46 #include <redboot.h> |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
47 #include <net/net.h> |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
48 |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
49 #ifndef CYGPKG_REDBOOT_NETWORKING |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
50 #error CYGPKG_REDBOOT_NETWORKING required! |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
51 #else |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
52 |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
53 static void do_ping(int argc, char *argv[]); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
54 RedBoot_cmd("ping", |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
55 "Network connectivity test", |
|
154
e2d866e32dac
Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents:
151
diff
changeset
|
56 "[-v] [-n <count>] [-l <length>] [-t <timeout>] [-r <rate>]\n" |
|
e2d866e32dac
Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents:
151
diff
changeset
|
57 " [-i <IP_addr>] -h <IP_addr>", |
|
150
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
58 do_ping |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
59 ); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
60 |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
61 static bool icmp_received; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
62 static icmp_header_t hold_hdr; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
63 |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
64 static void |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
65 handle_icmp(pktbuf_t *pkt, ip_route_t *src_route) |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
66 { |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
67 icmp_header_t *icmp; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
68 |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
69 icmp = pkt->icmp_hdr; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
70 memcpy(&hold_hdr, icmp, sizeof(*icmp)); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
71 icmp_received = true; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
72 } |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
73 |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
74 static void |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
75 do_ping(int argc, char *argv[]) |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
76 { |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
77 struct option_info opts[7]; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
78 long count, timeout, length, rate, start_time, end_time, timer, received, tries; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
79 char *local_ip_addr, *host_ip_addr; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
80 bool local_ip_addr_set, host_ip_addr_set, count_set, |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
81 timeout_set, length_set, rate_set, verbose; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
82 struct sockaddr_in local_addr, host_addr; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
83 ip_addr_t hold_addr; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
84 icmp_header_t *icmp; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
85 pktbuf_t *pkt; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
86 ip_header_t *ip; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
87 unsigned short cksum; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
88 ip_route_t dest_ip; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
89 |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
90 init_opts(&opts[0], 'n', true, OPTION_ARG_TYPE_NUM, |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
91 (void **)&count, (bool *)&count_set, "<count> - number of packets to test"); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
92 init_opts(&opts[1], 't', true, OPTION_ARG_TYPE_NUM, |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
93 (void **)&timeout, (bool *)&timeout_set, "<timeout> - max #ms per packet [rount trip]"); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
94 init_opts(&opts[2], 'i', true, OPTION_ARG_TYPE_STR, |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
95 (void **)&local_ip_addr, (bool *)&local_ip_addr_set, "local IP address"); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
96 init_opts(&opts[3], 'h', true, OPTION_ARG_TYPE_STR, |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
97 (void **)&host_ip_addr, (bool *)&host_ip_addr_set, "host IP address"); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
98 init_opts(&opts[4], 'l', true, OPTION_ARG_TYPE_NUM, |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
99 (void **)&length, (bool *)&length_set, "<length> - size of payload"); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
100 init_opts(&opts[5], 'v', false, OPTION_ARG_TYPE_FLG, |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
101 (void **)&verbose, (bool *)0, "verbose operation"); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
102 init_opts(&opts[6], 'r', true, OPTION_ARG_TYPE_NUM, |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
103 (void **)&rate, (bool *)&rate_set, "<rate> - time between packets"); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
104 if (!scan_opts(argc, argv, 1, opts, 7, (void **)0, 0, "")) { |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
105 printf("PING - Invalid option specified\n"); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
106 return; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
107 } |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
108 // Set defaults; this has to be done _after_ the scan, since it will |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
109 // have destroyed all values not explicitly set. |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
110 if (local_ip_addr_set) { |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
111 if (!inet_aton(local_ip_addr, (in_addr_t *)&local_addr)) { |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
112 printf("PING - Invalid IP address: %s\n", local_ip_addr); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
113 return; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
114 } |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
115 } else { |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
116 memcpy((in_addr_t *)&local_addr, __local_ip_addr, sizeof(__local_ip_addr)); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
117 } |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
118 if (host_ip_addr_set) { |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
119 if (!inet_aton(host_ip_addr, (in_addr_t *)&host_addr)) { |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
120 printf("PING - Invalid IP address: %s\n", host_ip_addr); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
121 return; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
122 } |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
123 if (__arp_lookup((ip_addr_t *)&host_addr.sin_addr, &dest_ip) < 0) { |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
124 printf("PING: Can't find address of server '%s'\n", host_ip_addr); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
125 return; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
126 } |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
127 } else { |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
128 printf("PING - host IP address required\n"); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
129 return; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
130 } |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
131 #define DEFAULT_LENGTH 64 |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
132 #define DEFAULT_COUNT 10 |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
133 #define DEFAULT_TIMEOUT 1000 |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
134 #define DEFAULT_RATE 1000 |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
135 if (!rate_set) { |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
136 rate = DEFAULT_RATE; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
137 } |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
138 if (!length_set) { |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
139 length = DEFAULT_LENGTH; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
140 } |
|
154
e2d866e32dac
Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents:
151
diff
changeset
|
141 if ((length < 64) || (length > 1400)) { |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
154
diff
changeset
|
142 printf("Invalid length specified: %ld\n", length); |
|
154
e2d866e32dac
Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents:
151
diff
changeset
|
143 return; |
|
e2d866e32dac
Merge from eCos master repository on 2001-02-26-23:18:05-GMT
jlarmour
parents:
151
diff
changeset
|
144 } |
|
150
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
145 if (!count_set) { |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
146 count = DEFAULT_COUNT; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
147 } |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
148 if (!timeout_set) { |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
149 timeout = DEFAULT_TIMEOUT; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
150 } |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
151 // Note: two prints here because 'inet_ntoa' returns a static pointer |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
152 printf("Network PING - from %s", |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
153 inet_ntoa((in_addr_t *)&local_addr)); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
154 printf(" to %s\n", |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
155 inet_ntoa((in_addr_t *)&host_addr)); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
156 received = 0; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
157 __icmp_install_listener(handle_icmp); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
158 for (tries = 0; tries < count; tries++) { |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
159 // The network stack uses the global variable '__local_ip_addr' |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
160 memcpy(hold_addr, __local_ip_addr, sizeof(hold_addr)); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
161 memcpy(__local_ip_addr, &local_addr, sizeof(__local_ip_addr)); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
162 // Build 'ping' request |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
163 if ((pkt = __pktbuf_alloc(ETH_MAX_PKTLEN)) == NULL) { |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
164 // Give up if no packets - something is wrong |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
165 break; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
166 } |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
167 |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
168 icmp = pkt->icmp_hdr; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
169 ip = pkt->ip_hdr; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
170 pkt->pkt_bytes = length + sizeof(icmp_header_t); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
171 |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
172 icmp->type = ICMP_TYPE_ECHOREQUEST; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
173 icmp->code = 0; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
174 icmp->checksum = 0; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
175 icmp->seqnum = htons(tries+1); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
176 cksum = __sum((word *)icmp, pkt->pkt_bytes, 0); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
177 icmp->checksum = htons(cksum); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
178 |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
179 memcpy(ip->source, (in_addr_t *)&local_addr, sizeof(ip_addr_t)); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
180 memcpy(ip->destination, (in_addr_t *)&host_addr, sizeof(ip_addr_t)); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
181 ip->protocol = IP_PROTO_ICMP; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
182 ip->length = htons(pkt->pkt_bytes); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
183 |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
184 __ip_send(pkt, IP_PROTO_ICMP, &dest_ip); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
185 __pktbuf_free(pkt); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
186 |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
187 start_time = MS_TICKS(); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
188 timer = start_time + timeout; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
189 icmp_received = false; |
|
151
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
190 while (!icmp_received && (MS_TICKS_DELAY() < timer)) { |
|
150
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
191 __enet_poll(); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
192 } |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
193 end_time = MS_TICKS(); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
194 |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
195 timer = MS_TICKS() + rate; |
|
151
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
196 while (MS_TICKS_DELAY() < timer) { |
|
150
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
197 __enet_poll(); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
198 } |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
199 |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
200 // Clean up |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
201 memcpy(__local_ip_addr, &hold_addr, sizeof(__local_ip_addr)); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
202 |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
203 if (icmp_received) { |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
204 received++; |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
205 if (verbose) { |
|
151
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
206 printf("icmp - seq: %ld, time: %ld (ticks)\n", |
|
150
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
207 ntohs(hold_hdr.seqnum), end_time-start_time); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
208 } |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
209 } |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
210 } |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
211 __icmp_remove_listener(); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
212 // Report |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
213 printf("PING - received %ld of %ld expected\n", received, count); |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
214 } |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
215 |
|
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
diff
changeset
|
216 #endif //CYGPKG_REDBOOT_NETWORKING |
