Index: src/wifi/model/wifi-mac-header.cc |
=================================================================== |
--- a/src/wifi/model/wifi-mac-header.cc |
+++ b/src/wifi/model/wifi-mac-header.cc |
@@ -44,7 +44,9 @@ |
SUBTYPE_CTL_BACKRESP = 9, |
SUBTYPE_CTL_RTS = 11, |
SUBTYPE_CTL_CTS = 12, |
- SUBTYPE_CTL_ACK = 13 |
+ SUBTYPE_CTL_ACK = 13, |
+ SUBTYPE_CTL_END = 14, |
+ SUBTYPE_CTL_END_ACK = 15 |
}; |
WifiMacHeader::WifiMacHeader () |
@@ -108,7 +110,7 @@ |
} |
void |
-WifiMacHeader::SetType (WifiMacType type) |
+WifiMacHeader::SetType (WifiMacType type, bool resetToDsFromDs) |
{ |
switch (type) |
{ |
@@ -136,6 +138,14 @@ |
m_ctrlType = TYPE_CTL; |
m_ctrlSubtype = SUBTYPE_CTL_ACK; |
break; |
+ case WIFI_MAC_CTL_END: |
+ m_ctrlType = TYPE_CTL; |
+ m_ctrlSubtype = SUBTYPE_CTL_END; |
+ break; |
+ case WIFI_MAC_CTL_END_ACK: |
+ m_ctrlType = TYPE_CTL; |
+ m_ctrlSubtype = SUBTYPE_CTL_END_ACK; |
+ break; |
case WIFI_MAC_MGT_ASSOCIATION_REQUEST: |
m_ctrlType = TYPE_MGT; |
m_ctrlSubtype = 0; |
@@ -249,8 +259,17 @@ |
m_ctrlSubtype = 15; |
break; |
} |
- m_ctrlToDs = 0; |
- m_ctrlFromDs = 0; |
+ if (resetToDsFromDs) |
+ { |
+ m_ctrlToDs = 0; |
+ m_ctrlFromDs = 0; |
+ } |
+} |
+ |
+void |
+WifiMacHeader::SetRawDuration (uint16_t duration) |
+{ |
+ m_duration = duration; |
} |
void |
@@ -443,6 +462,10 @@ |
return WIFI_MAC_CTL_CTS; |
case SUBTYPE_CTL_ACK: |
return WIFI_MAC_CTL_ACK; |
+ case SUBTYPE_CTL_END: |
+ return WIFI_MAC_CTL_END; |
+ case SUBTYPE_CTL_END_ACK: |
+ return WIFI_MAC_CTL_END_ACK; |
} |
break; |
case TYPE_DATA: |
@@ -524,7 +547,7 @@ |
} |
bool |
-WifiMacHeader::IsCfpoll (void) const |
+WifiMacHeader::IsCfPoll (void) const |
{ |
switch (GetType ()) |
{ |
@@ -543,6 +566,55 @@ |
} |
bool |
+WifiMacHeader::IsCfEnd (void) const |
+{ |
+ switch (GetType ()) |
+ { |
+ case WIFI_MAC_CTL_END: |
+ case WIFI_MAC_CTL_END_ACK: |
+ return true; |
+ default: |
+ return false; |
+ } |
+} |
+ |
+bool |
+WifiMacHeader::IsCfAck (void) const |
+{ |
+ switch (GetType ()) |
+ { |
+ case WIFI_MAC_DATA_CFACK: |
+ case WIFI_MAC_DATA_CFACK_CFPOLL: |
+ case WIFI_MAC_DATA_NULL_CFACK: |
+ case WIFI_MAC_DATA_NULL_CFACK_CFPOLL: |
+ case WIFI_MAC_CTL_END_ACK: |
+ return true; |
+ default: |
+ return false; |
+ break; |
+ } |
+} |
+ |
+bool |
+WifiMacHeader::HasData (void) const |
+{ |
+ switch (GetType ()) |
+ { |
+ case WIFI_MAC_DATA: |
+ case WIFI_MAC_DATA_CFACK: |
+ case WIFI_MAC_DATA_CFPOLL: |
+ case WIFI_MAC_DATA_CFACK_CFPOLL: |
+ case WIFI_MAC_QOSDATA: |
+ case WIFI_MAC_QOSDATA_CFACK: |
+ case WIFI_MAC_QOSDATA_CFPOLL: |
+ case WIFI_MAC_QOSDATA_CFACK_CFPOLL: |
+ return true; |
+ default: |
+ return false; |
+ } |
+} |
+ |
+bool |
WifiMacHeader::IsRts (void) const |
{ |
return (GetType () == WIFI_MAC_CTL_RTS); |
@@ -644,6 +716,12 @@ |
return (GetType () == WIFI_MAC_CTL_BACKRESP) ? true : false; |
} |
+uint16_t |
+WifiMacHeader::GetRawDuration (void) const |
+{ |
+ return m_duration; |
+} |
+ |
Time |
WifiMacHeader::GetDuration (void) const |
{ |
@@ -792,16 +870,16 @@ |
switch (m_ctrlSubtype) |
{ |
case SUBTYPE_CTL_RTS: |
+ case SUBTYPE_CTL_BACKREQ: |
+ case SUBTYPE_CTL_BACKRESP: |
+ case SUBTYPE_CTL_END: |
+ case SUBTYPE_CTL_END_ACK: |
size = 2 + 2 + 6 + 6; |
break; |
case SUBTYPE_CTL_CTS: |
case SUBTYPE_CTL_ACK: |
size = 2 + 2 + 6; |
break; |
- case SUBTYPE_CTL_BACKREQ: |
- case SUBTYPE_CTL_BACKRESP: |
- size = 2 + 2 + 6 + 6; |
- break; |
case SUBTYPE_CTL_CTLWRAPPER: |
size = 2 + 2 + 6 + 2 + 4; |
break; |
@@ -837,6 +915,8 @@ |
FOO (CTL_ACK); |
FOO (CTL_BACKREQ); |
FOO (CTL_BACKRESP); |
+ FOO (CTL_END); |
+ FOO (CTL_END_ACK); |
FOO (MGT_BEACON); |
FOO (MGT_ASSOCIATION_REQUEST); |
@@ -916,10 +996,6 @@ |
os << "Duration/ID=" << m_duration << "us" |
<< ", RA=" << m_addr1; |
break; |
- case WIFI_MAC_CTL_BACKREQ: |
- case WIFI_MAC_CTL_BACKRESP: |
- case WIFI_MAC_CTL_CTLWRAPPER: |
- break; |
case WIFI_MAC_MGT_BEACON: |
case WIFI_MAC_MGT_ASSOCIATION_REQUEST: |
case WIFI_MAC_MGT_ASSOCIATION_RESPONSE: |
@@ -974,6 +1050,11 @@ |
os << ", FragNumber=" << std::hex << (int) m_seqFrag << std::dec |
<< ", SeqNumber=" << m_seqSeq; |
break; |
+ case WIFI_MAC_CTL_BACKREQ: |
+ case WIFI_MAC_CTL_BACKRESP: |
+ case WIFI_MAC_CTL_CTLWRAPPER: |
+ case WIFI_MAC_CTL_END: |
+ case WIFI_MAC_CTL_END_ACK: |
case WIFI_MAC_DATA_CFACK: |
case WIFI_MAC_DATA_CFPOLL: |
case WIFI_MAC_DATA_CFACK_CFPOLL: |
@@ -988,6 +1069,7 @@ |
case WIFI_MAC_QOSDATA_NULL: |
case WIFI_MAC_QOSDATA_NULL_CFPOLL: |
case WIFI_MAC_QOSDATA_NULL_CFACK_CFPOLL: |
+ default: |
break; |
} |
} |
@@ -1015,15 +1097,15 @@ |
switch (m_ctrlSubtype) |
{ |
case SUBTYPE_CTL_RTS: |
+ case SUBTYPE_CTL_BACKREQ: |
+ case SUBTYPE_CTL_BACKRESP: |
+ case SUBTYPE_CTL_END: |
+ case SUBTYPE_CTL_END_ACK: |
WriteTo (i, m_addr2); |
break; |
case SUBTYPE_CTL_CTS: |
case SUBTYPE_CTL_ACK: |
break; |
- case SUBTYPE_CTL_BACKREQ: |
- case SUBTYPE_CTL_BACKRESP: |
- WriteTo (i, m_addr2); |
- break; |
default: |
//NOTREACHED |
NS_ASSERT (false); |
@@ -1070,15 +1152,15 @@ |
switch (m_ctrlSubtype) |
{ |
case SUBTYPE_CTL_RTS: |
+ case SUBTYPE_CTL_BACKREQ: |
+ case SUBTYPE_CTL_BACKRESP: |
+ case SUBTYPE_CTL_END: |
+ case SUBTYPE_CTL_END_ACK: |
ReadFrom (i, m_addr2); |
break; |
case SUBTYPE_CTL_CTS: |
case SUBTYPE_CTL_ACK: |
break; |
- case SUBTYPE_CTL_BACKREQ: |
- case SUBTYPE_CTL_BACKRESP: |
- ReadFrom (i, m_addr2); |
- break; |
} |
break; |
case TYPE_DATA: |