Three new tools and one fix to an old one.
blanton_ber.sh - PRBS BER across every cabled port, init/start/report/
stop/clear, -u 0|1|all. A lane passes only below 1e-6 (equal to the
threshold fails). report ends with a per-unit summary carrying the worst
lane, so an all-PASS run still shows how much margin there was. init
checks every lane locked, because an unlocked lane still reports a BER
and it is a meaningless one. Script C runs it after the traffic report,
following SWB_UNIT0/SWB_UNIT1 like the traffic block does.
blanton_tr518.sh - the built-in packet test, used to load the rails
before measuring power. start settles 120s so the reading afterwards is
loaded rather than mid-ramp. stop sends port cd lb=none and nothing else,
exactly what the bench procedure does - l2 learning and test mode are
left as start set them, and stop says so instead of quietly leaving the
box in a state nobody asked about.
TH6_SWB{0,1}_power_readback.sh - 19 rails, V x I and total. These read
the two sensor tables ONCE. The previous version read them per rail: 38
invocations of a slow CLI at 38 different instants, so the "total" was a
sum of readings seconds apart - and under load the currents move (TH6_CORE
186 A -> 636 A). A rail missing from the table now warns on stderr instead
of silently contributing 0 W.
blanton_traffic_linespeed.sh - ce0 (VLAN 138) joins the test. It has no
loopback partner and a switch never sends a frame back out its ingress
port, so a tx burst was one round trip and then silence. init now sets an
ingress mirror of ce0 back to itself; the mirrored copy is not
egress-filtered, so packets keep lapping until stop turns the mirror off.
stop is what ends it - removing the VLAN membership does not, because the
copy never consulted the VLAN. TL_CE_MODE also drops to 'self': ps ce
shows one ce port per unit and a unit-0-only burst returned on unit 0.
Read as cross-unit, both links dying would still report PASS (0 == 0).
Fixes a parser bug worth remembering: bcmcmd returns CRLF, and the BER is
the last token on its line, so the CR stayed glued to the number. Every
lane read as NA, and printing the CR sent the cursor to column 1 so the
RESULT column overwrote the start of the row. One stray \r, two symptoms.
Not yet verified on hardware, all called out in the release notes: the
ce0 mirror (destport == srcport may be refused), the 120s settle (tr 518
may be time-limited), and 'test mode nr=no' on stop.
Script A -> V1.1.0.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014RetWKFZFG1ZHcitQAyhwM
7.3 KiB
v1.1.0 — BER, power under load, and a 100G port that actually keeps sending
✨ New features
Whole-switch SerDes BER sweep
-
New
blanton_ber.shruns PRBS across every cabled port and reports the bit error rate lane by lane.init→start→ wait →report→stop→clear, with-u 0/-u 1for a single switch unit. -
A lane passes only when its BER is below 1e-6. Equal to the threshold is a FAIL, not a pass.
-c <ber>sets a different bar. -
reportends with a summary across both units, and each unit's row carries its worst lane — so a run where everything passes still tells you how much margin there was:Unit LANES PASS FAIL NA WORST BER WORST LANE RESULT unit 0 432 432 0 0 1.98e-08 203[0] PASS unit 1 432 432 0 0 6.34e-10 366[1] PASS -
initalso checks that every lane locked. This matters: an unlocked lane still reports a BER later, and it is a meaningless one. Without the check, a dead lane can report a beautiful number and pass. -
A lane whose reading is not a number is
NA— counted separately fromFAIL, because "not measured" and "measured and bad" are different problems. -
Script C runs the sweep after the traffic report, following
SWB_UNIT0/SWB_UNIT1the same way the traffic block does.
TR518 load test, for measuring power under traffic
- New
blanton_tr518.shputs the cd ports in loopback and runs the built-intr 518packet test, then waitsTR_SETTLE_SEC(120s by default) before handing back — so the power figures you take afterwards are loaded and settled, not caught mid-ramp. -u 0/-u 1for one unit; no flag runs both.stopsendsport cd lb=noneand nothing else, which is exactly what the bench procedure does. L2 learning and test mode are left asstartset them — the tool says so on everystoprather than quietly leaving the box in a state you did not ask about.TR_RESTORE_LEARN=1/TR_RESTORE_TESTMODE=1if you want a true inverse.
Per-rail power readback for both switch boards
TH6_SWB0_power_readback.sh/TH6_SWB1_power_readback.shreport V × I and total power for the 19 rails on each board.
🐛 Bug fixes
The power readback measured every rail at a different moment
- It ran
show platform voltageandshow platform currentonce per rail — 38 invocations of a slow CLI, and 38 different instants. Under load the currents move a lot (TH6_COREwas seen going from 186 A to 636 A), so the "total" was a sum of readings taken seconds apart. Both tables are now read once, up front. Same output, one moment. - A rail missing from the sensor table used to contribute a silent
0.000 V / 0.00 Wto the total. It now says so on stderr; the printed report format is unchanged.
The 100G port stopped sending after one round trip
ce0has no loopback partner, and a switch never forwards a frame back out the port it arrived on — so atxburst went out, came back, and was dropped. TX 100, RX 100, silence. That measures the link; it does not exercise it.initnow sets an ingress mirror ofce0back to itself. The mirrored copy is not egress-filtered, so each packet keeps lapping and the load is set by how much you inject (-tx).stopis what ends it — removing the VLAN membership does not, because the mirrored copy never consulted the VLAN.
The 100G verdict was being decided the wrong way
ce0was treated as a cross-unit check. The bench says otherwise: there is onece0per unit and a burst sent on unit 0 alone came back on unit 0. It is now judged within its own unit. The distinction is invisible while everything works and decisive when it does not — read as cross-unit, both links dying still leavesunit0.TX == unit1.RX(0 == 0) and reports PASS.
Every BER lane reported NA, and the Port column printed NA too
bcmcmdreturns CRLF, and the BER is the last token on its line, so the carriage return stayed glued to the number: it failed the numeric check, and printing it sent the cursor back to column 1 so the RESULT column overwrote the start of the row. Both symptoms, one stray\r.
📦 Downloads
| File | Contents |
|---|---|
Script_ABC_Blanton_V1.1.0.zip |
The full Tera Term working directory, including Blanton_Script/ to copy onto the DUT |
After copying to the DUT:
chmod +x ~/Blanton_Script/*.sh # see below
grep -rlU $'\r' ~/Blanton_Script # expect no output
blanton_ber.sh is invoked by Script C as ./Blanton_Script/blanton_ber.sh, so it joins bmc_monitor.sh and usb_target.sh in needing the execute bit — and neither git nor a Windows/USB copy carries it reliably. Without the chmod the BER section fails with Permission denied and the log simply has no BER in it.
⚠️ Before you run
- These three tests cannot share the switch.
blanton_ber.sh,blanton_tr518.shandblanton_traffic_linespeedall take over port loopback and L2 learning. Run one at a time; Script C already orders BER after the traffic report. - PRBS takes the links down. While
blanton_ber.shis armed the ports report DOWN and no traffic passes. That is the test working, not a fault.clearreleases them. ce0keeps running until you stop it. If a run is interrupted betweenstartandstop, the 100G port stays saturated with nothing inshow interfaces statusto hint at it.blanton_traffic_linespeed stop(orbcmcmd -n <u> -c 'mirror port ce0 Mode=Off') ends it.- Two numbers must stay in step: Script C's
sleep 30andblanton_ber.sh'sBER_INTERVAL. Change one without the other andreportreads an interval that has not finished accumulating — with no warning. FAN_SPEEDis 100. This build runs the fans flat out unless you changeconfig.ttl.- Declare the switch population with
SWB_UNIT0/SWB_UNIT1; traffic, the readiness gate and now the BER sweep all follow it. - PRBS on the two 100G uplinks (
port_prbs_monitor.sh) is still not wired into the macros. Unchanged from v1.0.9.
🔬 Not yet verified on hardware
Three things in this build were reasoned out rather than measured, and each has a one-command check:
- The
ce0ingress mirror.mirror port ce0 Mode=Ingress DestPort=ce0should make the port circulate, but the hardware may refuse a mirror destination equal to its source. Checkshow c | grep POK.ce0twice ten seconds apart — the number must climb. The report cannot tell you: a one-shot burst is alsoTX == RXand also says PASS. Fallback istr 518 PortList=268. - The 120s settle in
blanton_tr518.sh. Iftr 518's traffic is time-limited (its parameters includeruntime=1,CheckDataTime=200), waiting 120s could mean measuring after the load has already dropped. Compare a power readback at 0s, 30s and 120s. test mode nr=noinblanton_tr518.shis the derived inverse of thenr=yesthatstartsends; it is not part of the bench-verified sequence, and is off by default.
🔗 Links
- ARCHITECTURE.md — test flow, data models, constraints
- CLAUDE.md — commands and the bench gotchas
Full changelog: V1.0.11...V1.1.0