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()