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
|
#ifndef _GSM48_RR_H
#define _GSM48_RR_H
#include <osmocom/gsm/protocol/gsm_04_08.h>
#define GSM_TA_CM 55385
/* 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 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
/* 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 link_id;
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[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 timer_list t_starting; /* starting time for chan. access */
struct timer_list t_rel_wait; /* wait for L2 to transmit UA */
struct timer_list t3110;
struct timer_list t3122;
struct timer_list t3124;
struct timer_list t3126;
int t3126_value;
#ifndef TODO
struct 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 */
/* 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 timer_list t_meas;
struct gsm48_rr_meas meas;
uint8_t monitor;
};
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_decode_lai(struct gsm48_loc_area_id *lai, uint16_t *mcc,
uint16_t *mnc, uint16_t *lac);
int gsm48_encode_lai(struct gsm48_loc_area_id *lai, uint16_t mcc,
uint16_t mnc, uint16_t lac);
int gsm48_rr_enc_cm2(struct osmocom_ms *ms, struct gsm48_classmark2 *cm);
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);
#endif /* _GSM48_RR_H */
|