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 boost::optional<AddrName ## _tmp_id> \
00060 make_unique_id<AddrName ## _tmp_id, prism::header> \
00061 (const pcapxx::frame_descriptor& desc, \
00062 addr_mapping& mapping) \
00063 { \
00064 wp_make_unique_id_prism_dissect(desc, d, \
00065 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 (desc.pcap_header()->id, \
00073 mapping[*a], *t); \
00074 } \
00075 return boost::none_t (); \
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_FRAME_SOURCE_TIMESTAMP_ID_HH_