iuup: Submit RNL-STATUS-Initialization.ind upon rx of Init

This allows init-passive users to get the configured sizes for the RFCIs
and other similar information once engotiated with the peer.

Realted: OS#1937
Change-Id: I63ee780b4aa162ea097410b234e73984000c0965
diff --git a/src/gsm/iuup.c b/src/gsm/iuup.c
index f526382..c0e12a7 100644
--- a/src/gsm/iuup.c
+++ b/src/gsm/iuup.c
@@ -358,6 +358,25 @@
 	return itp;
 }
 
+static struct osmo_iuup_rnl_prim *irp_init_ind_alloc(struct osmo_iuup_instance *iui)
+{
+	struct osmo_iuup_rnl_prim *irp;
+
+	irp = osmo_iuup_rnl_prim_alloc(iui, OSMO_IUUP_RNL_STATUS, PRIM_OP_INDICATION, IUUP_MSGB_SIZE);
+	irp->u.status.procedure = IUUP_PROC_INIT;
+	irp->u.status.u.initialization.mode_version = iui->mode_version;
+	irp->u.status.u.initialization.data_pdu_type = iui->config.data_pdu_type;
+	irp->u.status.u.initialization.num_subflows = iui->config.num_subflows;
+	irp->u.status.u.initialization.num_rfci = iui->config.num_rfci;
+	memcpy(irp->u.status.u.initialization.subflow_sizes, iui->config.subflow_sizes,
+	       IUUP_MAX_RFCIS * IUUP_MAX_SUBFLOWS * sizeof(iui->config.subflow_sizes[0][0]));
+	irp->u.status.u.initialization.IPTIs_present = iui->config.IPTIs_present;
+	if (iui->config.IPTIs_present)
+		memcpy(irp->u.status.u.initialization.IPTIs, iui->config.IPTIs,
+		       IUUP_MAX_RFCIS * sizeof(iui->config.IPTIs[0]));
+	return irp;
+}
+
 /* transform a RNL data primitive into a TNL data primitive (down the stack) */
 static struct osmo_iuup_tnl_prim *rnl_to_tnl_data(struct osmo_iuup_instance *iui,
 						  struct osmo_iuup_rnl_prim *irp)
@@ -496,6 +515,7 @@
 	int i;
 	bool is_last;
 	uint16_t remote_mask, match_mask;
+	struct osmo_iuup_rnl_prim *irp;
 	struct osmo_iuup_tnl_prim *resp;
 
 	/* TODO: whenever we check message boundaries, length, etc. and we fail, send NACK */
@@ -580,6 +600,9 @@
 	iui->config.num_subflows = ihdr->num_subflows_per_rfci;
 	iui->config.data_pdu_type = itail->data_pdu_type;
 
+	irp = irp_init_ind_alloc(iui);
+	iui->user_prim_cb(&irp->oph, iui->user_prim_priv);
+
 	LOGPFSML(iui->fi, LOGL_DEBUG, "Tx Initialization ACK\n");
 	resp = itp_ctrl_ack_alloc(iui, IUUP_PROC_INIT, hdr->frame_nr);
 	iui->transport_prim_cb(&resp->oph, iui->transport_prim_priv);