WIP: Add description of TS 48.064 LLC frames in TITAN TTCN-3
diff --git a/gprs_gb/LLC_Types.ttcn b/gprs_gb/LLC_Types.ttcn
new file mode 100644
index 0000000..61fc664
--- /dev/null
+++ b/gprs_gb/LLC_Types.ttcn
@@ -0,0 +1,132 @@
+module LLC_Types {
+	import from General_Types all;
+	import from Osmocom_Types all;
+
+	/* TS 44.064 Chapter 6.2 */
+	type record LlcAddressField {
+		boolean pd,
+		boolean c_r,
+		BIT2 reserved,
+		LlcSapi sapi
+	} with {
+		variant (pd) "FIELDLENGTH(1)"
+		variant (c_r) "FIELDLENGTH(1)"
+	};
+
+	type enumerated LlcSapi {
+		LLC_SAPI_RESERVED_0	('0000'B),
+		LLC_SAPI_GMM		('0001'B),
+		LLC_SAPI_TOM2		('0010'B),
+		LLC_SAPI_LL3		('0011'B),
+		LLC_SAPI_RESERVED_4	('0100'B),
+		LLC_SAPI_LL5		('0101'B),
+		LLC_SAPI_RESERVED_6	('0110'B),
+		LLC_SAPI_SMS		('0111'B),
+		LLC_SAPI_TOM8		('1000'B),
+		LLC_SAPI_LL9		('1001'B),
+		LLC_SAPI_RESERVED_10	('1010'B),
+		LLC_SAPI_LL11		('1011'B),
+		LLC_SAPI_RESERVED_12	('1100'B),
+		LLC_SAPI_RESERVED_13	('1101'B),
+		LLC_SAPI_RESERVED_14	('1110'B),
+		LLC_SAPI_RESERVED_15	('1111'B)
+	} with { variant "FIELDLENGTH(4)" };
+
+	/* TS 44.064 Chapter 6.3 */
+	type record LlcCtrlFieldI {
+		BIT1 presence ('0'B),
+		boolean a,
+		BIT1 spare,
+		uint9_t n_s,
+		BIT1 spare2,
+		uint9_t n_r,
+		LlcCtrlS s
+	} with { variant
+		(a) "FIELDLENGTH(1)"
+	};
+
+	/* TS 44.064 Chapter 6.3 */
+	type record LlcCtrlFieldS {
+		BIT2 presence ('10'B),
+		boolean a,
+		BIT2 spare,
+		uint9_t  n_r,
+		LlcCtrlS s
+	} with {
+		variant (a) "FIELDLENGTH(1)"
+	};
+
+	/* TS 44.064 Chapter 6.3 */
+	type record LlcCtrlFieldUI {
+		BIT3 presence ('110'B),
+		BIT2 spare,
+		uint9_t n_u,
+		boolean e,
+		boolean pm
+	} with {
+		variant (e) "FIELDLENGTH(1)"
+		variant (pm) "FIELDLENGTH(1)"
+	};
+
+	/* TS 44.064 Chapter 6.3 */
+	type record LlcCtrlFieldU {
+		BIT3 presence ('111'B),
+		boolean p_f,
+		LlcCtrlM m
+	} with {
+		variant (p_f) "FIELDLENGTH(1)"
+	};
+
+
+	/* TS 44.064 Chapter 6.4 */
+	type enumerated LlcCtrlS {
+		LLC_S_RR	('00'B),
+		LLC_S_ACK	('01'B),
+		LLC_S_RNR	('10'B),
+		LLC_S_SACK	('11'B)
+	} with { variant "FIELDLENGTH(2)" };
+
+	/* TS 44.064 Chapter 6.4 */
+	type enumerated LlcCtrlM {
+		LLC_M_DM	('0001'B),
+		LLC_M_DISC	('0100'B),
+		LLC_M_UA	('0110'B),
+		LLC_M_SABM	('0111'B),
+		LLC_M_FRMR	('1000'B),
+		LLC_M_XID	('1011'B),
+		LLC_M_NULL	('0000'B)
+	} with { variant "FIELDLENGTH(4)" };
+
+	type union LlcCtrlUnion {
+		LlcCtrlFieldI	i,
+		LlcCtrlFieldS	s,
+		LlcCtrlFieldUI	ui,
+		LlcCtrlFieldU	u
+	} with { variant "TAG(i, presence = '0'B;
+			      s, presence = '10'B;
+			      ui, presence = '110'B;
+			      u, presence = '111'B)"
+		 variant "FIELDORDER(msb)"
+	};
+
+	external function enc_LlcCtrlUnion(in LlcCtrlUnion pdu) return octetstring
+		with { extension "prototype(convert) encode(RAW)" };
+	external function dec_LlcCtrlUnion(in octetstring stream) return LlcCtrlUnion
+		with { extension "prototype(convert) decode(RAW)" };
+
+
+	type uint24_t LlcFcs;
+
+	type record LlcPdu {
+		LlcAddressField	addr,
+		LlcCtrlUnion	ctrl,
+		octetstring	payload,
+		LlcFcs		fcs
+	} with { variant "" };
+
+	external function enc_LlcPdu(in LlcPdu pdu) return octetstring
+		with { extension "prototype(convert) encode(RAW)" };
+	external function dec_LlcPdu(in octetstring stream) return LlcPdu
+		with { extension "prototype(convert) decode(RAW)" };
+
+} with { encode "RAW"; variant "FIELDORDER(msb)" }