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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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