libosmo-gprs/include/osmocom/gprs/rlcmac/tbf_dl_ass_fsm.h

63 lines
2.5 KiB
C

/* DL TBF Assignment FSM, 3GPP TS 44.060 */
#pragma once
#include <stdint.h>
#include <stdbool.h>
#include <osmocom/core/fsm.h>
#include <osmocom/core/msgb.h>
#include <osmocom/gprs/rlcmac/csn1_defs.h>
#include <osmocom/gprs/rlcmac/rlcmac_private.h>
#include <osmocom/gprs/rlcmac/rlcmac_dec.h>
enum gprs_rlcmac_tbf_dl_ass_fsm_states {
GPRS_RLCMAC_TBF_DL_ASS_ST_IDLE = 0, /* new created TBF */
GPRS_RLCMAC_TBF_DL_ASS_ST_WAIT_TBF_STARTING_TIME, /* wait for Immediate Assignment */
GPRS_RLCMAC_TBF_DL_ASS_ST_COMPL, /* Completed, will update TBF and return to IDLE state */
};
struct gprs_rlcmac_tbf_dl_ass_fsm_ctx {
struct osmo_fsm_inst *fi;
struct gprs_rlcmac_entity *gre; /* backpointer */
struct gprs_rlcmac_dl_tbf_allocation alloc;
union {
IA_RestOctets_t iaro; /* CCCH Imm Ass rest octets */
RlcMacDownlink_t dl_block; /* PACCH pkt dl ass */
};
bool tbf_starting_time_exists;
uint32_t tbf_starting_time;
uint8_t ts_nr;
};
enum tbf_dl_ass_fsm_event {
GPRS_RLCMAC_TBF_DL_ASS_EV_RX_CCCH_IMM_ASS, /* Start Downlink/Uplink assignment from CCCH Imm Ass (data: strcut tbf_start_ev_rx_ccch_imm_ass_ctx) */
GPRS_RLCMAC_TBF_DL_ASS_EV_RX_PACCH_PKT_ASS, /* Start Downlink/Uplink assignment from Pkt Dl/Ul Ass (data: strcut tbf_start_ev_rx_pacch_pkt_ass_ctx) */
GPRS_RLCMAC_TBF_DL_ASS_EV_TBF_STARTING_TIME, /* TBF Starting Time reached */
};
struct tbf_start_ev_rx_ccch_imm_ass_ctx {
uint8_t ts_nr;
uint32_t fn;
const struct gsm48_imm_ass *ia;
const IA_RestOctets_t *iaro;
};
struct tbf_start_ev_rx_pacch_pkt_ass_ctx {
uint8_t ts_nr;
uint32_t fn;
const RlcMacDownlink_t *dl_block; /* decoded Pkt{Ul,Dl}Ass */
};
int gprs_rlcmac_tbf_dl_ass_fsm_init(void);
void gprs_rlcmac_tbf_dl_ass_fsm_set_log_cat(int logcat);
int gprs_rlcmac_tbf_dl_ass_fsm_constructor(struct gprs_rlcmac_tbf_dl_ass_fsm_ctx *ctx, struct gprs_rlcmac_entity *gre);
void gprs_rlcmac_tbf_dl_ass_fsm_destructor(struct gprs_rlcmac_tbf_dl_ass_fsm_ctx *ctx);
int gprs_rlcmac_tbf_start_from_ccch(struct gprs_rlcmac_tbf_dl_ass_fsm_ctx *ctx, const struct tbf_start_ev_rx_ccch_imm_ass_ctx *d);
int gprs_rlcmac_tbf_start_from_pacch(struct gprs_rlcmac_tbf_dl_ass_fsm_ctx *ctx, const struct tbf_start_ev_rx_pacch_pkt_ass_ctx *d);
bool gprs_rlcmac_tbf_start_pending(struct gprs_rlcmac_tbf_dl_ass_fsm_ctx *ctx);
void gprs_rlcmac_tbf_start_fn_tick(struct gprs_rlcmac_tbf_dl_ass_fsm_ctx *ctx, uint32_t fn, uint8_t ts_nr);
enum gprs_rlcmac_tbf_dl_ass_fsm_states gprs_rlcmac_tbf_start_state(const struct gprs_rlcmac_tbf_dl_ass_fsm_ctx *ctx);