00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef WIFI_ADDR_TIMESTAMP_ID_HH_
00023 # define WIFI_ADDR_TIMESTAMP_ID_HH_
00024
00025 # include <boost/optional.hpp>
00026
00027 # include <wipal/wifi/unique_id/unique_id.hh>
00028 # include <wipal/wifi/timestamp.hh>
00029 # include <wipal/pcap/pkt.hh>
00030 # include <wipal/wifi/addr_mapping.hh>
00031 # include <wipal/wifi/dissector/dissector.hh>
00032 # include <wipal/wifi/unique_id/helper_hooks.hh>
00033 # include <wipal/wifi/mgt.hh>
00034
00035 namespace wpl
00036 {
00037
00038 namespace wifi
00039 {
00040
00041 namespace internals
00042 {
00043
00044 struct dst_tmp_tag {};
00045 struct src_tmp_tag {};
00046 struct bss_tmp_tag {};
00047
00048 }
00049
00050 # define WP_define_addr_tmp_id(AddrName, AddrIdx) \
00051 \
00052 typedef \
00053 unique_id<internals::adapter<unsigned, \
00054 internals::AddrName ## _tmp_tag>, \
00055 timestamp> \
00056 AddrName ## _tmp_id; \
00057 \
00058 template <> \
00059 struct unique_id_factory<AddrName ## _tmp_id> \
00060 { \
00061 template <class HeaderType, class S> \
00062 boost::optional<AddrName ## _tmp_id> \
00063 build(const pkt::packet<S>& p, addr_mapping& mapping) \
00064 { \
00065 WP_UNIQUE_ID_DISSECT(p, d, internals::id_helper_hooks, h); \
00066 \
00067 if (const timestamp* t = h.timestamp_ptr()) \
00068 { \
00069 const addr* a = h.addr_ptr(AddrIdx); \
00070 \
00071 assert(a); \
00072 return AddrName ## _tmp_id (p.id(), mapping[*a], *t); \
00073 } \
00074 return boost::none_t (); \
00075 } \
00076 };
00077
00078 WP_define_addr_tmp_id(dst, mgt::header::da)
00079 WP_define_addr_tmp_id(src, mgt::header::sa)
00080 WP_define_addr_tmp_id(bss, mgt::header::bssid)
00081
00082 # undef WP_define_addr_tmp_id
00083
00084 }
00085
00086 }
00087
00088 #endif // ! WIFI_ADDR_TIMESTAMP_ID_HH_