#include "sua_test_common.h"

static const struct log_info_cat log_cat[] = {
	[DMAIN] = {
		.name = "DMAIN", .loglevel = LOGL_DEBUG, .enabled = 1,
		.color = "",
		.description = "Main program",
	},
	[DSUA] = {
		.name = "DSUA", .loglevel = LOGL_DEBUG, .enabled = 1,
		.color = "",
		.description = "SCCP User Adaption",
	},
	[DXUA] = {
		.name = "DXUA", .loglevel = LOGL_DEBUG, .enabled = 1,
		.color = "",
		.description = "X User Adaption encoding/decoding",
	},

};

const struct log_info test_log_info = {
	.cat = log_cat,
	.num_cat = ARRAY_SIZE(log_cat),
};

int tx_unitdata(struct sua_link *link)
{
	struct msgb *msg = msgb_alloc(1024, "tx_unitdata");
	struct osmo_scu_prim *prim;
	struct osmo_scu_unitdata_param *param;
	uint8_t *cur;

	prim = (struct osmo_scu_prim *) msgb_put(msg, sizeof(*prim));
	param = &prim->u.unitdata;
	param->calling_addr.presence = OSMO_SCCP_ADDR_T_SSN;
	param->called_addr.presence = OSMO_SCCP_ADDR_T_SSN;
	osmo_prim_init(&prim->oph, SCCP_SAP_USER, OSMO_SCU_PRIM_N_UNITDATA, PRIM_OP_REQUEST, msg);

	cur = msg->l2h = msgb_put(msg, 3);
	cur[0] = 1; cur[1] = 2; cur[2] = 3;

	return osmo_osmo_sua_user_link_down(link, &prim->oph);
}

static void sccp_make_addr_pc_ssn(struct osmo_sccp_addr *addr, uint32_t pc, uint32_t ssn)
{
	addr->presence = OSMO_SCCP_ADDR_T_SSN | OSMO_SCCP_ADDR_T_PC;
	addr->ssn = ssn;
	addr->pc = pc;
}

#define SSN_RANAP 142

struct osmo_prim_hdr *make_conn_req(uint32_t conn_id)
{
	struct msgb *msg = msgb_alloc(1024, "conn_req");
	struct osmo_scu_prim *prim;

	prim = (struct osmo_scu_prim *) msgb_put(msg, sizeof(*prim));
	osmo_prim_init(&prim->oph, SCCP_SAP_USER,
			OSMO_SCU_PRIM_N_CONNECT,
			PRIM_OP_REQUEST, msg);
	/* Set SSN for calling and called addr */
	sccp_make_addr_pc_ssn(&prim->u.connect.called_addr, 2, SSN_RANAP);
	sccp_make_addr_pc_ssn(&prim->u.connect.calling_addr, 1, SSN_RANAP);
	prim->u.connect.sccp_class = 2;
	prim->u.connect.conn_id = conn_id;

	return &prim->oph;
}

int tx_conn_req(struct sua_link *link, uint32_t conn_id)
{
	struct osmo_prim_hdr *prim = make_conn_req(conn_id);
	return osmo_osmo_sua_user_link_down(link, prim);
}

struct osmo_prim_hdr *
make_dt1_req(uint32_t conn_id, const uint8_t *data, unsigned int len)
{
	struct msgb *msg = msgb_alloc(1024, "dt1");
	struct osmo_scu_prim *prim;

	prim = (struct osmo_scu_prim *) msgb_put(msg, sizeof(*prim));
	osmo_prim_init(&prim->oph, SCCP_SAP_USER,
			OSMO_SCU_PRIM_N_DATA,
			PRIM_OP_REQUEST, msg);
	prim->u.data.conn_id = conn_id;

	msg->l2h = msgb_put(msg, len);
	memcpy(msg->l2h, data, len);

	return &prim->oph;
}
