Search:

SENF Extensible Network Framework

  • Home
  • Download
  • Wiki
  • BerliOS
  • ChangeLog
  • Browse SVN
  • Bug Tracker
  • Overview
  • Examples
  • HowTos
  • Glossary
  • PPI
  • Packets
  • Scheduler
  • Socket
  • Utils
  • Console
  • Daemon
  • Logger
  • Termlib
  • Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

80211Bundle/WLANPacket.cc

Go to the documentation of this file.
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:

Contact: senf-dev@lists.berlios.de | © 2006-2010 Fraunhofer Institute for Open Communication Systems, Network Research