summaryrefslogtreecommitdiffstats
path: root/src/host/layer23/include/osmocom/bb/mobile/gsm48_rr.h
blob: 6235bfdb9cc9d2dd3561f14a3dd6adfae31c9877 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
#ifndef _GSM48_RR_H
#define _GSM48_RR_H

#include <osmocom/gsm/protocol/gsm_04_08.h>

#define GSM_TA_CM			55385

#define	T200_DCCH			1	/* SDCCH/FACCH */
#define	T200_DCCH_SHARED		2	/* SDCCH shares SAPI 0 and 3 */
#define	T200_ACCH			2	/* SACCH SAPI 3 */


/* GSM 04.07 9.1.2 */
#define	GSM48_RR_EST_REQ		0x10
#define	GSM48_RR_EST_IND		0x12
#define	GSM48_RR_EST_CNF		0x11
#define	GSM48_RR_REL_IND		0x22
#define	GSM48_RR_SYNC_IND		0x32
#define	GSM48_RR_DATA_REQ		0x40
#define	GSM48_RR_DATA_IND		0x42
#define	GSM48_RR_UNIT_DATA_IND		0x52
#define	GSM48_RR_ABORT_REQ		0x60
#define	GSM48_RR_ABORT_IND		0x62
#define	GSM48_RR_ACT_REQ		0x70

#define RR_EST_CAUSE_EMERGENCY		1
#define RR_EST_CAUSE_REESTAB_TCH_F	2
#define RR_EST_CAUSE_REESTAB_TCH_H	3
#define RR_EST_CAUSE_REESTAB_2_TCH_H	4
#define RR_EST_CAUSE_ANS_PAG_ANY	5
#define RR_EST_CAUSE_ANS_PAG_SDCCH	6
#define RR_EST_CAUSE_ANS_PAG_TCH_F	7
#define RR_EST_CAUSE_ANS_PAG_TCH_ANY	8
#define RR_EST_CAUSE_ORIG_TCHF		9
#define RR_EST_CAUSE_LOC_UPD		12
#define RR_EST_CAUSE_OTHER_SDCCH	13

#define RR_REL_CAUSE_UNDEFINED		0
#define RR_REL_CAUSE_NORMAL		1
#define RR_REL_CAUSE_NOT_AUTHORIZED	2
#define RR_REL_CAUSE_RA_FAILURE		3
#define RR_REL_CAUSE_T3122		4
#define RR_REL_CAUSE_TRY_LATER		5
#define RR_REL_CAUSE_EMERGENCY_ONLY	6
#define RR_REL_CAUSE_LOST_SIGNAL	7
#define RR_REL_CAUSE_LINK_FAILURE	8

#define RR_SYNC_CAUSE_CIPHERING		1

#define L3_ALLOC_SIZE			256
#define L3_ALLOC_HEADROOM		64

#define RSL_ALLOC_SIZE			256
#define RSL_ALLOC_HEADROOM		64

#define RR_ALLOC_SIZE			256
#define RR_ALLOC_HEADROOM		64

/* GSM 04.08 RR-SAP header */
struct gsm48_rr_hdr {
	uint32_t		msg_type; /* RR-* primitive */
	uint8_t			sapi;
	uint8_t			cause;
};

/* GSM 04.07 9.1.1 */
#define GSM48_RR_ST_IDLE		0
#define GSM48_RR_ST_CONN_PEND		1
#define GSM48_RR_ST_DEDICATED		2
#define GSM48_RR_ST_REL_PEND		3

/* special states for SAPI 3 link */
#define GSM48_RR_SAPI3ST_IDLE		0
#define GSM48_RR_SAPI3ST_WAIT_EST	1
#define GSM48_RR_SAPI3ST_ESTAB		2
#define GSM48_RR_SAPI3ST_WAIT_REL	3

/* modify state */
#define GSM48_RR_MOD_NONE		0
#define GSM48_RR_MOD_IMM_ASS		1
#define GSM48_RR_MOD_ASSIGN		2
#define GSM48_RR_MOD_HANDO		3
#define GSM48_RR_MOD_ASSIGN_RESUME	4
#define GSM48_RR_MOD_HANDO_RESUME	5

/* channel description */
struct gsm48_rr_cd {
	uint8_t			tsc;
	uint8_t			h; /* using hopping */
	uint16_t		arfcn; /* dedicated mode */
	uint8_t			maio;
	uint8_t			hsn;
	uint8_t			chan_nr; /* type, slot, sub slot */
	uint8_t			ind_tx_power; /* last indicated power */
	uint8_t			ind_ta; /* last indicated ta */
	uint8_t			mob_alloc_lv[9]; /* len + up to 64 bits */
	uint8_t			freq_list_lv[131]; /* len + 130 octets */
	uint8_t			freq_seq_lv[10]; /* len + 9 octets */
	uint8_t			cell_desc_lv[17]; /* len + 16 octets */
	uint8_t			start; /* start time available */
	struct gsm_time		start_tm; /* start time */
	uint8_t			mode; /* mode of channel */
	uint8_t			cipher; /* ciphering of channel */
};

struct gsm48_cr_hist {
	uint8_t			valid;
	struct gsm48_req_ref	ref;
};

/* neighbor cell measurements */
struct gsm48_rr_meas {
	/* note: must be sorted by arfcn 1..1023,0 according to SI5* */
	uint8_t nc_num; /* number of measured cells (32 max) */
	int8_t nc_rxlev_dbm[32]; /* -128 = no value */
	uint8_t nc_bsic[32];
	uint16_t nc_arfcn[32];
};

/* RR sublayer instance */
struct gsm48_rrlayer {
	struct osmocom_ms	*ms;
	int			state;

	/* queue for RSL-SAP message upwards */
	struct llist_head	rsl_upqueue;

	/* queue for messages while RR connection is built up */
	struct llist_head       downqueue;

	/* timers */
	struct osmo_timer_list	t_starting; /* starting time for chan. access */
	struct osmo_timer_list	t_rel_wait; /* wait for L2 to transmit UA */
	struct osmo_timer_list	t3110;
	struct osmo_timer_list	t3122;
	struct osmo_timer_list	t3124;
	struct osmo_timer_list	t3126;
	int			t3126_value;
#ifndef TODO
	struct osmo_timer_list	temp_rach_ti; /* temporary timer */
#endif

	/* states if RR-EST-REQ was used */
	uint8_t			rr_est_req;
	struct msgb		*rr_est_msg;
	uint8_t			est_cause; /* cause used for establishment */
	uint8_t			paging_mi_type; /* how did we got paged? */

	/* channel request states */
	uint8_t			wait_assign; /* waiting for assignment state */
	uint8_t			n_chan_req; /* number left, incl. current */
	uint8_t			chan_req_val; /* current request value */ 
	uint8_t			chan_req_mask; /* mask of random bits */

	/* state of dedicated mdoe */
	uint8_t			dm_est;

	/* cr_hist */
	uint8_t			cr_ra; /* stores requested ra until confirmed */
	struct gsm48_cr_hist	cr_hist[3];

	/* V(SD) sequence numbers */
	uint16_t		v_sd; /* 16 PD 1-bit sequence numbers packed */

	/* current channel descriptions */
	struct gsm48_rr_cd	cd_now;

	/* current cipering */
	uint8_t			cipher_on;
	uint8_t			cipher_type; /* 10.5.2.9 */

	/* special states when assigning channel */
	uint8_t			modify_state;
	uint8_t			hando_sync_ind, hando_rot, hando_nci, hando_act;
	struct gsm48_rr_cd	cd_last; /* store last cd in case of failure */
	struct gsm48_rr_cd	cd_before; /* before start time */
	struct gsm48_rr_cd	cd_after; /* after start time */

	/* BA range */
	uint8_t			ba_ranges;
	uint32_t		ba_range[16];

	/* measurements */
	struct osmo_timer_list	t_meas;
	struct gsm48_rr_meas	meas;
	uint8_t			monitor;

	/* audio flow */
	uint8_t                 audio_mode;

	/* sapi 3 */
	uint8_t			sapi3_state;
	uint8_t			sapi3_link_id;
};

const char *get_rr_name(int value);
extern int gsm48_rr_init(struct osmocom_ms *ms);
extern int gsm48_rr_exit(struct osmocom_ms *ms);
int gsm48_rsl_dequeue(struct osmocom_ms *ms);
int gsm48_rr_downmsg(struct osmocom_ms *ms, struct msgb *msg);
struct msgb *gsm48_l3_msgb_alloc(void);
struct msgb *gsm48_rr_msgb_alloc(int msg_type);
int gsm48_rr_enc_cm2(struct osmocom_ms *ms, struct gsm48_classmark2 *cm,
	uint16_t arfcn);
int gsm48_rr_tx_rand_acc(struct osmocom_ms *ms, struct msgb *msg);
int gsm48_rr_los(struct osmocom_ms *ms);
int gsm48_rr_rach_conf(struct osmocom_ms *ms, uint32_t fn);
extern const char *gsm48_rr_state_names[];
int gsm48_rr_start_monitor(struct osmocom_ms *ms);
int gsm48_rr_stop_monitor(struct osmocom_ms *ms);
int gsm48_rr_alter_delay(struct osmocom_ms *ms);
int gsm48_rr_tx_voice(struct osmocom_ms *ms, struct msgb *msg);
int gsm48_rr_audio_mode(struct osmocom_ms *ms, uint8_t mode);

#endif /* _GSM48_RR_H */