@@ -30,185 +30,10 @@ std::vector<Ieee80211ModeSet::Entry> Ieee80211ModeSet::completeHtGuardIntervalVa
3030 return entries;
3131
3232 std::vector<Entry> completeEntries = entries;
33- const Ieee80211Htmcs *legalMcsModes[] = {
34- &Ieee80211HtmcsTable::htMcs0BW20MHz,
35- &Ieee80211HtmcsTable::htMcs1BW20MHz,
36- &Ieee80211HtmcsTable::htMcs2BW20MHz,
37- &Ieee80211HtmcsTable::htMcs3BW20MHz,
38- &Ieee80211HtmcsTable::htMcs4BW20MHz,
39- &Ieee80211HtmcsTable::htMcs5BW20MHz,
40- &Ieee80211HtmcsTable::htMcs6BW20MHz,
41- &Ieee80211HtmcsTable::htMcs7BW20MHz,
42- &Ieee80211HtmcsTable::htMcs8BW20MHz,
43- &Ieee80211HtmcsTable::htMcs9BW20MHz,
44- &Ieee80211HtmcsTable::htMcs10BW20MHz,
45- &Ieee80211HtmcsTable::htMcs11BW20MHz,
46- &Ieee80211HtmcsTable::htMcs12BW20MHz,
47- &Ieee80211HtmcsTable::htMcs13BW20MHz,
48- &Ieee80211HtmcsTable::htMcs14BW20MHz,
49- &Ieee80211HtmcsTable::htMcs15BW20MHz,
50- &Ieee80211HtmcsTable::htMcs16BW20MHz,
51- &Ieee80211HtmcsTable::htMcs17BW20MHz,
52- &Ieee80211HtmcsTable::htMcs18BW20MHz,
53- &Ieee80211HtmcsTable::htMcs19BW20MHz,
54- &Ieee80211HtmcsTable::htMcs20BW20MHz,
55- &Ieee80211HtmcsTable::htMcs21BW20MHz,
56- &Ieee80211HtmcsTable::htMcs22BW20MHz,
57- &Ieee80211HtmcsTable::htMcs23BW20MHz,
58- &Ieee80211HtmcsTable::htMcs24BW20MHz,
59- &Ieee80211HtmcsTable::htMcs25BW20MHz,
60- &Ieee80211HtmcsTable::htMcs26BW20MHz,
61- &Ieee80211HtmcsTable::htMcs27BW20MHz,
62- &Ieee80211HtmcsTable::htMcs28BW20MHz,
63- &Ieee80211HtmcsTable::htMcs29BW20MHz,
64- &Ieee80211HtmcsTable::htMcs30BW20MHz,
65- &Ieee80211HtmcsTable::htMcs31BW20MHz,
66- &Ieee80211HtmcsTable::htMcs33BW20MHz,
67- &Ieee80211HtmcsTable::htMcs34BW20MHz,
68- &Ieee80211HtmcsTable::htMcs35BW20MHz,
69- &Ieee80211HtmcsTable::htMcs36BW20MHz,
70- &Ieee80211HtmcsTable::htMcs37BW20MHz,
71- &Ieee80211HtmcsTable::htMcs38BW20MHz,
72- &Ieee80211HtmcsTable::htMcs39BW20MHz,
73- &Ieee80211HtmcsTable::htMcs40BW20MHz,
74- &Ieee80211HtmcsTable::htMcs41BW20MHz,
75- &Ieee80211HtmcsTable::htMcs42BW20MHz,
76- &Ieee80211HtmcsTable::htMcs43BW20MHz,
77- &Ieee80211HtmcsTable::htMcs44BW20MHz,
78- &Ieee80211HtmcsTable::htMcs45BW20MHz,
79- &Ieee80211HtmcsTable::htMcs46BW20MHz,
80- &Ieee80211HtmcsTable::htMcs47BW20MHz,
81- &Ieee80211HtmcsTable::htMcs48BW20MHz,
82- &Ieee80211HtmcsTable::htMcs49BW20MHz,
83- &Ieee80211HtmcsTable::htMcs50BW20MHz,
84- &Ieee80211HtmcsTable::htMcs51BW20MHz,
85- &Ieee80211HtmcsTable::htMcs52BW20MHz,
86- &Ieee80211HtmcsTable::htMcs53BW20MHz,
87- &Ieee80211HtmcsTable::htMcs54BW20MHz,
88- &Ieee80211HtmcsTable::htMcs55BW20MHz,
89- &Ieee80211HtmcsTable::htMcs56BW20MHz,
90- &Ieee80211HtmcsTable::htMcs57BW20MHz,
91- &Ieee80211HtmcsTable::htMcs58BW20MHz,
92- &Ieee80211HtmcsTable::htMcs59BW20MHz,
93- &Ieee80211HtmcsTable::htMcs60BW20MHz,
94- &Ieee80211HtmcsTable::htMcs61BW20MHz,
95- &Ieee80211HtmcsTable::htMcs62BW20MHz,
96- &Ieee80211HtmcsTable::htMcs63BW20MHz,
97- &Ieee80211HtmcsTable::htMcs64BW20MHz,
98- &Ieee80211HtmcsTable::htMcs65BW20MHz,
99- &Ieee80211HtmcsTable::htMcs66BW20MHz,
100- &Ieee80211HtmcsTable::htMcs67BW20MHz,
101- &Ieee80211HtmcsTable::htMcs68BW20MHz,
102- &Ieee80211HtmcsTable::htMcs69BW20MHz,
103- &Ieee80211HtmcsTable::htMcs70BW20MHz,
104- &Ieee80211HtmcsTable::htMcs71BW20MHz,
105- &Ieee80211HtmcsTable::htMcs72BW20MHz,
106- &Ieee80211HtmcsTable::htMcs73BW20MHz,
107- &Ieee80211HtmcsTable::htMcs74BW20MHz,
108- &Ieee80211HtmcsTable::htMcs75BW20MHz,
109- &Ieee80211HtmcsTable::htMcs76BW20MHz,
110- &Ieee80211HtmcsTable::htMcs0BW40MHz,
111- &Ieee80211HtmcsTable::htMcs1BW40MHz,
112- &Ieee80211HtmcsTable::htMcs2BW40MHz,
113- &Ieee80211HtmcsTable::htMcs3BW40MHz,
114- &Ieee80211HtmcsTable::htMcs4BW40MHz,
115- &Ieee80211HtmcsTable::htMcs5BW40MHz,
116- &Ieee80211HtmcsTable::htMcs6BW40MHz,
117- &Ieee80211HtmcsTable::htMcs7BW40MHz,
118- &Ieee80211HtmcsTable::htMcs8BW40MHz,
119- &Ieee80211HtmcsTable::htMcs9BW40MHz,
120- &Ieee80211HtmcsTable::htMcs10BW40MHz,
121- &Ieee80211HtmcsTable::htMcs11BW40MHz,
122- &Ieee80211HtmcsTable::htMcs12BW40MHz,
123- &Ieee80211HtmcsTable::htMcs13BW40MHz,
124- &Ieee80211HtmcsTable::htMcs14BW40MHz,
125- &Ieee80211HtmcsTable::htMcs15BW40MHz,
126- &Ieee80211HtmcsTable::htMcs16BW40MHz,
127- &Ieee80211HtmcsTable::htMcs17BW40MHz,
128- &Ieee80211HtmcsTable::htMcs18BW40MHz,
129- &Ieee80211HtmcsTable::htMcs19BW40MHz,
130- &Ieee80211HtmcsTable::htMcs20BW40MHz,
131- &Ieee80211HtmcsTable::htMcs21BW40MHz,
132- &Ieee80211HtmcsTable::htMcs22BW40MHz,
133- &Ieee80211HtmcsTable::htMcs23BW40MHz,
134- &Ieee80211HtmcsTable::htMcs24BW40MHz,
135- &Ieee80211HtmcsTable::htMcs25BW40MHz,
136- &Ieee80211HtmcsTable::htMcs26BW40MHz,
137- &Ieee80211HtmcsTable::htMcs27BW40MHz,
138- &Ieee80211HtmcsTable::htMcs28BW40MHz,
139- &Ieee80211HtmcsTable::htMcs29BW40MHz,
140- &Ieee80211HtmcsTable::htMcs30BW40MHz,
141- &Ieee80211HtmcsTable::htMcs31BW40MHz,
142- &Ieee80211HtmcsTable::htMcs32BW40MHz,
143- &Ieee80211HtmcsTable::htMcs33BW40MHz,
144- &Ieee80211HtmcsTable::htMcs34BW40MHz,
145- &Ieee80211HtmcsTable::htMcs35BW40MHz,
146- &Ieee80211HtmcsTable::htMcs36BW40MHz,
147- &Ieee80211HtmcsTable::htMcs37BW40MHz,
148- &Ieee80211HtmcsTable::htMcs38BW40MHz,
149- &Ieee80211HtmcsTable::htMcs39BW40MHz,
150- &Ieee80211HtmcsTable::htMcs40BW40MHz,
151- &Ieee80211HtmcsTable::htMcs41BW40MHz,
152- &Ieee80211HtmcsTable::htMcs42BW40MHz,
153- &Ieee80211HtmcsTable::htMcs43BW40MHz,
154- &Ieee80211HtmcsTable::htMcs44BW40MHz,
155- &Ieee80211HtmcsTable::htMcs45BW40MHz,
156- &Ieee80211HtmcsTable::htMcs46BW40MHz,
157- &Ieee80211HtmcsTable::htMcs47BW40MHz,
158- &Ieee80211HtmcsTable::htMcs48BW40MHz,
159- &Ieee80211HtmcsTable::htMcs49BW40MHz,
160- &Ieee80211HtmcsTable::htMcs50BW40MHz,
161- &Ieee80211HtmcsTable::htMcs51BW40MHz,
162- &Ieee80211HtmcsTable::htMcs52BW40MHz,
163- &Ieee80211HtmcsTable::htMcs53BW40MHz,
164- &Ieee80211HtmcsTable::htMcs54BW40MHz,
165- &Ieee80211HtmcsTable::htMcs55BW40MHz,
166- &Ieee80211HtmcsTable::htMcs56BW40MHz,
167- &Ieee80211HtmcsTable::htMcs57BW40MHz,
168- &Ieee80211HtmcsTable::htMcs58BW40MHz,
169- &Ieee80211HtmcsTable::htMcs59BW40MHz,
170- &Ieee80211HtmcsTable::htMcs60BW40MHz,
171- &Ieee80211HtmcsTable::htMcs61BW40MHz,
172- &Ieee80211HtmcsTable::htMcs62BW40MHz,
173- &Ieee80211HtmcsTable::htMcs63BW40MHz,
174- &Ieee80211HtmcsTable::htMcs64BW40MHz,
175- &Ieee80211HtmcsTable::htMcs65BW40MHz,
176- &Ieee80211HtmcsTable::htMcs66BW40MHz,
177- &Ieee80211HtmcsTable::htMcs67BW40MHz,
178- &Ieee80211HtmcsTable::htMcs68BW40MHz,
179- &Ieee80211HtmcsTable::htMcs69BW40MHz,
180- &Ieee80211HtmcsTable::htMcs70BW40MHz,
181- &Ieee80211HtmcsTable::htMcs71BW40MHz,
182- &Ieee80211HtmcsTable::htMcs72BW40MHz,
183- &Ieee80211HtmcsTable::htMcs73BW40MHz,
184- &Ieee80211HtmcsTable::htMcs74BW40MHz,
185- &Ieee80211HtmcsTable::htMcs75BW40MHz,
186- &Ieee80211HtmcsTable::htMcs76BW40MHz,
187- };
188-
189- // Preserve the historical catalog entries first. Add the missing legal
190- // (bandwidth, MCS) tuples from Tables 19-27 through 19-41 in table order.
191- for (auto mcsMode : legalMcsModes) {
192- bool found = false ;
193- for (const auto & entry : completeEntries) {
194- auto htMode = dynamic_cast <const Ieee80211HtMode *>(entry.mode );
195- if (htMode != nullptr &&
196- htMode->getDataMode ()->getBandwidth () == mcsMode->getBandwidth () &&
197- htMode->getDataMode ()->getMcsIndex () == mcsMode->getMcsIndex ())
198- {
199- found = true ;
200- break ;
201- }
202- }
203- if (!found)
204- completeEntries.push_back ({false , Ieee80211HtCompliantModes::getCompliantMode (
205- mcsMode, Ieee80211HtMode::BAND_2_4GHZ ,
206- Ieee80211HtPreambleMode::HT_PREAMBLE_MIXED ,
207- Ieee80211HtModeBase::HT_GUARD_INTERVAL_SHORT )});
208- }
209-
21033 // IEEE Std 802.11-2024, Table 19-6 defines the 800 ns and 400 ns GIs.
211- // Add the alternate GI for every legal tuple above; short GI is optional.
34+ // Add only the alternate GI for each mode explicitly declared above;
35+ // declaration order, mandatory flags, and the historical catalog remain
36+ // authoritative for this operation mode.
21237 auto numberOfBaseEntries = completeEntries.size ();
21338 for (size_t index = 0 ; index < numberOfBaseEntries; index++) {
21439 auto htMode = check_and_cast<const Ieee80211HtMode *>(completeEntries[index].mode );
@@ -789,24 +614,43 @@ const IIeee80211Mode *Ieee80211ModeSet::getFastestMandatoryMode() const
789614 return nullptr ;
790615}
791616
617+ const IIeee80211Mode *Ieee80211ModeSet::getMandatoryModeAtOrBelow (const IIeee80211Mode *mode) const
618+ {
619+ const auto bitrate = mode->getDataMode ()->getNetBitrate ();
620+ const IIeee80211Mode *result = nullptr ;
621+ for (const auto & entry : entries) {
622+ const auto entryBitrate = entry.mode ->getDataMode ()->getNetBitrate ();
623+ if (entry.isMandatory && entryBitrate <= bitrate &&
624+ (result == nullptr || entryBitrate > result->getDataMode ()->getNetBitrate ()))
625+ result = entry.mode ;
626+ }
627+ return result;
628+ }
629+
792630const IIeee80211Mode *Ieee80211ModeSet::getSlowerMandatoryMode (const IIeee80211Mode *mode) const
793631{
794- int index = findModeIndex (mode);
795- if (index > 0 )
796- for (int i = index - 1 ; i >= 0 ; i--)
797- if (entries[i].isMandatory )
798- return entries[i].mode ;
799- return nullptr ;
632+ const auto bitrate = mode->getDataMode ()->getNetBitrate ();
633+ const IIeee80211Mode *result = nullptr ;
634+ for (const auto & entry : entries) {
635+ const auto entryBitrate = entry.mode ->getDataMode ()->getNetBitrate ();
636+ if (entry.isMandatory && entryBitrate < bitrate &&
637+ (result == nullptr || entryBitrate > result->getDataMode ()->getNetBitrate ()))
638+ result = entry.mode ;
639+ }
640+ return result;
800641}
801642
802643const IIeee80211Mode *Ieee80211ModeSet::getFasterMandatoryMode (const IIeee80211Mode *mode) const
803644{
804- int index = findModeIndex (mode);
805- if (index >= 0 )
806- for (size_t i = index + 1 ; i < entries.size (); i++)
807- if (entries[i].isMandatory )
808- return entries[i].mode ;
809- return nullptr ;
645+ const auto bitrate = mode->getDataMode ()->getNetBitrate ();
646+ const IIeee80211Mode *result = nullptr ;
647+ for (const auto & entry : entries) {
648+ const auto entryBitrate = entry.mode ->getDataMode ()->getNetBitrate ();
649+ if (entry.isMandatory && entryBitrate > bitrate &&
650+ (result == nullptr || entryBitrate < result->getDataMode ()->getNetBitrate ()))
651+ result = entry.mode ;
652+ }
653+ return result;
810654}
811655
812656const Ieee80211ModeSet *Ieee80211ModeSet::findModeSet (const char *mode)
0 commit comments