aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDavid M. Syzdek <david.syzdek@acsalaska.com>2020-01-30 15:13:09 -0900
committerDavid M. Syzdek <david.syzdek@acsalaska.com>2020-01-30 15:13:09 -0900
commit6380993d9bf8230e6729e785af33ebc47a2a7533 (patch)
tree8fb30bcebc3ed550870ac81ad91a18106bc88565
parentf820ccbeb62e8ace233001ab60d21aac14ade8a7 (diff)
downloadakcom-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.c154
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
115union 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
111struct udp_echo_plus 124struct 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
167int my_daemonize(void); 180int my_daemonize(void);
168 181
182// log connection
183int 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
170int my_loop(int s, size_t * connp); 188int 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
561int 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
543int my_loop(int s, size_t * connp) 636int 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}