blob: 085b4486c900ed98b09457dd13f35256bb863346 [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
Pau Espin Pedrolc0a250d2021-01-21 18:46:13 +01005 * Copyright (C) 2021 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de
Holger Hans Peter Freyther67ed34e2013-10-17 17:01:54 +02006 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
Holger Hans Peter Freyther67ed34e2013-10-17 17:01:54 +020016 */
17
18#pragma once
19
Pau Espin Pedrol2182e622021-01-14 16:48:38 +010020#include <pdch.h>
21#include <stdint.h>
22#include <stdbool.h>
Holger Hans Peter Freyther67ed34e2013-10-17 17:01:54 +020023
24#ifdef __cplusplus
25extern "C" {
Alexander Couzens5012e072020-12-06 01:23:51 +010026#endif
Holger Hans Peter Freyther67ed34e2013-10-17 17:01:54 +020027#include <osmocom/core/linuxlist.h>
Holger Hans Peter Freytherf5372982013-10-27 09:02:31 +010028#include <osmocom/core/rate_ctr.h>
Jacob Erlbeckf5898a02015-11-27 19:05:13 +010029#include <osmocom/core/stat_item.h>
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +020030#include <osmocom/core/tdef.h>
Pau Espin Pedrol0dcbc072021-11-10 19:09:10 +010031#include <osmocom/core/time_cc.h>
Alexander Couzens5012e072020-12-06 01:23:51 +010032#include <osmocom/gprs/gprs_ns2.h>
bhargava959d1de2016-08-17 15:17:21 +053033#include <osmocom/gsm/l1sap.h>
Max84bf0fa2017-09-01 11:02:40 +020034#include <osmocom/gsm/protocol/gsm_04_08.h>
Pau Espin Pedrolfe8de452021-02-09 18:47:34 +010035#include <osmocom/gsm/gsm48_rest_octets.h>
Vadim Yanitskiycb988942020-11-08 13:27:35 +070036#include <osmocom/gsm/gsm48.h>
Pau Espin Pedrolb2653fe2020-03-26 15:14:01 +010037#include "mslot_class.h"
38#include "gsm_rlcmac.h"
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +010039#include "gprs_pcu.h"
Alexander Couzens5012e072020-12-06 01:23:51 +010040#ifdef __cplusplus
Holger Hans Peter Freyther67ed34e2013-10-17 17:01:54 +020041}
Alexander Couzens5012e072020-12-06 01:23:51 +010042#endif
Holger Hans Peter Freytherb78adcd2013-10-17 20:12:37 +020043
Holger Hans Peter Freyther34bd8bd2013-10-19 21:10:38 +020044#include "tbf.h"
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +020045#include "coding_scheme.h"
Holger Hans Peter Freyther67ed34e2013-10-17 17:01:54 +020046
Jacob Erlbecke2e004e2015-06-18 17:16:26 +020047struct GprsMs;
Pau Espin Pedrol2182e622021-01-14 16:48:38 +010048struct gprs_rlcmac_bts;
Holger Hans Peter Freyther67ed34e2013-10-17 17:01:54 +020049
Holger Hans Peter Freyther67ed34e2013-10-17 17:01:54 +020050struct gprs_rlcmac_trx {
51 void *fl1h;
52 uint16_t arfcn;
53 struct gprs_rlcmac_pdch pdch[8];
Holger Hans Peter Freyther4ed1dae2013-10-20 10:14:03 +020054
55 /* back pointers */
Pau Espin Pedrol2182e622021-01-14 16:48:38 +010056 struct gprs_rlcmac_bts *bts;
Holger Hans Peter Freyther4ed1dae2013-10-20 10:14:03 +020057 uint8_t trx_no;
Jacob Erlbeck23f93a12015-06-30 08:52:54 +020058
Pau Espin Pedrol1a1557a2021-05-13 18:39:36 +020059 /* list of uplink TBFs */
60 struct llist_head ul_tbfs; /* list of gprs_rlcmac_tbf */
61 /* list of downlink TBFs */
62 struct llist_head dl_tbfs; /* list of gprs_rlcmac_tbf */
63
Holger Hans Peter Freyther67ed34e2013-10-17 17:01:54 +020064};
65
Pau Espin Pedrol2182e622021-01-14 16:48:38 +010066
Maxd71e8b32016-09-19 16:17:06 +020067#ifdef __cplusplus
68extern "C" {
69#endif
Pau Espin Pedrol702ebee2021-03-08 14:15:54 +010070void bts_trx_init(struct gprs_rlcmac_trx *trx, struct gprs_rlcmac_bts *bts, uint8_t trx_no);
Pau Espin Pedrolda971ee2020-12-16 15:59:45 +010071void bts_trx_reserve_slots(struct gprs_rlcmac_trx *trx, enum gprs_rlcmac_tbf_direction dir, uint8_t slots);
72void 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 +010073void bts_trx_free_all_tbf(struct gprs_rlcmac_trx *trx);
Pau Espin Pedrolda971ee2020-12-16 15:59:45 +010074
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +010075void bts_update_tbf_ta(struct gprs_rlcmac_bts *bts, const char *p, uint32_t fn,
76 uint8_t trx_no, uint8_t ts, int8_t ta, bool is_rach);
Maxd71e8b32016-09-19 16:17:06 +020077#ifdef __cplusplus
78}
79#endif
80
Maxe9fe0e32017-09-28 15:56:05 +020081
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +020082
Pau Espin Pedrol2338e532020-05-12 20:54:35 +020083enum {
Pau Espin Pedrol0dcbc072021-11-10 19:09:10 +010084 CTR_PDCH_ALL_ALLOCATED,
Pau Espin Pedrol2338e532020-05-12 20:54:35 +020085 CTR_TBF_DL_ALLOCATED,
86 CTR_TBF_DL_FREED,
87 CTR_TBF_DL_ABORTED,
88 CTR_TBF_UL_ALLOCATED,
89 CTR_TBF_UL_FREED,
90 CTR_TBF_UL_ABORTED,
91 CTR_TBF_REUSED,
92 CTR_TBF_ALLOC_ALGO_A,
93 CTR_TBF_ALLOC_ALGO_B,
Pau Espin Pedrol4e1c9ad2021-02-25 17:21:32 +010094 CTR_TBF_ALLOC_FAIL,
Pau Espin Pedrol9688dc92021-02-25 18:30:33 +010095 CTR_TBF_ALLOC_FAIL_NO_TFI,
96 CTR_TBF_ALLOC_FAIL_NO_USF,
97 CTR_TBF_ALLOC_FAIL_NO_SLOT_COMBI,
98 CTR_TBF_ALLOC_FAIL_NO_SLOT_AVAIL,
Pau Espin Pedrol2338e532020-05-12 20:54:35 +020099 CTR_RLC_SENT,
100 CTR_RLC_RESENT,
101 CTR_RLC_RESTARTED,
102 CTR_RLC_STALLED,
103 CTR_RLC_NACKED,
104 CTR_RLC_FINAL_BLOCK_RESENT,
105 CTR_RLC_ASS_TIMEDOUT,
106 CTR_RLC_ASS_FAILED,
107 CTR_RLC_ACK_TIMEDOUT,
108 CTR_RLC_ACK_FAILED,
109 CTR_RLC_REL_TIMEDOUT,
110 CTR_RLC_LATE_BLOCK,
111 CTR_RLC_SENT_DUMMY,
112 CTR_RLC_SENT_CONTROL,
113 CTR_RLC_DL_BYTES,
114 CTR_RLC_DL_PAYLOAD_BYTES,
115 CTR_RLC_UL_BYTES,
116 CTR_RLC_UL_PAYLOAD_BYTES,
117 CTR_DECODE_ERRORS,
118 CTR_SBA_ALLOCATED,
119 CTR_SBA_FREED,
120 CTR_SBA_TIMEDOUT,
121 CTR_LLC_FRAME_TIMEDOUT,
122 CTR_LLC_FRAME_DROPPED,
123 CTR_LLC_FRAME_SCHED,
124 CTR_LLC_DL_BYTES,
125 CTR_LLC_UL_BYTES,
Oliver Smith4df959d2021-06-24 17:01:41 +0200126 CTR_PCH_REQUESTS,
Pau Espin Pedrolef8a7302021-11-08 19:19:25 +0100127 CTR_PCH_REQUESTS_ALREADY,
Oliver Smithd3c75912021-07-09 16:37:16 +0200128 CTR_PCH_REQUESTS_TIMEDOUT,
Pau Espin Pedrol2338e532020-05-12 20:54:35 +0200129 CTR_RACH_REQUESTS,
Pau Espin Pedrol7ce56d72021-11-02 16:47:06 +0100130 CTR_RACH_REQUESTS_11BIT,
Pau Espin Pedrol769e2812021-11-02 16:59:13 +0100131 CTR_RACH_REQUESTS_ONE_PHASE,
132 CTR_RACH_REQUESTS_TWO_PHASE,
Pau Espin Pedrol48df6002021-11-02 17:20:59 +0100133 CTR_RACH_REQUESTS_UNEXPECTED,
Pau Espin Pedrol2338e532020-05-12 20:54:35 +0200134 CTR_SPB_UL_FIRST_SEGMENT,
135 CTR_SPB_UL_SECOND_SEGMENT,
136 CTR_SPB_DL_FIRST_SEGMENT,
137 CTR_SPB_DL_SECOND_SEGMENT,
138 CTR_IMMEDIATE_ASSIGN_UL_TBF,
Pau Espin Pedroldff399f2021-11-02 17:46:43 +0100139 CTR_IMMEDIATE_ASSIGN_UL_TBF_ONE_PHASE,
140 CTR_IMMEDIATE_ASSIGN_UL_TBF_TWO_PHASE,
Pau Espin Pedrolba568312021-11-02 18:47:44 +0100141 CTR_IMMEDIATE_ASSIGN_UL_TBF_CONTENTION_RESOLUTION_SUCCESS,
Pau Espin Pedrol2338e532020-05-12 20:54:35 +0200142 CTR_IMMEDIATE_ASSIGN_REJ,
143 CTR_IMMEDIATE_ASSIGN_DL_TBF,
144 CTR_CHANNEL_REQUEST_DESCRIPTION,
145 CTR_PKT_UL_ASSIGNMENT,
146 CTR_PKT_ACCESS_REJ,
147 CTR_PKT_DL_ASSIGNMENT,
Pau Espin Pedrolc0a250d2021-01-21 18:46:13 +0100148 CTR_PKT_CELL_CHG_NOTIFICATION,
149 CTR_PKT_CELL_CHG_CONTINUE,
150 CTR_PKT_NEIGH_CELL_DATA,
Pau Espin Pedrol2338e532020-05-12 20:54:35 +0200151 CTR_RLC_RECV_CONTROL,
152 CTR_PUA_POLL_TIMEDOUT,
153 CTR_PUA_POLL_FAILED,
154 CTR_PDA_POLL_TIMEDOUT,
155 CTR_PDA_POLL_FAILED,
156 CTR_PUAN_POLL_TIMEDOUT,
157 CTR_PUAN_POLL_FAILED,
158 CTR_PDAN_POLL_TIMEDOUT,
159 CTR_PDAN_POLL_FAILED,
160 CTR_GPRS_DL_CS1,
161 CTR_GPRS_DL_CS2,
162 CTR_GPRS_DL_CS3,
163 CTR_GPRS_DL_CS4,
164 CTR_EGPRS_DL_MCS1,
165 CTR_EGPRS_DL_MCS2,
166 CTR_EGPRS_DL_MCS3,
167 CTR_EGPRS_DL_MCS4,
168 CTR_EGPRS_DL_MCS5,
169 CTR_EGPRS_DL_MCS6,
170 CTR_EGPRS_DL_MCS7,
171 CTR_EGPRS_DL_MCS8,
172 CTR_EGPRS_DL_MCS9,
173 CTR_GPRS_UL_CS1,
174 CTR_GPRS_UL_CS2,
175 CTR_GPRS_UL_CS3,
176 CTR_GPRS_UL_CS4,
177 CTR_EGPRS_UL_MCS1,
178 CTR_EGPRS_UL_MCS2,
179 CTR_EGPRS_UL_MCS3,
180 CTR_EGPRS_UL_MCS4,
181 CTR_EGPRS_UL_MCS5,
182 CTR_EGPRS_UL_MCS6,
183 CTR_EGPRS_UL_MCS7,
184 CTR_EGPRS_UL_MCS8,
185 CTR_EGPRS_UL_MCS9,
186};
187
Pau Espin Pedrol97e88fd2020-05-12 22:45:04 +0200188enum {
189 STAT_MS_PRESENT,
Oliver Smith35d51ca2021-09-02 12:23:58 +0200190 STAT_PDCH_AVAILABLE,
191 STAT_PDCH_OCCUPIED,
Oliver Smith402451b2021-09-08 09:33:24 +0200192 STAT_PDCH_OCCUPIED_GPRS,
193 STAT_PDCH_OCCUPIED_EGPRS,
Pau Espin Pedrol97e88fd2020-05-12 22:45:04 +0200194};
195
Vadim Yanitskiya0a0b7f2020-05-21 19:55:46 +0700196/* RACH.ind parameters (to be parsed) */
197struct rach_ind_params {
198 enum ph_burst_type burst_type;
199 bool is_11bit;
200 uint16_t ra;
201 uint8_t trx_nr;
202 uint8_t ts_nr;
203 uint32_t rfn;
204 int16_t qta;
205};
206
207/* [EGPRS Packet] Channel Request parameters (parsed) */
208struct chan_req_params {
209 unsigned int egprs_mslot_class;
210 unsigned int priority;
211 bool single_block;
212};
213
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100214struct GprsMsStorage;
215struct pcu_l1_meas;
216
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200217/**
218 * I represent a GSM BTS. I have one or more TRX, I know the current
219 * GSM time and I have controllers that help with allocating resources
220 * on my TRXs.
221 */
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100222struct gprs_rlcmac_bts {
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +0100223 uint8_t nr; /* bts_nr */
224 struct llist_head list; /* queued in pcu->bts_list */
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100225 bool active;
Pau Espin Pedrol2e6b60d2021-01-20 13:48:31 +0100226 struct osmo_cell_global_id_ps cgi_ps;
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100227 uint8_t bsic;
228 uint8_t cs_mask; /* Allowed CS mask from BTS */
229 uint16_t mcs_mask; /* Allowed MCS mask from BTS */
230 struct { /* information stored from last received PCUIF info_ind message */
231 uint8_t initial_cs;
232 uint8_t initial_mcs;
233 } pcuif_info_ind;
234 uint8_t initial_cs_dl, initial_cs_ul;
235 uint8_t initial_mcs_dl, initial_mcs_ul;
236 /* Timer defintions */
237 struct osmo_tdef *T_defs_bts; /* timers controlled by BTS, received through PCUIF */
238 uint8_t n3101;
239 uint8_t n3103;
240 uint8_t n3105;
241 struct gprs_rlcmac_trx trx[8];
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200242
Philipp Maiera58ec612021-01-25 23:43:52 +0100243 uint8_t si1[GSM_MACBLOCK_LEN];
244 bool si1_is_set;
Pau Espin Pedrol86f4c092021-06-08 18:53:40 +0200245 uint8_t si2[GSM_MACBLOCK_LEN];
246 bool si2_is_set;
247 struct gsm_sysinfo_freq si2_bcch_cell_list[1024];
Philipp Maiera58ec612021-01-25 23:43:52 +0100248 uint8_t si3[GSM_MACBLOCK_LEN];
249 bool si3_is_set;
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100250 uint8_t si13[GSM_MACBLOCK_LEN];
Pau Espin Pedrold65bd9d2021-06-01 16:43:41 +0200251 struct osmo_gsm48_si13_info si13_ro_decoded;
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100252 bool si13_is_set;
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200253
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100254 /* State for dynamic algorithm selection */
255 int multislot_disabled;
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200256
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100257 /* Packet Application Information (3GPP TS 44.060 11.2.47, usually ETWS primary message). We don't need to store
258 * more than one message, because they get sent so rarely. */
259 struct msgb *app_info;
260 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 +0200261
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100262 /* main nsei */
263 struct gprs_ns2_nse *nse;
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100264
265 /* back pointer to PCU object */
266 struct gprs_pcu *pcu;
Pau Espin Pedrolac3fd122021-01-13 18:54:38 +0100267
Pau Espin Pedrol3a42d172021-03-10 12:19:04 +0100268 uint32_t cur_fn;
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100269 int cur_blk_fn;
270 uint8_t max_cs_dl, max_cs_ul;
271 uint8_t max_mcs_dl, max_mcs_ul;
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100272 struct rate_ctr_group *ratectrs;
273 struct osmo_stat_item_group *statg;
Holger Hans Peter Freytherb78adcd2013-10-17 20:12:37 +0200274
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100275 struct GprsMsStorage *ms_store;
Oliver Smithd3c75912021-07-09 16:37:16 +0200276
277 /* List of struct bts_pch_timer for active PCH pagings */
278 struct llist_head pch_timer;
Pau Espin Pedrol0dcbc072021-11-10 19:09:10 +0100279
280 struct osmo_time_cc all_allocated_pdch;
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200281};
Holger Hans Peter Freyther9b30c7f2013-10-17 19:59:56 +0200282
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200283#ifdef __cplusplus
284extern "C" {
285#endif
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100286
Pau Espin Pedrolbd542052021-05-13 17:44:51 +0200287struct paging_req_cs {
288 uint8_t chan_needed;
289 uint32_t tlli; /* GSM_RESERVED_TMSI if not present */
290 bool mi_tmsi_present;
291 struct osmo_mobile_identity mi_tmsi;
292 bool mi_imsi_present;
293 struct osmo_mobile_identity mi_imsi;
294};
295
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100296struct GprsMs *bts_alloc_ms(struct gprs_rlcmac_bts *bts, uint8_t ms_class, uint8_t egprs_ms_class);
Pau Espin Pedrolbd542052021-05-13 17:44:51 +0200297int bts_add_paging(struct gprs_rlcmac_bts *bts, const struct paging_req_cs *req, struct GprsMs *ms);
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100298
299uint32_t bts_rfn_to_fn(const struct gprs_rlcmac_bts *bts, int32_t rfn);
300
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100301struct gprs_rlcmac_dl_tbf *bts_dl_tbf_by_tfi(struct gprs_rlcmac_bts *bts, uint8_t tfi, uint8_t trx, uint8_t ts);
302struct gprs_rlcmac_ul_tbf *bts_ul_tbf_by_tfi(struct gprs_rlcmac_bts *bts, uint8_t tfi, uint8_t trx, uint8_t ts);
303
Pau Espin Pedrol83a08922022-12-12 19:46:01 +0100304void bts_snd_dl_ass(struct gprs_rlcmac_bts *bts, const struct gprs_rlcmac_dl_tbf *tbf);
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100305
Pau Espin Pedrol3a42d172021-03-10 12:19:04 +0100306void bts_set_current_frame_number(struct gprs_rlcmac_bts *bts, uint32_t frame_number);
Pau Espin Pedrolfecab502021-03-17 15:26:37 +0100307void bts_set_current_block_frame_number(struct gprs_rlcmac_bts *bts, int frame_number);
Pau Espin Pedrol3a42d172021-03-10 12:19:04 +0100308static inline uint32_t bts_current_frame_number(const struct gprs_rlcmac_bts *bts)
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100309{
310 return bts->cur_fn;
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200311}
Holger Hans Peter Freyther17b0d832013-10-19 17:37:48 +0200312
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100313int bts_tfi_find_free(const struct gprs_rlcmac_bts *bts, enum gprs_rlcmac_tbf_direction dir,
314 uint8_t *_trx, int8_t use_trx);
315
316int bts_rcv_rach(struct gprs_rlcmac_bts *bts, const struct rach_ind_params *rip);
317int bts_rcv_ptcch_rach(struct gprs_rlcmac_bts *bts, const struct rach_ind_params *rip);
318int bts_rcv_imm_ass_cnf(struct gprs_rlcmac_bts *bts, const uint8_t *data, uint32_t fn);
319
320void bts_send_gsmtap(struct gprs_rlcmac_bts *bts,
321 enum pcu_gsmtap_category categ, bool uplink, uint8_t trx_no,
322 uint8_t ts_no, uint8_t channel, uint32_t fn,
323 const uint8_t *data, unsigned int len);
324void bts_send_gsmtap_meas(struct gprs_rlcmac_bts *bts,
325 enum pcu_gsmtap_category categ, bool uplink, uint8_t trx_no,
326 uint8_t ts_no, uint8_t channel, uint32_t fn,
327 const uint8_t *data, unsigned int len, struct pcu_l1_meas *meas);
328void bts_send_gsmtap_rach(struct gprs_rlcmac_bts *bts,
329 enum pcu_gsmtap_category categ, uint8_t channel,
330 const struct rach_ind_params *rip);
331
Pau Espin Pedrol4b7a71f2021-04-30 13:53:38 +0200332struct GprsMsStorage *bts_ms_store(const struct gprs_rlcmac_bts *bts);
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100333
334struct GprsMs *bts_ms_by_tlli(struct gprs_rlcmac_bts *bts, uint32_t tlli, uint32_t old_tlli);
335
336static inline struct rate_ctr_group *bts_rate_counters(struct gprs_rlcmac_bts *bts)
337{
338 return bts->ratectrs;
339}
340
341static inline struct osmo_stat_item_group *bts_stat_items(struct gprs_rlcmac_bts *bts)
342{
343 return bts->statg;
344}
345
Pau Espin Pedrol9688dc92021-02-25 18:30:33 +0100346static inline void bts_do_rate_ctr_inc(const struct gprs_rlcmac_bts *bts, unsigned int ctr_id) {
Pau Espin Pedrol9c1db172021-06-04 17:05:51 +0200347 rate_ctr_inc(rate_ctr_group_get_ctr(bts->ratectrs, ctr_id));
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100348}
349
Pau Espin Pedrol9688dc92021-02-25 18:30:33 +0100350static inline void bts_do_rate_ctr_add(const struct gprs_rlcmac_bts *bts, unsigned int ctr_id, int inc) {
Pau Espin Pedrol9c1db172021-06-04 17:05:51 +0200351 rate_ctr_add(rate_ctr_group_get_ctr(bts->ratectrs, ctr_id), inc);
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100352}
353
354static inline void bts_stat_item_add(struct gprs_rlcmac_bts *bts, unsigned int stat_id, int inc) {
Pau Espin Pedrol9c1db172021-06-04 17:05:51 +0200355 struct osmo_stat_item *item = osmo_stat_item_group_get_item(bts->statg, stat_id);
356 int32_t val = osmo_stat_item_get_last(item);
357 osmo_stat_item_set(item, val + inc);
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100358}
359
Oliver Smith35d51ca2021-09-02 12:23:58 +0200360#define bts_stat_item_inc(bts, stat_id) bts_stat_item_add(bts, stat_id, 1)
361
362#define bts_stat_item_dec(bts, stat_id) bts_stat_item_add(bts, stat_id, -1)
363
Pau Espin Pedrold1049dc2021-01-18 17:14:14 +0100364struct gprs_rlcmac_bts *bts_alloc(struct gprs_pcu *pcu, uint8_t bts_nr);
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100365
Pau Espin Pedrol15c58ac2021-03-08 14:57:58 +0100366struct gprs_rlcmac_sba *bts_alloc_sba(struct gprs_rlcmac_bts *bts, uint8_t ta);
367
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100368void bts_recalc_initial_cs(struct gprs_rlcmac_bts *bts);
369void bts_recalc_initial_mcs(struct gprs_rlcmac_bts *bts);
370void bts_recalc_max_cs(struct gprs_rlcmac_bts *bts);
371void bts_recalc_max_mcs(struct gprs_rlcmac_bts *bts);
372struct GprsMs *bts_ms_by_imsi(struct gprs_rlcmac_bts *bts, const char *imsi);
373uint8_t bts_max_cs_dl(const struct gprs_rlcmac_bts *bts);
374uint8_t bts_max_cs_ul(const struct gprs_rlcmac_bts *bts);
375uint8_t bts_max_mcs_dl(const struct gprs_rlcmac_bts *bts);
376uint8_t bts_max_mcs_ul(const struct gprs_rlcmac_bts *bts);
377void bts_set_max_cs_dl(struct gprs_rlcmac_bts *bts, uint8_t cs_dl);
378void bts_set_max_cs_ul(struct gprs_rlcmac_bts *bts, uint8_t cs_ul);
379void bts_set_max_mcs_dl(struct gprs_rlcmac_bts *bts, uint8_t mcs_dl);
380void bts_set_max_mcs_ul(struct gprs_rlcmac_bts *bts, uint8_t mcs_ul);
381bool bts_cs_dl_is_supported(const struct gprs_rlcmac_bts *bts, enum CodingScheme cs);
Pau Espin Pedrolc0a250d2021-01-21 18:46:13 +0100382const struct llist_head* bts_ms_list(struct gprs_rlcmac_bts *bts);
Pau Espin Pedrolfe8de452021-02-09 18:47:34 +0100383uint8_t bts_get_ms_pwr_alpha(const struct gprs_rlcmac_bts *bts);
Pau Espin Pedrol0dcbc072021-11-10 19:09:10 +0100384bool bts_all_pdch_allocated(const struct gprs_rlcmac_bts *bts);
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100385#ifdef __cplusplus
386}
Holger Hans Peter Freytherb6acfda2013-10-17 19:41:11 +0200387#endif