blob: 97f556240c537b9e660b21706db57ff0fe812ab0 [file] [log] [blame]
Holger Hans Peter Freyther17c31ce2013-08-24 18:31:27 +02001/*
2 * Copyright (C) 2013 by Holger Hans Peter Freyther
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
Holger Hans Peter Freyther17c31ce2013-08-24 18:31:27 +020013 */
14
15#pragma once
16
Daniel Willmannafa72f52014-01-15 17:06:19 +010017#ifdef __cplusplus
18
Pau Espin Pedrolcd6c4662020-09-22 13:41:00 +020019#include <string>
20
Holger Hans Peter Freytherbe570812013-11-07 08:01:49 +010021#include "llc.h"
Holger Hans Peter Freyther6b5660c2013-11-23 16:10:48 +010022#include "rlc.h"
Pau Espin Pedrolff335972023-07-26 16:14:52 +020023#include "rlc_window.h"
Jacob Erlbeck6835cea2015-08-21 15:24:02 +020024#include "cxx_linuxlist.h"
Pau Espin Pedrolda971ee2020-12-16 15:59:45 +010025#include "pcu_utils.h"
Daniel Willmanneb100242014-08-08 11:43:53 +020026#include <gprs_debug.h>
Holger Hans Peter Freyther17c31ce2013-08-24 18:31:27 +020027#include <stdint.h>
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +020028
Pau Espin Pedrolda971ee2020-12-16 15:59:45 +010029struct bssgp_bvc_ctx;
30struct gprs_rlcmac_bts;
Pau Espin Pedrold6c555e2023-04-20 20:10:53 +020031struct alloc_resources_req;
Pau Espin Pedrolda971ee2020-12-16 15:59:45 +010032
33#endif
34
35struct GprsMs;
36
37#ifdef __cplusplus
Maxe66de5b2017-01-05 18:26:58 +010038extern "C" {
Pau Espin Pedrolda971ee2020-12-16 15:59:45 +010039#endif
Maxe66de5b2017-01-05 18:26:58 +010040#include <osmocom/core/utils.h>
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +020041#include <osmocom/core/linuxlist.h>
42#include <osmocom/core/logging.h>
43#include <osmocom/core/timer.h>
Vadim Yanitskiycb988942020-11-08 13:27:35 +070044#include <osmocom/gsm/gsm48.h>
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +020045
46#include "coding_scheme.h"
Pau Espin Pedrol86580e12021-03-29 18:15:30 +020047#include <pdch_ul_controller.h>
Pau Espin Pedroldc2aaac2021-05-14 12:50:46 +020048#include <tbf_fsm.h>
Pau Espin Pedrol6ad11a62021-07-27 12:27:08 +020049#include <tbf_ul_ass_fsm.h>
Pau Espin Pedrol49a2f402021-07-27 17:33:07 +020050#include <tbf_dl_ass_fsm.h>
Pau Espin Pedrolda971ee2020-12-16 15:59:45 +010051#ifdef __cplusplus
Maxe66de5b2017-01-05 18:26:58 +010052}
Vadim Yanitskiycef2f842019-10-09 21:52:50 +070053#endif
54
Holger Hans Peter Freyther9e21d842013-10-16 17:48:12 +020055/*
56 * TBF instance
57 */
58
Holger Hans Peter Freyther9e21d842013-10-16 17:48:12 +020059enum gprs_rlcmac_tbf_direction {
60 GPRS_RLCMAC_DL_TBF,
61 GPRS_RLCMAC_UL_TBF
62};
63
Max847ed9f2018-02-20 18:16:11 +010064enum tbf_rlc_counters {
sivasankari53950732016-12-08 17:15:17 +053065 TBF_CTR_RLC_NACKED,
66};
67
68enum tbf_gprs_counters {
69 TBF_CTR_GPRS_DL_CS1,
70 TBF_CTR_GPRS_DL_CS2,
71 TBF_CTR_GPRS_DL_CS3,
72 TBF_CTR_GPRS_DL_CS4,
73};
74
75enum tbf_egprs_counters {
76 TBF_CTR_EGPRS_DL_MCS1,
77 TBF_CTR_EGPRS_DL_MCS2,
78 TBF_CTR_EGPRS_DL_MCS3,
79 TBF_CTR_EGPRS_DL_MCS4,
80 TBF_CTR_EGPRS_DL_MCS5,
81 TBF_CTR_EGPRS_DL_MCS6,
82 TBF_CTR_EGPRS_DL_MCS7,
83 TBF_CTR_EGPRS_DL_MCS8,
84 TBF_CTR_EGPRS_DL_MCS9,
85};
86
Pau Espin Pedrol442198c2020-10-23 22:30:04 +020087extern const struct rate_ctr_group_desc tbf_ctrg_desc;
88extern unsigned int next_tbf_ctr_group_id;
89
Max0524e382018-01-19 18:22:25 +010090#define LOGPTBF(tbf, level, fmt, args...) LOGP(DTBF, level, "%s " fmt, tbf_name(tbf), ## args)
Maxc21f0072017-12-15 17:36:45 +010091
Maxee5be3a2017-12-20 17:31:13 +010092enum tbf_timers {
Pau Espin Pedrol4b6f0bf2021-05-10 18:54:52 +020093 /* Wait contention resolution success on UL TBFs assigned over CCCH */
94 T3141,
95
Maxee5be3a2017-12-20 17:31:13 +010096 /* Wait for reuse of TFI(s) after sending of the last RLC Data Block on this TBF.
97 Wait for reuse of TFI(s) after sending the PACKET TBF RELEASE for an MBMS radio bearer. */
98 T3191,
99
Maxee5be3a2017-12-20 17:31:13 +0100100 T_MAX
101};
102
Max847ed9f2018-02-20 18:16:11 +0100103enum tbf_counters { /* TBF counters from 3GPP TS 44.060 ยง13.4 */
104 /* counters are reset when: */
105 N3101, /* received a valid data block from mobile station in a block assigned for this USF */
106 N3103, /* transmitting the final PACKET UPLINK ACK/NACK message */
107 N3105, /* after sending a RRBP field in the downlink RLC data block, receives a valid RLC/MAC control message */
108 N_MAX
109};
110
Holger Hans Peter Freyther9e21d842013-10-16 17:48:12 +0200111#define GPRS_RLCMAC_FLAG_CCCH 0 /* assignment on CCCH */
112#define GPRS_RLCMAC_FLAG_PACCH 1 /* assignment on PACCH */
Pau Espin Pedrola02f9452021-11-08 13:09:29 +0100113#define TBF_TFI_UNSET 0xff
Pau Espin Pedrol38a9c872021-10-12 19:18:57 +0200114
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +0200115#define T_START(tbf, t, T, r, f) tbf->t_start(t, T, r, f, __FILE__, __LINE__)
Max2399b1d2018-01-12 15:48:12 +0100116
Vadim Yanitskiycef2f842019-10-09 21:52:50 +0700117#ifdef __cplusplus
Pau Espin Pedrolda971ee2020-12-16 15:59:45 +0100118extern "C" {
119#endif
120struct gprs_rlcmac_tbf;
Pau Espin Pedrol57dcde42021-02-01 18:14:23 +0100121const char *tbf_name(const struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedroldc2aaac2021-05-14 12:50:46 +0200122enum tbf_fsm_states tbf_state(const struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrol6ad11a62021-07-27 12:27:08 +0200123struct osmo_fsm_inst *tbf_ul_ass_fi(const struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrol49a2f402021-07-27 17:33:07 +0200124struct osmo_fsm_inst *tbf_dl_ass_fi(const struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrol94386132022-10-28 19:50:09 +0200125struct osmo_fsm_inst *tbf_state_fi(const struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrolda971ee2020-12-16 15:59:45 +0100126enum gprs_rlcmac_tbf_direction tbf_direction(const struct gprs_rlcmac_tbf *tbf);
127void tbf_set_ms(struct gprs_rlcmac_tbf *tbf, struct GprsMs *ms);
128struct llist_head *tbf_ms_list(struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrol1a1557a2021-05-13 18:39:36 +0200129struct llist_head *tbf_trx_list(struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrol1e77ca82021-01-27 13:22:03 +0100130struct GprsMs *tbf_ms(const struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrolda971ee2020-12-16 15:59:45 +0100131bool tbf_timers_pending(struct gprs_rlcmac_tbf *tbf, enum tbf_timers t);
132void tbf_free(struct gprs_rlcmac_tbf *tbf);
133struct gprs_llc *tbf_llc(struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrolda971ee2020-12-16 15:59:45 +0100134uint8_t tbf_dl_slots(const struct gprs_rlcmac_tbf *tbf);
135uint8_t tbf_ul_slots(const struct gprs_rlcmac_tbf *tbf);
136bool tbf_is_tfi_assigned(const struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrolc0a250d2021-01-21 18:46:13 +0100137uint8_t tbf_tfi(const struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrol6ad11a62021-07-27 12:27:08 +0200138bool tbf_is_egprs_enabled(const struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrol32744c82021-10-12 19:36:40 +0200139void tbf_assign_control_ts(struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrolfd74e792022-12-15 18:23:12 +0100140int tbf_check_polling(const struct gprs_rlcmac_tbf *tbf, const struct gprs_rlcmac_pdch *pdch, uint32_t fn, uint32_t *poll_fn, unsigned int *rrbp);
Pau Espin Pedrol5b7eeec2022-12-15 19:08:13 +0100141void tbf_set_polling(struct gprs_rlcmac_tbf *tbf, const struct gprs_rlcmac_pdch *pdch, uint32_t new_poll_fn, enum pdch_ulc_tbf_poll_reason t);
Pau Espin Pedrol16e16782021-03-29 19:10:19 +0200142void tbf_poll_timeout(struct gprs_rlcmac_tbf *tbf, struct gprs_rlcmac_pdch *pdch, uint32_t poll_fn, enum pdch_ulc_tbf_poll_reason reason);
Pau Espin Pedroldc2aaac2021-05-14 12:50:46 +0200143void tbf_update_state_fsm_name(struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrolab8fba32021-07-27 16:35:00 +0200144const char* tbf_rlcmac_diag(const struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrole8757692022-12-12 16:18:05 +0100145bool tbf_is_control_ts(const struct gprs_rlcmac_tbf *tbf, const struct gprs_rlcmac_pdch *pdch);
Pau Espin Pedrol32252902021-07-29 16:44:11 +0200146bool tbf_can_upgrade_to_multislot(const struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrol140c97c2022-12-13 14:14:32 +0100147struct gprs_rlcmac_pdch *tbf_get_first_ts(struct gprs_rlcmac_tbf *tbf);
148const struct gprs_rlcmac_pdch *tbf_get_first_ts_const(const struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrol22b26d82022-10-26 15:44:14 +0200149struct gprs_rlcmac_trx *tbf_get_trx(struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrolb7a2b592022-12-13 14:43:59 +0100150void tbf_unlink_pdch(struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrolee350082022-10-28 17:35:03 +0200151void tbf_stop_timers(struct gprs_rlcmac_tbf *tbf, const char *reason);
Pau Espin Pedrolda971ee2020-12-16 15:59:45 +0100152#ifdef __cplusplus
153}
154#endif
155
156#ifdef __cplusplus
Vadim Yanitskiycef2f842019-10-09 21:52:50 +0700157
Holger Hans Peter Freyther099535a2013-10-16 17:42:31 +0200158struct gprs_rlcmac_tbf {
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100159 gprs_rlcmac_tbf(struct gprs_rlcmac_bts *bts_, GprsMs *ms, gprs_rlcmac_tbf_direction dir);
Pau Espin Pedroldc2aaac2021-05-14 12:50:46 +0200160 virtual ~gprs_rlcmac_tbf();
Holger Hans Peter Freyther964ddb62013-10-16 17:53:23 +0200161
Pau Espin Pedrolb3f23972020-10-23 21:00:23 +0200162 virtual gprs_rlc_window *window() = 0;
Pau Espin Pedrold6c555e2023-04-20 20:10:53 +0200163 virtual void apply_allocated_resources(const struct alloc_resources_res *res) = 0;
Pau Espin Pedrolb3f23972020-10-23 21:00:23 +0200164
Pau Espin Pedroldc2aaac2021-05-14 12:50:46 +0200165 bool state_is(enum tbf_fsm_states rhs) const;
166 bool state_is_not(enum tbf_fsm_states rhs) const;
Pau Espin Pedrol49a2f402021-07-27 17:33:07 +0200167 bool dl_ass_state_is(enum tbf_dl_ass_fsm_states rhs) const;
Pau Espin Pedrol6ad11a62021-07-27 12:27:08 +0200168 bool ul_ass_state_is(enum tbf_ul_ass_fsm_states rhs) const;
Maxcac6b662018-01-24 11:00:17 +0100169 void poll_sched_set(const char *file, int line);
170 void poll_sched_unset(const char *file, int line);
Daniel Willmann08e57c82014-08-15 18:11:57 +0200171 const char *state_name() const;
Holger Hans Peter Freyther1c344e22013-10-16 18:33:18 +0200172
Pau Espin Pedrol57843c52022-11-03 13:35:19 +0100173 const char *name(bool enclousure = true) const;
Jacob Erlbeckadcdf152015-03-03 14:45:55 +0100174
Jacob Erlbeck5a3c84d2016-01-22 17:25:38 +0100175 struct msgb *create_dl_ass(uint32_t fn, uint8_t ts);
Holger Hans Peter Freyther2db7e7e2013-10-26 20:45:35 +0200176
Jacob Erlbeck10ed7952015-06-02 11:37:22 +0200177 GprsMs *ms() const;
Jacob Erlbeckfecece02015-05-08 12:13:08 +0200178 void set_ms(GprsMs *ms);
179
Max847ed9f2018-02-20 18:16:11 +0100180 bool n_inc(enum tbf_counters n);
181 void n_reset(enum tbf_counters n);
182
Holger Hans Peter Freytheraf8094d2013-10-26 17:56:15 +0200183 void handle_timeout();
Maxee5be3a2017-12-20 17:31:13 +0100184 void stop_timers(const char *reason);
185 bool timers_pending(enum tbf_timers t);
186 void t_stop(enum tbf_timers t, const char *reason);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +0200187 void t_start(enum tbf_timers t, int T, const char *reason, bool force,
Max467f6332017-12-20 18:13:29 +0100188 const char *file, unsigned line);
Pau Espin Pedrol16e16782021-03-29 19:10:19 +0200189 void poll_timeout(struct gprs_rlcmac_pdch *pdch, uint32_t poll_fn, enum pdch_ulc_tbf_poll_reason reason);
Holger Hans Peter Freytherd9262b32013-10-26 20:12:59 +0200190
Holger Hans Peter Freyther474685e2013-10-27 17:01:14 +0100191 /** tlli handling */
Holger Hans Peter Freyther474685e2013-10-27 17:01:14 +0100192 uint32_t tlli() const;
193 bool is_tlli_valid() const;
Holger Hans Peter Freyther474685e2013-10-27 17:01:14 +0100194
Holger Hans Peter Freyther34f6e5e2013-10-27 20:31:47 +0100195 uint8_t tfi() const;
196
Holger Hans Peter Freyther5464c9b2013-10-27 20:57:35 +0100197 const char *imsi() const;
Jacob Erlbeck9200ce62015-05-22 17:48:04 +0200198 uint8_t ta() const;
199 void set_ta(uint8_t);
Jacob Erlbeckbefc7602015-06-02 12:33:30 +0200200 uint8_t ms_class() const;
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200201 enum CodingScheme current_cs() const;
Holger Hans Peter Freyther5464c9b2013-10-27 20:57:35 +0100202
Holger Hans Peter Freythera0047992014-01-16 10:07:20 +0100203 time_t created_ts() const;
Jacob Erlbeck617c7122015-06-30 09:18:30 +0200204 uint8_t dl_slots() const;
205 uint8_t ul_slots() const;
Daniel Willmann80367aa2014-01-15 17:40:28 +0100206
Jacob Erlbeck5643f352015-11-27 16:17:40 +0100207 /* EGPRS */
208 bool is_egprs_enabled() const;
Jacob Erlbeck5643f352015-11-27 16:17:40 +0100209
Holger Hans Peter Freyther7a5f3c22013-11-26 13:08:12 +0100210 /* attempt to make things a bit more fair */
211 void rotate_in_list();
212
Holger Hans Peter Freyther099535a2013-10-16 17:42:31 +0200213 enum gprs_rlcmac_tbf_direction direction;
Holger Hans Peter Freyther743bafa2013-09-29 07:50:50 +0200214 struct gprs_rlcmac_trx *trx;
Pau Espin Pedrole2ed40d2022-12-15 17:35:05 +0100215 struct gprs_rlcmac_pdch *control_ts; /* timeslot control messages and polling */
Holger Hans Peter Freyther099535a2013-10-16 17:42:31 +0200216 struct gprs_rlcmac_pdch *pdch[8]; /* list of PDCHs allocated to TBF */
Holger Hans Peter Freyther28e53782013-11-06 20:23:56 +0100217
218 gprs_llc m_llc;
Holger Hans Peter Freyther9241fd02013-11-13 19:51:55 +0100219 gprs_rlc m_rlc;
Max847ed9f2018-02-20 18:16:11 +0100220
Holger Hans Peter Freyther099535a2013-10-16 17:42:31 +0200221 unsigned int fT; /* fTxxxx number */
222 unsigned int num_fT_exp; /* number of consecutive fT expirations */
223
Jacob Erlbeckb6b3c7e2015-08-28 12:07:14 +0200224 struct Meas {
Stefan Sperlingf0f7df12018-05-25 15:12:30 +0200225 struct timespec rssi_tv; /* timestamp for rssi calculation */
Holger Hans Peter Freyther099535a2013-10-16 17:42:31 +0200226 int32_t rssi_sum; /* sum of rssi values */
227 int rssi_num; /* number of rssi values added since rssi_tv */
Jacob Erlbeckb6b3c7e2015-08-28 12:07:14 +0200228
229 Meas();
Holger Hans Peter Freyther099535a2013-10-16 17:42:31 +0200230 } meas;
231
Daniel Willmanncf1fae72014-05-30 17:58:01 +0200232 /* Can/should we upgrade this tbf to use multiple slots? */
Pau Espin Pedrol907f0372021-07-29 16:34:04 +0200233 bool upgrade_to_multislot;
Daniel Willmanncf1fae72014-05-30 17:58:01 +0200234
Holger Hans Peter Freyther9f0c1d22013-10-19 21:24:34 +0200235 /* store the BTS this TBF belongs to */
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100236 struct gprs_rlcmac_bts *bts;
Holger Hans Peter Freytherd9262b32013-10-26 20:12:59 +0200237
Holger Hans Peter Freyther474685e2013-10-27 17:01:14 +0100238 /*
239 * private fields. We can't make it private as it is breaking the
240 * llist macros.
241 */
Holger Hans Peter Freyther34f6e5e2013-10-27 20:31:47 +0100242 uint8_t m_tfi;
Holger Hans Peter Freythera0047992014-01-16 10:07:20 +0100243 time_t m_created_ts;
Holger Hans Peter Freyther474685e2013-10-27 17:01:14 +0100244
sivasankari53950732016-12-08 17:15:17 +0530245 struct rate_ctr_group *m_ctrs;
Pau Espin Pedrolf197f152022-11-17 20:18:46 +0100246 struct osmo_fsm_inst *state_fi;
Pau Espin Pedrol6ad11a62021-07-27 12:27:08 +0200247 struct tbf_ul_ass_fsm_ctx ul_ass_fsm;
Pau Espin Pedrol49a2f402021-07-27 17:33:07 +0200248 struct tbf_ul_ass_fsm_ctx dl_ass_fsm;
Pau Espin Pedrol6ad11a62021-07-27 12:27:08 +0200249
Pau Espin Pedrolda971ee2020-12-16 15:59:45 +0100250 struct llist_item m_ms_list;
Pau Espin Pedrol1a1557a2021-05-13 18:39:36 +0200251 struct llist_item m_trx_list;
sivasankari53950732016-12-08 17:15:17 +0530252
Holger Hans Peter Freytherd9262b32013-10-26 20:12:59 +0200253protected:
Jacob Erlbeck28c40b12015-08-16 18:19:32 +0200254 void merge_and_clear_ms(GprsMs *old_ms);
Pau Espin Pedrol759724c2023-04-19 18:36:40 +0200255 void enable_egprs(void);
Holger Hans Peter Freyther4c06d912013-11-25 23:05:26 +0100256
Alexander Couzensd38b92e2016-08-21 19:38:30 +0200257 gprs_llc_queue *llc_queue();
258 const gprs_llc_queue *llc_queue() const;
259
Pau Espin Pedrolda971ee2020-12-16 15:59:45 +0100260 struct GprsMs *m_ms;
Jacob Erlbeckadcdf152015-03-03 14:45:55 +0100261private:
Jacob Erlbeck5643f352015-11-27 16:17:40 +0100262 bool m_egprs_enabled;
Pau Espin Pedrolef1fe582019-09-05 14:40:24 +0200263 struct osmo_timer_list Tarr[T_MAX];
264 uint8_t Narr[N_MAX];
Pau Espin Pedrol57843c52022-11-03 13:35:19 +0100265 mutable char m_name_buf[128];
Holger Hans Peter Freyther099535a2013-10-16 17:42:31 +0200266};
267
Pau Espin Pedroldc2aaac2021-05-14 12:50:46 +0200268inline bool gprs_rlcmac_tbf::state_is(enum tbf_fsm_states rhs) const
Holger Hans Peter Freyther1c344e22013-10-16 18:33:18 +0200269{
Pau Espin Pedroldc2aaac2021-05-14 12:50:46 +0200270 return tbf_state(this) == rhs;
Holger Hans Peter Freyther1c344e22013-10-16 18:33:18 +0200271}
272
Pau Espin Pedrol49a2f402021-07-27 17:33:07 +0200273inline bool gprs_rlcmac_tbf::dl_ass_state_is(enum tbf_dl_ass_fsm_states rhs) const
Max0e599802018-01-23 20:09:06 +0100274{
Pau Espin Pedrol49a2f402021-07-27 17:33:07 +0200275 return tbf_dl_ass_fi(this)->state == rhs;
Max0e599802018-01-23 20:09:06 +0100276}
277
Pau Espin Pedrol6ad11a62021-07-27 12:27:08 +0200278inline bool gprs_rlcmac_tbf::ul_ass_state_is(enum tbf_ul_ass_fsm_states rhs) const
Max0e599802018-01-23 20:09:06 +0100279{
Pau Espin Pedrol6ad11a62021-07-27 12:27:08 +0200280 return tbf_ul_ass_fi(this)->state == rhs;
Max0e599802018-01-23 20:09:06 +0100281}
282
Pau Espin Pedroldc2aaac2021-05-14 12:50:46 +0200283inline bool gprs_rlcmac_tbf::state_is_not(enum tbf_fsm_states rhs) const
Holger Hans Peter Freyther1c344e22013-10-16 18:33:18 +0200284{
Pau Espin Pedroldc2aaac2021-05-14 12:50:46 +0200285 return tbf_state(this) != rhs;
Holger Hans Peter Freyther1c344e22013-10-16 18:33:18 +0200286}
287
Pau Espin Pedroldc2aaac2021-05-14 12:50:46 +0200288
Daniel Willmann08e57c82014-08-15 18:11:57 +0200289inline const char *gprs_rlcmac_tbf::state_name() const
290{
Pau Espin Pedrolf197f152022-11-17 20:18:46 +0100291 return osmo_fsm_inst_state_name(state_fi);
Daniel Willmann08e57c82014-08-15 18:11:57 +0200292}
293
Jacob Erlbeck10ed7952015-06-02 11:37:22 +0200294inline GprsMs *gprs_rlcmac_tbf::ms() const
Jacob Erlbeckfecece02015-05-08 12:13:08 +0200295{
296 return m_ms;
297}
298
Holger Hans Peter Freyther474685e2013-10-27 17:01:14 +0100299inline bool gprs_rlcmac_tbf::is_tlli_valid() const
300{
Vadim Yanitskiycb988942020-11-08 13:27:35 +0700301 return tlli() != GSM_RESERVED_TMSI;
Holger Hans Peter Freyther474685e2013-10-27 17:01:14 +0100302}
303
Holger Hans Peter Freyther34f6e5e2013-10-27 20:31:47 +0100304inline uint8_t gprs_rlcmac_tbf::tfi() const
305{
306 return m_tfi;
307}
308
Holger Hans Peter Freythera0047992014-01-16 10:07:20 +0100309inline time_t gprs_rlcmac_tbf::created_ts() const
Daniel Willmann80367aa2014-01-15 17:40:28 +0100310{
Holger Hans Peter Freythera0047992014-01-16 10:07:20 +0100311 return m_created_ts;
Daniel Willmann80367aa2014-01-15 17:40:28 +0100312}
313
Jacob Erlbeck5643f352015-11-27 16:17:40 +0100314inline bool gprs_rlcmac_tbf::is_egprs_enabled() const
315{
316 return m_egprs_enabled;
317}
318
Jacob Erlbeckac89a552015-06-29 14:18:46 +0200319inline enum gprs_rlcmac_tbf_direction reverse(enum gprs_rlcmac_tbf_direction dir)
320{
321 return (enum gprs_rlcmac_tbf_direction)
322 ((int)GPRS_RLCMAC_UL_TBF - (int)dir + (int)GPRS_RLCMAC_DL_TBF);
323}
Jacob Erlbeckaa9daa12015-12-28 18:49:12 +0100324
Pau Espin Pedrol0ece97d2021-01-18 12:53:54 +0100325uint16_t egprs_window_size(const struct gprs_rlcmac_bts *bts, uint8_t slots);
Max9d7357e2017-12-14 15:02:33 +0100326
Daniel Willmannafa72f52014-01-15 17:06:19 +0100327#endif