#include <osmocom/core/msgb.h>
#include <osmocom/ranap/ranap_ies_defs.h>

static const char *printstr(OCTET_STRING_t *s)
{
	osmo_hexdump((char*)s->buf, s->size);
}

#define PP(octet_string_t) \
	printf(#octet_string_t " = %s\n",\
	       printstr(&octet_string_t))

void ranap_msg_dt_print(void *ctx, ranap_message *ranap_msg)
{
	OSMO_ASSERT(ranap_msg->procedureCode ==
		    RANAP_ProcedureCode_id_DirectTransfer);

	printf("rx DirectTransfer: presence = %hx\n", ranap_msg->msg.directTransferIEs.presenceMask);
	PP(ranap_msg->msg.directTransferIEs.nas_pdu);
	
/*
typedef struct RANAP_DirectTransferIEs_s {
    uint16_t  presenceMask;
    RANAP_NAS_PDU_t nas_pdu;
    RANAP_LAI_t lai; ///< Optional field
    RANAP_RAC_t rac; ///< Optional field
    RANAP_SAI_t sai; ///< Optional field
    RANAP_SAPI_t sapi; ///< Optional field
} RANAP_DirectTransferIEs_t;
*/
}

void ranap_msg_dt_get(void *ctx, ranap_message *ranap_msg)
{
	struct msgb *m = ctx;
	OSMO_ASSERT(ranap_msg->procedureCode ==
		    RANAP_ProcedureCode_id_DirectTransfer);

	printf("rx DirectTransfer: presence = %hx\n", ranap_msg->msg.directTransferIEs.presenceMask);
	PP(ranap_msg->msg.directTransferIEs.nas_pdu);

	int len = ranap_msg->msg.directTransferIEs.nas_pdu.size;
	char *data = ranap_msg->msg.directTransferIEs.nas_pdu.buf;

	m->l3h = m->data;
	memcpy(msgb_put(m, len), data, len);
}
