Add WIP code for SCCP User Adaptation (SUA) and SCCP User SAP

The idea of this code is to
* provide a SCCP User SAP as boundary between the User of SCCP
  or SCCP-like transport like SUA
* implement the minimum subset of SUA to transport RANAP messages
  betweene HNB-GW and MSC/SGSN

At this point
* we don't yet implement the proper state machines and timer
* we don't imp[lement the SCCP RESET procedure
* we don't implement AS/ASP management

The code is full of FIXMEs whihc hopefully will get fixed gradually.

After some cleanup + verification, it should move to a library, possibly
either replacing/renaming libomo-sccp, or adding it to libosmo-netif?
diff --git a/sigtran/sccp_sap.h b/sigtran/sccp_sap.h
new file mode 100644
index 0000000..cd55ec2
--- /dev/null
+++ b/sigtran/sccp_sap.h
@@ -0,0 +1,198 @@
+#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>
+
+#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);