#pragma once #include #include #include /*********************************************************************** * Primitives towards the lower layers (typically RTP transport) ***********************************************************************/ enum osmo_iuup_tnl_prim_type { OSMO_IUUP_TNL_UNITDATA, }; struct osmo_iuup_tnl_prim { struct osmo_prim_hdr oph; }; /*********************************************************************** * Primitives towards the upper layers at the RNL SAP ***********************************************************************/ /* 3GPP TS 25.415 Section 7.2.1 */ enum osmo_iuup_rnl_prim_type { OSMO_IUUP_RNL_CONFIG, OSMO_IUUP_RNL_DATA, OSMO_IUUP_RNL_STATUS, OSMO_IUUP_RNL_UNIT_DATA, }; /* TS 25.413 9.2.1.3*/ #define IUUP_MAX_SUBFLOWS 7 #define IUUP_MAX_RFCIS 64 #define IUUP_TIMER_INIT_T_DEFAULT 1000 #define IUUP_TIMER_TA_T_DEFAULT 500 #define IUUP_TIMER_RC_T_DEFAULT 500 #define IUUP_TIMER_INIT_N_DEFAULT 3 #define IUUP_TIMER_TA_N_DEFAULT 1 #define IUUP_TIMER_RC_N_DEFAULT 1 struct osmo_iuup_rnl_config_timer { uint32_t t_ms; /* time in ms */ uint32_t n_max; /* max number of repetitions */ }; struct osmo_iuup_rfci { uint8_t used:1, spare1:1, id:6; uint8_t spare2:4, IPTI:4; /* values range 0-15, 4 bits */; uint16_t subflow_sizes[IUUP_MAX_SUBFLOWS]; }; struct osmo_iuup_rnl_config { /* transparent (true) or SMpSDU (false): */ bool transparent; /* should we actively transmit INIT in SmpSDU mode? */ bool active; /* Currently Version 0 or 1: */ uint8_t data_pdu_type; /* Supported mode versions */ uint16_t supported_versions_mask; uint8_t num_rfci; uint8_t num_subflows; bool IPTIs_present; struct osmo_iuup_rfci rfci[IUUP_MAX_RFCIS]; /* TODO: Indication of delivery of erroneous SDUs*/ struct osmo_iuup_rnl_config_timer t_init; struct osmo_iuup_rnl_config_timer t_ta; struct osmo_iuup_rnl_config_timer t_rc; }; struct osmo_iuup_rnl_data { uint8_t rfci; uint8_t frame_nr; uint8_t fqc; }; struct osmo_iuup_rnl_status { enum iuup_procedure procedure; union { struct { enum iuup_error_cause cause; enum iuup_error_distance distance; } error_event; struct { uint16_t mode_version; uint8_t data_pdu_type; uint8_t num_rfci; uint8_t num_subflows; bool IPTIs_present; struct osmo_iuup_rfci rfci[IUUP_MAX_RFCIS]; } initialization; struct { } rate_control; struct { } time_alignment; } u; }; /* SAP on the upper side of IuUP, towards the user */ struct osmo_iuup_rnl_prim { struct osmo_prim_hdr oph; union { struct osmo_iuup_rnl_config config; struct osmo_iuup_rnl_data data; struct osmo_iuup_rnl_status status; //struct osmo_iuup_rnl_unitdata unitdata; } u; }; struct osmo_iuup_instance; struct osmo_iuup_instance *osmo_iuup_instance_alloc(void *ctx, const char *id); void osmo_iuup_instance_free(struct osmo_iuup_instance *iui); void osmo_iuup_instance_set_user_prim_cb(struct osmo_iuup_instance *iui, osmo_prim_cb func, void *priv); void osmo_iuup_instance_set_transport_prim_cb(struct osmo_iuup_instance *iui, osmo_prim_cb func, void *priv); int osmo_iuup_tnl_prim_up(struct osmo_iuup_instance *iui, struct osmo_iuup_tnl_prim *itp); int osmo_iuup_rnl_prim_down(struct osmo_iuup_instance *inst, struct osmo_iuup_rnl_prim *irp); int osmo_iuup_compute_header_crc(const uint8_t *iuup_pdu, unsigned int pdu_len); int osmo_iuup_compute_payload_crc(const uint8_t *iuup_pdu, unsigned int pdu_len); struct osmo_iuup_rnl_prim *osmo_iuup_rnl_prim_alloc(void *ctx, unsigned int primitive, unsigned int operation, unsigned int size); struct osmo_iuup_tnl_prim *osmo_iuup_tnl_prim_alloc(void *ctx, unsigned int primitive, unsigned int operation, unsigned int size);