X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Packets%2F80211Bundle%2FWLANPacket.cc;h=c704f6d2e4b32372c2791fc12e4d1d813f912346;hb=bd9f9d3fd6fbcff0112a7bf48ab9284da9576b11;hp=5695f4b532e9855c377e3747a5a88ee9fecfeef4;hpb=088daffdd823ed156b56a99090717b114e1de147;p=senf.git diff --git a/Packets/80211Bundle/WLANPacket.cc b/Packets/80211Bundle/WLANPacket.cc index 5695f4b..c704f6d 100644 --- a/Packets/80211Bundle/WLANPacket.cc +++ b/Packets/80211Bundle/WLANPacket.cc @@ -1,9 +1,9 @@ -// $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 // // 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 @@ -30,31 +30,18 @@ #define prefix_ -namespace -{ - -} - -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; } - //just to avoid compiler warning - //TODO - return addr1(); + return addr3(); } -prefix_ senf::MACAddressParser senf::WLANPacketParser_DataFrameParser::sa() +prefix_ senf::MACAddressParser senf::WLANPacket_DataFrameParser::sourceAddress() const { switch (dsBits()) @@ -75,7 +62,7 @@ prefix_ senf::MACAddressParser senf::WLANPacketParser_DataFrameParser::sa() return addr1(); } -prefix_ senf::MACAddressParser senf::WLANPacketParser_DataFrameParser::bssid() +prefix_ senf::MACAddressParser senf::WLANPacket_DataFrameParser::bssid() const { switch (dsBits()) @@ -94,44 +81,57 @@ prefix_ senf::MACAddressParser senf::WLANPacketParser_DataFrameParser::bssid() return addr1(); } -//shift some bits to read the 12bit sequence number bit field in LSB byte order -prefix_ boost::uint16_t senf::WLANPacketParser_MgtFrameParser::sequenceNumber() - const +prefix_ senf::PacketInterpreterBase::factory_t senf::WLANPacketType::nextPacketType(packet p) { - boost::uint16_t seqN = 0; - seqN |= seqNumber_2(); - seqN <<= 4; - seqN |= seqNumber_1(); - return seqN; + if (p->is_dataFrame() && (p->subtype()==0 || p->subtype()==8)) //data frame and subtype is Data or QoS Data + return LlcSnapPacket::factory(); + return no_factory(); } -//shift some bits to read the 12bit sequence number bit field in LSB byte order -prefix_ boost::uint16_t senf::WLANPacketParser_DataFrameParser::sequenceNumber() - const +prefix_ senf::PacketInterpreterBase::optional_range senf::WLANPacketType::nextPacketRange(packet p) { - boost::uint16_t seqN = 0; - seqN |= seqNumber_2(); - seqN <<= 4; - seqN |= seqNumber_1(); - return seqN; + if (p->is_dataFrame()) { + size_type sz = 24; //header length of wlan data frame (WDS is not considered) + if (p->subtype()==8) //subtype QoSData + sz+=2; //2 bytes for QoS field + return range( + boost::next(p.data().begin(),sz), + boost::prior(p.data().end(),4) ); //-4 bytes FCS + } + //TODO beacon frame payload + return no_range(); } prefix_ void senf::WLANPacketType::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 Frame:\n" + << " Type : " << unsigned( p->type()) << "\n" + << " Subtype : " << unsigned( p->subtype()) << "\n" + << " Retransmission : " << unsigned( p->retry()) << "\n" + << " Duration : " << unsigned( p->duration()) << "\n"; + if (p->is_mgtFrame()) { + os << " Management-Frame:\n" + << " BSSID : " << p->mgtFrame().bssid() << "\n" + << " Destination Address : " << p->mgtFrame().destinationAddress() << "\n" + << " Source Address : " << p->mgtFrame().sourceAddress() << "\n" + << " Sequence Number : " << unsigned( p->mgtFrame().sequenceNumber()) << "\n" + << " Fragment Number : " << unsigned( p->mgtFrame().fragmentNumber()) << "\n"; + } + if (p->is_ctrlFrame()) { + os << " Control-Frame "; + if (p->ctrlFrame().is_cts()) os << "(CTS):\n"; + if (p->ctrlFrame().is_ack()) os << "(ACK):\n"; + if (p->ctrlFrame().is_rts()) os << "(RTS):\n"; + os << " Receiver Address : " << p->ctrlFrame().receiverAddress() << "\n"; + if (p->ctrlFrame().is_rts()) + os << " Source Address : " << p->ctrlFrame().sourceAddress() << "\n"; + } + if (p->is_dataFrame()) { + os << " Data-Frame:\n" + << " Sequence Number : " << unsigned( p->dataFrame().sequenceNumber()) << "\n" + << " Fragment Number : " << unsigned( p->dataFrame().fragmentNumber()) << "\n"; } - };