95 lines
4.0 KiB

IPA SCCP message flow in the BSC
February, 2013 Holger Hans Peter Freyther
1. SCCP inside the IPA header
2. Supported SCCP message types
3. Receiving SCCP messages
4. Sending SCCP messages
1. SCCP inside the IPA header
Many Soft-MSCs implement something that is called SCCP/lite. This means
that SCCP messages are transported inside a small multiplexing protocol
over TCP/IP. This is an alternative to a full SIGTRAN implementation.
The multiplexing protocol is the same as used with the sysmoBTS and the
ip.access nanoBTS. It is a three byte header with two bytes for the length
in network byte order and one byte for the type. The type to be used for
SCCP is 0xFD.
struct ipa_header {
uint16_t length_in_network_order;
uint8_t type;
} __attribute__((packed));
2. Supported SCCP message types
To implement GSM 08.08 only a subset of SCCP messages need to be implemented.
For transporting paging and reset messages SCCP UDT messages are used. For
the connections with a Mobile Station (MS) a SCCP connection is opened. This
and SCCP IT messages are supported.
3. Receiving SCCP UDT messages
This is an illustration of the flow of messages. The IPA multiplexing protocol
is used for various protocols. This means there is a central place where the
multiplexing stream terminates. The stream is terminated in the osmo_bsc_msc.c
file and the ipaccess_a_fd_cb method. For SCCP messages the SCCP dispatching
sccp_system_incoming method is called. This function is implemented in the
libosmo-sccp library.
To receive UDT messages osmo_bsc_sccp.c:osmo_bsc_sccp_init is using the
sccp_set_read function to register a callback for UDT messages. The callback
is msc_sccp_read and it is calling bsc_handle_udt that is implemented in the
osmo_bsc_bssap.c. This function will handle the GSM 08.08 BSSAP messages.
Currently only the reset acknowledge and the paging messages are handled.
The BSC currently does not accept incoming SCCP messages and is only opening
SCCP connections to the MSC. When opening a connection the callbacks for state
changes (connection confirmed, released, release complete) are set and a routine
for handling incoming data. This registration is done in the osmo_bsc_sccp.c
file and the bsc_create_new_connection method. The name of the callback is
msc_outgoing_sccp_data and this will call bsc_handle_dt1 that is implemented
in the osmo_bsc_bssap.c file. This will forward the messages to the right
Mobile Station (MS).
4. Sending SCCP messages
There are three parts to sending that will be explained below. The first part
is to send an entire SCCP frame (which includes the GSM 08.08 data) to the
MSC. This is done by first registering the low level sending. sccp_system_init
is called with the function that is responsible for sending a message. The
msc_sccp_write_ipa will call the msc_queue_write function with the data and
the right MSC connection. Below the msc_queue_write the IPA header will be
prepended to the msg and then send to the MSC.
The BSC supports multiple different A-link connections, the decision to pick
the right MSC is done in this method. It is either done via the SCCP connection
or the ctx pointer.
When the BSC is starting a BSS RESET message will be sent to the MSC. The reset
is created in osmo_bsc_msc.c:initialize_if_needed and sccp_write is called with
the GSM 08.08 data and the connection to use. The libosmo-sccp library will
embed it into a SCCP UDT message and call the msc_sccp_write_ipa method.
When a new SCCP connection is to be created the bsc_create_new_connection
in the osmo_bsc_sccp.c file. The sccp_connection_socket method will create
the context for a SCCP connection. The state and data callback will be used
to be notified about data and changes. Once the connection is configured the
bsc_open_connection will be called that will ask the libosmo-sccp library to
create a SCCP CR message using the sccp_connection_connect method. For active
connections the sccp_connection_write method will be called.