1xBTS 1xBTS

Configuration Reference

Run the integrated runtime with a config directory:

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 env fallback)
--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.


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.

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 lab/loopback work:

  • runtime.tx_freq_hz_override (integer, optional) — force the TX center frequency.
  • Per-radio rx_freq_hz_override (integer, optional) — force the RX center frequency.

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. Selects how the broadcast LTM_OFF and DAYLT fields are resolved at sync-frame build time. When the section is absent or source = "overhead", the static values from overhead.{ltm_off, daylt} are used (legacy behavior). When source = "system" or source = "user", the values are recomputed at runtime from IANA tzdata, so DST transitions are picked up live without a restart. The resolver caches its result for one second to avoid recomputing on every sync frame.

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.

LP_SEC is not driven by this section — it lives on overhead.lp_sec and applies 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_sample_rate_hzinteger4915200TX SDR sample rate (4× chip rate for SR1)
tx_bandwidth_hzinteger3000000TX RF bandwidth in Hz
tx_freq_hz_overrideinteger | nullnullWhen set, overrides the TX center frequency derived from channel. Lab/loopback use only.
tx_lo_offset_hzinteger0TX LO hardware offset in Hz
tx_digital_backofffloat0.15TX amplitude scale factor (0.0–1.0)
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.downlink.pilot

FieldTypeDefaultDescription
walsh_codeinteger0Walsh code for pilot channel (always W0)
gainfloat1.0Pilot channel amplitude gain

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
gainfloat0.6Sync channel amplitude gain
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
gainfloat0.8Paging channel amplitude gain
availability_max_size_bitsinteger96Max bits in paging availability buffer

runtime.downlink.paging.message_defaults

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

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

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, 3]Supported forward radio configurations
supported_rev_rcsarray[1, 3]Supported reverse radio configurations
preferred_pairsarray[{for_rc:3, rev_rc:3}]Preferred forward/reverse RC pairs, tried in order
idle_timeout_sinteger30Traffic channel idle timeout before release
ms_ack_timeout_msinteger5000TCH bringup timeout after the BS Ack Order while waiting for the MS Ack
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 currently a global packet-data setting: every eligible SO33 packet session gets the configured F-SCH rate. Dynamic burstable SCH allocation is planned for future work.

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]Accepted EVRC service options. Shipped msc.json widens this to [3, 17, 68, 73].
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"Only "leave_default" is supported today. The MSC presents the subscriber’s stored SPC (or "000000") during Verify SPC and never changes it 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
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.

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 advertised to mobiles via IPCP
secondary_dnsstring"10.55.0.1"Secondary DNS server advertised to mobiles via IPCP
enable_vj_compression_defaultbooleanfalseAsk mobiles to send Van Jacobson TCP/IP header-compressed PPP packets by default. Peer-requested VJ is accepted independently.
mobile_ipobjectsee belowOptional Mobile IPv4 Foreign Agent registration after IPCP opens without a peer IP address. Disabled by default.

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"Local and/or testing mode that accepts Registration Requests without validating MN-HA or MN-AAA authenticators.
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.

By default, DNS points mobiles at the packet gateway resolver. In the compose stack this resolves speed and speed.local.1xbts.org to the local speed test; 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

Real A8/A9 network transport is still planned work; this gRPC endpoint is the current local service boundary for packet sessions.


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_freq_hz_overrideinteger | nullWhen set, overrides the RX center frequency derived from bts.channel. Lab/loopback use only.
rx_sample_rate_hzintegerRX sample rate (must be 4× chip rate = 4915200 for SR1)
rx_bandwidth_hzintegerRX RF bandwidth in Hz
rx_sample_delayintegerRX timing compensation in samples
rx_batch_pcgsintegerRX batch size in PCGs (default: 2)

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": 50.0,
  "rx_sample_rate_hz": 4915200,
  "rx_bandwidth_hz": 5000000,
  "rx_sample_delay": 50
}

LimeSDR Native (kind: "lime")

{
  "kind": "lime",
  "device": "",
  "channel": 0,
  "tx_antenna": "BAND1",
  "tx_gain_db": 60,
  "rx_antenna": "LNAW",
  "rx_gain_db": 20,
  "rx_sample_rate_hz": 4915200,
  "rx_bandwidth_hz": 5000000,
  "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,
  "fpga_path": null,
  "tx_antenna": "TXA",
  "rx_antenna": "B_BALANCED",
  "tx_gain_db": 50,
  "rx_gain_db": 40,
  "rx_sample_rate_hz": 4915200,
  "rx_bandwidth_hz": 2500000,
  "rx_reference_dbm": null,
  "rx_sample_delay": 0,
  "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_rate_hz": 4915200,
  "rx_bandwidth_hz": 5000000,
  "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)
17010UDPPDSNFOU remote default
17011UDPPDSNFOU local default
17012TCPFOU-NATFOU-TCP relay (Docker service)
45432TCPPostgreSQLHLR and SMSC (Docker service)