1xBTS 1xBTS

Configuration Reference

Run the integrated runtime with a config directory:

Terminal window
cargo run --release -p cdma-nib -- --config-dir config

Runtime Flags

FlagPurpose
--config-dir <DIR>Directory containing per-node JSON config files (CDMA_CONFIG_DIR can also be used)
--bts-config <FILE>Replace bts.json with a complete custom BTS configuration
--bts-profile <PROFILE>Apply bts.<profile>.json from the config directory. sprint selects the included Sprint settings.
--radio-config <FILE>Override the radio config embedded in bts.json
--null-radioRun without SDR hardware (TX drops, no RX)
--a1-addr <ADDR>MSC A1 signaling listen address (default 127.0.0.1:17013)
--msc-mgmt-addr <ADDR>MSC management gRPC listen address (default 127.0.0.1:17017)

Local Overrides

Every per-node config in config/ supports a sibling <name>.local.json file that is merged on top of the base file at load time:

config/bts.json # shared default (checked into git)
config/bts.local.json # your overrides (gitignored)

The runtime reads the base file, deep-merges the local file on top, and validates the result. The local file only needs the fields you are changing.

Applies to: bts.json, bsc.json, msc.json, pcf.json, pdsn.json, hlr.json, smsc.json, management.json, voice-gw.json, and standalone radio profile files (e.g. radio_bladerf_micro2.local.json).

Merge behavior:

  • Nested objects merge field by field; omitted fields keep the base value.
  • Arrays in the local file replace the base array (no append).
  • Setting a field to null removes it, falling back to the struct default.

Example config/bts.local.json retuning to a different CDMA channel and raising TX gain:

{
"channel": {
"band_class": "bc0",
"cdma_channel": 283
},
"radio": {
"tx_gain_db": 60
}
}

See Configuration → Local Overrides for the introductory walkthrough.

See Carrier Profiles for the Verizon and Sprint startup commands, local override order, and Sprint-specific tuning. Profile names may contain lowercase letters, digits, and hyphens. A profile also supports a sibling bts.<profile>.local.json override.


bts.json

BTS radio and PHY configuration.

Top-level

FieldTypeDefaultDescription
pilot_offsetinteger0Pilot PN offset in chips (0–511)
channelobject{ "band_class": "bc0", "cdma_channel": 384 }CDMA band class + channel number. Drives TX/RX frequencies and the broadcast CDMA_FREQ / BAND_CLASS overhead fields.
evdoobjectdisabled by default unless set in the shipped configOptional EV-DO / HRPD Rev 0/Rev A carrier and overhead configuration.

channel

Single source of truth for the BTS’s RF tuning, per C.S0057-F. The BTS derives TX/RX center frequencies and the broadcast CDMA_FREQ / BAND_CLASS fields from this triple.

FieldTypeDefaultDescription
band_classstring"bc0"One of "bc0" through "bc22"
band_subclassinteger(required)5-bit BAND_SUBCLASS; selects the channel-validity profile within the band
cdma_channelinteger384CDMA channel number N

See Channel Planning for the full band-class table, valid channel ranges, and recommended channels, or use the CDMA Channel Calculator to look up the TX/RX frequencies for any (band, subclass, N).

Overrides for loopback or development work:

  • runtime.tx_freq_hz_override (integer, optional) — force the TX center frequency.

evdo

Optional EV-DO / HRPD Rev 0/Rev A carrier configuration. When enabled in the integrated runtime, cdma-nib starts the HRPD AN service, PCF A9 signaling, and PDSN A11 signaling, then bridges decoded HRPD air events between the BTS PHY and AN session layers.

FieldTypeDefaultDescription
enabledbooleanfalseTurn on the EV-DO carrier and HRPD packet-data path.
channelintegerrequired when enabledHRPD band-class channel number. Startup fails if EV-DO is enabled without an explicit channel. For EV-DO-only deployments, channels 589, 630, and 770 are good starting points.
modestring"composite"Carrier mode: "composite" for 1x + HRPD on one tuned RF span, or "hrpd_only" for an EV-DO-only deployment.
advertise_on_1xbooleanfalseAdvertise the HRPD carrier on the 1x paging channel for hybrid devices.
gainfloat1.0HRPD forward-carrier amplitude relative to the 1x carrier in composite mode. In HRPD-only mode the carrier level comes from tx_digital_backoff and this value has no effect.
overhead.sector_idstringrequired when enabled16-byte HRPD sector ID, encoded as 32 hex characters.
overhead.subnet_maskinteger26UATI subnet mask advertised by the HRPD sector.
overhead.color_codeinteger26HRPD color code used by devices to distinguish the sector.
overhead.sector_signatureinteger1HRPD sector signature advertised in overhead.
overhead.access_signatureinteger1HRPD access signature advertised in overhead.

Use a normal SDR radio profile with this section. The old HRPD-specific radio profiles and dual-RF evdo_rf settings have been removed.

Derived RF profile

The BTS derives TX/RX SDR sample rates and RF bandwidths at startup from channel and evdo.

Carrier modeDerived sample rateDerived RF bandwidth
1x only (evdo.enabled: false)4x chip rate (4915200 Hz for SR1)1500000 Hz
1x + HRPD (evdo.enabled: true, mode: "composite")Smallest 4x, 8x, or 16x chip-rate span that fits the 1x and HRPD carriersCarrier separation plus occupied bandwidth
HRPD only (mode: "hrpd_only")4x chip rate (4915200 Hz for SR1)1500000 Hz

HRPD-only mode also selects the HRPD reverse carrier automatically and omits all 1x receiver correlator and traffic chains.

Composite mode validates both forward and reverse carrier spacing. If the configured 1x and HRPD channels do not fit within the 16x cap, startup fails with a configuration error.

overhead

Cell identity and system parameters broadcast on the paging channel.

FieldTypeDefaultDescription
sidinteger1System ID
nidinteger1Network ID
base_idinteger1Base station ID
reg_zoneinteger0Registration zone
total_zonesinteger1Total number of registration zones
zone_timerinteger0Zone timer index
max_slot_cycle_indexinteger0Maximum slot cycle index
page_chaninteger1Paging channel number (1–7)
config_seqinteger23Configuration sequence number
acc_config_seqinteger1Access configuration sequence number
power_up_regbooleantrueRequire power-up registration
parameter_regbooleanfalseRequire parameter-change registration
auth_modeinteger0Authentication mode (0–3)
p_revinteger6Protocol revision
min_p_revinteger3Minimum protocol revision accepted
lp_secinteger18Leap seconds offset between UTC and CDMA System Time (GPS-UTC)
ltm_offinteger0Local time offset from UTC, half-hour units, 6-bit signed (-32..=+31, i.e. -16h..+15.5h)
dayltinteger0Daylight saving time indicator (0 or 1)
pratinteger0Paging rate
cdma_freqinteger | nullnullBroadcast CDMA_FREQ (11-bit). When null, derived from channel.cdma_channel. Set explicitly only to advertise a different channel than the BTS is operating on.
ext_cdma_freqinteger | nullnullBroadcast EXT_CDMA_FREQ. When null, derived from channel.cdma_channel.
band_classinteger | nullnullBroadcast BAND_CLASS (5-bit) emitted in ECAMs. When null, derived from channel.band_class.

timezone

Optional. Controls the local time broadcast on both 1x and EV-DO. Use source = "system" for the host timezone, source = "user" for a named IANA timezone, or source = "overhead" for the static overhead values. System and user timezones pick up DST changes without a restart.

FieldTypeDefaultDescription
sourcestring"overhead"One of "overhead", "system", "user"
tzstring(none)IANA zone name; required when source = "user"

source = "system" reads the host’s IANA zone via the iana-time-zone crate. The BTS refuses to start if the host has no IANA zone configured and source = "system" is selected.

source = "user" requires a parseable IANA name (e.g. "America/Los_Angeles"). Invalid names are rejected at config load.

DAYLT tells a 1x phone that daylight saving time is active. It does not tell the phone to add or subtract another hour. The UTC offset already includes the DST adjustment.

LP_SEC is not driven by this section. It lives on overhead.lp_sec and is broadcast as the leap-second value on both 1x and HRPD regardless of source.

Examples:

"timezone": { "source": "overhead" }
"timezone": { "source": "system" }
"timezone": { "source": "user", "tz": "America/Los_Angeles" }

runtime

PHY/MAC/LAC runtime settings.

FieldTypeDefaultDescription
spreading_ratestring"sr1"Spreading rate: "sr1" or "sr3"
orthogonal_code_lengthinteger64Walsh code length
chip_rate_hzinteger1228800Chip rate in Hz
tx_freq_hz_overrideinteger | nullnullWhen set, overrides the TX center frequency derived from channel for loopback or development use.
tx_lo_offset_hzinteger0TX LO hardware offset in Hz
tx_digital_backofffloat0.15 (shipped config: 0.3)Scales the composite before pulse shaping (0.0–1.0) and means the same at every TX sample rate. Sets the total transmit level; the channel power fractions below decide how it is shared. Above 0.3 a fully loaded carrier starts clipping.
block_size_chipsinteger64Internal processing block size in chips
tx_batch_chipsinteger3072TX batch size in chips (2× PCG = 3072 for SR1)
short_code_length_chipsinteger32768Short PN code period in chips
max_tx_lookahead_msinteger5Maximum TX lookahead in milliseconds

runtime.realtime

Controls scheduling for the BTS TX, RX, and radio-driver threads. Failures are reported in the logs and radio metrics; the BTS continues with the scheduling policy the operating system permits.

FieldTypeDefaultDescription
enabledbooleantrueRequest real-time scheduling for radio and baseband threads
tx_priorityinteger80Linux SCHED_FIFO priority for the TX thread, 1–99
rx_priorityinteger75Linux SCHED_FIFO priority for the RX thread, 1–99
driver_priorityinteger70Linux SCHED_FIFO priority used while radio-driver workers start, 1–99
tx_cpuinteger | nullnullOptional valid, online Linux CPU index for the TX thread
rx_cpuinteger | nullnullOptional valid, online Linux CPU index for the RX thread
driver_cpuinteger | nullnullOptional valid, online Linux CPU index inherited by radio-driver workers

Linux requires permission to select SCHED_FIFO, normally through the process’s real-time priority resource limit or CAP_SYS_NICE. On macOS the priority numbers and CPU fields do not apply; the runtime requests the platform’s time-constraint or interactive QoS classes instead.

runtime.downlink.pilot

FieldTypeDefaultDescription
walsh_codeinteger0Walsh code for pilot channel (always W0)
power_fractionfloat0.2Pilot share of total forward power (20%, −7 dB)

runtime.downlink.sync

FieldTypeDefaultDescription
walsh_codeinteger32Walsh code for sync channel (always W32)
walsh_repetitioninteger4Walsh repetition factor
data_rate_bpsinteger1200Sync channel data rate
symbol_repeatinteger2Symbol repetition count
interleaver.block_sizeinteger128Interleaver block size
interleaver.minteger7Interleaver M parameter
interleaver.jinteger1Interleaver J parameter
power_fractionfloat0.0471Sync share of total forward power (−13.3 dB)
availability_max_size_bitsinteger32Max bits in sync availability buffer

runtime.downlink.paging

FieldTypeDefaultDescription
walsh_codeinteger1Walsh code for paging channel (W1)
paging_channel_numberinteger1Paging channel number (1–7)
data_rate_bpsinteger9600Paging channel data rate
interleaver.block_sizeinteger384Interleaver block size
interleaver.minteger6Interleaver M parameter
interleaver.jinteger6Interleaver J parameter
power_fractionfloat0.1882Paging share of total forward power (−7.3 dB)
availability_max_size_bitsinteger96Max bits in paging availability buffer

runtime.downlink.traffic

FieldTypeDefaultDescription
power_fractionfloat0.5647Share of total forward power available to all traffic channels together. Active calls split it evenly and forward power control moves each one inside it.
max_channel_power_fractionfloat0.2Upper bound on one traffic channel’s share, so a single call does not take the whole allotment.

The four power_fraction values follow the C.S0010 base station test model and must not sum to more than 1.0. Pilot, sync, and paging power stay fixed as calls come and go. The BTS logs the split in percent and dB at startup.

runtime.downlink.paging.message_defaults

Overhead messages broadcast on the paging channel. schedule controls which messages are transmitted and in what order.

The serving band chooses the neighbor-list format automatically. Band Class 0 uses neighbor_list. Every other band uses extended_neighbor_list. Band Class 1 and Band Class 4 also receive the required base-class indicator. The runtime adds the appropriate neighbor message if it is missing from schedule.

extended_system_parameters — IMSI defaults and soft-handoff thresholds:

FieldTypeDefaultDescription
mccstring"310"Mobile country code (3-digit string)
imsi_11_12string"55"IMSI digits 11–12 (2-digit string)
pref_msid_typeinteger3Preferred mobile ID type
p_revinteger6Protocol revision
min_p_revinteger6Minimum protocol revision
soft_slopeinteger16Soft handoff slope
add_interceptinteger8T_ADD intercept
drop_interceptinteger6T_DROP intercept
packet_zone_idinteger0Packet zone ID
use_tmsibooleanfalseTMSI assignment enabled
delete_for_tmsibooleanfalseDelete TMSI on reassignment

system_parameters — core cell parameters:

FieldTypeDefaultDescription
home_regbooleantrueHome registration enabled
for_sid_regbooleantrueForeign SID registration enabled
for_nid_regbooleantrueForeign NID registration enabled
power_down_regbooleanfalsePower-down registration enabled
reg_prdinteger29Registration period (timer index)
base_latintegerBase station latitude (in units per spec)
base_longintegerBase station longitude
reg_distinteger0Registration distance
srch_win_ainteger6Active set search window
srch_win_ninteger8Neighbor set search window
srch_win_rinteger9Remaining set search window
t_addinteger18Pilot T_ADD threshold (0.5 dB units)
t_dropinteger28Pilot T_DROP threshold
t_compinteger8T_COMP comparison threshold
t_tdropinteger3T_TDROP timer index
pwr_rep_threshinteger2Power report threshold
pwr_rep_framesinteger9Power report frame count
pwr_thresh_enablebooleantrueThreshold-based power reporting
pwr_period_enablebooleantruePeriodic power reporting
pwr_rep_delayinteger2Power report delay

access_parameters — reverse access channel configuration:

FieldTypeDefaultDescription
acc_chaninteger0Access channel number
nom_pwrinteger0Nominal TX power adjustment
init_pwrinteger0Initial power offset
pwr_stepinteger3Power step size (dB)
num_stepinteger3Number of power steps per probe
max_cap_szinteger4Maximum access capsule size
pam_szinteger10Preamble length
max_req_seqinteger3Maximum request sequences
max_rsp_seqinteger3Maximum response sequences
acc_tmointeger3Access timeout
probe_bkoffinteger0Probe backoff
bkoffinteger0Sequence backoff

neighbor_list — Band Class 0 neighbor pilots:

FieldTypeDefaultDescription
pilot_incinteger4Pilot increment advertised with the list
neighborsinteger array[]Neighbor pilot PN offsets

extended_neighbor_list — neighbor records for other bands:

FieldTypeDefaultDescription
pilot_incinteger4Pilot increment, from 1 through 15
neighborsobject array[]Up to 40 extended neighbor records

Each extended record contains nghbr_config (0..3), nghbr_pn (0..511), and search_priority (0..3). To put a neighbor on another carrier, provide both nghbr_band (0..31) and nghbr_freq (0..2047). Omit both for a neighbor on the current carrier.

Reverse link configuration.

FieldTypeDefaultDescription
access_channels_per_paging_channelinteger1R-ACH channels per paging channel
access_channel_numbersarray[0]Access channel number list
access_channel_rate_bpsinteger4800Access channel data rate
access_frame_msinteger20Access frame duration in ms
require_r_csch_f_csch_arq_ackbooleantrueRequire ACK on access channel messages
arq_ack_timeout_msinteger400ARQ ACK timeout (T1m)
reverse_access_finger_pool_sizeinteger8Number of RAKE fingers for access channel
global_finger_pool_sizeinteger1Global RAKE finger pool size

runtime.overhead

Overhead channel scheduling.

FieldTypeDefaultDescription
fragment_availability_interval_chipsinteger32768Paging fragment scheduling interval
sync_superframe_interval_chipsinteger98304Sync superframe interval
t1b_msinteger1280T1b timer period in ms
require_spmbooleantrueRequire System Parameters Message
require_apmbooleantrueRequire Access Parameters Message
require_cclmbooleantrueRequire CDMA Channel List Message
require_espmbooleantrueRequire Extended System Parameters Message

abis

Abis TCP signaling address (BTS side).

FieldTypeDefaultDescription
bind_addrstring"127.0.0.1:5604"Local TCP bind address for the BTS Abis signaling listener

bearer

Abis UDP bearer addressing (BTS side).

FieldTypeDefaultDescription
bind_addrstring"127.0.0.1:17014"Local UDP bind address
remote_addrstring"127.0.0.1:17022"BSC bearer address

bsc.json

BSC radio access control and paging policy.

traffic_assignment

FieldTypeDefaultDescription
supported_for_rcsarray[1, 2, 3]Supported forward radio configurations
supported_rev_rcsarray[1, 2, 3]Supported reverse radio configurations
preferred_pairsarray[{for_rc:1, rev_rc:1}, {for_rc:2, rev_rc:2}, {for_rc:3, rev_rc:3}]Preferred forward/reverse RC pairs, tried in order
idle_timeout_sinteger15Traffic channel idle timeout before release
ms_ack_timeout_msinteger5000TCH bringup timeout after the BS Ack Order while waiting for the MS Ack
packet_service_connect_timeout_msinteger5000Packet-data timeout while waiting for Service Connect Completion
rev_fch_gating_modebooleanfalseReverse FCH gating mode
enable_f_schbooleanfalseEnable Forward Supplemental Channel assignment for eligible SO33/RC3 packet sessions
f_sch_rate_bpsinteger19200F-SCH rate when enabled; valid values are 19200, 38400, 76800, and 153600

f_sch_rate_bps is only used when enable_f_sch is true. 9600 is the fundamental-channel data rate, not a valid F-SCH rate.

This is a carrier-wide packet-data setting: every eligible SO33 packet session gets the configured F-SCH rate.

traffic_retry

FieldTypeDefaultDescription
ack_timeout_msinteger400Traffic assignment ACK timeout (T1m)
max_retriesinteger3Maximum retransmissions

paging_retry

FieldTypeDefaultDescription
ack_timeout_msinteger10000Paging ACK timeout in ms
max_retriesinteger0Maximum paging retries

abis_timers

BSC-side Abis timers per A.S0003-A §8 Table 8-1. Granularity is 100 ms; ranges are 0–1000 ms except tsetupb_ms (0–500).

FieldTypeDefaultDescription
tsetupb_msinteger100§8.2 — Abis BTS Setup timer (range 0–500)
tchanstatb_msinteger500§8.3 — Abis Traffic Channel Status timer
tdrptgtb_msinteger500§8.5 — Abis BTS Release Ack timer
tbstreqb_msinteger500§8.6 — Abis Burst Response timer

abis

Abis TCP signaling address (BSC side).

FieldTypeDefaultDescription
remote_addrstring"127.0.0.1:5604"BTS Abis signaling endpoint the BSC connects to

bearer

Abis UDP bearer addressing (BSC side).

FieldTypeDefaultDescription
bind_addrstring"127.0.0.1:17022"Local UDP bind address
remote_addrstring"127.0.0.1:17014"BTS bearer address

Other top-level fields

FieldTypeDefaultDescription
mobile_idle_timeout_sinteger3600Evict idle registered mobiles with no access activity and no active traffic channel after this many seconds. Set to 0 to disable.
voice_bearer_bind_ipstring"127.0.0.1"Local IP that voice bearer UDP sockets bind to. Set to the host’s network-facing IP when BSC and voice gateway are on separate hosts.
node_idstring"bsc"Stable identifier for this BSC node, written to the HLR on every registration and included in management events. Must be unique across BSC instances.

msc.json

MSC call control and voice policy.

Top-level

FieldTypeDefaultDescription
a1_listen_addrstring"127.0.0.1:17013"A1 signaling listen address
mgmt_grpc_addrstring"127.0.0.1:17017"MSC management gRPC listen address
a1_peersarray[]Static A1 peer list (peer_id + addr)

voice

FieldTypeDefaultDescription
supported_service_optionsarray[3, 68, 70, 32768]Voice options the MSC may propose for mobile-terminated calls. Implemented values are SO1, SO3, SO68, SO70, and SO32768; the first implemented entry is the default.
wav_filestringnullWAV audio file path for fallback playback
media_ringback_enabledbooleanfalseGenerate ringback tone in media path
media_ringback_typestring"nanp"Ringback tone type: "nanp" or "etsi"
sip_ringback_disablebooleanfalseWho plays the ringback the caller hears on outbound SIP calls. false = your network; true = the SIP trunk (the trunk must send early-media ringback).
inbound_sip_msc_ringbackbooleantrueWhen true, your network plays the ringback the SIP caller hears (subscriber’s custom ringtone, or the default tone) while the handset is being rung. Set to false to let the trunk play it.
generate_ringbackbooleantrueSend ringback audio to the calling handset over the call’s audio channel.
send_tones_alertbooleanfalseTell the calling handset to play its own ringback tone. Independent of generate_ringback; either, both, or neither are valid.
failure_tone_duration_msinteger3000How long the caller hears the busy tone on a failed call before it ends. 0 ends the call immediately.
page_retry_cooldown_msinteger1000Time between ring attempts when the called handset hasn’t answered yet.
page_retry_max_duration_msinteger60000How long the network keeps trying to reach the called handset before giving up. Must be > 0. SIP callers get 480 Temporarily Unavailable on giveup.
answer_delay_msinteger10000Delay before automatic answer in local simulation paths
release_timeout_msinteger5000Call release timeout in ms
service_connect_timeout_msinteger20000Service connect timeout in ms
voice_bearer_bind_ipstring"127.0.0.1"Local IP that voice bearer UDP sockets bind to. Set to the host’s network-facing IP when MSC and voice gateway run on separate hosts.

voice.gateway

FieldTypeDefaultDescription
enabledbooleanfalseEnable external SIP voice gateway
endpointstring"http://127.0.0.1:17015"Voice gateway gRPC endpoint
fallback_to_wavbooleantruePlay WAV audio if gateway is unreachable

welcome_sms

FieldTypeDefaultDescription
enabledbooleanfalseEnable welcome SMS on registration
textstring"Welcome to 1xBTS!"SMS body text
originating_numberstring"0000"Originating number shown to subscriber
inactive_days_thresholdinteger30Days of inactivity before re-sending

otasp

Over-the-air provisioning (*228). See the OTASP guide for end-to-end behavior.

FieldTypeDefaultDescription
enabledbooleantrueMaster switch. When false, *228 originations are not handled by the OTASP coordinator.
feature_codesarray["*228"]Dialed digit strings that start an OTASP session.
spc_policystring"leave_default"Use "leave_default" to present the subscriber’s stored SPC (or "000000") during Verify SPC without changing the SPC on the device.

otasp.system_tag

FieldTypeDefaultDescription
namestring"1xBTS"Home System Tag banner shown on the handset status bar. ASCII only; max 31 characters.
tag_p_revinteger1TAG_P_REV value.

otasp.nam_defaults

Mobile-terminated call acceptance bits written into every CDMA/Analog NAM and CDMA NAM block.

FieldTypeDefaultDescription
mob_term_homebooleantrueAccept MT calls when camped on the home SID.
mob_term_for_sidbooleantrueAccept MT calls when roaming under a foreign SID in the NAM’s SID/NID list.
mob_term_for_nidbooleantrueAccept MT calls when roaming under a foreign NID.

otasp.mms

FieldTypeDefaultDescription
uristring""MMSC URL written to handsets when otasp.writes.mms_uri = true. Must be a valid HTTP/HTTPS URL when used.

otasp.writes

Per-block opt-in for what *228 overwrites on the handset. Every flag defaults to false so a freshly-installed system reads each block back, shows it on the session detail page, but never changes anything.

FieldTypeDefaultDescription
cdma_analog_nambooleanfalseWrite the analog NAM block: phone identity (IMSI), access class, home system, paging channel, roaming permissions.
mdnbooleanfalseWrite the Mobile Directory Number — the handset’s stored phone number.
cdma_nambooleanfalseWrite the CDMA NAM block: same identity / roaming fields as the analog block, for modern CDMA-only handsets.
home_system_tagbooleanfalseWrite the Home System Tag — uses otasp.system_tag.name.
mms_uribooleanfalseWrite the MMS URL — uses otasp.mms.uri. Skipped on handsets that don’t advertise MMS provisioning support.
prlbooleanfalsePush the per-subscriber or system-default PRL to the handset. Skipped on handsets that don’t advertise SSPR support, or when no PRL has been uploaded.

voice-gw.json

cdma-voice-gw SIP/RTP bridge configuration. See the Voice Gateway Setup guide for end-to-end deployment instructions.

grpc

FieldTypeDefaultDescription
listen_addrstring"127.0.0.1:17015"gRPC server address the MSC connects to.

sip

FieldTypeDefaultDescription
listen_addrstring"127.0.0.1:5060"Concrete local IP:port; libre rejects 0.0.0.0 / ::.
transportstring"udp"udp, tcp, or tls.
request_uri_templatestring"sip:{called}@127.0.0.1:5060"Request-URI; {called} is replaced with dialed digits.
from_domainstring"bts.local"Domain placed in the From URI. Must match what the trunk expects.
caller_id_overridestring|nullnullDID (E.164) used as the From user. null → handset MDN.
user_agentstring"1XBTS-VoiceGW/0.1"User-Agent header value.
keepalive_interval_secsinteger0SIP OPTIONS keepalive cadence. Requires registration.enabled=true.
inbound_decision_timeout_msinteger30000Auto-reject inbound INVITEs with 408 if MSC hasn’t decided in this many ms; 0 disables.
auth.usernamestring""SIP digest username.
auth.passwordstring|nullnullInline password — works but never commit it.
auth.password_envstring|nullnullEnv var holding the SIP password. Preferred. Mutually exclusive with auth.password.
registration.enabledbooleanfalseSend REGISTER to the trunk.
registration.registrar_uristring|nullnullRequired when registration.enabled=true.
registration.expires_secsinteger300Registration lifetime; gateway re-registers before expiry.
registration.allow_unauthenticatedbooleanfalseAllow REGISTER without auth.

rtp

FieldTypeDefaultDescription
listen_addrstring"127.0.0.1"IP for RTP bind. Use the LAN IP behind NAT. 0.0.0.0 requires advertise_addr.
port_range[int, int][17100, 17200]UDP port range for RTP sessions.
advertise_addrstring|nullnullPublic IP placed in outgoing SDP. Set when behind NAT without STUN.
preferred_codecsarray["PCMU", "PCMA"]G.711 variants. Must include PCMU or PCMA.
telephone_event_payload_typeinteger|null101Dynamic RTP payload type advertised for RFC 4733 telephone-event (DTMF). Set to null to omit telephone-event from SDP. Required when dtmf_mode = "rfc2833".

nat

FieldTypeDefaultDescription
modestring"disabled""disabled" or "stun_latch".
stun_serverstring|nullnullhost:port. Required when mode = stun_latch.
stun_timeout_msinteger1000STUN binding timeout. Must be > 0 when stun_latch is enabled.
rtp_latch_packetsinteger5Inbound RTP source packets to observe before latching the return path.
rtp_latch_interval_msinteger20Spacing for outgoing latch packets.

calls

FieldTypeDefaultDescription
max_concurrent_callsinteger32Hard cap on active calls. Must be RTP port-range capacity.
setup_timeout_msinteger30000Outbound INVITE→answer timeout.
ringing_timeout_msinteger120000Maximum alerting duration before cancel.
media_idle_timeout_msinteger30000Idle period (no RTP) before tearing down a call.

Media

FieldTypeDefaultDescription
jitter_buffer_msinteger60Adaptive buffer (40–80 ms) for inbound RTP reordering.
dtmf_modestring"rfc2833""rfc2833" to forward DTMF the mobile pressed during a call as RFC 4733 telephone-event RTP packets. "disabled" to drop them.

pdsn.json

Packet data transport configuration.

Top-level

FieldTypeDefaultDescription
packet_grpc_listen_addrstring"127.0.0.1:17021"Packet service gRPC listen address
a10_bearerobjectUDP-encapsulated GRE on 127.0.0.1:17043127.0.0.1:17042A10 bearer transport toward the PCF
a11object127.0.0.1:17045127.0.0.1:17044A11 UDP signaling endpoint toward the PCF
a11_securityobjectrequiredPCF/PDSN A11 security association. The stock JSON includes matching local values; keep PCF and PDSN in sync.
ppp_session_timeout_secsinteger1800Idle lifetime for cached open PPP/LCP/IPCP state across packet traffic-channel changes. Cached sessions reserve the mobile IP until they resume or expire.
events_endpointstringnullAggregated event bus endpoint (e.g. "http://127.0.0.1:17023"). When set, PDSN publishes packet-session bind/unbind events to the bus.

a11_security

FieldTypeDefaultDescription
spiintegerrequiredA11 Security Parameter Index. Must be greater than 255; 0..=255 are reserved by A.S0017.
shared_secret_hexstringrequiredHex-encoded PCF/PDSN shared secret. Must match pcf.json:a11_security.shared_secret_hex.

packet

FieldTypeDefaultDescription
transportstring"tun"Transport mode: "tun", "fou", or "fou_tcp"
fou_remotestringnullFOU or FOU-TCP remote endpoint (host:port)
fou_local_portinteger17011Local FOU receive port
tun_nat_interfacestringnullNetwork interface name for TUN NAT (required when transport="tun")
gateway_ipstring"10.55.0.1"Packet-data gateway IP advertised/used for the mobile /24
primary_dnsstring"10.55.0.1"Primary DNS server supplied through IPCP or Mobile IPv4 registration
secondary_dnsstring"10.55.0.1"Secondary DNS server supplied through IPCP or Mobile IPv4 registration
enable_uplink_vj_compressionbooleanfalseAsk mobiles to use Van Jacobson TCP/IP header compression for traffic sent to the PDSN.
enable_downlink_vj_compressionbooleanfalseAccept mobile requests to use Van Jacobson TCP/IP header compression for traffic sent to the mobile.
mobile_ipobjectsee belowMobile IPv4 registration for phones that open IPCP without requesting a Simple IP address. Omission default is disabled. The checked-in config enables Sprint compatibility.

packet.mobile_ip

FieldTypeDefaultDescription
enabledbooleanfalseEnables Mobile IPv4 registration for handsets that open IPCP without an IP-Address option. Simple IP remains the default when this is false.
fa_addressstring"10.55.0.1"Foreign Agent address advertised to the handset.
home_agent_addressstring"10.55.0.1"Home Agent address returned in local Registration Replies.
advertisement_countinteger3Unsolicited Agent Advertisements sent after IPCP opens in Mobile IPv4 mode.
advertisement_lifetime_secsinteger9000ICMP Router Advertisement lifetime.
registration_lifetime_secsinteger1200Maximum accepted Mobile IPv4 registration lifetime. Must be less than ppp_session_timeout_secs.
auth_modestring"insecure""insecure" accepts unauthenticated requests. "mn_ha" validates the configured MN-HA association.
mn_ha_spiinteger | nullnullMN-HA SPI. Required with auth_mode="mn_ha" and must be greater than 255.
mn_ha_secret_base64string | nullnullNonempty binary MN-HA shared secret encoded as base64. Required with auth_mode="mn_ha".
allow_unverified_mn_aaabooleanfalseAccept MN-AAA without an external AAA check after MN-HA succeeds. Intended only for compatibility with phones that require it.
home_address_poolstringnullOptional home-address pool. null uses the packet /24; custom pools are not yet supported.

Mobile IPv4 is selected only when it is enabled and the peer IPCP request omits the IP-Address option. A peer request containing IP=0.0.0.0 or another IP-Address option follows the normal Simple IP negotiation.

In insecure mode, a phone that asks for authenticated registration returns to Simple IP negotiation. In mn_ha mode, the SPI and secret must match the phone. If the request also includes MN-AAA and allow_unverified_mn_aaa is false, the PDSN tries Simple IP instead.

The checked-in pdsn.json enables mn_ha with compatibility values used by tested legacy Sprint phones. These are not secure, general-purpose credentials. Change them only when the phone is provisioned with matching values.

By default, DNS points phones at the packet gateway resolver. In the compose stack this resolves speed and speed.local.1xbts.org to the local speed test. Simple IP supplies these values through IPCP. Mobile IPv4 supplies them after a successful registration. Set primary_dns and secondary_dns to external resolvers if you do not want gateway-local DNS.

Transport modes:

  • tun — kernel TUN device; packets routed via NAT on tun_nat_interface
  • fou — FOU (Foo-over-UDP) tunnel; direct UDP encapsulation
  • fou_tcp — FOU with TCP relay (for NAT traversal); connects to fou_remote

hlr.json

HLR subscriber database configuration.

FieldTypeDefaultDescription
grpc_listen_addrstring"127.0.0.1:17019"HLR service gRPC listen address
postgres_dsnstring | nullnullPostgreSQL connection string. When unset, HLR runs without persistence. Shipped sample: "postgres://1xbts:1xbts@localhost:45432/1xbts".

smsc.json

SMSC message store configuration.

FieldTypeDefaultDescription
grpc_listen_addrstring"127.0.0.1:17020"SMSC service gRPC listen address
postgres_dsnstring | nullnullPostgreSQL connection string. When unset, SMSC runs without persistence. Shipped sample: "postgres://1xbts:1xbts@localhost:45432/1xbts".

management.json

Management gRPC facade configuration.

FieldTypeDefaultDescription
grpc_listen_addrstring"127.0.0.1:17016"Management gRPC listen address
tokio_consolebooleanfalseEnable Tokio console on port 17018
iq_capture_dirstring"capture-iq-wav"Directory for IQ capture WAV output
mtlsobjectnullmTLS config (see below); omit for plaintext

mtls (optional)

FieldTypeDescription
cert_pathstringPath to PEM-encoded server certificate
key_pathstringPath to PEM-encoded server private key
client_ca_pathstringPath to PEM-encoded CA bundle for client certificate verification

events.json

Aggregated event bus configuration. When this file is present, cdma-nib starts the events.v1.EventService gRPC service. Producers (e.g. PDSN via pdsn.json’s events_endpoint) publish to it; subscribers consume the unified stream via ListenEvents.

FieldTypeDefaultDescription
grpc_listen_addrstringrequiredEvent bus gRPC listen address (e.g. "127.0.0.1:17023")
subscriber_queue_capacityinteger1024Per-subscriber buffered queue size. Subscribers that fall behind beyond this depth are disconnected.

pcf.json

PCF-side packet service client configuration.

FieldTypeDefaultDescription
packet_grpc_endpointstring"http://127.0.0.1:17021"Packet service endpoint consumed by the BSC-facing PCF client
a9_bind_addrstring"127.0.0.1:17046"A9 signaling bind address for HRPD AN Setup-A8 requests
a8_bearerobjectUDP-encapsulated GRE on 127.0.0.1:17041127.0.0.1:17040A8 bearer transport toward the HRPD AN
a10_bearerobjectUDP-encapsulated GRE on 127.0.0.1:17042127.0.0.1:17043A10 bearer transport toward the PDSN
a11object127.0.0.1:17044127.0.0.1:17045A11 UDP signaling endpoint toward the PDSN
a11_securityobjectrequiredPCF/PDSN A11 security association. Must match pdsn.json:a11_security.

a11_security

FieldTypeDefaultDescription
spiintegerrequiredA11 Security Parameter Index. Must be greater than 255; 0..=255 are reserved by A.S0017.
shared_secret_hexstringrequiredHex-encoded PCF/PDSN shared secret. Must match pdsn.json:a11_security.shared_secret_hex.

The checked-in pcf.json and pdsn.json include matching A11 credentials for local operation. Override both sides together with pcf.local.json and pdsn.local.json for a deployment-specific association.


Radio Configs

Radio config files are standalone JSON passed via --radio-config. They are independent of the config/ directory.

Common Fields

FieldTypeDescription
kindstringBackend: "uhd", "lime", "blade_rf", "soapy"
devicestringDevice selector string (empty = first found)
channelintegerRF channel index
tx_antennastringTX antenna port name
tx_gain_dbfloatTX gain in dB
rx_antennastringRX antenna port name
rx_gain_dbfloatRX gain in dB
rx_power_adjfloatRadio-specific dBFS threshold adjustment for reverse-link power control
rx_sample_delayintegerRX timing compensation in samples
rx_batch_pcgsintegerRX batch size in PCGs (default: 2)

TX/RX sample rates and RF bandwidths are not radio-config fields. They are derived from bts.json carrier mode at startup.

UHD (kind: "uhd")

{
"kind": "uhd",
"device": "type=b200,num_recv_frames=1024,num_send_frames=1024",
"channel": 0,
"antenna": "TX/RX",
"tx_gain_db": 65.0,
"rx_antenna": "RX2",
"rx_gain_db": 30.0,
"rx_power_adj": 0.0,
"rx_sample_delay": 50
}

LimeSDR Native (kind: "lime")

{
"kind": "lime",
"device": "",
"channel": 0,
"tx_antenna": "BAND1",
"tx_gain_db": 80,
"rx_antenna": "LNAW",
"rx_gain_db": 50,
"rx_power_adj": 5.0,
"rx_sample_delay": 97
}

rx_sample_delay compensates for LimeSDR hardware timing offset in the receive path.

bladeRF Native (kind: "blade_rf")

{
"kind": "blade_rf",
"device": "",
"channel": 0,
"tx_antenna": "TXA",
"rx_antenna": "A_BALANCED",
"tx_gain_db": 60,
"rx_gain_db": 35,
"rx_reference_dbm": null,
"rx_power_adj": 0.0,
"rx_sample_delay": 82,
"rx_batch_pcgs": 2,
"num_buffers": 16,
"buffer_size": 8192,
"num_transfers": 8,
"stream_timeout_ms": 3500
}
FieldDescription
fpga_pathPath to .rbf FPGA image; null uses libbladeRF host auto-load (~/.config/Nuand/bladeRF/)
rx_reference_dbmOptional RX reference power level in dBm
num_buffersStream buffer count
buffer_sizeSamples per buffer
num_transfersConcurrent USB transfers
stream_timeout_msStream transfer timeout

SoapySDR (kind: "soapy")

{
"kind": "soapy",
"device": "",
"channel": 0,
"antenna": "TX/RX",
"tx_gain_db": 60.0,
"rx_antenna": "RX2",
"rx_gain_db": 50.0,
"rx_sample_delay": 0,
"rx_batch_pcgs": 2
}

Default Ports

PortProtocolOwnerPurpose
5604TCPBTS/BSCAbis signaling
17013TCPMSCA1 signaling listener
17014UDPBTSAbis bearer (BTS side)
17015gRPCVoice gatewayMSC-controlled SIP/RTP bridge
17016gRPCManagement facadeNode-scoped APIs and compatibility APIs
17017gRPCMSC managementCall initiation, call list, SMS
17018TCPTokio consoleOptional async diagnostics
17019gRPCHLR serviceSubscriber and registration persistence
17020gRPCSMSC serviceSMS submission and delivery persistence
17021gRPCPacket servicePacket sessions and packet service RPCs
17022UDPBSCAbis bearer (BSC side)
17023gRPCEvent busAggregated event stream (events.v1.EventService)
17030gRPCHRPD ANEV-DO AN session/air service used by cdma-nib
17031TCPBSC/ANOptional A21 hybrid 1x/HRPD coordination
17040UDP/GREAN A8HRPD A8 bearer endpoint toward PCF
17041UDP/GREPCF A8HRPD/packet A8 bearer endpoint toward AN or 1x radio edge
17042UDP/GREPCF A10A10 bearer endpoint toward PDSN
17043UDP/GREPDSN A10A10 bearer endpoint toward PCF
17044UDPPCF A11A11 signaling endpoint toward PDSN
17045UDPPDSN A11A11 signaling endpoint toward PCF
17046UDPPCF A9A9 signaling endpoint for Setup-A8 requests
17010UDPPDSNFOU remote default
17011UDPPDSNFOU local default
17012TCPFOU-NATFOU-TCP relay (Docker service)
45432TCPPostgreSQLHLR and SMSC (Docker service)