Packet Data Setup
Transport Modes
| Mode | Description | Root Required |
|---|---|---|
| FOU | Foo-over-UDP tunnel to remote Linux box | No (on 1xBTS side) |
| FOU-TCP | FOU payloads carried through the TCP relay path | No (on 1xBTS side) |
| TUN | Kernel TUN device on the PDSN/runtime host | Yes |
FOU is recommended — offloads IP routing and NAT to a separate machine.
PDSN Configuration
FOU (Recommended)
In config/pdsn.local.json:
{ "packet": { "transport": "fou", "fou_remote": "192.168.1.100:17010", "fou_local_port": 17011 } }| Field | Description |
|---|---|
transport | "fou" for FOU tunneling |
fou_remote | Remote Linux FOU endpoint (IP:port) |
fou_local_port | Local 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.
| Mode | What it does | Capability |
|---|---|---|
| UDP-encapsulated GRE (default) | Carries each GRE packet inside a UDP datagram | None |
| Native GRE | Standards-native GRE as IP protocol 47, no UDP wrapper | CAP_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_RAWWithout 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):
sudo modprobe fousudo ip fou add port 17010 ipproto 4sudo ip link add fou0 type ipip \ remote <pdsn_ip> local <linux_ip> \ encap fou encap-dport 17011 encap-sport 17010sudo ip addr add 10.55.0.1/24 dev fou0sudo ip link set fou0 upsudo sysctl -w net.ipv4.ip_forward=1sudo iptables -t nat -A POSTROUTING -s 10.55.0.0/24 -o eth0 -j MASQUERADEVerify
sudo ip fou showip addr show fou0sudo tcpdump -i fou0 -nsudo iptables -t nat -L -n -v | grep 10.55.0Teardown
sudo ip link del fou0sudo ip fou del port 17010sudo iptables -t nat -D POSTROUTING -s 10.55.0.0/24 -o eth0 -j MASQUERADEIP Pool
| Parameter | Default |
|---|---|
| Subnet | 10.55.0.0/24 |
| Gateway | 10.55.0.1 |
| Mobile pool | 10.55.0.2 – 10.55.0.254 (253 addresses) |
| Primary DNS | 10.55.0.1 |
| Secondary DNS | 10.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
| Config | Forward Channel | RLP Payload Capacity |
|---|---|---|
| SO7 / RC1 | 9.6 kbps FCH | ~6-7 kbps effective IP |
| SO33 / RC3 | 9.6 kbps FCH | ~6-7 kbps effective IP |
| SO33 / RC3 + F-SCH | 19.2 kbps | 16.0 kbps before PPP/IP overhead |
| SO33 / RC3 + F-SCH | 38.4 kbps | 32.0 kbps before PPP/IP overhead |
| SO33 / RC3 + F-SCH | 76.8 kbps | 64.0 kbps before PPP/IP overhead |
| SO33 / RC3 + F-SCH | 153.6 kbps | 134.4 kbps before PPP/IP overhead |
Troubleshooting
| Symptom | Check |
|---|---|
| No 1x data session | SO7/SO33 in supported service options |
| No EV-DO data session | HRPD session state, PCF A9 listener, matching AN/PCF A8 settings |
| RLP sync fails | Traffic channel assignment, RC compatibility |
| F-SCH not active | enable_f_sch, supported f_sch_rate_bps, and ESCAM acceptance in logs |
| LCP timeout | PPP negotiation in message log |
| No IP assigned | IPCP in dashboard, pool exhaustion |
| Mobile IPv4 returns to Simple IP | MN-HA SPI/secret and allow_unverified_mn_aaa setting |
| An IP address works but names do not | Successful Mobile IPv4 registration and configured DNS addresses |
| No internet | FOU tunnel up, NAT rules, IP forwarding |
| One-way traffic | fou_local_port matches remote encap-dport |
| Packet loss | Firewall rules on FOU UDP path |
| Bearer won’t start (native GRE) | CAP_NET_RAW granted, same bearer mode on both ends |
Related
- IS-95 Web Browsing — built-in Openwave UP.Link gateway that lets a UP.Browser handset browse over its data session.