GPRS / SGSN status update / HOWTO

Harald Welte laforge at
Tue May 18 15:38:35 UTC 2010

Hi all!

Thanks to the support from On-waves, I've been able to focus on my GPRS
work during recent weeks.

Today, I have managed to actually perform successful PDP context activation /
deactivation using a nanoBTS, OpenBSC, OsmoSGSN and OpenGGSN.

This is a big step forward, as it means that the GTP interface between
our SGSN and OpenGGSN is up and running.  The IP addresses allocated
are from a pool defined on the GGSN side, and OpenGGSN opens a tun-device
for it.

Also, the GGSN implementation is much less proof-of-concept now, as it actually
maintains propper MM context, PDP context and other state information.

However, for reasons that I couldn't figure out (despite many hours of
debugging):  There are no user/data plane packets anymore.  This was already
working before I began the GTP / OpenGGSN intergration work 1-2 weeks ago.

The PDP context is established successfully on the LLC-GMM SAPI, the phone
shows that GPRS is up, but then it doesn't actually even send a single
packet (SNDCP, XID exchange, ...) over any of the user data SAPIs.  The
SAPI and NSAPI have been assigned properly, and I could not find any differece
looking at packet traces for both the cases.

If you look at the NS-IP / Gb interface of the nanoBTS, not a single gprs
protocol message arrives after the PDP context is activated.

After a minute or two, the phone then simply disconnects with "Regular
Disconnect" cause, as if nothing had happened.  Putting the phone in front of
an audio amplifier also doesn't reveal any noticable bursts being generated
by the phone.

For now I'm feeling a bit lost and will work on some other stuff before
returning with renewed energy to the SGSN at some later point.

In case you want to try it, the following steps are needed:

1) check out OpenGGSN from git:// (master
   branch), run the usual autoreconf -1 && ./configure && make install

2) check out current OpenBSC master branch and build it.  Only if libgtp
   (installed by OpenGGSN) is found, it will build src/gprs/osmo-sgsn

3) the IP address where 

4) Run OpenBSC like usual, however make sure that the followign settings
   are configured in the openbsc.cfg config file:
  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

   Where the last ip address is the address of the machine where you will
   run OsmoSGSN.  

5) Configure /etc/ggsn.cfg of your GGSN machine.  Check /etc/ggsn.conf
   (example attached) Run 
   $ sudo ./ggsn -l -d

   where that address is the local _listening_ address of the GGSN

6) Then simply fire up osmo-sgsn.  The only relevant config
   setting in osmo_sgsn.cfg is:

   nsip local port 23000

7) start your favorite mobile phone and register it to  your network

You can telnet to osmo-sgsn on port 4245, and type the followign commands
for some interesting information:

	logging enable
	logging filter all 1
	logging level ns info
	logging level bssgp debug
	logging level llc debug
	logging level gprs debug
	logging level mm debug

	show ns
	show bssgp
	show llc
	show mm-context all
	show pdp-context all

Oh, and last, but not least: Wireshark can debug the Gb interface packets
between BTS and SGSN, you simply have to select 'Decode as .... NSIP' on port
23000 packets.  It also decodes the GTP between SGSN and GGSN without any extra

Have fun!
- Harald Welte <laforge at> 
"Privacy in residential applications is a desirable marketing option."
                                                  (ETSI EN 300 175-7 Ch. A6)

More information about the OpenBSC mailing list