XML compatibility matrix

May 15, 2026 · View on GitHub

This document defines the currently supported SIPp subset in Gossipper.

Gossipper process CLI (subcommands, optional gossipper sipp prefix, management server entry, run profiles) is documented in cli.md. This file focuses on XML, keywords, transports, and scenario-time CLI flags parsed after the main dispatcher.

Unsupported XML actions now fail during scenario parsing, and unsupported scenario keywords fail during template rendering instead of silently degrading into no-ops or empty strings.

Commands

SIPp commandStatusNotes
sendsupportedUDP and TCP sends; retrans is honored for UDP
recvsupportedMatch by request or response; optional receives supported, with pragmatic short-circuit when first incoming SIP mismatches an optional recv
pausesupportedUses milliseconds, falls back to CLI default
nopsupportedStructural no-op, still participates in branching
labelsupportedUsed as a target for next jumps
timewaitsupportedExecuted as a timed pause
sendCmdsupportedSupports local command bus and external peer delivery with dest, Call-ID correlation, and optional From sender identity
recvCmdsupportedReceives from the local bus or external peers, supports actions, timeout, optional src, and first-command correlation adoption for 3PCC-style flows so later [call_id] can reuse the adopted command context
initsupportedSupports initialization nop, pause, label, actions, and command exchange via sendCmd / recvCmd before traffic starts
_unexp.main fallback labelpartialPragmatic M6 support: on unexpected SIP during recv, if _unexp.main exists, flow jumps there and sets $_unexp.retaddr to the next command index

Common attributes

AttributeStatusNotes
nextsupportedJumps to a label
testsupportedEvaluated against in-memory variables and action results
chancesupportedFloating point 0..1
condexecsupportedWorks with in-memory variables and action results
condexec_inversesupportedSame behavior as SIPp-style inverted conditional execution
countersupportedSuccessful command execution increments the named counter in summary stats
displaysupportedSuccessful command execution increments the named display label in summary stats
start_rtdsupportedStarts a named RTD timer when the command begins execution
rtdsupportedStops the named RTD timer on successful command completion and aggregates it into summary stats
timeoutsupportedReceive timeout in milliseconds
millisecondssupportedpause and timewait

Scope declarations

DeclarationStatusNotes
GlobalsupportedShared variables across calls
UsersupportedVariables shared per logical user (-users)
ReferenceparsedStored for compatibility and future validation

Actions

ActionStatusNotes
eregsupportedmsg, hdr, body, and var search scopes
assignsupportedAssigns a floating-point value from value or variable
assignstrsupportedAssigns rendered string values to variables
todoublesupportedConverts a string variable into a floating-point variable
addsupportedFloating-point arithmetic against assign_to using value or variable
subtractsupportedFloating-point arithmetic against assign_to using value or variable
multiplysupportedFloating-point arithmetic against assign_to using value or variable
dividesupportedFloating-point arithmetic against assign_to using value or variable; divide-by-zero fails the call
strcmpsupportedLexicographic compare for variable against value or variable2; stores -1, 0, or 1
testsupportedStores boolean result as 1 or 0; supports value or variable2 with equal, not_equal, greater_than, less_than, greater_than_equal, and less_than_equal
logsupportedEmits message when tracing is enabled
warningsupportedEmits message into the error trace when -trace_err / -error_file is enabled
lookuppartialLooks up the first CSV column and stores a 1-based physical file line number; integrates with [fieldN ... line=$var]; optional -infindex accelerates key lookups with generated index files
jumpsupportedJumps to an absolute scenario command index via value or variable
gettimeofdaysupportedStores epoch seconds and microseconds in assign_to targets
urlencodesupportedURL-encodes the referenced variable in place
urldecodesupportedURL-decodes the referenced variable in place
verifyauthsupportedValidates incoming Digest Authorization / Proxy-Authorization headers for MD5 and SHA-256 with qop=auth
execpartialSupports command, int_cmd, rtp_stream start / pause / resume / stop / echo, pragmatic rtpcheck (min_packets, timeout_ms, `direction=any
samplepartialPragmatic deterministic subset: value="min=<int> max=<int> [step=<int>] [seed=<int>]" with assign_to target
insertpartialPragmatic CSV field mutation subset: file=... and `value="line= field= text= [position=prefix
replacepartialPragmatic CSV field mutation subset: file=... and value="line=<int> field=<int> text=<value>"; affects in-memory [fieldN ...] reads for the current call
setdestpartialPragmatic M3 runtime support: updates remote destination for shared-socket UDP flows (u1, ui, server-side UDP aliases), with protocol compatibility validation; non-UDP/per-call transports remain deferred
play_pcap_videopartialPragmatic replay support via exec play_pcap_video="capture.pcap" using SDP m=video endpoint discovery and generic RTP payload forwarding
play_pcap_imagepartialPragmatic replay support via exec play_pcap_image="capture.pcap" using SDP m=image endpoint discovery and generic RTP payload forwarding

Keywords

KeywordStatusNotes
[service]supportedCLI -s
[remote_host]supportedRemote host
[remote_ip]supportedResolved remote IP
[remote_port]supportedSupports +/-offset
[local_ip]supportedLocal bind IP
[local_ip_type]supported4 or 6
[local_port]supportedSupports +/-offset
[transport]supportedRenders UDP, TCP, or TLS depending on transport; ui explicitly renders as UDP
[call_id]supportedGenerated per call; in command-only/external 3PCC flows it is adopted from the first incoming recvCmd correlation message when needed; SIPp-style prefix///[call_id] form is recognized for dialog correlation (the prefix/// segment is stripped at matching/keying sites)
[cseq]supportedBasic numeric rendering with offsets
[branch]supportedDeterministic per message
[len]supportedTwo-pass body length calculation
[call_number]supportedMonotonic call index
[msg_index]supportedScenario message index
[pid]supportedCurrent process ID
[last_message]supportedLast received SIP message
[last_*]supportedMissing header drops the whole line, matching SIPp semantics
[last_Request_URI]supportedUses the last received request URI when available, otherwise falls back to the URI in the last To header
[last_cseq_number]supportedExtracted from the last CSeq header
[server_ip]supportedResolves to the active local bind IP for the call/session; in -t ui server mode it matches the listener IP that accepted the first request for the session
[next_url]supportedExtracted from the last Contact header
[peer_tag_param]supportedExtracted from the last To header
[media_ip]supportedMirrors local IP for now
[media_ip_type]supportedMirrors local IP type
[media_port]supportedDerived from local SIP port with per-call offset
[rtpstream_audio_port]supportedAlias for [media_port]; supports +/-offset
[auto_media_port]supportedAlias for [media_port]; supports +/-offset
[rtpstream_video_port]supported[media_port] + 2 (SIPp audio/video offset convention); supports +/-offset
[date]supportedCurrent UTC date in RFC2822 form with literal GMT zone (matches SIPp output)
[timestamp]supportedCurrent local timestamp
[authentication]supportedDigest auth for 401/407 challenges with CLI credentials from -au / -ap or inline username= / password= params; supports MD5 and SHA-256 with qop=auth
[fieldN ...]partialCSV injection with file= and optional line=; variable-driven form currently uses line=$var, and line numbers are physical 1-based CSV rows
[file ...]supportedInlines file contents from scenario-relative or absolute path
[users]supportedNumber of configured logical users from -users
[userid]supportedZero-based logical user identifier for the current call
[$n] / [$name]supportedAction and string variables
[dynamic_id]supportedAtomic per-message counter with INT32 wraparound to mirror SIPp; supports +/-offset
[routes]supportedWhen a recv command uses rrs="true", captured Record-Route headers are replayed as Route headers (reverse order) in subsequent rendered messages
[trunk_from]supportedBuilt-in UAC / invite_media: value before ;tag= in From; default gossip <sip:gossip@local_bind:port>; CLI -sip_from
[trunk_pai]supportedOptional full header line P-Asserted-Identity: … plus CRLF; empty when -sip_pai unset
[trunk_provider]supportedOptional X-provider: … plus CRLF; empty when -sip_provider unset
[trunk_extra]supportedOptional extra headers after Via (each line ends with CRLF); repeatable CLI -sip_extra_header
[clock_tick]supportedMilliseconds elapsed since engine start; supports +/-offset
[sipp_version]supportedRenders runtime version string (defaults to Gossipper when not explicitly provided)
[tdmmap]partialStub: renders 0.0.0/0; -tdmmap CLI flag is not parsed and per-call slot allocation is deferred
[fill]supportedvariable=N length and optional text="..." seed; matches SIPp behavior

Transport modes

ModeStatus
u1supported
unsupported
uipartial (pragmatic client+server multi-IP parity)
s1supported as server-side UDP alias
snsupported as server-side UDP alias
slsupported as server-side TLS alias (normalizes to l1; requires TLS cert/key)
clsupported as client-side TLS alias (normalizes to l1)
clnsupported as client-side TLS alias (normalizes to ln)
t1supported
tnsupported
l1supported
lnsupported

TLS socket modes (SIPp-style)

Relates to issue #7: how SIPp-style TLS mono/multi socket behavior maps to Gossipper.

SIPp-style behaviorGossipperNotes
Mono socket: one TLS connection to the remote peer-t l1 (UAC alias -t cl)Single shared TLS client (runClientSharedTLS); signaling for all calls is demultiplexed by Call-ID.
Multi socket: one TLS connection per new call, with a cap-t ln (UAC alias -t cln) and optional -max_socketPer-call TLS (runClientPerCallTLS); -max_socket limits how many per-call sockets may be open at once (same family as un / tn / ln).
Close TLS when each call ends (multi)Default for ln / cln UACEach call opens a transport.DialogTLS and closes it when that call’s scenario completes (defer dialog.Close() after executeCall). If sockets appear to outlive individual calls, open an issue with version, full CLI, and scenario.

TLS material: UAS needs -tls_cert and -tls_key; UAC often uses -tls_ca and -tls_skip_verify=false for strict verification (default skip is for lab use).

Reconnect: only shared client TCP/TLS (-t t1 / -t l1, or alias -t cl) uses -max_reconnect, -reconnect_sleep, and -reconnect_close on connection loss. Per-call ln / cln does not share that reconnect path.

3PCC CLI workflow

CLI surfaceStatusNotes
-cmd_name + -cmd_peerssupportedLow-level external command transport configuration
-master + -slave_cfgsupportedSIPp-style alias for naming the local master instance and peer map
-slave + -slave_cfgsupportedSIPp-style alias for naming the local slave instance and peer map
slave first step validationsupported-slave scenarios must enter via recvCmd before their first sendCmd
example scenariossupportedtestdata/scenarios/3pcc_master.xml and testdata/scenarios/3pcc_slave.xml

Out-of-call SIP workflow

WorkflowStatusNotes
stateless client send request + recv responsesupportedWorks for request/response exchanges such as OPTIONS ping
stateless server recv request + send responsesupportedWorks for responder scenarios such as OPTIONS pong
example scenariossupportedtestdata/scenarios/options_client.xml and testdata/scenarios/options_server.xml

Run control CLI workflow

CLI surfaceStatusNotes
-timeout_globalsupportedExits after N seconds of total runtime for deterministic CI/load runs
-rate_scalesupportedSets interactive CPS step size used by runtime TUI controls (+/- for 1x step and *// for 10x step)
-rate_increase + -rate_interval + -rate_maxsupportedApplies periodic CPS ramp-up/ramp-down during run; -rate_max caps upper bound when set
-inf + -ip_fieldsupported (for -t ui)With -t ui, -inf is required; -ip_field is optional — when set, selects UI bind IPs from that CSV column (zero-based index). When -ip_field is omitted, bind addresses come from -i (single socket / single listener IP). Client mode preserves CSV row order (including duplicates) for per-call rotation when using a column; server mode binds one listener per unique IP from the column or one listener for -i
-t uipartialPragmatic M3 parity: one UDP shared socket per source IP in client mode and one UDP listener socket per configured IP in server mode; bind failures include failing ip:port; TUI supports ui + inf and optional ip_field; transport token is normalized case-insensitively (for example UI); advanced SIPp parity remains deferred
-infindexsupportedGenerates a CSV injection index (-infindex <file> <field>); lookup uses generated index files for faster first-column key resolution
-max_socketpartialCaps per-call transport concurrency (un, tn, ln, UAC alias cln) by limiting simultaneously open call sockets; parser now rejects unsupported transports early
-max_reconnect + -reconnect_sleep + -reconnect_closepartialShared client TCP/TLS (t1, l1, or UAC alias cl that normalizes to l1) support reconnect retries and close-on-reconnect; per-call ln/cln does not; see TLS socket modes

Trace CLI workflow

CLI surfaceStatusNotes
-trace_msgsupportedWrites full sent/received messages to the configured file
-message_filesupportedExplicit path for the full message trace log; also enables -trace_msg
-trace_shortmsgsupportedWrites a compact CSV sibling log with timestamp, direction, protocol, summary, and Call-ID
-trace_countssupportedWrites periodic CSV snapshots with per-scenario SIP command counters (sent, recv, unexp); additional per-message detail is intentionally deferred to keep schema stable in M5
-trace_statsupportedWrites periodic and final CSV stats snapshots to a sibling _stats trace file with both cumulative totals and per-interval delta fields
-fdsupportedControls -trace_stat snapshot frequency in seconds (SIPp-compatible naming); providing -fd also enables -trace_stat
-trace_rttsupportedWrites each completed named RTD sample to a sibling _rtt CSV trace file
-rtt_freqsupportedControls -trace_rtt flush cadence in completed calls (default 200); providing -rtt_freq also enables -trace_rtt
CSV schema contractsupportedStable -trace_stat / -trace_rtt / -trace_screen header contract is documented in docs/trace-schema-contract.md
legacy trace CSV alias columnsdeferredNot emitted by design; migration should use explicit parser adapters, see docs/trace-schema-contract.md
-trace_errsupportedWrites unexpected SIP messages and runtime failures to the configured error file
-error_filesupportedExplicit path for the error trace log; also enables -trace_err
-trace_error_codessupportedWrites a compact sibling CSV file with unexpected SIP response codes, reasons, Call-ID, and expected match
-trace_screensupportedWrites periodic non-interactive runtime summary snapshots to a screen CSV log with success ratio, interval throughput, and key failure counters
-screen_filesupportedExplicit path for the screen snapshot log; also enables -trace_screen
SIGUSR1 screen dump triggersupportedForces an immediate runtime screen snapshot when -trace_screen is enabled
-trace_logssupportedWrites XML action <log> output to a dedicated file
-log_filesupportedExplicit path for the action log trace file; also enables -trace_logs

Statistics export

Export surfaceStatusNotes
summary JSON failure classessupportedExports failure class counters such as timeout, unexpected_sip, transport_error, parse_error, scenario_error, and cancelled
-trace_stat failure class columnssupportedPeriodic stats CSV includes cumulative and delta columns for the same failure classes
summary JSON latency repartitionsupportedExports call_length, invite_rtt, and named rtd summaries with stddev and repartition buckets
-trace_stat latency stddev columnssupportedPeriodic stats CSV includes call and invite latency standard deviation columns
SIPp stats field mapping docsupportedSee docs/statistics-mapping.md for the current field-by-field correspondence and gaps

HEP CLI workflow

CLI surfaceStatusNotes
-hep_addrsupportedMirrors SIP send / recv messages to a Homer-compatible HEP3 UDP collector
-hep_capture_idsupportedSets the HEP capture node ID
-hep_passwordsupportedSets the optional HEP auth key
RTP/RTCP mirroringdeferredCurrent HEP MVP exports SIP signaling only

Media and SRTP (scenario-time)

CLI surfaceStatusNotes
-media_srtpsupportedWhen peer SDP offers SRTP: SDES (a=crypto:) and/or DTLS-SRTP (a=fingerprint:); encrypt RTP/SRTCP outbound, decrypt inbound; see docs/srtp.md, docs/rtp-in-scenarios.md
-media_reject_srtpsupportedFail rtp_stream / mic when SDP hints SRTP (cleartext-only runs)
-turn_server, -turn_user, -turn_pass, -turn_realmpartialUDP TURN relay for ICE typ relay paths when using -media_srtp; not a full browser ICE stack

Authentication CLI workflow

CLI surfaceStatusNotes
-ausupportedAuthorization username; defaults to -s value like SIPp
-apsupportedAuthorization password; defaults to password like SIPp
-base_cseqsupportedSets the base value used by [cseq] token rendering
-rpsupportedSIPp-style rate period for -r (n calls per rp milliseconds)
runtime interactive rate keys (+, -, *, /)supportedTUI adjusts target CPS by -rate_scale (+/-: 1x, *//: 10x)
-reconnect_closepartialIn shared client t1/l1, closes active calls by disabling reconnect attempts when a socket loss is detected
challenged request retry via [authentication]supportedWorks for Digest 401 / 407 flows when the scenario explicitly places [authentication] in the retried request

Deliberately deferred

  • advanced insert / replace semantics beyond current deterministic per-cell CSV mutation subset
  • advanced sample distributions beyond current deterministic integer range subset
  • broader per-call addressing changes outside current setdest pragmatic scope (for example per-call sockets and non-UDP transports)
  • full video/image media pipeline parity beyond pragmatic PCAP replay coverage
  • advanced -t ui parity beyond current client+server multi-IP MVP (broader SIPp behavior alignment)
  • keyword helpers such as [tdmmap] and advanced [fill] semantics beyond the current pragmatic subset
  • full SIPp rtpcheck parity (Gossipper's rtpcheck is pragmatic RTP activity validation; not full SIPp SRTP/QoS metrics)
  • full CLI parity with SIPp