-
released this
2026-08-26 10:13:34 +08:00 | 50 commits to main since this release✨ New features
Both management NICs are pinged simultaneously and continuously
mgmt_ping_monitor.shno longer alternates fixed bursts.startconfigures both NICs, then pings from each at the same time and keeps accumulating until stopped — so a soak-long run is one continuous measurement rather than a series of snapshots.stoprenders a report into the log: the last 20 entries per NIC, each one's ping statistics and PASS/FAIL, thenip -s link showfor both interfaces.- Every line is timestamped, and a request that got no reply prints a marker instead of merely being absent — a drop is visible in the tail, not inferred from a gap in the sequence numbers.
statusshows both pids and how many replies each NIC has received so far, which is the quick way to see one side is dead without waiting for the report.
The USB stress target is detected, not assumed
- New
usb_target.shreports an inserted USB device's node, mount point or by-id path. Script B asks it for the node and builds the stress command from the answer, so a stick that enumerates assdbno longer sends a write test at whatever/dev/sda1happens to be. - It excludes whatever disk backs
/and/host— this platform can boot from a USB DOM, which also reports as USB — refuses to guess when several USB disks are present, and when it mounts, verifies the result is actually writable rather than trusting thatmountsucceeded.
BMC I2C integrity is exercised through the soak
bmc_monitor.shis back in the run and now writes two complementary patterns to a BMC scratch register and reads each back. One pattern alone cannot catch a bit stuck the same way it was written; repeating the pair through the soak turns an intermittent I2C fault into something the log records rather than something the tester has to witness.
Test artefacts leave the DUT with the run
- Script C copies
bmc_poll.logandmgmt_ping.loginto the job directory before it is archived to USB, so the monitors' output travels with thebgctljob logs. - DDR stress now runs continuously instead of stopping after 100 passes, matching the other soak loads.
🐛 Bug fixes
Three FAILs that were not link faults
- A bench run reported
FAIL=3with zero NIC errors, zero drops and sub-millisecond replies. Every failure was missing exactlyicmp_seq=1and nothing else: once the neighbour entry for the target expires, the first echo request is spent resolving ARP andpingcounts it as loss. A discarded warm-up ping per NIC now absorbs that, which is what lets the loss threshold stay at zero and still mean something. Raising the threshold instead would have hidden genuine single-packet loss.
Job logs were being cleared before they were collected
- Script C ran
bgctl reset --yeswhile killing processes — before the job directory is copied to USB. Moved to after the archive, so a run's own logs are collected before anything clears them.
The fan controller was bound twice
- One of the two MAX31790 controllers received a second
bindimmediately after the first, which could only fail because the driver was already attached.
📦 Downloads
File Contents Script_ABC_Blanton_V1.0.8.zipThe full Tera Term working directory, including Blanton_Script/to copy onto the DUTAfter copying to the DUT:
chmod +x ~/Blanton_Script/*.sh # see below grep -rlU $'\r' ~/Blanton_Script # expect no outputmgmt_ping_monitor.shno longer re-execs itself, sobash mgmt_ping_monitor.sh startworks without the execute bit.bmc_monitor.shandusb_target.shstill need it — and neither git (mode 100644) nor a Windows/USB copy carries it. Without thechmod,startfails withPermission deniedand the latercatfinds nothing: the section ends up empty and nothing reports an error.⚠️ Before you run
- Declare the switch population.
SWB_UNIT0/SWB_UNIT1inconfig.ttlsay which switch units this DUT has. Traffic and the readiness gate both follow them; with neither set the traffic stage is skipped rather than failing against hardware that is not there. - Set the fan speed you want.
FAN_SPEEDinconfig.ttlis applied at the start of every run. - Management connectivity is in use, not preserved. Both NICs are up and pinging — drive the run from the serial console.
- If the two management NICs share a subnet, keep
ARP_STRICT=1. Otherwise the target's ARP can be answered by either NIC and a reply may arrive on the one that did not send. Checknic_tx/nic_rxon the RESULT line: they are that interface's own counter delta. - Two settings persist to
config_db.jsonand survive a reboot: LLDP is left disabled and the 100G uplinks are left configured. Restore them before the DUT moves on.
🔗 Links
- ARCHITECTURE.md — test flow, data models, constraints
- CLAUDE.md — commands and the bench gotchas
Full changelog: V1.0.7...V1.0.8
Downloads
-
released this
2026-08-25 14:22:22 +08:00 | 56 commits to main since this release✨ New features
10G / 1G management port ping test
- New
mgmt_ping_monitor.shexercises both management NICs in one loop: it brings each up with iproute2, waits for the link to settle, then pings that NIC's own target —eth0→192.168.1.30,eth1→192.168.1.31. - Runs detached like the other monitors:
start/stop/status/fg/summary.startclears the previous log, so one run means one log. - Every leg writes a single greppable line —
RESULT 10G eth0 -> 192.168.1.30 tx=10 rx=10 loss=0% rtt_avg=1.743ms nic_tx=10 nic_rx=10 PASS— so a whole soak can be read withsummaryinstead of scrolling. nic_tx/nic_rxare that interface's own counter delta across the burst. If a ping passes but they stay near zero, the traffic left on the other NIC and the number does not belong to this one.- Script A runs one round as a baseline; Script B leaves it running through the soak.
Fan speed is set at the start of every run
FAN_SPEEDinconfig.ttl(default 30) is applied by Script A, so a run no longer inherits whatever the previous test left the fans doing.- Both MAX31790 controllers are rebound first, which clears a controller left in an odd state.
Stress load moved onto the platform's own job runner
- CPU, DDR, SSD and USB stress now go through
bgctl, replacing the~/hammer/tools/stress_*.pyscripts.bgctl listshows what is running; Script C stops everything withbgctl stop --all. - BMC DDR stress runs through
bmc-manager, and a new BMC USB test discovers thecdc_ncminterface and pings across it for four hours undersystemd-run.
More of the DUT on record
- Script A now captures the boot image,
show version, firmware status, system EEPROM, SSD health, TPM version and NVMe SMART data before the test starts. - PCIe AER now sits next to
ras-mc-ctl --summary, and Script C closes with NVMe health so a disk that degraded during the soak is visible. dmesgcapture uses human-readable timestamps and one combined error pattern, then clears the ring buffer — so Script C's dmesg shows only what the soak produced, not everything since boot.- Each run opens with
hw-test-session startand closes withfinish; Script C copies the job logs to/mnt/usb/jobs-<date>_<time>so they leave the DUT with the run they belong to.
🐛 Bug fixes
Script A no longer hangs waiting for ports that are already up
- The readiness gate required more than 216 ports up, but a fully cabled unit reports exactly 216 — 108 loopback pairs times two. Script A sat in the poll loop forever on the very state it was waiting for. It now proceeds at 216.
- The comments in
wait_init.ttlstill described the old "more than" rule; they now match the code, so the off-by-one cannot be reintroduced by reading the wrong line.
The macro no longer runs ahead of the DUT during the soak
- Script B set a 15-second wait cap for the
cdc_ncmprobe and never restored it. In Tera Term that cap is global, so it stayed in force for everything after — including the traffic setup, which walks 108 VLANs per switch unit and takes far longer. A timed-out wait returns without the prompt, leaving every later command issued a step early.
Fan controller is no longer bound twice
- One of the two MAX31790 controllers received a second
bindimmediately after the first, which could only fail because the driver was already attached.
📦 Downloads
File Contents Script_ABC_Blanton_V1.0.7.zipThe full Tera Term working directory, including Blanton_Script/to copy onto the DUTAfter copying to the DUT:
chmod +x ~/Blanton_Script/*.sh # required -- see below grep -rlU $'\r' ~/Blanton_Script # expect no outputThe
chmod +xis not optional.mgmt_ping_monitor.shis executed rather than sourced and re-execs its own path to daemonise, and neither git (mode 100644) nor a Windows/USB copy carries the execute bit. Without itstartfails withPermission deniedand the latercatfinds nothing — the section ends up empty and nothing reports an error.⚠️ Before you run
- Declare the switch population.
SWB_UNIT0/SWB_UNIT1inconfig.ttlsay which switch units this DUT has. Traffic and the readiness gate both follow them: a single unit gets-u 0or-u 1, and with neither set the traffic stage is skipped instead of failing against hardware that is not there. - Both management NICs stay up. If they share a subnet, keep
ARP_STRICT=1— otherwise the target's ARP can be answered by either NIC and a reply may arrive on the one that did not send. - Management connectivity is exercised, not preserved. Drive the run from the serial console.
- Two settings persist to
config_db.jsonand survive a reboot: LLDP is left disabled, and the 100G uplinks are left configured. Restore them before the DUT moves on.
🔗 Links
- ARCHITECTURE.md — test flow, data models, constraints
- CLAUDE.md — commands and the bench gotchas
Full changelog: V1.0.5...V1.0.7
Downloads
- New
-
released this
2026-08-21 16:06:54 +08:00 | 60 commits to main since this releaseBlanton TTL Script V1.0.5
One test run is Script A (baseline) -> B (soak) -> C (verdict), all captured in a single Tera Term log.
✨ New features
Partly populated DUTs
-
config.ttldeclares the switch population once:SWB_UNIT0 = 1 ; this DUT has switch unit 0 SWB_UNIT1 = 1 ; this DUT has switch unit 1 -
The traffic blocks in A, B and C branch on it: no
-uwhen both units are fitted (the tool's ownTL_UNITS="0 1"applies),-u 0or-u 1for a single one, and the whole stage is skipped when neither is set -
utils/wait_init.ttlreads the same two flags, so the wait and the traffic cannot disagree about what is installed
Readiness gate
- Script A now waits on the data plane rather than the sensors: it polls
bcmcmd -n <u> -c ps | grep -w up | wc -land proceeds once every fitted unit reports at leastWT_MIN(216) ports up — 216 being 108 loopback pairs x 2, i.e. every cabled port
BMC
bmc_monitor.sh(samplesfree -m) andbmc_monitor_ddr.sh(memtester) run through the soak viabmc-manager run, started by Script B and collected by Script C
Inventory and link state
- Script A: boot image, board EEPROM (
hpe-eeprom-tlv), BMC version, 100G uplink configuration and status, uptime - Script C:
show reboot-causeand uptime, so an unplanned reset during the soak shows up in the closing snapshot - LLDP disabled and transceiver low-power mode cleared before traffic, so the loopback counters only reflect the injected burst
🐛 Bug fixes
- Script A never got past the port wait. The threshold was strictly greater than 216, but a fully cabled unit reports exactly 216, so the loop spun forever on the very state it was waiting for. Now "at least 216"
- Single-unit traffic paths were unreachable. All nine branch conditions compared
SWB_UNIT0against itself, so a DUT with only unit 0 ran the both-unit commands against an absent unit 1, and a DUT with only unit 1 skipped traffic altogether config save -ywas sent without waiting for the prompt, leaving the macro one step ahead of the DUT from that point on
⚠️ Deployment notes
scp -r src/Script_ABC_Blanton/Blanton_Script admin@<DUT>:~/ chmod +x ~/Blanton_Script/bmc_monitor*.sh # required -- see below grep -rlU $'\r' ~/Blanton_Script # expect no outputThe
chmod +xis still not optional.bmc_monitor*.share executed rather than sourced,do_startre-execs its own path, and neither git (mode 100644) nor a Windows/USB copy carries the execute bit. Without it Script B'sstartfails withPermission deniedand Script C'scatfinds nothing — the BMC section ends up empty and nothing reports an error.Two settings in this build persist to
config_db.jsonand survive a reboot: LLDP is left disabled, and Ethernet513 is left shut down. Restore them before the DUT moves on to other work.📦 Downloads
File Contents Script_ABC_Blanton_V1.0.5.zipThe full Tera Term working directory, including Blanton_Script/to scp onto the DUTDownloads
-
-
released this
2026-08-21 09:33:06 +08:00 | 67 commits to main since this releaseBlanton TTL Script V1.0.3
One test run is Script A (baseline) -> B (soak) -> C (verdict), all captured in a single Tera Term log.
✨ New features
Traffic
blanton_traffic_linespeed.shdrives SWB loopback line-speed traffic overbcmcmd, VLAN 30..137 pairingcdNwithcdN+32- Per-pair TX/RX cross-check (
cdA.TX == cdB.RX) yields PASS/FAIL; awk on the DUT,tools/bcm_mibpair_report_V1.1.0.pyoff-box - All three scripts now cover both switch units
BMC
bmc_monitor.shsamplesfree -m;bmc_monitor_ddr.shrunsmemtesteras a stress load. Both reach the BMC throughbmc-manager runfrom the host, so no interactive SSH to the BMC is needed- Script B starts them, Script C stops them and folds their logs into the master log
Data collection
- Script A records
show boot, the BMC version, 100G port status andshow uptime, and waits for pmon to come up before taking a baseline (utils/wait_init.ttl) - Script C adds
show reboot-causeandshow uptime, so an unplanned reset during the soak is visible in the closing snapshot - PMON snapshot extended with
leak statusandleak channels
Packaging
publish/publish.shbuildspublish/Script_ABC_Blanton_<Ver>/(-zfor a zip). The version is read from Script A's header, so the folder name cannot disagree with the macro
🐛 Bug fixes
- Every counter in the traffic report printed as 2147483647 — the DUT's awk casts to a 32-bit int for
%d, and a real line-speed run is around 1e12. Now formatted with%.0f. Verdicts were never affected: the cross-check compares doubles and only the display path was wrong - SWB I2C channels and LTC2977 addresses — corrected against the bench. CONN13/15 and CONN14/16 were paired to the wrong channels, and addresses step by 2, not 1. This also clears the collision where two CONNs both landed on
0x5Eon Ch6 - CRLF made
margin.shunrunnable on SONiC ($'\r': command not found)..gitattributesnow pins*.shand*.confto LF.settings/*.confwas the quieter half: they are sourced, soCB_I2C_CH=6became"6\r" - margin.sh v2.6.0 — the SWB path never found the cb_i2c backend, so
TRANSPORT=swbalways failed to load. It now searches the parentBlanton_Script/directory, and the duplicated backend copies were removed - Script C hung — it called a subcommand that runs
tail -fand never returns, so the run never reached the stress results or the closing messagebox. Replaced with a directcatof the logs
⚠️ Deployment notes
scp -r src/Script_ABC_Blanton/Blanton_Script admin@<DUT>:~/ chmod +x ~/Blanton_Script/bmc_monitor*.sh # required -- see below grep -rlU $'\r' ~/Blanton_Script # expect no outputThe
chmod +xis not optional.bmc_monitor*.share the first scripts here meant to be executed rather than sourced,do_startre-execs its own path, and neither git (mode 100644) nor a Windows/USB copy carries the execute bit. Without it Script B'sstartfails withPermission deniedand Script C'scatfinds nothing — the BMC section ends up empty and nothing reports an error.📦 Downloads
File Contents Script_ABC_Blanton_V1.0.3.zipThe full Tera Term working directory, including Blanton_Script/to scp onto the DUTDownloads