pespin has submitted this change. ( 
https://gerrit.osmocom.org/c/libosmocore/+/26721 )

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

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
---
M include/osmocom/gsm/iuup.h
M src/gsm/iuup.c
M tests/iuup/iuup_test.c
M tests/iuup/iuup_test.ok
4 files changed, 40 insertions(+), 7 deletions(-)

Approvals:
  laforge: Looks good to me, but someone else must approve
  dexter: Looks good to me, but someone else must approve
  pespin: Looks good to me, approved
  Jenkins Builder: Verified



diff --git a/include/osmocom/gsm/iuup.h b/include/osmocom/gsm/iuup.h
index b1651c5..1ea2b2e 100644
--- a/include/osmocom/gsm/iuup.h
+++ b/include/osmocom/gsm/iuup.h
@@ -80,9 +80,10 @@
                        enum iuup_error_distance distance;
                } error_event;
                struct {
-                       uint16_t supported_versions_mask;
-                       uint8_t num_subflows;
+                       uint16_t mode_version;
+                       uint8_t data_pdu_type;
                        uint8_t num_rfci;
+                       uint8_t num_subflows;
                        uint16_t 
subflow_sizes[IUUP_MAX_RFCIS][IUUP_MAX_SUBFLOWS];
                        bool IPTIs_present;
                        uint8_t IPTIs[IUUP_MAX_RFCIS]; /* values range 0-15, 4 
bits */
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);
diff --git a/tests/iuup/iuup_test.c b/tests/iuup/iuup_test.c
index 0c7dbff..a58481d 100644
--- a/tests/iuup/iuup_test.c
+++ b/tests/iuup/iuup_test.c
@@ -440,9 +440,17 @@

        printf("%s()\n", __func__);

-       OSMO_ASSERT(OSMO_PRIM_HDR(&irp->oph) == OSMO_PRIM(OSMO_IUUP_RNL_DATA, 
PRIM_OP_INDICATION));
-       printf("User: UL len=%u: %s\n", msgb_l3len(msg),
-              osmo_hexdump((const unsigned char *) msgb_l3(msg), 
msgb_l3len(msg)));
+       switch (_passive_init_user_rx_prim) {
+       case 0:
+               OSMO_ASSERT(OSMO_PRIM_HDR(&irp->oph) == 
OSMO_PRIM(OSMO_IUUP_RNL_STATUS, PRIM_OP_INDICATION));
+               OSMO_ASSERT(irp->u.status.procedure == IUUP_PROC_INIT);
+               break;
+       case 1:
+       default:
+               OSMO_ASSERT(OSMO_PRIM_HDR(&irp->oph) == 
OSMO_PRIM(OSMO_IUUP_RNL_DATA, PRIM_OP_INDICATION));
+               printf("User: UL len=%u: %s\n", msgb_l3len(msg),
+                      osmo_hexdump((const unsigned char *) msgb_l3(msg), 
msgb_l3len(msg)));
+       }

        _passive_init_user_rx_prim++;
        msgb_free(oph->msg);
@@ -496,7 +504,7 @@
        memcpy(hdr14, iuup_initialization, sizeof(iuup_initialization));
        OSMO_ASSERT((rc = osmo_iuup_tnl_prim_up(iui, tnp)) == 0);
        OSMO_ASSERT(_passive_init_transport_rx_prim == 1); /* We receive an 
Init ACK */
-       OSMO_ASSERT(_passive_init_user_rx_prim == 0);
+       OSMO_ASSERT(_passive_init_user_rx_prim == 1); /* We receive the 
Status-Init.ind */

        /* Send IuUP incoming data to the implementation: */
        tnp = osmo_iuup_tnl_prim_alloc(iuup_test_ctx, OSMO_IUUP_TNL_UNITDATA, 
PRIM_OP_INDICATION, IUUP_MSGB_SIZE);
@@ -505,7 +513,7 @@
        memcpy(hdr0, iuup_data, sizeof(iuup_data));
        OSMO_ASSERT((rc = osmo_iuup_tnl_prim_up(iui, tnp)) == 0);
        /* We receive it in RNL: */
-       OSMO_ASSERT(_passive_init_user_rx_prim == 1);
+       OSMO_ASSERT(_passive_init_user_rx_prim == 2);

        /* Now in opposite direction, RNL->[IuuP]->TNL: */
        rnp = osmo_iuup_rnl_prim_alloc(iuup_test_ctx, OSMO_IUUP_RNL_DATA, 
PRIM_OP_REQUEST, IUUP_MSGB_SIZE);
diff --git a/tests/iuup/iuup_test.ok b/tests/iuup/iuup_test.ok
index 5423096..681672b 100644
--- a/tests/iuup/iuup_test.ok
+++ b/tests/iuup/iuup_test.ok
@@ -36,6 +36,7 @@
 _init_ack_transport_prim_cb()
 Transport: DL len=35: 01 00 e3 ff 08 55 6d 94 4c 71 a1 a0 81 e7 ea d2 04 24 44 
80 00 0e cd 82 b8 11 18 00 00 97 c4 79 4e 77 40
 sys={0.000000}, clock_override_set
+_passive_init_user_prim_cb()
 _passive_init_transport_prim_cb()
 Transport: DL len=4: e4 00 24 00
 _passive_init_user_prim_cb()

--
To view, visit https://gerrit.osmocom.org/c/libosmocore/+/26721
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Change-Id: I63ee780b4aa162ea097410b234e73984000c0965
Gerrit-Change-Number: 26721
Gerrit-PatchSet: 4
Gerrit-Owner: pespin <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: dexter <[email protected]>
Gerrit-Reviewer: laforge <[email protected]>
Gerrit-Reviewer: lynxis lazus <[email protected]>
Gerrit-Reviewer: pespin <[email protected]>
Gerrit-MessageType: merged

Reply via email to