-// $Id: $
+// $Id$
//
-// Copyright (C) 2006
+// Copyright (C) 2008
// Fraunhofer Institute for Open Communication Systems (FOKUS)
// Competence Center NETwork research (NET), St. Augustin, GERMANY
-// Christian Niephaus <christian.niephaus@fokus.fraunhofer.de>
+// Christian Niephaus <cni@berlios.de>
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// Custom includes
#include "WLANPacket.hh"
#include "../../Packets/Packets.hh"
-#include "../DefaultBundle/LlcSnapPacket.hh"
#include <boost/io/ios_state.hpp>
#define prefix_
-namespace
+namespace {
+
+ void dumpBase(senf::WLANPacketParser const & p, std::ostream & os)
+ {
+ os << " version : " << unsigned(p.version()) <<"\n"
+ << " type : " << unsigned(p.type()) << "\n"
+ << " subtype : " << unsigned(p.subtype()) << "\n"
+ << " flags :";
+ if ( p.toDS() ) os << " toDS";
+ if ( p.fromDS() ) os << " fromDS";
+ if ( p.moreFrag() ) os << " moreFrag";
+ if ( p.retry() ) os << " retry";
+ if ( p.pwrMgt() ) os << " pwrMgt";
+ if ( p.moreData() ) os << " moreData";
+ if ( p.protectedFrame() ) os << " protected";
+ if ( p.order() ) os << " order";
+
+ if ( !(p.toDS() || p.fromDS() || p.moreFrag() || p.retry() || p.pwrMgt() ||
+ p.moreData() || p.protectedFrame() || p.order()) )
+ os << " none";
+ os << "\n"
+ << " duration : " << unsigned(p.duration()) << "\n";
+ }
+}
+
+prefix_ void senf::WLANPacket_MgtFrameType::dump(packet p, std::ostream &os)
{
+ boost::io::ios_all_saver ias(os);
+ os << "802.11 MAC Mangement Frame:\n";
+ dumpBase(p.parser(), os);
+ os << " destination : " << p->destinationAddress() << "\n"
+ << " source : " << p->sourceAddress() << "\n"
+ << " bss id : " << p->bssid() << "\n"
+ << " sequence number : " << p->sequenceNumber() << "\n"
+ << " fragment number : " << p->fragmentNumber() << "\n";
+}
+prefix_ void senf::WLANPacket_CtrlFrameType::dump(packet p, std::ostream &os)
+{
+ boost::io::ios_all_saver ias(os);
+ os << "802.11 MAC Control Frame:\n";
+ dumpBase(p.parser(), os);
+ os << " receiver : " << p->receiverAddress() << "\n";
+ if (p->is_rts())
+ os << " source : " << p->sourceAddress() << "\n";
}
-prefix_ senf::MACAddressParser senf::WLANPacketParser_DataFrameParser::da()
+prefix_ senf::MACAddressParser senf::WLANPacket_DataFrameParser::destinationAddress()
const
{
- switch (dsBits())
- {
+ switch (dsBits()) {
case 0 :
- case 2 :
- return addr1();
- break;
- case 1 :
- case 3 :
- return addr3();
- break;
+ case 2 : return addr1();
+ default: return addr3();
}
}
-prefix_ senf::MACAddressParser senf::WLANPacketParser_DataFrameParser::sa()
+prefix_ senf::MACAddressParser senf::WLANPacket_DataFrameParser::sourceAddress()
const
{
switch (dsBits())
{
case 0 :
- case 1 :
- return addr2();
- break;
- case 2 :
- return addr3();
- break;
-//TODO wds frames
-// case 3:
-// return addr4();
+ case 1 : return addr2();
+ // TODO wds frames
+ // case 3 : return addr4();
+ default: return addr3();
}
}
-prefix_ senf::MACAddressParser senf::WLANPacketParser_DataFrameParser::bssid()
+prefix_ senf::MACAddressParser senf::WLANPacket_DataFrameParser::bssid()
const
{
switch (dsBits())
{
- case 0 :
- return addr3();
- break;
- case 1 :
- return addr1();
- break;
- case 2:
- return addr2();
+ case 0 : return addr3();
+ case 1 : return addr1();
+ default: return addr2();
}
}
-//shift some bits to read the 12bit sequence number bit field in LSB byte order
-prefix_ boost::uint16_t senf::WLANPacketParser_MgtFrameParser::sequenceNumber()
- const
-{
- boost::uint16_t seqN = 0;
- seqN |= seqNumber_2();
- seqN <<= 4;
- seqN |= seqNumber_1();
- return seqN;
-}
-
-//shift some bits to read the 12bit sequence number bit field in LSB byte order
-prefix_ boost::uint16_t senf::WLANPacketParser_DataFrameParser::sequenceNumber()
- const
-{
- boost::uint16_t seqN = 0;
- seqN |= seqNumber_2();
- seqN <<= 4;
- seqN |= seqNumber_1();
- return seqN;
-}
-
-prefix_ void senf::WLANPacketType::dump(packet p, std::ostream &os)
+prefix_ void senf::WLANPacket_DataFrameType::dump(packet p, std::ostream &os)
{
boost::io::ios_all_saver ias(os);
- os << "802.11 MAC Frame:\n"
- << " Type : " << unsigned (p->type()) << "\n"
- << " Subtype : " << unsigned (p->subtype()) << "\n"
- << " Retransmission : " << unsigned (p->retry()) << "\n"
- << " Duration : " << unsigned (p->duration()) << "\n";
-
- if (p->has_mgtFrame())
- {
- os << " BSSID : " << p->mgtFrame().bssid() << "\n";
- os << " Destination Addr. : " << p->mgtFrame().da() << "\n";
- os << " Source Addr. : " << p->mgtFrame().sa() << "\n";
- }
-
-};
-
-
-
+ os << "802.11 MAC Data Frame:\n";
+ dumpBase(p.parser(), os);
+ os << " destination : " << p->destinationAddress();
+ if (p->dsBits()==0 || p->dsBits()==2) os << " (receiver)";
+ os << "\n"
+ << " source : " << p->sourceAddress();
+ if (p->dsBits()==0 || p->dsBits()==1) os << " (transmitter)";
+ os << "\n"
+ << " bss id : " << p->bssid();
+ if (p->dsBits()==1) os << " (receiver)";
+ else if (p->dsBits()!=0) os << " (transmitter)";
+ os << "\n"
+ << " sequence number : " << p->sequenceNumber() << "\n"
+ << " fragment number : " << p->fragmentNumber() << "\n";
+ if (p->has_qosField())
+ os << " QOS data : " << p->qosField() << "\n";
+}
#undef prefix_
+
+\f
+// Local Variables:
+// mode: c++
+// fill-column: 100
+// c-file-style: "senf"
+// indent-tabs-mode: nil
+// ispell-local-dictionary: "american"
+// compile-command: "scons -u test"
+// comment-column: 40
+// End: