test: share one SCTP wire harness between the restart runners
The sm, peer and SCTP/TLS restart runners each carried their own copy of
the same machinery, and only the sm runner built the tools image, so the
peer and TLS runners failed on a machine where it had not run first.
scripts/sctp-wire now holds the common part: building or verifying the
tools image, now named sctp-wire-tools; compiling each fixture inside a
container from a read-only copy of the source; the two-container network;
the iptables rule that drops a stale ABORT on the receiver's INPUT;
captures, artifact collection, cleanup and the tshark export. Each runner
keeps its fixture, variants, timings and analyzer next to its package,
builds the image itself when it is missing, and names its runs,
containers, networks and scratch directories neutrally. The image build
keeps its builder state in the run's scratch directory, while the
caller's Docker context and credentials stay in effect. The peer analyzer
now runs on the host's Python 3, like the other two.
All 13 variants pass with their current packet assertions, including the
peer and TLS runners started first on a machine without the image.
Closes #131.
Summary by cubic
Shares the SCTP wire harness between the sm, peer, and SCTP/TLS restart runners so any of them can run first on a machine without the tools image, which previously only the sm runner built.
- Moves image build/verify, fixture compilation, the two-container network, the ABORT drop rule, captures, artifact collection, cleanup, and tshark export into
scripts/sctp-wire/harness.sh. - Renames the tools image to
sctp-wire-tools:go1.27.2and lets each runner build it when absent;SCTP_WIRE_IMAGEoverrides the tag. - Runs the peer analyzer on the host's Python 3, matching the sm and TLS analyzers.