int s1ap_eNB_generate_initial_ue_message(struct s1ap_eNB_UE_description_s *ue_ref,
                                         uint8_t                          *nas_pdu,
                                         uint32_t                          nas_len) {
    InitialUEMessageIEs_t  initialUEmessageIEs;
    InitialUEMessageIEs_t *initialUEmessageIEs_p = &initialUEmessageIEs;
    uint8_t  *buffer;
    uint32_t  len;

    char tac[] = { 0x00, 0x01 };
    uint8_t id[] = { 0x03, 0x56, 0xf0, 0xd8 };
    char identity[] = { 0x02, 0x08, 0x34 };

    memset((void *)initialUEmessageIEs_p, 0, sizeof(InitialUEMessageIEs_t));

    initialUEmessageIEs.eNB_UE_S1AP_ID = ue_ref->eNB_UE_s1ap_id;
    initialUEmessageIEs.nas_pdu.buf = nas_pdu;
    initialUEmessageIEs.nas_pdu.size = nas_len;

    initialUEmessageIEs.tai.tAC.buf = (uint8_t*)tac;
    initialUEmessageIEs.tai.tAC.size = 2;
    initialUEmessageIEs.tai.pLMNidentity.buf = (uint8_t*)identity;
    initialUEmessageIEs.tai.pLMNidentity.size = 3;
    initialUEmessageIEs.eutran_cgi.pLMNidentity.buf = (uint8_t*)identity;
    initialUEmessageIEs.eutran_cgi.pLMNidentity.size = 3;
    initialUEmessageIEs.eutran_cgi.cell_ID.buf = (uint8_t*)id;
    initialUEmessageIEs.eutran_cgi.cell_ID.size = 4;
    initialUEmessageIEs.eutran_cgi.cell_ID.bits_unused = 4;

    initialUEmessageIEs.rrC_Establishment_Cause = RRC_Establishment_Cause_mo_Data;

    if (s1ap_eNB_encode_initial_ue_message(initialUEmessageIEs_p, &buffer, &len) < 0) {
        if (buffer != NULL) free(buffer);
        return -1;
    }
    /* Send encoded message over sctp */
    return sctp_send_msg(ue_ref->eNB->assocId, ue_ref->stream_send, buffer, len);
}
int
s1ap_eNB_generate_initial_ue_message (
  uint8_t ** buffer,
  uint32_t * length)
{
  InitialUEMessageIEs                     initialUEmessageIEs;
  InitialUEMessageIEs                    *initialUEmessageIEs_p = &initialUEmessageIEs;

  memset (initialUEmessageIEs_p, 0, sizeof (InitialUEMessageIEs));
  initialUEmessageIEs.eNB_UE_S1AP_ID = eNB_UE_S1AP_ID;
  initialUEmessageIEs.nas_pdu.buf = infoNAS;
  initialUEmessageIEs.nas_pdu.size = sizeof (infoNAS);
  initialUEmessageIEs.tai.tAC.buf = tac;
  initialUEmessageIEs.tai.tAC.size = 2;
  initialUEmessageIEs.tai.pLMNidentity.buf = identity;
  initialUEmessageIEs.tai.pLMNidentity.size = 3;
  initialUEmessageIEs.eutran_cgi.pLMNidentity.buf = identity;
  initialUEmessageIEs.eutran_cgi.pLMNidentity.size = 3;
  initialUEmessageIEs.eutran_cgi.cell_ID.buf = id;
  initialUEmessageIEs.eutran_cgi.cell_ID.size = 4;
  initialUEmessageIEs.eutran_cgi.cell_ID.bits_unused = 4;
  initialUEmessageIEs.rrC_Establishment_Cause = RRC_Establishment_Cause_mo_Data;
  return s1ap_eNB_encode_initial_ue_message (initialUEmessageIEs_p, buffer, length);
}
static inline
int s1ap_eNB_encode_initiating(s1ap_message *s1ap_message_p,
    uint8_t **buffer, uint32_t *len)
{
    int ret = -1;
    MessageDef *message_p;
    char       *message_string = NULL;
    size_t      message_string_size;
    MessagesIds message_id;

    DevAssert(s1ap_message_p != NULL);

    message_string = calloc(10000, sizeof(char));

    s1ap_string_total_size = 0;

    switch(s1ap_message_p->procedureCode) {
        case S1ap_ProcedureCode_id_S1Setup:
            ret = s1ap_eNB_encode_s1_setup_request(
                &s1ap_message_p->msg.s1ap_S1SetupRequestIEs, buffer, len);
            s1ap_xer_print_s1ap_s1setuprequest(s1ap_xer__print2sp, message_string, s1ap_message_p);
            message_id = S1AP_S1_SETUP_LOG;
            break;

        case S1ap_ProcedureCode_id_uplinkNASTransport:
            ret = s1ap_eNB_encode_uplink_nas_transport(
                &s1ap_message_p->msg.s1ap_UplinkNASTransportIEs, buffer, len);
            s1ap_xer_print_s1ap_uplinknastransport(s1ap_xer__print2sp, message_string, s1ap_message_p);
            message_id = S1AP_UPLINK_NAS_LOG;
            break;

        case S1ap_ProcedureCode_id_UECapabilityInfoIndication:
            ret = s1ap_eNB_encode_ue_capability_info_indication(
                &s1ap_message_p->msg.s1ap_UECapabilityInfoIndicationIEs, buffer, len);
            s1ap_xer_print_s1ap_uecapabilityinfoindication(s1ap_xer__print2sp, message_string, s1ap_message_p);
            message_id = S1AP_UE_CAPABILITY_IND_LOG;
            break;

        case S1ap_ProcedureCode_id_initialUEMessage:
            ret = s1ap_eNB_encode_initial_ue_message(
                &s1ap_message_p->msg.s1ap_InitialUEMessageIEs, buffer, len);
            s1ap_xer_print_s1ap_initialuemessage(s1ap_xer__print2sp, message_string, s1ap_message_p);
            message_id = S1AP_INITIAL_UE_MESSAGE_LOG;
            break;

        case S1ap_ProcedureCode_id_NASNonDeliveryIndication:
            ret = s1ap_eNB_encode_nas_non_delivery(
                &s1ap_message_p->msg.s1ap_NASNonDeliveryIndication_IEs, buffer, len);
            s1ap_xer_print_s1ap_nasnondeliveryindication_(s1ap_xer__print2sp,
                                                          message_string, s1ap_message_p);
            message_id = S1AP_NAS_NON_DELIVERY_IND_LOG;
            break;

        default:
            S1AP_DEBUG("Unknown procedure ID (%d) for initiating message\n",
                       (int)s1ap_message_p->procedureCode);
            return ret;
            break;
    }

    message_string_size = strlen(message_string);

    message_p = itti_alloc_new_message_sized(TASK_S1AP, message_id, message_string_size + sizeof (IttiMsgText));
    message_p->ittiMsg.s1ap_s1_setup_log.size = message_string_size;
    memcpy(&message_p->ittiMsg.s1ap_s1_setup_log.text, message_string, message_string_size);

    itti_send_msg_to_task(TASK_UNKNOWN, INSTANCE_DEFAULT, message_p);

    free(message_string);

    return ret;
}