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
This commit is contained in:
Pau Espin 2022-01-03 16:57:45 +01:00 committed by pespin
parent d3b016fec5
commit 604eaba2c3
4 changed files with 40 additions and 7 deletions

View File

@ -80,9 +80,10 @@ struct osmo_iuup_rnl_status {
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 */

View File

@ -358,6 +358,25 @@ static struct osmo_iuup_tnl_prim *tnp_ctrl_init_alloc(struct osmo_iuup_instance
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 @@ static bool iuup_rx_initialization(struct osmo_iuup_instance *iui, struct osmo_i
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 @@ static bool iuup_rx_initialization(struct osmo_iuup_instance *iui, struct osmo_i
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);

View File

@ -440,9 +440,17 @@ static int _passive_init_user_prim_cb(struct osmo_prim_hdr *oph, void *ctx)
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 @@ void test_passive_init(void)
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 @@ void test_passive_init(void)
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);

View File

@ -36,6 +36,7 @@ User: UL len=31: 08 55 6d 94 4c 71 a1 a0 81 e7 ea d2 04 24 44 80 00 0e cd 82 b8
_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()