| #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_sccp_prim_name(struct osmo_prim_hdr *oph); |