acceptsMessages() is true.
The message is accepted, routed, submitted, refused, requeued, and dropped at
outSms.routing.maxAttempts — and the drop says reason=maxAttempts, which describes the symptom
rather than the cause.
Where the cause actually is
message.submit.response, which carries the vendor’s command_status:
/ops/health as last_submit_error, with
submit_rejected counting them — so a lane refusing everything is visible without reading a log at
all.
What the common codes mean
The gateway carries the full table, and writes the plain-English sentence beside every code it
recognises. A code outside it logs as
vendor-specific, deliberately: vendors do use their own,
and inventing a name would send you looking for a spec entry that does not exist.
The 192–196 block is always about TLVs
If a lane starts refusing everything with one of those five, look at the message’s TLVs, not at routing. Three things supply them, composing in this order:1
The vendor's own default.tlvs.submit
outSms.instance.<name>.default.tlvs.submit2
The credential's defaultTlvs
Per-customer values.
3
The whitelist stamp
For an approved sender header or template.
tlvCount=0 on the trace lines confirms it.
The second commonest is a malformed default. The format is <name>_<tag>=<value> — writing
PEID=1101778070000018542 instead of peid_0x1400=1101778070000018542 parses to nothing, and the
TLV is dropped with only a WARN:
One vendor, many more submits than you configured
If a vendor reports far more rejected submits than you sent messages, the two retry ceilings are compounding: a vendor’s own retry budget is spent within one routing attempt, and a refusal returns the message to the router, which has its own attempt ceiling. With a single vendor configured, re-routing sends it straight back and spends a fresh budget.Related
TLVs in practice
Where a tag comes from and what overrides what.
Queues and retries
Attempt ceilings, backoff and what a requeue costs.