Packets/80211Bundle: RadiotapPacktParser caches offset table
g0dil [Fri, 20 Aug 2010 11:58:35 +0000 (11:58 +0000)]
git-svn-id: https://svn.berlios.de/svnroot/repos/senf/trunk@1696 270642c3-0616-0410-b53a-bc976706d245

senf/Packets/80211Bundle/RadiotapPacket.cc
senf/Packets/80211Bundle/RadiotapPacket.cci
senf/Packets/80211Bundle/RadiotapPacket.hh
senf/Packets/80211Bundle/RadiotapPacket.test.cc

index 4bf458d..70a3c27 100644 (file)
@@ -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;
 }
 
 ///////////////////////////////////////////////////////////////////////////
index 2164b40..606d6ce 100644 (file)
 
 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_
 
index f6bd76e..bd932ca 100644 (file)
@@ -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<<RX_FLAGS_INDEX),
             TX_FLAGS_FLAG           = (1<<TX_FLAGS_INDEX),
             RTS_RETRIES_FLAG        = (1<<RTS_RETRIES_INDEX),
-            DATA_RETRIES_FLAG       = (1<<DATA_RETRIES_INDEX)
+            DATA_RETRIES_FLAG       = (1<<DATA_RETRIES_INDEX),
+
+            RADIOTOP_NS_FLAG        = (1<<RADIOTOP_NS_INDEX),
+            VENDOR_NS_FLAG          = (1<<VENDOR_NS_INDEX),
+            EXTENDED_BITMASK_FLAG   = (1<<EXTENDED_BITMASK_INDEX)
         };
 
         static unsigned const FIELD_SIZE[MAX_INDEX+2];
@@ -246,7 +219,8 @@ namespace senf {
 #       define FIELD(name,type,index)                                   \
             typedef type name ## _t;                                    \
             type name() { return parseField<type>(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_t>(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;
     };
 
index d5631fd..ed8d123 100644 (file)
@@ -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);