diff --git a/src/devices/wifi/qadhoc-wifi-mac.cc b/src/devices/wifi/qadhoc-wifi-mac.cc index d795d2263..2b7b3d8fb 100644 --- a/src/devices/wifi/qadhoc-wifi-mac.cc +++ b/src/devices/wifi/qadhoc-wifi-mac.cc @@ -410,6 +410,18 @@ QadhocWifiMac::FinishConfigureStandard (enum WifiPhyStandard standard) { switch (standard) { + case WIFI_PHY_STANDARD_80211p_CCH: + ConfigureCCHDcf (m_queues[AC_BK], 15, 511, AC_BK); + ConfigureCCHDcf (m_queues[AC_BE], 15, 511, AC_BE); + ConfigureCCHDcf (m_queues[AC_VI], 15, 511, AC_VI); + ConfigureCCHDcf (m_queues[AC_VO], 15, 511, AC_VO); + break; + case WIFI_PHY_STANDARD_80211p_SCH: + ConfigureDcf (m_queues[AC_BK], 15, 511, AC_BK); + ConfigureDcf (m_queues[AC_BE], 15, 511, AC_BE); + ConfigureDcf (m_queues[AC_VI], 15, 511, AC_VI); + ConfigureDcf (m_queues[AC_VO], 15, 511, AC_VO); + break; case WIFI_PHY_STANDARD_holland: // fall through case WIFI_PHY_STANDARD_80211a: diff --git a/src/devices/wifi/qap-wifi-mac.cc b/src/devices/wifi/qap-wifi-mac.cc index e66fdf5bc..9dc75eab9 100644 --- a/src/devices/wifi/qap-wifi-mac.cc +++ b/src/devices/wifi/qap-wifi-mac.cc @@ -752,6 +752,18 @@ QapWifiMac::FinishConfigureStandard (enum WifiPhyStandard standard) { switch (standard) { + case WIFI_PHY_STANDARD_80211p_CCH: + ConfigureCCHDcf (m_queues[AC_BK], 15, 511, AC_BK); + ConfigureCCHDcf (m_queues[AC_BE], 15, 511, AC_BE); + ConfigureCCHDcf (m_queues[AC_VI], 15, 511, AC_VI); + ConfigureCCHDcf (m_queues[AC_VO], 15, 511, AC_VO); + break; + case WIFI_PHY_STANDARD_80211p_SCH: + ConfigureDcf (m_queues[AC_BK], 15, 511, AC_BK); + ConfigureDcf (m_queues[AC_BE], 15, 511, AC_BE); + ConfigureDcf (m_queues[AC_VI], 15, 511, AC_VI); + ConfigureDcf (m_queues[AC_VO], 15, 511, AC_VO); + break; case WIFI_PHY_STANDARD_holland: // fall through case WIFI_PHY_STANDARD_80211a: diff --git a/src/devices/wifi/qsta-wifi-mac.cc b/src/devices/wifi/qsta-wifi-mac.cc index ba8f2f1f5..95669311d 100644 --- a/src/devices/wifi/qsta-wifi-mac.cc +++ b/src/devices/wifi/qsta-wifi-mac.cc @@ -739,6 +739,18 @@ QstaWifiMac::FinishConfigureStandard (enum WifiPhyStandard standard) { switch (standard) { + case WIFI_PHY_STANDARD_80211p_CCH: + ConfigureCCHDcf (m_queues[AC_BK], 15, 511, AC_BK); + ConfigureCCHDcf (m_queues[AC_BE], 15, 511, AC_BE); + ConfigureCCHDcf (m_queues[AC_VI], 15, 511, AC_VI); + ConfigureCCHDcf (m_queues[AC_VO], 15, 511, AC_VO); + break; + case WIFI_PHY_STANDARD_80211p_SCH: + ConfigureDcf (m_queues[AC_BK], 15, 511, AC_BK); + ConfigureDcf (m_queues[AC_BE], 15, 511, AC_BE); + ConfigureDcf (m_queues[AC_VI], 15, 511, AC_VI); + ConfigureDcf (m_queues[AC_VO], 15, 511, AC_VO); + break; case WIFI_PHY_STANDARD_holland: // fall through case WIFI_PHY_STANDARD_80211a: diff --git a/src/devices/wifi/wifi-mac.cc b/src/devices/wifi/wifi-mac.cc index 8448e5e9d..629fb5a6d 100644 --- a/src/devices/wifi/wifi-mac.cc +++ b/src/devices/wifi/wifi-mac.cc @@ -220,6 +220,12 @@ WifiMac::ConfigureStandard (enum WifiPhyStandard standard) case WIFI_PHY_STANDARD_holland: Configure80211a (); break; + case WIFI_PHY_STANDARD_80211p_CCH: + Configure80211p_CCH (); + break; + case WIFI_PHY_STANDARD_80211p_SCH: + Configure80211p_SCH (); + break; default: NS_ASSERT (false); break; @@ -271,6 +277,28 @@ WifiMac::Configure80211_5Mhz (void) SetAckTimeout(MicroSeconds(64+176+21+GetDefaultMaxPropagationDelay().GetMicroSeconds ()*2)); } +void +WifiMac::Configure80211p_CCH (void) +{ + SetSifs(MicroSeconds(32)); + SetSlot(MicroSeconds(16)); + SetEifsNoDifs(MicroSeconds(32+88)); + SetPifs(MicroSeconds(32+16)); + SetCtsTimeout(MicroSeconds(32+88+16+GetDefaultMaxPropagationDelay().GetMicroSeconds ()*2)); + SetAckTimeout(MicroSeconds(32+88+16+GetDefaultMaxPropagationDelay().GetMicroSeconds ()*2)); +} + +void +WifiMac::Configure80211p_SCH (void) +{ + SetSifs(MicroSeconds(32)); + SetSlot(MicroSeconds(16)); + SetEifsNoDifs(MicroSeconds(32+88)); + SetPifs(MicroSeconds(32+16)); + SetCtsTimeout(MicroSeconds(32+88+16+GetDefaultMaxPropagationDelay().GetMicroSeconds ()*2)); + SetAckTimeout(MicroSeconds(32+88+16+GetDefaultMaxPropagationDelay().GetMicroSeconds ()*2)); +} + void WifiMac::ConfigureDcf (Ptr dcf, uint32_t cwmin, uint32_t cwmax, enum AccessClass ac) { @@ -307,5 +335,39 @@ WifiMac::ConfigureDcf (Ptr dcf, uint32_t cwmin, uint32_t cwmax, enum Access } } - +void +WifiMac::ConfigureCCHDcf (Ptr dcf, uint32_t cwmin, uint32_t cwmax, enum AccessClass ac) +{ + /* see IEEE 1609.4-2006 section 6.3.1, Table 1 */ + switch (ac) { + case AC_VO: + dcf->SetMinCw ((cwmin+1)/4-1); + dcf->SetMaxCw ((cwmin+1)/2-1); + dcf->SetAifsn (2); + break; + case AC_VI: + dcf->SetMinCw ((cwmin+1)/4-1); + dcf->SetMaxCw ((cwmin+1)/2-1); + dcf->SetAifsn (3); + break; + case AC_BE: + dcf->SetMinCw ((cwmin+1)/2-1); + dcf->SetMaxCw (cwmin); + dcf->SetAifsn (6); + break; + case AC_BK: + dcf->SetMinCw (cwmin); + dcf->SetMaxCw (cwmax); + dcf->SetAifsn (9); + break; + case AC_BE_NQOS: + dcf->SetMinCw (cwmin); + dcf->SetMaxCw (cwmax); + dcf->SetAifsn (2); + break; + case AC_UNDEF: + NS_FATAL_ERROR ("I don't know what to do with this"); + break; + } +} } // namespace ns3 diff --git a/src/devices/wifi/wifi-mac.h b/src/devices/wifi/wifi-mac.h index 0a59acd59..eb5f0841a 100644 --- a/src/devices/wifi/wifi-mac.h +++ b/src/devices/wifi/wifi-mac.h @@ -216,6 +216,7 @@ public: protected: void ConfigureDcf (Ptr dcf, uint32_t cwmin, uint32_t cwmax, enum AccessClass ac); + void ConfigureCCHDcf (Ptr dcf, uint32_t cwmin, uint32_t cwmax, enum AccessClass ac); private: static Time GetDefaultMaxPropagationDelay (void); static Time GetDefaultSlot (void); @@ -240,6 +241,8 @@ private: void Configure80211b (void); void Configure80211_10Mhz (void); void Configure80211_5Mhz (); + void Configure80211p_CCH (void); + void Configure80211p_SCH (void); /** * The trace source fired when packets come into the "top" of the device diff --git a/src/devices/wifi/wifi-phy-standard.h b/src/devices/wifi/wifi-phy-standard.h index 8a3a7b757..906e7235c 100644 --- a/src/devices/wifi/wifi-phy-standard.h +++ b/src/devices/wifi/wifi-phy-standard.h @@ -28,6 +28,8 @@ enum WifiPhyStandard { WIFI_PHY_STANDARD_80211_10Mhz, WIFI_PHY_STANDARD_80211_5Mhz, WIFI_PHY_STANDARD_holland, + WIFI_PHY_STANDARD_80211p_CCH, + WIFI_PHY_STANDARD_80211p_SCH, WIFI_PHY_UNKNOWN }; diff --git a/src/devices/wifi/yans-wifi-phy.cc b/src/devices/wifi/yans-wifi-phy.cc index d3be72062..7c0bf4fd7 100644 --- a/src/devices/wifi/yans-wifi-phy.cc +++ b/src/devices/wifi/yans-wifi-phy.cc @@ -171,6 +171,12 @@ YansWifiPhy::ConfigureStandard (enum WifiPhyStandard standard) case WIFI_PHY_STANDARD_holland: ConfigureHolland (); break; + case WIFI_PHY_STANDARD_80211p_CCH: + Configure80211p_CCH (); + break; + case WIFI_PHY_STANDARD_80211p_SCH: + Configure80211p_SCH (); + break; default: NS_ASSERT (false); break; @@ -592,6 +598,36 @@ YansWifiPhy::ConfigureHolland (void) m_modes.push_back (WifiPhy::Get54mba ()); } +void +YansWifiPhy::Configure80211p_CCH (void) +{ + NS_LOG_FUNCTION (this); + m_channelStartingFrequency = 5e3; // 802.11p works over the 5Ghz freq range + m_modes.push_back (WifiPhy::Get3mb10Mhz ()); + m_modes.push_back (WifiPhy::Get4_5mb10Mhz ()); + m_modes.push_back (WifiPhy::Get6mb10Mhz ()); + m_modes.push_back (WifiPhy::Get9mb10Mhz ()); + m_modes.push_back (WifiPhy::Get12mb10Mhz ()); + m_modes.push_back (WifiPhy::Get18mb10Mhz ()); + m_modes.push_back (WifiPhy::Get24mb10Mhz ()); + m_modes.push_back (WifiPhy::Get27mb10Mhz ()); +} + +void +YansWifiPhy::Configure80211p_SCH (void) +{ + NS_LOG_FUNCTION (this); + m_channelStartingFrequency = 5e3; // 802.11p works over the 5Ghz freq range + m_modes.push_back (WifiPhy::Get3mb10Mhz ()); + m_modes.push_back (WifiPhy::Get4_5mb10Mhz ()); + m_modes.push_back (WifiPhy::Get6mb10Mhz ()); + m_modes.push_back (WifiPhy::Get9mb10Mhz ()); + m_modes.push_back (WifiPhy::Get12mb10Mhz ()); + m_modes.push_back (WifiPhy::Get18mb10Mhz ()); + m_modes.push_back (WifiPhy::Get24mb10Mhz ()); + m_modes.push_back (WifiPhy::Get27mb10Mhz ()); +} + void YansWifiPhy::RegisterListener (WifiPhyListener *listener) { diff --git a/src/devices/wifi/yans-wifi-phy.h b/src/devices/wifi/yans-wifi-phy.h index 948d97bfb..26a52817e 100644 --- a/src/devices/wifi/yans-wifi-phy.h +++ b/src/devices/wifi/yans-wifi-phy.h @@ -153,6 +153,8 @@ private: void Configure80211_10Mhz (void); void Configure80211_5Mhz (); void ConfigureHolland (void); + void Configure80211p_CCH (void); + void Configure80211p_SCH (void); double GetEdThresholdW (void) const; double DbmToW (double dbm) const; double DbToRatio (double db) const;