blob: 9fe7db107b6a92ea3830f0894330f21f861c905d [file] [log] [blame]
Neels Hofmeyr31f525e2018-05-14 18:14:15 +02001/* osmo-bsc API to manage lchans, logical channels in GSM cells. */
2#pragma once
3
4#include <osmocom/bsc/gsm_data.h>
5#include <osmocom/bsc/debug.h>
6
7/* This macro automatically includes a final \n, if omitted. */
8#define LOG_LCHAN(lchan, level, fmt, args...) do { \
9 if (lchan->fi) \
10 LOGPFSML(lchan->fi, level, "(type=%s) " fmt, gsm_lchant_name(lchan->type), ## args); \
11 else \
12 LOGP(DRSL, level, "%s (not initialized) " fmt, gsm_lchan_name(lchan), ## args); \
13 } while(0)
14
15enum lchan_fsm_state {
16 LCHAN_ST_UNUSED,
Neels Hofmeyr526b4a52018-09-11 00:47:29 +020017 LCHAN_ST_CBCH, /*< Blocked by CBCH channel combination, not usable as SDCCH. */
Neels Hofmeyr31f525e2018-05-14 18:14:15 +020018 LCHAN_ST_WAIT_TS_READY,
19 LCHAN_ST_WAIT_ACTIV_ACK, /*< After RSL Chan Act Ack, lchan is active but RTP not configured. */
Neels Hofmeyrac85b342018-07-12 21:23:26 +020020 LCHAN_ST_WAIT_RLL_RTP_ESTABLISH,
Philipp Maier92eed412020-08-21 20:47:49 +020021 LCHAN_ST_WAIT_RR_CHAN_MODE_MODIFY_ACK,
22 LCHAN_ST_WAIT_RSL_CHAN_MODE_MODIFY_ACK,
Neels Hofmeyr31f525e2018-05-14 18:14:15 +020023 LCHAN_ST_ESTABLISHED, /*< Active and RTP is fully configured. */
Neels Hofmeyrac85b342018-07-12 21:23:26 +020024 LCHAN_ST_WAIT_RLL_RTP_RELEASED,
Neels Hofmeyr31f525e2018-05-14 18:14:15 +020025 LCHAN_ST_WAIT_BEFORE_RF_RELEASE,
26 LCHAN_ST_WAIT_RF_RELEASE_ACK,
27 LCHAN_ST_WAIT_AFTER_ERROR,
28 LCHAN_ST_BORKEN,
29};
30
31enum lchan_fsm_event {
32 LCHAN_EV_ACTIVATE,
33 LCHAN_EV_TS_READY,
34 LCHAN_EV_TS_ERROR,
35 LCHAN_EV_RSL_CHAN_ACTIV_ACK,
36 LCHAN_EV_RSL_CHAN_ACTIV_NACK,
37 LCHAN_EV_RLL_ESTABLISH_IND,
Neels Hofmeyrac85b342018-07-12 21:23:26 +020038 LCHAN_EV_RTP_READY,
39 LCHAN_EV_RTP_ERROR,
40 LCHAN_EV_RTP_RELEASED,
Neels Hofmeyr31f525e2018-05-14 18:14:15 +020041 LCHAN_EV_RLL_REL_IND,
42 LCHAN_EV_RLL_REL_CONF,
43 LCHAN_EV_RSL_RF_CHAN_REL_ACK,
44 LCHAN_EV_RLL_ERR_IND,
Philipp Maier92eed412020-08-21 20:47:49 +020045 LCHAN_EV_RR_CHAN_MODE_MODIFY_ACK,
46 LCHAN_EV_RR_CHAN_MODE_MODIFY_ERROR,
47 LCHAN_EV_RSL_CHAN_MODE_MODIFY_ACK,
48 LCHAN_EV_RSL_CHAN_MODE_MODIFY_NACK,
49 LCHAN_EV_REQUEST_MODE_MODIFY,
Neels Hofmeyr31f525e2018-05-14 18:14:15 +020050};
51
52void lchan_fsm_init();
53
54void lchan_fsm_alloc(struct gsm_lchan *lchan);
Neels Hofmeyr5b1a7d12018-11-06 22:24:07 +010055void lchan_release(struct gsm_lchan *lchan, bool do_rr_release,
Neels Hofmeyr31f525e2018-05-14 18:14:15 +020056 bool err, enum gsm48_rr_cause cause_rr);
57
Neels Hofmeyr31f525e2018-05-14 18:14:15 +020058void lchan_activate(struct gsm_lchan *lchan, struct lchan_activate_info *info);
Neels Hofmeyrac85b342018-07-12 21:23:26 +020059void lchan_ready_to_switch_rtp(struct gsm_lchan *lchan);
Neels Hofmeyr31f525e2018-05-14 18:14:15 +020060
61static inline const char *lchan_state_name(struct gsm_lchan *lchan)
62{
63 return lchan->fi ? osmo_fsm_inst_state_name(lchan->fi) : "NULL";
64}
65
66static inline bool lchan_state_is(struct gsm_lchan *lchan, uint32_t state)
67{
68 return (!lchan->fi && state == LCHAN_ST_UNUSED)
69 || (lchan->fi && lchan->fi->state == state);
70}
71
72bool lchan_may_receive_data(struct gsm_lchan *lchan);
73
74void lchan_forget_conn(struct gsm_lchan *lchan);
Neels Hofmeyrac85b342018-07-12 21:23:26 +020075
76void lchan_set_last_error(struct gsm_lchan *lchan, const char *fmt, ...);
Philipp Maiercc6d35d2020-08-21 22:40:23 +020077
78void lchan_fsm_skip_error(struct gsm_lchan *lchan);