blob: 49701c1d02294e316b3494e14bbb6313a29f9ecc [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,
17 LCHAN_ST_WAIT_TS_READY,
18 LCHAN_ST_WAIT_ACTIV_ACK, /*< After RSL Chan Act Ack, lchan is active but RTP not configured. */
19 LCHAN_ST_WAIT_RLL_ESTABLISH,
20 LCHAN_ST_WAIT_MGW_ENDPOINT_AVAILABLE,
21 LCHAN_ST_WAIT_IPACC_CRCX_ACK,
22 LCHAN_ST_WAIT_IPACC_MDCX_ACK,
23 LCHAN_ST_WAIT_MGW_ENDPOINT_CONFIGURED,
24 LCHAN_ST_ESTABLISHED, /*< Active and RTP is fully configured. */
25 LCHAN_ST_WAIT_SAPIS_RELEASED,
26 LCHAN_ST_WAIT_BEFORE_RF_RELEASE,
27 LCHAN_ST_WAIT_RF_RELEASE_ACK,
28 LCHAN_ST_WAIT_AFTER_ERROR,
29 LCHAN_ST_BORKEN,
30};
31
32enum lchan_fsm_event {
33 LCHAN_EV_ACTIVATE,
34 LCHAN_EV_TS_READY,
35 LCHAN_EV_TS_ERROR,
36 LCHAN_EV_RSL_CHAN_ACTIV_ACK,
37 LCHAN_EV_RSL_CHAN_ACTIV_NACK,
38 LCHAN_EV_RLL_ESTABLISH_IND,
39 LCHAN_EV_MGW_ENDPOINT_AVAILABLE,
40 LCHAN_EV_MGW_ENDPOINT_CONFIGURED,
41 LCHAN_EV_MGW_ENDPOINT_ERROR,
42 LCHAN_EV_IPACC_CRCX_ACK,
43 LCHAN_EV_IPACC_CRCX_NACK,
44 LCHAN_EV_IPACC_MDCX_ACK,
45 LCHAN_EV_IPACC_MDCX_NACK,
46 LCHAN_EV_RLL_REL_IND,
47 LCHAN_EV_RLL_REL_CONF,
48 LCHAN_EV_RSL_RF_CHAN_REL_ACK,
49 LCHAN_EV_RLL_ERR_IND,
50
51 /* FIXME: not yet implemented: Chan Mode Modify, see assignment_fsm_start(). */
52 LCHAN_EV_CHAN_MODE_MODIF_ACK,
53 LCHAN_EV_CHAN_MODE_MODIF_ERROR,
54};
55
56void lchan_fsm_init();
57
58void lchan_fsm_alloc(struct gsm_lchan *lchan);
59void lchan_release(struct gsm_lchan *lchan, bool sacch_deact,
60 bool err, enum gsm48_rr_cause cause_rr);
61
62struct lchan_activate_info {
63 enum lchan_activate_mode activ_for;
64 struct gsm_subscriber_connection *for_conn;
65 /* This always is for a specific lchan, so its lchan->type indicates full or half rate.
66 * When a dyn TS was selected, the lchan->type has been set to the desired rate. */
67 enum gsm48_chan_mode chan_mode;
68 bool requires_voice_stream;
69 uint16_t msc_assigned_cic;
70 struct gsm_lchan *old_lchan;
71};
72
73void lchan_activate(struct gsm_lchan *lchan, struct lchan_activate_info *info);
74
75static inline const char *lchan_state_name(struct gsm_lchan *lchan)
76{
77 return lchan->fi ? osmo_fsm_inst_state_name(lchan->fi) : "NULL";
78}
79
80static inline bool lchan_state_is(struct gsm_lchan *lchan, uint32_t state)
81{
82 return (!lchan->fi && state == LCHAN_ST_UNUSED)
83 || (lchan->fi && lchan->fi->state == state);
84}
85
86bool lchan_may_receive_data(struct gsm_lchan *lchan);
87
88void lchan_forget_conn(struct gsm_lchan *lchan);
89void lchan_forget_mgw_endpoint(struct gsm_lchan *lchan);