library/Osmocom_Types: share RA generation helpers from BTS_Tests

Change-Id: I7c9c3d243b39bbd3d521009d23c1043df729ee10
diff --git a/library/Osmocom_Types.ttcn b/library/Osmocom_Types.ttcn
index 994a0cc..2ee3215 100644
--- a/library/Osmocom_Types.ttcn
+++ b/library/Osmocom_Types.ttcn
@@ -198,5 +198,54 @@
 	}
 }
 
+/* like L1SAP_IS_PACKET_RACH */
+function ra_is_ps(OCT1 ra) return boolean {
+	if ((ra and4b 'F0'O == '70'O) and (ra and4b '0F'O != '0F'O)) {
+		return true;
+	}
+	return false;
+}
+
+function ra_is_emerg(OCT1 ra) return boolean {
+	/* See also: 3GPP TS 04.08, Table 9.9, ra=101xxxxx */
+	if ((ra and4b 'E0'O == 'A0'O) and (ra and4b '1F'O != '1F'O)) {
+		return true;
+	}
+	return false;
+}
+
+/* generate a random RACH for circuit-switched */
+function f_rnd_ra_cs() return OCT1 {
+	var OCT1 ra;
+	do {
+		ra := f_rnd_octstring(1);
+	} while (ra_is_ps(ra));
+	return ra;
+}
+
+/* generate a random RACH for emergency */
+function f_rnd_ra_emerg() return OCT1 {
+	var OCT1 ra;
+	do {
+		ra := f_rnd_octstring(1);
+	} while (not ra_is_emerg(ra));
+	return ra;
+}
+
+/* generate a random RACH for packet-switched */
+function f_rnd_ra_ps() return OCT1 {
+	var OCT1 ra;
+	do {
+		ra := f_rnd_octstring(1);
+	} while (not ra_is_ps(ra));
+	return ra;
+}
+
+/* generate a random 11-bit RA (packet-switched only) */
+function f_rnd_ra11_ps() return BIT11 {
+	var integer ra11 := f_rnd_int(bit2int('11111111111'B));
+	return int2bit(ra11, 11);
+}
+
 
 } with { encode "RAW"; variant "FIELDORDER(msb)" }