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)
{
<< " 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"
}
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";
}
};