Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 54 additions & 13 deletions Ping.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -136,12 +136,12 @@ static err_t ping_send(int s, ip4_addr_t *addr, int size) {

to.sin_len = sizeof(to);
to.sin_family = AF_INET;
inet_addr_from_ipaddr(&to.sin_addr, addr);
inet_addr_from_ip4addr(&to.sin_addr, addr);

if ((err = sendto(s, iecho, ping_size, 0, (struct sockaddr*)&to, sizeof(to)))) {
transmitted++;
}
free(iecho)
free(iecho);
return (err ? ERR_OK : ERR_VAL);
}

Expand Down Expand Up @@ -169,7 +169,7 @@ static void ping_recv(int s) {

/// Get from IP address
ip4_addr_t fromaddr;
inet_addr_to_ipaddr(&fromaddr, &from.sin_addr);
inet_addr_to_ip4addr(&fromaddr, &from.sin_addr);

strcpy(ipa, inet_ntoa(fromaddr));

Expand Down Expand Up @@ -230,28 +230,58 @@ static void stop_action(int i) {

stopped = 1;
}
+/
*/
/*
* Operation functions
*
*/
void ping(const char *name, int count, int interval, int size, int timeout) {

bool ping(const char *name, int count, int interval, int size, int timeout) {
return ping(name, count, interval, size, timeout, NULL);
}

bool ping(const char *name, int count, int interval, int size, int timeout, struct ping_result *result) {
struct addrinfo hints, *target;
int err;
// Resolve name
hostent * target = gethostbyname(name);
IPAddress adr = *target->h_addr_list[0];
if (target->h_length == 0) {
log_i("PING %s\r\n", name);

memset(&hints, 0, sizeof(hints));
hints.ai_socktype = SOCK_STREAM;
hints.ai_family = AF_INET;
if ((err = getaddrinfo(name, NULL, &hints, &target)) != 0) {
log_d("getaddrinfo error %d\r\n", err);
log_i("Cannot resolve %s: Unknown host\r\n", name);
// TODO: error not found target?????
return;
if (result != NULL) {
result->transmitted = 0;
result->received = 0;
result->loss_rate = 0;
result->min_time = 0;
result->mean_time = 0;
result->max_time = 0;
result->var_time = 0;
}
return false;
}
ping_start(adr, count, interval, size, timeout);
IPAddress adr = IPAddress(((struct sockaddr_in *)(target->ai_addr))->sin_addr.s_addr);
freeaddrinfo(target);
return ping_start(adr, count, interval, size, timeout, result);
}
bool ping_start(struct ping_option *ping_o) {


return ping_start(ping_o->ip,ping_o->count,0,0,0);

}

bool ping_start(IPAddress adr, int count=0, int interval=0, int size=0, int timeout=0) {

return ping_start(adr, count=0, interval=0, size=0, timeout=0, NULL);

}

bool ping_start(IPAddress adr, int count=0, int interval=0, int size=0, int timeout=0, struct ping_result *result=NULL) {
// driver_error_t *error;
struct sockaddr_in address;
ip4_addr_t ping_target;
Expand Down Expand Up @@ -280,8 +310,8 @@ bool ping_start(IPAddress adr, int count=0, int interval=0, int size=0, int time
}


address.sin_addr.s_addr = adr;
ping_target.addr = address.sin_addr.s_addr;
address.sin_addr.s_addr = adr;
ping_target.addr = address.sin_addr.s_addr;

// Setup socket
struct timeval tout;
Expand Down Expand Up @@ -330,6 +360,16 @@ bool ping_start(IPAddress adr, int count=0, int interval=0, int size=0, int time
((((float)transmitted - (float)received) / (float)transmitted) * 100.0)
);

if (result != NULL) {
result->transmitted = transmitted;
result->received = received;
result->loss_rate = ((((float)transmitted - (float)received) / (float)transmitted) * 100.0);
result->min_time = min_time;
result->mean_time = mean_time;
result->max_time = max_time;
result->var_time = var_time;
}

if (received) {
ping_resp pingresp;
log_i("round-trip min/avg/max/stddev = %.3f/%.3f/%.3f/%.3f ms\r\n", min_time, mean_time, max_time, sqrt(var_time / received));
Expand All @@ -338,6 +378,7 @@ bool ping_start(IPAddress adr, int count=0, int interval=0, int size=0, int time
pingresp.total_bytes = 1;
pingresp.total_time = mean_time;
pingresp.ping_err = 0;

return true;
// ping_o->sent_function(ping_o, (uint8*)&pingresp);
}
Expand Down
67 changes: 62 additions & 5 deletions PingTest/PingTest.ino
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
const char ssid[] = "TP-LINK_C20B"; // your network SSID (name)
const char password[] = "paolo-48"; // your network password

const char *host = "www.google.com"; // ping target hostname

void setup() {

Serial.begin(115200);
Expand Down Expand Up @@ -51,12 +53,67 @@ void loop() {
ia[i++] =val ;
}
IPAddress adr = IPAddress(ia[0], ia[1], ia[2], ia[3]);
Serial.printf("Ping : %d . %d . %d . %d ->", ia[0], ia[1], ia[2], ia[3]);
if (ping_start(adr, 4, 0, 0, 5))
Serial.printf("Ping : %d . %d . %d . %d -> ", ia[0], ia[1], ia[2], ia[3]);
struct ping_result result;
if (ping_start(adr, 4, 0, 0, 5, &result)) {
Serial.println("OK");
Serial.println("--- statistics ---");
Serial.print(result.transmitted);
Serial.print(" packets transmitted, ");
Serial.print(result.received);
Serial.print(" packets received, ");
Serial.print(result.loss_rate, 2);
Serial.println("% packet loss");
Serial.print("round-trip min/avg/max/stddev = ");
Serial.print(result.min_time, 3);
Serial.print("/");
Serial.print(result.mean_time, 3);
Serial.print("/");
Serial.print(result.max_time, 3);
Serial.print("/");
Serial.print(result.var_time / result.received, 3);
Serial.println(" ms");
} else {
Serial.println("FAILED");
Serial.println("--- statistics ---");
Serial.print(result.transmitted);
Serial.print(" packets transmitted, ");
Serial.print(result.received);
Serial.print(" packets received, ");
Serial.print(result.loss_rate, 2);
Serial.println("% packet loss");
}

Serial.printf("Ping : %s -> ", host);
if (ping(host, 4, 0, 0, 5, &result)) {
Serial.println("OK");
else
Serial.println("--- statistics ---");
Serial.print(result.transmitted);
Serial.print(" packets transmitted, ");
Serial.print(result.received);
Serial.print(" packets received, ");
Serial.print(result.loss_rate, 2);
Serial.println("% packet loss");
Serial.print("round-trip min/avg/max/stddev = ");
Serial.print(result.min_time, 3);
Serial.print("/");
Serial.print(result.mean_time, 3);
Serial.print("/");
Serial.print(result.max_time, 3);
Serial.print("/");
Serial.print(result.var_time / result.received, 3);
Serial.println(" ms");
} else {
Serial.println("FAILED");
delay(10000);
Serial.println("--- statistics ---");
Serial.print(result.transmitted);
Serial.print(" packets transmitted, ");
Serial.print(result.received);
Serial.print(" packets received, ");
Serial.print(result.loss_rate, 2);
Serial.println("% packet loss");
}
delay(5000);

}
int readnu(char s) {
Expand All @@ -71,4 +128,4 @@ int readnu(char s) {
}
Serial.println(digit);
return digit;
}
}
18 changes: 15 additions & 3 deletions ping.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,20 @@ struct ping_resp {
int8_t ping_err;
};

struct ping_result {
uint32_t transmitted = 0;
uint32_t received = 0;
float loss_rate = 0;
float min_time = 0;
float max_time = 0;
float mean_time = 0;
float last_mean_time = 0;
float var_time = 0;
};

bool ping_start(struct ping_option *ping_opt);
void ping(const char *name, int count, int interval, int size, int timeout);
bool ping(const char *name, int count, int interval, int size, int timeout);
bool ping(const char *name, int count, int interval, int size, int timeout, struct ping_result *result);
bool ping_start(IPAddress adr, int count, int interval, int size, int timeout);

#endif
bool ping_start(IPAddress adr, int count, int interval, int size, int timeout, struct ping_result *result);
#endif