#pragma once

/**
 * Types found in the M2UA RFC 3331
 */

#include <stdint.h>

#define M2UA_VERSION	1
#define M2UA_SPARE	0

enum {
	M2UA_CLS_MGMT,		/* Management (MGMT) Message [IUA/M2UA/M3UA/SUA] */
	M2UA_CLS_TRANS,		/* Transfer Messages [M3UA] */
	M2UA_CLS_SSNM,		/* SS7 Signalling Network Management (SSNM) Messages [M3UA/SUA] */
	M2UA_CLS_ASPSM,		/* ASP State Maintenance (ASPSM) Messages [IUA/M2UA/M3UA/SUA] */
	M2UA_CLS_ASPTM,		/* ASP Traffic Maintenance (ASPTM) Messages [IUA/M2UA/M3UA/SUA] */
	M2UA_CLS_QPTM,		/* Q.921/Q.931 Boundary Primitives Transport (QPTM) */
	M2UA_CLS_MAUP,		/* MTP2 User Adaptation (MAUP) Messages [M2UA] */
	M2UA_CLS_SUA_LESS,	/* Connectionless Messages [SUA] */
	M2UA_CLS_SUA_CONN,	/* Connection-Oriented Messages [SUA] */
	M2UA_CLS_RKM,		/* Routing Key Management (RKM) Messages (M3UA) */
 	M2UA_CLS_IIM,		/* Interface Identifier Management (IIM) Messages (M2UA) */
};

/**
 * MTP2 User Adaption = MAUP messages
 */
enum {
	M2UA_MAUP_RESERVED,	/* Reserved */
	M2UA_MAUP_DATA,		/* Data */
	M2UA_MAUP_EST_REQ,	/* Establish Request */
	M2UA_MAUP_EST_CON,	/* Establish Confirm */
	M2UA_MAUP_REL_REQ,	/* Release Request */
	M2UA_MAUP_REL_CON,	/* Release Confirm */
	M2UA_MAUP_REL_IND,	/* Release Indication */
	M2UA_MAUP_STATE_REQ,	/* State Request */
	M2UA_MAUP_STATE_CON,	/* State Confirm */
	M2UA_MAUP_STATE_IND,	/* State Indication */
	M2UA_MAUP_RETR_REQ,	/* Data Retrieval Request */
	M2UA_MAUP_D_RETR_CON,	/* Data Retrieval Confirm */
	M2UA_MAUP_D_RETR_IND,	/* Data Retrieval Indication */
	M2UA_MAUP_D_RETR_COMPL,	/* Data Retrieval Complete Indication */
	M2UA_MAUP_CONG_IND,	/* Congestion Indication */
	M2UA_MAUP_DATA_ACK,	/* Data Acknowledge */
};

/**
 * Application Server Process State Maintaenance (ASPSM) messages
 */
enum {
	M2UA_ASPSM_RESERVED,	/* Reserved */
	M2UA_ASPSM_UP,		/* ASP Up (UP) */
	M2UA_ASPSM_DOWN,	/* ASP Down (DOWN) */
	M2UA_ASPSM_BEAT,	/* Heartbeat (BEAT) */
	M2UA_ASPSM_UP_ACK,	/* ASP Up Ack (UP ACK) */
	M2UA_ASPSM_DOWN_ACK,	/* ASP Down Ack (DOWN ACK) */
	M2UA_ASPSM_BEAT_ACK,	/* Heartbeat Ack (BEAT ACK) */
};

/**
 * Application Server Process Traffic Maintaenance (ASPTM) messages.
 */
enum {
	M2UA_ASPTM_RESERVED,	/* Reserved */
	M2UA_ASPTM_ACTIV,	/* ASP Active (ACTIVE) */
	M2UA_ASPTM_INACTIV,	/* ASP Inactive (INACTIVE) */
	M2UA_ASPTM_ACTIV_ACK,	/* ASP Active Ack (ACTIVE ACK) */
	M2UA_ASPTM_INACTIV_ACK,	/* ASP Inactive Ack (INACTIVE ACK) */
};

/**
 * Management (MGMT) messages
 */
enum {
	M2UA_MGMT_ERROR,	/* Error (ERR) */
	M2UA_MGMT_NTFY,		/* Notify (NTFY) */
};

/**
 * Interface Identifier Management (IIM) Messages
 */
enum {
	M2UA_IIM_RESERVED,	/* Reserved */
	M2UA_IIM_REG_REQ,	/* Registration Request (REG REQ) */
	M2UA_IIM_REG_RSP,	/* Registration Response (REG RSP) */
	M2UA_IIM_DEREG_REQ,	/* Deregistration Request (DEREG REQ) */
	M2UA_IIM_DEREG_RSP,	/* Deregistration Response (DEREG RSP) */
};

/**
 * Tag Values for M2UA
 */
enum {
	__m2ua_tag_start	= 767,

	M2UA_TAG_DATA,		/* Protocol Data 1 */
	M2UA_TAG_DATA_TTC,	/* Protocol Data 2 (TTC) */
	M2UA_TAG_STATE_REQ,	/* State Request */
	M2UA_TAG_STATE_EVENT,	/* State Event */
	M2UA_TAG_CONG_STATUS,	/* Congestion Status */
	M2UA_TAG_DISC_STATUS,	/* Discard Status */
	M2UA_TAG_ACTION,	/* Action */
	M2UA_TAG_SEQ_NO,	/* Sequence Number */
	M2UA_TAG_RETR_RES,	/* Retrieval Result */
	M2UA_TAG_LNK_KEY,	/* Link Key */
	M2UA_TAG_L_LNK_KEY_ID,	/* Local-LK-Identifier */
	M2UA_TAG_SDT,		/* Signalling Data Terminal (SDT) Identifier */
	M2UA_TAG_SDL,		/* Signalling Data Link (SDL) Identifier */
	M2UA_TAG_REG_RES,	/* Registration Result */
	M2UA_TAG_RES_STATUS,	/* Registration Status */
	M2UA_TAG_DEREG_RES,	/* De-Registration Result */
	M2UA_TAG_DEREG_STATUS,	/* De-Registration Status */
};

/**
 * 3.3.1.5 State Request
 */
enum {
	M2UA_STATUS_LPO_SET,		/* Request local processor outage */
	M2UA_STATUS_LPO_CLEAR,		/* Request local processor outage recovered */
	M2UA_STATUS_EMER_SET,		/* Request emergency alignment */
	M2UA_STATUS_EMER_CLEAR, 	/* Request normal alignment (cancel emergency) */
	M2UA_STATUS_FLUSH_BUFFERS,	/* Flush or clear receive, transmit and retransmit queues */
	M2UA_STATUS_CONTINUE,		/* Continue or Resume */
	M2UA_STATUS_CLEAR_RTB,		/* Clear the retransmit queue */
	M2UA_STATUS_AUDIT,		/* Audit state of link */
	M2UA_STATUS_CONG_CLEAR,		/* Congestion cleared */
	M2UA_STATUS_CONG_ACCEPT,	/* Congestion accept */
	M2UA_STATUS_CONG_DISCARD,	/* Congestion discard */
};

/**
 * 3.3.1.7 State Indication
 */
enum {
	__m2ua_event_dummy,
	M2UA_EVENT_RPO_ENTER,		/* Remote entered processor outage */
	M2UA_EVENT_RPO_EXIT,		/* Remote exited processor outage */
	M2UA_EVENT_LPO_ENTER,		/* Link entered processor outage */
	M2UA_EVENT_LPO_EXIT,		/* Link exited processor outage */
};

/**
 * 3.3.1.8 Congestion Indication
 */
enum {
	M2UA_LEVEL_NONE,		/* No congestion */
	M2UA_LEVEL_1,			/* Congestion Level 1 */
	M2UA_LEVEL_2,			/* Congestion Level 2 */
	M2UA_LEVEL_3,			/* Congestion Level 3 */
};

/**
 * 3.3.1.9 Retrieval Request
 */
enum {
	M2UA_ACTION_RTRV_BSN,		/* Retrieve the backward sequence number */
	M2UA_ACTION_RTRV_MSGS,		/* Retrieve the PDUs from the transmit and retransmit queues. */
};

/**
 * 3.3.1.10 Retrieval Confirm
 */
enum {
	M2UA_RESULT_SUCCESS,		/* Action successful */
	M2UA_RESULT_FAILURE,		/* Action failed */
};

/**
 * 3.3.2.7 ASP Active (ASPAC)
 */
enum {
	M2UA_TRA_OVERRIDE	= 1,	/* Override */
	M2UA_TRA_LOAD_SHARE	= 2,	/* Load-share */
	M2UA_TRA_BROADCAST	= 3,	/* Broadcast */
};

/**
 * 3.3.3.1 Error (ERR)
 */
enum {
	__m2ua_err_unused,
	M2UA_ERR_INV_VER,		/* Invalid Version */
	M2UA_ERR_INV_INT_IDENT,		/* Invalid Interface Identifier */
	M2UA_ERR_UNS_MSG_CLASS,		/* Unsupported Message Class */
	M2UA_ERR_UNS_MSG_TYPE,		/* Unsupported Message Type */
	M2UA_ERR_UNS_TRA_MODE,		/* Unsupported Traffic Handling Mode */
	M2UA_ERR_UNE_MSG,		/* Unexpected Message */
	M2UA_ERR_PROTO_ERROR,		/* Protocol Error */
	M2UA_ERR_UNS_INT_IDENT_T,	/* Unsupported Interface Identifier Type */
	M2UA_ERR_INV_STR_IDENT,		/* Invalid Stream Identifier */
	M2UA_ERR_UNUSED1,		/* Unused in M2UA */
	M2UA_ERR_UNUSED2,		/* Unused in M2UA */
	M2UA_ERR_UNUSED3,		/* Unused in M2UA */
	M2UA_ERR_REFUSED,		/* Refused - Management Blocking */
	M2UA_ERR_ASP_IDENT_REQ,		/* ASP Identifier Required */
	M2UA_ERR_INV_ASP_IDENT,		/* Invalid ASP Identifier */
	M2UA_ERR_ASP_ACT_FOR_IDENT,	/* ASP Active for Interface Identifier(s) */
	M2UA_ERR_INV_PARAM_VAL,		/* Invalid Parameter Value */
	M2UA_ERR_PARAM_FIELD_ERR,	/* Parameter Field Error */
	M2UA_ERR_UNEXP_PARAM,		/* Unexpected Parameter */
	M2UA_ERR_UNUSED4,		/* Unused in M2UA */
	M2UA_ERR_UNUSED5,		/* Unused in M2UA */
	M2UA_ERR_MISSING_PARAM,		/* Missing Parameter */
};

/**
 * 3.3.3.2 Notify (NTFY)
 */
enum {
	M2UA_STP_AS_STATE_CHG 	= 1,	/* Application Server state change (AS_State_Change) */
	M2UA_STP_OTHER		= 2,	/* Other */
};

enum {
	/* this is for M2UA_STP_AS_STATE_CHG */
	M2UA_STP_AS_INACTIVE		= 2,	/* Application Server Inactive (AS_Inactive) */
	M2UA_STP_AS_ACTIVE		= 3,	/* Application Server Active (AS_Active) */
	M2UA_STP_AS_PENDING		= 4,	/* Application Server Pending (AS_Pending) */

	/* this is for the other */
	M2UA_STP_O_INSUFF_ASP_RES	= 1,	/* Insufficient ASP resources active in AS */
	M2UA_STP_O_ALT_ASP_ACTIVR	= 2,	/* Alternate ASP Active */
	M2UA_STP_O_ASP_FAILURE		= 3,	/* ASP Failure */
};

/**
 * 3.3.4.3 Registration Response (REG RSP)
 */
enum {
	M2UA_REG_SUCC,				/* Successfully Registered */
	M2UA_REG_ERR_UNK,			/* Error - Unknown */
	M2UA_REG_ERR_INV_SDLI,			/* Error - Invalid SDLI */
	M2UA_REG_ERR_INV_SDTI,			/* Error - Invalid SDTI */
	M2UA_REG_ERR_INV_LNK_KEY,		/* Error - Invalid Link Key */
	M2UA_REG_ERR_PERM_DENIED,		/* Error - Permission Denied */
	M2UA_REG_ERR_OVERLAP_KEY,		/* Error - Overlapping (Non-unique) Link Key */
	M2UA_REG_ERR_LNK_KEY_NOT_PROV,		/* Error - Link Key not Provisioned */
	M2UA_REG_ERR_INSUFF_RES,		/* Error - Insufficient Resources */
};

/**
 * 3.3.4.4 De-Registration Response (DEREG RSP)
 */
enum {
	M2UA_DEREG_SUCC,			/* Successfully De-registered */
	M2UA_DEREG_ERR_UNK,			/* Error - Unknown */
	M2UA_DEREG_ERR_INV_IDENT,		/* Error - Invalid Interface Identifier */
	M2UA_DEREG_ERR_PERM_DENIED,		/* Error - Permission Denied */
	M2UA_DEREG_ERR_NOT_REG,			/* Error - Not Registered */
};