gprs_bssgp: add utilities to send and parse BSSGP rim PDUs

At the moment libosmogb offers no convinient way to send RIM PDUs. Also
parsing an incoming RIM messages into destination, source routing
info and RIM container is not available.

Change-Id: I18134fd9938040d2facb6beee3732628b167ce8c
Related: SYS#5103
diff --git a/include/osmocom/gprs/gprs_bssgp.h b/include/osmocom/gprs/gprs_bssgp.h
index 9255661..a7b363b 100644
--- a/include/osmocom/gprs/gprs_bssgp.h
+++ b/include/osmocom/gprs/gprs_bssgp.h
@@ -11,6 +11,7 @@
 
 #include <osmocom/gprs/protocol/gsm_08_18.h>
 #include <osmocom/gprs/protocol/gsm_24_301.h>
+#include <osmocom/gprs/gprs_bssgp_rim.h>
 
 /* gprs_bssgp_util.c */
 
@@ -41,6 +42,39 @@
 /* Chapter 10.4.14: Status */
 int bssgp_tx_status(uint8_t cause, uint16_t *bvci, struct msgb *orig_msg);
 
+/* Chapter 10.6.1: RAN-INFORMATION-REQUEST */
+struct bssgp_ran_information_pdu {
+	struct bssgp_rim_routing_info routing_info_dest;
+	struct bssgp_rim_routing_info routing_info_src;
+
+	/* Encoded variant of the RIM container */
+	uint8_t rim_cont_iei;
+	const uint8_t *rim_cont;
+	unsigned int rim_cont_len;
+
+	/* Decoded variant of the RIM container */
+	bool decoded_present;
+	union {
+		struct bssgp_ran_inf_req_rim_cont req_rim_cont;
+		struct bssgp_ran_inf_rim_cont rim_cont;
+		struct bssgp_ran_inf_ack_rim_cont ack_rim_cont;
+		struct bssgp_ran_inf_err_rim_cont err_rim_cont;
+		struct bssgp_ran_inf_app_err_rim_cont app_err_rim_cont;
+	} decoded;
+
+	/* When receiving a PDU from BSSGP the encoded variant of the RIM
+	 * container will always be present. The decoded variant will be
+	 * present in addition whenever BSSGP was able to decode the container.
+	 *
+	 * When sending a PDU to BSSGP, then the decoded variant is used when
+	 * it is available. The encoded variant (if present) will be ignored
+	 * then. */
+};
+int bssgp_tx_rim(const struct bssgp_ran_information_pdu *pdu, uint16_t nsei);
+
+int bssgp_parse_rim_pdu(struct bssgp_ran_information_pdu *pdu, const struct msgb *msg);
+struct msgb *bssgp_encode_rim_pdu(const struct bssgp_ran_information_pdu *pdu);
+
 enum bssgp_prim {
 	PRIM_BSSGP_DL_UD,
 	PRIM_BSSGP_UL_UD,
@@ -75,6 +109,7 @@
 		struct {
 			uint8_t suspend_ref;
 		} resume;
+		struct bssgp_ran_information_pdu rim_pdu;
 	} u;
 };