make 802.11s model more compliant to the IEEE802.11s-2012 standard

This commit is contained in:
Christopher Hepner
2015-05-05 15:10:55 -07:00
parent 964748e197
commit e31acccefc
10 changed files with 261 additions and 249 deletions

View File

@@ -99,7 +99,7 @@ HwmpProtocolMac::ReceiveAction (Ptr<Packet> packet, const WifiMacHeader & header
m_stats.rxMgtBytes += packet->GetSize ();
WifiActionHeader actionHdr;
packet->RemoveHeader (actionHdr);
if (actionHdr.GetCategory () != WifiActionHeader::MESH_PATH_SELECTION)
if (actionHdr.GetCategory () != WifiActionHeader::MESH)
{
return true;
}
@@ -210,8 +210,8 @@ HwmpProtocolMac::GetWifiActionHeader ()
{
WifiActionHeader actionHdr;
WifiActionHeader::ActionValue action;
action.pathSelection = WifiActionHeader::PATH_SELECTION;
actionHdr.SetAction (WifiActionHeader::MESH_PATH_SELECTION, action);
action.meshAction = WifiActionHeader::PATH_SELECTION;
actionHdr.SetAction (WifiActionHeader::MESH, action);
return actionHdr;
}
void

View File

@@ -32,17 +32,17 @@ Dot11sMeshCapability::Dot11sMeshCapability () :
uint8_t
Dot11sMeshCapability::GetSerializedSize () const
{
return 2;
return 1;
}
uint16_t
Dot11sMeshCapability::GetUint16 () const
uint8_t
Dot11sMeshCapability::GetUint8 () const //IEEE 802.11-2012 8.4.2.100.8 Mesh Capability
{
uint16_t result = 0;
uint8_t result = 0;
if (acceptPeerLinks)
{
result |= 1 << 0;
result |= 1 << 0; //The Accepting Additional Mesh Peerings subfield is set to 1 if the mesh STA is willing to establish additional mesh peerings with other mesh STAs and set to 0 otherwise
}
if (MCCASupported)
if (MCCASupported) // The MCCA Supported subfield is set to 1 if the mesh STA implements MCCA and set to 0 otherwise
{
result |= 1 << 1;
}
@@ -71,13 +71,13 @@ Dot11sMeshCapability::GetUint16 () const
Buffer::Iterator
Dot11sMeshCapability::Serialize (Buffer::Iterator i) const
{
i.WriteHtolsbU16 (GetUint16 ());
i.WriteU8 (GetUint8 ());
return i;
}
Buffer::Iterator
Dot11sMeshCapability::Deserialize (Buffer::Iterator i)
{
uint16_t cap = i.ReadLsbtohU16 ();
uint8_t cap = i.ReadU8 ();
acceptPeerLinks = Is (cap, 0);
MCCASupported = Is (cap, 1);
MCCAEnabled = Is (cap, 2);
@@ -88,7 +88,7 @@ Dot11sMeshCapability::Deserialize (Buffer::Iterator i)
return i;
}
bool
Dot11sMeshCapability::Is (uint16_t cap, uint8_t n) const
Dot11sMeshCapability::Is (uint8_t cap, uint8_t n) const
{
uint16_t mask = 1 << n;
return (cap & mask);
@@ -107,29 +107,28 @@ IeConfiguration::IeConfiguration () :
uint8_t
IeConfiguration::GetInformationFieldSize () const
{
return 1 // Version
+ 4 // APSPId
+ 4 // APSMId
+ 4 // CCMId
+ 4 // SPId
+ 4 // APId
return 0 // Version
+ 1 // APSPId
+ 1 // APSMId
+ 1 // CCMId
+ 1 // SPId
+ 1 // APId
+ 1 // Mesh formation info (see 7.3.2.86.6 of 802.11s draft 3.0)
+ m_meshCap.GetSerializedSize ();
}
void
IeConfiguration::SerializeInformationField (Buffer::Iterator i) const
{
i.WriteU8 (1); //Version
// Active Path Selection Protocol ID:
i.WriteHtolsbU32 (m_APSPId);
i.WriteU8 (m_APSPId);
// Active Path Metric ID:
i.WriteHtolsbU32 (m_APSMId);
i.WriteU8 (m_APSMId);
// Congestion Control Mode ID:
i.WriteHtolsbU32 (m_CCMId);
i.WriteU8 (m_CCMId);
// Sync:
i.WriteHtolsbU32 (m_SPId);
i.WriteU8 (m_SPId);
// Auth:
i.WriteHtolsbU32 (m_APId);
i.WriteU8 (m_APId);
i.WriteU8 (m_neighbors << 1);
m_meshCap.Serialize (i);
}
@@ -137,20 +136,14 @@ uint8_t
IeConfiguration::DeserializeInformationField (Buffer::Iterator i, uint8_t length)
{
Buffer::Iterator start = i;
uint8_t version;
version = i.ReadU8 ();
if (version != 1)
{
NS_FATAL_ERROR ("Other versions not supported yet");
}
// Active Path Selection Protocol ID:
m_APSPId = (dot11sPathSelectionProtocol) i.ReadLsbtohU32 ();
m_APSPId = (dot11sPathSelectionProtocol) i.ReadU8 ();
// Active Path Metric ID:
m_APSMId = (dot11sPathSelectionMetric) i.ReadLsbtohU32 ();
m_APSMId = (dot11sPathSelectionMetric) i.ReadU8 ();
// Congestion Control Mode ID:
m_CCMId = (dot11sCongestionControlMode) i.ReadLsbtohU32 ();
m_SPId = (dot11sSynchronizationProtocolIdentifier) i.ReadLsbtohU32 ();
m_APId = (dot11sAuthenticationProtocol) i.ReadLsbtohU32 ();
m_CCMId = (dot11sCongestionControlMode) i.ReadU8 ();
m_SPId = (dot11sSynchronizationProtocolIdentifier) i.ReadU8 ();
m_APId = (dot11sAuthenticationProtocol) i.ReadU8 ();
m_neighbors = (i.ReadU8 () >> 1) & 0xF;
i = m_meshCap.Deserialize (i);
return i.GetDistanceFrom (start);
@@ -165,7 +158,7 @@ IeConfiguration::Print (std::ostream& os) const
<< std::endl << "Congestion Control Mode ID: = " << (uint32_t) m_CCMId
<< std::endl << "Synchronize protocol ID: = " << (uint32_t) m_SPId
<< std::endl << "Authentication protocol ID: = " << (uint32_t) m_APId
<< std::endl << "Capabilities: = " << m_meshCap.GetUint16 () << std::endl;
<< std::endl << "Capabilities: = " << m_meshCap.GetUint8 () << std::endl;
os << "</information_element>" << std::endl;
}
void

View File

@@ -27,48 +27,41 @@
namespace ns3 {
namespace dot11s {
/**
* \ingroup dot11s
* \brief See 7.3.2.86.1 in 802.11s draft 3.0
*/
//according to IEEE 802.11 - 2012
//in 7.3.2.98.2 Active Path Selection Protocol Identifier - 802.11s-2011
enum dot11sPathSelectionProtocol
{
PROTOCOL_HWMP = 0x000fac00,
PROTOCOL_HWMP = 0x01,
};
/**
* \ingroup dot11s
* \brief See 7.3.2.86.2 in 802.11s draft 3.0
*/
//in 7.3.2.98.3 Active Path Selection Metric Identifier - 802.11s-2011
enum dot11sPathSelectionMetric
{
METRIC_AIRTIME = 0x000fac00,
METRIC_AIRTIME = 0x01,
};
/**
* \ingroup dot11s
* \brief See 7.3.2.86.3 in 802.11s draft 3.0
*/
// in 7.3.2.98.4 Congestion Control Mode Identifier - 802.11s-2011
enum dot11sCongestionControlMode
{
CONGESTION_SIGNALING = 0x000fac00,
CONGESTION_NULL = 0x000facff,
CONGESTION_SIGNALING = 0x01,
CONGESTION_NULL = 0x00,
};
/**
* \ingroup dot11s
* \brief See 7.3.2.86.4 in 802.11s draft 3.0
*/
// in 7.3.2.98.5 Synchronization Method Identifier - 802.11s-2011
enum dot11sSynchronizationProtocolIdentifier
{
SYNC_NEIGHBOUR_OFFSET = 0x000fac00,
SYNC_NULL = 0x000facff,
SYNC_NEIGHBOUR_OFFSET = 0x01, //Neighbor offset synchronization method
SYNC_NULL = 0x00, //Reserved
};
/**
* \ingroup dot11s
* \brief See 7.3.2.86.5 in 802.11s draft 3.0
*/
// in 7.3.2.98.6 Authentication Protocol Identifier - 802.11s-2011
enum dot11sAuthenticationProtocol
{
AUTH_NULL = 0x000fac00,
AUTH_SAE = 0x000fac01,
AUTH_NULL = 0x00, //No authentication method is required to establish mesh peerings within the MBSS
AUTH_SAE = 0x01, //SAE defined in 8.2a
AUTH_IEEE = 0x02, //IEEE 802.1X authentication
};
/**
* \ingroup dot11s
@@ -81,7 +74,7 @@ public:
uint8_t GetSerializedSize () const;
Buffer::Iterator Serialize (Buffer::Iterator i) const;
Buffer::Iterator Deserialize (Buffer::Iterator i);
uint16_t GetUint16 () const;
uint8_t GetUint8 () const;
bool acceptPeerLinks;
bool MCCASupported;
bool MCCAEnabled;
@@ -89,7 +82,7 @@ public:
bool beaconTimingReport;
bool TBTTAdjustment;
bool powerSaveLevel;
bool Is (uint16_t cap,uint8_t n) const;
bool Is (uint8_t cap,uint8_t n) const;
friend bool operator== (const Dot11sMeshCapability & a, const Dot11sMeshCapability & b);
};

View File

@@ -33,31 +33,30 @@ namespace dot11s {
*/
enum PmpReasonCode
{
REASON11S_PEERING_CANCELLED = 2, // according to open80211s
REASON11S_MESH_MAX_PEERS,
REASON11S_MESH_CAPABILITY_POLICY_VIOLATION,
REASON11S_MESH_CLOSE_RCVD,
REASON11S_MESH_MAX_RETRIES,
REASON11S_MESH_CONFIRM_TIMEOUT,
REASON11S_MESH_INVALID_GTK,
REASON11S_MESH_INCONSISTENT_PARAMETERS,
REASON11S_MESH_INVALID_SECURITY_CAPABILITY,
REASON11S_RESERVED,
REASON11S_PEERING_CANCELLED = 52, // according to IEEE 802.11 - 2012
REASON11S_MESH_MAX_PEERS = 53,
REASON11S_MESH_CAPABILITY_POLICY_VIOLATION = 54,
REASON11S_MESH_CLOSE_RCVD = 55,
REASON11S_MESH_MAX_RETRIES = 56,
REASON11S_MESH_CONFIRM_TIMEOUT = 57,
REASON11S_MESH_INVALID_GTK = 58,
REASON11S_MESH_INCONSISTENT_PARAMETERS = 59,
REASON11S_MESH_INVALID_SECURITY_CAPABILITY =60,
REASON11S_RESERVED = 67,
};
/**
* \ingroup dot11s
* \brief See 7.3.2.85 of draft 2.07
*/
// according to IEEE 802.11 - 2012
class IePeerManagement : public WifiInformationElement
{
public:
IePeerManagement ();
enum Subtype
{
PEER_OPEN = 0,
PEER_CONFIRM,
PEER_CLOSE,
PEER_OPEN = 1,
PEER_CONFIRM = 2,
PEER_CLOSE = 3,
};
void SetPeerOpen (uint16_t localLinkId);
void SetPeerClose (uint16_t localLinkID, uint16_t peerLinkId, PmpReasonCode reasonCode);

View File

@@ -54,28 +54,33 @@ IePerr::GetNumOfDest () const
void
IePerr::SerializeInformationField (Buffer::Iterator i) const
{
i.WriteU8 (0);
i.WriteU8 (m_addressUnits.size ());
i.WriteU8 (0);// TTL
i.WriteU8 (m_addressUnits.size ()); // number of Destinations
for (unsigned int j = 0; j < m_addressUnits.size (); j++)
{
i.WriteU8 (0); // not used // Bit 6: AE (Address Extension) subfield (1 = destination external address is present, 0 = otherwise).
WriteTo (i, m_addressUnits[j].destination);
i.WriteHtolsbU32 (m_addressUnits[j].seqnum);
i.WriteU8 (0);
i.WriteU8 (0);
}
}
uint8_t
IePerr::DeserializeInformationField (Buffer::Iterator start, uint8_t length)
{
Buffer::Iterator i = start;
i.Next (1); //Mode flags is not used now
i.Next (1); //TTL //Mode flags is not used now
uint8_t numOfDest = i.ReadU8 ();
NS_ASSERT ((2 + 10 * numOfDest ) == length);
NS_ASSERT ((2 + 13 * numOfDest ) == length);
length = 0; //to avoid compiler warning in optimized builds
for (unsigned int j = 0; j < numOfDest; j++)
{
i.Next (1); // flags is not used now
HwmpProtocol::FailedDestination unit;
ReadFrom (i, unit.destination);
unit.seqnum = i.ReadLsbtohU32 ();
m_addressUnits.push_back (unit);
i.Next (2); // Reason
}
return i.GetDistanceFrom (start);
}
@@ -83,9 +88,11 @@ IePerr::DeserializeInformationField (Buffer::Iterator start, uint8_t length)
uint8_t
IePerr::GetInformationFieldSize () const
{
uint8_t retval = 1 //ModeFlags
uint8_t retval = 1 //TTL //ModeFlags
+ 1 //NumOfDests
+ (6 + 4) * m_addressUnits.size ();
+ 1 * m_addressUnits.size () //ModeFlags
+ (6 + 4) * m_addressUnits.size ()
+ 2* m_addressUnits.size (); // Reason Code
return retval;
}
@@ -99,7 +106,7 @@ IePerr::AddAddressUnit (HwmpProtocol::FailedDestination unit)
return;
}
}
if ((m_addressUnits.size () + 1) * 10 + 2 > 255)
if ((m_addressUnits.size () + 1) * 13 + 2 > 255)
{
return;
}
@@ -112,7 +119,7 @@ IePerr::IsFull () const
return (GetInformationFieldSize ()
> 255
- 2 /* ID + LENGTH*/
- 10 /* Size of Mac48Address + uint32_t (one unit)*/
- 13// 10 /* Size of Mac48Address + uint32_t (one unit)*/
);
}
std::vector<HwmpProtocol::FailedDestination>

View File

@@ -30,7 +30,7 @@ NS_OBJECT_ENSURE_REGISTERED (PeerLinkFrameStart);
PeerLinkFrameStart::PeerLinkFrameStart () :
m_subtype (255), m_capability (0), m_aid (0), m_rates (SupportedRates ()), m_meshId (),
m_config (IeConfiguration ()), m_reasonCode ((uint16_t)REASON11S_RESERVED)
m_config (IeConfiguration ())
{
}
void
@@ -42,7 +42,7 @@ void
PeerLinkFrameStart::SetPlinkFrameStart (PeerLinkFrameStart::PlinkFrameStartFields fields)
{
m_subtype = fields.subtype;
m_protocol = fields.protocol;
if (m_subtype != (uint8_t)(WifiActionHeader::PEER_LINK_CLOSE))
{
m_capability = fields.capability;
@@ -65,7 +65,7 @@ PeerLinkFrameStart::SetPlinkFrameStart (PeerLinkFrameStart::PlinkFrameStartField
}
else
{
m_reasonCode = fields.reasonCode;
//reasonCode not used here
}
}
PeerLinkFrameStart::PlinkFrameStartFields
@@ -79,7 +79,7 @@ PeerLinkFrameStart::GetFields () const
retval.rates = m_rates;
retval.meshId = m_meshId;
retval.config = m_config;
retval.reasonCode = m_reasonCode;
return retval;
}
TypeId
@@ -107,8 +107,8 @@ PeerLinkFrameStart::Print (std::ostream &os) const
uint32_t
PeerLinkFrameStart::GetSerializedSize () const
{
uint32_t size = 3; //Peering protocol
NS_ASSERT (m_subtype < 3);
uint32_t size =0; //Peering protocol
NS_ASSERT (m_subtype < 4);
if ((uint8_t)(WifiActionHeader::PEER_LINK_CLOSE) != m_subtype)
{
size += 2; //capability
@@ -132,7 +132,7 @@ PeerLinkFrameStart::GetSerializedSize () const
}
else
{
size += 2; //reasonCode
//reasonCode not used here
}
return size;
}
@@ -140,8 +140,8 @@ void
PeerLinkFrameStart::Serialize (Buffer::Iterator start) const
{
Buffer::Iterator i = start;
NS_ASSERT (m_subtype < 3);
i = m_protocol.Serialize (i);
NS_ASSERT (m_subtype < 4);
if ((uint8_t)(WifiActionHeader::PEER_LINK_CLOSE) != m_subtype)
{
i.WriteHtolsbU16 (m_capability);
@@ -165,24 +165,15 @@ PeerLinkFrameStart::Serialize (Buffer::Iterator start) const
}
else
{
i.WriteHtolsbU16 (m_reasonCode);
//reasonCode not used here
}
}
uint32_t
PeerLinkFrameStart::Deserialize (Buffer::Iterator start)
{
Buffer::Iterator i = start;
NS_ASSERT (m_subtype < 3);
{
uint8_t id = i.ReadU8 ();
uint8_t length = i.ReadU8 ();
m_protocol.DeserializeInformationField (i, length);
if ((m_protocol.ElementId () != (WifiInformationElementId) id) || (m_protocol.GetInformationFieldSize () != length))
{
NS_FATAL_ERROR ("Broken frame: Element ID does not match IE itself!");
}
i.Next (m_protocol.GetInformationFieldSize ());
}
NS_ASSERT (m_subtype < 4);
if ((uint8_t)(WifiActionHeader::PEER_LINK_CLOSE) != m_subtype)
{
m_capability = i.ReadLsbtohU16 ();
@@ -220,7 +211,7 @@ PeerLinkFrameStart::Deserialize (Buffer::Iterator start)
}
else
{
m_reasonCode = i.ReadLsbtohU16 ();
//reasonCode not used here
}
return i.GetDistanceFrom (start);
}
@@ -228,8 +219,8 @@ bool
operator== (const PeerLinkFrameStart & a, const PeerLinkFrameStart & b)
{
return ((a.m_subtype == b.m_subtype) && (a.m_capability == b.m_capability) && (a.m_aid == b.m_aid)
&& (a.m_meshId.IsEqual (b.m_meshId)) && (a.m_config == b.m_config)
&& (a.m_reasonCode == b.m_reasonCode));
&& (a.m_meshId.IsEqual (b.m_meshId)) && (a.m_config == b.m_config));
}
} // namespace dot11s
} // namespace ns3

View File

@@ -88,7 +88,7 @@ PeerManagementProtocolMac::Receive (Ptr<Packet> const_packet, const WifiMacHeade
packet->RemoveHeader (actionHdr);
WifiActionHeader::ActionValue actionValue = actionHdr.GetAction ();
// If can not handle - just return;
if (actionHdr.GetCategory () != WifiActionHeader::MESH_PEERING_MGT)
if (actionHdr.GetCategory () != WifiActionHeader::SELF_PROTECTED)
{
return m_protocol->IsActiveLink (m_ifIndex, header.GetAddr2 ());
}
@@ -99,20 +99,19 @@ PeerManagementProtocolMac::Receive (Ptr<Packet> const_packet, const WifiMacHeade
PeerLinkFrameStart::PlinkFrameStartFields fields;
{
PeerLinkFrameStart peerFrame;
peerFrame.SetPlinkFrameSubtype ((uint8_t) actionValue.peerLink);
peerFrame.SetPlinkFrameSubtype ((uint8_t) actionValue.selfProtectedAction);
packet->RemoveHeader (peerFrame);
fields = peerFrame.GetFields ();
NS_ASSERT (fields.subtype == actionValue.peerLink);
NS_ASSERT (fields.subtype == actionValue.selfProtectedAction);
}
if ((actionValue.peerLink != WifiActionHeader::PEER_LINK_CLOSE) && !(m_parent->CheckSupportedRates (
fields.rates)))
if ((actionValue.selfProtectedAction != WifiActionHeader::PEER_LINK_CLOSE) && !(m_parent->CheckSupportedRates (fields.rates)))
{
m_protocol->ConfigurationMismatch (m_ifIndex, peerAddress);
// Broken peer link frame - drop it
m_stats.brokenMgt++;
return false;
}
if ((actionValue.peerLink != WifiActionHeader::PEER_LINK_CONFIRM) && !fields.meshId.IsEqual (
if ((actionValue.selfProtectedAction != WifiActionHeader::PEER_LINK_CONFIRM) && !fields.meshId.IsEqual (
*(m_protocol->GetMeshId ())))
{
m_protocol->ConfigurationMismatch (m_ifIndex, peerAddress);
@@ -125,22 +124,23 @@ PeerManagementProtocolMac::Receive (Ptr<Packet> const_packet, const WifiMacHeade
MeshInformationElementVector elements;
packet->RemoveHeader (elements);
peerElement = DynamicCast<IePeerManagement>(elements.FindFirst (IE11S_PEERING_MANAGEMENT));
NS_ASSERT (peerElement != 0);
//Check taht frame subtype corresponds peer link subtype
if (peerElement->SubtypeIsOpen ())
{
m_stats.rxOpen++;
NS_ASSERT (actionValue.peerLink == WifiActionHeader::PEER_LINK_OPEN);
NS_ASSERT (actionValue.selfProtectedAction == WifiActionHeader::PEER_LINK_OPEN);
}
if (peerElement->SubtypeIsConfirm ())
{
m_stats.rxConfirm++;
NS_ASSERT (actionValue.peerLink == WifiActionHeader::PEER_LINK_CONFIRM);
NS_ASSERT (actionValue.selfProtectedAction == WifiActionHeader::PEER_LINK_CONFIRM);
}
if (peerElement->SubtypeIsClose ())
{
m_stats.rxClose++;
NS_ASSERT (actionValue.peerLink == WifiActionHeader::PEER_LINK_CLOSE);
NS_ASSERT (actionValue.selfProtectedAction == WifiActionHeader::PEER_LINK_CLOSE);
}
//Deliver Peer link management frame to protocol:
m_protocol->ReceivePeerLinkFrame (m_ifIndex, peerAddress, peerMpAddress, fields.aid, *peerElement,
@@ -158,7 +158,7 @@ PeerManagementProtocolMac::UpdateOutcomingFrame (Ptr<Packet> packet, WifiMacHead
{
WifiActionHeader actionHdr;
packet->PeekHeader (actionHdr);
if (actionHdr.GetCategory () == WifiActionHeader::MESH_PEERING_MGT)
if (actionHdr.GetCategory () == WifiActionHeader::SELF_PROTECTED)
{
return true;
}
@@ -215,27 +215,27 @@ PeerManagementProtocolMac::SendPeerLinkManagementFrame (Mac48Address peerAddress
{
m_stats.txOpen++;
WifiActionHeader::ActionValue action;
action.peerLink = WifiActionHeader::PEER_LINK_OPEN;
action.selfProtectedAction = WifiActionHeader::PEER_LINK_OPEN;
fields.subtype = WifiActionHeader::PEER_LINK_OPEN;
actionHdr.SetAction (WifiActionHeader::MESH_PEERING_MGT, action);
actionHdr.SetAction (WifiActionHeader::SELF_PROTECTED, action);
}
if (peerElement.SubtypeIsConfirm ())
{
m_stats.txConfirm++;
WifiActionHeader::ActionValue action;
action.peerLink = WifiActionHeader::PEER_LINK_CONFIRM;
action.selfProtectedAction = WifiActionHeader::PEER_LINK_CONFIRM;
fields.aid = aid;
fields.subtype = WifiActionHeader::PEER_LINK_CONFIRM;
actionHdr.SetAction (WifiActionHeader::MESH_PEERING_MGT, action);
actionHdr.SetAction (WifiActionHeader::SELF_PROTECTED, action);
}
if (peerElement.SubtypeIsClose ())
{
m_stats.txClose++;
WifiActionHeader::ActionValue action;
action.peerLink = WifiActionHeader::PEER_LINK_CLOSE;
action.selfProtectedAction = WifiActionHeader::PEER_LINK_CLOSE;
fields.subtype = WifiActionHeader::PEER_LINK_CLOSE;
fields.reasonCode = peerElement.GetReasonCode ();
actionHdr.SetAction (WifiActionHeader::MESH_PEERING_MGT, action);
actionHdr.SetAction (WifiActionHeader::SELF_PROTECTED, action);
}
plinkFrame.SetPlinkFrameStart (fields);
packet->AddHeader (plinkFrame);

View File

@@ -25,31 +25,31 @@
namespace ns3 {
#define IE11S_LINK_METRIC_REPORT ((WifiInformationElementId)20)
#define IE11S_CONGESTION_NOTIFICATION ((WifiInformationElementId)21)
#define IE11S_LINK_METRIC_REPORT ((WifiInformationElementId)115)
#define IE11S_CONGESTION_NOTIFICATION ((WifiInformationElementId)116)
#define IE11S_SUPP_MBSS_REG_CLASSES_CHANNELS ((WifiInformationElementId)23)
#define IE11S_MESH_CHANNEL_SWITCH_ANNOUNCEMENT ((WifiInformationElementId)24)
#define IE11S_MESH_TIM ((WifiInformationElementId)25)
#define IE11S_AWAKE_WINDOW ((WifiInformationElementId)26)
#define IE11S_BEACON_TIMING ((WifiInformationElementId)27)
#define IE11S_MCCAOP_SETUP_REQUEST ((WifiInformationElementId)28)
#define IE11S_MCCAOP_SETUP_REPLY ((WifiInformationElementId)29)
#define IE11S_MCCAOP_ADVERTISEMENT ((WifiInformationElementId)30)
#define IE11S_AWAKE_WINDOW ((WifiInformationElementId)119)
#define IE11S_BEACON_TIMING ((WifiInformationElementId)120)
#define IE11S_MCCAOP_SETUP_REQUEST ((WifiInformationElementId)121)
#define IE11S_MCCAOP_SETUP_REPLY ((WifiInformationElementId)122)
#define IE11S_MCCAOP_ADVERTISEMENT ((WifiInformationElementId)123)
#define IE11S_MCCAOP_RESERVATION_TEARDOWN ((WifiInformationElementId)31)
#define IE11S_PORTAL_ANNOUNCEMENT ((WifiInformationElementId)32)
#define IE11S_PROXY_UPDATE ((WifiInformationElementId)37)
#define IE11S_PROXY_UPDATE_CONFIRMATION ((WifiInformationElementId)38)
#define IE11S_PROXY_UPDATE ((WifiInformationElementId)137)
#define IE11S_PROXY_UPDATE_CONFIRMATION ((WifiInformationElementId)138)
#define IE11S_ABBREVIATED_HANDSHAKE ((WifiInformationElementId)39)
/* begin of open80211s-compatible IDs */
#define IE11S_MESH_CONFIGURATION ((WifiInformationElementId)51)
#define IE11S_MESH_ID ((WifiInformationElementId)52)
#define IE11S_PEERING_MANAGEMENT ((WifiInformationElementId)55)
#define IE11S_MESH_CONFIGURATION ((WifiInformationElementId)113)
#define IE11S_MESH_ID ((WifiInformationElementId)114)
#define IE11S_PEERING_MANAGEMENT ((WifiInformationElementId)117)
/* end of open80211s-compatible IDs */
#define IE11S_RANN ((WifiInformationElementId)67)
#define IE11S_RANN ((WifiInformationElementId)126)
/* begin of open80211s-compatible IDs */
#define IE11S_PREQ ((WifiInformationElementId)68)
#define IE11S_PREP ((WifiInformationElementId)69)
#define IE11S_PERR ((WifiInformationElementId)70)
#define IE11S_PREQ ((WifiInformationElementId)130)
#define IE11S_PREP ((WifiInformationElementId)131)
#define IE11S_PERR ((WifiInformationElementId)132)
/* end of open80211s-compatible IDs */
#define IE11S_MESH_PEERING_PROTOCOL_VERSION ((WifiInformationElementId)74)

View File

@@ -435,7 +435,7 @@ MgtAssocResponseHeader::GetSerializedSize (void) const
size += 2; // aid
size += m_rates.GetSerializedSize ();
size += m_rates.extended.GetSerializedSize ();
size += m_htCapability.GetSerializedSize();
size += m_htCapability.GetSerializedSize();
return size;
}
@@ -466,7 +466,7 @@ MgtAssocResponseHeader::Deserialize (Buffer::Iterator start)
m_aid = i.ReadLsbtohU16 ();
i = m_rates.Deserialize (i);
i = m_rates.extended.DeserializeIfPresent (i);
i = m_htCapability.DeserializeIfPresent (i);
i = m_htCapability.DeserializeIfPresent (i);
return i.GetDistanceFrom (start);
}
/**********************************************************
@@ -483,7 +483,6 @@ WifiActionHeader::SetAction (WifiActionHeader::CategoryValue type,
WifiActionHeader::ActionValue action)
{
m_category = type;
switch (type)
{
case BLOCK_ACK:
@@ -491,22 +490,25 @@ WifiActionHeader::SetAction (WifiActionHeader::CategoryValue type,
m_actionValue = action.blockAck;
break;
}
case MESH_PEERING_MGT:
case MESH:
{
m_actionValue = action.peerLink;
m_actionValue = action.meshAction;
break;
}
case MESH_PATH_SELECTION:
case MULTIHOP:
{
m_actionValue = action.pathSelection;
m_actionValue = action.multihopAction;
break;
}
case MESH_LINK_METRIC:
case MESH_INTERWORKING:
case MESH_RESOURCE_COORDINATION:
case MESH_PROXY_FORWARDING:
case SELF_PROTECTED:
{
m_actionValue = action.selfProtectedAction;
break;
}
case VENDOR_SPECIFIC_ACTION:
break;
{
break;
}
}
}
WifiActionHeader::CategoryValue
@@ -516,30 +518,25 @@ WifiActionHeader::GetCategory ()
{
case BLOCK_ACK:
return BLOCK_ACK;
case MESH_PEERING_MGT:
return MESH_PEERING_MGT;
case MESH_LINK_METRIC:
return MESH_LINK_METRIC;
case MESH_PATH_SELECTION:
return MESH_PATH_SELECTION;
case MESH_INTERWORKING:
return MESH_INTERWORKING;
case MESH_RESOURCE_COORDINATION:
return MESH_RESOURCE_COORDINATION;
case MESH_PROXY_FORWARDING:
return MESH_PROXY_FORWARDING;
case MESH:
return MESH;
case MULTIHOP:
return MULTIHOP;
case SELF_PROTECTED:
return SELF_PROTECTED;
case VENDOR_SPECIFIC_ACTION:
return VENDOR_SPECIFIC_ACTION;
default:
NS_FATAL_ERROR ("Unknown action value");
return MESH_PEERING_MGT;
return SELF_PROTECTED;
}
}
WifiActionHeader::ActionValue
WifiActionHeader::GetAction ()
{
ActionValue retval;
retval.peerLink = PEER_LINK_OPEN; // Needs to be initialized to something to quiet valgrind in default cases
retval.selfProtectedAction = PEER_LINK_OPEN; // Needs to be initialized to something to quiet valgrind in default cases
switch (m_category)
{
case BLOCK_ACK:
@@ -554,50 +551,92 @@ WifiActionHeader::GetAction ()
case BLOCK_ACK_DELBA:
retval.blockAck = BLOCK_ACK_DELBA;
break ;
}
}
break ;
case MESH_PEERING_MGT:
case SELF_PROTECTED:
switch (m_actionValue)
{
case PEER_LINK_OPEN:
retval.peerLink = PEER_LINK_OPEN;
break ;
retval.selfProtectedAction = PEER_LINK_OPEN;
break;
case PEER_LINK_CONFIRM:
retval.peerLink = PEER_LINK_CONFIRM;
break ;
retval.selfProtectedAction = PEER_LINK_CONFIRM;
break;
case PEER_LINK_CLOSE:
retval.peerLink = PEER_LINK_CLOSE;
break ;
retval.selfProtectedAction = PEER_LINK_CLOSE;
break;
case GROUP_KEY_INFORM:
retval.selfProtectedAction = GROUP_KEY_INFORM;
break;
case GROUP_KEY_ACK:
retval.selfProtectedAction = GROUP_KEY_ACK;
break;
default:
NS_FATAL_ERROR ("Unknown mesh peering management action code");
retval.peerLink = PEER_LINK_OPEN; /* quiet compiler */
retval.selfProtectedAction = PEER_LINK_OPEN; /* quiet compiler */
}
break ;
break ;
case MESH_PATH_SELECTION:
case MESH:
switch (m_actionValue)
{
case LINK_METRIC_REPORT:
retval.meshAction = LINK_METRIC_REPORT;
break;
case PATH_SELECTION:
retval.pathSelection = PATH_SELECTION;
break ;
retval.meshAction = PATH_SELECTION;
break;
case PORTAL_ANNOUNCEMENT:
retval.meshAction = PORTAL_ANNOUNCEMENT;
break;
case CONGESTION_CONTROL_NOTIFICATION:
retval.meshAction = CONGESTION_CONTROL_NOTIFICATION;
break;
case MDA_SETUP_REQUEST:
retval.meshAction = MDA_SETUP_REQUEST;
break;
case MDA_SETUP_REPLY:
retval.meshAction = MDA_SETUP_REPLY;
break;
case MDAOP_ADVERTISMENT_REQUEST:
retval.meshAction = MDAOP_ADVERTISMENT_REQUEST;
break;
case MDAOP_ADVERTISMENTS:
retval.meshAction = MDAOP_ADVERTISMENTS;
break;
case MDAOP_SET_TEARDOWN:
retval.meshAction = MDAOP_SET_TEARDOWN;
break;
case TBTT_ADJUSTMENT_REQUEST:
retval.meshAction = TBTT_ADJUSTMENT_REQUEST;
break;
case TBTT_ADJUSTMENT_RESPONSE:
retval.meshAction = TBTT_ADJUSTMENT_RESPONSE;
break;
default:
NS_FATAL_ERROR ("Unknown mesh path selection action code");
retval.peerLink = PEER_LINK_OPEN; /* quiet compiler */
NS_FATAL_ERROR ("Unknown mesh peering management action code");
retval.selfProtectedAction = PEER_LINK_OPEN; /* quiet compiler */
}
break ;
case VENDOR_SPECIFIC_ACTION:
break ;
case MESH_LINK_METRIC:
// not yet supported
case MESH_INTERWORKING:
// not yet supported
case MESH_RESOURCE_COORDINATION:
// not yet supported
default:
break;
case MULTIHOP: //not yet supported
switch (m_actionValue)
{
case PROXY_UPDATE: //(not used so far)
retval.multihopAction = PROXY_UPDATE;
break;
case PROXY_UPDATE_CONFIRMATION: //(not used so far)
retval.multihopAction = PROXY_UPDATE;
break;
default:
NS_FATAL_ERROR ("Unknown mesh peering management action code");
retval.selfProtectedAction = PEER_LINK_OPEN; /* quiet compiler */
}
break;
default:
NS_FATAL_ERROR ("Unsupported mesh action");
retval.peerLink = PEER_LINK_OPEN; /* quiet compiler */
}
retval.selfProtectedAction = PEER_LINK_OPEN; /* quiet compiler */
}
return retval;
}
TypeId

View File

@@ -339,61 +339,51 @@ public:
WifiActionHeader ();
~WifiActionHeader ();
/**
* Compatible with open80211s implementation
* Category values - see 802.11-2012 Table 8-38
*/
enum CategoryValue
/*
* Compatible with table 8-38 IEEE 802.11, Part11, (Year 2012)
* Category values - see 802.11-2012 Table 8-38 */
enum CategoryValue //table 8-38 staring from IEEE 802.11, Part11, (Year 2012)
{
BLOCK_ACK = 3,
MESH_PEERING_MGT = 30,
MESH_LINK_METRIC = 31,
MESH_PATH_SELECTION = 32,
MESH_INTERWORKING = 33,
MESH_RESOURCE_COORDINATION = 34,
MESH_PROXY_FORWARDING = 35,
MESH = 13, //Category: Mesh
MULTIHOP = 14, //(not used so far)
SELF_PROTECTED = 15, //Category: Self Protected
// since vendor specific action has no stationary Action value,the parse process is not here.
// refer to vendor-specific-action in wave module.
VENDOR_SPECIFIC_ACTION = 127,
};
/**
* Compatible with open80211s implementation
*/
enum PeerLinkMgtActionValue
enum SelfProtectedActionValue //Category: 15 (Self Protected)
{
PEER_LINK_OPEN = 0,
PEER_LINK_CONFIRM = 1,
PEER_LINK_CLOSE = 2,
PEER_LINK_OPEN = 1, //Mesh Peering Open
PEER_LINK_CONFIRM = 2, //Mesh Peering Confirm
PEER_LINK_CLOSE = 3, //Mesh Peering Close
GROUP_KEY_INFORM = 4, //Mesh Group Key Inform
GROUP_KEY_ACK = 5, //Mesh Group Key Acknowledge
};
enum LinkMetricActionValue
enum MultihopActionValue
{
LINK_METRIC_REQUEST = 0,
LINK_METRIC_REPORT,
PROXY_UPDATE = 0, //(not used so far)
PROXY_UPDATE_CONFIRMATION = 1, //(not used so far)
};
/**
* Compatible with open80211s implementation
*/
enum PathSelectionActionValue
enum MeshActionValue
{
PATH_SELECTION = 0,
};
enum InterworkActionValue
{
PORTAL_ANNOUNCEMENT = 0,
};
enum ResourceCoordinationActionValue
{
CONGESTION_CONTROL_NOTIFICATION = 0,
MDA_SETUP_REQUEST,
MDA_SETUP_REPLY,
MDAOP_ADVERTISMENT_REQUEST,
MDAOP_ADVERTISMENTS,
MDAOP_SET_TEARDOWN,
BEACON_TIMING_REQUEST,
BEACON_TIMING_RESPONSE,
TBTT_ADJUSTMENT_REQUEST,
MESH_CHANNEL_SWITCH_ANNOUNCEMENT,
LINK_METRIC_REPORT=0, //Action Value:0 in Category 13: Mesh
PATH_SELECTION = 1, //Action Value:1 in Category 13: Mesh
PORTAL_ANNOUNCEMENT = 2, //Action Value:2 in Category 13: Mesh
CONGESTION_CONTROL_NOTIFICATION = 3,//Action Value:3 in Category 13: Mesh
MDA_SETUP_REQUEST=4, //Action Value:4 in Category 13: Mesh MCCA-Setup-Request (not used so far)
MDA_SETUP_REPLY=5, //Action Value:5 in Category 13: Mesh MCCA-Setup-Reply (not used so far)
MDAOP_ADVERTISMENT_REQUEST=6, //Action Value:6 in Category 13: Mesh MCCA-Advertisement-Request (not used so far)
MDAOP_ADVERTISMENTS=7, //Action Value:7 in Category 13: Mesh (not used so far)
MDAOP_SET_TEARDOWN=8, //Action Value:8 in Category 13: Mesh (not used so far)
TBTT_ADJUSTMENT_REQUEST=9, //Action Value:9 in Category 13: Mesh (not used so far)
TBTT_ADJUSTMENT_RESPONSE=10, //Action Value:10 in Category 13: Mesh (not used so far)
};
/**
* Block ACK action field values
* See 802.11 Table 8-202
@@ -404,16 +394,16 @@ public:
BLOCK_ACK_ADDBA_RESPONSE = 1,
BLOCK_ACK_DELBA = 2
};
/**
* typedef for union of different ActionValues
*/
typedef union
{
enum PeerLinkMgtActionValue peerLink;
enum LinkMetricActionValue linkMetrtic;
enum PathSelectionActionValue pathSelection;
enum InterworkActionValue interwork;
enum ResourceCoordinationActionValue resourceCoordination;
enum MeshActionValue meshAction;
enum MultihopActionValue multihopAction;
enum SelfProtectedActionValue selfProtectedAction;
enum BlockAckActionValue blockAck;
} ActionValue;
/**