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_SOURCE_BSSID_TIMESTAMP_ID_HXX_
00023 # define WIFI_FRAME_SOURCE_BSSID_TIMESTAMP_ID_HXX_
00024
00025 # include "source_bssid_timestamp_id.hh"
00026
00027 # include <trace-tools/wifi/frame/id_helper_hooks.hh>
00028 # include <trace-tools/wifi/frame/dissector/dissector.hh>
00029
00030 namespace wifi
00031 {
00032
00033 namespace frame
00034 {
00035
00036 template <>
00037 boost::optional<source_bssid_timestamp_id>
00038 make_unique_id<source_bssid_timestamp_id,
00039 prism::header>(const pcapxx::frame_descriptor& desc,
00040 addr_mapping& mapping,
00041 bool prism_noise_means_error)
00042 {
00043 typedef internals::id_helper_hooks hooks;
00044
00045 const void* frame;
00046 size_t caplen;
00047
00048 if (not internals::make_unique_id_handle_prism(frame, caplen, desc,
00049 prism_noise_means_error))
00050 return boost::none_t ();
00051
00052 const dissector<hooks> d (frame, caplen);
00053 const hooks& h = d.hooks();
00054 const timestamp* t = h.timestamp_ptr();
00055 const addr* s = h.addr_ptr(mgt::header::sa);
00056 const addr* b = h.addr_ptr(mgt::header::bssid);
00057
00058 assert(not t or (s and b));
00059 if (t)
00060 return source_bssid_timestamp_id (desc.pcap_header()->id,
00061 mapping[*s], mapping[*b], *t);
00062 else
00063 return boost::none_t ();
00064 }
00065
00066 }
00067
00068 }
00069
00070 #endif // ! WIFI_FRAME_SOURCE_BSSID_TIMESTAMP_ID_HXX_
00071