Import SUA (SCCP User Adaptation) and SCCP User SAP

... this code originates from the osmo-iuh repository, but is now part
of a new shared libosmo-sigtran.so library generated in this repository.
This commit is contained in:
Harald Welte 2015-12-22 22:22:23 +01:00
parent 46c2945af2
commit bf49cc1c00
17 changed files with 1844 additions and 9 deletions

View File

@ -13,9 +13,11 @@ dnl checks for programs
AC_PROG_MAKE_SET
AC_PROG_CC
AC_PROG_INSTALL
AC_PROG_RANLIB
LT_INIT
AC_PROG_LIBTOOL
PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 0.3.0)
PKG_CHECK_MODULES(LIBOSMONETIF, libosmo-netif >= 0.0.6.1)
# The following test is taken from WebKit's webkit.m4
saved_CFLAGS="$CFLAGS"
@ -33,7 +35,8 @@ AC_OUTPUT(
libosmo-mtp.pc
include/sccp/Makefile
include/mtp/Makefile
include/sigtran/Makefile
include/osmocom/Makefile
include/osmocom/sigtran/Makefile
include/Makefile
src/Makefile
tests/Makefile

View File

@ -1 +1 @@
SUBDIRS = sccp mtp sigtran
SUBDIRS = sccp mtp osmocom

View File

@ -0,0 +1 @@
SUBDIRS = sigtran

View File

@ -0,0 +1,5 @@
sigtran_HEADERS = m3ua_types.h xua_types.h xua_msg.h m2ua_types.h sccp_sap.h sua.h
sigtrandir = $(includedir)/osmocom/sigtran
sigtran_prot_HEADERS = protocol/sua.h
sigtran_protdir = $(includedir)/osmocom/sigtran/protocol

View File

@ -0,0 +1,120 @@
/* RFC 3868 SUA SCCP User Adaption */
/* (C) 2012 by Harald Welte <laforge@gnumonks.org>
*
* All Rights Reserved
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation; either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include <stdint.h>
#define SUA_PPID 4
#define SUA_PORT 14001
/* 3.1.2 Message Classes */
#define SUA_MSGC_MGMT 0
#define SUA_MSGC_SNM 2
#define SUA_MSGC_ASPSM 3
#define SUA_MSGC_ASPTM 4
#define SUA_MSGC_CL 7
#define SUA_MSGC_CO 8
#define SUA_MSGC_RKM 9
/* 3.1.3 Message Types */
#define SUA_MGMT_ERR 0
#define SUA_MGMT_NTFY 1
#define SUA_SNM_DUNA 1
#define SUA_SNM_DAVA 2
#define SUA_SNM_DAUD 3
#define SUA_SNM_SCON 4
#define SUA_SNM_DUPU 5
#define SUA_SNM_DRST 6
#define SUA_ASPSM_UP 1
#define SUA_ASPSM_DOWN 2
#define SUA_ASPSM_BEAT 3
#define SUA_ASPSM_UP_ACK 4
#define SUA_ASPSM_DOWN_ACK 5
#define SUA_ASPSM_BEAT_ACK 6
#define SUA_ASPTM_ACTIVE 1
#define SUA_ASPTM_INACTIVE 2
#define SUA_ASPTM_ACTIVE_ACK 3
#define SUA_ASPTM_INACTIVE_ACK 4
#define SUA_RKM_REG_REQ 1
#define SUA_RKM_REG_RSP 2
#define SUA_RKM_DEREG_REQ 3
#define SUA_RKM_DEREG_RSP 4
#define SUA_CL_CLDT 1
#define SUA_CL_CLDR 2
#define SUA_CO_CORE 1
#define SUA_CO_COAK 2
#define SUA_CO_COREF 3
#define SUA_CO_RELRE 4
#define SUA_CO_RELCO 5
#define SUA_CO_RESCO 6
#define SUA_CO_RESRE 7
#define SUA_CO_CODT 8
#define SUA_CO_CODA 9
#define SUA_CO_COERR 10
#define SUA_CO_COIT 11
#define SUA_IEI_ROUTE_CTX 0x0006
#define SUA_IEI_CORR_ID 0x0013
#define SUA_IEI_REG_RESULT 0x0014
#define SUA_IEI_DEREG_RESULT 0x0015
/* 3.10 SUA specific parameters */
#define SUA_IEI_S7_HOP_CTR 0x0101
#define SUA_IEI_SRC_ADDR 0x0102
#define SUA_IEI_DEST_ADDR 0x0103
#define SUA_IEI_SRC_REF 0x0104
#define SUA_IEI_DEST_REF 0x0105
#define SUA_IEI_CAUSE 0x0106
#define SUA_IEI_SEQ_NR 0x0107
#define SUA_IEI_RX_SEQ_NR 0x0108
#define SUA_IEI_ASP_CAPA 0x0109
#define SUA_IEI_CREDIT 0x010A
#define SUA_IEI_DATA 0x010B
#define SUA_IEI_USER_CAUSE 0x010C
#define SUA_IEI_NET_APPEARANCE 0x010D
#define SUA_IEI_ROUTING_KEY 0x010E
#define SUA_IEI_DRN 0x010F
#define SUA_IEI_TID 0x0110
#define SUA_IEI_SMI 0x0112
#define SUA_IEI_IMPORTANCE 0x0113
#define SUA_IEI_MSG_PRIO 0x0114
#define SUA_IEI_PROTO_CLASS 0x0115
#define SUA_IEI_SEQ_CTRL 0x0116
#define SUA_IEI_SEGMENTATION 0x0117
#define SUA_IEI_CONG_LEVEL 0x0118
#define SUA_IEI_GT 0x8001
#define SUA_IEI_PC 0x8002
#define SUA_IEI_SSN 0x8003
#define SUA_IEI_IPv4 0x8004
#define SUA_IEI_HOST 0x8005
#define SUA_IEI_IPv6 0x8006
#define SUA_RI_GT 1
#define SUA_RI_SSN_PC 2
#define SUA_RI_HOST 3
#define SUA_RI_SSN_IP 4

View File

@ -0,0 +1,199 @@
#pragma once
/* SCCP User SAP description */
/* (C) 2015 by Harald Welte <laforge@gnumonks.org>
* All Rights Reserved
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include <stdint.h>
#include <osmocom/core/prim.h>
#include <netinet/in.h>
/* FIXME: properly define this based on libosmocore */
#define SCCP_SAP_USER 0x2342
/* detailed coding of primitives at the SAP_SCCP_USER */
/*! \brief SCCP-User primitives as per Q.711 */
enum osmo_scu_prim_type {
/* connection oriented, 6.1.1 */
OSMO_SCU_PRIM_N_CONNECT,
OSMO_SCU_PRIM_N_DATA,
OSMO_SCU_PRIM_N_EXPEDITED_DATA,
OSMO_SCU_PRIM_N_DISCONNECT,
OSMO_SCU_PRIM_N_RESET,
OSMO_SCU_PRIM_N_INFORM,
/* connectionless, 6.2.2 */
OSMO_SCU_PRIM_N_UNITDATA,
OSMO_SCU_PRIM_N_NOTICE,
/* management */
OSMO_SCU_PRIM_N_COORD,
OSMO_SCU_PRIM_N_STATE,
OSMO_SCU_PRIM_N_PCSTATE,
};
#define OSMO_SCCP_ADDR_T_GT 0x0001
#define OSMO_SCCP_ADDR_T_PC 0x0002
#define OSMO_SCCP_ADDR_T_SSN 0x0004
#define OSMO_SCCP_ADDR_T_IPv4 0x0008
#define OSMO_SCCP_ADDR_T_IPv6 0x0010
/* Q.713 3.4.1 + RFC 3868 3.10.2.3 */
enum osmo_sccp_routing_ind {
OSMO_SCCP_RI_GT,
OSMO_SCCP_RI_SSN_PC,
OSMO_SCCP_RI_SSN_IP,
};
/* Q.713 3.4.1 + RFC 3868 3.10.2.3 */
enum osmo_sccp_gti {
OSMO_SCCP_GTI_NO_GT,
OSMO_SCCP_GTI_NAI_ONLY,
OSMO_SCCP_GTI_TT_ONLY,
OSMO_SCCP_GTI_TT_NPL_ENC,
OSMO_SCCP_GTI_TT_NPL_ENC_NAI,
};
/* RFC 3868 3.10.2.3 */
enum osmo_sccp_npi {
OSMO_SCCP_NPI_UNKNOWN = 0,
OSMO_SCCP_NPI_E164_ISDN = 1,
OSMO_SCCP_NPI_GEERIC = 2,
OSMO_SCCP_NPI_X121_DATA = 3,
OSMO_SCCP_NPI_F69_TELEX = 4,
OSMO_SCCP_NPI_E210_MARITIME = 5,
OSMO_SCCP_NPI_E212_LAND = 6,
OSMO_SCCP_NPI_E214_ISDN_MOBILE = 7,
OSMO_SCCP_NPI_PRIVATE = 14,
};
/* Q.713 3.4.2.3.1 + RFC 3868 3.10.2.3 */
enum osmo_sccp_nai {
OSMO_SCCP_NAI_UNKNOWN = 0,
OSMO_SCCP_NAI_SUBSCR = 1,
OSMO_SCCP_NAI_RES_NAT_USE = 2,
OSMO_SCCP_NAI_NATL = 3,
OSMO_SCCP_NAI_INTL = 4,
/* 5.. 255: Spare */
};
/* Q.713 3.4.2.2 */
enum osmo_sccp_ssn {
OSMO_SCCP_SSN_MGMT = 1,
OSMO_SCCP_SSN_ISUP = 3,
OSMO_SCCP_SSN_OMAP = 4,
OSMO_SCCP_SSN_MAP = 5,
OSMO_SCCP_SSN_HLR = 6,
OSMO_SCCP_SSN_VLR = 7,
OSMO_SCCP_SSN_MSC = 8,
OSMO_SCCP_SSN_EIR = 9,
OSMO_SCCP_SSN_AUC = 0x0a,
OSMO_SCCP_SSN_ISDN_SS = 0x0b,
OSMO_SCCP_SSN_RES_INTL = 0x0c,
OSMO_SCCP_SSN_BISDN = 0x0d,
OSMO_SCCP_SSN_TC_TEST = 0x0e,
};
struct osmo_sccp_gt {
uint8_t gti;
uint8_t nr_digits;
uint8_t tt;
uint32_t npi;
uint32_t nai;
uint8_t digits[32];
};
struct osmo_sccp_addr {
uint32_t presence;
struct osmo_sccp_gt gt;
uint32_t pc;
uint32_t ssn;
union {
struct in_addr v4;
struct in6_addr v6;
} ip;
/* we don't do hostnames */
};
/* OSMO_SCU_PRIM_N_CONNECT */
struct osmo_scu_connect_param {
struct osmo_sccp_addr called_addr;
struct osmo_sccp_addr calling_addr;
struct osmo_sccp_addr responding_addr;
//struct osmo_sccp_qos_pars qos_pars;
uint32_t sccp_class;
uint32_t importance;
uint32_t conn_id;
/* user data */
};
/* OSMO_SCU_PRIM_N_DATA / OSMO_SCU_PRIM_N_EXPEDITED_DATA */
struct osmo_scu_data_param {
uint32_t conn_id;
uint32_t importance;
/* user data */
};
enum osmo_sccp_originator {
OSMO_SCCP_ORIG_NS_PROVIDER,
OSMO_SCCP_ORIG_NS_USER,
OSMO_SCCP_ORIG_UNDEFINED,
};
/* OSMO_SCU_PRIM_N_DISCONNECT */
struct osmo_scu_disconn_param {
enum osmo_sccp_originator originator;
struct osmo_sccp_addr repsonding_addr;
uint32_t cause;
uint32_t conn_id;
uint32_t importance;
/* user data */
};
/* OSMO_SCU_PRIM_N_RESET */
struct osmo_scu_reset_param {
enum osmo_sccp_originator originator;
uint32_t cause;
uint32_t conn_id;
};
/* OSMO_SCU_PRIM_N_UNITDATA */
struct osmo_scu_unitdata_param {
struct osmo_sccp_addr called_addr;
struct osmo_sccp_addr calling_addr;
uint32_t in_sequence_control;
uint32_t return_option;
uint32_t importance;
/* user data */
};
struct osmo_scu_prim {
struct osmo_prim_hdr oph;
union {
struct osmo_scu_connect_param connect;
struct osmo_scu_data_param data;
struct osmo_scu_disconn_param disconnect;
struct osmo_scu_reset_param reset;
struct osmo_scu_unitdata_param unitdata;
} u;
};
#define msgb_scu_prim(msg) ((struct osmo_scu_prim *)(msg)->l1h)
char *osmo_scu_prim_name(struct osmo_prim_hdr *oph);

View File

@ -0,0 +1,21 @@
#pragma once
#include <stdint.h>
#include <osmocom/core/prim.h>
struct osmo_sua_user;
struct osmo_sua_link;
void osmo_sua_set_log_area(int area);
struct osmo_sua_user *osmo_sua_user_create(void *ctx, osmo_prim_cb prim_cb);
void osmo_sua_user_destroy(struct osmo_sua_user *user);
int osmo_sua_server_listen(struct osmo_sua_user *user, const char *hostname, uint16_t port);
int osmo_sua_client_connect(struct osmo_sua_user *user, const char *hostname, uint16_t port);
struct osmo_sua_link *osmo_sua_client_get_link(struct osmo_sua_user *user);
/* user hands us a SCCP-USER SAP primitive down into the stack */
int osmo_sua_user_link_down(struct osmo_sua_link *link, struct osmo_prim_hdr *oph);

View File

@ -1,2 +0,0 @@
sigtran_HEADERS = m3ua_types.h xua_types.h xua_msg.h m2ua_types.h
sigtrandir = $(includedir)/osmocom/sigtran

View File

@ -1,9 +1,29 @@
AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/include -I$(top_builddir)
AM_CFLAGS=-Wall $(LIBOSMOCORE_CFLAGS)
# Legacy static libs
sccpdir = $(libdir)
sccp_LIBRARIES = libsccp.a libmtp.a libxua.a
libsccp_a_SOURCES = sccp.c
libmtp_a_SOURCES = mtp_pcap.c
libmtp_a_SOURCES = mtp_pcap.c
libxua_a_SOURCES = xua_msg.c
# ensure that the file for the static lib is built with different C
# flags, working around automake complaining that xua_msg.o is built
# both with libtool (below) and without (here)
libxua_a_CPPFLAGS = $(AM_CPPFLAGS) -DDUMMY -UDUMMY
# New shared lib
lib_LTLIBRARIES = libosmo-sigtran.la
# This is _NOT_ the library release version, it's an API version.
# Please read Chapter 6 "Library interface versions" of the libtool
# documentation before making any modification
LIBVERSION=0:0:0
libosmo_sigtran_la_SOURCES = sccp_sap.c sua.c xua_msg.c
libosmo_sigtran_la_LDFLAGS = -version-info $(LIBVERSION) -no-undefined -export-symbols-regex '^osmo_'
libosmo_sigtran_la_LIBADD = $(LIBOSMOCORE_LIBS) $(LIBOSMONETIF_LIBS) $(LIBSCTP_LIBS)

36
src/sccp_sap.c Normal file
View File

@ -0,0 +1,36 @@
#include <string.h>
#include <osmocom/core/utils.h>
#include <osmocom/core/prim.h>
#include <osmocom/sigtran/sccp_sap.h>
const struct value_string osmo_scu_prim_names[] = {
{ OSMO_SCU_PRIM_N_CONNECT, "N-CONNECT" },
{ OSMO_SCU_PRIM_N_DATA, "N-DATA" },
{ OSMO_SCU_PRIM_N_EXPEDITED_DATA, "N-EXPEDITED-DATA" },
{ OSMO_SCU_PRIM_N_DISCONNECT, "N-DISCONNECT" },
{ OSMO_SCU_PRIM_N_RESET, "N-RESET" },
{ OSMO_SCU_PRIM_N_INFORM, "N-INFORM" },
{ OSMO_SCU_PRIM_N_UNITDATA, "N-UNITDATA" },
{ OSMO_SCU_PRIM_N_NOTICE, "N-NOTICE" },
/* management */
{ OSMO_SCU_PRIM_N_COORD, "N-COORD" },
{ OSMO_SCU_PRIM_N_STATE, "N-STATE" },
{ OSMO_SCU_PRIM_N_PCSTATE, "N-PCSATE" },
{ 0, NULL }
};
static char prim_name_buf[128];
char *osmo_scu_prim_name(struct osmo_prim_hdr *oph)
{
const char *name = get_value_string(osmo_scu_prim_names, oph->primitive);
prim_name_buf[0] = '\0';
strncpy(prim_name_buf, name, sizeof(prim_name_buf)-1);
prim_name_buf[sizeof(prim_name_buf)-1] = '\0';
name = get_value_string(osmo_prim_op_names, oph->operation);
strncat(prim_name_buf, name, sizeof(prim_name_buf)-strlen(prim_name_buf)-2);
return prim_name_buf;
}

1432
src/sua.c Normal file

File diff suppressed because it is too large Load Diff

View File

@ -16,7 +16,7 @@
*
*/
#include <sigtran/xua_msg.h>
#include <osmocom/sigtran/xua_msg.h>
#include <osmocom/core/msgb.h>
#include <osmocom/core/logging.h>

View File

@ -15,8 +15,8 @@
*
*/
#include <sigtran/xua_msg.h>
#include <sigtran/m2ua_types.h>
#include <osmocom/sigtran/xua_msg.h>
#include <osmocom/sigtran/m2ua_types.h>
#include <osmocom/core/utils.h>
#include <osmocom/core/msgb.h>