Utils/Console: Add short help to 'ls' output
[senf.git] / Packets / 80211Bundle / WLANPacket.cc
index 33a2809..c704f6d 100644 (file)
 
 #define prefix_
 
-prefix_ senf::MACAddressParser senf::WLANPacket_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::WLANPacket_DataFrameParser::sa()
+prefix_ senf::MACAddressParser senf::WLANPacket_DataFrameParser::sourceAddress()
     const
 {
     switch (dsBits())
@@ -89,44 +81,57 @@ prefix_ senf::MACAddressParser senf::WLANPacket_DataFrameParser::bssid()
     return addr1();
 }
 
-//shift some bits to read the 12bit sequence number bit field in LSB byte order
-prefix_ boost::uint16_t senf::WLANPacket_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::WLANPacket_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 Address : " << p->mgtFrame().destinationAddress() << "\n";
-        os << "  Source Address      : " << p->mgtFrame().sourceAddress() << "\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";
     }
-
 };