00001 // $Id: WLANPacket.cc 1772 2011-03-10 12:45:21Z tho $ 00002 // 00003 // Copyright (C) 2008 00004 // Fraunhofer (FOKUS) 00005 // Competence Center NETwork research (NET), St. Augustin, GERMANY 00006 // Christian Niephaus <cni@berlios.de> 00007 // 00008 // This program is free software; you can redistribute it and/or modify 00009 // it under the terms of the GNU General Public License as published by 00010 // the Free Software Foundation; either version 2 of the License, or 00011 // (at your option) any later version. 00012 // 00013 // This program is distributed in the hope that it will be useful, 00014 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00015 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00016 // GNU General Public License for more details. 00017 // 00018 // You should have received a copy of the GNU General Public License 00019 // along with this program; if not, write to the 00020 // Free Software Foundation, Inc., 00021 // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 00022 00023 // Definition of non-inline non-template functions 00024 00025 #include "WLANPacket.hh" 00026 //#include "WLANPacket.ih" 00027 00028 // Custom includes 00029 #include <boost/io/ios_state.hpp> 00030 00031 #define prefix_ 00032 //-///////////////////////////////////////////////////////////////////////////////////////////////// 00033 00034 namespace { 00035 void dumpBase(senf::WLANPacketParser const & p, std::ostream & os) 00036 { 00037 os << " version : " << unsigned(p.version()) <<"\n" 00038 << " type : " << unsigned(p.type()) << "\n" 00039 << " subtype : " << unsigned(p.subtype()) << "\n" 00040 << " flags :"; 00041 if ( p.toDS() ) os << " toDS"; 00042 if ( p.fromDS() ) os << " fromDS"; 00043 if ( p.moreFrag() ) os << " moreFrag"; 00044 if ( p.retry() ) os << " retry"; 00045 if ( p.pwrMgt() ) os << " pwrMgt"; 00046 if ( p.moreData() ) os << " moreData"; 00047 if ( p.protectedFrame() ) os << " protected"; 00048 if ( p.order() ) os << " order"; 00049 00050 if ( !(p.toDS() || p.fromDS() || p.moreFrag() || p.retry() || p.pwrMgt() || 00051 p.moreData() || p.protectedFrame() || p.order()) ) 00052 os << " none"; 00053 os << "\n" 00054 << " duration : " << unsigned(p.duration()) << "\n"; 00055 } 00056 } 00057 00058 prefix_ void senf::WLANPacket_MgtFrameParser::sequenceNumber(boost::uint16_t sn) 00059 { 00060 seqNumber_2() = 0u | (sn >> 4 ) ; 00061 seqNumber_1() = 0u | sn; 00062 } 00063 00064 prefix_ void senf::WLANPacket_MgtFrameType::dump(packet p, std::ostream & os) 00065 { 00066 boost::io::ios_all_saver ias(os); 00067 os << "802.11 MAC Management Frame:\n"; 00068 dumpBase(p.parser(), os); 00069 os << senf::fieldName("destination") << p->destinationAddress() << "\n" 00070 << senf::fieldName("source") << p->sourceAddress() << "\n" 00071 << senf::fieldName("bss id") << p->bssid() << "\n" 00072 << senf::fieldName("sequence number") << p->sequenceNumber() << "\n" 00073 << senf::fieldName("fragment number") << p->fragmentNumber() << "\n"; 00074 } 00075 00076 prefix_ void senf::WLANPacket_CtrlFrameType::dump(packet p, std::ostream & os) 00077 { 00078 boost::io::ios_all_saver ias(os); 00079 os << "802.11 MAC Control Frame:\n"; 00080 dumpBase(p.parser(), os); 00081 os << senf::fieldName("receiver") << p->receiverAddress() << "\n"; 00082 if (p->is_rts()) 00083 os << senf::fieldName("source") << p->sourceAddress() << "\n"; 00084 } 00085 00086 prefix_ void senf::WLANPacket_DataFrameParser::sequenceNumber(boost::uint16_t sn) 00087 { 00088 seqNumber_2() = 0u | (sn >> 4 ) ; 00089 seqNumber_1() = 0u | sn; 00090 } 00091 00092 prefix_ senf::MACAddressParser senf::WLANPacket_DataFrameParser::destinationAddress() 00093 const 00094 { 00095 switch (dsBits()) { 00096 case 0 : 00097 case 2 : 00098 return addr1(); 00099 default: 00100 return addr3(); 00101 } 00102 } 00103 00104 prefix_ senf::MACAddressParser senf::WLANPacket_DataFrameParser::sourceAddress() 00105 const 00106 { 00107 switch (dsBits()) { 00108 case 0 : 00109 case 1 : 00110 return addr2(); 00111 // TODO wds frames 00112 // case 3 : return addr4(); 00113 default: 00114 return addr3(); 00115 } 00116 } 00117 00118 prefix_ senf::MACAddressParser senf::WLANPacket_DataFrameParser::bssid() 00119 const 00120 { 00121 switch (dsBits()) { 00122 case 0 : 00123 return addr3(); 00124 case 1 : 00125 return addr1(); 00126 default: 00127 return addr2(); 00128 } 00129 } 00130 00131 prefix_ void senf::WLANPacket_DataFrameType::dump(packet p, std::ostream & os) 00132 { 00133 boost::io::ios_all_saver ias(os); 00134 os << "802.11 MAC Data Frame:\n"; 00135 dumpBase(p.parser(), os); 00136 os << senf::fieldName("destination") << p->destinationAddress(); 00137 if (p->dsBits()==0 || p->dsBits()==2) os << " (receiver)"; 00138 os << "\n" 00139 << senf::fieldName("source") << p->sourceAddress(); 00140 if (p->dsBits()==0 || p->dsBits()==1) os << " (transmitter)"; 00141 os << "\n" 00142 << senf::fieldName("bss id") << p->bssid(); 00143 if (p->dsBits()==1) os << " (receiver)"; 00144 else if (p->dsBits()!=0) os << " (transmitter)"; 00145 os << "\n" 00146 << senf::fieldName("sequence number") << p->sequenceNumber() << "\n" 00147 << senf::fieldName("fragment number") << p->fragmentNumber() << "\n"; 00148 if (p->has_qosField()) 00149 os << senf::fieldName("QOS data") << p->qosField() << "\n"; 00150 } 00151 00152 //-///////////////////////////////////////////////////////////////////////////////////////////////// 00153 #undef prefix_ 00154 00155 00156 // Local Variables: 00157 // mode: c++ 00158 // fill-column: 100 00159 // c-file-style: "senf" 00160 // indent-tabs-mode: nil 00161 // ispell-local-dictionary: "american" 00162 // compile-command: "scons -u test" 00163 // comment-column: 40 00164 // End: