From de46db5f6eaa4003c815f33a35efb4826bda2dc2 Mon Sep 17 00:00:00 2001
From: "javier.morgade@ieee.org" <javier.morgade@ieee.org>
Date: Sun, 8 Sep 2019 21:59:38 +0200
Subject: [PATCH] 	M2AP, M3AP common defs

---
 openair2/M2AP/m2ap_common.c | 124 ++++++++++++++++++++++++
 openair2/M2AP/m2ap_common.h | 180 +++++++++++++++++++++++++++++++++++
 openair3/M3AP/m3ap_common.c | 124 ++++++++++++++++++++++++
 openair3/M3AP/m3ap_common.h | 183 ++++++++++++++++++++++++++++++++++++
 4 files changed, 611 insertions(+)
 create mode 100644 openair2/M2AP/m2ap_common.c
 create mode 100644 openair2/M2AP/m2ap_common.h
 create mode 100644 openair3/M3AP/m3ap_common.c
 create mode 100644 openair3/M3AP/m3ap_common.h

diff --git a/openair2/M2AP/m2ap_common.c b/openair2/M2AP/m2ap_common.c
new file mode 100644
index 00000000000..d288a0a1146
--- /dev/null
+++ b/openair2/M2AP/m2ap_common.c
@@ -0,0 +1,124 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+/*! \file m2ap_common.c
+ * \brief m2ap procedures for both eNB and MCE
+ * \author Javier Morgade  <javier.morgade@ieee.org>
+ * \date 2019
+ * \version 0.1
+ */
+
+#include <stdint.h>
+
+#include "m2ap_common.h"
+#include "M2AP_M2AP-PDU.h"
+
+int asn_debug = 0;
+int asn1_xer_print = 0;
+
+#if defined(EMIT_ASN_DEBUG_EXTERN)
+inline void ASN_DEBUG(const char *fmt, ...)
+{
+  if (asn_debug) {
+    int adi = asn_debug_indent;
+    va_list ap;
+    va_start(ap, fmt);
+    fprintf(stderr, "[ASN1]");
+
+    while(adi--) fprintf(stderr, " ");
+
+    vfprintf(stderr, fmt, ap);
+    fprintf(stderr, "\n");
+    va_end(ap);
+  }
+}
+#endif
+
+ssize_t m2ap_generate_initiating_message(
+  uint8_t               **buffer,
+  uint32_t               *length,
+  M2AP_ProcedureCode_t    procedureCode,
+  M2AP_Criticality_t      criticality,
+  asn_TYPE_descriptor_t  *td,
+  void                   *sptr)
+{
+  M2AP_M2AP_PDU_t pdu;
+  ssize_t    encoded;
+  memset(&pdu, 0, sizeof(M2AP_M2AP_PDU_t));
+  pdu.present = M2AP_M2AP_PDU_PR_initiatingMessage;
+  pdu.choice.initiatingMessage.procedureCode = procedureCode;
+  pdu.choice.initiatingMessage.criticality   = criticality;
+  ANY_fromType_aper((ANY_t *)&pdu.choice.initiatingMessage.value, td, sptr);
+
+  if (asn1_xer_print) {
+    xer_fprint(stdout, &asn_DEF_M2AP_M2AP_PDU, (void *)&pdu);
+  }
+
+  /* We can safely free list of IE from sptr */
+  ASN_STRUCT_FREE_CONTENTS_ONLY(*td, sptr);
+
+  if ((encoded = aper_encode_to_new_buffer(&asn_DEF_M2AP_M2AP_PDU, 0, &pdu,
+                 (void **)buffer)) < 0) {
+    return -1;
+  }
+
+  *length = encoded;
+  return encoded;
+}
+
+
+ssize_t m2ap_generate_unsuccessfull_outcome(
+  uint8_t               **buffer,
+  uint32_t               *length,
+  M2AP_ProcedureCode_t         procedureCode,
+  M2AP_Criticality_t           criticality,
+  asn_TYPE_descriptor_t  *td,
+  void                   *sptr)
+{
+  M2AP_M2AP_PDU_t pdu;
+  ssize_t    encoded;
+  memset(&pdu, 0, sizeof(M2AP_M2AP_PDU_t));
+  pdu.present = M2AP_M2AP_PDU_PR_unsuccessfulOutcome;
+  pdu.choice.successfulOutcome.procedureCode = procedureCode;
+  pdu.choice.successfulOutcome.criticality   = criticality;
+  ANY_fromType_aper((ANY_t *)&pdu.choice.successfulOutcome.value, td, sptr);
+
+  if (asn1_xer_print) {
+    xer_fprint(stdout, &asn_DEF_M2AP_M2AP_PDU, (void *)&pdu);
+  }
+
+  /* We can safely free list of IE from sptr */
+  ASN_STRUCT_FREE_CONTENTS_ONLY(*td, sptr);
+
+  if ((encoded = aper_encode_to_new_buffer(&asn_DEF_M2AP_M2AP_PDU, 0, &pdu,
+                 (void **)buffer)) < 0) {
+    return -1;
+  }
+
+  *length = encoded;
+  return encoded;
+}
+
+void m2ap_handle_criticality(M2AP_Criticality_t criticality)
+{
+
+}
+
diff --git a/openair2/M2AP/m2ap_common.h b/openair2/M2AP/m2ap_common.h
new file mode 100644
index 00000000000..3c8fcbc4623
--- /dev/null
+++ b/openair2/M2AP/m2ap_common.h
@@ -0,0 +1,180 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#if HAVE_CONFIG_H_
+# include "config.h"
+#endif
+
+#include "M2AP_ProtocolIE-Field.h"
+#include "M2AP_M2AP-PDU.h"
+#include "M2AP_InitiatingMessage.h"
+#include "M2AP_SuccessfulOutcome.h"
+#include "M2AP_UnsuccessfulOutcome.h"
+#include "M2AP_ProtocolIE-FieldPair.h"
+#include "M2AP_ProtocolIE-ContainerPair.h"
+#include "M2AP_ProtocolExtensionField.h"
+#include "M2AP_ProtocolExtensionContainer.h"
+#include "M2AP_PMCH-Configuration-Item.h"
+#include "M2AP_asn_constant.h"
+#include "intertask_interface.h"
+
+#include "common/ran_context.h"
+
+#ifndef M2AP_COMMON_H_
+#define M2AP_COMMON_H_
+
+/*! \file m2ap_common.h
+ * \brief m2ap procedures for both eNB and MCE
+ * \author Javier Morgade  <javier.morgade@ieee.org>
+ * \date 2019
+ * \version 0.1
+ */
+
+/** @defgroup _m2ap_impl_ M2AP Layer Reference Implementation
+ * @ingroup _ref_implementation_
+ * @{
+ */
+
+/* Checking version of ASN1C compiler */
+#if (ASN1C_ENVIRONMENT_VERSION < 923)
+# error "You are compiling m2ap with the wrong version of ASN1C"
+#endif
+
+#ifndef M2AP_PORT
+# define M2AP_PORT 36423
+#endif
+
+#ifndef TRUE
+#define TRUE 1
+#define FALSE 0
+#endif
+
+extern int asn1_xer_print;
+
+#if defined(ENB_MODE)
+# include "common/utils/LOG/log.h"
+# include "m2ap_default_values.h"
+# define M2AP_INFO(x, args...) LOG_I(M2AP, x, ##args)
+# define M2AP_ERROR(x, args...) LOG_E(M2AP, x, ##args)
+# define M2AP_WARN(x, args...)  LOG_W(M2AP, x, ##args)
+# define M2AP_DEBUG(x, args...) LOG_D(M2AP, x, ##args)
+#else
+# define M2AP_INFO(x, args...) do { fprintf(stdout, "[M2AP][I]"x, ##args); } while(0)
+# define M2AP_ERROR(x, args...) do { fprintf(stdout, "[M2AP][E]"x, ##args); } while(0)
+# define M2AP_WARN(x, args...)  do { fprintf(stdout, "[M2AP][W]"x, ##args); } while(0)
+# define M2AP_DEBUG(x, args...) do { fprintf(stdout, "[M2AP][D]"x, ##args); } while(0)
+#endif
+
+#define M2AP_FIND_PROTOCOLIE_BY_ID(IE_TYPE, ie, container, IE_ID, mandatory) \
+  do {\
+    IE_TYPE **ptr; \
+    ie = NULL; \
+    for (ptr = container->protocolIEs.list.array; \
+         ptr < &container->protocolIEs.list.array[container->protocolIEs.list.count]; \
+         ptr++) { \
+      if((*ptr)->id == IE_ID) { \
+        ie = *ptr; \
+        break; \
+      } \
+    } \
+    if (mandatory) DevAssert(ie != NULL); \
+  } while(0)
+
+/** \brief Function callback prototype.
+ **/
+typedef int (*m2ap_message_decoded_callback)(
+  instance_t instance,
+  uint32_t assocId,
+  uint32_t stream,
+  M2AP_M2AP_PDU_t *pdu);
+
+typedef int (*m2ap_MCE_message_decoded_callback)(
+  instance_t instance,
+  uint32_t assocId,
+  uint32_t stream,
+  M2AP_M2AP_PDU_t *pdu);
+
+typedef int (*m2ap_eNB_message_decoded_callback)(
+  instance_t instance,
+  uint32_t assocId,
+  uint32_t stream,
+  M2AP_M2AP_PDU_t *pdu);
+
+
+
+/** \brief Encode a successfull outcome message
+ \param buffer pointer to buffer in which data will be encoded
+ \param length pointer to the length of buffer
+ \param procedureCode Procedure code for the message
+ \param criticality Criticality of the message
+ \param td ASN1C type descriptor of the sptr
+ \param sptr Deferenced pointer to the structure to encode
+ @returns size in bytes encded on success or 0 on failure
+ **/
+ssize_t m2ap_generate_successfull_outcome(
+  uint8_t               **buffer,
+  uint32_t               *length,
+  M2AP_ProcedureCode_t         procedureCode,
+  M2AP_Criticality_t           criticality,
+  asn_TYPE_descriptor_t  *td,
+  void                   *sptr);
+
+/** \brief Encode an initiating message
+ \param buffer pointer to buffer in which data will be encoded
+ \param length pointer to the length of buffer
+ \param procedureCode Procedure code for the message
+ \param criticality Criticality of the message
+ \param td ASN1C type descriptor of the sptr
+ \param sptr Deferenced pointer to the structure to encode
+ @returns size in bytes encded on success or 0 on failure
+ **/
+ssize_t m2ap_generate_initiating_message(
+  uint8_t               **buffer,
+  uint32_t               *length,
+  M2AP_ProcedureCode_t    procedureCode,
+  M2AP_Criticality_t      criticality,
+  asn_TYPE_descriptor_t  *td,
+  void                   *sptr);
+
+/** \brief Encode an unsuccessfull outcome message
+ \param buffer pointer to buffer in which data will be encoded
+ \param length pointer to the length of buffer
+ \param procedureCode Procedure code for the message
+ \param criticality Criticality of the message
+ \param td ASN1C type descriptor of the sptr
+ \param sptr Deferenced pointer to the structure to encode
+ @returns size in bytes encded on success or 0 on failure
+ **/
+ssize_t m2ap_generate_unsuccessfull_outcome(
+  uint8_t               **buffer,
+  uint32_t               *length,
+  M2AP_ProcedureCode_t         procedureCode,
+  M2AP_Criticality_t           criticality,
+  asn_TYPE_descriptor_t  *td,
+  void                   *sptr);
+
+/** \brief Handle criticality
+ \param criticality Criticality of the IE
+ @returns void
+ **/
+void m2ap_handle_criticality(M2AP_Criticality_t criticality);
+
+#endif /* M2AP_COMMON_H_ */
diff --git a/openair3/M3AP/m3ap_common.c b/openair3/M3AP/m3ap_common.c
new file mode 100644
index 00000000000..d61ead35802
--- /dev/null
+++ b/openair3/M3AP/m3ap_common.c
@@ -0,0 +1,124 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+/*! \file m3ap_common.c
+ * \brief m3ap procedures for both MCE and MME
+ * \author Javier Morgade  <javier.morgade@ieee.org>
+ * \date 2019
+ * \version 0.1
+ */
+
+#include <stdint.h>
+
+#include "m3ap_common.h"
+#include "M3AP_M3AP-PDU.h"
+
+int asn_debug = 0;
+int asn1_xer_print = 0;
+
+#if defined(EMIT_ASN_DEBUG_EXTERN)
+inline void ASN_DEBUG(const char *fmt, ...)
+{
+  if (asn_debug) {
+    int adi = asn_debug_indent;
+    va_list ap;
+    va_start(ap, fmt);
+    fprintf(stderr, "[ASN1]");
+
+    while(adi--) fprintf(stderr, " ");
+
+    vfprintf(stderr, fmt, ap);
+    fprintf(stderr, "\n");
+    va_end(ap);
+  }
+}
+#endif
+
+ssize_t m3ap_generate_initiating_message(
+  uint8_t               **buffer,
+  uint32_t               *length,
+  M3AP_ProcedureCode_t    procedureCode,
+  M3AP_Criticality_t      criticality,
+  asn_TYPE_descriptor_t  *td,
+  void                   *sptr)
+{
+  M3AP_M3AP_PDU_t pdu;
+  ssize_t    encoded;
+  memset(&pdu, 0, sizeof(M3AP_M3AP_PDU_t));
+  pdu.present = M3AP_M3AP_PDU_PR_initiatingMessage;
+  pdu.choice.initiatingMessage.procedureCode = procedureCode;
+  pdu.choice.initiatingMessage.criticality   = criticality;
+  ANY_fromType_aper((ANY_t *)&pdu.choice.initiatingMessage.value, td, sptr);
+
+  if (asn1_xer_print) {
+    xer_fprint(stdout, &asn_DEF_M3AP_M3AP_PDU, (void *)&pdu);
+  }
+
+  /* We can safely free list of IE from sptr */
+  ASN_STRUCT_FREE_CONTENTS_ONLY(*td, sptr);
+
+  if ((encoded = aper_encode_to_new_buffer(&asn_DEF_M3AP_M3AP_PDU, 0, &pdu,
+                 (void **)buffer)) < 0) {
+    return -1;
+  }
+
+  *length = encoded;
+  return encoded;
+}
+
+
+ssize_t m3ap_generate_unsuccessfull_outcome(
+  uint8_t               **buffer,
+  uint32_t               *length,
+  M3AP_ProcedureCode_t         procedureCode,
+  M3AP_Criticality_t           criticality,
+  asn_TYPE_descriptor_t  *td,
+  void                   *sptr)
+{
+  M3AP_M3AP_PDU_t pdu;
+  ssize_t    encoded;
+  memset(&pdu, 0, sizeof(M3AP_M3AP_PDU_t));
+  pdu.present = M3AP_M3AP_PDU_PR_unsuccessfulOutcome;
+  pdu.choice.successfulOutcome.procedureCode = procedureCode;
+  pdu.choice.successfulOutcome.criticality   = criticality;
+  ANY_fromType_aper((ANY_t *)&pdu.choice.successfulOutcome.value, td, sptr);
+
+  if (asn1_xer_print) {
+    xer_fprint(stdout, &asn_DEF_M3AP_M3AP_PDU, (void *)&pdu);
+  }
+
+  /* We can safely free list of IE from sptr */
+  ASN_STRUCT_FREE_CONTENTS_ONLY(*td, sptr);
+
+  if ((encoded = aper_encode_to_new_buffer(&asn_DEF_M3AP_M3AP_PDU, 0, &pdu,
+                 (void **)buffer)) < 0) {
+    return -1;
+  }
+
+  *length = encoded;
+  return encoded;
+}
+
+void m3ap_handle_criticality(M3AP_Criticality_t criticality)
+{
+
+}
+
diff --git a/openair3/M3AP/m3ap_common.h b/openair3/M3AP/m3ap_common.h
new file mode 100644
index 00000000000..83969bf9ef9
--- /dev/null
+++ b/openair3/M3AP/m3ap_common.h
@@ -0,0 +1,183 @@
+/*
+ * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The OpenAirInterface Software Alliance licenses this file to You under
+ * the OAI Public License, Version 1.1  (the "License"); you may not use this file
+ * except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.openairinterface.org/?page_id=698
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *-------------------------------------------------------------------------------
+ * For more information about the OpenAirInterface (OAI) Software Alliance:
+ *      contact@openairinterface.org
+ */
+
+#if HAVE_CONFIG_H_
+# include "config.h"
+#endif
+
+#include "M3AP_ProtocolIE-Field.h"
+#include "M3AP_M3AP-PDU.h"
+#include "M3AP_InitiatingMessage.h"
+#include "M3AP_SuccessfulOutcome.h"
+#include "M3AP_UnsuccessfulOutcome.h"
+#include "M3AP_ProtocolIE-FieldPair.h"
+#include "M3AP_ProtocolIE-ContainerPair.h"
+#include "M3AP_ProtocolExtensionField.h"
+#include "M3AP_ProtocolExtensionContainer.h"
+#include "M3AP_asn_constant.h"
+#include "intertask_interface.h"
+
+#ifndef M3AP_COMMON_H_
+#define M3AP_COMMON_H_
+
+/*! \file m3ap_common.h
+ * \brief m3ap procedures for both MCE and MME
+ * \author Javier Morgade  <javier.morgade@ieee.org>
+ * \date 2019
+ * \version 0.1
+ */
+
+
+/** @defgroup _m3ap_impl_ M3AP Layer Reference Implementation
+ * @ingroup _ref_implementation_
+ * @{
+ */
+
+/* Checking version of ASN1C compiler */
+#if (ASN1C_ENVIRONMENT_VERSION < 923)
+# error "You are compiling m3ap with the wrong version of ASN1C"
+#endif
+
+#ifndef M3AP_PORT
+# define M3AP_PORT 36444
+#endif
+
+#ifndef TRUE
+#define TRUE 1
+#define FALSE 0
+#endif
+
+extern int asn1_xer_print;
+
+#if defined(ENB_MODE)
+# include "common/utils/LOG/log.h"
+# include "m3ap_default_values.h"
+# define M3AP_INFO(x, args...) LOG_I(M3AP, x, ##args)
+# define M3AP_ERROR(x, args...) LOG_E(M3AP, x, ##args)
+# define M3AP_WARN(x, args...)  LOG_W(M3AP, x, ##args)
+# define M3AP_DEBUG(x, args...) LOG_D(M3AP, x, ##args)
+#else
+# define M3AP_INFO(x, args...) do { fprintf(stdout, "[M3AP][I]"x, ##args); } while(0)
+# define M3AP_ERROR(x, args...) do { fprintf(stdout, "[M3AP][E]"x, ##args); } while(0)
+# define M3AP_WARN(x, args...)  do { fprintf(stdout, "[M3AP][W]"x, ##args); } while(0)
+# define M3AP_DEBUG(x, args...) do { fprintf(stdout, "[M3AP][D]"x, ##args); } while(0)
+#endif
+
+#define M3AP_FIND_PROTOCOLIE_BY_ID(IE_TYPE, ie, container, IE_ID, mandatory) \
+  do {\
+    IE_TYPE **ptr; \
+    ie = NULL; \
+    for (ptr = container->protocolIEs.list.array; \
+         ptr < &container->protocolIEs.list.array[container->protocolIEs.list.count]; \
+         ptr++) { \
+      if((*ptr)->id == IE_ID) { \
+        ie = *ptr; \
+        break; \
+      } \
+    } \
+    if (mandatory) DevAssert(ie != NULL); \
+  } while(0)
+
+/** \brief Function callback prototype.
+ **/
+typedef int (*m3ap_message_decoded_callback)(
+  instance_t instance,
+  uint32_t assocId,
+  uint32_t stream,
+  M3AP_M3AP_PDU_t *pdu);
+
+
+/** \brief Function callback prototype.
+ **/
+typedef int (*m3ap_MCE_message_decoded_callback)(
+  instance_t instance,
+  uint32_t assocId,
+  uint32_t stream,
+  M3AP_M3AP_PDU_t *pdu);
+
+/** \brief Function callback prototype.
+ **/
+typedef int (*m3ap_MME_message_decoded_callback)(
+  instance_t instance,
+  uint32_t assocId,
+  uint32_t stream,
+  M3AP_M3AP_PDU_t *pdu);
+
+
+
+/** \brief Encode a successfull outcome message
+ \param buffer pointer to buffer in which data will be encoded
+ \param length pointer to the length of buffer
+ \param procedureCode Procedure code for the message
+ \param criticality Criticality of the message
+ \param td ASN1C type descriptor of the sptr
+ \param sptr Deferenced pointer to the structure to encode
+ @returns size in bytes encded on success or 0 on failure
+ **/
+ssize_t m3ap_generate_successfull_outcome(
+  uint8_t               **buffer,
+  uint32_t               *length,
+  M3AP_ProcedureCode_t         procedureCode,
+  M3AP_Criticality_t           criticality,
+  asn_TYPE_descriptor_t  *td,
+  void                   *sptr);
+
+/** \brief Encode an initiating message
+ \param buffer pointer to buffer in which data will be encoded
+ \param length pointer to the length of buffer
+ \param procedureCode Procedure code for the message
+ \param criticality Criticality of the message
+ \param td ASN1C type descriptor of the sptr
+ \param sptr Deferenced pointer to the structure to encode
+ @returns size in bytes encded on success or 0 on failure
+ **/
+ssize_t m3ap_generate_initiating_message(
+  uint8_t               **buffer,
+  uint32_t               *length,
+  M3AP_ProcedureCode_t    procedureCode,
+  M3AP_Criticality_t      criticality,
+  asn_TYPE_descriptor_t  *td,
+  void                   *sptr);
+
+/** \brief Encode an unsuccessfull outcome message
+ \param buffer pointer to buffer in which data will be encoded
+ \param length pointer to the length of buffer
+ \param procedureCode Procedure code for the message
+ \param criticality Criticality of the message
+ \param td ASN1C type descriptor of the sptr
+ \param sptr Deferenced pointer to the structure to encode
+ @returns size in bytes encded on success or 0 on failure
+ **/
+ssize_t m3ap_generate_unsuccessfull_outcome(
+  uint8_t               **buffer,
+  uint32_t               *length,
+  M3AP_ProcedureCode_t         procedureCode,
+  M3AP_Criticality_t           criticality,
+  asn_TYPE_descriptor_t  *td,
+  void                   *sptr);
+
+/** \brief Handle criticality
+ \param criticality Criticality of the IE
+ @returns void
+ **/
+void m3ap_handle_criticality(M3AP_Criticality_t criticality);
+
+#endif /* M3AP_COMMON_H_ */
-- 
GitLab