With the netdev configured, the script runs imsd-pcscf against the netdev's rmnet mux id (and the ims profile index when it knows one) and hands the IPv6 addresses it prints to imsd as PCSCF_DISCOVERED= in /run/imsd.env and gives the first — the daemon's fresh target — a host route (the SA peer of a registration imsd resumes is routed by imsd itself, as the configured address's arm already left it); IPv4 addresses and names are logged and dropped (the PDN is IPv6-only), at most eight are handed over, and nothing usable is logged with its cause and is not the script's failure: imsd resumes a registration of its own when it can, else says so and exits, and the restart runs discovery again. PCSCF= still wins and skips discovery; a list in it is refused. The script does not read the variable from its environment: the unit hands it the previous run's file, and a stale discovered value must not pass for the admin's setting. The reader's path is the IMSD_PCSCF seam the mock bench uses. Tested: on the mock bench against this commit's script (the twelve 0.3.10 scenarios; this step's discovery arms S13–S17 and S19–S22, with S18 the pre-existing non-IPv6 refusal; S55, the reader's rc-0 answer without an address), and in builds of this series on the dev phone (KPN), whose PCO — two IPv6 addresses, nothing else — reaches the plain found arm; the configured skip, the bracketed refusal and, through the IMSD_PCSCF seam, the reader's failure and its exit 2 ran on the phone too; the v4/FQDN line, the eight-address cap, the IPv4-only and no-mux-id skips, the comma-list refusal and the rc-0 arm on the mock only. On a tip build of this series (daemon 2ec1a02f62831edb; bench 40, 2026-10-13) a fresh registration reached a target this script had not routed — the reader stubbed through the IMSD_PCSCF seam to find none, the address in /etc/imsd.env as PCSCF_DISCOVERED= — over imsd's own route, and a resume stood with the peer's route removed first.
43 lines
1.9 KiB
Desktop File
43 lines
1.9 KiB
Desktop File
# SPDX-License-Identifier: GPL-3.0-only
|
|
# SPDX-FileCopyrightText: Copyright (C) 2026 Catcrafts®
|
|
[Unit]
|
|
Description=Userspace IMS/VoLTE daemon (SIP register + calls over the ims PDN)
|
|
# needs the ims PDN (multiplexed netdev + global v6) — ims-pdn-up.sh
|
|
# creates/connects the bearer through ModemManager and configures the netdev
|
|
After=ModemManager.service network.target
|
|
Wants=ModemManager.service
|
|
|
|
[Service]
|
|
Type=simple
|
|
# bring up the ims PDN first; waits for modem + network registration,
|
|
# idempotent. worst case ~14 min (2 min modem wait + 5 min registration
|
|
# gate + connect retries), hence TimeoutStartSec
|
|
ExecStartPre=/usr/libexec/ims-pdn-up.sh
|
|
# a daemon older than 0.3.10 that an upgrade restarted inside its bring-up
|
|
# throttle wait: the wait — on another address only the verdict that its
|
|
# registration is gone — is handed over from its journal now that it has
|
|
# stopped (imsd.post-upgrade recorded the invocation in /run/imsd.handover)
|
|
ExecStartPre=-/usr/libexec/imsd-handover.sh
|
|
TimeoutStartSec=900
|
|
# /run/imsd.env: written by ims-pdn-up.sh (DEV= the connected ims netdev,
|
|
# LOCAL= the PDN address ModemManager assigned to it, PCSCF_DISCOVERED= the
|
|
# P-CSCF list the network put in the PDN's PCO, read from the modem).
|
|
# /etc/imsd.env: admin configuration, none required where discovery finds a
|
|
# P-CSCF (AGENTS.md §10, the README); it wins over the runtime-derived values
|
|
# — PCSCF= overrides discovery.
|
|
EnvironmentFile=-/run/imsd.env
|
|
EnvironmentFile=-/etc/imsd.env
|
|
# registration state (imsreg.state) + media stats live here
|
|
StateDirectory=imsd
|
|
ExecStart=/usr/bin/imsd
|
|
# registration: resume an existing SA when possible (avoids fresh-SA
|
|
# throttles); a failed bring-up exits nonzero and systemd retries, as does
|
|
# a registered imsd whose PDN address left the netdev
|
|
Restart=on-failure
|
|
RestartSec=120
|
|
# SIGTERM: engine keeps the SA + registration state for the next resume
|
|
KillMode=mixed
|
|
TimeoutStopSec=10
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|