OpenBSC GPRS/EDGE Setup page


  • BTS hardware: sysmoBTS, USRP, UmTRX, nanoBTS with GPRS or EDGE support. BS11 are not supported.
  • A compiled GGSN from OpenGGSN
  • A working and up-to-date OpenBSC (see Building_OpenBSC)
    • You will need to (re-)build it after having installed OpenGGSN so that the libgtp is detected and the SGSN binary osmo-sgsn built.
  • A custom SIM for your network (recommended)
    • Depending on your authorization policy (see OsmoSGSN user manual), it may refuse inbound roaming. It is easiest if you have a SIM that matches your custom MCC/MNC network


First a little picture to illustrate the different elements and their interactions :

Compiling OpenBSC with [E]GPRS

The guide below was tested on Ubuntu 15.10 but should work on Debian as well.

First you need to download all dependencies:

apt install libdbi0-dev libdbd-sqlite3 libtool autoconf git-core pkg-config make libortp-dev

Please follow instructions provided at Build from source in order to install these projects:

  • openggsn
  • libosmocore
  • libosmo-abis
  • libosmo-netif
  • openbsc
  • osmo-pcu

OpenBSC configuration

The first step is to configure OpenBSC for gprs support. Add this to the network/bts node in openbsc.cfg:

gprs mode gprs
gprs routing area 0
gprs cell bvci 2
gprs nsei 101
gprs nsvc 0 nsvci 101
gprs nsvc 0 local udp port 23000
gprs nsvc 0 remote udp port 23000
gprs nsvc 0 remote ip

The gprs nsvc 0 remote entries is the IP/port of the machine running the SGSN as seen from the BTS. It will be sent by OpenBSC to the BTS in the configuration phase and the BTS will connect back to the SGSN using that address and port.

The second step is to allocate some timeslots to packet data. For this, just change the 1 or more network/bts/trx/timeslot nodes using :

phys_chan_config PDCH

OsmoSGSN configuration

Here's a sample SGSN configuration file osmo-sgsn.cfg with some explanations :

! Osmocom SGSN configuration
line vty
 no login
 gtp local-ip
 ggsn 0 remote-ip
 ggsn 0 gtp-version 1
 timer tns-block 3
 timer tns-block-retries 3
 timer tns-reset 3
 timer tns-reset-retries 3
 timer tns-test 30
 timer tns-alive 3
 timer tns-alive-retries 10
 encapsulation udp local-ip
 encapsulation udp local-port 23000
 encapsulation framerelay-gre enabled 0
  • The gtp local-ip entry is the local IP the SGSN will bind to.
  • The ggsn 0 remote-ip entry if the remote IP of the GGSN. The SGSN will connect to it.
  • Those two IPs must be different even if you're running both processes on the same machine. A solution for that is to put several IP aliases on the same network interface or use the loopback interface.
  • The encapsulation settings must be the same IP/port than you've setup in openbsc.cfg. The SGSN will listen to that address and port for connections coming from the BTS.

OpenGGSN configuration

The ggsn.conf file is pretty well documented. What is mostly of interest here is :

  • The configuration of the GTP link. (Must match the ggsn 0 remote-ip entry in osmo-sgsn.cfg)
# TAG: listen
# Specifies the local IP address to listen to
  • The configuration given to phones, IP pool & DNS.
# TAG: dynip
# Dynamic IP address pool.
# Used for allocation of dynamic IP address when address is not given
# by HLR.
# If this option is not given then the net option is used as a substitute.
# dynip

# TAG: pcodns1/pcodns2
# Protocol configuration option domain name system server 1 & 2.

OsmoPCU configuration

 flow-control-interval 10
 cs 2
 alloc-algorithm dynamic
 alpha 0
 gamma 0

Network configuration

You will also need to configure some networking rules to allow connectivity from tun0. Look up linux networking/nat howtos on google.

Modern systems

Add following setting to /etc/systemd/network:





The setup above assume that you're using interface enp2s0 to access the internet from the machine which runs openggsn. Notice the IPMasquerade option on both interfaces. This also assume the default ip address range used by openggsn. If your situation differs - adjust accordingly using as a reference.

Legacy systems

The basic setup for testing only in a safe environment would be :

sh# echo 1 > /proc/sys/net/ipv4/ip_forward
sh# iptables -A POSTROUTING -s -t nat -o enp2s0 -j MASQUERADE

(replace enp2s0 by the interface connected to the gateway which provides your machine connectivity)

DNS issues

In some cases the DNS server might be hardcoded in the phones APN settings. To work around this problem one might choose to enforce the usage of a specific DNS server by redirecting all DNS traffic via iptables:

sh# iptables -t nat -I PREROUTING -i tun0 -p udp --dport 53 -j DNAT --to-dest

(replace with the ip-address of your DNS-Server)

You can put this into .sh file and reference it from openggsn config using

ipup /full/path/to/


Sample startup sequence (adjust logging and configuration files location as you see fit):

osmo-nitb -s -c ~/.config/osmocom/open-bsc.cfg -l ~/.config/osmocom/hlr.sqlite3 -P -m -C -T --debug=DSQL:DLSMS:DRLL:DCC:DMM:DRR:DMSC:DHO:DGPRS:DNS:DLLC:DCTRL 2>&1 | tee /tmp/openbsc.log
sudo ggsn -c ~/.config/osmocom/ggsn.conf -f -d
osmo-sgsn -c ~/.config/osmocom/osmo-sgsn.cfg -d DRLL:DCC:DMM:DRR:DNM:DMSC:DHO:DGPRS:DNS:DLLC:DCTRL

cd osmo-trx/Transceiver52M
sudo chrt 20 ./osmo-trx
cd osmo-bts/src/osmo-bts-trx
sudo chrt 15 ./osmobts-trx -c ~/.config/osmocom/osmo-bts.cfg -i -d DRLL:DCC:DMM:DRR:DNM:DMSC:DHO:DGPRS:DNS:DLLC:DCTRL

sudo ./osmo-pcu -c ~/.config/osmocom/osmo-pcu.cfg

Note: OsmoTRX is only necessary with USRP/UmTRX transceivers (At the time of writing 201509-fairwaves-rebase branch of OsmoBTS is necessary as well for compatibility).

Once you're done with experimenting and ready for production setup it might be convenient to create systemd units so all the parts are started automatically.

Authorization Policy

Authorization determines whether a particular subscriber can access
your network or not.

The following 4 authorization policy options are available:

  • accept-all: All IMSIs will be accepted.
  • acl-only: Accept only IMSIs, which are explicitly white-listed by the Access Control List (ACL), and the rest will be rejected.
  • closed: Accept only home network subscribers. The combination of MCC and MNC fully identifies subscriber's Home network. The ACL is also heeded.
  • remote: GSUP protocol is used to remotely access a HLR. Only remote subscription data will be used.

Example: Assign or change authorization policy:

OsmoSGSN> enable
OsmoSGSN# configure terminal
OsmoSGSN(config)# sgsn
OsmoSGSN(config-sgsn)# auth-policy acl-only 
OsmoSGSN(config-sgsn)# write
Configuration saved to sgsn.cfg
OsmoSGSN(config-sgsn)# exit
OsmoSGSN(config)# exit
OsmoSGSN# disable

In the example acl-only is selected as authorization policy.
After this we are saving current changes to configuration file using command write to make this policy persistent.


  • double-check that your phones have APN set to something. "Internet" will do for example. The value of APN is not checked but if it's unset the phones' baseband might not even try to initiate GPRS connection.
You can access vty from

enable wireshark dissector for GPRS / GMM messages

In wireshark's default configuration, GMM messages show merely as UDP packets without being decoded.
(port 23000 going between the SGSN and PCU, see Port Numbers)

  • Preferences
  • Protocols
  • Add ,23000 to GPRS NS UDP ports
Quick way but is apparently not saved:
  • Right-click on a UDP port 23000 packet to open the context menu
  • Decode as...

Updated by osmith over 4 years ago · 37 revisions

Add picture from clipboard (Maximum size: 48.8 MB)