Packets: Add StringParser ostream operation
[senf.git] / Packets / 80211Bundle / WLANPacket.cc
index 2f1c148..c704f6d 100644 (file)
@@ -81,6 +81,26 @@ prefix_ senf::MACAddressParser senf::WLANPacket_DataFrameParser::bssid()
     return addr1();
 }
 
+prefix_ senf::PacketInterpreterBase::factory_t senf::WLANPacketType::nextPacketType(packet p)
+{
+    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();
+}
+
+prefix_ senf::PacketInterpreterBase::optional_range senf::WLANPacketType::nextPacketRange(packet p)
+{
+    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)
 {
@@ -91,7 +111,7 @@ prefix_ void senf::WLANPacketType::dump(packet p, std::ostream &os)
        << "  Retransmission : " << unsigned( p->retry()) << "\n"
        << "  Duration       : " << unsigned( p->duration()) << "\n";
     if (p->is_mgtFrame()) {
-        os << "  Management-Frame:\n" 
+        os << "  Management-Frame:\n"
            << "    BSSID               : " << p->mgtFrame().bssid() << "\n"
            << "    Destination Address : " << p->mgtFrame().destinationAddress() << "\n"
            << "    Source Address      : " << p->mgtFrame().sourceAddress() << "\n"
@@ -109,8 +129,8 @@ prefix_ void senf::WLANPacketType::dump(packet p, std::ostream &os)
     }
     if (p->is_dataFrame()) {
         os << "  Data-Frame:\n"
-           << "    Sequence Number     : " << unsigned( p->mgtFrame().sequenceNumber()) << "\n"
-           << "    Fragment Number     : " << unsigned( p->mgtFrame().fragmentNumber()) << "\n";
+           << "    Sequence Number     : " << unsigned( p->dataFrame().sequenceNumber()) << "\n"
+           << "    Fragment Number     : " << unsigned( p->dataFrame().fragmentNumber()) << "\n";
     }
 };