00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef WIFI_FRAME_STATS_GROWTH_HXX_
00023 # define WIFI_FRAME_STATS_GROWTH_HXX_
00024
00025 # include <wipal/wifi/frame/stats/growth.hh>
00026
00027 namespace wifi
00028 {
00029
00030 namespace frame
00031 {
00032
00033 namespace stats
00034 {
00035
00036
00037
00038
00039
00040 template <class T, unsigned EL>
00041 void
00042 growth<T, EL>::restart()
00043 {
00044 tracker_.restart();
00045 elements_.clear();
00046 current_elements_.clear();
00047 }
00048
00049 template <class T, unsigned EL>
00050 void
00051 growth<T, EL>::update(const tool::microseconds& timestamp)
00052 {
00053 if (tracker_.update(timestamp))
00054 current_elements_.clear();
00055 }
00056
00057 template <class T, unsigned EL>
00058 void
00059 growth<T, EL>::update(const T& elt)
00060 {
00061 epoch_data& d = tracker_.current();
00062
00063 if (current_elements_.insert(elt).second)
00064 ++d.current_count;
00065
00066 if (elements_.insert(elt).second)
00067 ++d.total_count;
00068 }
00069
00070 template <class T, unsigned EL>
00071 std::ostream&
00072 growth<T, EL>::print(std::ostream& o) const
00073 {
00074 unsigned total = 0;
00075
00076 BOOST_FOREACH(const epoch_data& e, tracker_.epochs())
00077 {
00078 total += e.total_count;
00079 o << '\t' << e.total_count
00080 << '\t' << total
00081 << '\t' << e.current_count << '\n';
00082 }
00083 return o << std::flush;
00084 }
00085
00086
00087
00088
00089
00090 template <class T, unsigned EL>
00091 growth<T, EL>::epoch_data::epoch_data(): total_count (0),
00092 current_count (0)
00093 {
00094 }
00095
00096
00097
00098
00099
00100 template <unsigned E>
00101 addr_growth<E>::addr_growth(const void*)
00102 {
00103 }
00104
00105 template <unsigned E>
00106 void
00107 addr_growth<E>::account_addr(const addr& a)
00108 {
00109 growth_.update(a);
00110 }
00111
00112 template <unsigned E>
00113 template <class Frame>
00114 void
00115 addr_growth<E>::account_frame(const Frame& frame,
00116 const size_t& ,
00117 const type::frame_type& ,
00118 const unsigned& ,
00119 const bool& ,
00120 const addr* const& ,
00121 const addr* const& ,
00122 const bool& )
00123 {
00124 growth_.update(frame.microseconds());
00125 }
00126
00127 template <unsigned E>
00128 std::ostream&
00129 addr_growth<E>::print(std::ostream& os) const
00130 {
00131 return os << "begin MAC addr. growth\n"
00132 << growth_
00133 << "end MAC addr. growth\n";
00134 }
00135
00136 template <unsigned E>
00137 void
00138 addr_growth<E>::restart()
00139 {
00140 growth_.restart();
00141 }
00142
00143
00144
00145
00146
00147 template <unsigned E>
00148 beacon_items_growth<E>::beacon_items_growth(const void*)
00149 {
00150 }
00151
00152 template <unsigned E>
00153 template <class Frame>
00154 void
00155 beacon_items_growth<E>::account_beacon(const Frame& ,
00156 const addr* const& ap,
00157 const addr* const& bss,
00158 const optional_string& ssid,
00159 const bool& ibss)
00160 {
00161 if (ap)
00162 ap_.update(*ap);
00163 if (bss)
00164 {
00165 if (ibss)
00166 ibssid_.update(*bss);
00167 else
00168 bssid_.update(*bss);
00169 }
00170 if (ssid)
00171 ssid_.update(*ssid);
00172 }
00173
00174 template <unsigned E>
00175 template <class Frame>
00176 void
00177 beacon_items_growth<E>::account_frame(const Frame& frame,
00178 const size_t& ,
00179 const type::frame_type& ,
00180 const unsigned& ,
00181 const bool& ,
00182 const addr* const& ,
00183 const addr* const& ,
00184 const bool& )
00185 {
00186 const tool::microseconds& stamp = frame.microseconds();
00187
00188 ap_.update(stamp);
00189 bssid_.update(stamp);
00190 ibssid_.update(stamp);
00191 ssid_.update(stamp);
00192 }
00193
00194 template <unsigned E>
00195 std::ostream&
00196 beacon_items_growth<E>::print(std::ostream& os) const
00197 {
00198 return os << "begin AP growth\n"
00199 << ap_
00200 << "end AP growth\n"
00201 << '\n'
00202 << "begin BSSID growth\n"
00203 << bssid_
00204 << "end BSSID growth\n"
00205 << '\n'
00206 << "begin IBSSID growth\n"
00207 << ibssid_
00208 << "end IBSSID growth\n"
00209 << '\n'
00210 << "begin SSID growth\n"
00211 << ssid_
00212 << "end SSID growth\n";
00213 }
00214
00215 template <unsigned E>
00216 void
00217 beacon_items_growth<E>::restart()
00218 {
00219 ap_.restart();
00220 bssid_.restart();
00221 ibssid_.restart();
00222 ssid_.restart();
00223 }
00224
00225 }
00226
00227 }
00228
00229 }
00230
00231 #endif // ! WIFI_FRAME_STATS_GROWTH_HXX_