libosmo-sigtran  0.10.0
Osmocom SIGTRAN library
sua.c File Reference
#include <stdint.h>
#include <errno.h>
#include <unistd.h>
#include <string.h>
#include <osmocom/core/utils.h>
#include <osmocom/core/linuxlist.h>
#include <osmocom/core/write_queue.h>
#include <osmocom/core/logging.h>
#include <osmocom/core/timer.h>
#include <osmocom/core/socket.h>
#include <osmocom/core/fsm.h>
#include <osmocom/netif/stream.h>
#include <osmocom/sigtran/xua_msg.h>
#include <osmocom/sigtran/sccp_sap.h>
#include <osmocom/sigtran/protocol/mtp.h>
#include <osmocom/sigtran/protocol/sua.h>
#include <osmocom/sigtran/protocol/m3ua.h>
#include <osmocom/sigtran/osmo_ss7.h>
#include "xua_as_fsm.h"
#include "xua_asp_fsm.h"
#include "xua_internal.h"
#include "sccp_internal.h"

Macros

#define CONNECTION_TIMER   ( 1 * 60 * 100)
 
#define TX_INACT_TIMER   ( 7 * 60 * 100) /* RFC 3868 Ch. 8. */
 
#define RX_INACT_TIMER   (15 * 60 * 100) /* RFC 3868 Ch. 8. */
 
#define RELEASE_TIMER   ( 10 * 100)
 
#define RELEASE_REP_TIMER   ( 10 * 100)
 
#define INT_TIMER   ( 1 * 60 * 100)
 
#define GUARD_TIMER   (23 * 60 * 100)
 
#define RESET_TIMER   ( 10 * 100)
 
#define SCCP_MSG_SIZE   2048
 
#define SCCP_MSG_HEADROOM   512
 
#define MAND_IES(msgt, ies)   [msgt] = (ies)
 

Functions

struct msgb * sccp_msgb_alloc (const char *name)
 
static struct xua_msgsua_gen_error (uint32_t err_code)
 
static struct xua_msgsua_gen_error_msg (uint32_t err_code, struct msgb *msg)
 
static struct msgb * sua_to_msg (struct xua_msg *xua)
 
static int sua_tx_xua_asp (struct osmo_ss7_asp *asp, struct xua_msg *xua)
 
int sua_tx_xua_as (struct osmo_ss7_as *as, struct xua_msg *xua)
 Send a given xUA message via a given SUA Application Server. More...
 
int sua_parse_gt (struct osmo_sccp_gt *gt, const uint8_t *data, unsigned int datalen)
 Decode SUA Global Title according to RFC3868 Section 3.10.2.3. More...
 
int sua_addr_parse_part (struct osmo_sccp_addr *out, const struct xua_msg_part *param)
 parse SCCP address from given xUA message part More...
 
int sua_addr_parse (struct osmo_sccp_addr *out, struct xua_msg *xua, uint16_t iei)
 parse SCCP address from given xUA message IE More...
 
static int sua_rx_cl (struct osmo_ss7_asp *asp, struct xua_msg *xua)
 
static int sua_rx_co (struct osmo_ss7_asp *asp, struct xua_msg *xua)
 
static int sua_rx_mgmt_err (struct osmo_ss7_asp *asp, struct xua_msg *xua)
 
static int sua_rx_mgmt_ntfy (struct osmo_ss7_asp *asp, struct xua_msg *xua)
 
static int sua_rx_mgmt (struct osmo_ss7_asp *asp, struct xua_msg *xua)
 
static int sua_rx_asp (struct osmo_ss7_asp *asp, struct xua_msg *xua)
 
int sua_rx_msg (struct osmo_ss7_asp *asp, struct msgb *msg)
 process SUA message received from socket More...
 

Variables

static const struct value_string sua_iei_names []
 
static const uint16_t cldt_mand_ies []
 
static const uint16_t cldr_mand_ies []
 
static const struct value_string sua_cl_msgt_names []
 
static const struct xua_msg_class msg_class_cl
 
static const uint16_t codt_mand_ies []
 
static const uint16_t coda_mand_ies []
 
static const uint16_t core_mand_ies []
 
static const uint16_t coak_mand_ies []
 
static const uint16_t coref_mand_ies []
 
static const uint16_t relre_mand_ies []
 
static const uint16_t relco_mand_ies []
 
static const uint16_t resre_mand_ies []
 
static const uint16_t resco_mand_ies []
 
static const uint16_t coerr_mand_ies []
 
static const uint16_t coit_mand_ies []
 
static const struct value_string sua_co_msgt_names []
 
static const struct xua_msg_class msg_class_co
 
const struct xua_dialect xua_dialect_sua
 
static const struct xua_msg_event_map sua_aspxm_map []
 

Macro Definition Documentation

◆ CONNECTION_TIMER

#define CONNECTION_TIMER   ( 1 * 60 * 100)

◆ GUARD_TIMER

#define GUARD_TIMER   (23 * 60 * 100)

◆ INT_TIMER

#define INT_TIMER   ( 1 * 60 * 100)

◆ MAND_IES

#define MAND_IES (   msgt,
  ies 
)    [msgt] = (ies)

◆ RELEASE_REP_TIMER

#define RELEASE_REP_TIMER   ( 10 * 100)

◆ RELEASE_TIMER

#define RELEASE_TIMER   ( 10 * 100)

◆ RESET_TIMER

#define RESET_TIMER   ( 10 * 100)

◆ RX_INACT_TIMER

#define RX_INACT_TIMER   (15 * 60 * 100) /* RFC 3868 Ch. 8. */

◆ SCCP_MSG_HEADROOM

#define SCCP_MSG_HEADROOM   512

Referenced by sccp_msgb_alloc().

◆ SCCP_MSG_SIZE

#define SCCP_MSG_SIZE   2048

Referenced by sccp_msgb_alloc().

◆ TX_INACT_TIMER

#define TX_INACT_TIMER   ( 7 * 60 * 100) /* RFC 3868 Ch. 8. */

Function Documentation

◆ sccp_msgb_alloc()

struct msgb* sccp_msgb_alloc ( const char *  name)

◆ sua_addr_parse()

int sua_addr_parse ( struct osmo_sccp_addr out,
struct xua_msg xua,
uint16_t  iei 
)

parse SCCP address from given xUA message IE

Parameters
[out]outcaller-allocated decoded SCCP address struct
[in]xuaxUA message
[in]ieiInformation Element Identifier inside xua
Returns
0 on success; negative on error

References sua_addr_parse_part(), and xua_msg_find_tag().

Referenced by gen_ret_msg(), patch_sccp_with_pc(), sccp_find_user(), sccp_scrc_rx_sclc_msg(), sccp_scrc_rx_scoc_conn_msg(), sclc_rx_cldr(), sclc_rx_cldt(), scoc_fsm_idle(), scrc_rx_mtp_xfer_ind_xua(), and scu_gen_encode_and_send().

◆ sua_addr_parse_part()

int sua_addr_parse_part ( struct osmo_sccp_addr out,
const struct xua_msg_part param 
)

◆ sua_gen_error()

static struct xua_msg* sua_gen_error ( uint32_t  err_code)
static

◆ sua_gen_error_msg()

static struct xua_msg* sua_gen_error_msg ( uint32_t  err_code,
struct msgb *  msg 
)
static

◆ sua_parse_gt()

int sua_parse_gt ( struct osmo_sccp_gt gt,
const uint8_t *  data,
unsigned int  datalen 
)

Decode SUA Global Title according to RFC3868 Section 3.10.2.3.

Parameters
[out]gtUser-allocated structure for decoded output
[in]databinary-encoded data
[in]datalenlength of data in octets

References osmo_sccp_gt::digits, osmo_sccp_gt::gti, osmo_sccp_gt::nai, osmo_sccp_gt::npi, and osmo_sccp_gt::tt.

Referenced by sua_addr_parse_part().

◆ sua_rx_asp()

static int sua_rx_asp ( struct osmo_ss7_asp asp,
struct xua_msg xua 
)
static

◆ sua_rx_cl()

◆ sua_rx_co()

◆ sua_rx_mgmt()

static int sua_rx_mgmt ( struct osmo_ss7_asp asp,
struct xua_msg xua 
)
static

◆ sua_rx_mgmt_err()

static int sua_rx_mgmt_err ( struct osmo_ss7_asp asp,
struct xua_msg xua 
)
static

◆ sua_rx_mgmt_ntfy()

◆ sua_rx_msg()

◆ sua_to_msg()

static struct msgb* sua_to_msg ( struct xua_msg xua)
static

◆ sua_tx_xua_as()

int sua_tx_xua_as ( struct osmo_ss7_as as,
struct xua_msg xua 
)

Send a given xUA message via a given SUA Application Server.

Parameters
[in]asApplication Server through which to send xua
[in]xuaxUA message to be sent
Returns
0 on success; negative on error

References osmo_ss7_as::cfg, osmo_ss7_routing_key::context, osmo_ss7_as::fi, OSMO_SS7_ASP_PROT_SUA, osmo_ss7_as::proto, osmo_ss7_as::routing_key, SUA_IEI_ROUTE_CTX, sua_to_msg(), XUA_AS_E_TRANSFER_REQ, and xua_msg_add_u32().

Referenced by gen_mtp_transfer_req_xua().

◆ sua_tx_xua_asp()

static int sua_tx_xua_asp ( struct osmo_ss7_asp asp,
struct xua_msg xua 
)
static

Variable Documentation

◆ cldr_mand_ies

const uint16_t cldr_mand_ies[]
static
Initial value:
= {
}
#define SUA_IEI_ROUTE_CTX
Definition: sua.h:83
#define SUA_IEI_SRC_ADDR
Definition: sua.h:98
#define SUA_IEI_DEST_ADDR
Definition: sua.h:99
#define SUA_IEI_CAUSE
Definition: sua.h:102

◆ cldt_mand_ies

const uint16_t cldt_mand_ies[]
static
Initial value:
= {
}
#define SUA_IEI_ROUTE_CTX
Definition: sua.h:83
#define SUA_IEI_SRC_ADDR
Definition: sua.h:98
#define SUA_IEI_DATA
Definition: sua.h:107
#define SUA_IEI_PROTO_CLASS
Definition: sua.h:116
#define SUA_IEI_DEST_ADDR
Definition: sua.h:99
#define SUA_IEI_SEQ_CTRL
Definition: sua.h:117

◆ coak_mand_ies

const uint16_t coak_mand_ies[]
static
Initial value:
= {
}
#define SUA_IEI_ROUTE_CTX
Definition: sua.h:83
#define SUA_IEI_SRC_REF
Definition: sua.h:100
#define SUA_IEI_PROTO_CLASS
Definition: sua.h:116
#define SUA_IEI_DEST_REF
Definition: sua.h:101
#define SUA_IEI_SEQ_CTRL
Definition: sua.h:117

◆ coda_mand_ies

const uint16_t coda_mand_ies[]
static
Initial value:
= {
}
#define SUA_IEI_ROUTE_CTX
Definition: sua.h:83
#define SUA_IEI_DEST_REF
Definition: sua.h:101

◆ codt_mand_ies

const uint16_t codt_mand_ies[]
static
Initial value:
= {
}
#define SUA_IEI_ROUTE_CTX
Definition: sua.h:83
#define SUA_IEI_DATA
Definition: sua.h:107
#define SUA_IEI_DEST_REF
Definition: sua.h:101

◆ coerr_mand_ies

const uint16_t coerr_mand_ies[]
static
Initial value:
= {
}
#define SUA_IEI_ROUTE_CTX
Definition: sua.h:83
#define SUA_IEI_DEST_REF
Definition: sua.h:101
#define SUA_IEI_CAUSE
Definition: sua.h:102

◆ coit_mand_ies

const uint16_t coit_mand_ies[]
static
Initial value:
= {
}
#define SUA_IEI_ROUTE_CTX
Definition: sua.h:83
#define SUA_IEI_SRC_REF
Definition: sua.h:100
#define SUA_IEI_PROTO_CLASS
Definition: sua.h:116
#define SUA_IEI_DEST_REF
Definition: sua.h:101

◆ core_mand_ies

const uint16_t core_mand_ies[]
static
Initial value:
= {
}
#define SUA_IEI_ROUTE_CTX
Definition: sua.h:83
#define SUA_IEI_SRC_REF
Definition: sua.h:100
#define SUA_IEI_PROTO_CLASS
Definition: sua.h:116
#define SUA_IEI_DEST_ADDR
Definition: sua.h:99
#define SUA_IEI_SEQ_CTRL
Definition: sua.h:117

◆ coref_mand_ies

const uint16_t coref_mand_ies[]
static
Initial value:
= {
}
#define SUA_IEI_ROUTE_CTX
Definition: sua.h:83
#define SUA_IEI_DEST_REF
Definition: sua.h:101
#define SUA_IEI_CAUSE
Definition: sua.h:102

◆ msg_class_cl

const struct xua_msg_class msg_class_cl
static
Initial value:
= {
.name = "CL",
.msgt_names = sua_cl_msgt_names,
.iei_names = sua_iei_names,
.mand_ies = {
},
}
#define SUA_CL_CLDR
Definition: sua.h:68
static const struct value_string sua_cl_msgt_names[]
Definition: sua.c:129
static const uint16_t cldt_mand_ies[]
Definition: sua.c:121
#define MAND_IES(msgt, ies)
Definition: sua.c:119
static const struct value_string sua_iei_names[]
Definition: sua.c:80
static const uint16_t cldr_mand_ies[]
Definition: sua.c:125
#define SUA_CL_CLDT
Definition: sua.h:67

◆ msg_class_co

const struct xua_msg_class msg_class_co
static
Initial value:
= {
.name = "CO",
.msgt_names = sua_co_msgt_names,
.iei_names = sua_iei_names,
.mand_ies = {
},
}
static const uint16_t coref_mand_ies[]
Definition: sua.c:158
#define SUA_CO_RELCO
Definition: sua.h:74
#define SUA_CO_CODT
Definition: sua.h:77
#define SUA_CO_RESCO
Definition: sua.h:75
static const uint16_t resco_mand_ies[]
Definition: sua.c:172
#define SUA_CO_RESRE
Definition: sua.h:76
static const uint16_t core_mand_ies[]
Definition: sua.c:150
#define SUA_CO_COREF
Definition: sua.h:72
static const uint16_t resre_mand_ies[]
Definition: sua.c:168
#define SUA_CO_RELRE
Definition: sua.h:73
#define SUA_CO_CODA
Definition: sua.h:78
static const uint16_t codt_mand_ies[]
Definition: sua.c:144
static const uint16_t relre_mand_ies[]
Definition: sua.c:161
#define MAND_IES(msgt, ies)
Definition: sua.c:119
#define SUA_CO_COAK
Definition: sua.h:71
static const struct value_string sua_iei_names[]
Definition: sua.c:80
static const struct value_string sua_co_msgt_names[]
Definition: sua.c:182
static const uint16_t coak_mand_ies[]
Definition: sua.c:154
#define SUA_CO_COIT
Definition: sua.h:80
#define SUA_CO_CORE
Definition: sua.h:70
static const uint16_t coerr_mand_ies[]
Definition: sua.c:175
static const uint16_t relco_mand_ies[]
Definition: sua.c:165
static const uint16_t coda_mand_ies[]
Definition: sua.c:147
#define SUA_CO_COERR
Definition: sua.h:79
static const uint16_t coit_mand_ies[]
Definition: sua.c:178

◆ relco_mand_ies

const uint16_t relco_mand_ies[]
static
Initial value:
= {
}
#define SUA_IEI_ROUTE_CTX
Definition: sua.h:83
#define SUA_IEI_SRC_REF
Definition: sua.h:100
#define SUA_IEI_DEST_REF
Definition: sua.h:101

◆ relre_mand_ies

const uint16_t relre_mand_ies[]
static
Initial value:
= {
}
#define SUA_IEI_ROUTE_CTX
Definition: sua.h:83
#define SUA_IEI_SRC_REF
Definition: sua.h:100
#define SUA_IEI_DEST_REF
Definition: sua.h:101
#define SUA_IEI_CAUSE
Definition: sua.h:102

◆ resco_mand_ies

const uint16_t resco_mand_ies[]
static
Initial value:
= {
}
#define SUA_IEI_ROUTE_CTX
Definition: sua.h:83
#define SUA_IEI_SRC_REF
Definition: sua.h:100
#define SUA_IEI_DEST_REF
Definition: sua.h:101

◆ resre_mand_ies

const uint16_t resre_mand_ies[]
static
Initial value:
= {
}
#define SUA_IEI_ROUTE_CTX
Definition: sua.h:83
#define SUA_IEI_SRC_REF
Definition: sua.h:100
#define SUA_IEI_DEST_REF
Definition: sua.h:101
#define SUA_IEI_CAUSE
Definition: sua.h:102

◆ sua_aspxm_map

const struct xua_msg_event_map sua_aspxm_map[]
static
Initial value:
= {
}
Definition: xua_asp_fsm.h:23
Definition: xua_asp_fsm.h:28
#define SUA_ASPTM_INACTIVE_ACK
Definition: sua.h:60
#define SUA_ASPSM_DOWN
Definition: sua.h:51
#define SUA_ASPSM_BEAT
Definition: sua.h:52
Definition: xua_asp_fsm.h:26
#define SUA_ASPTM_ACTIVE
Definition: sua.h:57
#define SUA_ASPTM_INACTIVE
Definition: sua.h:58
Definition: xua_asp_fsm.h:19
#define SUA_ASPSM_DOWN_ACK
Definition: sua.h:54
#define SUA_ASPSM_BEAT_ACK
Definition: sua.h:55
#define SUA_ASPSM_UP
Definition: sua.h:50
Definition: xua_asp_fsm.h:22
#define SUA_MSGC_ASPTM
Definition: sua.h:34
Definition: xua_asp_fsm.h:24
Definition: xua_asp_fsm.h:25
#define SUA_ASPTM_ACTIVE_ACK
Definition: sua.h:59
#define SUA_ASPSM_UP_ACK
Definition: sua.h:53
#define SUA_MSGC_ASPSM
Definition: sua.h:33
Definition: xua_asp_fsm.h:20
Definition: xua_asp_fsm.h:21
Definition: xua_asp_fsm.h:29

◆ sua_cl_msgt_names

const struct value_string sua_cl_msgt_names[]
static
Initial value:
= {
{ SUA_CL_CLDT, "CLDT" },
{ SUA_CL_CLDR, "CLDR" },
{ 0, NULL }
}
#define SUA_CL_CLDR
Definition: sua.h:68
#define SUA_CL_CLDT
Definition: sua.h:67

◆ sua_co_msgt_names

const struct value_string sua_co_msgt_names[]
static
Initial value:
= {
{ SUA_CO_CODT, "CODT" },
{ SUA_CO_CODA, "CODA" },
{ SUA_CO_CORE, "CORE" },
{ SUA_CO_COAK, "COAK" },
{ SUA_CO_COREF, "COREF" },
{ SUA_CO_RELRE, "RELRE" },
{ SUA_CO_RELCO, "RELCO" },
{ SUA_CO_RESRE, "RESRE" },
{ SUA_CO_RESCO, "RESCO" },
{ SUA_CO_COERR, "COERR" },
{ SUA_CO_COIT, "COIT" },
{ 0, NULL }
}
#define SUA_CO_RELCO
Definition: sua.h:74
#define SUA_CO_CODT
Definition: sua.h:77
#define SUA_CO_RESCO
Definition: sua.h:75
#define SUA_CO_RESRE
Definition: sua.h:76
#define SUA_CO_COREF
Definition: sua.h:72
#define SUA_CO_RELRE
Definition: sua.h:73
#define SUA_CO_CODA
Definition: sua.h:78
#define SUA_CO_COAK
Definition: sua.h:71
#define SUA_CO_COIT
Definition: sua.h:80
#define SUA_CO_CORE
Definition: sua.h:70
#define SUA_CO_COERR
Definition: sua.h:79

◆ sua_iei_names

const struct value_string sua_iei_names[]
static

◆ xua_dialect_sua

const struct xua_dialect xua_dialect_sua
Initial value:
= {
.name = "SUA",
.ppid = SUA_PPID,
.port = SUA_PORT,
.log_subsys = DLSUA,
.class = {
},
}
const struct xua_msg_class m3ua_msg_class_rkm
Definition: m3ua.c:259
const struct xua_msg_class m3ua_msg_class_aspsm
Definition: m3ua.c:198
const struct xua_msg_class m3ua_msg_class_mgmt
Definition: m3ua.c:229
#define SUA_MSGC_CO
Definition: sua.h:36
static const struct xua_msg_class msg_class_cl
Definition: sua.c:134
#define SUA_MSGC_SNM
Definition: sua.h:32
const struct xua_msg_class m3ua_msg_class_asptm
Definition: m3ua.c:211
#define SUA_MSGC_CL
Definition: sua.h:35
#define SUA_MSGC_RKM
Definition: sua.h:37
const struct xua_msg_class m3ua_msg_class_snm
Definition: m3ua.c:175
#define SUA_PORT
Definition: sua.h:28
#define SUA_PPID
Definition: sua.h:27
#define SUA_MSGC_ASPTM
Definition: sua.h:34
static const struct xua_msg_class msg_class_co
Definition: sua.c:196
#define SUA_MSGC_MGMT
Definition: sua.h:31
#define SUA_MSGC_ASPSM
Definition: sua.h:33

Referenced by osmo_sua_to_sccp(), sccp_find_user(), sccp_sclc_rx_from_scrc(), sccp_scoc_rx_from_scrc(), sccp_scoc_rx_inval_opc(), sccp_scoc_rx_inval_src_ref(), sccp_scoc_rx_unass_local_ref(), sccp_scrc_rx_sclc_msg(), sccp_scrc_rx_scoc_conn_msg(), and scrc_rx_mtp_xfer_ind_xua().