/* LLC Templates in TTCN-3
 * (C) 2018-2019 Harald Welte <laforge@gnumonks.org>
 * All rights reserved.
 *
 * Released under the terms of GNU General Public License, Version 2 or
 * (at your option) any later version.
 *
 * SPDX-License-Identifier: GPL-2.0-or-later
 */


module LLC_Templates {

import from LLC_Types all;
import from Osmocom_Types all;
import from General_Types all;

template Address_field t_LLC_Addr(template BIT4 sapi, template BIT1 cr, template BIT1 pd := '0'B) := {
	sAPI := sapi,
	spare := '00'B,
	cR := cr,
	pD := '0'B
}
template (value) Address_field ts_LLC_Addr(template (value) BIT4 sapi,
					   template (value) BIT1 cr,
					   template (value) BIT1 pd := '0'B) := {
	sAPI := sapi,
	spare := '00'B,
	cR := cr,
	pD := '0'B
}

template (value) Control_field_UI ts_LLC_CtrlUI(uint9_t n_u, boolean encrypted := false,
					boolean protected := false) := {
	format := '110'B,
	spare := '00'B,
	nU := n_u,
	e := bool2bit(encrypted),
	pM := bool2bit(protected)
}

template (value) Control_field_U ts_LLC_CtrlU(template (value) BIT4 m_bits, template (value) BIT1 p_f) := {
	mBits := m_bits,
	pF := p_f,
	format := '111'B
}

template Control_field_UI tr_LLC_CtrlUI(template uint9_t n_u,
					template boolean encrypted := ?,
					template boolean protected := ?) := {
	format := '110'B,
	spare := '00'B,
	nU := n_u,
	e := bool2bit_tmpl(encrypted),
	pM := bool2bit_tmpl(protected)
}

template Control_field_U tr_LLC_CtrlU(template BIT4 m_bits := ?,
					template BIT1 p_f := ?) := {
	mBits := m_bits,
	pF := p_f,
	format := '111'B
}


template PDU_LLC ts_LLC_UI(octetstring payload, BIT4 sapi, BIT1 cr, uint9_t n_u,
			   boolean encrypted := false, boolean protected := false) := {
	pDU_LLC_UI := {
		address_field := ts_LLC_Addr(sapi, cr),
		control_field := ts_LLC_CtrlUI(n_u, encrypted, protected),
		information_field_UI := payload,
		fCS := omit /* causes encoder to generate FCS */
	}
}

template PDU_LLC tr_LLC_UI(template octetstring payload := ?, template BIT4 sapi := ?,
			   template BIT1 cr := ?, template uint9_t n_u := ?,
			   template boolean encrypted := ?, template boolean protected := ?) := {
	pDU_LLC_UI := {
		address_field := t_LLC_Addr(sapi, cr),
		control_field := tr_LLC_CtrlUI(n_u, encrypted, protected),
		information_field_UI := payload,
		fCS := '000000'O /* provided by decoder if FCS OK */
	}
}

template PDU_LLC tr_LLC_XID(template XID_Information xid, template BIT4 sapi := ?,
			    template BIT1 cr := ?, template BIT1 p_f := ?) := {
	pDU_LLC_U := {
		address_field := t_LLC_Addr(sapi, cr),
		control_field := tr_LLC_CtrlU('1011'B, p_f),
		information_field_U := {
			xID := xid
		},
		fCS := '000000'O /* provided by decoder if FCS OK */
	}
}
template PDU_LLC tr_LLC_XID_MO_CMD(template XID_Information xid, template BIT4 sapi) :=
	tr_LLC_XID(xid, sapi, LLC_CR_UL_CMD, '1'B);
template PDU_LLC tr_LLC_XID_MO_RSP(template XID_Information xid, template BIT4 sapi) :=
	tr_LLC_XID(xid, sapi, LLC_CR_UL_RSP, '1'B);
template PDU_LLC tr_LLC_XID_MT_CMD(template XID_Information xid, template BIT4 sapi) :=
	tr_LLC_XID(xid, sapi, LLC_CR_DL_CMD, '1'B);
template PDU_LLC tr_LLC_XID_MT_RSP(template XID_Information xid, template BIT4 sapi) :=
	tr_LLC_XID(xid, sapi, LLC_CR_DL_RSP, '1'B);
template (value) PDU_LLC ts_LLC_XID(template (value) XID_Information xid,
				    template (value) BIT4 sapi,
				    template (value) BIT1 cr,
				    template (value) BIT1 p_f) := {
	pDU_LLC_U := {
		address_field := ts_LLC_Addr(sapi, cr),
		control_field := ts_LLC_CtrlU('1011'B, p_f),
		information_field_U := {
			xID := xid
		},
		fCS := omit /* causes encoder to generate FCS */
	}
}

template (value) PDU_LLC ts_LLC_XID_MO_CMD(template (value) XID_Information xid, template (value) BIT4 sapi) :=
	ts_LLC_XID(xid, sapi, LLC_CR_UL_CMD, '1'B);
template (value) PDU_LLC ts_LLC_XID_MO_RSP(template (value) XID_Information xid, template (value) BIT4 sapi) :=
	ts_LLC_XID(xid, sapi, LLC_CR_UL_RSP, '1'B);
template (value) PDU_LLC ts_LLC_XID_MT_CMD(template (value) XID_Information xid, template (value) BIT4 sapi) :=
	ts_LLC_XID(xid, sapi, LLC_CR_DL_CMD, '1'B);
template (value) PDU_LLC ts_LLC_XID_MT_RSP(template (value) XID_Information xid, template (value) BIT4 sapi) :=
	ts_LLC_XID(xid, sapi, LLC_CR_DL_RSP, '1'B);


template PDU_LLC tr_LLC_U(template BIT4 m_bits, template BIT1 p_f, template Information_field_U u,
			  template BIT4 sapi, template BIT1 cr) := {
	pDU_LLC_U := {
		address_field := t_LLC_Addr(sapi, cr),
		control_field := tr_LLC_CtrlU(m_bits, p_f),
		information_field_U := u,
		fCS := '000000'O /* provided by decoder if FCS OK */
	}
}
template (value) PDU_LLC ts_LLC_U(template (value) BIT4 m_bits, template (value) BIT1 p_f,
				  template (value) Information_field_U u,
				  template (value) BIT4 sapi, template (value) BIT1 cr) := {
	pDU_LLC_U := {
		address_field := ts_LLC_Addr(sapi, cr),
		control_field := ts_LLC_CtrlU(m_bits, p_f),
		information_field_U := u,
		fCS := omit /* causes encoder to generate FCS */
	}
}

template PDU_LLC tr_LLC_SABM(template SABM_Information sabm_xid, template BIT1 p_f,
			     template BIT4 sapi, template BIT1 cr) :=
	tr_LLC_U('0111'B, p_f, Information_field_U:{sABM := sabm_xid}, sapi, cr);
template (value) PDU_LLC ts_LLC_SABM(template (value) SABM_Information sabm_xid,
				     template (value) BIT1 p_f,
				     template (value) BIT4 sapi, template (value) BIT1 cr) :=
	ts_LLC_U('0111'B, p_f, Information_field_U:{sABM := sabm_xid}, sapi, cr);

template PDU_LLC tr_LLC_UA(template UA_Information ua_xid, template BIT1 p_f,
			   template BIT4 sapi, template BIT1 cr) :=
	tr_LLC_U('0110'B, p_f, Information_field_U:{uA := ua_xid}, sapi, cr);
template (value) PDU_LLC ts_LLC_UA(template (value) UA_Information ua_xid,
				   template (value) BIT1 p_f,
				   template (value) BIT4 sapi, template (value) BIT1 cr) :=
	ts_LLC_U('0110'B, p_f, Information_field_U:{uA := ua_xid}, sapi, cr);

template PDU_LLC tr_LLC_FRMR(template FRMR_Information frmr, template BIT1 p_f,
			     template BIT4 sapi, template BIT1 cr) :=
	tr_LLC_U('1000'B, p_f, Information_field_U:{fRMR := frmr}, sapi, cr);
template (value) PDU_LLC ts_LLC_FRMR(template (value) FRMR_Information frmr,
				     template (value) BIT1 p_f,
				     template (value) BIT4 sapi, template (value) BIT1 cr) :=
	ts_LLC_U('1000'B, p_f, Information_field_U:{fRMR := frmr}, sapi, cr);

template PDU_LLC tr_LLC_DM(template BIT1 p_f, template BIT4 sapi, template BIT1 cr) :=
	tr_LLC_U('0001'B, p_f, Information_field_U:{dM := ''O}, sapi, cr);
template (value) PDU_LLC ts_LLC_DM(template (value) BIT1 p_f, template (value) BIT4 sapi,
				   template (value) BIT1 cr) :=
	ts_LLC_U('0001'B, p_f, Information_field_U:{dM := ''O}, sapi, cr);

template PDU_LLC tr_LLC_NULL(template BIT1 p_f, template BIT4 sapi, template BIT1 cr) :=
	tr_LLC_U('0000'B, p_f, Information_field_U:{nULL := ''O}, sapi, cr);
template (value) PDU_LLC ts_LLC_NULL(template (value) BIT1 p_f, template (value) BIT4 sapi,
				     template (value) BIT1 cr) :=
	ts_LLC_U('0000'B, p_f, Information_field_U:{nULL := ''O}, sapi, cr);

template PDU_LLC tr_LLC_DISC(template BIT1 p_f, template BIT4 sapi, template BIT1 cr) :=
	tr_LLC_U('0100'B, p_f, Information_field_U:{dISC := ''O}, sapi, cr);
template (value) PDU_LLC ts_LLC_DISC(template (value) BIT1 p_f, template (value) BIT4 sapi,
				     template (value) BIT1 cr) :=
	ts_LLC_U('0100'B, p_f, Information_field_U:{dISC := ''O}, sapi, cr);


const BIT4 c_LLC_SAPI_LLGMM := '0001'B;
const BIT4 c_LLC_SAPI_TOM2 := '0010'B;
const BIT4 c_LLC_SAPI_LL3 := '0011'B;
const BIT4 c_LLC_SAPI_LL5 := '0101'B;
const BIT4 c_LLC_SAPI_LLSMS := '0111'B;
const BIT4 c_LLC_SAPI_TOM8 := '1000'B;
const BIT4 c_LLC_SAPI_LL9 := '1001'B;
const BIT4 c_LLC_SAPI_LL11 := '1011'B;

const BIT1 LLC_CR_DL_CMD := '1'B;
const BIT1 LLC_CR_DL_RSP := '0'B;
const BIT1 LLC_CR_UL_CMD := '0'B;
const BIT1 LLC_CR_UL_RSP := '1'B;

/* LLC UI frame with SAPI for L3 payload */
template PDU_LLC tr_LLC_UI_L3 := ( tr_LLC_UI(?, c_LLC_SAPI_LLGMM) );

/* LLC UI frame with SAPI for User payload */
template PDU_LLC tr_LLC_UI_USER := tr_LLC_UI(?, (c_LLC_SAPI_LL3,
						 c_LLC_SAPI_LL5,
						 c_LLC_SAPI_LL9,
						 c_LLC_SAPI_LL11)
						);


template XID tr_XID(template XID_Data xd := ?) := {
	xl := ?,
	typefield := ?,
	xID_length := ?,
	xID_Data := xd
};
template (value) XID ts_XID(template (value) BIT5 tf, template (value) XID_Data xd) := {
	xl := '0'B,
	typefield := tf,
	xID_length := {
		short_len := 0
	},
	xID_Data := xd
};

template XID tr_XID_kU(template uint8_t ku) := tr_XID({kU := ku});
template (value) XID ts_XID_kU(template (value) uint8_t ku) := ts_XID('01010'B, {kU := ku});

template XID tr_XID_kD(template uint8_t kd) := tr_XID({kD := kd});
template (value) XID ts_XID_kD(template (value) uint8_t kd) := ts_XID('01001'B, {kD := kd});

template XID tr_XID_mD(template uint15_t md) := tr_XID({mD := {spare := '0'B, mDValue := md}});
template (value) XID ts_XID_mD(template (value) uint15_t md) := ts_XID('00111'B, {mD := { spare := '0'B, mDValue := md}});

template XID tr_XID_mU(template uint15_t mu) := tr_XID({mU := {spare := '0'B, mUValue := mu}});
template (value) XID ts_XID_mU(template (value) uint15_t mu) := ts_XID('01000'B, {mU := { spare := '0'B, mUValue := mu}});

template XID tr_XID_N201I(template uint11_t n201i) :=
	tr_XID({n201_I := {spare := '00000'B, n201IValue := n201i}});
template (value) XID ts_XID_N201I(template (value) uint11_t n201i) :=
	ts_XID('00110'B, {n201_I := { spare := '00000'B, n201IValue := n201i}});

template XID tr_XID_N201U(template uint11_t n201u) :=
	tr_XID({n201_U := {spare := '00000'B, n201UValue := n201u}});
template (value) XID ts_XID_N201U(template (value) uint11_t n201u) :=
	ts_XID('00101'B, {n201_U := { spare := '00000'B, n201UValue := n201u}});

template XID tr_XID_N200(template uint4_t n200) :=
	tr_XID({n200 := { retransmissions := n200, spare := '0000'B}});
template (value) XID ts_XID_N200(template (value) uint4_t n200) :=
	ts_XID('00100'B, {n200 := { retransmissions := n200, spare := '0000'B}});

template XID tr_XID_T200(template uint12_t t200) :=
	tr_XID({t200 := { spare := '0000'B, t200Value := t200}});
template (value) XID ts_XID_T200(template (value) uint12_t t200) :=
	ts_XID('00011'B, {t200 := { spare := '0000'B, t200Value := t200}});

template XID tr_XID_version(template uint4_t v) :=
	tr_XID({version := {version_value := v, spare := '0000'B}});
template (value) XID ts_XID_version(template (value) uint4_t v) :=
	ts_XID('00000'B, {version := {version_value := v, spare := '0000'B}});

template XID tr_XID_IOV_UI(template OCT4 iov) := tr_XID({iOV_UI := iov});
template (value) XID ts_XID_IOV_UI(template (value) OCT4 iov) := ts_XID('00001'B, {iOV_UI := iov});

template XID tr_XID_IOV_I(template OCT4 iov) := tr_XID({iOV_I := iov});
template (value) XID ts_XID_IOV_I(template (value) OCT4 iov) := ts_XID('00010'B, {iOV_I := iov});

template XID tr_XID_L3(template octetstring l3) := tr_XID({l3param := l3});
template (value) XID ts_XID_L3(template (value) octetstring l3) := ts_XID('01011'B, {l3param := l3});

template XID tr_XID_RESET := tr_XID({reset := ''O});
template (value) XID ts_XID_RESET := ts_XID('01100'B, {reset := ''O});


}
