== Overview

=== About OsmoPCU

OsmoPCU is the Osmocom implementation of the GPRS PCU (Packet Control
Unit) element inside the GPRS network.

The OsmoPCU is co-located within the BTS and connects to OsmoBTS via its
PCU socket interface.

On the other side, OsmoPCU is connected via the Gb interface to the
SGSN.

[[fig-gprs-pcubts]]
.GPRS network architecture with PCU in BTS
[graphviz]
----
digraph G {
	rankdir=LR;
	MS0 [label="MS"]
	MS1 [label="MS"]
	MS0->BTS [label="Um"]
	MS1->BTS [label="Um"]
	BTS->BSC [label="Abis"]
	BSC->MSC [label="A"]
	BTS->PCU [label="pcu_sock"]
	PCU->SGSN [label="Gb"]
	SGSN->GGSN [label="GTP"]
}
----

=== Software Components

OsmoPCU consists of a variety of components, including

* Gb interface (NS/BSSGP protocol)
* `pcu_sock` interface towards OsmoBTS
* TBF management for uplink and downlink TBF
* RLC/MAC protocol implementation
* per-MS context for each MS currently served
* CSN.1 encoding/decoding routines

==== Gb Implementation

OsmoPCU implements the ETSI/3GPP specified Gb interface, including TS
08.16 (NS), TS 08.18 (BSSGP) protocols. As transport layer for NS, it
supports NS/IP (NS encapsulated in UDP/IP).

The actual Gb Implementation is part of the libosmogb library, which is
in turn part of the libosmocore software package.  This allows the same
Gb implementation to be used from OsmoPCU, OsmoGbProxy as well as
OsmoSGSN.

==== `pcu_sock` Interface to OsmoBTS

The interface towards OsmoBTS is called 'pcu_sock' and implemented as a
set of non-standardized primitives over a unix domain socket.  The
default file system path for this socket is `/tmp/pcu_bts`.

The PCU socket can be changed on both OmsoBTS and OsmoPCU to a different
file/path name, primarily to permit running multiple independent BTS+PCU
pairs on a single Linux machine without having to use filesystem
namespaces or other complex configurations.

NOTE: If you change the PCU socket path on OsmoBTS by means of the
`pcu-socket` VTY configuration command, you must ensure to make the
identical change on the OsmoPCU side.
