/* LAPDm definitiona according to 3GPP TS 44.006 */
/* (C) 2017-2018 bh Harald Welte <laforge@gnumonks.org> */
module LAPDm_Types {

	import from General_Types all;
	import from Osmocom_Types all;

	type uint3_t LapdmSapi;
	type BIT2 LapdmSBits;
	type BIT3 LapdmUBits;
	type BIT2 LapdmU2Bits;

	/* 44.006 6.3.2 */
	const boolean cr_MO_CMD := false;
	const boolean cr_MO_RSP := true;
	const boolean cr_MT_CMD := true;
	const boolean cr_MT_RSP := false;

	/* TS 44.006 Figure 4 */
	type record LapdmAddressField {
		BIT1		spare,
		uint2_t		lpd,
		LapdmSapi	sapi,
		boolean		c_r,
		boolean		ea
	} with { variant "FIELDORDER(msb)" };

	template LapdmAddressField tr_LapdmAddr(template LapdmSapi sapi, template boolean c_r) := {
		spare := '0'B,
		lpd := 0,
		sapi := sapi,
		c_r := c_r,
		ea := true
	};

	template (value) LapdmAddressField ts_LapdmAddr(LapdmSapi sapi, boolean c_r) := {
		spare := '0'B,
		lpd := 0,
		sapi := sapi,
		c_r := c_r,
		ea := true
	};

	type record LapdmCtrlI {
		uint3_t n_r,
		boolean	p,
		uint3_t	n_s,
		BIT1	spare ('0'B)
	} with { variant "FIELDORDER(msb)" };

	type record LapdmCtrlS {
		uint3_t		n_r,
		boolean		p_f,
		LapdmSBits	s,
		BIT2		spare ('01'B)
	} with { variant "FIELDORDER(msb)" };

	type record LapdmCtrlU {
		LapdmUBits	u,
		boolean		p_f,
		LapdmU2Bits	u2,
		BIT2		spare ('11'B)
	} with { variant "FIELDORDER(msb)" };

	/* TS 44.006 Table 3 */
	type union LapdmCtrl {
		LapdmCtrlS	s,
		LapdmCtrlU	u,
		LapdmCtrlI	i,
		uint8_t		other
	} with { variant "TAG(u, spare = '11'B;
			      s, spare = '01'B;
			      i, spare = '0'B;
			      other, OTHERWISE)" };
			/*      )" }; */

	/* TS 44.006 Table 4 */

	template LapdmCtrl tr_LapdmCtrlS := {
		s := { n_r := ?, p_f := ?, s := ?, spare := '01'B }
	};

	template LapdmCtrl tr_LapdmCtrlU := {
		u := { u := ?, p_f := ?, u2 := ?, spare := '11'B }
	};

	/* TS 44.006 Table 4 */
	template LapdmCtrl tr_LapdmCtrlI(template uint3_t nr, template uint3_t ns, template boolean p) := {
		i := { n_r := nr, p := p, n_s := ns, spare := '0'B }
	};
	template (value) LapdmCtrl ts_LapdmCtrlI(uint3_t nr, uint3_t ns, boolean p) := {
		i := { n_r := nr, p := p, n_s := ns, spare := '0'B }
	};


	template LapdmCtrl tr_LapdmCtrlRR(template uint3_t nr, template boolean pf) modifies tr_LapdmCtrlS := {
		s := { n_r := nr, p_f := pf, s := '00'B }
	};
	template (value) LapdmCtrl ts_LapdmCtrlRR(uint3_t nr, boolean pf) := {
		s := { n_r := nr, p_f := pf, s := '00'B }
	};

	template LapdmCtrl tr_LapdmCtrlRNR(template uint3_t nr, template boolean pf) modifies tr_LapdmCtrlS := {
		s := { n_r := nr, p_f := pf, s := '01'B }
	};

	template LapdmCtrl tr_LapdmCtrlREJ(template uint3_t nr, template boolean pf) modifies tr_LapdmCtrlS := {
		s := { n_r := nr, p_f := pf, s := '10'B }
	};

	template LapdmCtrl tr_LapdmCtrlSABM(template boolean p) := {
		u := { u := '001'B, p_f := p, u2 := '11'B, spare := '11'B }
	};
	template (value) LapdmCtrl ts_LapdmCtrlSABM(boolean p) := {
		u := { u := '001'B, p_f := p, u2 := '11'B, spare := '11'B }
	};

	template LapdmCtrl tr_LapdmCtrlDM(template boolean f) := {
		u := { u := '000'B, p_f := f, u2 := '11'B, spare := '11'B }
	};

	template LapdmCtrl tr_LapdmCtrlUI(template boolean p := false) := {
		u := { u := '000'B, p_f := p, u2 := '00'B, spare := '11'B }
	};
	template (value) LapdmCtrl ts_LapdmCtrlUI(boolean p := false) := {
		u := { u := '000'B, p_f := p, u2 := '00'B, spare := '11'B }
	};

	template LapdmCtrl tr_LapdmCtrlDISC(template boolean p) := {
		u := { u := '010'B, p_f := p, u2 := '00'B, spare := '11'B }
	};
	template LapdmCtrl ts_LapdmCtrlDISC(boolean p) := {
		u := { u := '010'B, p_f := p, u2 := '00'B, spare := '11'B }
	};

	template LapdmCtrl tr_LapdmCtrlUA(template boolean f) modifies tr_LapdmCtrlU := {
		u := { u := '011'B, p_f := f, u2 := '00'B, spare := '11'B }
	};
	template (value) LapdmCtrl ts_LapdmCtrlUA(boolean f) := {
		u := { u := '011'B, p_f := f, u2 := '00'B, spare := '11'B }
	};



	external function dec_LapdmAddressField(in octetstring stream) return LapdmAddressField
		with { extension "prototype(convert) decode(RAW)" };

	external function dec_LapdmCtrl(in octetstring stream) return LapdmCtrl
		with { extension "prototype(convert) decode(RAW)" };

	external function dec_LapdmCtrlU(in octetstring stream) return LapdmCtrlU
		with { extension "prototype(convert) decode(RAW)" };

	/* Formats B, Bter and B4 are used on DCCHs for frames containing an information field: 
	/* - format Bter is used on request of higher layers if and only if short L2 header type 1 is
	 *   supported and a UI command is to be transmitted on SAPI 0 */
	/* - format B4 is used for UI frames transmitted by the network on SACCH; */
	/* - format B is applied in all other cases. */
	/* Format Bbis is used only on BCCH, PCH, NCH, and AGCH.

	/* Format B */
	type record LapdmFrameAB {
		LapdmAddressField	addr,
		LapdmCtrl		ctrl,
		uint6_t 		len,
		boolean			m,
		uint1_t			el,
		octetstring		payload	/* zero-length in Frame A */
	} with { variant (len) "LENGTHTO(payload)"
		 variant "FIELDORDER(msb)" };

	external function enc_LapdmFrameAB(in LapdmFrameAB si) return octetstring
		with { extension "prototype(convert) encode(RAW)" };
	external function dec_LapdmFrameAB(in octetstring stream) return LapdmFrameAB
		with { extension "prototype(convert) decode(RAW)" };

	/* Format B4 */
	type record LapdmFrameB4 {
		LapdmAddressField	addr,
		LapdmCtrl		ctrl,
		octetstring		payload
	} with { variant "" };

	external function enc_LapdmFrameB4(in LapdmFrameB4 si) return octetstring
		with { extension "prototype(convert) encode(RAW)" };
	external function dec_LapdmFrameB4(in octetstring stream) return LapdmFrameB4
		with { extension "prototype(convert) decode(RAW)" };

	type record LapdmFrameBbis {
		octetstring		payload
	} with { variant "" };

	external function enc_LapdmFrameBbis(in LapdmFrameBbis si) return octetstring
		with { extension "prototype(convert) encode(RAW)" };
	external function dec_LapdmFrameBbis(in octetstring stream) return LapdmFrameBbis
		with { extension "prototype(convert) decode(RAW)" };

	type union LapdmFrame {
		LapdmFrameAB	ab,
		LapdmFrameBbis	bbis,
		LapdmFrameB4	b4
	} with { variant "" };

	external function enc_LapdmFrame(in LapdmFrame si) return octetstring
		with { extension "prototype(convert) encode(RAW)" };
	/* automatic decoding to the generic LapdmFrame will not work, you have to call one of the
	 * type-specific decoder routines above */

	/* SABM frame with L3 payload */
	template (value) LapdmFrame ts_LAPDm_SABM(LapdmSapi sapi, boolean c_r, boolean p,
						  octetstring l3) := {
		ab := {
			addr := ts_LapdmAddr(sapi, c_r),
			ctrl := ts_LapdmCtrlSABM(p),
			len := 0, /* overwritten in encoder */
			m := false,
			el := 1,
			payload := l3
		}
	}
	template LapdmFrame tr_LAPDm_SABM(template LapdmSapi sapi, template boolean c_r,
					  template boolean p, template octetstring l3) := {
		ab := {
			addr := tr_LapdmAddr(sapi, c_r),
			ctrl := tr_LapdmCtrlSABM(p),
			len := ?,
			m := false,
			el := 1,
			payload := l3
		}
	}

	template (value) LapdmFrame ts_LAPDm_UA(LapdmSapi sapi, boolean c_r, boolean f,
						octetstring l3) := {
		ab := {
			addr := ts_LapdmAddr(sapi, c_r),
			ctrl := ts_LapdmCtrlUA(f),
			len := 0, /* overwritten in encoder */
			m := false,
			el := 1,
			payload := l3
		}
	}
	template LapdmFrame tr_LAPDm_UA(template LapdmSapi sapi, template boolean c_r,
					template boolean f, template octetstring l3) := {
		ab := {
			addr := tr_LapdmAddr(sapi, c_r),
			ctrl := tr_LapdmCtrlUA(f),
			len := ?,
			m := false,
			el := 1,
			payload := l3
		}
	}

	template LapdmFrame ts_LAPDm_DISC(LapdmSapi sapi, boolean c_r, boolean p) := {
		ab := {
			addr := ts_LapdmAddr(sapi, c_r),
			ctrl := ts_LapdmCtrlDISC(p),
			len := 0,
			m := false,
			el := 1,
			payload := ''O
		}
	}
	template LapdmFrame tr_LAPDm_DISC(template LapdmSapi sapi, template boolean c_r,
					  template boolean p) := {
		ab := {
			addr := tr_LapdmAddr(sapi, c_r),
			ctrl := tr_LapdmCtrlDISC(p),
			len := ?,
			m := false,
			el := 1,
			payload := ''O
		}
	}

	template LapdmFrame ts_LAPDm_UI(LapdmSapi sapi, boolean c_r, octetstring l3) := {
		ab := {
			addr := ts_LapdmAddr(sapi, c_r),
			ctrl := ts_LapdmCtrlUI,
			len := 0,
			m := false,
			el := 1,
			payload := l3
		}
	}
	template LapdmFrame tr_LAPDm_UI(template LapdmSapi sapi, template boolean c_r,
					template octetstring l3) := {
		ab := {
			addr := tr_LapdmAddr(sapi, c_r),
			ctrl := tr_LapdmCtrlUI,
			len := ?,
			m := false,
			el := 1,
			payload := l3
		}
	}

	template LapdmFrame ts_LAPDm_B4_UI(LapdmSapi sapi, boolean c_r, octetstring l3) := {
		b4 := {
			addr := ts_LapdmAddr(sapi, c_r),
			ctrl := ts_LapdmCtrlUI,
			payload := l3
		}
	}
	template LapdmFrame tr_LAPDm_B4_UI(template LapdmSapi sapi, template boolean c_r,
					   template octetstring l3) := {
		b4 := {
			addr := tr_LapdmAddr(sapi, c_r),
			ctrl := tr_LapdmCtrlUI,
			payload := l3
		}
	}

	template LapdmFrame tr_LAPDm_I(template LapdmSapi sapi, template boolean c_r,
					template boolean p, template uint3_t nr,
					template uint3_t ns, template octetstring l3) := {
		ab := {
			addr := tr_LapdmAddr(sapi, c_r),
			ctrl := tr_LapdmCtrlI(nr, ns, p),
			len := ?,
			m := false,
			el := 1,
			payload := l3
		}
	}
	template (value) LapdmFrame ts_LAPDm_I(LapdmSapi sapi, boolean c_r, boolean p, uint3_t nr,
						uint3_t ns, octetstring l3) := {
		ab := {
			addr := ts_LapdmAddr(sapi, c_r),
			ctrl := ts_LapdmCtrlI(nr, ns, p),
			len := 0,
			m := false,
			el := 1,
			payload := l3
		}
	}

	template LapdmFrame tr_LAPDm_RR(template LapdmSapi sapi, template boolean c_r,
					template boolean p, template uint3_t nr) := {
		ab := {
			addr := tr_LapdmAddr(sapi, c_r),
			ctrl := tr_LapdmCtrlRR(nr, p),
			len := 0,
			m := false,
			el := 1,
			payload := ''O
		}
	}
	template (value) LapdmFrame ts_LAPDm_RR(LapdmSapi sapi, boolean c_r,
						boolean p, uint3_t nr) := {
		ab := {
			addr := ts_LapdmAddr(sapi, c_r),
			ctrl := ts_LapdmCtrlRR(nr, p),
			len := 0,
			m := false,
			el := 1,
			payload := ''O
		}
	}



} with { encode "RAW"; /*variant "FIELDORDER(msb)" */}
