Packets: extended description of bad_cast exception in Packet.as()
[senf.git] / senf / Packets / 80211Bundle / WLANPacket.hh
index ddbe46c..4a91e39 100644 (file)
@@ -30,7 +30,7 @@
 #include <senf/Packets/DefaultBundle/EthernetPacket.hh>
 #include <senf/Packets/DefaultBundle/LlcSnapPacket.hh>
 
-///////////////////////////////hh.p////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 
 namespace senf
 {
@@ -66,7 +66,7 @@ namespace senf
         SENF_PARSER_FINALIZE(WLANPacketParser);
     };
 
-    ///////////////////////////////////////////////////////////////////////////
+    //-////////////////////////////////////////////////////////////////////////
 
     /** \brief Management frame parser
         <b>Re-ordering of bits due to LSB byte order</b>
@@ -120,7 +120,7 @@ namespace senf
         using mixin::initSize;
         using PacketTypeBase::nextPacketRange;
 
-        static void dump(packet p, std::ostream &os);
+        static void dump(packet p, std::ostream & os);
     };
 
     /** \brief WLAN Management frame packet typedef
@@ -128,7 +128,7 @@ namespace senf
      */
     typedef WLANPacket_MgtFrameType::packet WLANPacket_MgtFrame;
 
-    ///////////////////////////////////////////////////////////////////////////
+    //-////////////////////////////////////////////////////////////////////////
 
     /** \brief Control frame parser
         <b>Re-ordering of bits due to LSB byte order</b>
@@ -178,7 +178,7 @@ namespace senf
         using mixin::initSize;
         using PacketTypeBase::nextPacketRange;
 
-        static void dump(packet p, std::ostream &os);
+        static void dump(packet p, std::ostream & os);
     };
 
     /** \brief WLAN Control frame packet typedef
@@ -186,7 +186,7 @@ namespace senf
      */
     typedef WLANPacket_CtrlFrameType::packet WLANPacket_CtrlFrame;
 
-    ///////////////////////////////////////////////////////////////////////////
+    //-////////////////////////////////////////////////////////////////////////
 
     /** \brief Data frame parser
         <b>Re-ordering of bits due to LSB byte order</b>
@@ -197,27 +197,36 @@ namespace senf
 
         SENF_PARSER_INHERIT(WLANPacketParser);
 
-        SENF_PARSER_GOTO(subtype);
-        SENF_PARSER_SKIP_BITS(14);                                //<pkgdraw: hide
-        SENF_PARSER_PRIVATE_BITFIELD ( dsBits,  2,  unsigned   ); //<pkgdraw: hide
-        SENF_PARSER_SKIP             ( 2, 2                    ); //<pkgdraw: hide
+    protected:
+        typedef UIntFieldParser<6, 6+2> dsBits_t;
+        dsBits_t::value_type dsBits() const { return parse<dsBits_t>( 1); }
 
-        SENF_PARSER_PRIVATE_FIELD    ( addr1, MACAddressParser );
-        SENF_PARSER_PRIVATE_FIELD    ( addr2, MACAddressParser );
-        SENF_PARSER_PRIVATE_FIELD    ( addr3, MACAddressParser );
+        MACAddressParser addr1() const { return parse<MACAddressParser>(  4); }
+        MACAddressParser addr2() const { return parse<MACAddressParser>( 10); }
+        MACAddressParser addr3() const { return parse<MACAddressParser>( 16); }
 
         //sequence Number and fragment number
         //shift bits manually due to LSB
-        SENF_PARSER_PRIVATE_BITFIELD ( seqNumber_1,    4, unsigned );
-        SENF_PARSER_BITFIELD         ( fragmentNumber, 4, unsigned );
-        SENF_PARSER_PRIVATE_FIELD    ( seqNumber_2,    UInt8Parser );
 
+        typedef UIntFieldParser<0, 0+4> seqNumber_1_t;
+        seqNumber_1_t seqNumber_1() const { return parse<seqNumber_1_t>( 22); }
+
+    public:
+        typedef UIntFieldParser<4, 4+4> fragmentNumber_t;
+        fragmentNumber_t fragmentNumber() const { return parse<fragmentNumber_t>( 22); }
+
+    protected:
+        UInt8Parser seqNumber_2() const { return parse<UInt8Parser>( 23); }
+
+    public:
         boost::uint16_t sequenceNumber() const {
             return (uint16_t)(seqNumber_2()) << 4 | seqNumber_1();
         };
 
         void sequenceNumber(boost::uint16_t sn);
 
+        SENF_PARSER_GOTO_OFFSET( 24, 24);
+
         // TODO fourth address field in case of WDS
         // SENF_PARSER_PRIVATE_VARIANT (wds_, dsBits,
         //     ( novalue ( disable_addr4,               VoidPacketParser ))
@@ -273,7 +282,7 @@ namespace senf
                 : no_factory();
         }
 
-        static void dump(packet p, std::ostream &os);
+        static void dump(packet p, std::ostream & os);
     };
 
     /** \brief WLAN Data frame packet typedef
@@ -282,7 +291,7 @@ namespace senf
     typedef WLANPacket_DataFrameType::packet WLANPacket_DataFrame;
 }
 
-///////////////////////////////hh.e////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
 //#include "WLANPacket.cci"
 //#include "WLANPacket.ct"
 //#include "WLANPacket.cti"