diff options
| author | David M. Syzdek <david.syzdek@acsalaska.com> | 2020-01-30 15:13:09 -0900 |
|---|---|---|
| committer | David M. Syzdek <david.syzdek@acsalaska.com> | 2020-01-30 15:13:09 -0900 |
| commit | 6380993d9bf8230e6729e785af33ebc47a2a7533 (patch) | |
| tree | 8fb30bcebc3ed550870ac81ad91a18106bc88565 | |
| parent | f820ccbeb62e8ace233001ab60d21aac14ade8a7 (diff) | |
| download | akcom-udpecho-6380993d9bf8230e6729e785af33ebc47a2a7533.tar.gz akcom-udpecho-6380993d9bf8230e6729e785af33ebc47a2a7533.tar.bz2 akcom-udpecho-6380993d9bf8230e6729e785af33ebc47a2a7533.tar.xz akcom-udpecho-6380993d9bf8230e6729e785af33ebc47a2a7533.zip | |
updating logging statements
| -rw-r--r-- | src/akcom-udpechod.c | 154 |
1 files changed, 103 insertions, 51 deletions
diff --git a/src/akcom-udpechod.c b/src/akcom-udpechod.c index 6960dd6..b3fdcd2 100644 --- a/src/akcom-udpechod.c +++ b/src/akcom-udpechod.c | |||
| @@ -100,6 +100,10 @@ | |||
| 100 | #define PACKAGE_VERSION "0.0" | 100 | #define PACKAGE_VERSION "0.0" |
| 101 | #endif | 101 | #endif |
| 102 | 102 | ||
| 103 | #define MY_SENT 0 | ||
| 104 | #define MY_RECV 1 | ||
| 105 | #define MY_DROP 2 | ||
| 106 | |||
| 103 | 107 | ||
| 104 | ///////////////// | 108 | ///////////////// |
| 105 | // // | 109 | // // |
| @@ -108,6 +112,15 @@ | |||
| 108 | ///////////////// | 112 | ///////////////// |
| 109 | #pragma mark - Datatypes | 113 | #pragma mark - Datatypes |
| 110 | 114 | ||
| 115 | union my_sa | ||
| 116 | { | ||
| 117 | struct sockaddr sa; | ||
| 118 | struct sockaddr_in sin; | ||
| 119 | struct sockaddr_in6 sin6; | ||
| 120 | struct sockaddr_storage ss; | ||
| 121 | }; | ||
| 122 | |||
| 123 | |||
| 111 | struct udp_echo_plus | 124 | struct udp_echo_plus |
| 112 | { | 125 | { |
| 113 | uint32_t req_sn; | 126 | uint32_t req_sn; |
| @@ -166,6 +179,11 @@ int main(int argc, char * argv[]); | |||
| 166 | // daemonize process | 179 | // daemonize process |
| 167 | int my_daemonize(void); | 180 | int my_daemonize(void); |
| 168 | 181 | ||
| 182 | // log connection | ||
| 183 | int my_log_conn(int mode, uint64_t * connp, union my_sa * sap, | ||
| 184 | struct udp_echo_plus * msgp, ssize_t ssize, struct timespec * tsp, | ||
| 185 | useconds_t delay); | ||
| 186 | |||
| 169 | // main loop | 187 | // main loop |
| 170 | int my_loop(int s, size_t * connp); | 188 | int my_loop(int s, size_t * connp); |
| 171 | 189 | ||
| @@ -539,24 +557,91 @@ int my_daemonize(void) | |||
| 539 | } | 557 | } |
| 540 | 558 | ||
| 541 | 559 | ||
| 560 | // log connection | ||
| 561 | int my_log_conn(int mode, uint64_t * connp, union my_sa * sap, | ||
| 562 | struct udp_echo_plus * msgp, ssize_t ssize, struct timespec * tsp, | ||
| 563 | useconds_t delay) | ||
| 564 | { | ||
| 565 | const char * mode_name; | ||
| 566 | char addr_str[INET6_ADDRSTRLEN]; | ||
| 567 | short port; | ||
| 568 | |||
| 569 | // determine log entry type | ||
| 570 | switch(mode) | ||
| 571 | { | ||
| 572 | case MY_SENT: mode_name = "sent"; break; | ||
| 573 | case MY_RECV: mode_name = "recv"; break; | ||
| 574 | case MY_DROP: mode_name = "drop"; break; | ||
| 575 | default: return(-1); | ||
| 576 | }; | ||
| 577 | |||
| 578 | // convert address to presentation format | ||
| 579 | switch(sap->ss.ss_family) | ||
| 580 | { | ||
| 581 | case AF_INET: | ||
| 582 | inet_ntop(AF_INET, &sap->sin.sin_addr, addr_str, sizeof(addr_str)); | ||
| 583 | port = ntohs(sap->sin.sin_port); | ||
| 584 | break; | ||
| 585 | |||
| 586 | case AF_INET6: | ||
| 587 | inet_ntop(AF_INET6, &sap->sin6.sin6_addr, addr_str, sizeof(addr_str)); | ||
| 588 | port = ntohs(sap->sin6.sin6_port); | ||
| 589 | break; | ||
| 590 | |||
| 591 | default: | ||
| 592 | syslog(LOG_DEBUG, "conn %zu: ignoring request from unknown address family: %i", *connp, sap->ss.ss_family); | ||
| 593 | return(-1); | ||
| 594 | }; | ||
| 595 | |||
| 596 | // log connection | ||
| 597 | if ((cnf.echoplus)) | ||
| 598 | { | ||
| 599 | syslog(LOG_INFO, | ||
| 600 | "conn %zu: client: [%s]:%hu; %s bytes: %zi; timestamp: %lu.%09lu; seq: %u; delay: %u ms;", | ||
| 601 | *connp, | ||
| 602 | addr_str, | ||
| 603 | port, | ||
| 604 | mode_name, | ||
| 605 | ssize, | ||
| 606 | tsp->tv_sec, | ||
| 607 | tsp->tv_nsec, | ||
| 608 | ntohl(msgp->req_sn), | ||
| 609 | delay | ||
| 610 | ); | ||
| 611 | } else | ||
| 612 | { | ||
| 613 | syslog(LOG_INFO, | ||
| 614 | "conn %zu: client: [%s]:%hu; %s bytes: %zi; timestamp: %lu.%09lu;", | ||
| 615 | *connp, | ||
| 616 | addr_str, | ||
| 617 | port, | ||
| 618 | mode_name, | ||
| 619 | ssize, | ||
| 620 | tsp->tv_sec, | ||
| 621 | tsp->tv_nsec | ||
| 622 | ); | ||
| 623 | }; | ||
| 624 | |||
| 625 | // log if IPv4 address mapped to IPv6 | ||
| 626 | if (sap->ss.ss_family == AF_INET6) | ||
| 627 | if (mode == MY_RECV) | ||
| 628 | if (IN6_IS_ADDR_V4MAPPED(&sap->sin6.sin6_addr) != 0) | ||
| 629 | syslog(LOG_INFO, "conn %zu: client: [%s]:%hu; IPv4 mapped address", *connp, addr_str, port); | ||
| 630 | |||
| 631 | return(0); | ||
| 632 | } | ||
| 633 | |||
| 634 | |||
| 542 | // main loop | 635 | // main loop |
| 543 | int my_loop(int s, size_t * connp) | 636 | int my_loop(int s, size_t * connp) |
| 544 | { | 637 | { |
| 545 | socklen_t sinlen; | 638 | socklen_t sinlen; |
| 546 | ssize_t ssize; | 639 | ssize_t ssize; |
| 547 | useconds_t delay; | 640 | useconds_t delay; |
| 548 | char addr_str[INET6_ADDRSTRLEN]; | ||
| 549 | short port; | ||
| 550 | struct timespec ts; | 641 | struct timespec ts; |
| 551 | uint64_t ms; | 642 | uint64_t ms; |
| 552 | struct pollfd fds[2]; | 643 | struct pollfd fds[2]; |
| 553 | union | 644 | union my_sa sa; |
| 554 | { | ||
| 555 | struct sockaddr sa; | ||
| 556 | struct sockaddr_in sin; | ||
| 557 | struct sockaddr_in6 sin6; | ||
| 558 | struct sockaddr_storage ss; | ||
| 559 | } sa; | ||
| 560 | union | 645 | union |
| 561 | { | 646 | { |
| 562 | char bytes[MY_BUFF_SIZE]; | 647 | char bytes[MY_BUFF_SIZE]; |
| @@ -567,7 +652,9 @@ int my_loop(int s, size_t * connp) | |||
| 567 | fds[0].fd = s; | 652 | fds[0].fd = s; |
| 568 | fds[0].events = POLLIN; | 653 | fds[0].events = POLLIN; |
| 569 | fds[0].revents = 0; | 654 | fds[0].revents = 0; |
| 570 | if ((poll(fds, 1, 30000)) < 1) | 655 | if (cnf.verbose > 1) |
| 656 | syslog(LOG_DEBUG, "waiting for echo request"); | ||
| 657 | if ((poll(fds, 1, 5000)) < 1) | ||
| 571 | return(0); | 658 | return(0); |
| 572 | 659 | ||
| 573 | // increment connection counter | 660 | // increment connection counter |
| @@ -585,25 +672,8 @@ int my_loop(int s, size_t * connp) | |||
| 585 | ms = (uint64_t)(ts.tv_sec * 1000000000); | 672 | ms = (uint64_t)(ts.tv_sec * 1000000000); |
| 586 | ms += (uint64_t)ts.tv_nsec; | 673 | ms += (uint64_t)ts.tv_nsec; |
| 587 | 674 | ||
| 588 | // parse UDP source address | 675 | // log connection |
| 589 | switch(sa.ss.ss_family) | 676 | my_log_conn(MY_RECV, connp, &sa, &udpbuff.msg, ssize, &ts, 0); |
| 590 | { | ||
| 591 | case AF_INET: | ||
| 592 | syslog(LOG_DEBUG, "conn %zu: processing client IPv4 address", *connp); | ||
| 593 | inet_ntop(AF_INET, &sa.sin.sin_addr, addr_str, sizeof(addr_str)); | ||
| 594 | port = ntohs(sa.sin.sin_port); | ||
| 595 | break; | ||
| 596 | |||
| 597 | case AF_INET6: | ||
| 598 | syslog(LOG_DEBUG, "conn %zu: processing client IPv6 address", *connp); | ||
| 599 | inet_ntop(AF_INET6, &sa.sin6.sin6_addr, addr_str, sizeof(addr_str)); | ||
| 600 | port = ntohs(sa.sin6.sin6_port); | ||
| 601 | break; | ||
| 602 | |||
| 603 | default: | ||
| 604 | syslog(LOG_DEBUG, "conn %zu: ignoring unknown address family: %i", *connp, sa.ss.ss_family); | ||
| 605 | return(0); | ||
| 606 | }; | ||
| 607 | 677 | ||
| 608 | // process echo+ packet | 678 | // process echo+ packet |
| 609 | if ((cnf.echoplus)) | 679 | if ((cnf.echoplus)) |
| @@ -613,23 +683,13 @@ int my_loop(int s, size_t * connp) | |||
| 613 | udpbuff.msg.recv_time = htonl(ms & 0xFFFFFFFFLL); | 683 | udpbuff.msg.recv_time = htonl(ms & 0xFFFFFFFFLL); |
| 614 | udpbuff.msg.failures = 0; | 684 | udpbuff.msg.failures = 0; |
| 615 | }; | 685 | }; |
| 616 | syslog(LOG_INFO, | ||
| 617 | "conn %zu: client: [%s]:%hu; recv bytes: %zi; timestamp: %lu.%09lu; seq: %u;", | ||
| 618 | *connp, | ||
| 619 | addr_str, | ||
| 620 | port, | ||
| 621 | ssize, | ||
| 622 | ts.tv_sec, | ||
| 623 | ts.tv_nsec, | ||
| 624 | (((cnf.echoplus)) ? ntohl(udpbuff.msg.req_sn) : 0) | ||
| 625 | ); | ||
| 626 | 686 | ||
| 627 | // randomly drop packets | 687 | // randomly drop packets |
| 628 | if (cnf.drop_perct > 0) | 688 | if (cnf.drop_perct > 0) |
| 629 | { | 689 | { |
| 630 | if ( (rand() % 100) < cnf.drop_perct) | 690 | if ( (rand() % 100) < cnf.drop_perct) |
| 631 | { | 691 | { |
| 632 | syslog(LOG_INFO, "conn %zu: client: [%s]:%hu; dropping echo request", *connp, addr_str, port); | 692 | my_log_conn(MY_DROP, connp, &sa, &udpbuff.msg, ssize, &ts, 0); |
| 633 | return(0); | 693 | return(0); |
| 634 | }; | 694 | }; |
| 635 | }; | 695 | }; |
| @@ -657,17 +717,9 @@ int my_loop(int s, size_t * connp) | |||
| 657 | udpbuff.msg.reply_time = htonl(ms & 0xFFFFFFFFLL); | 717 | udpbuff.msg.reply_time = htonl(ms & 0xFFFFFFFFLL); |
| 658 | }; | 718 | }; |
| 659 | sendto(s, udpbuff.bytes, ssize, 0, &sa.sa, sinlen); | 719 | sendto(s, udpbuff.bytes, ssize, 0, &sa.sa, sinlen); |
| 660 | syslog(LOG_INFO, | 720 | |
| 661 | "conn %zu: client: [%s]:%hu; sent bytes: %zi; timestamp: %lu.%09lu; seq: %u; delay: %u usec;", | 721 | // log response |
| 662 | *connp, | 722 | my_log_conn(MY_SENT, connp, &sa, &udpbuff.msg, ssize, &ts, delay); |
| 663 | addr_str, | ||
| 664 | port, | ||
| 665 | ssize, | ||
| 666 | ts.tv_sec, | ||
| 667 | ts.tv_nsec, | ||
| 668 | (((cnf.echoplus)) ? ntohl(udpbuff.msg.req_sn) : 0), | ||
| 669 | delay | ||
| 670 | ); | ||
| 671 | 723 | ||
| 672 | return(0); | 724 | return(0); |
| 673 | } | 725 | } |
