/* Location Services (LCS): low level Lb/SCCP handling in OsmoBSC, API */
#pragma once

#include <stdbool.h>
#include <stdint.h>
#include <osmocom/core/rate_ctr.h>
#include <osmocom/sigtran/sccp_sap.h>

struct bssap_le_pdu;
struct gsm_subscriber_connection;

enum {
	SMLC_CTR_BSSMAP_LE_RX_UNKNOWN_PEER,
	SMLC_CTR_BSSMAP_LE_RX_UDT_RESET,
	SMLC_CTR_BSSMAP_LE_RX_UDT_RESET_ACK,
	SMLC_CTR_BSSMAP_LE_RX_UDT_ERR_INVALID_MSG,
	SMLC_CTR_BSSMAP_LE_RX_DT1_ERR_INVALID_MSG,
	SMLC_CTR_BSSMAP_LE_RX_DT1_PERFORM_LOCATION_RESPONSE_SUCCESS,
	SMLC_CTR_BSSMAP_LE_RX_DT1_PERFORM_LOCATION_RESPONSE_FAILURE,
	SMLC_CTR_BSSMAP_LE_RX_DT1_BSSLAP_TA_REQUEST,

	SMLC_CTR_BSSMAP_LE_TX_ERR_INVALID_MSG,
	SMLC_CTR_BSSMAP_LE_TX_ERR_CONN_NOT_READY,
	SMLC_CTR_BSSMAP_LE_TX_ERR_SEND,
	SMLC_CTR_BSSMAP_LE_TX_SUCCESS,

	SMLC_CTR_BSSMAP_LE_TX_UDT_RESET,
	SMLC_CTR_BSSMAP_LE_TX_UDT_RESET_ACK,
	SMLC_CTR_BSSMAP_LE_TX_DT1_PERFORM_LOCATION_REQUEST,
	SMLC_CTR_BSSMAP_LE_TX_DT1_PERFORM_LOCATION_ABORT,
	SMLC_CTR_BSSMAP_LE_TX_DT1_BSSLAP_TA_RESPONSE,
	SMLC_CTR_BSSMAP_LE_TX_DT1_BSSLAP_REJECT,
	SMLC_CTR_BSSMAP_LE_TX_DT1_BSSLAP_RESET,
	SMLC_CTR_BSSMAP_LE_TX_DT1_BSSLAP_ABORT,
};

struct smlc_config {
	bool enable;

	uint32_t cs7_instance;
	bool cs7_instance_valid;
	struct osmo_sccp_instance *sccp;
	struct osmo_sccp_user *sccp_user;

	struct osmo_sccp_addr bsc_addr;
	char *bsc_addr_name;

	struct osmo_sccp_addr smlc_addr;
	char *smlc_addr_name;

	/*! Lb link is ready when bssmap_reset_is_conn_ready(bssmap_reset) returns true. */
	struct bssmap_reset *bssmap_reset;

	struct rate_ctr_group *ctrs;
};

extern const struct rate_ctr_desc smlc_ctr_description[];
extern const struct rate_ctr_group_desc smlc_ctrg_desc;

int lb_init(void);
int lb_start_or_stop(void);
int lb_send(struct gsm_subscriber_connection *conn, const struct bssap_le_pdu *bssap_le);
void lb_close_conn(struct gsm_subscriber_connection *conn);
