Mixe for Privacy and Anonymity in the Internet
CALogPacketStats.cpp
Go to the documentation of this file.
00001 /*
00002 Copyright (c) 2000, The JAP-Team 
00003 All rights reserved.
00004 Redistribution and use in source and binary forms, with or without modification, 
00005 are permitted provided that the following conditions are met:
00006 
00007   - Redistributions of source code must retain the above copyright notice, 
00008     this list of conditions and the following disclaimer.
00009 
00010   - Redistributions in binary form must reproduce the above copyright notice, 
00011     this list of conditions and the following disclaimer in the documentation and/or 
00012     other materials provided with the distribution.
00013 
00014   - Neither the name of the University of Technology Dresden, Germany nor the names of its contributors 
00015     may be used to endorse or promote products derived from this software without specific 
00016     prior written permission. 
00017 
00018   
00019 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS 
00020 OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 
00021 AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS
00022 BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
00023 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
00024 OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 
00025 IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
00026 OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
00027 */
00028 
00029 #include "StdAfx.h"
00030 #include "CALogPacketStats.hpp"
00031 #include "CAUtil.hpp"
00032 #include "CAMuxSocket.hpp"
00033 #include "CAMsg.hpp"
00034 
00035 #ifdef LOG_PACKET_TIMES
00036 
00040 THREAD_RETURN loopLogPacketStats(void* param)
00041   {
00042     CALogPacketStats* pLog=(CALogPacketStats*)param;
00043     UINT32 countLog=0;
00044     while(pLog->m_bRunLog)
00045       {
00046         if(countLog==0)
00047           {
00048             pLog->logTimeingStats();
00049             pLog->resetTimeingStats();
00050             countLog=pLog->m_iLogIntervallInHalfMinutes;
00051           }
00052         sSleep(30);
00053         countLog--;
00054       }
00055     THREAD_RETURN_SUCCESS;
00056   }
00057 
00058 SINT32 CALogPacketStats::start()
00059   {
00060     resetTimeingStats();
00061     m_pthreadLog=new CAThread((UINT8*)"Packet Stats Logging Thread");
00062     m_pthreadLog->setMainLoop(loopLogPacketStats);
00063     m_bRunLog=true;
00064     return m_pthreadLog->start(this);
00065   }
00066 
00067 SINT32 CALogPacketStats::stop()
00068   {
00069     m_bRunLog=false;
00070     if(m_pthreadLog!=NULL)
00071     {
00072       m_pthreadLog->join();
00073       delete m_pthreadLog;
00074       m_pthreadLog=NULL;
00075     }
00076     
00077     return E_SUCCESS;
00078   }
00079 
00080 SINT32 CALogPacketStats::addToTimeingStats(const tQueueEntry& oQueueEntry,UINT32 uType,bool bUpstream)
00081 {
00082   m_csTimeingStats.lock();
00083   UINT32 proccessingTime=diff64(oQueueEntry.timestamp_proccessing_end,oQueueEntry.timestamp_proccessing_start);
00084   UINT32 proccessingTimeOP=diff64(oQueueEntry.timestamp_proccessing_end_OP,oQueueEntry.timestamp_proccessing_start_OP);
00085   if(bUpstream)
00086   {
00087     if(uType==CHANNEL_DATA)
00088       {
00089         m_timingCountDataPacketsUpstream++;
00090         add64(m_timingSumDataPacketUpstream,proccessingTime);
00091         if(proccessingTime>m_timingMaxDataPacketUpstream)
00092           m_timingMaxDataPacketUpstream=proccessingTime;
00093         else if(m_timingMinDataPacketUpstream>proccessingTime)
00094           m_timingMinDataPacketUpstream=proccessingTime;  
00095         add64(m_timingSumDataPacketUpstreamOP,proccessingTimeOP);
00096         if(proccessingTimeOP>m_timingMaxDataPacketUpstreamOP)
00097           m_timingMaxDataPacketUpstreamOP=proccessingTimeOP;
00098         else if(m_timingMinDataPacketUpstreamOP>proccessingTimeOP)
00099           m_timingMinDataPacketUpstreamOP=proccessingTimeOP;  
00100       }
00101     else if(uType==CHANNEL_CLOSE)
00102       {
00103         m_timingCountClosePacketsUpstream++;
00104         add64(m_timingSumClosePacketUpstream,proccessingTime);
00105         if(proccessingTime>m_timingMaxClosePacketUpstream) 
00106           m_timingMaxClosePacketUpstream=proccessingTime;
00107         else if(m_timingMinClosePacketUpstream>proccessingTime)
00108           m_timingMinClosePacketUpstream=proccessingTime; 
00109         add64(m_timingSumClosePacketUpstreamOP,proccessingTimeOP);
00110         if(proccessingTimeOP>m_timingMaxClosePacketUpstreamOP) 
00111           m_timingMaxClosePacketUpstreamOP=proccessingTimeOP;
00112         else if(m_timingMinClosePacketUpstreamOP>proccessingTimeOP)
00113           m_timingMinClosePacketUpstreamOP=proccessingTimeOP; 
00114       }
00115     else
00116       {//open
00117         m_timingCountOpenPacketsUpstream++;
00118         add64(m_timingSumOpenPacketUpstream,proccessingTime);
00119         if(proccessingTime>m_timingMaxOpenPacketUpstream)
00120           m_timingMaxOpenPacketUpstream=proccessingTime;
00121         else if(m_timingMinOpenPacketUpstream>proccessingTime)
00122           m_timingMinOpenPacketUpstream=proccessingTime;  
00123         add64(m_timingSumOpenPacketUpstreamOP,proccessingTimeOP);
00124         if(proccessingTimeOP>m_timingMaxOpenPacketUpstreamOP)
00125           m_timingMaxOpenPacketUpstreamOP=proccessingTimeOP;
00126         else if(m_timingMinOpenPacketUpstreamOP>proccessingTimeOP)
00127           m_timingMinOpenPacketUpstreamOP=proccessingTimeOP;  
00128       }
00129     #ifdef USE_POOL
00130       UINT32 poolTime=diff64(oQueueEntry.pool_timestamp_out,oQueueEntry.pool_timestamp_in);
00131       m_timingCountPoolPacketsUpstream++;
00132       add64(m_timingSumPoolPacketUpstream,poolTime);
00133       if(poolTime>m_timingMaxPoolPacketUpstream)
00134         m_timingMaxPoolPacketUpstream=poolTime;
00135       else if(m_timingMinPoolPacketUpstream>poolTime)
00136         m_timingMinPoolPacketUpstream=poolTime; 
00137     #endif
00138     #ifdef _DEBUG
00139       #ifndef USE_POOL
00140         CAMsg::printMsg(LOG_CRIT,"Upload Packet processing time (arrival --> send): %u µs -- Queue out --> Queue in %u µs\n",
00141                                   proccessingTime,proccessingTimeOP);
00142       #else
00143         CAMsg::printMsg(LOG_CRIT,"Upload Packet processing time (arrival --> send): %u µs -- Queue out --> Queue in %u µs -- Pool Time: %u µs\n",
00144                                   proccessingTime,proccessingTimeOP,poolTime);
00145       #endif
00146     #endif
00147   }
00148   else //downstream
00149     {
00150       //always data packets
00151       m_timingCountDataPacketsDownStream++;
00152       add64(m_timingSumDataPacketDownStream,proccessingTime);
00153       if(proccessingTime>m_timingMaxDataPacketDownStream)
00154         m_timingMaxDataPacketDownStream=proccessingTime;
00155       else if(m_timingMinDataPacketDownStream>proccessingTime)
00156         m_timingMinDataPacketDownStream=proccessingTime;  
00157       add64(m_timingSumDataPacketDownStreamOP,proccessingTimeOP);
00158       if(proccessingTimeOP>m_timingMaxDataPacketDownStreamOP)
00159         m_timingMaxDataPacketDownStreamOP=proccessingTimeOP;
00160       else if(m_timingMinDataPacketDownStreamOP>proccessingTimeOP)
00161         m_timingMinDataPacketDownStreamOP=proccessingTimeOP;  
00162       #ifdef USE_POOL
00163         UINT32 poolTime=diff64(oQueueEntry.pool_timestamp_out,oQueueEntry.pool_timestamp_in);
00164         m_timingCountPoolPacketsDownStream++;
00165         add64(m_timingSumPoolPacketDownStream,poolTime);
00166         if(poolTime>m_timingMaxPoolPacketDownStream)
00167           m_timingMaxPoolPacketDownStream=poolTime;
00168         else if(m_timingMinPoolPacketDownStream>poolTime)
00169           m_timingMinPoolPacketDownStream=poolTime; 
00170       #endif
00171       #ifdef _DEBUG
00172         #ifndef USE_POOL
00173           CAMsg::printMsg(LOG_CRIT,"Download Packet processing time (arrival --> send): %u µs -- Queue out --> Queue in %u µs\n",
00174                                     proccessingTime,proccessingTimeOP);
00175         #else
00176           CAMsg::printMsg(LOG_CRIT,"Download Packet processing time (arrival --> send): %u µs -- Queue out --> Queue in %u µs -- Pool Time: %u µs\n",
00177                                     proccessingTime,proccessingTimeOP,poolTime);
00178         #endif
00179       #endif
00180     }
00181   
00182   m_csTimeingStats.unlock();
00183   return E_SUCCESS;
00184 }
00185 
00186 SINT32 CALogPacketStats::logTimeingStats()
00187 {
00188   m_csTimeingStats.lock();  
00189   UINT32 aveDataUpstream=0;
00190   UINT32 aveCloseUpstream=0;
00191   UINT32 aveOpenUpstream=0;
00192   UINT32 aveDataDownStream=0;
00193   UINT32 aveDataUpstreamOP=0;
00194   UINT32 aveCloseUpstreamOP=0;
00195   UINT32 aveOpenUpstreamOP=0;
00196   UINT32 aveDataDownStreamOP=0;
00197   if(m_timingCountOpenPacketsUpstream>0)
00198     {
00199       aveOpenUpstream=div64(m_timingSumOpenPacketUpstream,m_timingCountOpenPacketsUpstream);
00200       aveOpenUpstreamOP=div64(m_timingSumOpenPacketUpstreamOP,m_timingCountOpenPacketsUpstream);
00201     }
00202   if(m_timingCountDataPacketsUpstream>0)
00203     {
00204       aveDataUpstream=div64(m_timingSumDataPacketUpstream,m_timingCountDataPacketsUpstream);
00205       aveDataUpstreamOP=div64(m_timingSumDataPacketUpstreamOP,m_timingCountDataPacketsUpstream);
00206     }
00207   if(m_timingCountClosePacketsUpstream>0)
00208     {
00209       aveCloseUpstream=div64(m_timingSumClosePacketUpstream,m_timingCountClosePacketsUpstream);
00210       aveCloseUpstreamOP=div64(m_timingSumClosePacketUpstreamOP,m_timingCountClosePacketsUpstream);
00211     }
00212   if(m_timingCountDataPacketsDownStream>0)
00213     {
00214       aveDataDownStream=div64(m_timingSumDataPacketDownStream,m_timingCountDataPacketsDownStream);
00215       aveDataDownStreamOP=div64(m_timingSumDataPacketDownStreamOP,m_timingCountDataPacketsDownStream);
00216     }
00217 
00218   #ifdef USE_POOL
00219     UINT32 avePoolUpstream=0;
00220     UINT32 avePoolDownStream=0;
00221     if(m_timingCountPoolPacketsUpstream>0)
00222       avePoolUpstream=div64(m_timingSumPoolPacketUpstream,m_timingCountPoolPacketsUpstream);
00223     if(m_timingCountPoolPacketsDownStream>0)
00224       aveDataDownStream=div64(m_timingSumPoolPacketDownStream,m_timingCountPoolPacketsDownStream);
00225   #endif
00226   CAMsg::printMsg(LOG_DEBUG,"Packet timeing stats [µs] -- Data Packets Upstream [%u] (Min/Max/Ave): %u/%u/%u -- Open Packets Upstream [%u]: %u/%u/%u Close Packets Upstream [%u] %u/%u/%u -- Data Packets Downstream [%u]: %u/%u/%u \n",
00227   m_timingCountDataPacketsUpstream,m_timingMinDataPacketUpstream,m_timingMaxDataPacketUpstream,aveDataUpstream,
00228   m_timingCountOpenPacketsUpstream,m_timingMinOpenPacketUpstream,m_timingMaxOpenPacketUpstream,aveOpenUpstream,
00229   m_timingCountClosePacketsUpstream,m_timingMinClosePacketUpstream,m_timingMaxClosePacketUpstream,aveCloseUpstream,
00230   m_timingCountDataPacketsDownStream,m_timingMinDataPacketDownStream,m_timingMaxDataPacketDownStream,aveDataDownStream);
00231 
00232   CAMsg::printMsg(LOG_DEBUG,"Packet timeing stats (only Queue out --> Queue in)[µs] -- Data Packets Upstream [%u] (Min/Max/Ave): %u/%u/%u -- Open Packets Upstream [%u]: %u/%u/%u Close Packets Upstream [%u] %u/%u/%u -- Data Packets Downstream [%u]: %u/%u/%u \n",
00233   m_timingCountDataPacketsUpstream,m_timingMinDataPacketUpstreamOP,m_timingMaxDataPacketUpstreamOP,aveDataUpstreamOP,
00234   m_timingCountOpenPacketsUpstream,m_timingMinOpenPacketUpstreamOP,m_timingMaxOpenPacketUpstreamOP,aveOpenUpstreamOP,
00235   m_timingCountClosePacketsUpstream,m_timingMinClosePacketUpstreamOP,m_timingMaxClosePacketUpstreamOP,aveCloseUpstreamOP,
00236   m_timingCountDataPacketsDownStream,m_timingMinDataPacketDownStreamOP,m_timingMaxDataPacketDownStreamOP,aveDataDownStreamOP);
00237   #ifdef USE_POOL
00238     CAMsg::printMsg(LOG_DEBUG,"Pool timeing stats [µs] -- Upstream [%u] (Min/Max/Ave): %u/%u/%u -- Downstream [%u]: %u/%u/%u\n",
00239     m_timingCountPoolPacketsUpstream,m_timingMinPoolPacketUpstream,m_timingMaxPoolPacketUpstream,avePoolUpstream,
00240     m_timingCountPoolPacketsDownStream,m_timingMinPoolPacketDownStream,m_timingMaxPoolPacketDownStream,avePoolDownStream);
00241   #endif
00242   m_csTimeingStats.unlock();
00243   return E_SUCCESS;
00244 }
00245 
00246 SINT32 CALogPacketStats::resetTimeingStats()
00247   {
00248     m_csTimeingStats.lock();
00249     m_timingMaxDataPacketUpstream=0;
00250     m_timingMaxDataPacketDownStream=0;
00251     m_timingMaxClosePacketUpstream=0;
00252     m_timingMinDataPacketUpstream=0xFFFFFFFF;
00253     m_timingMinDataPacketDownStream=0xFFFFFFFF;
00254     m_timingMinClosePacketUpstream=0xFFFFFFFF;
00255     m_timingCountDataPacketsUpstream=m_timingCountDataPacketsDownStream=0;
00256     m_timingCountClosePacketsUpstream=0;
00257     setZero64(m_timingSumDataPacketUpstream);
00258     setZero64(m_timingSumDataPacketDownStream);
00259     setZero64(m_timingSumClosePacketUpstream);
00260     m_timingMaxOpenPacketUpstream=0;
00261     m_timingMinOpenPacketUpstream=0xFFFFFFFF;
00262     m_timingCountOpenPacketsUpstream=0;
00263     setZero64(m_timingSumOpenPacketUpstream);
00264 
00265     m_timingMaxDataPacketUpstreamOP=0;
00266     m_timingMaxDataPacketDownStreamOP=0;
00267     m_timingMaxClosePacketUpstreamOP=0;
00268     m_timingMinDataPacketUpstreamOP=0xFFFFFFFF;
00269     m_timingMinDataPacketDownStreamOP=0xFFFFFFFF;
00270     m_timingMinClosePacketUpstreamOP=0xFFFFFFFF;
00271     setZero64(m_timingSumDataPacketUpstreamOP);
00272     setZero64(m_timingSumDataPacketDownStreamOP);
00273     setZero64(m_timingSumClosePacketUpstreamOP);
00274     m_timingMaxOpenPacketUpstreamOP=0;
00275     m_timingMinOpenPacketUpstreamOP=0xFFFFFFFF;
00276     setZero64(m_timingSumOpenPacketUpstreamOP);
00277 
00278     #ifdef USE_POOL
00279       m_timingMaxPoolPacketUpstream=0;
00280       m_timingMaxPoolPacketDownStream=0;
00281       m_timingMinPoolPacketUpstream=m_timingMinPoolPacketDownStream=0xFFFFFFFF;
00282       m_timingCountPoolPacketsUpstream=0;
00283       setZero64(m_timingSumPoolPacketUpstream);
00284       m_timingCountPoolPacketsDownStream=0;
00285       setZero64(m_timingSumPoolPacketDownStream);
00286     #endif
00287     m_csTimeingStats.unlock();
00288     return E_SUCCESS;
00289   }
00290 #endif