133 { |
137 { |
134 m_ctrlType = TYPE_CTL; |
138 m_ctrlType = TYPE_CTL; |
135 m_ctrlSubtype = 9; |
139 m_ctrlSubtype = 9; |
136 } |
140 } |
137 |
141 |
138 void |
142 void |
139 WifiMacHeader::SetTypeData (void) |
143 WifiMacHeader::SetTypeData (void) |
140 { |
144 { |
141 m_ctrlType = TYPE_DATA; |
145 m_ctrlType = TYPE_DATA; |
142 m_ctrlSubtype = 0; |
146 m_ctrlSubtype = 0; |
143 } |
147 } |
144 void |
148 void |
145 WifiMacHeader::SetAction (void) |
149 WifiMacHeader::SetAction (void) |
146 { |
150 { |
147 m_ctrlType = TYPE_MGT; |
151 m_ctrlType = TYPE_MGT; |
148 m_ctrlSubtype = 0x0D; |
152 m_ctrlSubtype = 0x0D; |
149 } |
153 } |
150 void |
154 void |
151 WifiMacHeader::SetMultihopAction (void) |
155 WifiMacHeader::SetMultihopAction (void) |
152 { |
156 { |
153 m_ctrlType = TYPE_MGT; |
157 m_ctrlType = TYPE_MGT; |
154 m_ctrlSubtype = 0x0F; |
158 m_ctrlSubtype = 0x0F; |
155 } |
159 } |
156 void |
160 void |
157 WifiMacHeader::SetType (enum WifiMacType type) |
161 WifiMacHeader::SetType (enum WifiMacType type) |
158 { |
162 { |
159 switch (type) { |
163 switch (type) |
160 case WIFI_MAC_CTL_BACKREQ: |
164 { |
161 m_ctrlType = TYPE_CTL; |
165 case WIFI_MAC_CTL_BACKREQ: |
162 m_ctrlSubtype = SUBTYPE_CTL_BACKREQ; |
166 m_ctrlType = TYPE_CTL; |
163 break; |
167 m_ctrlSubtype = SUBTYPE_CTL_BACKREQ; |
164 case WIFI_MAC_CTL_BACKRESP: |
168 break; |
165 m_ctrlType = TYPE_CTL; |
169 case WIFI_MAC_CTL_BACKRESP: |
166 m_ctrlSubtype = SUBTYPE_CTL_BACKRESP; |
170 m_ctrlType = TYPE_CTL; |
167 break; |
171 m_ctrlSubtype = SUBTYPE_CTL_BACKRESP; |
168 case WIFI_MAC_CTL_RTS: |
172 break; |
169 m_ctrlType = TYPE_CTL; |
173 case WIFI_MAC_CTL_RTS: |
170 m_ctrlSubtype = SUBTYPE_CTL_RTS; |
174 m_ctrlType = TYPE_CTL; |
171 break; |
175 m_ctrlSubtype = SUBTYPE_CTL_RTS; |
172 case WIFI_MAC_CTL_CTS: |
176 break; |
173 m_ctrlType = TYPE_CTL; |
177 case WIFI_MAC_CTL_CTS: |
174 m_ctrlSubtype = SUBTYPE_CTL_CTS; |
178 m_ctrlType = TYPE_CTL; |
175 break; |
179 m_ctrlSubtype = SUBTYPE_CTL_CTS; |
176 case WIFI_MAC_CTL_ACK: |
180 break; |
177 m_ctrlType = TYPE_CTL; |
181 case WIFI_MAC_CTL_ACK: |
178 m_ctrlSubtype = SUBTYPE_CTL_ACK; |
182 m_ctrlType = TYPE_CTL; |
179 break; |
183 m_ctrlSubtype = SUBTYPE_CTL_ACK; |
180 case WIFI_MAC_MGT_ASSOCIATION_REQUEST: |
184 break; |
181 m_ctrlType = TYPE_MGT; |
185 case WIFI_MAC_MGT_ASSOCIATION_REQUEST: |
182 m_ctrlSubtype = 0; |
186 m_ctrlType = TYPE_MGT; |
183 break; |
187 m_ctrlSubtype = 0; |
184 case WIFI_MAC_MGT_ASSOCIATION_RESPONSE: |
188 break; |
185 m_ctrlType = TYPE_MGT; |
189 case WIFI_MAC_MGT_ASSOCIATION_RESPONSE: |
186 m_ctrlSubtype = 1; |
190 m_ctrlType = TYPE_MGT; |
187 break; |
191 m_ctrlSubtype = 1; |
188 case WIFI_MAC_MGT_REASSOCIATION_REQUEST: |
192 break; |
189 m_ctrlType = TYPE_MGT; |
193 case WIFI_MAC_MGT_REASSOCIATION_REQUEST: |
190 m_ctrlSubtype = 2; |
194 m_ctrlType = TYPE_MGT; |
191 break; |
195 m_ctrlSubtype = 2; |
192 case WIFI_MAC_MGT_REASSOCIATION_RESPONSE: |
196 break; |
193 m_ctrlType = TYPE_MGT; |
197 case WIFI_MAC_MGT_REASSOCIATION_RESPONSE: |
194 m_ctrlSubtype = 3; |
198 m_ctrlType = TYPE_MGT; |
195 break; |
199 m_ctrlSubtype = 3; |
196 case WIFI_MAC_MGT_PROBE_REQUEST: |
200 break; |
197 m_ctrlType = TYPE_MGT; |
201 case WIFI_MAC_MGT_PROBE_REQUEST: |
198 m_ctrlSubtype = 4; |
202 m_ctrlType = TYPE_MGT; |
199 break; |
203 m_ctrlSubtype = 4; |
200 case WIFI_MAC_MGT_PROBE_RESPONSE: |
204 break; |
201 m_ctrlType = TYPE_MGT; |
205 case WIFI_MAC_MGT_PROBE_RESPONSE: |
202 m_ctrlSubtype = 5; |
206 m_ctrlType = TYPE_MGT; |
203 break; |
207 m_ctrlSubtype = 5; |
204 case WIFI_MAC_MGT_BEACON: |
208 break; |
205 m_ctrlType = TYPE_MGT; |
209 case WIFI_MAC_MGT_BEACON: |
206 m_ctrlSubtype = 8; |
210 m_ctrlType = TYPE_MGT; |
207 break; |
211 m_ctrlSubtype = 8; |
208 case WIFI_MAC_MGT_DISASSOCIATION: |
212 break; |
209 m_ctrlType = TYPE_MGT; |
213 case WIFI_MAC_MGT_DISASSOCIATION: |
210 m_ctrlSubtype = 10; |
214 m_ctrlType = TYPE_MGT; |
211 break; |
215 m_ctrlSubtype = 10; |
212 case WIFI_MAC_MGT_AUTHENTICATION: |
216 break; |
213 m_ctrlType = TYPE_MGT; |
217 case WIFI_MAC_MGT_AUTHENTICATION: |
214 m_ctrlSubtype = 11; |
218 m_ctrlType = TYPE_MGT; |
215 break; |
219 m_ctrlSubtype = 11; |
216 case WIFI_MAC_MGT_DEAUTHENTICATION: |
220 break; |
217 m_ctrlType = TYPE_MGT; |
221 case WIFI_MAC_MGT_DEAUTHENTICATION: |
218 m_ctrlSubtype = 12; |
222 m_ctrlType = TYPE_MGT; |
219 case WIFI_MAC_MGT_ACTION: |
223 m_ctrlSubtype = 12; |
220 m_ctrlType = TYPE_MGT; |
224 case WIFI_MAC_MGT_ACTION: |
221 m_ctrlSubtype = 13; |
225 m_ctrlType = TYPE_MGT; |
222 case WIFI_MAC_MGT_ACTION_NO_ACK: |
226 m_ctrlSubtype = 13; |
223 m_ctrlType = TYPE_MGT; |
227 case WIFI_MAC_MGT_ACTION_NO_ACK: |
224 m_ctrlSubtype = 14; |
228 m_ctrlType = TYPE_MGT; |
225 case WIFI_MAC_MGT_MULTIHOP_ACTION: |
229 m_ctrlSubtype = 14; |
226 m_ctrlType = TYPE_MGT; |
230 case WIFI_MAC_MGT_MULTIHOP_ACTION: |
227 m_ctrlSubtype = 15; |
231 m_ctrlType = TYPE_MGT; |
228 break; |
232 m_ctrlSubtype = 15; |
229 |
233 break; |
230 case WIFI_MAC_DATA: |
234 |
231 m_ctrlType = TYPE_DATA; |
235 case WIFI_MAC_DATA: |
232 m_ctrlSubtype = 0; |
236 m_ctrlType = TYPE_DATA; |
233 break; |
237 m_ctrlSubtype = 0; |
234 case WIFI_MAC_DATA_CFACK: |
238 break; |
235 m_ctrlType = TYPE_DATA; |
239 case WIFI_MAC_DATA_CFACK: |
236 m_ctrlSubtype = 1; |
240 m_ctrlType = TYPE_DATA; |
237 break; |
241 m_ctrlSubtype = 1; |
238 case WIFI_MAC_DATA_CFPOLL: |
242 break; |
239 m_ctrlType = TYPE_DATA; |
243 case WIFI_MAC_DATA_CFPOLL: |
240 m_ctrlSubtype = 2; |
244 m_ctrlType = TYPE_DATA; |
241 break; |
245 m_ctrlSubtype = 2; |
242 case WIFI_MAC_DATA_CFACK_CFPOLL: |
246 break; |
243 m_ctrlType = TYPE_DATA; |
247 case WIFI_MAC_DATA_CFACK_CFPOLL: |
244 m_ctrlSubtype = 3; |
248 m_ctrlType = TYPE_DATA; |
245 break; |
249 m_ctrlSubtype = 3; |
246 case WIFI_MAC_DATA_NULL: |
250 break; |
247 m_ctrlType = TYPE_DATA; |
251 case WIFI_MAC_DATA_NULL: |
248 m_ctrlSubtype = 4; |
252 m_ctrlType = TYPE_DATA; |
249 break; |
253 m_ctrlSubtype = 4; |
250 case WIFI_MAC_DATA_NULL_CFACK: |
254 break; |
251 m_ctrlType = TYPE_DATA; |
255 case WIFI_MAC_DATA_NULL_CFACK: |
252 m_ctrlSubtype = 5; |
256 m_ctrlType = TYPE_DATA; |
253 break; |
257 m_ctrlSubtype = 5; |
254 case WIFI_MAC_DATA_NULL_CFPOLL: |
258 break; |
255 m_ctrlType = TYPE_DATA; |
259 case WIFI_MAC_DATA_NULL_CFPOLL: |
256 m_ctrlSubtype = 6; |
260 m_ctrlType = TYPE_DATA; |
257 break; |
261 m_ctrlSubtype = 6; |
258 case WIFI_MAC_DATA_NULL_CFACK_CFPOLL: |
262 break; |
259 m_ctrlType = TYPE_DATA; |
263 case WIFI_MAC_DATA_NULL_CFACK_CFPOLL: |
260 m_ctrlSubtype = 7; |
264 m_ctrlType = TYPE_DATA; |
261 break; |
265 m_ctrlSubtype = 7; |
262 case WIFI_MAC_QOSDATA: |
266 break; |
263 m_ctrlType = TYPE_DATA; |
267 case WIFI_MAC_QOSDATA: |
264 m_ctrlSubtype = 8; |
268 m_ctrlType = TYPE_DATA; |
265 break; |
269 m_ctrlSubtype = 8; |
266 case WIFI_MAC_QOSDATA_CFACK: |
270 break; |
267 m_ctrlType = TYPE_DATA; |
271 case WIFI_MAC_QOSDATA_CFACK: |
268 m_ctrlSubtype = 9; |
272 m_ctrlType = TYPE_DATA; |
269 break; |
273 m_ctrlSubtype = 9; |
270 case WIFI_MAC_QOSDATA_CFPOLL: |
274 break; |
271 m_ctrlType = TYPE_DATA; |
275 case WIFI_MAC_QOSDATA_CFPOLL: |
272 m_ctrlSubtype = 10; |
276 m_ctrlType = TYPE_DATA; |
273 break; |
277 m_ctrlSubtype = 10; |
274 case WIFI_MAC_QOSDATA_CFACK_CFPOLL: |
278 break; |
275 m_ctrlType = TYPE_DATA; |
279 case WIFI_MAC_QOSDATA_CFACK_CFPOLL: |
276 m_ctrlSubtype = 11; |
280 m_ctrlType = TYPE_DATA; |
277 break; |
281 m_ctrlSubtype = 11; |
278 case WIFI_MAC_QOSDATA_NULL: |
282 break; |
279 m_ctrlType = TYPE_DATA; |
283 case WIFI_MAC_QOSDATA_NULL: |
280 m_ctrlSubtype = 12; |
284 m_ctrlType = TYPE_DATA; |
281 break; |
285 m_ctrlSubtype = 12; |
282 case WIFI_MAC_QOSDATA_NULL_CFPOLL: |
286 break; |
283 m_ctrlType = TYPE_DATA; |
287 case WIFI_MAC_QOSDATA_NULL_CFPOLL: |
284 m_ctrlSubtype = 14; |
288 m_ctrlType = TYPE_DATA; |
285 break; |
289 m_ctrlSubtype = 14; |
286 case WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL: |
290 break; |
287 m_ctrlType = TYPE_DATA; |
291 case WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL: |
288 m_ctrlSubtype = 15; |
292 m_ctrlType = TYPE_DATA; |
289 break; |
293 m_ctrlSubtype = 15; |
290 } |
294 break; |
|
295 } |
291 m_ctrlToDs = 0; |
296 m_ctrlToDs = 0; |
292 m_ctrlFromDs = 0; |
297 m_ctrlFromDs = 0; |
293 } |
298 } |
294 void |
299 void |
295 WifiMacHeader::SetRawDuration (uint16_t duration) |
300 WifiMacHeader::SetRawDuration (uint16_t duration) |
296 { |
301 { |
297 m_duration = duration; |
302 m_duration = duration; |
298 } |
303 } |
299 void |
304 void |
300 WifiMacHeader::SetDuration (Time duration) |
305 WifiMacHeader::SetDuration (Time duration) |
301 { |
306 { |
302 int64_t duration_us = duration.GetMicroSeconds (); |
307 int64_t duration_us = duration.GetMicroSeconds (); |
303 NS_ASSERT (duration_us >= 0 && duration_us <= 0x7fff); |
308 NS_ASSERT (duration_us >= 0 && duration_us <= 0x7fff); |
304 m_duration = static_cast<uint16_t> (duration_us); |
309 m_duration = static_cast<uint16_t> (duration_us); |
387 void WifiMacHeader::SetQosTxopLimit (uint8_t txop) |
393 void WifiMacHeader::SetQosTxopLimit (uint8_t txop) |
388 { |
394 { |
389 m_qosStuff = txop; |
395 m_qosStuff = txop; |
390 } |
396 } |
391 |
397 |
392 Mac48Address |
398 Mac48Address |
393 WifiMacHeader::GetAddr1 (void) const |
399 WifiMacHeader::GetAddr1 (void) const |
394 { |
400 { |
395 return m_addr1; |
401 return m_addr1; |
396 } |
402 } |
397 Mac48Address |
403 Mac48Address |
398 WifiMacHeader::GetAddr2 (void) const |
404 WifiMacHeader::GetAddr2 (void) const |
399 { |
405 { |
400 return m_addr2; |
406 return m_addr2; |
401 } |
407 } |
402 Mac48Address |
408 Mac48Address |
403 WifiMacHeader::GetAddr3 (void) const |
409 WifiMacHeader::GetAddr3 (void) const |
404 { |
410 { |
405 return m_addr3; |
411 return m_addr3; |
406 } |
412 } |
407 Mac48Address |
413 Mac48Address |
408 WifiMacHeader::GetAddr4 (void) const |
414 WifiMacHeader::GetAddr4 (void) const |
409 { |
415 { |
410 return m_addr4; |
416 return m_addr4; |
411 } |
417 } |
412 |
418 |
413 enum WifiMacType |
419 enum WifiMacType |
414 WifiMacHeader::GetType (void) const |
420 WifiMacHeader::GetType (void) const |
415 { |
421 { |
416 switch (m_ctrlType) { |
422 switch (m_ctrlType) |
417 case TYPE_MGT: |
423 { |
418 switch (m_ctrlSubtype) { |
424 case TYPE_MGT: |
419 case 0: |
425 switch (m_ctrlSubtype) |
420 return WIFI_MAC_MGT_ASSOCIATION_REQUEST; |
426 { |
421 break; |
427 case 0: |
422 case 1: |
428 return WIFI_MAC_MGT_ASSOCIATION_REQUEST; |
423 return WIFI_MAC_MGT_ASSOCIATION_RESPONSE; |
429 break; |
424 break; |
430 case 1: |
425 case 2: |
431 return WIFI_MAC_MGT_ASSOCIATION_RESPONSE; |
426 return WIFI_MAC_MGT_REASSOCIATION_REQUEST; |
432 break; |
427 break; |
433 case 2: |
428 case 3: |
434 return WIFI_MAC_MGT_REASSOCIATION_REQUEST; |
429 return WIFI_MAC_MGT_REASSOCIATION_RESPONSE; |
435 break; |
430 break; |
436 case 3: |
431 case 4: |
437 return WIFI_MAC_MGT_REASSOCIATION_RESPONSE; |
432 return WIFI_MAC_MGT_PROBE_REQUEST; |
438 break; |
433 break; |
439 case 4: |
434 case 5: |
440 return WIFI_MAC_MGT_PROBE_REQUEST; |
435 return WIFI_MAC_MGT_PROBE_RESPONSE; |
441 break; |
436 break; |
442 case 5: |
437 case 8: |
443 return WIFI_MAC_MGT_PROBE_RESPONSE; |
438 return WIFI_MAC_MGT_BEACON; |
444 break; |
439 break; |
445 case 8: |
440 case 10: |
446 return WIFI_MAC_MGT_BEACON; |
441 return WIFI_MAC_MGT_DISASSOCIATION; |
447 break; |
442 break; |
448 case 10: |
443 case 11: |
449 return WIFI_MAC_MGT_DISASSOCIATION; |
444 return WIFI_MAC_MGT_AUTHENTICATION; |
450 break; |
445 break; |
451 case 11: |
446 case 12: |
452 return WIFI_MAC_MGT_AUTHENTICATION; |
447 return WIFI_MAC_MGT_DEAUTHENTICATION; |
453 break; |
448 break; |
454 case 12: |
449 case 13: |
455 return WIFI_MAC_MGT_DEAUTHENTICATION; |
450 return WIFI_MAC_MGT_ACTION; |
456 break; |
451 break; |
457 case 13: |
452 case 14: |
458 return WIFI_MAC_MGT_ACTION; |
453 return WIFI_MAC_MGT_ACTION_NO_ACK; |
459 break; |
454 break; |
460 case 14: |
455 case 15: |
461 return WIFI_MAC_MGT_ACTION_NO_ACK; |
456 return WIFI_MAC_MGT_MULTIHOP_ACTION; |
462 break; |
457 break; |
463 case 15: |
458 |
464 return WIFI_MAC_MGT_MULTIHOP_ACTION; |
|
465 break; |
|
466 |
|
467 } |
|
468 break; |
|
469 case TYPE_CTL: |
|
470 switch (m_ctrlSubtype) |
|
471 { |
|
472 case SUBTYPE_CTL_BACKREQ: |
|
473 return WIFI_MAC_CTL_BACKREQ; |
|
474 break; |
|
475 case SUBTYPE_CTL_BACKRESP: |
|
476 return WIFI_MAC_CTL_BACKRESP; |
|
477 break; |
|
478 case SUBTYPE_CTL_RTS: |
|
479 return WIFI_MAC_CTL_RTS; |
|
480 break; |
|
481 case SUBTYPE_CTL_CTS: |
|
482 return WIFI_MAC_CTL_CTS; |
|
483 break; |
|
484 case SUBTYPE_CTL_ACK: |
|
485 return WIFI_MAC_CTL_ACK; |
|
486 break; |
|
487 } |
|
488 break; |
|
489 case TYPE_DATA: |
|
490 switch (m_ctrlSubtype) |
|
491 { |
|
492 case 0: |
|
493 return WIFI_MAC_DATA; |
|
494 break; |
|
495 case 1: |
|
496 return WIFI_MAC_DATA_CFACK; |
|
497 break; |
|
498 case 2: |
|
499 return WIFI_MAC_DATA_CFPOLL; |
|
500 break; |
|
501 case 3: |
|
502 return WIFI_MAC_DATA_CFACK_CFPOLL; |
|
503 break; |
|
504 case 4: |
|
505 return WIFI_MAC_DATA_NULL; |
|
506 break; |
|
507 case 5: |
|
508 return WIFI_MAC_DATA_NULL_CFACK; |
|
509 break; |
|
510 case 6: |
|
511 return WIFI_MAC_DATA_NULL_CFPOLL; |
|
512 break; |
|
513 case 7: |
|
514 return WIFI_MAC_DATA_NULL_CFACK_CFPOLL; |
|
515 break; |
|
516 case 8: |
|
517 return WIFI_MAC_QOSDATA; |
|
518 break; |
|
519 case 9: |
|
520 return WIFI_MAC_QOSDATA_CFACK; |
|
521 break; |
|
522 case 10: |
|
523 return WIFI_MAC_QOSDATA_CFPOLL; |
|
524 break; |
|
525 case 11: |
|
526 return WIFI_MAC_QOSDATA_CFACK_CFPOLL; |
|
527 break; |
|
528 case 12: |
|
529 return WIFI_MAC_QOSDATA_NULL; |
|
530 break; |
|
531 case 14: |
|
532 return WIFI_MAC_QOSDATA_NULL_CFPOLL; |
|
533 break; |
|
534 case 15: |
|
535 return WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL; |
|
536 break; |
|
537 |
|
538 } |
|
539 break; |
459 } |
540 } |
460 break; |
|
461 case TYPE_CTL: |
|
462 switch (m_ctrlSubtype) { |
|
463 case SUBTYPE_CTL_BACKREQ: |
|
464 return WIFI_MAC_CTL_BACKREQ; |
|
465 break; |
|
466 case SUBTYPE_CTL_BACKRESP: |
|
467 return WIFI_MAC_CTL_BACKRESP; |
|
468 break; |
|
469 case SUBTYPE_CTL_RTS: |
|
470 return WIFI_MAC_CTL_RTS; |
|
471 break; |
|
472 case SUBTYPE_CTL_CTS: |
|
473 return WIFI_MAC_CTL_CTS; |
|
474 break; |
|
475 case SUBTYPE_CTL_ACK: |
|
476 return WIFI_MAC_CTL_ACK; |
|
477 break; |
|
478 } |
|
479 break; |
|
480 case TYPE_DATA: |
|
481 switch (m_ctrlSubtype) { |
|
482 case 0: |
|
483 return WIFI_MAC_DATA; |
|
484 break; |
|
485 case 1: |
|
486 return WIFI_MAC_DATA_CFACK; |
|
487 break; |
|
488 case 2: |
|
489 return WIFI_MAC_DATA_CFPOLL; |
|
490 break; |
|
491 case 3: |
|
492 return WIFI_MAC_DATA_CFACK_CFPOLL; |
|
493 break; |
|
494 case 4: |
|
495 return WIFI_MAC_DATA_NULL; |
|
496 break; |
|
497 case 5: |
|
498 return WIFI_MAC_DATA_NULL_CFACK; |
|
499 break; |
|
500 case 6: |
|
501 return WIFI_MAC_DATA_NULL_CFPOLL; |
|
502 break; |
|
503 case 7: |
|
504 return WIFI_MAC_DATA_NULL_CFACK_CFPOLL; |
|
505 break; |
|
506 case 8: |
|
507 return WIFI_MAC_QOSDATA; |
|
508 break; |
|
509 case 9: |
|
510 return WIFI_MAC_QOSDATA_CFACK; |
|
511 break; |
|
512 case 10: |
|
513 return WIFI_MAC_QOSDATA_CFPOLL; |
|
514 break; |
|
515 case 11: |
|
516 return WIFI_MAC_QOSDATA_CFACK_CFPOLL; |
|
517 break; |
|
518 case 12: |
|
519 return WIFI_MAC_QOSDATA_NULL; |
|
520 break; |
|
521 case 14: |
|
522 return WIFI_MAC_QOSDATA_NULL_CFPOLL; |
|
523 break; |
|
524 case 15: |
|
525 return WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL; |
|
526 break; |
|
527 |
|
528 } |
|
529 break; |
|
530 } |
|
531 // NOTREACHED |
541 // NOTREACHED |
532 NS_ASSERT (false); |
542 NS_ASSERT (false); |
533 return (enum WifiMacType)-1; |
543 return (enum WifiMacType)-1; |
534 } |
544 } |
535 bool |
545 bool |
536 WifiMacHeader::IsFromDs (void) const |
546 WifiMacHeader::IsFromDs (void) const |
537 { |
547 { |
538 return m_ctrlFromDs == 1; |
548 return m_ctrlFromDs == 1; |
539 } |
549 } |
540 bool |
550 bool |
541 WifiMacHeader::IsToDs (void) const |
551 WifiMacHeader::IsToDs (void) const |
542 { |
552 { |
543 return m_ctrlToDs == 1; |
553 return m_ctrlToDs == 1; |
544 } |
554 } |
545 |
555 |
546 bool |
556 bool |
547 WifiMacHeader::IsData (void) const |
557 WifiMacHeader::IsData (void) const |
548 { |
558 { |
549 return (m_ctrlType == TYPE_DATA); |
559 return (m_ctrlType == TYPE_DATA); |
550 |
560 |
551 } |
561 } |
552 bool |
562 bool |
553 WifiMacHeader::IsQosData (void) const |
563 WifiMacHeader::IsQosData (void) const |
554 { |
564 { |
555 return (m_ctrlType == TYPE_DATA && (m_ctrlSubtype & 0x08)); |
565 return (m_ctrlType == TYPE_DATA && (m_ctrlSubtype & 0x08)); |
556 } |
566 } |
557 bool |
567 bool |
558 WifiMacHeader::IsCtl (void) const |
568 WifiMacHeader::IsCtl (void) const |
559 { |
569 { |
560 return (m_ctrlType == TYPE_CTL); |
570 return (m_ctrlType == TYPE_CTL); |
561 } |
571 } |
562 bool |
572 bool |
563 WifiMacHeader::IsMgt (void) const |
573 WifiMacHeader::IsMgt (void) const |
564 { |
574 { |
565 return (m_ctrlType == TYPE_MGT); |
575 return (m_ctrlType == TYPE_MGT); |
566 } |
576 } |
567 bool |
577 bool |
568 WifiMacHeader::IsCfpoll (void) const |
578 WifiMacHeader::IsCfpoll (void) const |
569 { |
579 { |
570 switch (GetType ()) { |
580 switch (GetType ()) |
571 case WIFI_MAC_DATA_CFPOLL: |
581 { |
572 case WIFI_MAC_DATA_CFACK_CFPOLL: |
582 case WIFI_MAC_DATA_CFPOLL: |
573 case WIFI_MAC_DATA_NULL_CFPOLL: |
583 case WIFI_MAC_DATA_CFACK_CFPOLL: |
574 case WIFI_MAC_DATA_NULL_CFACK_CFPOLL: |
584 case WIFI_MAC_DATA_NULL_CFPOLL: |
575 case WIFI_MAC_QOSDATA_CFPOLL: |
585 case WIFI_MAC_DATA_NULL_CFACK_CFPOLL: |
576 case WIFI_MAC_QOSDATA_CFACK_CFPOLL: |
586 case WIFI_MAC_QOSDATA_CFPOLL: |
577 case WIFI_MAC_QOSDATA_NULL_CFPOLL: |
587 case WIFI_MAC_QOSDATA_CFACK_CFPOLL: |
578 case WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL: |
588 case WIFI_MAC_QOSDATA_NULL_CFPOLL: |
579 return true; |
589 case WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL: |
580 break; |
590 return true; |
581 default: |
591 break; |
582 return false; |
592 default: |
583 break; |
593 return false; |
584 } |
594 break; |
585 } |
595 } |
586 bool |
596 } |
|
597 bool |
587 WifiMacHeader::IsRts (void) const |
598 WifiMacHeader::IsRts (void) const |
588 { |
599 { |
589 return (GetType () == WIFI_MAC_CTL_RTS); |
600 return (GetType () == WIFI_MAC_CTL_RTS); |
590 } |
601 } |
591 bool |
602 bool |
592 WifiMacHeader::IsCts (void) const |
603 WifiMacHeader::IsCts (void) const |
593 { |
604 { |
594 return (GetType () == WIFI_MAC_CTL_CTS); |
605 return (GetType () == WIFI_MAC_CTL_CTS); |
595 } |
606 } |
596 bool |
607 bool |
597 WifiMacHeader::IsAck (void) const |
608 WifiMacHeader::IsAck (void) const |
598 { |
609 { |
599 return (GetType () == WIFI_MAC_CTL_ACK); |
610 return (GetType () == WIFI_MAC_CTL_ACK); |
600 } |
611 } |
601 bool |
612 bool |
602 WifiMacHeader::IsAssocReq (void) const |
613 WifiMacHeader::IsAssocReq (void) const |
603 { |
614 { |
604 return (GetType () == WIFI_MAC_MGT_ASSOCIATION_REQUEST); |
615 return (GetType () == WIFI_MAC_MGT_ASSOCIATION_REQUEST); |
605 } |
616 } |
606 bool |
617 bool |
607 WifiMacHeader::IsAssocResp (void) const |
618 WifiMacHeader::IsAssocResp (void) const |
608 { |
619 { |
609 return (GetType () == WIFI_MAC_MGT_ASSOCIATION_RESPONSE); |
620 return (GetType () == WIFI_MAC_MGT_ASSOCIATION_RESPONSE); |
610 } |
621 } |
611 bool |
622 bool |
612 WifiMacHeader::IsReassocReq (void) const |
623 WifiMacHeader::IsReassocReq (void) const |
613 { |
624 { |
614 return (GetType () == WIFI_MAC_MGT_REASSOCIATION_REQUEST); |
625 return (GetType () == WIFI_MAC_MGT_REASSOCIATION_REQUEST); |
615 } |
626 } |
616 bool |
627 bool |
617 WifiMacHeader::IsReassocResp (void) const |
628 WifiMacHeader::IsReassocResp (void) const |
618 { |
629 { |
619 return (GetType () == WIFI_MAC_MGT_REASSOCIATION_RESPONSE); |
630 return (GetType () == WIFI_MAC_MGT_REASSOCIATION_RESPONSE); |
620 } |
631 } |
621 bool |
632 bool |
622 WifiMacHeader::IsProbeReq (void) const |
633 WifiMacHeader::IsProbeReq (void) const |
623 { |
634 { |
624 return (GetType () == WIFI_MAC_MGT_PROBE_REQUEST); |
635 return (GetType () == WIFI_MAC_MGT_PROBE_REQUEST); |
625 } |
636 } |
626 bool |
637 bool |
627 WifiMacHeader::IsProbeResp (void) const |
638 WifiMacHeader::IsProbeResp (void) const |
628 { |
639 { |
629 return (GetType () == WIFI_MAC_MGT_PROBE_RESPONSE); |
640 return (GetType () == WIFI_MAC_MGT_PROBE_RESPONSE); |
630 } |
641 } |
631 bool |
642 bool |
632 WifiMacHeader::IsBeacon (void) const |
643 WifiMacHeader::IsBeacon (void) const |
633 { |
644 { |
634 return (GetType () == WIFI_MAC_MGT_BEACON); |
645 return (GetType () == WIFI_MAC_MGT_BEACON); |
635 } |
646 } |
636 bool |
647 bool |
637 WifiMacHeader::IsDisassociation (void) const |
648 WifiMacHeader::IsDisassociation (void) const |
638 { |
649 { |
639 return (GetType () == WIFI_MAC_MGT_DISASSOCIATION); |
650 return (GetType () == WIFI_MAC_MGT_DISASSOCIATION); |
640 } |
651 } |
641 bool |
652 bool |
642 WifiMacHeader::IsAuthentication (void) const |
653 WifiMacHeader::IsAuthentication (void) const |
643 { |
654 { |
644 return (GetType () == WIFI_MAC_MGT_AUTHENTICATION); |
655 return (GetType () == WIFI_MAC_MGT_AUTHENTICATION); |
645 } |
656 } |
646 bool |
657 bool |
647 WifiMacHeader::IsDeauthentication (void) const |
658 WifiMacHeader::IsDeauthentication (void) const |
648 { |
659 { |
649 return (GetType () == WIFI_MAC_MGT_DEAUTHENTICATION); |
660 return (GetType () == WIFI_MAC_MGT_DEAUTHENTICATION); |
650 } |
661 } |
651 bool |
662 bool |
825 m_qosAckPolicy = (qos >> 5) & 0x0003; |
837 m_qosAckPolicy = (qos >> 5) & 0x0003; |
826 m_amsduPresent = (qos >> 7) & 0x0001; |
838 m_amsduPresent = (qos >> 7) & 0x0001; |
827 m_qosStuff = (qos >> 8) & 0x00ff; |
839 m_qosStuff = (qos >> 8) & 0x00ff; |
828 } |
840 } |
829 |
841 |
830 uint32_t |
842 uint32_t |
831 WifiMacHeader::GetSize (void) const |
843 WifiMacHeader::GetSize (void) const |
832 { |
844 { |
833 uint32_t size = 0; |
845 uint32_t size = 0; |
834 switch (m_ctrlType) { |
846 switch (m_ctrlType) |
835 case TYPE_MGT: |
847 { |
836 size = 2+2+6+6+6+2; |
848 case TYPE_MGT: |
837 break; |
849 size = 2 + 2 + 6 + 6 + 6 + 2; |
838 case TYPE_CTL: |
850 break; |
839 switch (m_ctrlSubtype) { |
851 case TYPE_CTL: |
840 case SUBTYPE_CTL_RTS: |
852 switch (m_ctrlSubtype) |
841 size = 2+2+6+6; |
853 { |
842 break; |
854 case SUBTYPE_CTL_RTS: |
843 case SUBTYPE_CTL_CTS: |
855 size = 2 + 2 + 6 + 6; |
844 case SUBTYPE_CTL_ACK: |
856 break; |
845 size = 2+2+6; |
857 case SUBTYPE_CTL_CTS: |
846 break; |
858 case SUBTYPE_CTL_ACK: |
847 case SUBTYPE_CTL_BACKREQ: |
859 size = 2 + 2 + 6; |
848 case SUBTYPE_CTL_BACKRESP: |
860 break; |
849 size = 2+2+6+6; |
861 case SUBTYPE_CTL_BACKREQ: |
|
862 case SUBTYPE_CTL_BACKRESP: |
|
863 size = 2 + 2 + 6 + 6; |
|
864 break; |
|
865 } |
|
866 break; |
|
867 case TYPE_DATA: |
|
868 size = 2 + 2 + 6 + 6 + 6 + 2; |
|
869 if (m_ctrlToDs && m_ctrlFromDs) |
|
870 { |
|
871 size += 6; |
|
872 } |
|
873 if (m_ctrlSubtype & 0x08) |
|
874 { |
|
875 size += 2; |
|
876 } |
850 break; |
877 break; |
851 } |
878 } |
852 break; |
|
853 case TYPE_DATA: |
|
854 size = 2+2+6+6+6+2; |
|
855 if (m_ctrlToDs && m_ctrlFromDs) { |
|
856 size += 6; |
|
857 } |
|
858 if (m_ctrlSubtype & 0x08) { |
|
859 size += 2; |
|
860 } |
|
861 break; |
|
862 } |
|
863 return size; |
879 return size; |
864 } |
880 } |
865 const char * |
881 const char * |
866 WifiMacHeader::GetTypeString (void) const |
882 WifiMacHeader::GetTypeString (void) const |
867 { |
883 { |
868 #define FOO(x) \ |
884 #define FOO(x) \ |
869 case WIFI_MAC_ ## x: \ |
885 case WIFI_MAC_ ## x: \ |
870 return #x; \ |
886 return # x; \ |
871 break; |
887 break; |
872 |
888 |
873 switch (GetType ()) { |
889 switch (GetType ()) |
874 FOO (CTL_RTS); |
890 { |
875 FOO (CTL_CTS); |
891 FOO (CTL_RTS); |
876 FOO (CTL_ACK); |
892 FOO (CTL_CTS); |
877 FOO (CTL_BACKREQ); |
893 FOO (CTL_ACK); |
878 FOO (CTL_BACKRESP); |
894 FOO (CTL_BACKREQ); |
879 |
895 FOO (CTL_BACKRESP); |
880 FOO (MGT_BEACON); |
896 |
881 FOO (MGT_ASSOCIATION_REQUEST); |
897 FOO (MGT_BEACON); |
882 FOO (MGT_ASSOCIATION_RESPONSE); |
898 FOO (MGT_ASSOCIATION_REQUEST); |
883 FOO (MGT_DISASSOCIATION); |
899 FOO (MGT_ASSOCIATION_RESPONSE); |
884 FOO (MGT_REASSOCIATION_REQUEST); |
900 FOO (MGT_DISASSOCIATION); |
885 FOO (MGT_REASSOCIATION_RESPONSE); |
901 FOO (MGT_REASSOCIATION_REQUEST); |
886 FOO (MGT_PROBE_REQUEST); |
902 FOO (MGT_REASSOCIATION_RESPONSE); |
887 FOO (MGT_PROBE_RESPONSE); |
903 FOO (MGT_PROBE_REQUEST); |
888 FOO (MGT_AUTHENTICATION); |
904 FOO (MGT_PROBE_RESPONSE); |
889 FOO (MGT_DEAUTHENTICATION); |
905 FOO (MGT_AUTHENTICATION); |
890 FOO (MGT_ACTION); |
906 FOO (MGT_DEAUTHENTICATION); |
891 FOO (MGT_ACTION_NO_ACK); |
907 FOO (MGT_ACTION); |
892 FOO (MGT_MULTIHOP_ACTION); |
908 FOO (MGT_ACTION_NO_ACK); |
893 |
909 FOO (MGT_MULTIHOP_ACTION); |
894 FOO (DATA); |
910 |
895 FOO (DATA_CFACK); |
911 FOO (DATA); |
896 FOO (DATA_CFPOLL); |
912 FOO (DATA_CFACK); |
897 FOO (DATA_CFACK_CFPOLL); |
913 FOO (DATA_CFPOLL); |
898 FOO (DATA_NULL); |
914 FOO (DATA_CFACK_CFPOLL); |
899 FOO (DATA_NULL_CFACK); |
915 FOO (DATA_NULL); |
900 FOO (DATA_NULL_CFPOLL); |
916 FOO (DATA_NULL_CFACK); |
901 FOO (DATA_NULL_CFACK_CFPOLL); |
917 FOO (DATA_NULL_CFPOLL); |
902 FOO (QOSDATA); |
918 FOO (DATA_NULL_CFACK_CFPOLL); |
903 FOO (QOSDATA_CFACK); |
919 FOO (QOSDATA); |
904 FOO (QOSDATA_CFPOLL); |
920 FOO (QOSDATA_CFACK); |
905 FOO (QOSDATA_CFACK_CFPOLL); |
921 FOO (QOSDATA_CFPOLL); |
906 FOO (QOSDATA_NULL); |
922 FOO (QOSDATA_CFACK_CFPOLL); |
907 FOO (QOSDATA_NULL_CFPOLL); |
923 FOO (QOSDATA_NULL); |
908 FOO (QOSDATA_NULL_CFACK_CFPOLL); |
924 FOO (QOSDATA_NULL_CFPOLL); |
909 default: |
925 FOO (QOSDATA_NULL_CFACK_CFPOLL); |
910 return "ERROR"; |
926 default: |
911 } |
927 return "ERROR"; |
|
928 } |
912 #undef FOO |
929 #undef FOO |
913 // needed to make gcc 4.0.1 ppc darwin happy. |
930 // needed to make gcc 4.0.1 ppc darwin happy. |
914 return "BIG_ERROR"; |
931 return "BIG_ERROR"; |
915 } |
932 } |
916 |
933 |
917 TypeId |
934 TypeId |
918 WifiMacHeader::GetTypeId (void) |
935 WifiMacHeader::GetTypeId (void) |
919 { |
936 { |
920 static TypeId tid = TypeId ("ns3::WifiMacHeader") |
937 static TypeId tid = TypeId ("ns3::WifiMacHeader") |
921 .SetParent<Header> () |
938 .SetParent<Header> () |
922 .AddConstructor<WifiMacHeader> () |
939 .AddConstructor<WifiMacHeader> () |
923 ; |
940 ; |
924 return tid; |
941 return tid; |
925 } |
942 } |
926 |
943 |
927 TypeId |
944 TypeId |
928 WifiMacHeader::GetInstanceTypeId (void) const |
945 WifiMacHeader::GetInstanceTypeId (void) const |
929 { |
946 { |
930 return GetTypeId (); |
947 return GetTypeId (); |
931 } |
948 } |
932 |
949 |
933 void |
950 void |
934 WifiMacHeader::PrintFrameControl (std::ostream &os) const |
951 WifiMacHeader::PrintFrameControl (std::ostream &os) const |
935 { |
952 { |
936 os << "ToDS=" << std::hex << (int) m_ctrlToDs << ", FromDS=" << std::hex << (int) m_ctrlFromDs |
953 os << "ToDS=" << std::hex << (int) m_ctrlToDs << ", FromDS=" << std::hex << (int) m_ctrlFromDs |
937 << ", MoreFrag=" << std::hex << (int) m_ctrlMoreFrag << ", Retry=" << std::hex << (int) m_ctrlRetry |
954 << ", MoreFrag=" << std::hex << (int) m_ctrlMoreFrag << ", Retry=" << std::hex << (int) m_ctrlRetry |
938 << ", MoreData=" << std::hex << (int) m_ctrlMoreData << std::dec |
955 << ", MoreData=" << std::hex << (int) m_ctrlMoreData << std::dec |
939 ; |
956 ; |
940 } |
957 } |
941 |
958 |
942 void |
959 void |
943 WifiMacHeader::Print (std::ostream &os) const |
960 WifiMacHeader::Print (std::ostream &os) const |
944 { |
961 { |
945 os << GetTypeString () << " "; |
962 os << GetTypeString () << " "; |
946 switch (GetType ()) |
963 switch (GetType ()) |
947 { |
964 { |
1026 case WIFI_MAC_QOSDATA_NULL_CFPOLL: |
1043 case WIFI_MAC_QOSDATA_NULL_CFPOLL: |
1027 case WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL: |
1044 case WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL: |
1028 break; |
1045 break; |
1029 } |
1046 } |
1030 } |
1047 } |
1031 uint32_t |
1048 uint32_t |
1032 WifiMacHeader::GetSerializedSize (void) const |
1049 WifiMacHeader::GetSerializedSize (void) const |
1033 { |
1050 { |
1034 return GetSize (); |
1051 return GetSize (); |
1035 } |
1052 } |
1036 void |
1053 void |
1037 WifiMacHeader::Serialize (Buffer::Iterator i) const |
1054 WifiMacHeader::Serialize (Buffer::Iterator i) const |
1038 { |
1055 { |
1039 i.WriteHtolsbU16 (GetFrameControl ()); |
1056 i.WriteHtolsbU16 (GetFrameControl ()); |
1040 i.WriteHtolsbU16 (m_duration); |
1057 i.WriteHtolsbU16 (m_duration); |
1041 WriteTo (i, m_addr1); |
1058 WriteTo (i, m_addr1); |
1042 switch (m_ctrlType) { |
1059 switch (m_ctrlType) |
1043 case TYPE_MGT: |
1060 { |
1044 WriteTo (i, m_addr2); |
1061 case TYPE_MGT: |
1045 WriteTo (i, m_addr3); |
|
1046 i.WriteHtolsbU16 (GetSequenceControl ()); |
|
1047 break; |
|
1048 case TYPE_CTL: |
|
1049 switch (m_ctrlSubtype) { |
|
1050 case SUBTYPE_CTL_RTS: |
|
1051 WriteTo (i, m_addr2); |
1062 WriteTo (i, m_addr2); |
1052 break; |
1063 WriteTo (i, m_addr3); |
1053 case SUBTYPE_CTL_CTS: |
1064 i.WriteHtolsbU16 (GetSequenceControl ()); |
1054 case SUBTYPE_CTL_ACK: |
1065 break; |
1055 break; |
1066 case TYPE_CTL: |
1056 case SUBTYPE_CTL_BACKREQ: |
1067 switch (m_ctrlSubtype) |
1057 case SUBTYPE_CTL_BACKRESP: |
1068 { |
1058 WriteTo (i, m_addr2); |
1069 case SUBTYPE_CTL_RTS: |
1059 break; |
1070 WriteTo (i, m_addr2); |
|
1071 break; |
|
1072 case SUBTYPE_CTL_CTS: |
|
1073 case SUBTYPE_CTL_ACK: |
|
1074 break; |
|
1075 case SUBTYPE_CTL_BACKREQ: |
|
1076 case SUBTYPE_CTL_BACKRESP: |
|
1077 WriteTo (i, m_addr2); |
|
1078 break; |
|
1079 default: |
|
1080 //NOTREACHED |
|
1081 NS_ASSERT (false); |
|
1082 break; |
|
1083 } |
|
1084 break; |
|
1085 case TYPE_DATA: |
|
1086 { |
|
1087 WriteTo (i, m_addr2); |
|
1088 WriteTo (i, m_addr3); |
|
1089 i.WriteHtolsbU16 (GetSequenceControl ()); |
|
1090 if (m_ctrlToDs && m_ctrlFromDs) |
|
1091 { |
|
1092 WriteTo (i, m_addr4); |
|
1093 } |
|
1094 if (m_ctrlSubtype & 0x08) |
|
1095 { |
|
1096 i.WriteHtolsbU16 (GetQosControl ()); |
|
1097 } |
|
1098 } break; |
1060 default: |
1099 default: |
1061 //NOTREACHED |
1100 //NOTREACHED |
1062 NS_ASSERT (false); |
1101 NS_ASSERT (false); |
1063 break; |
1102 break; |
1064 } |
1103 } |
1065 break; |
|
1066 case TYPE_DATA: { |
|
1067 WriteTo (i, m_addr2); |
|
1068 WriteTo (i, m_addr3); |
|
1069 i.WriteHtolsbU16 (GetSequenceControl ()); |
|
1070 if (m_ctrlToDs && m_ctrlFromDs) { |
|
1071 WriteTo (i, m_addr4); |
|
1072 } |
|
1073 if (m_ctrlSubtype & 0x08) { |
|
1074 i.WriteHtolsbU16 (GetQosControl ()); |
|
1075 } |
|
1076 } break; |
|
1077 default: |
|
1078 //NOTREACHED |
|
1079 NS_ASSERT (false); |
|
1080 break; |
|
1081 } |
|
1082 } |
1104 } |
1083 uint32_t |
1105 uint32_t |
1084 WifiMacHeader::Deserialize (Buffer::Iterator start) |
1106 WifiMacHeader::Deserialize (Buffer::Iterator start) |
1085 { |
1107 { |
1086 Buffer::Iterator i = start; |
1108 Buffer::Iterator i = start; |
1087 uint16_t frame_control = i.ReadLsbtohU16 (); |
1109 uint16_t frame_control = i.ReadLsbtohU16 (); |
1088 SetFrameControl (frame_control); |
1110 SetFrameControl (frame_control); |
1089 m_duration = i.ReadLsbtohU16 (); |
1111 m_duration = i.ReadLsbtohU16 (); |
1090 ReadFrom (i, m_addr1); |
1112 ReadFrom (i, m_addr1); |
1091 switch (m_ctrlType) { |
1113 switch (m_ctrlType) |
1092 case TYPE_MGT: |
1114 { |
1093 ReadFrom (i, m_addr2); |
1115 case TYPE_MGT: |
1094 ReadFrom (i, m_addr3); |
|
1095 SetSequenceControl (i.ReadLsbtohU16 ()); |
|
1096 break; |
|
1097 case TYPE_CTL: |
|
1098 switch (m_ctrlSubtype) { |
|
1099 case SUBTYPE_CTL_RTS: |
|
1100 ReadFrom (i, m_addr2); |
1116 ReadFrom (i, m_addr2); |
1101 break; |
1117 ReadFrom (i, m_addr3); |
1102 case SUBTYPE_CTL_CTS: |
1118 SetSequenceControl (i.ReadLsbtohU16 ()); |
1103 case SUBTYPE_CTL_ACK: |
1119 break; |
1104 break; |
1120 case TYPE_CTL: |
1105 case SUBTYPE_CTL_BACKREQ: |
1121 switch (m_ctrlSubtype) |
1106 case SUBTYPE_CTL_BACKRESP: |
1122 { |
|
1123 case SUBTYPE_CTL_RTS: |
|
1124 ReadFrom (i, m_addr2); |
|
1125 break; |
|
1126 case SUBTYPE_CTL_CTS: |
|
1127 case SUBTYPE_CTL_ACK: |
|
1128 break; |
|
1129 case SUBTYPE_CTL_BACKREQ: |
|
1130 case SUBTYPE_CTL_BACKRESP: |
|
1131 ReadFrom (i, m_addr2); |
|
1132 break; |
|
1133 } |
|
1134 break; |
|
1135 case TYPE_DATA: |
1107 ReadFrom (i, m_addr2); |
1136 ReadFrom (i, m_addr2); |
|
1137 ReadFrom (i, m_addr3); |
|
1138 SetSequenceControl (i.ReadLsbtohU16 ()); |
|
1139 if (m_ctrlToDs && m_ctrlFromDs) |
|
1140 { |
|
1141 ReadFrom (i, m_addr4); |
|
1142 } |
|
1143 if (m_ctrlSubtype & 0x08) |
|
1144 { |
|
1145 SetQosControl (i.ReadLsbtohU16 ()); |
|
1146 } |
1108 break; |
1147 break; |
1109 } |
1148 } |
1110 break; |
|
1111 case TYPE_DATA: |
|
1112 ReadFrom (i, m_addr2); |
|
1113 ReadFrom (i, m_addr3); |
|
1114 SetSequenceControl (i.ReadLsbtohU16 ()); |
|
1115 if (m_ctrlToDs && m_ctrlFromDs) { |
|
1116 ReadFrom (i, m_addr4); |
|
1117 } |
|
1118 if (m_ctrlSubtype & 0x08) { |
|
1119 SetQosControl (i.ReadLsbtohU16 ()); |
|
1120 } |
|
1121 break; |
|
1122 } |
|
1123 return i.GetDistanceFrom (start); |
1149 return i.GetDistanceFrom (start); |
1124 } |
1150 } |
1125 |
1151 |
1126 } // namespace ns3 |
1152 } // namespace ns3 |