|
| 1 | +# Change summary — INET pull request #1173, "ieee80211: HT capability negotiation and association, AP side" |
| 2 | + |
| 3 | +> **Kind:** report · **Status:** generated, do not edit · **Seal:** none · **Owns:** — · **Stands on:** [rule/pull-request.md](../../../rule/pull-request.md), [design/protocol-anatomy.md](../../../design/protocol-anatomy.md) |
| 4 | +
|
| 5 | +Base `fbf0cc0c2d` (merge base with master) to head `095c457c10` — 24 commits, 93 files changed, 10454 insertions(+), 424 deletions(-). |
| 6 | + |
| 7 | +Generated by `opp_summarize_changes --pr 1173 --usage` (opp_repl). Re-generate it rather than editing it; the process is `opp_repl/plan/pending/change-summary.md`. The companion rule audit of the same pull request is [pr-1173.md](pr-1173.md): that one judges the *commits* against `PR-*`, this one states what the change does to the *interface*. The base is master, so this includes everything #1172 adds; #1173 is stacked on it. |
| 8 | + |
| 9 | +Extracted 2026-09-09 from the sources in 1.3 seconds; no build was needed. NED and message facts come from `opp_nedtool` and `opp_msgtool`, so they are those parsers' own view of the tree. C++ facts come from the fast header scan and are **indicative**: it joins multi-line declarations and excludes generated `*_m.h`, but it does not expand macros or resolve templates, so a declaration built by a macro is invisible to it. |
| 10 | + |
| 11 | +## In one line |
| 12 | + |
| 13 | +**126** added; **2** removed; **1** changed; **2** with a changed signature. |
| 14 | + |
| 15 | +## Breaking — check these first |
| 16 | + |
| 17 | +### Removed |
| 18 | + |
| 19 | +**1 C++ public function** |
| 20 | + |
| 21 | +- `Ieee80211EnumeratedBand::Ieee80211EnumeratedBand(const char *, const std::vector<Hz>)` |
| 22 | + |
| 23 | +**1 C++ extension point** |
| 24 | + |
| 25 | +- `Ieee80211MgmtAp::receiveSignal(cComponent *, simsignal_t, intval_t, cObject *)` |
| 26 | + |
| 27 | +### Changed |
| 28 | + |
| 29 | +**1 C++ public function** |
| 30 | + |
| 31 | +| What | Attribute | Change | |
| 32 | +|---|---|---| |
| 33 | +| `IIeee80211Band::printToStream(std::ostream &, int, int)` | pure | gained | |
| 34 | + |
| 35 | +### Signature changed |
| 36 | + |
| 37 | +**1 C++ public function** |
| 38 | + |
| 39 | +| What | Change | |
| 40 | +|---|---| |
| 41 | +| `Ieee80211ModeSet::Ieee80211ModeSet` | **+** `bool` | |
| 42 | + |
| 43 | +**1 C++ extension point** |
| 44 | + |
| 45 | +| What | Change | |
| 46 | +|---|---| |
| 47 | +| `Ieee80211MgmtAp::sendManagementFrame` | **+** `uint64_t` | |
| 48 | + |
| 49 | +### Renamed |
| 50 | + |
| 51 | +_nothing renamed_ |
| 52 | + |
| 53 | +## Added |
| 54 | + |
| 55 | +**8 NED parameters** |
| 56 | + |
| 57 | +- `inet.linklayer.ieee80211.mac.coordinationfunction.Dcf.mibModule` |
| 58 | +- `inet.linklayer.ieee80211.mac.coordinationfunction.Hcf.mibModule` |
| 59 | +- `inet.linklayer.ieee80211.mac.rateselection.QosRateSelection.mibModule` |
| 60 | +- `inet.linklayer.ieee80211.mac.rateselection.RateSelection.mibModule` |
| 61 | +- `inet.linklayer.ieee80211.mgmt.Ieee80211MgmtApSimplified.radioModule` |
| 62 | +- `inet.linklayer.ieee80211.mib.Ieee80211Mib.htMaxAmpduLengthExponent` |
| 63 | +- `inet.linklayer.ieee80211.mib.Ieee80211Mib.htProtectionMode` |
| 64 | +- `inet.linklayer.ieee80211.mib.Ieee80211Mib.htSecondaryChannelOffset` |
| 65 | + |
| 66 | +**4 NED signals** |
| 67 | + |
| 68 | +- `inet.linklayer.ieee80211.mac.Ieee80211Mac.frameTransmissionOutcome` |
| 69 | +- `inet.linklayer.ieee80211.mac.coordinationfunction.Dcf.frameTransmissionOutcome` |
| 70 | +- `inet.linklayer.ieee80211.mac.coordinationfunction.Hcf.frameTransmissionOutcome` |
| 71 | +- `inet.linklayer.ieee80211.mgmt.Ieee80211MgmtSta.htNegotiationFailed` |
| 72 | + |
| 73 | +**4 NED statistics** |
| 74 | + |
| 75 | +- `inet.linklayer.ieee80211.mac.Ieee80211Mac.frameAcked` |
| 76 | +- `inet.linklayer.ieee80211.mac.Ieee80211Mac.frameDroppedBeforeTx` |
| 77 | +- `inet.linklayer.ieee80211.mac.Ieee80211Mac.frameRetryLimitReached` |
| 78 | +- `inet.linklayer.ieee80211.mac.Ieee80211Mac.frameTransmissionOutcome` |
| 79 | + |
| 80 | +**5 message types** |
| 81 | + |
| 82 | +- `FrameTransmissionDetails` |
| 83 | +- `FrameTransmissionStatus` |
| 84 | +- `Ieee80211HtCapabilitiesElement` |
| 85 | +- `Ieee80211HtOperationElement` |
| 86 | +- `Ieee80211MgmtTransactionTag` |
| 87 | + |
| 88 | +<details><summary><b>22 message fields</b></summary> |
| 89 | + |
| 90 | +- `FrameTransmissionDetails.status` |
| 91 | +- `Ieee80211HtCapabilitiesElement.greenfield` |
| 92 | +- `Ieee80211HtCapabilitiesElement.ldpc` |
| 93 | +- `Ieee80211HtCapabilitiesElement.maxAmpduLengthExponent` |
| 94 | +- `Ieee80211HtCapabilitiesElement.rxMcsSupported` |
| 95 | +- `Ieee80211HtCapabilitiesElement.shortGi20` |
| 96 | +- `Ieee80211HtCapabilitiesElement.shortGi40` |
| 97 | +- `Ieee80211HtCapabilitiesElement.supportedChannelWidth40Mhz` |
| 98 | +- `Ieee80211HtCapabilitiesElement.txMaxNss` |
| 99 | +- `Ieee80211HtCapabilitiesElement.txMcsSetDefined` |
| 100 | +- `Ieee80211HtCapabilitiesElement.txRxMcsSetNotEqual` |
| 101 | +- `Ieee80211HtCapabilitiesElement.txUnequalModulation` |
| 102 | +- `Ieee80211HtOperationElement.basicMcsSupported` |
| 103 | +- `Ieee80211HtOperationElement.primaryChannel` |
| 104 | +- `Ieee80211HtOperationElement.protectionMode` |
| 105 | +- `Ieee80211HtOperationElement.secondaryChannelOffset` |
| 106 | +- `Ieee80211HtOperationElement.staChannelWidth40Mhz` |
| 107 | +- `Ieee80211MgmtFrame.htCapabilities` |
| 108 | +- `Ieee80211MgmtFrame.htCapabilitiesPresent` |
| 109 | +- `Ieee80211MgmtFrame.htOperation` |
| 110 | +- `Ieee80211MgmtFrame.htOperationPresent` |
| 111 | +- `Ieee80211MgmtTransactionTag.transactionId` |
| 112 | + |
| 113 | +</details> |
| 114 | + |
| 115 | +**3 message enum values** |
| 116 | + |
| 117 | +- `FrameTransmissionStatus::FRAME_TRANSMISSION_STATUS_ACKNOWLEDGED` |
| 118 | +- `FrameTransmissionStatus::FRAME_TRANSMISSION_STATUS_DROPPED_BEFORE_TRANSMISSION` |
| 119 | +- `FrameTransmissionStatus::FRAME_TRANSMISSION_STATUS_RETRY_LIMIT_REACHED` |
| 120 | + |
| 121 | +**3 C++ classes** |
| 122 | + |
| 123 | +- `FrameTransmissionStatusFilter` |
| 124 | +- `Ieee80211MgmtSta::HtNegotiationFailure` |
| 125 | +- `Ieee80211Mib::PeerHtState` |
| 126 | + |
| 127 | +<details><summary><b>53 C++ public functions</b></summary> |
| 128 | + |
| 129 | +- `FrameTransmissionStatusFilter::FrameTransmissionStatusFilter(FrameTransmissionStatus)` |
| 130 | +- `FrameTransmissionStatusFilter::receiveSignal(cResultFilter *, simtime_t_cref, cObject *, cObject *)` |
| 131 | +- `IIeee80211Band::getChannelIndex(int)` — 3 src, 2 tests, 1 override |
| 132 | +- `IIeee80211Band::getStandardChannelNumber(int)` — 3 src, 1 tests, 1 override |
| 133 | +- `IIeee80211Band::isHt40OperationSupported(int, int)` — 4 src, 1 tests, 1 override |
| 134 | +- `IIeee80211Mode::getHtMcsIndex()` — 7 src, 4 tests, 2 overrides |
| 135 | +- `IIeee80211Mode::isHtShortGuardInterval()` — 4 src, 2 tests, 2 overrides |
| 136 | +- `Ieee80211BandBase::getChannelIndex(int)` |
| 137 | +- `Ieee80211BandBase::getStandardChannelNumber(int)` |
| 138 | +- `Ieee80211BandBase::isHt40OperationSupported(int, int)` |
| 139 | +- `Ieee80211BandBase::printToStream(std::ostream &, int, int)` |
| 140 | +- `Ieee80211EnumeratedBand::getChannelIndex(int)` |
| 141 | +- `Ieee80211EnumeratedBand::getStandardChannelNumber(int)` |
| 142 | +- `Ieee80211HtMcsNssMap::Ieee80211HtMcsNssMap()` |
| 143 | +- `Ieee80211HtMode::getHtMcsIndex()` |
| 144 | +- `Ieee80211HtMode::isHtShortGuardInterval()` |
| 145 | +- `Ieee80211MgmtSta::HtNegotiationFailure::getPeerAddress()` — **uncalled** |
| 146 | +- `Ieee80211MgmtSta::HtNegotiationFailure::getReason()` — 4 src, 3 tests |
| 147 | +- `Ieee80211MgmtSta::HtNegotiationFailure::getStatus()` — 11 src, 1 tests |
| 148 | +- `Ieee80211MgmtSta::HtNegotiationFailure::isReassociation()` — **tests only** |
| 149 | +- `Ieee80211MgmtSta::HtNegotiationFailure::setPeerAddress(const MacAddress &)` — **uncalled** |
| 150 | +- `Ieee80211MgmtSta::HtNegotiationFailure::setReason(const std::string &)` — **uncalled** |
| 151 | +- `Ieee80211MgmtSta::HtNegotiationFailure::setReassociation(bool)` — **uncalled** |
| 152 | +- `Ieee80211MgmtSta::HtNegotiationFailure::setStatus(HtAssociationResponseStatus)` — 10 src, 2 tests |
| 153 | +- `Ieee80211MgmtSta::~Ieee80211MgmtSta()` |
| 154 | +- `Ieee80211Mib::cancelAssociationIdReservation(const MacAddress &)` — 1 src, 5 tests |
| 155 | +- `Ieee80211Mib::clearAssociationIds()` — 1 src, 1 tests |
| 156 | +- `Ieee80211Mib::clearPeerHtCapabilities()` — 1 src, 0 tests |
| 157 | +- `Ieee80211Mib::commitAssociationId(const MacAddress &)` — 1 src, 1 tests |
| 158 | +- `Ieee80211Mib::findPeerHtState(const MacAddress &)` — 2 src, 9 tests |
| 159 | +- `Ieee80211Mib::getHtOperation()` — 7 src, 7 tests |
| 160 | +- `Ieee80211Mib::hasPrimaryChannel()` — 1 src, 3 tests |
| 161 | +- `Ieee80211Mib::isHtOperationSupported()` — 7 src, 5 tests |
| 162 | +- `Ieee80211Mib::removePeerHtCapabilities(const MacAddress &)` — 3 src, 1 tests |
| 163 | +- `Ieee80211Mib::requirePrimaryChannel()` — 1 src, 2 tests |
| 164 | +- `Ieee80211Mib::reserveAssociationId(const MacAddress &)` — 1 src, 5 tests |
| 165 | +- `Ieee80211Mib::setPeerHtCapabilities(const MacAddress &, const Ieee80211HtCapabilities &, const Ieee80211HtOperation &)` — 3 src, 4 tests |
| 166 | +- `Ieee80211Mib::setPrimaryChannel(int)` — 1 src, 2 tests |
| 167 | +- `Ieee80211Mib::updateLocalHtCapabilities(const physicallayer::Ieee80211ModeSet *, const std::set<Hz> &, int)` — **uncalled** |
| 168 | +- `Ieee80211ModeBase::getHtMcsIndex()` |
| 169 | +- `Ieee80211ModeBase::isHtShortGuardInterval()` |
| 170 | +- `Ieee80211ModeSet::getFastestLegacyOperationalMode()` — **tests only** |
| 171 | +- `Ieee80211ModeSet::getHtMcsMandatory()` — 1 src, 1 tests |
| 172 | +- `Ieee80211ModeSet::getHtMcsSupported()` — **tests only** |
| 173 | +- `Ieee80211ModeSet::getHtShortGuardIntervalChannelWidths()` — **tests only** |
| 174 | +- `Ieee80211ModeSet::getHtSupportedChannelWidths()` — 4 src, 1 tests |
| 175 | +- `Ieee80211ModeSet::getMaximumChannelWidth()` — **uncalled** |
| 176 | +- `Ieee80211ModeSet::getMaximumNumberOfSpatialStreams()` — 1 src, 0 tests |
| 177 | +- `Ieee80211ModeSet::isHtOperationSupported()` — 8 src, 5 tests |
| 178 | +- `Ieee80211ModeSet::isHtShortGuardIntervalSupported(Hz)` — 1 src, 1 tests |
| 179 | +- `Ieee80211Receiver::isHtChannelWidthSupported(Hz)` — 3 src, 0 tests, 1 override |
| 180 | +- `Ieee80211Transmitter::getChannel()` — 18 src, 0 tests, 1 override |
| 181 | +- `Ieee80211Transmitter::isHtChannelWidthSupported(Hz)` — 3 src, 0 tests, 1 override |
| 182 | + |
| 183 | +</details> |
| 184 | + |
| 185 | +<details><summary><b>24 C++ extension points</b></summary> |
| 186 | + |
| 187 | +- `Dcf::receiveSignal(cComponent *, simsignal_t, cObject *, cObject *)` |
| 188 | +- `Hcf::receiveSignal(cComponent *, simsignal_t, cObject *, cObject *)` |
| 189 | +- `Ieee80211MgmtAp::clearPendingAssociation(StaInfo *)` — **overridden nowhere** |
| 190 | +- `Ieee80211MgmtAp::createAssociationTransactionId()` — **overridden nowhere** |
| 191 | +- `Ieee80211MgmtAp::frameTransmissionFinished(const Packet *, FrameTransmissionStatus)` — 4 overrides |
| 192 | +- `Ieee80211MgmtApBase::receiveSignal(cComponent *, simsignal_t, intval_t, cObject *)` |
| 193 | +- `Ieee80211MgmtBase::addHtCapabilities(const Ptr<Ieee80211MgmtFrame> &)` — **overridden nowhere** |
| 194 | +- `Ieee80211MgmtBase::addHtOperation(const Ptr<Ieee80211MgmtFrame> &, const physicallayer::IIeee80211Band *)` — **overridden nowhere** |
| 195 | +- `Ieee80211MgmtSta::cancelPendingAssociation()` — **overridden nowhere** |
| 196 | +- `Ieee80211MgmtSta::cancelScanTimer()` — **overridden nowhere** |
| 197 | +- `Ieee80211MgmtSta::classifyAssociationResponse(const Ptr<const Ieee80211AssociationResponseFrame> &, const physicallayer::IIeee80211Band *, const Ieee80211HtOperation *, Ieee80211HtCapabilities &, Ieee80211HtOperation &, std::string &)` — **overridden nowhere** |
| 198 | +- `Ieee80211MgmtSta::clearCurrentAssociation()` — **overridden nowhere** |
| 199 | +- `Ieee80211MgmtSta::handleReassociationFailure(ApInfo *)` — 1 override |
| 200 | +- `Ieee80211MgmtSta::isHtBssSupported(const ApInfo *, std::string &)` — **overridden nowhere** |
| 201 | +- `Ieee80211MgmtSta::processAssociationResponse(Packet *, const Ptr<const Ieee80211MgmtHeader> &, bool)` — **overridden nowhere** |
| 202 | +- `Ieee80211MgmtSta::sendReassociationConfirm(ApInfo *, Ieee80211PrimResultCode)` — 4 overrides |
| 203 | +- `Ieee80211MgmtSta::startReassociation(ApInfo *, simtime_t)` — **overridden nowhere** |
| 204 | +- `Ieee80211MgmtSta::stop()` |
| 205 | +- `Ieee80211MgmtSta::terminateCurrentAssociationFromPeer(const MacAddress &)` — **overridden nowhere** |
| 206 | +- `Ieee80211MgmtStaSimplified::configureAssociation()` — **overridden nowhere** |
| 207 | +- `Ieee80211MgmtStaSimplified::handleStartOperation(LifecycleOperation *)` |
| 208 | +- `Ieee80211MgmtStaSimplified::stop()` |
| 209 | +- `QosRateSelection::getPeerCompatibleMode(const MacAddress &, const physicallayer::IIeee80211Mode *)` — **overridden nowhere** |
| 210 | +- `RateSelection::getPeerCompatibleMode(const MacAddress &, const physicallayer::IIeee80211Mode *)` — **overridden nowhere** |
| 211 | + |
| 212 | +</details> |
| 213 | + |
| 214 | +## Questions for the review |
| 215 | + |
| 216 | +Counted by name over `src/` and `tests/`, so *uncalled* is exact and everything else is a hint. An override is not listed: its visibility is fixed by its base, and fulfilling a hook is not a new promise. |
| 217 | + |
| 218 | +**6 new public function(s) that nothing calls** — why public? ([AR-EXT-MINIMAL-SURFACE](../../../rule/architecture.md#ar-ext-minimal-surface)) |
| 219 | + |
| 220 | +- `Ieee80211MgmtSta::HtNegotiationFailure::getPeerAddress()` |
| 221 | +- `Ieee80211MgmtSta::HtNegotiationFailure::setPeerAddress(const MacAddress &)` |
| 222 | +- `Ieee80211MgmtSta::HtNegotiationFailure::setReason(const std::string &)` |
| 223 | +- `Ieee80211MgmtSta::HtNegotiationFailure::setReassociation(bool)` |
| 224 | +- `Ieee80211Mib::updateLocalHtCapabilities(const physicallayer::Ieee80211ModeSet *, const std::set<Hz> &, int)` |
| 225 | +- `Ieee80211ModeSet::getMaximumChannelWidth()` |
| 226 | + |
| 227 | +**4 new public function(s) called only from tests** — is the test testing behavior, or reaching in? ([AR-EXT-MINIMAL-SURFACE](../../../rule/architecture.md#ar-ext-minimal-surface)) |
| 228 | + |
| 229 | +- `Ieee80211MgmtSta::HtNegotiationFailure::isReassociation()` |
| 230 | +- `Ieee80211ModeSet::getFastestLegacyOperationalMode()` |
| 231 | +- `Ieee80211ModeSet::getHtMcsSupported()` |
| 232 | +- `Ieee80211ModeSet::getHtShortGuardIntervalChannelWidths()` |
| 233 | + |
| 234 | +**15 new virtual(s) that nothing overrides** — what would an override do, and does a comment say so? ([AR-EXT-VIRTUAL-IS-A-PROMISE](../../../rule/architecture.md#ar-ext-virtual-is-a-promise)) |
| 235 | + |
| 236 | +- `Ieee80211MgmtAp::clearPendingAssociation(StaInfo *)` |
| 237 | +- `Ieee80211MgmtAp::createAssociationTransactionId()` |
| 238 | +- `Ieee80211MgmtBase::addHtCapabilities(const Ptr<Ieee80211MgmtFrame> &)` |
| 239 | +- `Ieee80211MgmtBase::addHtOperation(const Ptr<Ieee80211MgmtFrame> &, const physicallayer::IIeee80211Band *)` |
| 240 | +- `Ieee80211MgmtSta::cancelPendingAssociation()` |
| 241 | +- `Ieee80211MgmtSta::cancelScanTimer()` |
| 242 | +- `Ieee80211MgmtSta::classifyAssociationResponse(const Ptr<const Ieee80211AssociationResponseFrame> &, const physicallayer::IIeee80211Band *, const Ieee80211HtOperation *, Ieee80211HtCapabilities &, Ieee80211HtOperation &, std::string &)` |
| 243 | +- `Ieee80211MgmtSta::clearCurrentAssociation()` |
| 244 | +- `Ieee80211MgmtSta::isHtBssSupported(const ApInfo *, std::string &)` |
| 245 | +- `Ieee80211MgmtSta::processAssociationResponse(Packet *, const Ptr<const Ieee80211MgmtHeader> &, bool)` |
| 246 | +- `Ieee80211MgmtSta::startReassociation(ApInfo *, simtime_t)` |
| 247 | +- `Ieee80211MgmtSta::terminateCurrentAssociationFromPeer(const MacAddress &)` |
| 248 | +- `Ieee80211MgmtStaSimplified::configureAssociation()` |
| 249 | +- `QosRateSelection::getPeerCompatibleMode(const MacAddress &, const physicallayer::IIeee80211Mode *)` |
| 250 | +- `RateSelection::getPeerCompatibleMode(const MacAddress &, const physicallayer::IIeee80211Mode *)` |
| 251 | + |
| 252 | +## Not changed |
| 253 | + |
| 254 | +project features · source folders · NED gates · NED properties · NED types |
0 commit comments