+int logPacket(int seq){
+ struct request *tmp;
+
+ /*Add new request to queue*/
+ tmp=malloc(sizeof(struct request));
+ if(tmp==NULL){
+ dbgprintf(0,"Error: Can't allocate Memory!\n");
+ exit(1);
+ }
+ tmp->next=NULL;
+ tmp->prev=NULL;
+ tmp->num_replies=0;
+ tmp->num_errors=0;
+ tmp->seq=seq;
+ tmp->reply_type=UNKNOWN;
+ gettimeofday(&tmp->sent,NULL);
+
+ if(queue.head==NULL){
+ queue.head=queue.tail=tmp;
+ return 0;
+ }
+ queue.head->prev=tmp;
+ tmp->next=queue.head;
+ queue.head=tmp;
+
+ /*Update Statistics*/
+ if(ping_stats.requests_sent==0){
+ gettimeofday(&ping_stats.start,NULL);
+ }
+ ping_stats.requests_sent++;
+ return 0;
+}
+
+int logResponse(ipaddr_ptr_t *src, int seq, int type){
+ struct request *cur;
+ double diff;
+ char pbuf[1000];
+
+ if(queue.tail==NULL){
+ dbgprintf(1,"Response received but no requests sent!\n");
+ return -1;
+ }
+
+ /*Locate request*/
+ cur=queue.tail;
+ while(cur!=NULL){
+ if(cur->seq==seq){
+ gettimeofday(&cur->reply,NULL);
+ if(type<DEST_UNREACHABLE && type!=UNKNOWN){
+ cur->num_replies++;
+ }else{
+ cur->num_errors++;
+ }
+ cur->reply_type=type;
+ break;
+ }
+ cur=cur->prev;
+ }
+
+ if(cur==NULL){
+ dbgprintf(1,"Response received but no requests sent with sequence number %i!\n", seq);
+ return -1;
+ }
+
+ diff=(cur->reply.tv_usec + 1000000*cur->reply.tv_sec) - (cur->sent.tv_usec + 1000000*cur->sent.tv_sec);
+ diff=diff/1000.0;
+
+ /*Print Message*/
+ if(type<DEST_UNREACHABLE && type!=UNKNOWN){
+ if(ip_type==AF_INET){
+ dbgprintf(0, "Response from %s : seq=%i time=%.1fms status=%s\n",
+ inet_ntop(ip_type, (void*)&src->ipv4->sin_addr, pbuf, 1000),
+ seq, diff,response_label[type]);
+ }else{
+ dbgprintf(0, "Response from %s : seq=%i time=%.1fms status=%s\n",
+ inet_ntop(ip_type, (void*)&src->ipv6->sin6_addr, pbuf, 1000),
+ seq, diff,response_label[type]);
+ }
+ }else{
+ if(ip_type==AF_INET){
+ dbgprintf(0, "%s from %s : seq=%i\n",response_label[type],
+ inet_ntop(ip_type, (void*)&src->ipv4->sin_addr, pbuf, 1000),
+ seq);
+ }else{
+ dbgprintf(0, "%s from %s : seq=%i\n",response_label[type],
+ inet_ntop(ip_type, (void*)&src->ipv6->sin6_addr, pbuf, 1000),
+ seq);
+ }
+ }
+
+ /*Update statistics*/
+ if(type<DEST_UNREACHABLE && type!=UNKNOWN){
+ /*Good Response*/
+ ping_stats.rtt_avg=((ping_stats.replies_received*ping_stats.rtt_avg)+(diff))/(ping_stats.replies_received+1);
+ ping_stats.replies_received++;
+ if(diff < ping_stats.rtt_min){
+ ping_stats.rtt_min=diff;
+ }
+ if(diff > ping_stats.rtt_max){
+ ping_stats.rtt_max=diff;
+ }
+ }else{
+ /*Error*/
+ cur->num_errors++;
+ }
+ gettimeofday(&ping_stats.stop,NULL);
+ return 0;
+}
+