Change in libosmocore[master]: GSUP: add inter-MSC handover related msgs and IEs

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

osmith gerrit-no-reply at lists.osmocom.org
Fri Feb 8 10:55:26 UTC 2019


osmith has uploaded this change for review. ( https://gerrit.osmocom.org/12860


Change subject: GSUP: add inter-MSC handover related msgs and IEs
......................................................................

GSUP: add inter-MSC handover related msgs and IEs

Based on a draft created by Neels, which is the result of reading a MAP
trace of two MSCs negotiating inter-MSC handovers, and of reading the
TS 29.002, TS 29.010 and related specs:
https://lists.osmocom.org/pipermail/openbsc/2019-January/012653.html

I figured out that the "Handover Number" mentioned in the specifications
is the same as the MSISDN IE that we already have, so we can use that
instead of creating a new IE (example usage in tests/gsup/gsup_test.c).

Related: OS#3774
Change-Id: Ic00b0601eacff6d72927cea51767801142ee75db
---
M include/osmocom/gsm/gsup.h
A include/osmocom/gsm/gsup_handover.h
M src/gsm/Makefile.am
M src/gsm/gsup.c
A src/gsm/gsup_handover.c
M src/gsm/libosmogsm.map
M tests/gsup/gsup_test.c
M tests/gsup/gsup_test.err
M tests/gsup/gsup_test.ok
9 files changed, 599 insertions(+), 5 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/60/12860/1

diff --git a/include/osmocom/gsm/gsup.h b/include/osmocom/gsm/gsup.h
index 29ea11a..8cd737b 100644
--- a/include/osmocom/gsm/gsup.h
+++ b/include/osmocom/gsm/gsup.h
@@ -40,9 +40,12 @@
 
 #include <stdint.h>
 #include <osmocom/core/msgb.h>
+#include <osmocom/gsm/gsup_handover.h>
 #include <osmocom/gsm/gsup_sms.h>
 #include <osmocom/gsm/protocol/gsm_23_003.h>
+#include <osmocom/gsm/protocol/gsm_03_40.h>
 #include <osmocom/gsm/protocol/gsm_04_08_gprs.h>
+#include <osmocom/gsm/protocol/gsm_08_08.h>
 #include <osmocom/crypt/auth.h>
 
 #define OSMO_GSUP_PORT 4222
@@ -102,6 +105,14 @@
 	OSMO_GSUP_IMEI_IE			= 0x50,
 	OSMO_GSUP_IMEI_RESULT_IE		= 0x51,
 
+	/* Inter-MSC handover related */
+	OSMO_GSUP_SOURCE_NAME_IE		= 0x60,
+	OSMO_GSUP_DESTINATION_NAME_IE		= 0x61,
+	OSMO_GSUP_AN_APDU_IE			= 0x62,
+	OSMO_GSUP_CAUSE_RR_IE			= 0x63,
+	OSMO_GSUP_CAUSE_BSSAP_IE		= 0x64,
+	OSMO_GSUP_CAUSE_SM_IE			= 0x65,
+
 	_OSMO_GSUP_IEI_END_MARKER
 };
 
@@ -163,6 +174,27 @@
 	OSMO_GSUP_MSGT_CHECK_IMEI_REQUEST	= 0b00110000,
 	OSMO_GSUP_MSGT_CHECK_IMEI_ERROR		= 0b00110001,
 	OSMO_GSUP_MSGT_CHECK_IMEI_RESULT	= 0b00110010,
+
+	OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_REQUEST		= 0b001100100,
+	OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_ERROR			= 0b001100101,
+	OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_RESULT		= 0b001100110,
+
+	OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_REQUEST	= 0b001101000,
+	OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_ERROR	= 0b001101001,
+	OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_RESULT	= 0b001101010,
+
+	OSMO_GSUP_MSGT_E_PREPARE_SEND_END_SIGNAL_REQUEST	= 0b001101100,
+	OSMO_GSUP_MSGT_E_PREPARE_SEND_END_SIGNAL_ERROR		= 0b001101101,
+	OSMO_GSUP_MSGT_E_PREPARE_SEND_END_SIGNAL_RESULT		= 0b001101110,
+
+	OSMO_GSUP_MSGT_E_PROCESS_ACCESS_SIGNALLING_REQUEST	= 0b001110000,
+	OSMO_GSUP_MSGT_E_PROCESS_ACCESS_SIGNALLING_ERROR	= 0b001110010,
+
+	OSMO_GSUP_MSGT_E_FORWARD_ACCESS_SIGNALLING_REQUEST	= 0b001110100,
+	OSMO_GSUP_MSGT_E_FORWARD_ACCESS_SIGNALLING_ERROR	= 0b001110110,
+
+	OSMO_GSUP_MSGT_E_CLOSE					= 0b001110111,
+	OSMO_GSUP_MSGT_E_ABORT					= 0b001111011,
 };
 
 #define OSMO_GSUP_IS_MSGT_REQUEST(msgt) (((msgt) & 0b00000011) == 0b00)
@@ -189,6 +221,12 @@
 	OSMO_GSUP_IMEI_RESULT_NACK		= 2, /* on wire: 1 */
 };
 
+/* 3GPP 29.002 AccessNetworkProtocolId */
+enum osmo_gsup_access_network_protocol {
+	OSMO_GSUP_ACCESS_NETWORK_PROTOCOL_TS3G_48006 = 1,
+	OSMO_GSUP_ACCESS_NETWORK_PROTOCOL_TS3G_25413 = 2,
+};
+
 /*! TCAP-like session state */
 enum osmo_gsup_session_state {
 	/*! Undefined session state */
@@ -229,6 +267,12 @@
 	size_t				pdp_charg_enc_len;
 };
 
+struct osmo_gsup_an_apdu {
+	enum osmo_gsup_access_network_protocol access_network_proto;
+	void *data;
+	size_t data_len;
+};
+
 /*! parsed/decoded GSUP protocol message */
 struct osmo_gsup_message {
 	enum osmo_gsup_message_type	message_type;
@@ -286,6 +330,15 @@
 	const uint8_t			*imei_enc;
 	size_t				imei_enc_len;
 	enum osmo_gsup_imei_result	imei_result;
+
+	const uint8_t			*source_name;
+	size_t				source_name_len;
+	const uint8_t			*destination_name;
+	size_t				destination_name_len;
+	struct osmo_gsup_an_apdu	an_apdu;
+	uint8_t				cause_rr;
+	enum gsm0808_cause		cause_bssap;
+	enum gsm48_gsm_cause		cause_sm;
 };
 
 int osmo_gsup_decode(const uint8_t *data, size_t data_len,
diff --git a/include/osmocom/gsm/gsup_handover.h b/include/osmocom/gsm/gsup_handover.h
new file mode 100644
index 0000000..acb6b65
--- /dev/null
+++ b/include/osmocom/gsm/gsup_handover.h
@@ -0,0 +1,21 @@
+#pragma once
+
+/*! \addtogroup gsup
+ *  @{
+ *
+ *  This header defines the handover extensions for Osmocom GSUP (Generic
+ *  Subscriber Update Protocol). The scope of this module is defined by
+ *  3GPP TS 29.002, section 19.2.
+ *
+ *  \file gsup_handover.h
+ *  Handover extensions for Osmocom GSUP. */
+
+#include <stdint.h>
+
+struct osmo_gsup_message;
+struct msgb;
+
+int osmo_gsup_handover_encode_an_apdu(struct msgb *msg, const struct osmo_gsup_message *gsup_msg);
+int osmo_gsup_handover_decode_an_apdu(struct osmo_gsup_message *gsup_msg, uint8_t *data, size_t data_len);
+
+/*! @} */
diff --git a/src/gsm/Makefile.am b/src/gsm/Makefile.am
index 9066500..12d8fa0 100644
--- a/src/gsm/Makefile.am
+++ b/src/gsm/Makefile.am
@@ -30,7 +30,7 @@
 			auth_milenage.c milenage/aes-encblock.c gea.c \
 			milenage/aes-internal.c milenage/aes-internal-enc.c \
 			milenage/milenage.c gan.c ipa.c gsm0341.c apn.c \
-			gsup.c gsup_sms.c gprs_gea.c gsm0503_conv.c oap.c gsm0808_utils.c \
+			gsup.c gsup_handover.c gsup_sms.c gprs_gea.c gsm0503_conv.c oap.c gsm0808_utils.c \
 			gsm23003.c mncc.c bts_features.c oap_client.c \
 			gsm29118.c
 libgsmint_la_LDFLAGS = -no-undefined
diff --git a/src/gsm/gsup.c b/src/gsm/gsup.c
index a089322..1df1f1b 100644
--- a/src/gsm/gsup.c
+++ b/src/gsm/gsup.c
@@ -83,6 +83,27 @@
 	OSMO_VALUE_STRING(OSMO_GSUP_MSGT_CHECK_IMEI_ERROR),
 	OSMO_VALUE_STRING(OSMO_GSUP_MSGT_CHECK_IMEI_RESULT),
 
+	OSMO_VALUE_STRING(OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_REQUEST),
+	OSMO_VALUE_STRING(OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_ERROR),
+	OSMO_VALUE_STRING(OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_RESULT),
+
+	OSMO_VALUE_STRING(OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_REQUEST),
+	OSMO_VALUE_STRING(OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_ERROR),
+	OSMO_VALUE_STRING(OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_RESULT),
+
+	OSMO_VALUE_STRING(OSMO_GSUP_MSGT_E_PREPARE_SEND_END_SIGNAL_REQUEST),
+	OSMO_VALUE_STRING(OSMO_GSUP_MSGT_E_PREPARE_SEND_END_SIGNAL_ERROR),
+	OSMO_VALUE_STRING(OSMO_GSUP_MSGT_E_PREPARE_SEND_END_SIGNAL_RESULT),
+
+	OSMO_VALUE_STRING(OSMO_GSUP_MSGT_E_PROCESS_ACCESS_SIGNALLING_REQUEST),
+	OSMO_VALUE_STRING(OSMO_GSUP_MSGT_E_PROCESS_ACCESS_SIGNALLING_ERROR),
+
+	OSMO_VALUE_STRING(OSMO_GSUP_MSGT_E_FORWARD_ACCESS_SIGNALLING_REQUEST),
+	OSMO_VALUE_STRING(OSMO_GSUP_MSGT_E_FORWARD_ACCESS_SIGNALLING_ERROR),
+
+	OSMO_VALUE_STRING(OSMO_GSUP_MSGT_E_CLOSE),
+	OSMO_VALUE_STRING(OSMO_GSUP_MSGT_E_ABORT),
+
 	{ 0, NULL }
 };
 
@@ -477,6 +498,35 @@
 			gsup_msg->imei_result = osmo_decode_big_endian(value, value_len) + 1;
 			break;
 
+		case OSMO_GSUP_SOURCE_NAME_IE:
+			gsup_msg->source_name = value;
+			gsup_msg->source_name_len = value_len;
+			break;
+
+		case OSMO_GSUP_DESTINATION_NAME_IE:
+			gsup_msg->destination_name = value;
+			gsup_msg->destination_name_len = value_len;
+			break;
+
+		case OSMO_GSUP_AN_APDU_IE:
+			rc = osmo_gsup_handover_decode_an_apdu(gsup_msg, value, value_len);
+			if (rc)
+				return rc;
+			break;
+
+		case OSMO_GSUP_CAUSE_RR_IE:
+			gsup_msg->cause_rr = osmo_decode_big_endian(value, value_len);
+			break;
+
+		case OSMO_GSUP_CAUSE_BSSAP_IE:
+			gsup_msg->cause_bssap = osmo_decode_big_endian(value, value_len);
+			break;
+
+		case OSMO_GSUP_CAUSE_SM_IE:
+			gsup_msg->cause_sm = osmo_decode_big_endian(value, value_len);
+			break;
+
+
 		default:
 			LOGP(DLGSUP, LOGL_NOTICE,
 			     "GSUP IE type %d unknown\n", iei);
@@ -718,6 +768,31 @@
 		msgb_tlv_put(msg, OSMO_GSUP_IMEI_RESULT_IE, sizeof(u8), &u8);
 	}
 
+	if (gsup_msg->source_name)
+		msgb_tlv_put(msg, OSMO_GSUP_SOURCE_NAME_IE, gsup_msg->source_name_len, gsup_msg->source_name);
+
+	if (gsup_msg->destination_name)
+		msgb_tlv_put(msg, OSMO_GSUP_DESTINATION_NAME_IE, gsup_msg->destination_name_len,
+			     gsup_msg->destination_name);
+
+	if (gsup_msg->an_apdu.access_network_proto || gsup_msg->an_apdu.data_len) {
+		rc = osmo_gsup_handover_encode_an_apdu(msg, gsup_msg);
+		if (rc) {
+			LOGP(DLGSUP, LOGL_ERROR, "Failed to encode AN-apdu IE \n");
+			return -EINVAL;
+		}
+	}
+
+	if ((u8 = gsup_msg->cause_rr))
+		msgb_tlv_put(msg, OSMO_GSUP_CAUSE_RR_IE, sizeof(u8), &u8);
+
+	if ((u8 = gsup_msg->cause_bssap))
+		msgb_tlv_put(msg, OSMO_GSUP_CAUSE_BSSAP_IE, sizeof(u8), &u8);
+
+	if ((u8 = gsup_msg->cause_sm))
+		msgb_tlv_put(msg, OSMO_GSUP_CAUSE_SM_IE, sizeof(u8), &u8);
+
+
 	return 0;
 }
 
diff --git a/src/gsm/gsup_handover.c b/src/gsm/gsup_handover.c
new file mode 100644
index 0000000..a9a478f
--- /dev/null
+++ b/src/gsm/gsup_handover.c
@@ -0,0 +1,79 @@
+/*
+ * (C) 2019 by Oliver Smith <osmith at sysmocom.de>
+ *
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 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 General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <stdint.h>
+#include <string.h>
+#include <errno.h>
+
+#include <osmocom/core/logging.h>
+#include <osmocom/core/msgb.h>
+
+#include <osmocom/gsm/gsup.h>
+#include <osmocom/gsm/tlv.h>
+
+/*! \addtogroup gsup
+ *  @{
+ *  \file gsup_handover.c
+ *  Handover extensions for Osmocom GSUP.
+ */
+
+/*! Encode AN-apdu (see 7.6.9.1).
+ * \param[out] msg      target message buffer (caller-allocated)
+ * \param[in]  gsup_msg abstract GSUP message structure
+ * \returns 0 in case of success, negative in case of error
+ */
+int osmo_gsup_handover_encode_an_apdu(struct msgb *msg, const struct osmo_gsup_message *gsup_msg)
+{
+	const struct osmo_gsup_an_apdu an_apdu = gsup_msg->an_apdu;
+
+	/* Tag and total length */
+	msgb_tv_put(msg, OSMO_GSUP_AN_APDU_IE, 1 + an_apdu.data_len);
+
+	/* Put access_network_proto */
+	msgb_v_put(msg, an_apdu.access_network_proto);
+
+	/* Put data */
+	uint8_t* buf = msgb_put(msg, an_apdu.data_len);
+	memcpy(buf, an_apdu.data, an_apdu.data_len);
+
+	return 0;
+}
+
+/*! Decode AN-apdu (see 7.6.9.1).
+ * \param[out] gsup_msg abstract GSUP message structure
+ * \param[in]  data     pointer to the raw IE payload
+ * \param[in]  data_len length of IE pointed by \ref data
+ * \returns 0 in case of success, negative in case of error
+ */
+int osmo_gsup_handover_decode_an_apdu(struct osmo_gsup_message *gsup_msg, uint8_t *data, size_t data_len)
+{
+	if (data_len < 1) {
+		LOGP(DLGSUP, LOGL_ERROR, "Corrupted an_apdu message (length must be >= 1)\n");
+		return -EINVAL;
+	}
+
+	gsup_msg->an_apdu.access_network_proto = data[0];
+	gsup_msg->an_apdu.data_len = data_len -1;
+	gsup_msg->an_apdu.data = data + 1;
+
+	return 0;
+}
+
+/*! @} */
diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map
index ae7c0a1..0c4ebbd 100644
--- a/src/gsm/libosmogsm.map
+++ b/src/gsm/libosmogsm.map
@@ -548,6 +548,9 @@
 osmo_gsup_session_state_names;
 osmo_gsup_get_err_msg_type;
 
+osmo_gsup_handover_encode_an_apdu;
+osmo_gsup_handover_decode_an_apdu;
+
 osmo_gsup_sms_encode_sm_rp_da;
 osmo_gsup_sms_decode_sm_rp_da;
 osmo_gsup_sms_encode_sm_rp_oa;
diff --git a/tests/gsup/gsup_test.c b/tests/gsup/gsup_test.c
index 4ad7431..49981c5 100644
--- a/tests/gsup/gsup_test.c
+++ b/tests/gsup/gsup_test.c
@@ -9,8 +9,14 @@
 
 /* Tests for osmo_gsup_messages.c */
 
+/* Complete IEs used multiple times (sorted alphabetically)
+ * 1st byte: IEI from osmo_gsup_iei, 2nd byte: length */
+#define TEST_AN_APDU_IE 0x62, 0x05, 0x01, 0x42, 0x42, 0x42, 0x42
+#define TEST_DESTINATION_NAME_IE 0x61, 0x05, 'M', 'S', 'C', '-', 'B'
 #define TEST_IMSI_IE 0x01, 0x08, 0x21, 0x43, 0x65, 0x87, 0x09, 0x21, 0x43, 0xf5
 #define TEST_IMSI_STR "123456789012345"
+#define TEST_MSISDN_IE 0x08, 0x07, 0x91, 0x94, 0x61, 0x46, 0x32, 0x24, 0x43
+#define TEST_SOURCE_NAME_IE 0x60, 0x05, 'M', 'S', 'C', '-', 'A'
 
 static void test_gsup_messages_dec_enc(void)
 {
@@ -64,8 +70,7 @@
 	static const uint8_t update_location_res[] = {
 		0x06,
 		TEST_IMSI_IE,
-		0x08, 0x07, /* MSISDN of the subscriber */
-			0x91, 0x94, 0x61, 0x46, 0x32, 0x24, 0x43,
+		TEST_MSISDN_IE,
 		0x09, 0x07, /* HLR-Number of the subscriber */
 			0x91, 0x83, 0x52, 0x38, 0x48, 0x83, 0x93,
 		0x04, 0x00, /* PDP info complete */
@@ -310,6 +315,229 @@
 			0x00, /* OSMO_GSUP_IMEI_RESULT_ACK */
 	};
 
+	/* Handover related test messages. Oftentimes they only differ in the
+	 * AN_APDU_IE, which is mostly a blob in GSUP. To give a better example
+	 * of how the messages can be used, I've added the information an_apdu
+	 * holds in brackets (see osmo-msc.git's doc/interMSC_HO_GSUP_msgs.txt).
+	 * The session states are from the ASCII art in this e-mail:
+	 * https://lists.osmocom.org/pipermail/openbsc/2019-January/012653.html */
+	static const uint8_t send_e_prepare_handover_req [] = {
+		0x64, /* OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_REQUEST */
+		TEST_IMSI_IE,
+		TEST_MSISDN_IE,
+
+		/* Session ID and state (begin) */
+		0x30, 0x04, 0xd3, 0xad, 0xbe, 0xef,
+		0x31, 0x01, 0x01,
+
+		TEST_SOURCE_NAME_IE,
+		TEST_DESTINATION_NAME_IE,
+		TEST_AN_APDU_IE, /* (Handover Request) */
+	};
+
+	static const uint8_t send_e_prepare_handover_err [] = {
+		0x65, /* OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_ERROR */
+		TEST_IMSI_IE,
+
+		/* Session ID and state (continue) */
+		0x30, 0x04, 0xd3, 0xad, 0xbe, 0xef,
+		0x31, 0x01, 0x02,
+
+		TEST_SOURCE_NAME_IE,
+		TEST_DESTINATION_NAME_IE,
+
+		/* cause_bssap */
+		0x64, 0x01,
+			0x51, /* GSM0808_CAUSE_INVALID_MESSAGE_CONTENTS */
+	};
+
+	static const uint8_t send_e_prepare_handover_res [] = {
+		0x66, /* OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_RESULT */
+		TEST_IMSI_IE,
+		TEST_MSISDN_IE,
+
+		/* Session ID and state (continue) */
+		0x30, 0x04, 0xd3, 0xad, 0xbe, 0xef,
+		0x31, 0x01, 0x02,
+
+		TEST_SOURCE_NAME_IE,
+		TEST_DESTINATION_NAME_IE,
+		TEST_AN_APDU_IE, /* (Handover Request Ack) */
+	};
+
+	static const uint8_t send_e_prepare_subsequent_handover_req [] = {
+		0x68, /* OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_REQUEST */
+		TEST_IMSI_IE,
+		TEST_MSISDN_IE,
+
+		/* Session ID and state (begin) */
+		0x30, 0x04, 0xd3, 0xad, 0xbe, 0xef,
+		0x31, 0x01, 0x01,
+
+		TEST_SOURCE_NAME_IE,
+		TEST_DESTINATION_NAME_IE,
+		TEST_AN_APDU_IE, /* (Handover Required) */
+	};
+
+	static const uint8_t send_e_prepare_subsequent_handover_err [] = {
+		0x69, /* OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_ERROR */
+		TEST_IMSI_IE,
+
+		/* Session ID and state (continue) */
+		0x30, 0x04, 0xd3, 0xad, 0xbe, 0xef,
+		0x31, 0x01, 0x02,
+
+		TEST_SOURCE_NAME_IE,
+		TEST_DESTINATION_NAME_IE,
+
+		/* cause_bssap */
+		0x64, 0x01,
+			0x51, /* GSM0808_CAUSE_INVALID_MESSAGE_CONTENTS */
+	};
+
+	static const uint8_t send_e_prepare_subsequent_handover_res [] = {
+		0x6A, /* OSMO_GSUP_MSGT_E_PREPARE_SUBSEQUENT_HANDOVER_RESULT */
+		TEST_IMSI_IE,
+		TEST_MSISDN_IE,
+
+		/* Session ID and state (continue) */
+		0x30, 0x04, 0xd3, 0xad, 0xbe, 0xef,
+		0x31, 0x01, 0x02,
+
+		TEST_SOURCE_NAME_IE,
+		TEST_DESTINATION_NAME_IE,
+		TEST_AN_APDU_IE, /* (Handover Request Ack) */
+	};
+
+	static const uint8_t send_e_prepare_send_end_signal_req [] = {
+		0x6C, /* OSMO_GSUP_MSGT_E_PREPARE_SEND_END_SIGNAL_REQUEST */
+		TEST_IMSI_IE,
+		TEST_MSISDN_IE,
+
+		/* Session ID and state (end) */
+		0x30, 0x04, 0xd3, 0xad, 0xbe, 0xef,
+		0x31, 0x01, 0x03,
+
+		TEST_SOURCE_NAME_IE,
+		TEST_DESTINATION_NAME_IE,
+		TEST_AN_APDU_IE, /* (Handover Complete) */
+	};
+
+	static const uint8_t send_e_prepare_send_end_signal_err [] = {
+		0x6D, /* OSMO_GSUP_MSGT_E_PREPARE_SEND_END_SIGNAL_ERROR */
+		TEST_IMSI_IE,
+
+		/* Session ID and state (continue) */
+		0x30, 0x04, 0xd3, 0xad, 0xbe, 0xef,
+		0x31, 0x01, 0x02,
+
+		TEST_SOURCE_NAME_IE,
+		TEST_DESTINATION_NAME_IE,
+
+		/* cause_bssap */
+		0x64, 0x01,
+			0x51, /* GSM0808_CAUSE_INVALID_MESSAGE_CONTENTS */
+	};
+
+	static const uint8_t send_e_prepare_send_end_signal_res [] = {
+		0x6E, /* OSMO_GSUP_MSGT_E_PREPARE_SEND_END_SIGNAL_RESULT */
+		TEST_IMSI_IE,
+		TEST_MSISDN_IE,
+
+		/* Session ID and state (end) */
+		0x30, 0x04, 0xd3, 0xad, 0xbe, 0xef,
+		0x31, 0x01, 0x03,
+
+		TEST_SOURCE_NAME_IE,
+		TEST_DESTINATION_NAME_IE,
+		TEST_AN_APDU_IE, /* (Handover Complete) */
+	};
+
+	static const uint8_t send_e_process_access_signalling_req [] = {
+		0x70, /* OSMO_GSUP_MSGT_E_PROCESS_ACCESS_SIGNALLING_REQUEST */
+		TEST_IMSI_IE,
+		TEST_MSISDN_IE,
+
+		/* Session ID and state (continue) */
+		0x30, 0x04, 0xd3, 0xad, 0xbe, 0xef,
+		0x31, 0x01, 0x02,
+
+		TEST_SOURCE_NAME_IE,
+		TEST_DESTINATION_NAME_IE,
+		TEST_AN_APDU_IE, /* (Handover Detect) */
+	};
+
+	static const uint8_t send_e_process_access_signalling_err [] = {
+		0x71, /* OSMO_GSUP_MSGT_E_PROCESS_ACCESS_SIGNALLING_ERROR */
+		TEST_IMSI_IE,
+
+		/* Session ID and state (continue) */
+		0x30, 0x04, 0xd3, 0xad, 0xbe, 0xef,
+		0x31, 0x01, 0x02,
+
+		TEST_SOURCE_NAME_IE,
+		TEST_DESTINATION_NAME_IE,
+
+		/* cause_bssap */
+		0x64, 0x01,
+			0x51, /* GSM0808_CAUSE_INVALID_MESSAGE_CONTENTS */
+	};
+
+	static const uint8_t send_e_forward_access_signalling_req [] = {
+		0x74, /* OSMO_GSUP_MSGT_E_FORWARD_ACCESS_SIGNALLING_REQUEST */
+		TEST_IMSI_IE,
+		TEST_MSISDN_IE,
+
+		/* Session ID and state (continue) */
+		0x30, 0x04, 0xd3, 0xad, 0xbe, 0xef,
+		0x31, 0x01, 0x02,
+
+		TEST_SOURCE_NAME_IE,
+		TEST_DESTINATION_NAME_IE,
+		TEST_AN_APDU_IE, /* (DTAP, e.g. CC, SMS, ...) */
+	};
+
+	static const uint8_t send_e_forward_access_signalling_err [] = {
+		0x75, /* OSMO_GSUP_MSGT_E_FORWARD_ACCESS_SIGNALLING_ERROR */
+		TEST_IMSI_IE,
+
+		/* Session ID and state (continue) */
+		0x30, 0x04, 0xd3, 0xad, 0xbe, 0xef,
+		0x31, 0x01, 0x02,
+
+		TEST_SOURCE_NAME_IE,
+		TEST_DESTINATION_NAME_IE,
+
+		/* cause_bssap */
+		0x64, 0x01,
+			0x51, /* GSM0808_CAUSE_INVALID_MESSAGE_CONTENTS */
+	};
+
+	static const uint8_t send_e_close[] = {
+		0x77, /* OSMO_GSUP_MSGT_E_CLOSE */
+		TEST_IMSI_IE,
+
+		/* Session ID and state (end) */
+		0x30, 0x04, 0xd3, 0xad, 0xbe, 0xef,
+		0x31, 0x01, 0x03,
+
+		TEST_SOURCE_NAME_IE,
+		TEST_DESTINATION_NAME_IE,
+	};
+
+	static const uint8_t send_e_abort[] = {
+		0x7B, /* OSMO_GSUP_MSGT_E_ABORT */
+		TEST_IMSI_IE,
+
+		/* Session ID and state (end) */
+		0x30, 0x04, 0xd3, 0xad, 0xbe, 0xef,
+		0x31, 0x01, 0x03,
+
+		/* cause_bssap */
+		0x64, 0x01,
+			0x51, /* GSM0808_CAUSE_INVALID_MESSAGE_CONTENTS */
+	};
+
 	static const struct test {
 		char *name;
 		const uint8_t *data;
@@ -365,6 +593,36 @@
 			send_check_imei_err, sizeof(send_check_imei_err)},
 		{"Check IMEI Result",
 			send_check_imei_res, sizeof(send_check_imei_res)},
+		{"E Prepare Handover Request",
+			send_e_prepare_handover_req, sizeof(send_e_prepare_handover_req)},
+		{"E Prepare Handover Error",
+			send_e_prepare_handover_err, sizeof(send_e_prepare_handover_err)},
+		{"E Prepare Handover Result",
+			send_e_prepare_handover_res, sizeof(send_e_prepare_handover_res)},
+		{"E Prepare Subsequent Handover Request",
+			send_e_prepare_subsequent_handover_req, sizeof(send_e_prepare_subsequent_handover_req)},
+		{"E Prepare Subsequent Handover Error",
+			send_e_prepare_subsequent_handover_err, sizeof(send_e_prepare_subsequent_handover_err)},
+		{"E Prepare Subsequent Handover Result",
+			send_e_prepare_subsequent_handover_res, sizeof(send_e_prepare_subsequent_handover_res)},
+		{"E Prepare Send End Signal Request",
+			send_e_prepare_send_end_signal_req, sizeof(send_e_prepare_send_end_signal_req)},
+		{"E Prepare Send End Signal Error",
+			send_e_prepare_send_end_signal_err, sizeof(send_e_prepare_send_end_signal_err)},
+		{"E Prepare Send End Signal Result",
+			send_e_prepare_send_end_signal_res, sizeof(send_e_prepare_send_end_signal_res)},
+		{"E Process Access Signalling Request",
+			send_e_process_access_signalling_req, sizeof(send_e_process_access_signalling_req)},
+		{"E Process Access Signalling Error",
+			send_e_process_access_signalling_err, sizeof(send_e_process_access_signalling_err)},
+		{"E Forward Access Signalling Request",
+			send_e_forward_access_signalling_req, sizeof(send_e_forward_access_signalling_req)},
+		{"E Forward Access Signalling Error",
+			send_e_forward_access_signalling_err, sizeof(send_e_forward_access_signalling_err)},
+		{"E Close",
+			send_e_close, sizeof(send_e_close)},
+		{"E Abort",
+			send_e_abort, sizeof(send_e_abort)},
 	};
 
 	printf("Test GSUP message decoding/encoding\n");
diff --git a/tests/gsup/gsup_test.err b/tests/gsup/gsup_test.err
index 225735e..0adb538 100644
--- a/tests/gsup/gsup_test.err
+++ b/tests/gsup/gsup_test.err
@@ -73,6 +73,51 @@
   generated message: 32 01 08 21 43 65 87 09 21 43 f5 51 01 00 
   original message:  32 01 08 21 43 65 87 09 21 43 f5 51 01 00 
   IMSI:              123456789012345
+  generated message: 64 01 08 21 43 65 87 09 21 43 f5 08 07 91 94 61 46 32 24 43 30 04 d3 ad be ef 31 01 01 60 05 4d 53 43 2d 41 61 05 4d 53 43 2d 42 62 05 01 42 42 42 42 
+  original message:  64 01 08 21 43 65 87 09 21 43 f5 08 07 91 94 61 46 32 24 43 30 04 d3 ad be ef 31 01 01 60 05 4d 53 43 2d 41 61 05 4d 53 43 2d 42 62 05 01 42 42 42 42 
+  IMSI:              123456789012345
+  generated message: 65 01 08 21 43 65 87 09 21 43 f5 30 04 d3 ad be ef 31 01 02 60 05 4d 53 43 2d 41 61 05 4d 53 43 2d 42 64 01 51 
+  original message:  65 01 08 21 43 65 87 09 21 43 f5 30 04 d3 ad be ef 31 01 02 60 05 4d 53 43 2d 41 61 05 4d 53 43 2d 42 64 01 51 
+  IMSI:              123456789012345
+  generated message: 66 01 08 21 43 65 87 09 21 43 f5 08 07 91 94 61 46 32 24 43 30 04 d3 ad be ef 31 01 02 60 05 4d 53 43 2d 41 61 05 4d 53 43 2d 42 62 05 01 42 42 42 42 
+  original message:  66 01 08 21 43 65 87 09 21 43 f5 08 07 91 94 61 46 32 24 43 30 04 d3 ad be ef 31 01 02 60 05 4d 53 43 2d 41 61 05 4d 53 43 2d 42 62 05 01 42 42 42 42 
+  IMSI:              123456789012345
+  generated message: 68 01 08 21 43 65 87 09 21 43 f5 08 07 91 94 61 46 32 24 43 30 04 d3 ad be ef 31 01 01 60 05 4d 53 43 2d 41 61 05 4d 53 43 2d 42 62 05 01 42 42 42 42 
+  original message:  68 01 08 21 43 65 87 09 21 43 f5 08 07 91 94 61 46 32 24 43 30 04 d3 ad be ef 31 01 01 60 05 4d 53 43 2d 41 61 05 4d 53 43 2d 42 62 05 01 42 42 42 42 
+  IMSI:              123456789012345
+  generated message: 69 01 08 21 43 65 87 09 21 43 f5 30 04 d3 ad be ef 31 01 02 60 05 4d 53 43 2d 41 61 05 4d 53 43 2d 42 64 01 51 
+  original message:  69 01 08 21 43 65 87 09 21 43 f5 30 04 d3 ad be ef 31 01 02 60 05 4d 53 43 2d 41 61 05 4d 53 43 2d 42 64 01 51 
+  IMSI:              123456789012345
+  generated message: 6a 01 08 21 43 65 87 09 21 43 f5 08 07 91 94 61 46 32 24 43 30 04 d3 ad be ef 31 01 02 60 05 4d 53 43 2d 41 61 05 4d 53 43 2d 42 62 05 01 42 42 42 42 
+  original message:  6a 01 08 21 43 65 87 09 21 43 f5 08 07 91 94 61 46 32 24 43 30 04 d3 ad be ef 31 01 02 60 05 4d 53 43 2d 41 61 05 4d 53 43 2d 42 62 05 01 42 42 42 42 
+  IMSI:              123456789012345
+  generated message: 6c 01 08 21 43 65 87 09 21 43 f5 08 07 91 94 61 46 32 24 43 30 04 d3 ad be ef 31 01 03 60 05 4d 53 43 2d 41 61 05 4d 53 43 2d 42 62 05 01 42 42 42 42 
+  original message:  6c 01 08 21 43 65 87 09 21 43 f5 08 07 91 94 61 46 32 24 43 30 04 d3 ad be ef 31 01 03 60 05 4d 53 43 2d 41 61 05 4d 53 43 2d 42 62 05 01 42 42 42 42 
+  IMSI:              123456789012345
+  generated message: 6d 01 08 21 43 65 87 09 21 43 f5 30 04 d3 ad be ef 31 01 02 60 05 4d 53 43 2d 41 61 05 4d 53 43 2d 42 64 01 51 
+  original message:  6d 01 08 21 43 65 87 09 21 43 f5 30 04 d3 ad be ef 31 01 02 60 05 4d 53 43 2d 41 61 05 4d 53 43 2d 42 64 01 51 
+  IMSI:              123456789012345
+  generated message: 6e 01 08 21 43 65 87 09 21 43 f5 08 07 91 94 61 46 32 24 43 30 04 d3 ad be ef 31 01 03 60 05 4d 53 43 2d 41 61 05 4d 53 43 2d 42 62 05 01 42 42 42 42 
+  original message:  6e 01 08 21 43 65 87 09 21 43 f5 08 07 91 94 61 46 32 24 43 30 04 d3 ad be ef 31 01 03 60 05 4d 53 43 2d 41 61 05 4d 53 43 2d 42 62 05 01 42 42 42 42 
+  IMSI:              123456789012345
+  generated message: 70 01 08 21 43 65 87 09 21 43 f5 08 07 91 94 61 46 32 24 43 30 04 d3 ad be ef 31 01 02 60 05 4d 53 43 2d 41 61 05 4d 53 43 2d 42 62 05 01 42 42 42 42 
+  original message:  70 01 08 21 43 65 87 09 21 43 f5 08 07 91 94 61 46 32 24 43 30 04 d3 ad be ef 31 01 02 60 05 4d 53 43 2d 41 61 05 4d 53 43 2d 42 62 05 01 42 42 42 42 
+  IMSI:              123456789012345
+  generated message: 71 01 08 21 43 65 87 09 21 43 f5 30 04 d3 ad be ef 31 01 02 60 05 4d 53 43 2d 41 61 05 4d 53 43 2d 42 64 01 51 
+  original message:  71 01 08 21 43 65 87 09 21 43 f5 30 04 d3 ad be ef 31 01 02 60 05 4d 53 43 2d 41 61 05 4d 53 43 2d 42 64 01 51 
+  IMSI:              123456789012345
+  generated message: 74 01 08 21 43 65 87 09 21 43 f5 08 07 91 94 61 46 32 24 43 30 04 d3 ad be ef 31 01 02 60 05 4d 53 43 2d 41 61 05 4d 53 43 2d 42 62 05 01 42 42 42 42 
+  original message:  74 01 08 21 43 65 87 09 21 43 f5 08 07 91 94 61 46 32 24 43 30 04 d3 ad be ef 31 01 02 60 05 4d 53 43 2d 41 61 05 4d 53 43 2d 42 62 05 01 42 42 42 42 
+  IMSI:              123456789012345
+  generated message: 75 01 08 21 43 65 87 09 21 43 f5 30 04 d3 ad be ef 31 01 02 60 05 4d 53 43 2d 41 61 05 4d 53 43 2d 42 64 01 51 
+  original message:  75 01 08 21 43 65 87 09 21 43 f5 30 04 d3 ad be ef 31 01 02 60 05 4d 53 43 2d 41 61 05 4d 53 43 2d 42 64 01 51 
+  IMSI:              123456789012345
+  generated message: 77 01 08 21 43 65 87 09 21 43 f5 30 04 d3 ad be ef 31 01 03 60 05 4d 53 43 2d 41 61 05 4d 53 43 2d 42 
+  original message:  77 01 08 21 43 65 87 09 21 43 f5 30 04 d3 ad be ef 31 01 03 60 05 4d 53 43 2d 41 61 05 4d 53 43 2d 42 
+  IMSI:              123456789012345
+  generated message: 7b 01 08 21 43 65 87 09 21 43 f5 30 04 d3 ad be ef 31 01 03 64 01 51 
+  original message:  7b 01 08 21 43 65 87 09 21 43 f5 30 04 d3 ad be ef 31 01 03 64 01 51 
+  IMSI:              123456789012345
   message 0: tested 11 truncations, 11 parse failures
   message 1: tested 14 truncations, 13 parse failures
   message 2: tested 83 truncations, 81 parse failures
@@ -98,19 +143,34 @@
   message 22: tested 22 truncations, 21 parse failures
   message 23: tested 14 truncations, 13 parse failures
   message 24: tested 14 truncations, 13 parse failures
+  message 25: tested 50 truncations, 44 parse failures
+  message 26: tested 37 truncations, 32 parse failures
+  message 27: tested 50 truncations, 44 parse failures
+  message 28: tested 50 truncations, 44 parse failures
+  message 29: tested 37 truncations, 32 parse failures
+  message 30: tested 50 truncations, 44 parse failures
+  message 31: tested 50 truncations, 44 parse failures
+  message 32: tested 37 truncations, 32 parse failures
+  message 33: tested 50 truncations, 44 parse failures
+  message 34: tested 50 truncations, 44 parse failures
+  message 35: tested 37 truncations, 32 parse failures
+  message 36: tested 50 truncations, 44 parse failures
+  message 37: tested 37 truncations, 32 parse failures
+  message 38: tested 34 truncations, 30 parse failures
+  message 39: tested 23 truncations, 20 parse failures
 DLGSUP Stopping DLGSUP logging
   message 0: tested 2816 modifications, 510 parse failures
   message 1: tested 3584 modifications, 770 parse failures
   message 2: tested 21248 modifications, 2575 parse failures
   message 3: tested 2816 modifications, 510 parse failures
   message 4: tested 3584 modifications, 770 parse failures
-  message 5: tested 20736 modifications, 4022 parse failures
+  message 5: tested 20736 modifications, 4023 parse failures
   message 6: tested 3584 modifications, 771 parse failures
   message 7: tested 3584 modifications, 770 parse failures
   message 8: tested 2816 modifications, 510 parse failures
   message 9: tested 2816 modifications, 510 parse failures
   message 10: tested 3584 modifications, 770 parse failures
-  message 11: tested 3328 modifications, 769 parse failures
+  message 11: tested 3328 modifications, 770 parse failures
   message 12: tested 54016 modifications, 4626 parse failures
   message 13: tested 11520 modifications, 1026 parse failures
   message 14: tested 5120 modifications, 1030 parse failures
@@ -124,3 +184,18 @@
   message 22: tested 5632 modifications, 771 parse failures
   message 23: tested 3584 modifications, 770 parse failures
   message 24: tested 3584 modifications, 771 parse failures
+  message 25: tested 12800 modifications, 2058 parse failures
+  message 26: tested 9472 modifications, 1804 parse failures
+  message 27: tested 12800 modifications, 2058 parse failures
+  message 28: tested 12800 modifications, 2058 parse failures
+  message 29: tested 9472 modifications, 1804 parse failures
+  message 30: tested 12800 modifications, 2058 parse failures
+  message 31: tested 12800 modifications, 2058 parse failures
+  message 32: tested 9472 modifications, 1804 parse failures
+  message 33: tested 12800 modifications, 2058 parse failures
+  message 34: tested 12800 modifications, 2058 parse failures
+  message 35: tested 9472 modifications, 1804 parse failures
+  message 36: tested 12800 modifications, 2058 parse failures
+  message 37: tested 9472 modifications, 1804 parse failures
+  message 38: tested 8704 modifications, 1547 parse failures
+  message 39: tested 5888 modifications, 1288 parse failures
diff --git a/tests/gsup/gsup_test.ok b/tests/gsup/gsup_test.ok
index 70f723c..74ca028 100644
--- a/tests/gsup/gsup_test.ok
+++ b/tests/gsup/gsup_test.ok
@@ -49,4 +49,34 @@
           Check IMEI Error OK
   Testing Check IMEI Result
           Check IMEI Result OK
+  Testing E Prepare Handover Request
+          E Prepare Handover Request OK
+  Testing E Prepare Handover Error
+          E Prepare Handover Error OK
+  Testing E Prepare Handover Result
+          E Prepare Handover Result OK
+  Testing E Prepare Subsequent Handover Request
+          E Prepare Subsequent Handover Request OK
+  Testing E Prepare Subsequent Handover Error
+          E Prepare Subsequent Handover Error OK
+  Testing E Prepare Subsequent Handover Result
+          E Prepare Subsequent Handover Result OK
+  Testing E Prepare Send End Signal Request
+          E Prepare Send End Signal Request OK
+  Testing E Prepare Send End Signal Error
+          E Prepare Send End Signal Error OK
+  Testing E Prepare Send End Signal Result
+          E Prepare Send End Signal Result OK
+  Testing E Process Access Signalling Request
+          E Process Access Signalling Request OK
+  Testing E Process Access Signalling Error
+          E Process Access Signalling Error OK
+  Testing E Forward Access Signalling Request
+          E Forward Access Signalling Request OK
+  Testing E Forward Access Signalling Error
+          E Forward Access Signalling Error OK
+  Testing E Close
+          E Close OK
+  Testing E Abort
+          E Abort OK
 Done.

-- 
To view, visit https://gerrit.osmocom.org/12860
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic00b0601eacff6d72927cea51767801142ee75db
Gerrit-Change-Number: 12860
Gerrit-PatchSet: 1
Gerrit-Owner: osmith <osmith at sysmocom.de>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20190208/30e7baad/attachment.htm>


More information about the gerrit-log mailing list