src/network/utils/radiotap-header.cc
changeset 11628 243b71de25a0
parent 11479 a3dcf66928f3
--- a/src/network/utils/radiotap-header.cc	Wed Sep 02 16:37:05 2015 -0700
+++ b/src/network/utils/radiotap-header.cc	Thu Sep 03 22:16:49 2015 +0200
@@ -42,7 +42,14 @@
     m_antennaNoise (0),
     m_ampduStatusRef (0),
     m_ampduStatusFlags (0),
-    m_ampduStatusCRC (0)
+    m_ampduStatusCRC (0),
+    m_vhtPad (0),
+    m_vhtKnown (0),
+    m_vhtFlags (0),
+    m_vhtBandwidth (0),
+    m_vhtCoding (0),
+    m_vhtGroupId (0),
+    m_vhtPartialAid (0)
 {
   NS_LOG_FUNCTION (this);
 }
@@ -238,17 +245,17 @@
   //
   if (m_present & RADIOTAP_VHT) // bit 21
     {
-      //not yet implemented
-      start.WriteU16 (0);
-      start.WriteU8 (0);
-      start.WriteU8 (0);
-      start.WriteU8 (0);
-      start.WriteU8 (0);
-      start.WriteU8 (0);
-      start.WriteU8 (0);
-      start.WriteU8 (0);
-      start.WriteU8 (0);
-      start.WriteU16 (0);
+      start.WriteU8 (0, m_vhtPad);
+      start.WriteU16 (m_vhtKnown);
+      start.WriteU8 (m_vhtFlags);
+      start.WriteU8 (m_vhtBandwidth);
+      for (uint8_t i = 0; i < 4; i++)
+        {
+          start.WriteU8 (m_vhtMcsNss[i]);
+        }
+      start.WriteU8 (m_vhtCoding);
+      start.WriteU8 (m_vhtGroupId);
+      start.WriteU16 (m_vhtPartialAid);
     }
 }
 
@@ -450,18 +457,19 @@
   //
   if (m_present & RADIOTAP_VHT) // bit 21
     {
-      //not yet implemented
-      start.ReadU16 ();
-      start.ReadU8 ();
-      start.ReadU8 ();
-      start.ReadU8 ();
-      start.ReadU8 ();
-      start.ReadU8 ();
-      start.ReadU8 ();
-      start.ReadU8 ();
-      start.ReadU8 ();
-      start.ReadU16 ();
-      bytesRead += 12;
+      m_vhtPad = ((2 - bytesRead % 2) % 2);
+      start.Next (m_vhtPad);
+      m_vhtKnown = start.ReadU16 ();
+      m_vhtFlags = start.ReadU8 ();
+      m_vhtBandwidth = start.ReadU8 ();
+      for (uint8_t i = 0; i < 4; i++)
+        {
+          m_vhtMcsNss[i] = start.ReadU8 ();
+        }
+      m_vhtCoding = start.ReadU8 ();
+      m_vhtGroupId = start.ReadU8 ();
+      m_vhtPartialAid = start.ReadU16 ();
+      bytesRead += (12 + m_vhtPad);
     }
 
   NS_ASSERT_MSG (m_length == bytesRead, "RadiotapHeader::Deserialize(): expected and actual lengths inconsistent");
@@ -482,7 +490,17 @@
      << " mcsKnown=" << m_mcsKnown
      << " mcsFlags=" << m_mcsFlags
      << " mcsRate=" << m_mcsRate
-     << " ampduStatusFlags=" << (int16_t) m_ampduStatusFlags;
+     << " ampduStatusFlags=" << (int16_t) m_ampduStatusFlags
+     << " vhtKnown=" << m_vhtKnown
+     << " vhtFlags=" << m_vhtFlags
+     << " vhtBandwidth=" << m_vhtBandwidth
+     << " vhtMcsNss for user 1=" << m_vhtMcsNss[0]
+     << " vhtMcsNss for user 2=" << m_vhtMcsNss[1]
+     << " vhtMcsNss for user 3=" << m_vhtMcsNss[2]
+     << " vhtMcsNss for user 4=" << m_vhtMcsNss[3]
+     << " vhtCoding=" << m_vhtCoding
+     << " vhtGroupId=" << m_vhtGroupId
+     << " vhtPartialAid=" << m_vhtPartialAid;
 }
 
 void
@@ -716,4 +734,98 @@
   return m_ampduStatusFlags;
 }
 
+void
+RadiotapHeader::SetVhtFields (uint16_t known, uint8_t flags, uint8_t bandwidth, uint8_t mcs_nss[4], uint8_t coding, uint8_t group_id, uint16_t partial_aid)
+{
+  NS_LOG_FUNCTION (this << known << flags << mcs_nss[0] << mcs_nss[1] << mcs_nss[2] << mcs_nss[3] << coding << group_id << partial_aid);
+  m_vhtKnown = known;
+  m_vhtFlags = flags;
+  m_vhtBandwidth = bandwidth;
+  for (uint8_t i = 0; i < 4; i++)
+    {
+      m_vhtMcsNss[i] = mcs_nss[i];
+    }
+  m_vhtCoding = coding;
+  m_vhtGroupId = group_id;
+  m_vhtPartialAid = partial_aid;
+  if (!(m_present & RADIOTAP_VHT))
+    {
+      m_vhtPad = ((2 - m_length % 2) % 2);
+      m_present |= RADIOTAP_VHT;
+      m_length += (12 + m_vhtPad);
+    }
+
+  NS_LOG_LOGIC (this << " m_length=" << m_length << " m_present=0x" << std::hex << m_present << std::dec);
+}
+
+uint16_t
+RadiotapHeader::GetVhtKnown () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_vhtKnown;
+}
+
+uint8_t
+RadiotapHeader::GetVhtFlags () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_vhtFlags;
+}
+
+uint8_t
+RadiotapHeader::GetVhtBandwidth () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_vhtBandwidth;
+}
+
+uint8_t
+RadiotapHeader::GetVhtMcsNssUser1 () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_vhtMcsNss[0];
+}
+
+uint8_t
+RadiotapHeader::GetVhtMcsNssUser2 () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_vhtMcsNss[1];
+}
+
+uint8_t
+RadiotapHeader::GetVhtMcsNssUser3 () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_vhtMcsNss[2];
+}
+
+uint8_t
+RadiotapHeader::GetVhtMcsNssUser4 () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_vhtMcsNss[3];
+}
+
+uint8_t
+RadiotapHeader::GetVhtCoding () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_vhtCoding;
+}
+
+uint8_t
+RadiotapHeader::GetVhtGroupId () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_vhtGroupId;
+}
+
+uint8_t
+RadiotapHeader::GetVhtPartialAid () const
+{
+  NS_LOG_FUNCTION (this);
+  return m_vhtPartialAid;
+}
+
 } // namespace ns3