equal
deleted
inserted
replaced
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ |
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ |
2 /* |
2 /* |
3 * Copyright (c) 2006 INRIA |
3 * Copyright (c) 2006, 2009 INRIA |
|
4 * Copyright (c) 2009 MIRKO BANCHI |
4 * |
5 * |
5 * This program is free software; you can redistribute it and/or modify |
6 * This program is free software; you can redistribute it and/or modify |
6 * it under the terms of the GNU General Public License version 2 as |
7 * it under the terms of the GNU General Public License version 2 as |
7 * published by the Free Software Foundation; |
8 * published by the Free Software Foundation; |
8 * |
9 * |
14 * You should have received a copy of the GNU General Public License |
15 * You should have received a copy of the GNU General Public License |
15 * along with this program; if not, write to the Free Software |
16 * along with this program; if not, write to the Free Software |
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
17 * |
18 * |
18 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr> |
19 * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr> |
|
20 * Author: Mirko Banchi <mk.banchi@gmail.com> |
19 */ |
21 */ |
20 #include "ns3/assert.h" |
22 #include "ns3/assert.h" |
21 #include "ns3/address-utils.h" |
23 #include "ns3/address-utils.h" |
22 #include "wifi-mac-header.h" |
24 #include "wifi-mac-header.h" |
23 |
25 |
41 |
43 |
42 WifiMacHeader::WifiMacHeader () |
44 WifiMacHeader::WifiMacHeader () |
43 : m_ctrlPwrMgt (0), |
45 : m_ctrlPwrMgt (0), |
44 m_ctrlMoreData (0), |
46 m_ctrlMoreData (0), |
45 m_ctrlWep (0), |
47 m_ctrlWep (0), |
46 m_ctrlOrder (1) |
48 m_ctrlOrder (1), |
|
49 m_amsduPresent (0) |
47 {} |
50 {} |
48 WifiMacHeader::~WifiMacHeader () |
51 WifiMacHeader::~WifiMacHeader () |
49 {} |
52 {} |
50 |
53 |
51 void |
54 void |
124 { |
127 { |
125 m_ctrlType = TYPE_DATA; |
128 m_ctrlType = TYPE_DATA; |
126 m_ctrlSubtype = 0; |
129 m_ctrlSubtype = 0; |
127 } |
130 } |
128 void |
131 void |
129 WifiMacHeader::SetType (enum WifiMacType_e type) |
132 WifiMacHeader::SetType (enum WifiMacType type) |
130 { |
133 { |
131 switch (type) { |
134 switch (type) { |
132 case WIFI_MAC_CTL_BACKREQ: |
135 case WIFI_MAC_CTL_BACKREQ: |
133 m_ctrlType = TYPE_CTL; |
136 m_ctrlType = TYPE_CTL; |
134 m_ctrlSubtype = SUBTYPE_CTL_BACKREQ; |
137 m_ctrlSubtype = SUBTYPE_CTL_BACKREQ; |
297 } |
300 } |
298 void WifiMacHeader::SetQosTid (uint8_t tid) |
301 void WifiMacHeader::SetQosTid (uint8_t tid) |
299 { |
302 { |
300 m_qosTid = tid; |
303 m_qosTid = tid; |
301 } |
304 } |
|
305 void WifiMacHeader::SetQosEosp () |
|
306 { |
|
307 m_qosEosp = 1; |
|
308 } |
|
309 void WifiMacHeader::SetQosNoEosp () |
|
310 { |
|
311 m_qosEosp = 0; |
|
312 } |
|
313 void WifiMacHeader::SetQosAckPolicy (enum QosAckPolicy policy) |
|
314 { |
|
315 switch (policy) { |
|
316 case NORMAL_ACK : |
|
317 m_qosAckPolicy = 0; |
|
318 break; |
|
319 case NO_ACK : |
|
320 m_qosAckPolicy = 2; |
|
321 break; |
|
322 case NO_EXPLICIT_ACK : |
|
323 m_qosAckPolicy = 1; |
|
324 break; |
|
325 case BLOCK_ACK : |
|
326 m_qosAckPolicy = 3; |
|
327 break; |
|
328 } |
|
329 } |
|
330 void WifiMacHeader::SetQosAmsdu (void) |
|
331 { |
|
332 m_amsduPresent = 1; |
|
333 } |
|
334 void WifiMacHeader::SetQosNoAmsdu (void) |
|
335 { |
|
336 m_amsduPresent = 0; |
|
337 } |
302 void WifiMacHeader::SetQosTxopLimit (uint8_t txop) |
338 void WifiMacHeader::SetQosTxopLimit (uint8_t txop) |
303 { |
339 { |
304 m_qosStuff = txop; |
340 m_qosStuff = txop; |
305 } |
341 } |
306 |
342 |
322 Mac48Address |
358 Mac48Address |
323 WifiMacHeader::GetAddr4 (void) const |
359 WifiMacHeader::GetAddr4 (void) const |
324 { |
360 { |
325 return m_addr4; |
361 return m_addr4; |
326 } |
362 } |
327 enum WifiMacType_e |
363 |
|
364 enum WifiMacType |
328 WifiMacHeader::GetType (void) const |
365 WifiMacHeader::GetType (void) const |
329 { |
366 { |
330 switch (m_ctrlType) { |
367 switch (m_ctrlType) { |
331 case TYPE_MGT: |
368 case TYPE_MGT: |
332 switch (m_ctrlSubtype) { |
369 switch (m_ctrlSubtype) { |
433 } |
470 } |
434 break; |
471 break; |
435 } |
472 } |
436 // NOTREACHED |
473 // NOTREACHED |
437 NS_ASSERT (false); |
474 NS_ASSERT (false); |
438 return (enum WifiMacType_e)-1; |
475 return (enum WifiMacType)-1; |
439 } |
476 } |
440 bool |
477 bool |
441 WifiMacHeader::IsFromDs (void) const |
478 WifiMacHeader::IsFromDs (void) const |
442 { |
479 { |
443 return m_ctrlFromDs == 1; |
480 return m_ctrlFromDs == 1; |
606 WifiMacHeader::IsQosAck (void) const |
643 WifiMacHeader::IsQosAck (void) const |
607 { |
644 { |
608 NS_ASSERT (IsQosData ()); |
645 NS_ASSERT (IsQosData ()); |
609 return (m_qosAckPolicy == 0)?true:false; |
646 return (m_qosAckPolicy == 0)?true:false; |
610 } |
647 } |
|
648 bool |
|
649 WifiMacHeader::IsQosEosp (void) const |
|
650 { |
|
651 NS_ASSERT (IsQosData ()); |
|
652 return (m_qosEosp == 1)?true:false; |
|
653 } |
|
654 bool |
|
655 WifiMacHeader::IsQosAmsdu (void) const |
|
656 { |
|
657 NS_ASSERT (IsQosData ()); |
|
658 return (m_amsduPresent == 1)?true:false; |
|
659 } |
611 uint8_t |
660 uint8_t |
612 WifiMacHeader::GetQosTid (void) const |
661 WifiMacHeader::GetQosTid (void) const |
613 { |
662 { |
614 NS_ASSERT (IsQosData ()); |
663 NS_ASSERT (IsQosData ()); |
615 return m_qosTid; |
664 return m_qosTid; |
616 } |
665 } |
|
666 enum WifiMacHeader::QosAckPolicy |
|
667 WifiMacHeader::GetQosAckPolicy (void) const |
|
668 { |
|
669 switch (m_qosAckPolicy) { |
|
670 case 0 : |
|
671 return NORMAL_ACK; |
|
672 break; |
|
673 case 1 : |
|
674 return NO_ACK; |
|
675 break; |
|
676 case 2 : |
|
677 return NO_EXPLICIT_ACK; |
|
678 break; |
|
679 case 3 : |
|
680 return BLOCK_ACK; |
|
681 break; |
|
682 } |
|
683 // NOTREACHED |
|
684 NS_ASSERT (false); |
|
685 return (enum QosAckPolicy)-1; |
|
686 } |
|
687 |
617 uint8_t |
688 uint8_t |
618 WifiMacHeader::GetQosTxopLimit (void) const |
689 WifiMacHeader::GetQosTxopLimit (void) const |
619 { |
690 { |
620 NS_ASSERT (IsQosData ()); |
691 NS_ASSERT (IsQosData ()); |
621 return m_qosStuff; |
692 return m_qosStuff; |
642 { |
713 { |
643 uint16_t val = 0; |
714 uint16_t val = 0; |
644 val |= m_qosTid; |
715 val |= m_qosTid; |
645 val |= m_qosEosp << 4; |
716 val |= m_qosEosp << 4; |
646 val |= m_qosAckPolicy << 5; |
717 val |= m_qosAckPolicy << 5; |
|
718 val |= m_amsduPresent << 7; |
647 val |= m_qosStuff << 8; |
719 val |= m_qosStuff << 8; |
648 return val; |
720 return val; |
649 } |
721 } |
650 |
722 |
651 void |
723 void |
671 WifiMacHeader::SetQosControl (uint16_t qos) |
743 WifiMacHeader::SetQosControl (uint16_t qos) |
672 { |
744 { |
673 m_qosTid = qos & 0x000f; |
745 m_qosTid = qos & 0x000f; |
674 m_qosEosp = (qos >> 4) & 0x0001; |
746 m_qosEosp = (qos >> 4) & 0x0001; |
675 m_qosAckPolicy = (qos >> 5) & 0x0003; |
747 m_qosAckPolicy = (qos >> 5) & 0x0003; |
|
748 m_amsduPresent = (qos >> 7) & 0x0001; |
676 m_qosStuff = (qos >> 8) & 0x00ff; |
749 m_qosStuff = (qos >> 8) & 0x00ff; |
677 } |
750 } |
678 |
751 |
679 uint32_t |
752 uint32_t |
680 WifiMacHeader::GetSize (void) const |
753 WifiMacHeader::GetSize (void) const |
768 .SetParent<Header> () |
841 .SetParent<Header> () |
769 .AddConstructor<WifiMacHeader> () |
842 .AddConstructor<WifiMacHeader> () |
770 ; |
843 ; |
771 return tid; |
844 return tid; |
772 } |
845 } |
|
846 |
773 TypeId |
847 TypeId |
774 WifiMacHeader::GetInstanceTypeId (void) const |
848 WifiMacHeader::GetInstanceTypeId (void) const |
775 { |
849 { |
776 return GetTypeId (); |
850 return GetTypeId (); |
777 } |
851 } |