blob: 7f437e379798674131cb7967338fa06b1da8c2c8 [file] [log] [blame]
Holger Hans Peter Freyther67ed34e2013-10-17 17:01:54 +02001/* bts.h
2 *
3 * Copyright (C) 2012 Ivan Klyuchnikov
4 * Copyright (C) 2013 by Holger Hans Peter Freyther
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 */
20
21#pragma once
22
Pau Espin Pedrol2182e622021-01-14 16:48:38 +010023#include <pdch.h>
24#include <stdint.h>
25#include <stdbool.h>
Holger Hans Peter Freyther67ed34e2013-10-17 17:01:54 +020026
27#ifdef __cplusplus
28extern "C" {
Alexander Couzens5012e072020-12-06 01:23:51 +010029#endif
Holger Hans Peter Freyther67ed34e2013-10-17 17:01:54 +020030#include <osmocom/core/linuxlist.h>
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +010031#include <osmocom/core/rate_ctr.h>
Jacob Erlbeckf5898a02015-11-27 19:05:13 +010032#include <osmocom/core/stat_item.h>
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +020033#include <osmocom/core/tdef.h>
Alexander Couzens5012e072020-12-06 01:23:51 +010034#include <osmocom/gprs/gprs_ns2.h>
bhargava959d1de2016-08-17 15:17:21 +053035#include <osmocom/gsm/l1sap.h>
Max84bf0fa2017-09-01 11:02:40 +020036#include <osmocom/gsm/protocol/gsm_04_08.h>
Vadim Yanitskiycb988942020-11-08 13:27:35 +070037#include <osmocom/gsm/gsm48.h>
Pau Espin Pedrolb2653fe2020-03-26 15:14:01 +010038#include "mslot_class.h"
39#include "gsm_rlcmac.h"
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +010040#include "gprs_pcu.h"
Alexander Couzens5012e072020-12-06 01:23:51 +010041#ifdef __cplusplus
Holger Hans Peter Freyther67ed34e2013-10-17 17:01:54 +020042}
Alexander Couzens5012e072020-12-06 01:23:51 +010043#endif
Holger Hans Peter Freytherb78adcd2013-10-17 20:12:37 +020044
Holger Hans Peter Freyther34bd8bd2013-10-19 21:10:38 +020045#include "tbf.h"
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +020046#include "coding_scheme.h"
Holger Hans Peter Freyther67ed34e2013-10-17 17:01:54 +020047
Jacob Erlbecke2e004e2015-06-18 17:16:26 +020048struct GprsMs;
Pau Espin Pedrol2182e622021-01-14 16:48:38 +010049struct gprs_rlcmac_bts;
Holger Hans Peter Freyther67ed34e2013-10-17 17:01:54 +020050
Holger Hans Peter Freyther67ed34e2013-10-17 17:01:54 +020051struct gprs_rlcmac_trx {
52 void *fl1h;
53 uint16_t arfcn;
54 struct gprs_rlcmac_pdch pdch[8];
Holger Hans Peter Freyther4ed1dae2013-10-20 10:14:03 +020055
56 /* back pointers */
Pau Espin Pedrol2182e622021-01-14 16:48:38 +010057 struct gprs_rlcmac_bts *bts;
Holger Hans Peter Freyther4ed1dae2013-10-20 10:14:03 +020058 uint8_t trx_no;
Jacob Erlbeck23f93a12015-06-30 08:52:54 +020059
Holger Hans Peter Freyther67ed34e2013-10-17 17:01:54 +020060};
61
Pau Espin Pedrol2182e622021-01-14 16:48:38 +010062
Maxd71e8b32016-09-19 16:17:06 +020063#ifdef __cplusplus
64extern "C" {
65#endif
Pau Espin Pedrolda971ee2020-12-16 15:59:45 +010066void bts_trx_reserve_slots(struct gprs_rlcmac_trx *trx, enum gprs_rlcmac_tbf_direction dir, uint8_t slots);
67void bts_trx_unreserve_slots(struct gprs_rlcmac_trx *trx, enum gprs_rlcmac_tbf_direction dir, uint8_t slots);
Pau Espin Pedrol906aafc2021-01-18 17:53:29 +010068void bts_trx_free_all_tbf(struct gprs_rlcmac_trx *trx);
Pau Espin Pedrolda971ee2020-12-16 15:59:45 +010069
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +010070void bts_update_tbf_ta(struct gprs_rlcmac_bts *bts, const char *p, uint32_t fn,
71 uint8_t trx_no, uint8_t ts, int8_t ta, bool is_rach);
Maxd71e8b32016-09-19 16:17:06 +020072#ifdef __cplusplus
73}
74#endif
75
Maxe9fe0e32017-09-28 15:56:05 +020076
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +020077
Pau Espin Pedrol2338e532020-05-12 20:54:35 +020078enum {
79 CTR_TBF_DL_ALLOCATED,
80 CTR_TBF_DL_FREED,
81 CTR_TBF_DL_ABORTED,
82 CTR_TBF_UL_ALLOCATED,
83 CTR_TBF_UL_FREED,
84 CTR_TBF_UL_ABORTED,
85 CTR_TBF_REUSED,
86 CTR_TBF_ALLOC_ALGO_A,
87 CTR_TBF_ALLOC_ALGO_B,
Pau Espin Pedrol2338e532020-05-12 20:54:35 +020088 CTR_RLC_SENT,
89 CTR_RLC_RESENT,
90 CTR_RLC_RESTARTED,
91 CTR_RLC_STALLED,
92 CTR_RLC_NACKED,
93 CTR_RLC_FINAL_BLOCK_RESENT,
94 CTR_RLC_ASS_TIMEDOUT,
95 CTR_RLC_ASS_FAILED,
96 CTR_RLC_ACK_TIMEDOUT,
97 CTR_RLC_ACK_FAILED,
98 CTR_RLC_REL_TIMEDOUT,
99 CTR_RLC_LATE_BLOCK,
100 CTR_RLC_SENT_DUMMY,
101 CTR_RLC_SENT_CONTROL,
102 CTR_RLC_DL_BYTES,
103 CTR_RLC_DL_PAYLOAD_BYTES,
104 CTR_RLC_UL_BYTES,
105 CTR_RLC_UL_PAYLOAD_BYTES,
106 CTR_DECODE_ERRORS,
107 CTR_SBA_ALLOCATED,
108 CTR_SBA_FREED,
109 CTR_SBA_TIMEDOUT,
110 CTR_LLC_FRAME_TIMEDOUT,
111 CTR_LLC_FRAME_DROPPED,
112 CTR_LLC_FRAME_SCHED,
113 CTR_LLC_DL_BYTES,
114 CTR_LLC_UL_BYTES,
115 CTR_RACH_REQUESTS,
116 CTR_11BIT_RACH_REQUESTS,
117 CTR_SPB_UL_FIRST_SEGMENT,
118 CTR_SPB_UL_SECOND_SEGMENT,
119 CTR_SPB_DL_FIRST_SEGMENT,
120 CTR_SPB_DL_SECOND_SEGMENT,
121 CTR_IMMEDIATE_ASSIGN_UL_TBF,
122 CTR_IMMEDIATE_ASSIGN_REJ,
123 CTR_IMMEDIATE_ASSIGN_DL_TBF,
124 CTR_CHANNEL_REQUEST_DESCRIPTION,
125 CTR_PKT_UL_ASSIGNMENT,
126 CTR_PKT_ACCESS_REJ,
127 CTR_PKT_DL_ASSIGNMENT,
128 CTR_RLC_RECV_CONTROL,
129 CTR_PUA_POLL_TIMEDOUT,
130 CTR_PUA_POLL_FAILED,
131 CTR_PDA_POLL_TIMEDOUT,
132 CTR_PDA_POLL_FAILED,
133 CTR_PUAN_POLL_TIMEDOUT,
134 CTR_PUAN_POLL_FAILED,
135 CTR_PDAN_POLL_TIMEDOUT,
136 CTR_PDAN_POLL_FAILED,
137 CTR_GPRS_DL_CS1,
138 CTR_GPRS_DL_CS2,
139 CTR_GPRS_DL_CS3,
140 CTR_GPRS_DL_CS4,
141 CTR_EGPRS_DL_MCS1,
142 CTR_EGPRS_DL_MCS2,
143 CTR_EGPRS_DL_MCS3,
144 CTR_EGPRS_DL_MCS4,
145 CTR_EGPRS_DL_MCS5,
146 CTR_EGPRS_DL_MCS6,
147 CTR_EGPRS_DL_MCS7,
148 CTR_EGPRS_DL_MCS8,
149 CTR_EGPRS_DL_MCS9,
150 CTR_GPRS_UL_CS1,
151 CTR_GPRS_UL_CS2,
152 CTR_GPRS_UL_CS3,
153 CTR_GPRS_UL_CS4,
154 CTR_EGPRS_UL_MCS1,
155 CTR_EGPRS_UL_MCS2,
156 CTR_EGPRS_UL_MCS3,
157 CTR_EGPRS_UL_MCS4,
158 CTR_EGPRS_UL_MCS5,
159 CTR_EGPRS_UL_MCS6,
160 CTR_EGPRS_UL_MCS7,
161 CTR_EGPRS_UL_MCS8,
162 CTR_EGPRS_UL_MCS9,
163};
164
Pau Espin Pedrol97e88fd2020-05-12 22:45:04 +0200165enum {
166 STAT_MS_PRESENT,
167};
168
Vadim Yanitskiya0a0b7f2020-05-21 19:55:46 +0700169/* RACH.ind parameters (to be parsed) */
170struct rach_ind_params {
171 enum ph_burst_type burst_type;
172 bool is_11bit;
173 uint16_t ra;
174 uint8_t trx_nr;
175 uint8_t ts_nr;
176 uint32_t rfn;
177 int16_t qta;
178};
179
180/* [EGPRS Packet] Channel Request parameters (parsed) */
181struct chan_req_params {
182 unsigned int egprs_mslot_class;
183 unsigned int priority;
184 bool single_block;
185};
186
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100187struct PollController;
188struct SBAController;
189struct GprsMsStorage;
190struct pcu_l1_meas;
191
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200192/**
193 * I represent a GSM BTS. I have one or more TRX, I know the current
194 * GSM time and I have controllers that help with allocating resources
195 * on my TRXs.
196 */
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100197struct gprs_rlcmac_bts {
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +0100198 uint8_t nr; /* bts_nr */
199 struct llist_head list; /* queued in pcu->bts_list */
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100200 bool active;
Pau Espin Pedrol2e6b60d2021-01-20 13:48:31 +0100201 struct osmo_cell_global_id_ps cgi_ps;
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100202 uint8_t bsic;
203 uint8_t cs_mask; /* Allowed CS mask from BTS */
204 uint16_t mcs_mask; /* Allowed MCS mask from BTS */
205 struct { /* information stored from last received PCUIF info_ind message */
206 uint8_t initial_cs;
207 uint8_t initial_mcs;
208 } pcuif_info_ind;
209 uint8_t initial_cs_dl, initial_cs_ul;
210 uint8_t initial_mcs_dl, initial_mcs_ul;
211 /* Timer defintions */
212 struct osmo_tdef *T_defs_bts; /* timers controlled by BTS, received through PCUIF */
213 uint8_t n3101;
214 uint8_t n3103;
215 uint8_t n3105;
216 struct gprs_rlcmac_trx trx[8];
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200217
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100218 uint8_t si13[GSM_MACBLOCK_LEN];
219 bool si13_is_set;
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200220
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100221 /* State for dynamic algorithm selection */
222 int multislot_disabled;
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200223
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100224 /* Packet Application Information (3GPP TS 44.060 11.2.47, usually ETWS primary message). We don't need to store
225 * more than one message, because they get sent so rarely. */
226 struct msgb *app_info;
227 uint32_t app_info_pending; /* Count of MS with active TBF, to which we did not send app_info yet */
Holger Hans Peter Freyther9b30c7f2013-10-17 19:59:56 +0200228
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100229 /* main nsei */
230 struct gprs_ns2_nse *nse;
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100231
232 /* back pointer to PCU object */
233 struct gprs_pcu *pcu;
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100234
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100235 int cur_fn;
236 int cur_blk_fn;
237 uint8_t max_cs_dl, max_cs_ul;
238 uint8_t max_mcs_dl, max_mcs_ul;
239 struct PollController *pollController;
240 struct SBAController *sba;
241 struct rate_ctr_group *ratectrs;
242 struct osmo_stat_item_group *statg;
Holger Hans Peter Freytherb78adcd2013-10-17 20:12:37 +0200243
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100244 struct GprsMsStorage *ms_store;
Jacob Erlbecke43460b2015-05-13 13:33:12 +0200245
Jacob Erlbecked2dbf62015-12-28 19:15:40 +0100246 /* list of uplink TBFs */
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100247 struct llist_head ul_tbfs; /* list of gprs_rlcmac_tbf */
Jacob Erlbecked2dbf62015-12-28 19:15:40 +0100248 /* list of downlink TBFs */
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100249 struct llist_head dl_tbfs; /* list of gprs_rlcmac_tbf */
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200250};
Holger Hans Peter Freyther9b30c7f2013-10-17 19:59:56 +0200251
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200252#ifdef __cplusplus
253extern "C" {
254#endif
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100255
256struct GprsMs *bts_alloc_ms(struct gprs_rlcmac_bts *bts, uint8_t ms_class, uint8_t egprs_ms_class);
257int bts_add_paging(struct gprs_rlcmac_bts *bts, uint8_t chan_needed, const struct osmo_mobile_identity *mi);
258
259uint32_t bts_rfn_to_fn(const struct gprs_rlcmac_bts *bts, int32_t rfn);
260
261struct gprs_rlcmac_dl_tbf *bts_dl_tbf_by_poll_fn(struct gprs_rlcmac_bts *bts, uint32_t fn, uint8_t trx, uint8_t ts);
262struct gprs_rlcmac_ul_tbf *bts_ul_tbf_by_poll_fn(struct gprs_rlcmac_bts *bts, uint32_t fn, uint8_t trx, uint8_t ts);
263struct gprs_rlcmac_dl_tbf *bts_dl_tbf_by_tfi(struct gprs_rlcmac_bts *bts, uint8_t tfi, uint8_t trx, uint8_t ts);
264struct gprs_rlcmac_ul_tbf *bts_ul_tbf_by_tfi(struct gprs_rlcmac_bts *bts, uint8_t tfi, uint8_t trx, uint8_t ts);
265
266void bts_snd_dl_ass(struct gprs_rlcmac_bts *bts, struct gprs_rlcmac_tbf *tbf, bool poll, uint16_t pgroup);
267
268/** TODO: change the number to unsigned */
269void bts_set_current_frame_number(struct gprs_rlcmac_bts *bts, int frame_number);
270void bts_set_current_block_frame_number(struct gprs_rlcmac_bts *bts, int frame_number, unsigned max_delay);
271static inline int bts_current_frame_number(const struct gprs_rlcmac_bts *bts)
272{
273 return bts->cur_fn;
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200274}
Holger Hans Peter Freyther17b0d832013-10-19 17:37:48 +0200275
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100276int bts_tfi_find_free(const struct gprs_rlcmac_bts *bts, enum gprs_rlcmac_tbf_direction dir,
277 uint8_t *_trx, int8_t use_trx);
278
279int bts_rcv_rach(struct gprs_rlcmac_bts *bts, const struct rach_ind_params *rip);
280int bts_rcv_ptcch_rach(struct gprs_rlcmac_bts *bts, const struct rach_ind_params *rip);
281int bts_rcv_imm_ass_cnf(struct gprs_rlcmac_bts *bts, const uint8_t *data, uint32_t fn);
282
283void bts_send_gsmtap(struct gprs_rlcmac_bts *bts,
284 enum pcu_gsmtap_category categ, bool uplink, uint8_t trx_no,
285 uint8_t ts_no, uint8_t channel, uint32_t fn,
286 const uint8_t *data, unsigned int len);
287void bts_send_gsmtap_meas(struct gprs_rlcmac_bts *bts,
288 enum pcu_gsmtap_category categ, bool uplink, uint8_t trx_no,
289 uint8_t ts_no, uint8_t channel, uint32_t fn,
290 const uint8_t *data, unsigned int len, struct pcu_l1_meas *meas);
291void bts_send_gsmtap_rach(struct gprs_rlcmac_bts *bts,
292 enum pcu_gsmtap_category categ, uint8_t channel,
293 const struct rach_ind_params *rip);
294
295struct SBAController *bts_sba(struct gprs_rlcmac_bts *bts);
296
297struct GprsMsStorage *bts_ms_store(struct gprs_rlcmac_bts *bts);
298
299struct GprsMs *bts_ms_by_tlli(struct gprs_rlcmac_bts *bts, uint32_t tlli, uint32_t old_tlli);
300
301static inline struct rate_ctr_group *bts_rate_counters(struct gprs_rlcmac_bts *bts)
302{
303 return bts->ratectrs;
304}
305
306static inline struct osmo_stat_item_group *bts_stat_items(struct gprs_rlcmac_bts *bts)
307{
308 return bts->statg;
309}
310
311static inline void bts_do_rate_ctr_inc(struct gprs_rlcmac_bts *bts, unsigned int ctr_id) {
312 rate_ctr_inc(&bts->ratectrs->ctr[ctr_id]);
313}
314
315static inline void bts_do_rate_ctr_add(struct gprs_rlcmac_bts *bts, unsigned int ctr_id, int inc) {
316 rate_ctr_add(&bts->ratectrs->ctr[ctr_id], inc);
317}
318
319static inline void bts_stat_item_add(struct gprs_rlcmac_bts *bts, unsigned int stat_id, int inc) {
320 int32_t val = osmo_stat_item_get_last(bts->statg->items[stat_id]);
321 osmo_stat_item_set(bts->statg->items[stat_id], val + inc);
322}
323
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +0100324struct gprs_rlcmac_bts *bts_alloc(struct gprs_pcu *pcu, uint8_t bts_nr);
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100325
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100326void bts_recalc_initial_cs(struct gprs_rlcmac_bts *bts);
327void bts_recalc_initial_mcs(struct gprs_rlcmac_bts *bts);
328void bts_recalc_max_cs(struct gprs_rlcmac_bts *bts);
329void bts_recalc_max_mcs(struct gprs_rlcmac_bts *bts);
330struct GprsMs *bts_ms_by_imsi(struct gprs_rlcmac_bts *bts, const char *imsi);
331uint8_t bts_max_cs_dl(const struct gprs_rlcmac_bts *bts);
332uint8_t bts_max_cs_ul(const struct gprs_rlcmac_bts *bts);
333uint8_t bts_max_mcs_dl(const struct gprs_rlcmac_bts *bts);
334uint8_t bts_max_mcs_ul(const struct gprs_rlcmac_bts *bts);
335void bts_set_max_cs_dl(struct gprs_rlcmac_bts *bts, uint8_t cs_dl);
336void bts_set_max_cs_ul(struct gprs_rlcmac_bts *bts, uint8_t cs_ul);
337void bts_set_max_mcs_dl(struct gprs_rlcmac_bts *bts, uint8_t mcs_dl);
338void bts_set_max_mcs_ul(struct gprs_rlcmac_bts *bts, uint8_t mcs_ul);
339bool bts_cs_dl_is_supported(const struct gprs_rlcmac_bts *bts, enum CodingScheme cs);
340#ifdef __cplusplus
341}
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200342#endif