libbsc: add rsl_ericsson_imm_assign_cmd() which reply with a confirmation message

ericsson can handle a reference at the end of a imm assign command which is used in
the confirm response. The confirm response is only sent if the trailer is present.

Change-Id: I88560291b5a3a3d7a0bac4d3c089b45f1f6b297f
diff --git a/openbsc/src/libbsc/abis_rsl.c b/openbsc/src/libbsc/abis_rsl.c
index 91cbd46..5ae707c 100644
--- a/openbsc/src/libbsc/abis_rsl.c
+++ b/openbsc/src/libbsc/abis_rsl.c
@@ -1048,7 +1048,7 @@
 }
 
 /* Chapter 8.5.6 */
-int rsl_imm_assign_cmd(struct gsm_bts *bts, uint8_t len, uint8_t *val)
+struct msgb *rsl_imm_assign_cmd_common(struct gsm_bts *bts, uint8_t len, uint8_t *val)
 {
 	struct msgb *msg = rsl_msgb_alloc();
 	struct abis_rsl_dchan_hdr *dh;
@@ -1071,6 +1071,29 @@
 	}
 
 	msg->dst = bts->c0->rsl_link;
+	return msg;
+}
+
+/* Chapter 8.5.6 */
+int rsl_imm_assign_cmd(struct gsm_bts *bts, uint8_t len, uint8_t *val)
+{
+	struct msgb *msg = rsl_imm_assign_cmd_common(bts, len, val);
+	if (!msg)
+		return 1;
+	return abis_rsl_sendmsg(msg);
+}
+
+/* Chapter 8.5.6 */
+int rsl_ericsson_imm_assign_cmd(struct gsm_bts *bts, uint32_t tlli, uint8_t len, uint8_t *val)
+{
+	struct msgb *msg = rsl_imm_assign_cmd_common(bts, len, val);
+	if (!msg)
+		return 1;
+
+	/* ericsson can handle a reference at the end of the message which is used in
+	 * the confirm message. The confirm message is only sent if the trailer is present */
+	msgb_put_u8(msg, RSL_IE_ERIC_MOBILE_ID);
+	msgb_put_u32(msg, tlli);
 
 	return abis_rsl_sendmsg(msg);
 }