core: simplify main

This commit is contained in:
2025-12-18 09:39:40 -06:00
parent d927caffb4
commit ee7965dad0

View File

@@ -77,15 +77,17 @@ static int preload(struct setting const *settings, int sockfd, char const *packe
return 0; return 0;
} }
static int check_reply(struct sockaddr_in const *me, struct sockaddr_in const *sender, char *sent, char *received, size_t sent_size, size_t recv_size) static int check_reply(struct sockaddr_in const *me, struct sockaddr_in const *sender, struct icmphdr *sent_hdr, struct icmphdr *recv_hdr, size_t sent_size, ssize_t recv_size)
{ {
if (sent_size != recv_size) if (recv_size < (ssize_t) sizeof(struct icmphdr))
return 0;
if (((struct icmphdr *)sent)->type != 0)
return 0;
if (check_packet_conformity(sent, received, sent_size))
return 1; return 1;
return memcmp(sender, me, sizeof(struct sockaddr_in)); if (memcmp(sender, me, sizeof(struct sockaddr_in)))
return 1;
if (recv_hdr->type == 8)
return 1;
if ((size_t) recv_size != sent_size)
return 1;
return check_packet_conformity((char *)sent_hdr, (char *)recv_hdr, recv_size);
} }
int main(int ac, char **av) int main(int ac, char **av)
@@ -135,10 +137,9 @@ int main(int ac, char **av)
if (preload(&settings, sockfd, packet, packet_size)) if (preload(&settings, sockfd, packet, packet_size))
goto error3; goto error3;
struct timeval stop, start;
while (loop) { while (loop) {
struct timeval stop, start;
gettimeofday(&start, NULL); gettimeofday(&start, NULL);
if (sendto(sockfd, packet, packet_size, 0, (struct sockaddr *) &settings.dest.ip, sizeof(settings.dest.ip)) == -1) if (sendto(sockfd, packet, packet_size, 0, (struct sockaddr *) &settings.dest.ip, sizeof(settings.dest.ip)) == -1)
{ {
@@ -147,27 +148,28 @@ int main(int ac, char **av)
} }
stats.packets_sent++; stats.packets_sent++;
ssize_t ret = 0; while (loop)
do
{ {
ret = recvfrom(sockfd, buffer, recv_packet_size, 0, (struct sockaddr *) &sender, &len); ssize_t recv_size = recvfrom(sockfd, buffer, recv_packet_size, 0, (struct sockaddr *) &sender, &len);
gettimeofday(&stop, NULL); gettimeofday(&stop, NULL);
}
while (ret >= 0 && check_reply(&settings.dest.ip, &sender, packet, buffer + sizeof(struct iphdr), packet_size, ret)); struct icmphdr *recv_hdr = (struct icmphdr *) (buffer + sizeof(struct iphdr));
recv_size -= sizeof(struct iphdr);
if (ret >= (ssize_t) (sizeof(struct icmphdr) + sizeof(struct iphdr)))
{ if (check_reply(&settings.dest.ip, &sender, (struct icmphdr *) packet, recv_hdr, packet_size, recv_size))
if (((struct icmphdr *) (buffer + sizeof(struct iphdr)))->type == 0) continue;
if (recv_hdr->type == 0)
stats.packets_received++; stats.packets_received++;
print_recv(&settings, buffer, &start, &stop, &sender); print_recv(&settings, buffer, &start, &stop, &sender);
} double interval = get_interval(&start, &stop);
if (interval < 1000)
double interval = get_interval(&start, &stop); usleep((1000 - interval) * 1e3);
if (interval < 1000) break;
usleep((1000 - interval) * 1e3); }
if (packet_update(packet, settings.payload_size)) if (packet_update(packet, settings.payload_size))
goto error3; goto error3;
} }
free(packet); free(packet);