From: g0dil Date: Fri, 20 Aug 2010 11:58:35 +0000 (+0000) Subject: Packets/80211Bundle: RadiotapPacktParser caches offset table X-Git-Url: http://g0dil.de/git?a=commitdiff_plain;h=5e6a9673486c8806d807702d1136443822a3ffa1;p=senf.git Packets/80211Bundle: RadiotapPacktParser caches offset table git-svn-id: https://svn.berlios.de/svnroot/repos/senf/trunk@1696 270642c3-0616-0410-b53a-bc976706d245 --- diff --git a/senf/Packets/80211Bundle/RadiotapPacket.cc b/senf/Packets/80211Bundle/RadiotapPacket.cc index 4bf458d..70a3c27 100644 --- a/senf/Packets/80211Bundle/RadiotapPacket.cc +++ b/senf/Packets/80211Bundle/RadiotapPacket.cc @@ -118,16 +118,6 @@ prefix_ void senf::RadiotapPacketParser::disable_fcs() } prefix_ senf::RadiotapPacketParser::OffsetTable const & -senf::RadiotapPacketParser::currentTable() - const -{ - OffsetTable & table (offsetTable(presentFlags())); - if (! table[MAX_INDEX+1]) - parseOffsetTable(&(*data().begin()), data().size(), table); - return table; -} - -prefix_ senf::RadiotapPacketParser::OffsetTable const & senf::RadiotapPacketParser::getTable(boost::uint32_t presentFlags) const { @@ -194,6 +184,7 @@ prefix_ void senf::RadiotapPacketParser::updatePresentFlags(boost::uint32_t flag b = newTable[index] + FIELD_SIZE[index]; } presentFlags() = flags; + currentTable_ = &newTable; } /////////////////////////////////////////////////////////////////////////// diff --git a/senf/Packets/80211Bundle/RadiotapPacket.cci b/senf/Packets/80211Bundle/RadiotapPacket.cci index 2164b40..606d6ce 100644 --- a/senf/Packets/80211Bundle/RadiotapPacket.cci +++ b/senf/Packets/80211Bundle/RadiotapPacket.cci @@ -35,7 +35,12 @@ prefix_ senf::RadiotapPacketParser::RadiotapPacketParser(data_iterator i, state_type s) : RadiotapPacketParser_Header(i,s) -{} +{ + OffsetTable & table (offsetTable(presentFlags())); + if (! table[MAX_INDEX+1]) + parseOffsetTable(&(*data().begin()), data().size(), table); + currentTable_ = &table; +} prefix_ senf::RadiotapPacketParser::size_type senf::RadiotapPacketParser::bytes() const @@ -77,6 +82,13 @@ prefix_ senf::RadiotapPacketParser::size_type senf::RadiotapPacketParser::calcul return currentTable()[MAX_INDEX+1]; } +prefix_ senf::RadiotapPacketParser::OffsetTable const & +senf::RadiotapPacketParser::currentTable() + const +{ + return *currentTable_; +} + ///////////////////////////////cci.e/////////////////////////////////////// #undef prefix_ diff --git a/senf/Packets/80211Bundle/RadiotapPacket.hh b/senf/Packets/80211Bundle/RadiotapPacket.hh index f6bd76e..bd932ca 100644 --- a/senf/Packets/80211Bundle/RadiotapPacket.hh +++ b/senf/Packets/80211Bundle/RadiotapPacket.hh @@ -135,41 +135,6 @@ namespace senf { SENF_PARSER_FIELD ( length, UInt16LSBParser ); SENF_PARSER_PRIVATE_FIELD ( presentFlags, UInt32LSBParser ); - SENF_PARSER_GOTO( presentFlags ); - - // present flags indicate which data fields are contained in the packet - // BEWARE: LSB-first bit-order !! - - // index: 7 - 0 - SENF_PARSER_BITFIELD_RO ( lockQualityPresent, 1, bool ); - SENF_PARSER_BITFIELD_RO ( dbmAntennaNoisePresent, 1, bool ); - SENF_PARSER_BITFIELD_RO ( dbmAntennaSignalPresent, 1, bool ); - SENF_PARSER_BITFIELD_RO ( fhssPresent, 1, bool ); - SENF_PARSER_BITFIELD_RO ( channelOptionsPresent, 1, bool ); - SENF_PARSER_BITFIELD_RO ( ratePresent, 1, bool ); - SENF_PARSER_BITFIELD_RO ( flagsPresent, 1, bool ); - SENF_PARSER_BITFIELD_RO ( tsftPresent, 1, bool ); - - // index: 15 - 8 - SENF_PARSER_BITFIELD_RO ( txFlagsPresent, 1, bool ); - SENF_PARSER_BITFIELD_RO ( rxFlagsPresent, 1, bool ); - SENF_PARSER_BITFIELD_RO ( dbAntennaNoisePresent, 1, bool ); - SENF_PARSER_BITFIELD_RO ( dbAntennaSignalPresent, 1, bool ); - SENF_PARSER_BITFIELD_RO ( antennaPresent, 1, bool ); - SENF_PARSER_BITFIELD_RO ( dbmTxAttenuationPresent, 1, bool ); - SENF_PARSER_BITFIELD_RO ( dbTxAttenuationPresent, 1, bool ); - SENF_PARSER_BITFIELD_RO ( txAttenuationPresent, 1, bool ); - - // index: 23 - 16 - SENF_PARSER_SKIP_BITS ( 6 ); - SENF_PARSER_BITFIELD_RO ( dataRetriesPresent, 1, bool ); - SENF_PARSER_BITFIELD_RO ( rtsRetriesPresent, 1, bool ); - - // index: 31 - 24 - SENF_PARSER_BITFIELD_RO ( extendedBitmaskPresent, 1, bool ); - SENF_PARSER_BITFIELD_RO ( vendorNamespacePresent, 1, bool ); - SENF_PARSER_BITFIELD_RO ( resetRadiotapNamespace, 1, bool ) - SENF_PARSER_SKIP_BITS ( 5 ); SENF_PARSER_FINALIZE ( RadiotapPacketParser_Header ); @@ -195,7 +160,11 @@ namespace senf { RTS_RETRIES_INDEX = 16, DATA_RETRIES_INDEX = 17, - MAX_INDEX = 17 + MAX_INDEX = 17, + + RADIOTOP_NS_INDEX = 29, + VENDOR_NS_INDEX = 30, + EXTENDED_BITMASK_INDEX = 31 }; enum PresentFlag { @@ -216,7 +185,11 @@ namespace senf { RX_FLAGS_FLAG = (1<(index); } \ - bool has_ ## name() { return name ## Present(); } \ + bool has_ ## name() { return currentTable()[index]; } \ + bool name ## Present() { return has_ ## name(); } \ type init_ ## name() { initField(index); return name(); } \ void disable_ ## name() { disableField(index); } @@ -255,7 +229,8 @@ namespace senf { // flags is special: disabling 'flags' must also disable the 'fcs' field typedef RadiotapPacketParser_Flags flags_t; flags_t flags() { return parseField(FLAGS_INDEX); } - bool has_flags() { return flagsPresent(); } + bool has_flags() { return currentTable()[FLAGS_INDEX]; } + bool flagsPresent() { return has_flags(); } flags_t init_flags() { initField(FLAGS_INDEX); return flags(); } void disable_flags() { disable_fcs(); disableField(FLAGS_INDEX); } @@ -315,6 +290,8 @@ namespace senf { void updatePresentFlags(boost::uint32_t flags); void insertRemoveBytes(unsigned from, unsigned to, int bytes); + OffsetTable const * currentTable_; + friend class RadiotapPacketType; }; diff --git a/senf/Packets/80211Bundle/RadiotapPacket.test.cc b/senf/Packets/80211Bundle/RadiotapPacket.test.cc index d5631fd..ed8d123 100644 --- a/senf/Packets/80211Bundle/RadiotapPacket.test.cc +++ b/senf/Packets/80211Bundle/RadiotapPacket.test.cc @@ -59,7 +59,7 @@ SENF_AUTO_UNIT_TEST(RadiotapPacket_packet) /* present flags */ BOOST_CHECK_EQUAL( p->tsftPresent(), true); BOOST_CHECK_EQUAL( p->flagsPresent(), true); - BOOST_CHECK_EQUAL( p->extendedBitmaskPresent(), false); + // BOOST_CHECK_EQUAL( p->extendedBitmaskPresent(), false); BOOST_CHECK_EQUAL( p->ratePresent(), true); BOOST_CHECK_EQUAL( p->channelOptionsPresent(), true); BOOST_CHECK_EQUAL( p->fhssPresent(), false);