Skip to content

Commit 9345013

Browse files
levyclaude
andcommitted
doc: audit pull request #1173 and add its change summary
PASS with 3 findings and 3 notes. 24 commits, 93 files, +10454/-424, stacked on #1172: its first fourteen commits are #1172's by content -- six by hash, eight re-created with identical patch-ids -- and ten more carry the AP side. Commit 19 brings back the best thing #1154 did, in its better form: terminal management frame outcomes as a signal with a details object and three statistics, without the 1-to-1 callback ever having existed. Commit 22 is the first of five cuts of this work to cite the standard clause it implements in its message. F-1: commit 15 puts back the trailing blank line commit 1 removed, fourteen commits apart in the same series. A correction must not survive to review, and a reversal is not squashed but deleted -- drop both. It also says something #1172's own audit could not: its praised whitespace commit was later unwanted. F-2: commit 24 rewrites 72 values in store.json that the CSV baselines had already accepted before this branch -- the claim was checked at the merge base and holds. As a commit it is right; as a passenger in an 802.11 branch it is wrong, since it repairs staleness in directories the branch never touches. Its own pull request, mergeable today. Our gate prints the same line for "squash this" and "move this"; recorded. F-3: no WHATSNEW, fifth pull request running. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
1 parent 1ff1c30 commit 9345013

3 files changed

Lines changed: 459 additions & 1 deletion

File tree

‎doc/project/audit/architecture-exceptions.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ and the interface declaration becomes pure. Where no Base exists, one is created
5959
| Id | Coupling | Where | Suggested resolution | Status |
6060
|---|---|---|---|---|
6161
| AV-CONTRACT-01 | **default bodies in an interface** — the shape that hides a break: `IIndicatorFigure::getNumSeries() { return 1; }` and `refreshDisplay() {}`; `IResolver::resolveExpression() { return ""; }`; `ICongestionController::readParameters/setStatistics/setPath() {}`; `QuicSocket::ICallback::socketNewToken() {}`; `TcpSocket::ICallback::socketIcmpv4Error/socketIcmpv6Error() {}` (2); `SctpSocket::ICallback` (12 no-op defaults and `socketOptionsArrived() { delete indication; }`) | `common/figures/`, `common/StringFormat.h`, `transportlayer/quic/congestioncontrol/`, `transportlayer/contract/{tcp,sctp,quic}/` | Make each pure; put the default in the Base the implementors already extend (`TcpAppBase` implements `TcpSocket::ICallback`) or create one (`CongestionControllerBase`, `SctpSocketCallbackBase`, `IndicatorFigureBase`). `IIndicatorFigure` is the live case of the hazard — see [pr-1125.md](report/pull-request/pr-1125.md) F-2, which renames it while keeping the body. | Open |
62-
| AV-CONTRACT-02 | **a body the Base could take today**: `IFunction::printOn()` → `FunctionBase` exists; `IIeee80211Band::printToStream()` → `Ieee80211BandBase` exists — **repaired by [#1172](report/pull-request/pr-1172.md), done when it merges**; `ITransmitStep/IReceiveStep::getType() { return TRANSMIT/RECEIVE; }` | `common/math/`, `physicallayer/wireless/ieee80211/mode/`, `linklayer/ieee80211/mac/contract/IFrameSequence.h` | Move the body down one level. Three small commits. | Open |
62+
| AV-CONTRACT-02 | **a body the Base could take today**: `IFunction::printOn()` → `FunctionBase` exists; `IIeee80211Band::printToStream()` → `Ieee80211BandBase` exists — **repaired by [#1172](report/pull-request/pr-1172.md) and carried in [#1173](report/pull-request/pr-1173.md); done when either merges**; `ITransmitStep/IReceiveStep::getType() { return TRANSMIT/RECEIVE; }` | `common/math/`, `physicallayer/wireless/ieee80211/mode/`, `linklayer/ieee80211/mac/contract/IFrameSequence.h` | Move the body down one level. Three small commits. | Open |
6363
| AV-CONTRACT-03 | **state in an interface**: `IRadio` and `ITransmission` each hold `uint64_t& nextId = SIMULATION_SHARED_COUNTER(nextId)`; `IMessageHandler` holds `Router *router` and a constructor that sets it; `IScheduler` holds `streamMap` and a constructor that sets it | `physicallayer/wireless/common/contract/packetlevel/`, `routing/ospfv2/messagehandler/`, `transportlayer/quic/scheduler/` | An interface with a constructor argument is a base class wearing the wrong name. Move the state to `RadioBase` / `TransmissionBase` (both exist), `MessageHandlerBase`, `SchedulerBase`. | Open |
6464

6565
### Genuine violations — *fix*
Lines changed: 254 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,254 @@
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

Comments
 (0)