1xBTS 1xBTS

Packet Data Setup

Transport Modes

ModeDescriptionRoot Required
FOUFoo-over-UDP tunnel to remote Linux boxNo (on 1xBTS side)
FOU-TCPFOU payloads carried through the TCP relay pathNo (on 1xBTS side)
TUNKernel TUN device on the PDSN/runtime hostYes

FOU is recommended — offloads IP routing and NAT to a separate machine.

PDSN Configuration

In config/pdsn.local.json:

{ "packet": { "transport": "fou", "fou_remote": "192.168.1.100:17010", "fou_local_port": 17011 } }
FieldDescription
transport"fou" for FOU tunneling
fou_remoteRemote Linux FOU endpoint (IP:port)
fou_local_portLocal UDP port for return traffic

FOU-TCP with Docker Compose

The compose stack includes a fou-nat gateway container and a speedtest container. fou-nat runs the FOU-TCP relay, NAT, Unbound DNS, and an nginx proxy to the speed test.

Mobile packet-data clients can open:

  • http://speed/
  • http://speed.local.1xbts.org/

The default PDSN config gives phones 10.55.0.1 as DNS, whether they use Simple IP or Mobile IPv4, so these names resolve on the packet-data link. Set UNBOUND_FORWARD_ADDRS to choose upstream DNS servers for other domains.

Use docker compose up -d --build after pulling updates so Compose rebuilds images that copy local files, including fou-nat and speedtest.

TUN

In config/pdsn.local.json:

{ "packet": { "transport": "tun" } }

Creates a kernel TUN device per session with automatic IP config and NAT rules. Requires root.

HRPD A8/A10 Bearer Transport (GRE)

EV-DO user traffic moves between the HRPD AN, PCF, and PDSN over GRE bearers: A8 (AN ↔ PCF) and A10 (PCF ↔ PDSN). Each bearer can be carried two ways, set per bearer in config/pcf.local.json and config/pdsn.local.json. The current 1x packet path does not use standards A8/A9; it enters the PCF through the BSC-facing packet client boundary and then shares the same PDSN/IP routing setup.

ModeWhat it doesCapability
UDP-encapsulated GRE (default)Carries each GRE packet inside a UDP datagramNone
Native GREStandards-native GRE as IP protocol 47, no UDP wrapperCAP_NET_RAW

UDP-encapsulated GRE is the default and needs no special privileges, so it works out of the box for a single-host or containerized network. Choose native GRE when you want standards-faithful bearers — for example to interoperate with external packet-core equipment, or to carry the A10 across a real network.

Enable native GRE

Set "mode": "raw_gre" on the bearer in both nodes. The PCF has a8_bearer for the HRPD AN side and a10_bearer for the PDSN side; the PDSN has a10_bearer:

In config/pcf.local.json:

{ "a8_bearer": { "mode": "raw_gre" }, "a10_bearer": { "mode": "raw_gre" } }

In config/pdsn.local.json:

{ "a10_bearer": { "mode": "raw_gre" } }

Both ends of a bearer must use the same mode. In native GRE the bearer IP addresses come from A11 session setup, so no UDP bind or peer ports are needed.

Native GRE opens a raw socket, so the PCF and PDSN processes need the CAP_NET_RAW capability (or root). With Docker Compose, add it to the service:

cap_add:
- NET_RAW

Without the capability the bearer fails to start with an error naming CAP_NET_RAW. Omit mode (or use udp_encapsulated_gre) to keep the default.

This is separate from the PDSN packet transport above: FOU/TUN carries the PDSN’s traffic out to the internet, while the bearer mode controls how the inter-node A8/A10 GRE tunnels themselves are carried.

A9/A11 Endpoints and Security

The default pcf.json and pdsn.json wire the packet core on localhost. In the integrated cdma-nib runtime, enabling EV-DO starts the HRPD AN service, the PCF A9 listener, and the PDSN A11 listener automatically. Split deployments need the AN, PCF, and PDSN A8/A9/A10/A11 addresses to match on both sides.

A11 control signaling between the PCF and PDSN is authenticated with the PCF/PDSN security association. In config/pcf.local.json and config/pdsn.local.json:

{
"a11_security": {
"spi": 256,
"shared_secret_hex": "31786274732d6131312d7368617265642d736563726574"
}
}

Both files must use the same spi and shared_secret_hex. The SPI must be greater than 255; values 0 through 255 are reserved by A.S0017. The stock JSON files include matching values for a single-host setup. If this section is missing or the two files do not match, startup validation fails.

This secret authenticates the A11 PCF/PDSN control association only. It is not derived from IMSI, ESN, MEID, or any subscriber record, and it is not an AT credential. Override it in config/pcf.local.json and config/pdsn.local.json when running outside a local test setup.

FOU Remote Setup

On the Linux box handling IP routing (replace <pdsn_ip> with the PDSN/runtime host IP):

Terminal window
sudo modprobe fou
sudo ip fou add port 17010 ipproto 4
sudo ip link add fou0 type ipip \
remote <pdsn_ip> local <linux_ip> \
encap fou encap-dport 17011 encap-sport 17010
sudo ip addr add 10.55.0.1/24 dev fou0
sudo ip link set fou0 up
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -s 10.55.0.0/24 -o eth0 -j MASQUERADE

Verify

Terminal window
sudo ip fou show
ip addr show fou0
sudo tcpdump -i fou0 -n
sudo iptables -t nat -L -n -v | grep 10.55.0

Teardown

Terminal window
sudo ip link del fou0
sudo ip fou del port 17010
sudo iptables -t nat -D POSTROUTING -s 10.55.0.0/24 -o eth0 -j MASQUERADE

IP Pool

ParameterDefault
Subnet10.55.0.0/24
Gateway10.55.0.1
Mobile pool10.55.0.2 – 10.55.0.254 (253 addresses)
Primary DNS10.55.0.1
Secondary DNS10.55.0.1

Lowest available address assigned per device/session key. Open PPP sessions are cached by IMSI/ESN across packet traffic-channel changes, and the cached session keeps its mobile IP reserved until pdsn.ppp_session_timeout_secs expires. The default timeout is 1800 seconds. Expired cached sessions are reaped periodically and release their reserved IPs.

Override packet.primary_dns and packet.secondary_dns in config/pdsn.local.json if phones should use external DNS directly instead of the gateway resolver. The PDSN sends the same values through Simple IP and Mobile IPv4 setup.

Data Path

1x uplink: Mobile → PPP/HDLC → RLP → MuxPDU → BTS → Abis bearer → BSC → PCF packet client → PDSN PPP/IPCP → FOU/TUN/FOU-TCP → NAT/internet

1x downlink: Internet/NAT → FOU/TUN/FOU-TCP → PDSN → PCF packet client → BSC → Abis bearer → BTS → RLP/MuxPDU → mobile

EV-DO uplink: Access terminal → HRPD reverse traffic channel → AN → A8 → PCF → A10 → PDSN PPP/IPCP → FOU/TUN/FOU-TCP → NAT/internet

EV-DO downlink: Internet/NAT → FOU/TUN/FOU-TCP → PDSN → A10 → PCF → A8 → AN → HRPD forward traffic channel → access terminal

Throughput

ConfigForward ChannelRLP Payload Capacity
SO7 / RC19.6 kbps FCH~6-7 kbps effective IP
SO33 / RC39.6 kbps FCH~6-7 kbps effective IP
SO33 / RC3 + F-SCH19.2 kbps16.0 kbps before PPP/IP overhead
SO33 / RC3 + F-SCH38.4 kbps32.0 kbps before PPP/IP overhead
SO33 / RC3 + F-SCH76.8 kbps64.0 kbps before PPP/IP overhead
SO33 / RC3 + F-SCH153.6 kbps134.4 kbps before PPP/IP overhead

Troubleshooting

SymptomCheck
No 1x data sessionSO7/SO33 in supported service options
No EV-DO data sessionHRPD session state, PCF A9 listener, matching AN/PCF A8 settings
RLP sync failsTraffic channel assignment, RC compatibility
F-SCH not activeenable_f_sch, supported f_sch_rate_bps, and ESCAM acceptance in logs
LCP timeoutPPP negotiation in message log
No IP assignedIPCP in dashboard, pool exhaustion
Mobile IPv4 returns to Simple IPMN-HA SPI/secret and allow_unverified_mn_aaa setting
An IP address works but names do notSuccessful Mobile IPv4 registration and configured DNS addresses
No internetFOU tunnel up, NAT rules, IP forwarding
One-way trafficfou_local_port matches remote encap-dport
Packet lossFirewall rules on FOU UDP path
Bearer won’t start (native GRE)CAP_NET_RAW granted, same bearer mode on both ends
  • IS-95 Web Browsing — built-in Openwave UP.Link gateway that lets a UP.Browser handset browse over its data session.