|
1 | 1 | #include "SocketHelpers.h" |
2 | | -#include "lwip/prot/icmp.h" |
3 | | -#include "lwip/inet_chksum.h" |
4 | | -#include "lwip/prot/ip4.h" |
5 | 2 | #include <ICMPSocket.h> |
6 | 3 |
|
7 | 4 | uint8_t* arduino::MbedSocketClass::macAddress(uint8_t* mac) { |
@@ -141,70 +138,17 @@ void arduino::MbedSocketClass::setDNS(IPAddress dns_server1, IPAddress dns_serve |
141 | 138 | _dnsServer2 = SocketAddress(convertedDNSServer2); |
142 | 139 | } |
143 | 140 |
|
144 | | -int arduino::MbedSocketClass::ping(SocketAddress &socketAddress, uint8_t ttl) |
| 141 | +int arduino::MbedSocketClass::ping(SocketAddress &socketAddress, uint8_t ttl, uint32_t timeout) |
145 | 142 | { |
146 | | - const uint32_t timeout = 5000; |
147 | | - |
148 | 143 | /* ttl is not supported by mbed ICMPSocket. Default value used is 255 */ |
149 | 144 | (void)ttl; |
150 | 145 | ICMPSocket s; |
151 | 146 | s.set_timeout(timeout); |
152 | 147 | s.open(getNetwork()); |
153 | | - |
154 | | - struct __attribute__((__packed__)) { |
155 | | - struct icmp_echo_hdr header; |
156 | | - uint8_t data[32]; |
157 | | - } request; |
158 | | - |
159 | | - ICMPH_TYPE_SET(&request.header, ICMP_ECHO); |
160 | | - ICMPH_CODE_SET(&request.header, 0); |
161 | | - request.header.chksum = 0; |
162 | | - request.header.id = 0xAFAF; |
163 | | - request.header.seqno = random(0xffff); |
164 | | - |
165 | | - for (size_t i = 0; i < sizeof(request.data); i++) { |
166 | | - request.data[i] = i; |
167 | | - } |
168 | | - |
169 | | - request.header.chksum = inet_chksum(&request, sizeof(request)); |
170 | | - unsigned long recvTime = 0; |
171 | | - unsigned long sendTime = millis(); |
172 | | - |
173 | | - int res = s.sendto(socketAddress,&request, sizeof(request)); |
174 | | - if(res <= 0){ |
175 | | - return -1; |
176 | | - } |
177 | | - |
178 | | - uint32_t startRec = millis(); |
179 | | - do { |
180 | | - struct __attribute__((__packed__)) { |
181 | | - struct ip_hdr ipHeader; |
182 | | - struct icmp_echo_hdr header; |
183 | | - } response; |
184 | | - |
185 | | - int rxSize = s.recvfrom(&socketAddress, &response, sizeof(response)); |
186 | | - if (rxSize < 0) { |
187 | | - // time out |
188 | | - break; |
189 | | - } |
190 | | - |
191 | | - if (rxSize < sizeof(response)) { |
192 | | - // too short |
193 | | - continue; |
194 | | - } |
195 | | - |
196 | | - if ((response.header.id == request.header.id) && (response.header.seqno == request.header.seqno)) { |
197 | | - recvTime = millis(); |
198 | | - } |
199 | | - } while (recvTime == 0 && (millis() - startRec) < timeout); |
200 | | - |
| 148 | + int response = s.ping(socketAddress, timeout); |
201 | 149 | s.close(); |
202 | 150 |
|
203 | | - if (recvTime == 0) { |
204 | | - return -1; |
205 | | - } else { |
206 | | - return (recvTime - sendTime); |
207 | | - } |
| 151 | + return response; |
208 | 152 | } |
209 | 153 |
|
210 | 154 | arduino::IPAddress arduino::MbedSocketClass::ipAddressFromSocketAddress(SocketAddress socketAddress) { |
|
0 commit comments