switch to new MPL based Fraunhofer FOKUS Public License
[senf.git] / senf / Packets / 80211Bundle / WLANPacket.cc
1 // $Id$
2 //
3 // Copyright (C) 2008
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 //
6 // The contents of this file are subject to the Fraunhofer FOKUS Public License
7 // Version 1.0 (the "License"); you may not use this file except in compliance
8 // with the License. You may obtain a copy of the License at 
9 // http://senf.berlios.de/license.html
10 //
11 // The Fraunhofer FOKUS Public License Version 1.0 is based on, 
12 // but modifies the Mozilla Public License Version 1.1.
13 // See the full license text for the amendments.
14 //
15 // Software distributed under the License is distributed on an "AS IS" basis, 
16 // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 
17 // for the specific language governing rights and limitations under the License.
18 //
19 // The Original Code is Fraunhofer FOKUS code.
20 //
21 // The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V. 
22 // (registered association), Hansastraße 27 c, 80686 Munich, Germany.
23 // All Rights Reserved.
24 //
25 // Contributor(s):
26 //   Christian Niephaus <cni@berlios.de>
27
28
29 // Definition of non-inline non-template functions
30
31 #include "WLANPacket.hh"
32 //#include "WLANPacket.ih"
33
34 // Custom includes
35 #include <boost/io/ios_state.hpp>
36
37 #define prefix_
38 //-/////////////////////////////////////////////////////////////////////////////////////////////////
39
40 namespace {
41     void dumpBase(senf::WLANPacketParser const & p, std::ostream & os)
42     {
43         os << "  version                 : " << unsigned(p.version()) <<"\n"
44            << "  type                    : " << unsigned(p.type()) << "\n"
45            << "  subtype                 : " << unsigned(p.subtype()) << "\n"
46            << "  flags                   :";
47         if ( p.toDS()           ) os << " toDS";
48         if ( p.fromDS()         ) os << " fromDS";
49         if ( p.moreFrag()       ) os << " moreFrag";
50         if ( p.retry()          ) os << " retry";
51         if ( p.pwrMgt()         ) os << " pwrMgt";
52         if ( p.moreData()       ) os << " moreData";
53         if ( p.protectedFrame() ) os << " protected";
54         if ( p.order()          ) os << " order";
55
56         if ( !(p.toDS() || p.fromDS() || p.moreFrag() || p.retry() || p.pwrMgt() ||
57                p.moreData() || p.protectedFrame() || p.order()) )
58             os << " none";
59         os << "\n"
60            << "  duration                : " << unsigned(p.duration()) << "\n";
61     }
62 }
63
64 prefix_ void senf::WLANPacket_MgtFrameParser::sequenceNumber(boost::uint16_t sn)
65 {
66     seqNumber_2() = 0u | (sn >> 4 ) ;
67     seqNumber_1() = 0u | sn;
68 }
69
70 prefix_ void senf::WLANPacket_MgtFrameType::dump(packet p, std::ostream & os)
71 {
72     boost::io::ios_all_saver ias(os);
73     os << "802.11 MAC Management Frame:\n";
74     dumpBase(p.parser(), os);
75     os << senf::fieldName("destination")           << p->destinationAddress() << "\n"
76        << senf::fieldName("source")                << p->sourceAddress() << "\n"
77        << senf::fieldName("bss id")                << p->bssid() << "\n"
78        << senf::fieldName("sequence number")       << p->sequenceNumber() << "\n"
79        << senf::fieldName("fragment number")       << p->fragmentNumber() << "\n";
80 }
81
82 prefix_ void senf::WLANPacket_CtrlFrameType::dump(packet p, std::ostream & os)
83 {
84     boost::io::ios_all_saver ias(os);
85     os << "802.11 MAC Control Frame:\n";
86     dumpBase(p.parser(), os);
87     os << senf::fieldName("receiver")              << p->receiverAddress() << "\n";
88     if (p->is_rts())
89         os << senf::fieldName("source")                << p->sourceAddress() << "\n";
90 }
91
92 prefix_ void senf::WLANPacket_DataFrameParser::sequenceNumber(boost::uint16_t sn)
93 {
94     seqNumber_2() = 0u | (sn >> 4 ) ;
95     seqNumber_1() = 0u | sn;
96 }
97
98 prefix_ senf::MACAddressParser senf::WLANPacket_DataFrameParser::destinationAddress()
99     const
100 {
101     switch (dsBits()) {
102     case 0 :
103     case 2 :
104         return addr1();
105     default:
106         return addr3();
107     }
108 }
109
110 prefix_ senf::MACAddressParser senf::WLANPacket_DataFrameParser::sourceAddress()
111     const
112 {
113     switch (dsBits()) {
114     case 0 :
115     case 1 :
116         return addr2();
117     // TODO wds frames
118     // case 3 : return addr4();
119     default:
120         return addr3();
121     }
122 }
123
124 prefix_ senf::MACAddressParser senf::WLANPacket_DataFrameParser::bssid()
125     const
126 {
127     switch (dsBits()) {
128     case 0 :
129         return addr3();
130     case 1 :
131         return addr1();
132     default:
133         return addr2();
134     }
135 }
136
137 prefix_ void senf::WLANPacket_DataFrameType::dump(packet p, std::ostream & os)
138 {
139     boost::io::ios_all_saver ias(os);
140     os << "802.11 MAC Data Frame:\n";
141     dumpBase(p.parser(), os);
142     os << senf::fieldName("destination")               << p->destinationAddress();
143     if (p->dsBits()==0 || p->dsBits()==2) os << " (receiver)";
144     os << "\n"
145        << senf::fieldName("source")                    << p->sourceAddress();
146     if (p->dsBits()==0 || p->dsBits()==1) os << " (transmitter)";
147     os << "\n"
148        << senf::fieldName("bss id")                    << p->bssid();
149     if (p->dsBits()==1) os << " (receiver)";
150     else if (p->dsBits()!=0) os << " (transmitter)";
151     os << "\n"
152        << senf::fieldName("sequence number")           << p->sequenceNumber() << "\n"
153        << senf::fieldName("fragment number")           << p->fragmentNumber() << "\n";
154     if (p->has_qosField())
155         os << senf::fieldName("QOS data")              << p->qosField() << "\n";
156 }
157
158 //-/////////////////////////////////////////////////////////////////////////////////////////////////
159 #undef prefix_
160
161 \f
162 // Local Variables:
163 // mode: c++
164 // fill-column: 100
165 // c-file-style: "senf"
166 // indent-tabs-mode: nil
167 // ispell-local-dictionary: "american"
168 // compile-command: "scons -u test"
169 // comment-column: 40
170 // End: