Gossipper is a Go rewrite of SIPp focused on SIP signaling load generation,
incremental XML scenario compatibility, and a cleaner engine architecture.
The current MVP implements:
- XML scenarios with
send,recv,pause,nop,label,timewait, andinit <pause>command withdistributionattribute forfixed,uniform, andnormaldistributions- XML command handoff via
sendCmd/recvCmd, both inside oneGossipperprocess and across multiple instances - SIPp-style 3PCC CLI aliases
-master,-slave, and-slave_cfgon top of the external command transport - Out-of-call SIP scenarios such as stateless
OPTIONSping/pong - Command-only 3PCC/out-of-call flows can run without a SIP remote address
- Expanded XML actions:
ereg,assign,assignstr,todouble,add,subtract,multiply,divide,strcmp,test,log,warning,lookup,jump,gettimeofday,urlencode,urldecode,verifyauth,setdest, andexec - Basic SIPp-style keywords such as
[call_id],[cseq],[branch],[remote_ip],[local_ip],[server_ip],[len],[last_*],[last_Request_URI],[users],[userid],[$var],[file ...],[fieldN ...], and Digest[authentication] - UDP transports
u1,un, andui(pragmatic client+server multi-IP mode) - Server-side UDP aliases
s1andsnfor UAS-style scenarios (they map tou1/un; they do not enable TLS) - Server-side TLS alias
slfor UAS (maps tol1; requires-tls_certand-tls_key) - Client-side TLS aliases
clandclnfor UAC (map tol1andln) - TCP transports
t1andtn - TLS transports
l1andln(UAC or UAS; same codes as for TCP, plus TLS files as needed) - Global and per-user variable scopes
- SIPp-style auth credentials via
-au/-apfor challenged401/407request retries, inline[authentication username=... password=...], and server-sideverifyauth - Optional SIP identity for built-in UAC /
invite_media:-sip_from(From before;tag=),-sip_pai,-sip_provider, repeatable-sip_extra_header(seedocs/compatibility.md[trunk_*]keywords) - Concurrent call generation with rate limiting
- Interactive UI via
gossipper tui(full-screen launcher) orgossipper cli(line-oriented shell:set,wizard,run, …) gossipper sipp— optional SIPp-style CLI prefix for scenario flags only (nottui/cli/server); same engine as rootgossipper [flags…]; baregossipper sippprints a short entry summary;gossipper sipp -hlists the full SIPp-compatible scenario flags (grouped HEP / OTLP / PPROF / SIPP) and without-api_addr/-api_token, or-rtp_send/-rtp_*;gossipper server -hlists management-oriented groups (bind, API, TLS, HEP, …);gossipper -hlists subcommands and pointers tosipp -h,server -h,profile -h— not the long flag list; seedocs/gossipper-vs-sipp.mdgossipper server— management / long-run SIP UAS + HTTP API: usegossipper server -config …in systemd for flat JSON, orgossipper serverwith CLI flags (seedocs/cli.mdandinternal/cli/server_subcmd.go)- Basic statistics and JSON summary export (
-summary_json), optional standalone HTML report (-summary_htmlorgossipper report-html -in … -out …; seedocs/summary-json.md) - Named per-step RTD timers via
start_rtd/rtd, aggregated into summary JSON - XML
counter/displayattributes aggregated into summary JSON as execution counts - Exported stats now include failure-class counters such as
timeout,unexpected_sip,transport_error,parse_error,scenario_error, andcancelled - Summary JSON now includes latency repartition data and standard deviation for call length, invite RTT, and named RTD timers
- Full message tracing via
-trace_msg/-message_file, compact CSV tracing via-trace_shortmsg, per-scenario SIP command counters via-trace_counts, periodic CSV stats snapshots with cumulative and interval delta fields via-trace_stat+-fd, RTD CSV dumps via-trace_rtt+-rtt_freq, non-interactive runtime screen snapshots via-trace_screen/-screen_file, error tracing via-trace_err, compact unexpected-response code tracing via-trace_error_codes, and action log tracing via-trace_logs - SIP mirroring to Homer over HEP3 via
-hep_addr,-hep_capture_id, and optional-hep_password - Summary output now includes aggregated RTP/RTCP counters
- RTP streaming over
pion/rtp, includingexec rtp_streamwith SIPp-style params andstart/pause/resume/stop - Audio PCAP replay via
exec play_pcap_audio="capture.pcap"with preserved inter-packet timing and SDP-driven remote endpoint discovery - RFC 2833 DTMF generation via
exec send_dtmf="123"(digits: 0-9, *, #, A-D) and[dtmf_digits]keyword for variable-driven strings - Pragmatic video/image PCAP replay via
exec play_pcap_video="capture.pcap"andexec play_pcap_image="capture.pcap"using SDP media endpoint discovery (m=video/m=image) - Pragmatic RTP activity checks via
exec rtpcheck="..."with configurablemin_packets,timeout_ms, anddirection=any|send|recv|both(legacybidirectionalalias is also supported) - RTP echo helper mode via
exec rtp_stream="echo" - Periodic RTCP sender reports plus basic incoming RTCP counters via
pion/rtcp - Optional HTTP API (
-api_addr) and Control UI at/when the web UI is built (make frontend; embedded in the binary). Packages also ship static assets under/usr/local/gossipper/dist/(optional nginxroot). JSON routes live under/api/v1/(health, stats, scenario get/put/apply, control, transports, clients,liveWebSocket, and auth when auth.type is internal — SQLite + JWT; create users withgossipper auth user-add -config /path/to.json). Without internal auth,api_tokenin JSON or-api_tokenon the CLI still gates the API. Packaged sample configs live under/usr/local/gossipper/etc/(see table below); matching systemd units aregossipper-server,gossipper-client, andgossipper-hybrid— all usegossipper server -config …with the corresponding JSON.
cmd/gossip: CLI entry pointhepcodec: public HEP3 wire encode/decode (SIP + media payloads)mediasink: publicMediaExporterAPI; built-in raw RTCP and Homer-Lake paths; optional compile-time extension for short JSON reportsinternal/cli: argument parsinginternal/scenario: XML parser and built-in scenariosinternal/template: SIPp keyword renderinginternal/sip: SIP message parsing helpersinternal/transport: UDP, TCP, and TLS transportsinternal/api: optional HTTP management API (-api_addr): stats, scenario, apply, control, transports, dynamic clients, WebSocket/api/v1/live, optional internal auth (/api/v1/auth/status,/api/v1/auth/login) whenauth.typeisinternalin flat server JSON; optional embedded Control UI (go:embedwebdist)web/control-ui: optional Vite/React control panel for that HTTP API (seeweb/control-ui/README.md); production build is written tointernal/api/webdist/and embedded into the binary (go:embed). A tinyweb/control-ui/go.modexists sogo test ./...does not scannode_modules.internal/scheduler: timing abstractioninternal/stats: counters and summariesinternal/media: RTP helpers backed by Piondocs:cli.md(process CLI), compatibility matrix, media roadmap, testing strategy
docs/cli.md: subcommands (sipp,cli,tui,server, …), run-profile path vs helpersdocs/gossipper-vs-sipp.md: high-level overview of whatGossippercan do and how it compares to SIPpdocs/compatibility.md: XML, keyword, action, transport, and scenario-time CLI compatibility matrix (including TLS socket modes vs SIPp / issue #7); process-level CLI indocs/cli.mddocs/architecture.md: package-level architecture and execution modeldocs/media-roadmap.md: media-related scope, next steps, and deferred itemsdocs/compatibility-testing.md: testing approach for compatibility work and regression coveragedocs/statistics-mapping.md: mapping between currentGossipperstats exports and SIPp-style countersdocs/trace-schema-contract.md: stable CSV header/order contract for-trace_stat,-trace_rtt, and-trace_screendocs/tui.md: interactive TUI usage guide with launcher and runtime screen examplesdocs/interactive-shell.md: line CLI (gossipper cli) withset,wizard,hint, andrundocs/run-profile.md: JSON run profiles (-config,-run-alias,-list-aliases), flat JSON viagossipper server -config; bundledtestdata/run-profiles/*.jsonincluding HEP script presetsdocs/sipstress-style-load-testing.md: long-run SIP load, HTTP control, hybrid JSON, live WebSocket, dynamic clients, internal auth (stress-style operations guide)docs/licensing.md: license choice and SPDX header guidance for future source filesdocs/rtp-in-scenarios.md:exec rtp_stream, PCAP replay, SRTP / DTLS-SRTP (-media_srtp), RTCP,rtpcheckdocs/srtp.md: SRTP (SDES + DTLS-SRTP), ICE, TURN, BUNDLE, trickle JSON — full media security contractdocs/pcap2scenario.md: PCAP → paired UAC/UAS XML scenariosdocs/cli-gap-list.md: SIPp CLI parity tracking and priorities
Production-style binary (includes embedded Control UI for -api_addr, like Homer’s make all):
make build
# binary: ./dist/gossipperQuick local compile without rebuilding the web UI (API only, no GET / panel until you run make frontend):
go build -o gossipper ./cmd/gossipRun the built-in UAC scenario against a SIP endpoint:
./gossipper -sn uac -rsa 127.0.0.1:5060 -m 1 -r 1Same flags with an explicit sipp prefix (recommended in scripts and in the examples below; gossipper sipp -h uses a SIPp-oriented help preamble and omits -api_*, and -rtp_send / -rtp_*; gossipper server -h shows management-oriented sections, not the full SIPp dump):
./gossipper sipp -sn uac -rsa 127.0.0.1:5060 -m 1 -r 1Run SIPp-style rate period scheduling (-r n -rp m):
./gossipper sipp -sn uac -rsa 127.0.0.1:5060 -r 7 -rp 2000 -m 50Run with periodic CPS ramping:
./gossipper sipp -sn uac -rsa 127.0.0.1:5060 -r 10 -rate_increase 2 -rate_interval 1000 -rate_max 50 -m 1000Run with a deterministic global timeout (CI-friendly):
./gossipper sipp -sn uac -rsa 127.0.0.1:5060 -m 10000 -r 50 -timeout_global 30Benchmark gossipper vs SIPp (requires UAS or -start-uas):
./scripts/benchmark-sipp-vs-gossipper.sh -start-uas -calls 500 -rate 50
make benchmark # same, via MakefileGenerate CSV lookup index for faster lookup action resolution:
./gossipper sipp -infindex ./testdata/injection/inject.csv 0Run M3 ui transport MVP (source IP selected per call from CSV):
./gossipper sipp -sn uac -rsa 127.0.0.1:5060 -t ui -inf ./testdata/injection/ui_ips.csv -ip_field 0 -m 20 -r 10Print build version information:
./gossipper -versionEnable pprof HTTP server for live CPU/memory/goroutine profiling:
./gossipper sipp -sn uac -rsa 127.0.0.1:5060 -m 1000 -r 50 -pprof :6060
# In another terminal: go tool pprof -http=:8080 http://localhost:6060/debug/pprof/profile?seconds=30Write CPU and memory profiles to files at exit:
./gossipper sipp -sn uac -rsa 127.0.0.1:5060 -m 500 -r 20 -cpuprofile cpu.prof -memprofile mem.prof
go tool pprof -http=:8080 cpu.prof # or mem.prof for heapLaunch the full-screen TUI or the line CLI:
./gossipper tui
./gossipper cliRun a custom XML scenario:
./gossipper sipp -sf ./testdata/scenarios/basic_uac.xml -rsa 127.0.0.1:5060 -m 10 -r 5Write a JSON summary:
./gossipper sipp -sf ./testdata/scenarios/basic_uac.xml -rsa 127.0.0.1:5060 -summary_json summary.jsonWrite full and short message traces:
./gossipper sipp -sf ./testdata/scenarios/basic_uac.xml -rsa 127.0.0.1:5060 -trace_msg -trace_shortmsg -message_file ./messages.logWrite unexpected responses and action logs to dedicated files:
./gossipper sipp -sf ./testdata/scenarios/basic_uac.xml -rsa 127.0.0.1:5060 -trace_err -trace_error_codes -error_file ./errors.log -trace_logs -log_file ./actions.logWrite periodic CSV stats snapshots:
./gossipper sipp -sf ./testdata/scenarios/basic_uac.xml -rsa 127.0.0.1:5060 -trace_stat -fd 2 -message_file ./messages.logWrite periodic per-command SIP message counters:
./gossipper sipp -sf ./testdata/scenarios/basic_uac.xml -rsa 127.0.0.1:5060 -trace_counts -fd 2 -message_file ./messages.logWrite periodic non-interactive runtime screen snapshots:
./gossipper sipp -sf ./testdata/scenarios/basic_uac.xml -rsa 127.0.0.1:5060 -trace_screen -fd 2 -screen_file ./screen.logInteractive controls during a TUI run:
+/-: increase or decrease target CPS*//: increase or decrease target CPS by 10x step (-rate_scalebased)p: pause or resume new call schedulingq: stop the run like SIPp by draining active calls in client modeEsc: return to the launch screen after the run finishes
Write RTD CSV samples:
./gossipper sipp -sf ./testdata/scenarios/basic_uac.xml -rsa 127.0.0.1:5060 -trace_rtt -rtt_freq 50 -message_file ./messages.logMirror SIP messages to Homer over HEP3:
./gossipper sipp -sf ./testdata/scenarios/basic_uac.xml -rsa 127.0.0.1:5060 -hep_addr 127.0.0.1:9060 -hep_capture_id 2001 -hep_password secretGossipper ships with a non-blocking structured event logger that fans the SIP dialog (and other engine events) out to one or more sinks: stdout, JSON-Lines file, and OpenTelemetry collectors over OTLP/gRPC or OTLP/HTTP. All sinks are fed by a single ring buffer, so emitting events never blocks the SIP hot path — on overflow the oldest events are dropped and counted.
Resource attributes are attached at the OTel LoggerProvider level. By default
Gossipper injects service.name=gossipper, service.version=<build>, and
gossipper.role=client|server. Any extra -log_attr key=value pair (repeatable)
is also added — typical use is self_tag / peer_tag to label nodes such as
NYC01 / NYC02.
Client NYC02 shipping logs to a collector via OTLP/gRPC:
./gossipper sipp -sn uac -rsa 10.0.0.3:5060 \
-log_otel_endpoint otel-collector:4317 -log_otel_proto grpc -log_otel_insecure \
-log_attr self_tag=NYC02 -log_attr peer_tag=NYC01 -log_stdoutServer NYC01 shipping logs over OTLP/HTTP (typical when the collector sits
behind a TLS-terminating proxy):
./gossipper sipp -sn uas -t s1 -i 0.0.0.0 -p 5060 \
-log_otel_endpoint http://otel-collector:4318 -log_otel_proto http \
-log_attr self_tag=NYC01 -log_attr peer_tag=NYC02 \
-log_file_jsonl /tmp/gossipper-events.jsonlThe full set of flags is described in docs/event-logging.md, including event
schema, the list of Kind values, ring-buffer sizing guidance, and tips for
high-CPS deployments. The legacy -trace_* files keep working in parallel and
are unaffected by event logging.
Run over TLS (UAC; -t cl is the same as -t l1 after startup):
./gossipper sipp -t cl -sf ./testdata/scenarios/basic_uac.xml -rsa 127.0.0.1:5061 -tls_skip_verifySame with explicit l1:
./gossipper sipp -t l1 -sf ./testdata/scenarios/basic_uac.xml -rsa 127.0.0.1:5061 -tls_skip_verifySIP TLS (answers to common support questions): signaling over TLS is supported. For UAC use -t l1 or -t ln, or the aliases -t cl / -t cln (same as l1 / ln). For a UAS, -t s1 / -t sn are UDP-only aliases; use -t l1 / -t ln or the TLS server shortcut -t sl (same as l1). A TLS listener needs -tls_cert and -tls_key; clients often use -tls_ca and -tls_skip_verify=false when validating the peer. The default -tls_skip_verify=true is convenient for lab setups only.
Run the built-in UAS over TLS (replace certificate paths with real files):
./gossipper sipp -sn uas -t sl -i 0.0.0.0 -p 5061 \
-tls_cert ./server.crt -tls_key ./server.key -m 1Run the built-in UAS in SIPp-style server transport mode:
./gossipper sipp -sn uas -t s1 -i 0.0.0.0 -p 5060 -m 1Run out-of-call OPTIONS ping/pong between two Gossipper instances:
./gossipper sipp -sf ./testdata/scenarios/options_server.xml -t s1 -i 0.0.0.0 -p 5060 -m 1
./gossipper sipp -sf ./testdata/scenarios/options_client.xml -rsa 127.0.0.1:5060 -s options -m 1 -r 1Run a challenged Digest auth scenario with SIPp-style credentials:
./gossipper sipp -sf ./testdata/scenarios/auth_uac.xml -rsa 127.0.0.1:5060 -s alice -au alice -ap secret -m 1 -r 1Run with an explicit base CSeq for [cseq] tokens:
./gossipper sipp -sf ./testdata/scenarios/basic_uac.xml -rsa 127.0.0.1:5060 -base_cseq 42 -m 1 -r 1Run a SIPp-style audio PCAP replay action from a scenario:
./gossipper sipp -sf ./testdata/scenarios/uac_pcap.xml -rsa 127.0.0.1:5060 -m 1 -r 1Run the bundled local two-sided PCAP demo between two Gossipper instances:
./gossipper sipp -sf ./testdata/scenarios/uas_pcap.xml -t s1 -i 0.0.0.0 -p 5060 -s pcap -m 1
./gossipper sipp -sf ./testdata/scenarios/uac_pcap.xml -rsa 127.0.0.1:5060 -s pcap -m 1 -r 1Run the bundled DTMF-over-PCAP demo against the same local UAS:
./gossipper sipp -sf ./testdata/scenarios/uas_pcap.xml -t s1 -i 0.0.0.0 -p 5060 -s pcap -m 1
./gossipper sipp -sf ./testdata/scenarios/uac_dtmf_pcap.xml -rsa 127.0.0.1:5060 -s pcap -m 1 -r 1Run 3PCC-style command exchange between instances with the low-level transport flags:
./gossipper sipp -sf ./scenario.xml -rsa 127.0.0.1:5060 -cmd_name m -cmd_peers ./peers.cfgRun the same flow with SIPp-style master/slave aliases:
./gossipper sipp -sf ./testdata/scenarios/3pcc_slave.xml -slave s1 -slave_cfg ./peers.cfg
./gossipper sipp -sf ./testdata/scenarios/3pcc_master.xml -master m -slave_cfg ./peers.cfg -rsa 127.0.0.1:5060Build the release binary:
make buildBuild Linux packages with nfpm:
make package # deb + rpm in one shot (recommended)
make package-deb
make package-rpmOr call the packaging script directly (same layout as Homer scripts/build_package.sh):
VERSION=0.1.0 ARCH=amd64 OS=linux scripts/build_package.sh deb
VERSION=0.1.0 ARCH=amd64 OS=linux scripts/build_package.sh rpm
# or both in one run (one frontend + one compile):
VERSION=0.1.0 ARCH=amd64 OS=linux scripts/build_package.sh allThe script mirrors CI: checks Node for the Control UI, runs npm ci / npm run build in web/control-ui, compiles a static gossipper into dist/, downloads nfpm v2.41.1 into the repo root if missing, then runs nfpm package.
By default, package versions are taken from cmd/gossip/version.go. You can
override them by exporting VERSION=... for ad-hoc builds.
Package artifacts are written to dist/ (build tree). The installed layout is under /usr/local/gossipper:
| Path | Contents |
|---|---|
bin/gossipper |
main binary |
etc/gossipper-server.json |
management SIP UAS + HTTP API — from repo examples/gossipper-management.json (gossipper server -config); typical SIP bind 0.0.0.0:5060, api_addr :8080 unless overridden |
etc/gossipper-client.json |
UAC / load preset — from repo examples/gossipper-uac.json (gossipper server -config; edit remote_addr, rates, scenario) |
etc/gossipper-hybrid.json |
one process: management server + clients[] — from repo examples/gossipper-hybrid.json |
etc/gossipper-management-auth.sample.json |
template for auth.type: internal (SQLite users + JWT); copy or merge into your server JSON, set jwt_secret, then gossipper auth user-add -config …. Default sqlite_path in the sample is /usr/local/gossipper/data/gossipper-settings.sqlite. |
etc/doc/ |
README.md, LICENSE, and docs/ from this repository |
data/ |
empty directory for persistent local state (e.g. internal-auth SQLite when auth.sqlite_path points here) |
logs/ |
empty directory for runtime logs (operator-owned) |
dist/ |
Control UI static files (same as embedded webdist) |
A symlink /usr/local/bin/gossipper → /usr/local/gossipper/bin/gossipper is created for PATH.
Repo examples/ mirrors these JSON files and the *.service units (which reference the /usr/local/gossipper/etc/*.json paths above).
.deb / .rpm install /lib/systemd/system/gossipper-server.service, gossipper-client.service, and gossipper-hybrid.service (see examples/*.service) and run systemctl daemon-reload via scripts/nfpm-postinstall.sh. Enable the unit that matches your profile, e.g. sudo systemctl enable --now gossipper-server, gossipper-client, or gossipper-hybrid (avoid two units binding the same SIP ports on one host).
- This is a behavior-oriented rewrite, not a literal source port of SIPp.
- For a narrative overview of current capabilities and trade-offs versus SIPp, see
docs/gossipper-vs-sipp.md. - XML compatibility is intentionally incremental. See
docs/compatibility.md. - For stats/export mapping against SIPp terminology, see
docs/statistics-mapping.md. - External
sendCmd/recvCmduses a simple TCP peer map inname;host:portformat via either-cmd_name/-cmd_peersor the SIPp-like aliases-master/-slave/-slave_cfg. - If a scenario only uses
sendCmd/recvCmdplus control commands, it can run without-rsa. - Regular out-of-call SIP request/response scenarios are supported too, for example
OPTIONShealthcheck flows without dialog teardown. -t s1and-t snare server-side UDP aliases and require a server scenario such as-sn uas.-message_fileenables full message trace output to a file;-trace_shortmsgwrites a sibling compact CSV log with per-message summaries.-trace_errwrites unexpected SIP responses and runtime failures to-error_file.-trace_error_codeswrites a sibling compact CSV file with unexpected SIP response codes and expected match criteria.-trace_logswrites XML<log>action output to-log_file.-trace_statwrites periodic and final CSV stats snapshots to a sibling*_stats.logfile; when-message_fileis set it uses that base path. The CSV includes cumulative totals, per-interval delta fields, and latency standard deviation columns.-fdcontrols the snapshot period in seconds.-trace_countswrites periodic CSV snapshots to a sibling*_counts.logfile with per-scenario SIP command counters (sent,recv,unexp) using the same-fdcadence.-trace_screenwrites periodic and final runtime summary snapshots to a sibling*_screen.logCSV file; fields include totals, CPS, interval CPS, success ratio, and key failure counters (failure_timeout,failure_unexpected_sip).-screen_filesets the explicit output path, and-fdcontrols snapshot cadence.- send
SIGUSR1to a running process to force an immediate-trace_screensnapshot dump without waiting for the next-fdtick. -timeout_globalstops the run after N seconds of total process runtime while still emitting final summaries/artifacts.-rate_scalesets the interactive target CPS step used by TUI keys (+/-for 1x and*//for 10x).- Exported stats also include failure-class counters so automation can distinguish timeouts, unexpected SIP, transport errors, parse errors, scenario errors, and cancellations.
-trace_rttwrites named RTD samples to a sibling*_rtt.logCSV file with timestamp, call, RTD name, and duration in milliseconds.-rtt_freqcontrols flush cadence in completed calls (default200).- Stable CSV header contracts for
-trace_stat,-trace_rtt, and-trace_screenare documented indocs/trace-schema-contract.md. - Summary JSON now exports repartition buckets for
call_length,invite_rtt, and namedrtdtimers so automation can consume latency distributions without parsing raw RTT dumps. -hep_addrmirrors SIPsend/recvtraffic to a Homer-compatible HEP3 collector over UDP.-hep_capture_idsets the HEP capture node ID;-hep_passwordsets the optional HEP auth key.- The current HEP MVP exports SIP signaling only; RTP/RTCP mirroring is not included yet.
[authentication]currently covers Digest401/407challenge responses withMD5andqop=auth; the scenario must explicitly place[authentication]into the retried request.-base_cseqsets the seed value used by[cseq]token rendering.-rpsets the SIPp-compatible rate period in milliseconds for-r(ncalls everyrpms).-rate_increaseadjusts target CPS every-rate_intervalmilliseconds during run;-rate_maxsets an optional upper cap.-max_socketlimits simultaneously open call sockets for per-call client transports (un,tn,ln, aliascln).-max_reconnectand-reconnect_sleepenable reconnect retries for shared client TCP/TLS transports (t1,l1, or thecl/slaliases that normalize tol1) on transport failures.-reconnect_closein shared clientt1/l1(orcl/sl) closes active calls on socket loss by skipping reconnect attempts.-infindex <file> <field>generates an index file next to the CSV (.gossipper.idx.<field>.json) so lookup-by-key can avoid full-file scans.-t uicurrently provides an M3 client+server MVP: one shared UDP socket per configured IP (client: per-call source IP rotation, server: one listener per configured IP).-inf <file>is required with-t ui. Optional-ip_field <idx>selects bind/source IPs from that CSV column (zero-based); if omitted, bind uses-ifor all UI sockets (same idea asu1/unwith-inffor[fieldN]only).- In
-t uiclient mode,-infrow order is preserved and duplicate IP rows intentionally affect round-robin weighting; in server mode listeners are created per unique IP. - XML action
setdestis supported in the pragmatic M3 scope for UDP shared-socket flows (u1,ui, and server-side UDP aliases) and enforces protocol compatibility checks. - TUI launch form supports
-t uiwithinfand optionalip_field(empty uses Local IP). start_rtdandrtdnow record named per-step timings into the summary model; they are especially useful for XML flows likesend INVITE->recv 200.counteranddisplayare currently exposed as successful-command execution counters in the summary model, which is a practical first step toward richer SIPp-style reporting.- In external 3PCC-style flows, the first incoming
recvCmdcan automatically adopt itsCall-IDinto[call_id]for later commands. initcan also usesendCmd/recvCmd, so inter-instance setup data may be loaded into global scopes before SIP traffic starts.- When launched with
-slave,Gossippervalidates that the scenario first enters the flow viarecvCmdbefore it sends anysendCmd. - RTP support is a separate milestone layered on top of the SIP engine.
- Current RTP support focuses on audio streaming from PCM mono 8kHz WAV input, audio PCAP replay, RTP echo, and basic RTCP observability.
play_pcap_audiocurrently replays UDP payloads from the capture as RTP toward the negotiated audio endpoint; pragmaticplay_pcap_video/play_pcap_imagesupport reuses the same replay mechanism for SDPm=video/m=imageendpoints.rtpcheckcurrently provides pragmatic RTP activity validation (min_packets,timeout_ms,direction; legacybidirectionalalias) and is not full SIPprtpcheckquality parity. SRTP / DTLS-SRTP for scenario media uses-media_srtp(seedocs/srtp.md,docs/rtp-in-scenarios.md).
When a new tag of the form vX.Y.Z is pushed, the .github/workflows/version-sync.yml
workflow automatically updates the Version constant in cmd/gossip/version.go on the
main branch to match the tag (stripping the leading v). The release build workflow
(.github/workflows/release.yml) then picks up the new tag and publishes the release
assets.
To cut a release:
git tag v1.2.3
git push origin v1.2.3The version sync workflow commits the updated version.go back to main automatically.
AGPL-3.0. See LICENSE.