Utils/Termlib: Extend the completion API
[senf.git] / Packets / 80211Bundle / WLANPacket.cc
1 // $Id$
2 //
3 // Copyright (C) 2008
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 // Competence Center NETwork research (NET), St. Augustin, GERMANY
6 //     Christian Niephaus <cni@berlios.de>
7 //
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
12 //
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 // GNU General Public License for more details.
17 //
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22
23 // Definition of non-inline non-template functions
24
25 // Custom includes
26 #include "WLANPacket.hh"
27 #include "../../Packets/Packets.hh"
28 #include "../DefaultBundle/LlcSnapPacket.hh"
29 #include <boost/io/ios_state.hpp>
30
31 #define prefix_
32
33 prefix_ senf::MACAddressParser senf::WLANPacket_DataFrameParser::destinationAddress()
34     const
35 {
36     switch (dsBits()) {
37     case 0 :
38     case 2 :
39         return addr1();
40     }
41     return addr3();
42 }
43
44 prefix_ senf::MACAddressParser senf::WLANPacket_DataFrameParser::sourceAddress()
45     const
46 {
47     switch (dsBits())
48     {
49     case 0 :
50     case 1 :
51         return addr2();
52         break;
53     case 2 :
54         return addr3();
55         break;
56 //TODO wds frames
57 //    case 3:
58 //        return addr4();
59     }
60     //just to avoid compiler warning
61     //TODO
62     return addr1();
63 }
64
65 prefix_ senf::MACAddressParser senf::WLANPacket_DataFrameParser::bssid()
66     const
67 {
68     switch (dsBits())
69     {
70     case 0 :
71         return addr3();
72         break;
73     case 1 :
74         return addr1();
75         break;
76     case 2:
77         return addr2();
78     }
79     //just to avoid compiler warning
80     //TODO
81     return addr1();
82 }
83
84 prefix_ senf::PacketInterpreterBase::factory_t senf::WLANPacketType::nextPacketType(packet p)
85 {
86     if (p->is_dataFrame() && (p->subtype()==0 || p->subtype()==8)) //data frame and subtype is Data or QoS Data
87         return LlcSnapPacket::factory();
88     return no_factory();
89 }
90
91 prefix_ senf::PacketInterpreterBase::optional_range senf::WLANPacketType::nextPacketRange(packet p)
92 {
93     if (p->is_dataFrame()) {
94         size_type sz = 24; //header length of wlan data frame (WDS is not considered)
95         if (p->subtype()==8) //subtype QoSData
96             sz+=2;  //2 bytes for QoS field
97         return range(
98                 boost::next(p.data().begin(),sz),
99                 boost::prior(p.data().end(),4) ); //-4 bytes FCS
100     }
101     //TODO beacon frame payload
102     return no_range();
103 }
104
105 prefix_ void senf::WLANPacketType::dump(packet p, std::ostream &os)
106 {
107     boost::io::ios_all_saver ias(os);
108     os << "802.11 MAC Frame:\n"
109        << "  Type           : " << unsigned( p->type()) << "\n"
110        << "  Subtype        : " << unsigned( p->subtype()) << "\n"
111        << "  Retransmission : " << unsigned( p->retry()) << "\n"
112        << "  Duration       : " << unsigned( p->duration()) << "\n";
113     if (p->is_mgtFrame()) {
114         os << "  Management-Frame:\n"
115            << "    BSSID               : " << p->mgtFrame().bssid() << "\n"
116            << "    Destination Address : " << p->mgtFrame().destinationAddress() << "\n"
117            << "    Source Address      : " << p->mgtFrame().sourceAddress() << "\n"
118            << "    Sequence Number     : " << unsigned( p->mgtFrame().sequenceNumber()) << "\n"
119            << "    Fragment Number     : " << unsigned( p->mgtFrame().fragmentNumber()) << "\n";
120     }
121     if (p->is_ctrlFrame()) {
122         os << "  Control-Frame ";
123         if (p->ctrlFrame().is_cts()) os << "(CTS):\n";
124         if (p->ctrlFrame().is_ack()) os << "(ACK):\n";
125         if (p->ctrlFrame().is_rts()) os << "(RTS):\n";
126         os << "    Receiver Address : " << p->ctrlFrame().receiverAddress() << "\n";
127         if (p->ctrlFrame().is_rts())
128             os << "    Source Address : " << p->ctrlFrame().sourceAddress() << "\n";
129     }
130     if (p->is_dataFrame()) {
131         os << "  Data-Frame:\n"
132            << "    Sequence Number     : " << unsigned( p->dataFrame().sequenceNumber()) << "\n"
133            << "    Fragment Number     : " << unsigned( p->dataFrame().fragmentNumber()) << "\n";
134     }
135 };
136
137
138
139
140 #undef prefix_