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_ADDR_TIMESTAMP_ID_HH_
00023 # define WIFI_FRAME_ADDR_TIMESTAMP_ID_HH_
00024
00025 # include <boost/optional.hpp>
00026
00027 # include <wipal/wifi/frame/unique_id/unique_id.hh>
00028 # include <wipal/wifi/timestamp.hh>
00029 # include <wipal/pcap/frame_descriptor.hh>
00030 # include <wipal/wifi/addr_mapping.hh>
00031 # include <wipal/wifi/frame/dissector/dissector.hh>
00032 # include <wipal/wifi/frame/unique_id/helper_hooks.hh>
00033 # include <wipal/wifi/frame/mgt.hh>
00034
00035 namespace wifi
00036 {
00037
00038 namespace frame
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> \
00062 boost::optional<AddrName ## _tmp_id> \
00063 build(const pcapxx::frame_descriptor& desc, \
00064 addr_mapping& mapping) \
00065 { \
00066 WP_UNIQUE_ID_DISSECT(desc, d, internals::id_helper_hooks, h); \
00067 \
00068 if (const timestamp* t = h.timestamp_ptr()) \
00069 { \
00070 const addr* a = h.addr_ptr(AddrIdx); \
00071 \
00072 assert(a); \
00073 return AddrName ## _tmp_id (desc.pcap_header()->id, \
00074 mapping[*a], *t); \
00075 } \
00076 return boost::none_t (); \
00077 } \
00078 };
00079
00080 WP_define_addr_tmp_id(dst, mgt::header::da)
00081 WP_define_addr_tmp_id(src, mgt::header::sa)
00082 WP_define_addr_tmp_id(bss, mgt::header::bssid)
00083
00084 # undef WP_define_addr_tmp_id
00085
00086 }
00087
00088 }
00089
00090 #endif // ! WIFI_FRAME_SOURCE_TIMESTAMP_ID_HH_