00001 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */ 00002 /* 00003 * Copyright (c) 2006 INRIA 00004 * 00005 * This program is free software; you can redistribute it and/or modify 00006 * it under the terms of the GNU General Public License version 2 as 00007 * published by the Free Software Foundation; 00008 * 00009 * This program is distributed in the hope that it will be useful, 00010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00012 * GNU General Public License for more details. 00013 * 00014 * You should have received a copy of the GNU General Public License 00015 * along with this program; if not, write to the Free Software 00016 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00017 * 00018 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr> 00019 */ 00020 #include "mgt-headers.h" 00021 #include "ns3/simulator.h" 00022 #include "ns3/assert.h" 00023 00024 namespace ns3 { 00025 00026 /*********************************************************** 00027 * Probe Request 00028 ***********************************************************/ 00029 00030 NS_OBJECT_ENSURE_REGISTERED (MgtProbeRequestHeader); 00031 00032 MgtProbeRequestHeader::~MgtProbeRequestHeader () 00033 {} 00034 00035 void 00036 MgtProbeRequestHeader::SetSsid (Ssid ssid) 00037 { 00038 m_ssid = ssid; 00039 } 00040 Ssid 00041 MgtProbeRequestHeader::GetSsid (void) const 00042 { 00043 return m_ssid; 00044 } 00045 void 00046 MgtProbeRequestHeader::SetSupportedRates (SupportedRates rates) 00047 { 00048 m_rates = rates; 00049 } 00050 00051 SupportedRates 00052 MgtProbeRequestHeader::GetSupportedRates (void) const 00053 { 00054 return m_rates; 00055 } 00056 uint32_t 00057 MgtProbeRequestHeader::GetSerializedSize (void) const 00058 { 00059 uint32_t size = 0; 00060 size += m_ssid.GetSerializedSize (); 00061 size += m_rates.GetSerializedSize (); 00062 return size; 00063 } 00064 TypeId 00065 MgtProbeRequestHeader::GetTypeId (void) 00066 { 00067 static TypeId tid = TypeId ("ns3::MgtProbeRequestHeader") 00068 .SetParent<Header> () 00069 .AddConstructor<MgtProbeRequestHeader> () 00070 ; 00071 return tid; 00072 } 00073 TypeId 00074 MgtProbeRequestHeader::GetInstanceTypeId (void) const 00075 { 00076 return GetTypeId (); 00077 } 00078 void 00079 MgtProbeRequestHeader::Print (std::ostream &os) const 00080 { 00081 os << "ssid="<<m_ssid<<", " 00082 << "rates="<<m_rates; 00083 } 00084 void 00085 MgtProbeRequestHeader::Serialize (Buffer::Iterator start) const 00086 { 00087 Buffer::Iterator i = start; 00088 i = m_ssid.Serialize (i); 00089 i = m_rates.Serialize (i); 00090 } 00091 uint32_t 00092 MgtProbeRequestHeader::Deserialize (Buffer::Iterator start) 00093 { 00094 Buffer::Iterator i = start; 00095 i = m_ssid.Deserialize (i); 00096 i = m_rates.Deserialize (i); 00097 return i.GetDistanceFrom (start); 00098 } 00099 00100 00101 /*********************************************************** 00102 * Probe Response 00103 ***********************************************************/ 00104 00105 NS_OBJECT_ENSURE_REGISTERED (MgtProbeResponseHeader); 00106 00107 MgtProbeResponseHeader::MgtProbeResponseHeader () 00108 {} 00109 MgtProbeResponseHeader::~MgtProbeResponseHeader () 00110 {} 00111 00112 Ssid 00113 MgtProbeResponseHeader::GetSsid (void) const 00114 { 00115 return m_ssid; 00116 } 00117 uint64_t 00118 MgtProbeResponseHeader::GetBeaconIntervalUs (void) const 00119 { 00120 return m_beaconInterval; 00121 } 00122 SupportedRates 00123 MgtProbeResponseHeader::GetSupportedRates (void) const 00124 { 00125 return m_rates; 00126 } 00127 00128 void 00129 MgtProbeResponseHeader::SetSsid (Ssid ssid) 00130 { 00131 m_ssid = ssid; 00132 } 00133 void 00134 MgtProbeResponseHeader::SetBeaconIntervalUs (uint64_t us) 00135 { 00136 m_beaconInterval = us; 00137 } 00138 void 00139 MgtProbeResponseHeader::SetSupportedRates (SupportedRates rates) 00140 { 00141 m_rates = rates; 00142 } 00143 TypeId 00144 MgtProbeResponseHeader::GetTypeId (void) 00145 { 00146 static TypeId tid = TypeId ("ns3::MgtProbeResponseHeader") 00147 .SetParent<Header> () 00148 .AddConstructor<MgtProbeResponseHeader> () 00149 ; 00150 return tid; 00151 } 00152 TypeId 00153 MgtProbeResponseHeader::GetInstanceTypeId (void) const 00154 { 00155 return GetTypeId (); 00156 } 00157 uint32_t 00158 MgtProbeResponseHeader::GetSerializedSize (void) const 00159 { 00160 uint32_t size = 0; 00161 size += 8; // timestamp 00162 size += 2; // beacon interval 00163 size += m_capability.GetSerializedSize (); 00164 size += m_ssid.GetSerializedSize (); 00165 size += m_rates.GetSerializedSize (); 00166 //size += 3; // ds parameter set 00167 // xxx 00168 return size; 00169 } 00170 void 00171 MgtProbeResponseHeader::Print (std::ostream &os) const 00172 { 00173 os << "ssid="<<m_ssid<<", " 00174 << "rates="<<m_rates; 00175 } 00176 void 00177 MgtProbeResponseHeader::Serialize (Buffer::Iterator start) const 00178 { 00179 // timestamp 00180 // beacon interval 00181 // capability information 00182 // ssid 00183 // supported rates 00184 // fh parameter set 00185 // ds parameter set 00186 // cf parameter set 00187 // ibss parameter set 00188 //XXX 00189 Buffer::Iterator i = start; 00190 i.WriteHtonU64 (Simulator::Now ().GetMicroSeconds ()); 00191 i.WriteHtonU16 (m_beaconInterval / 1024); 00192 i = m_capability.Serialize (i); 00193 i = m_ssid.Serialize (i); 00194 i = m_rates.Serialize (i); 00195 //i.WriteU8 (0, 3); // ds parameter set. 00196 } 00197 uint32_t 00198 MgtProbeResponseHeader::Deserialize (Buffer::Iterator start) 00199 { 00200 Buffer::Iterator i = start; 00201 i.Next (8); // timestamp 00202 m_beaconInterval = i.ReadNtohU16 (); 00203 m_beaconInterval *= 1024; 00204 i = m_capability.Deserialize (i); 00205 i = m_ssid.Deserialize (i); 00206 i = m_rates.Deserialize (i); 00207 //i.Next (3); // ds parameter set 00208 return i.GetDistanceFrom (start); 00209 } 00210 00211 /*********************************************************** 00212 * Assoc Request 00213 ***********************************************************/ 00214 00215 NS_OBJECT_ENSURE_REGISTERED (MgtAssocRequestHeader); 00216 00217 MgtAssocRequestHeader::MgtAssocRequestHeader () 00218 : m_listenInterval (0) 00219 {} 00220 MgtAssocRequestHeader::~MgtAssocRequestHeader () 00221 {} 00222 00223 void 00224 MgtAssocRequestHeader::SetSsid (Ssid ssid) 00225 { 00226 m_ssid = ssid; 00227 } 00228 void 00229 MgtAssocRequestHeader::SetSupportedRates (SupportedRates rates) 00230 { 00231 m_rates = rates; 00232 } 00233 void 00234 MgtAssocRequestHeader::SetListenInterval (uint16_t interval) 00235 { 00236 m_listenInterval = interval; 00237 } 00238 Ssid 00239 MgtAssocRequestHeader::GetSsid (void) const 00240 { 00241 return m_ssid; 00242 } 00243 SupportedRates 00244 MgtAssocRequestHeader::GetSupportedRates (void) const 00245 { 00246 return m_rates; 00247 } 00248 uint16_t 00249 MgtAssocRequestHeader::GetListenInterval (void) const 00250 { 00251 return m_listenInterval; 00252 } 00253 00254 TypeId 00255 MgtAssocRequestHeader::GetTypeId (void) 00256 { 00257 static TypeId tid = TypeId ("ns3::MgtAssocRequestHeader") 00258 .SetParent<Header> () 00259 .AddConstructor<MgtAssocRequestHeader> () 00260 ; 00261 return tid; 00262 } 00263 TypeId 00264 MgtAssocRequestHeader::GetInstanceTypeId (void) const 00265 { 00266 return GetTypeId (); 00267 } 00268 uint32_t 00269 MgtAssocRequestHeader::GetSerializedSize (void) const 00270 { 00271 uint32_t size = 0; 00272 size += m_capability.GetSerializedSize (); 00273 size += 2; 00274 size += m_ssid.GetSerializedSize (); 00275 size += m_rates.GetSerializedSize (); 00276 return size; 00277 } 00278 void 00279 MgtAssocRequestHeader::Print (std::ostream &os) const 00280 { 00281 os << "ssid="<<m_ssid<<", " 00282 << "rates="<<m_rates; 00283 } 00284 void 00285 MgtAssocRequestHeader::Serialize (Buffer::Iterator start) const 00286 { 00287 Buffer::Iterator i = start; 00288 i = m_capability.Serialize (i); 00289 i.WriteHtonU16 (m_listenInterval); 00290 i = m_ssid.Serialize (i); 00291 i = m_rates.Serialize (i); 00292 } 00293 uint32_t 00294 MgtAssocRequestHeader::Deserialize (Buffer::Iterator start) 00295 { 00296 Buffer::Iterator i = start; 00297 i = m_capability.Deserialize (i); 00298 m_listenInterval = i.ReadNtohU16 (); 00299 i = m_ssid.Deserialize (i); 00300 i = m_rates.Deserialize (i); 00301 return i.GetDistanceFrom (start); 00302 } 00303 00304 /*********************************************************** 00305 * Assoc Response 00306 ***********************************************************/ 00307 00308 NS_OBJECT_ENSURE_REGISTERED (MgtAssocResponseHeader); 00309 00310 MgtAssocResponseHeader::MgtAssocResponseHeader () 00311 : m_aid (0) 00312 {} 00313 MgtAssocResponseHeader::~MgtAssocResponseHeader () 00314 {} 00315 00316 StatusCode 00317 MgtAssocResponseHeader::GetStatusCode (void) 00318 { 00319 return m_code; 00320 } 00321 SupportedRates 00322 MgtAssocResponseHeader::GetSupportedRates (void) 00323 { 00324 return m_rates; 00325 } 00326 void 00327 MgtAssocResponseHeader::SetStatusCode (StatusCode code) 00328 { 00329 m_code = code; 00330 } 00331 void 00332 MgtAssocResponseHeader::SetSupportedRates (SupportedRates rates) 00333 { 00334 m_rates = rates; 00335 } 00336 00337 TypeId 00338 MgtAssocResponseHeader::GetTypeId (void) 00339 { 00340 static TypeId tid = TypeId ("ns3::MgtAssocResponseHeader") 00341 .SetParent<Header> () 00342 .AddConstructor<MgtAssocResponseHeader> () 00343 ; 00344 return tid; 00345 } 00346 TypeId 00347 MgtAssocResponseHeader::GetInstanceTypeId (void) const 00348 { 00349 return GetTypeId (); 00350 } 00351 uint32_t 00352 MgtAssocResponseHeader::GetSerializedSize (void) const 00353 { 00354 uint32_t size = 0; 00355 size += m_capability.GetSerializedSize (); 00356 size += m_code.GetSerializedSize (); 00357 size += 2; // aid 00358 size += m_rates.GetSerializedSize (); 00359 return size; 00360 } 00361 00362 void 00363 MgtAssocResponseHeader::Print (std::ostream &os) const 00364 { 00365 os << "status code="<<m_code<<", " 00366 << "rates="<<m_rates; 00367 } 00368 void 00369 MgtAssocResponseHeader::Serialize (Buffer::Iterator start) const 00370 { 00371 Buffer::Iterator i = start; 00372 i = m_capability.Serialize (i); 00373 i = m_code.Serialize (i); 00374 i.WriteHtonU16 (m_aid); 00375 i = m_rates.Serialize (i); 00376 } 00377 uint32_t 00378 MgtAssocResponseHeader::Deserialize (Buffer::Iterator start) 00379 { 00380 Buffer::Iterator i = start; 00381 i = m_capability.Deserialize (i); 00382 i = m_code.Deserialize (i); 00383 m_aid = i.ReadNtohU16 (); 00384 i = m_rates.Deserialize (i); 00385 return i.GetDistanceFrom (start); 00386 } 00387 00388 } // namespace ns3