blob: a02b8e26688c7b610bc779f790bb653ed1b250e2 [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"
Jacob Erlbeck6835cea2015-08-21 15:24:02 +020023#include "cxx_linuxlist.h"
Pau Espin Pedrolda971ee2020-12-16 15:59:45 +010024#include "pcu_utils.h"
Daniel Willmanneb100242014-08-08 11:43:53 +020025#include <gprs_debug.h>
Holger Hans Peter Freyther17c31ce2013-08-24 18:31:27 +020026#include <stdint.h>
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +020027
Pau Espin Pedrolda971ee2020-12-16 15:59:45 +010028struct bssgp_bvc_ctx;
29struct gprs_rlcmac_bts;
30
31#endif
32
33struct GprsMs;
34
35#ifdef __cplusplus
Maxe66de5b2017-01-05 18:26:58 +010036extern "C" {
Pau Espin Pedrolda971ee2020-12-16 15:59:45 +010037#endif
Maxe66de5b2017-01-05 18:26:58 +010038#include <osmocom/core/utils.h>
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +020039#include <osmocom/core/linuxlist.h>
40#include <osmocom/core/logging.h>
41#include <osmocom/core/timer.h>
Vadim Yanitskiycb988942020-11-08 13:27:35 +070042#include <osmocom/gsm/gsm48.h>
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +020043
44#include "coding_scheme.h"
Pau Espin Pedrol86580e12021-03-29 18:15:30 +020045#include <pdch_ul_controller.h>
Pau Espin Pedroldc2aaac2021-05-14 12:50:46 +020046#include <tbf_fsm.h>
Pau Espin Pedrol6ad11a62021-07-27 12:27:08 +020047#include <tbf_ul_ass_fsm.h>
Pau Espin Pedrol49a2f402021-07-27 17:33:07 +020048#include <tbf_dl_ass_fsm.h>
Pau Espin Pedrolda971ee2020-12-16 15:59:45 +010049#ifdef __cplusplus
Maxe66de5b2017-01-05 18:26:58 +010050}
Vadim Yanitskiycef2f842019-10-09 21:52:50 +070051#endif
52
Holger Hans Peter Freyther9e21d842013-10-16 17:48:12 +020053/*
54 * TBF instance
55 */
56
Holger Hans Peter Freyther9e21d842013-10-16 17:48:12 +020057enum gprs_rlcmac_tbf_direction {
58 GPRS_RLCMAC_DL_TBF,
59 GPRS_RLCMAC_UL_TBF
60};
61
Max847ed9f2018-02-20 18:16:11 +010062enum tbf_rlc_counters {
sivasankari53950732016-12-08 17:15:17 +053063 TBF_CTR_RLC_NACKED,
64};
65
66enum tbf_gprs_counters {
67 TBF_CTR_GPRS_DL_CS1,
68 TBF_CTR_GPRS_DL_CS2,
69 TBF_CTR_GPRS_DL_CS3,
70 TBF_CTR_GPRS_DL_CS4,
71};
72
73enum tbf_egprs_counters {
74 TBF_CTR_EGPRS_DL_MCS1,
75 TBF_CTR_EGPRS_DL_MCS2,
76 TBF_CTR_EGPRS_DL_MCS3,
77 TBF_CTR_EGPRS_DL_MCS4,
78 TBF_CTR_EGPRS_DL_MCS5,
79 TBF_CTR_EGPRS_DL_MCS6,
80 TBF_CTR_EGPRS_DL_MCS7,
81 TBF_CTR_EGPRS_DL_MCS8,
82 TBF_CTR_EGPRS_DL_MCS9,
83};
84
Pau Espin Pedrol442198c2020-10-23 22:30:04 +020085extern const struct rate_ctr_group_desc tbf_ctrg_desc;
86extern unsigned int next_tbf_ctr_group_id;
87
Max0524e382018-01-19 18:22:25 +010088#define LOGPTBF(tbf, level, fmt, args...) LOGP(DTBF, level, "%s " fmt, tbf_name(tbf), ## args)
Maxc21f0072017-12-15 17:36:45 +010089
Maxee5be3a2017-12-20 17:31:13 +010090enum tbf_timers {
Pau Espin Pedrol4b6f0bf2021-05-10 18:54:52 +020091 /* Wait contention resolution success on UL TBFs assigned over CCCH */
92 T3141,
93
Maxee5be3a2017-12-20 17:31:13 +010094 /* Wait for reuse of TFI(s) after sending of the last RLC Data Block on this TBF.
95 Wait for reuse of TFI(s) after sending the PACKET TBF RELEASE for an MBMS radio bearer. */
96 T3191,
97
Maxee5be3a2017-12-20 17:31:13 +010098 T_MAX
99};
100
Max847ed9f2018-02-20 18:16:11 +0100101enum tbf_counters { /* TBF counters from 3GPP TS 44.060 ยง13.4 */
102 /* counters are reset when: */
103 N3101, /* received a valid data block from mobile station in a block assigned for this USF */
104 N3103, /* transmitting the final PACKET UPLINK ACK/NACK message */
105 N3105, /* after sending a RRBP field in the downlink RLC data block, receives a valid RLC/MAC control message */
106 N_MAX
107};
108
Holger Hans Peter Freyther9e21d842013-10-16 17:48:12 +0200109#define GPRS_RLCMAC_FLAG_CCCH 0 /* assignment on CCCH */
110#define GPRS_RLCMAC_FLAG_PACCH 1 /* assignment on PACCH */
Pau Espin Pedrol3e48cfd2021-07-29 18:29:56 +0200111#define GPRS_RLCMAC_FLAG_DL_ACK 2 /* DL TBF: At least one DL ACK/NACK was recieved since it was assigned */
Pau Espin Pedrolea8dbdd2021-07-29 18:39:16 +0200112#define GPRS_RLCMAC_FLAG_TO_DL_ACK 3 /* DL TBF: Failed to receive last polled DL ACK/NACK */
Holger Hans Peter Freyther9e21d842013-10-16 17:48:12 +0200113#define GPRS_RLCMAC_FLAG_TO_MASK 0xf0 /* timeout bits */
114
Pau Espin Pedrola02f9452021-11-08 13:09:29 +0100115#define TBF_TFI_UNSET 0xff
Pau Espin Pedrol38a9c872021-10-12 19:18:57 +0200116
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +0200117#define T_START(tbf, t, T, r, f) tbf->t_start(t, T, r, f, __FILE__, __LINE__)
Max2399b1d2018-01-12 15:48:12 +0100118
Vadim Yanitskiycef2f842019-10-09 21:52:50 +0700119#ifdef __cplusplus
Pau Espin Pedrolda971ee2020-12-16 15:59:45 +0100120extern "C" {
121#endif
122struct gprs_rlcmac_tbf;
Pau Espin Pedrol57dcde42021-02-01 18:14:23 +0100123const char *tbf_name(const struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedroldc2aaac2021-05-14 12:50:46 +0200124enum tbf_fsm_states tbf_state(const struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrol6ad11a62021-07-27 12:27:08 +0200125struct osmo_fsm_inst *tbf_ul_ass_fi(const struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrol49a2f402021-07-27 17:33:07 +0200126struct osmo_fsm_inst *tbf_dl_ass_fi(const struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrol94386132022-10-28 19:50:09 +0200127struct osmo_fsm_inst *tbf_state_fi(const struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrolda971ee2020-12-16 15:59:45 +0100128enum gprs_rlcmac_tbf_direction tbf_direction(const struct gprs_rlcmac_tbf *tbf);
129void tbf_set_ms(struct gprs_rlcmac_tbf *tbf, struct GprsMs *ms);
130struct llist_head *tbf_ms_list(struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrol1a1557a2021-05-13 18:39:36 +0200131struct llist_head *tbf_trx_list(struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrol1e77ca82021-01-27 13:22:03 +0100132struct GprsMs *tbf_ms(const struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrolda971ee2020-12-16 15:59:45 +0100133bool tbf_timers_pending(struct gprs_rlcmac_tbf *tbf, enum tbf_timers t);
134void tbf_free(struct gprs_rlcmac_tbf *tbf);
135struct gprs_llc *tbf_llc(struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrolda971ee2020-12-16 15:59:45 +0100136uint8_t tbf_dl_slots(const struct gprs_rlcmac_tbf *tbf);
137uint8_t tbf_ul_slots(const struct gprs_rlcmac_tbf *tbf);
138bool tbf_is_tfi_assigned(const struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrolc0a250d2021-01-21 18:46:13 +0100139uint8_t tbf_tfi(const struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrol6ad11a62021-07-27 12:27:08 +0200140bool tbf_is_egprs_enabled(const struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrol32744c82021-10-12 19:36:40 +0200141void tbf_assign_control_ts(struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrol952cb3d2021-02-01 14:52:48 +0100142int tbf_check_polling(const struct gprs_rlcmac_tbf *tbf, uint32_t fn, uint8_t ts, uint32_t *poll_fn, unsigned int *rrbp);
Pau Espin Pedrol86580e12021-03-29 18:15:30 +0200143void tbf_set_polling(struct gprs_rlcmac_tbf *tbf, uint32_t new_poll_fn, uint8_t ts, enum pdch_ulc_tbf_poll_reason t);
Pau Espin Pedrol16e16782021-03-29 19:10:19 +0200144void 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 +0200145void tbf_update_state_fsm_name(struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrolab8fba32021-07-27 16:35:00 +0200146const char* tbf_rlcmac_diag(const struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrole8757692022-12-12 16:18:05 +0100147bool tbf_is_control_ts(const struct gprs_rlcmac_tbf *tbf, const struct gprs_rlcmac_pdch *pdch);
Pau Espin Pedrol32252902021-07-29 16:44:11 +0200148bool tbf_can_upgrade_to_multislot(const struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrol140c97c2022-12-13 14:14:32 +0100149struct gprs_rlcmac_pdch *tbf_get_first_ts(struct gprs_rlcmac_tbf *tbf);
150const struct gprs_rlcmac_pdch *tbf_get_first_ts_const(const struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrol22b26d82022-10-26 15:44:14 +0200151struct gprs_rlcmac_trx *tbf_get_trx(struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrolb7a2b592022-12-13 14:43:59 +0100152void tbf_unlink_pdch(struct gprs_rlcmac_tbf *tbf);
Pau Espin Pedrolee350082022-10-28 17:35:03 +0200153void tbf_stop_timers(struct gprs_rlcmac_tbf *tbf, const char *reason);
Pau Espin Pedrolda971ee2020-12-16 15:59:45 +0100154#ifdef __cplusplus
155}
156#endif
157
158#ifdef __cplusplus
Vadim Yanitskiycef2f842019-10-09 21:52:50 +0700159
Holger Hans Peter Freyther099535a2013-10-16 17:42:31 +0200160struct gprs_rlcmac_tbf {
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100161 gprs_rlcmac_tbf(struct gprs_rlcmac_bts *bts_, GprsMs *ms, gprs_rlcmac_tbf_direction dir);
Pau Espin Pedroldc2aaac2021-05-14 12:50:46 +0200162 virtual ~gprs_rlcmac_tbf();
Holger Hans Peter Freyther964ddb62013-10-16 17:53:23 +0200163
Pau Espin Pedrolb3f23972020-10-23 21:00:23 +0200164 virtual gprs_rlc_window *window() = 0;
165
Pau Espin Pedrole9f77d32020-10-23 18:41:40 +0200166 int setup(int8_t use_trx, bool single_slot);
Pau Espin Pedroldc2aaac2021-05-14 12:50:46 +0200167 bool state_is(enum tbf_fsm_states rhs) const;
168 bool state_is_not(enum tbf_fsm_states rhs) const;
Pau Espin Pedrol49a2f402021-07-27 17:33:07 +0200169 bool dl_ass_state_is(enum tbf_dl_ass_fsm_states rhs) const;
Pau Espin Pedrol6ad11a62021-07-27 12:27:08 +0200170 bool ul_ass_state_is(enum tbf_ul_ass_fsm_states rhs) const;
Maxcac6b662018-01-24 11:00:17 +0100171 void poll_sched_set(const char *file, int line);
172 void poll_sched_unset(const char *file, int line);
Daniel Willmann08e57c82014-08-15 18:11:57 +0200173 const char *state_name() const;
Holger Hans Peter Freyther1c344e22013-10-16 18:33:18 +0200174
Pau Espin Pedrol57843c52022-11-03 13:35:19 +0100175 const char *name(bool enclousure = true) const;
Jacob Erlbeckadcdf152015-03-03 14:45:55 +0100176
Jacob Erlbeck5a3c84d2016-01-22 17:25:38 +0100177 struct msgb *create_dl_ass(uint32_t fn, uint8_t ts);
Holger Hans Peter Freyther2db7e7e2013-10-26 20:45:35 +0200178
Jacob Erlbeck10ed7952015-06-02 11:37:22 +0200179 GprsMs *ms() const;
Jacob Erlbeckfecece02015-05-08 12:13:08 +0200180 void set_ms(GprsMs *ms);
181
Max847ed9f2018-02-20 18:16:11 +0100182 bool n_inc(enum tbf_counters n);
183 void n_reset(enum tbf_counters n);
184
Holger Hans Peter Freytheraf8094d2013-10-26 17:56:15 +0200185 void handle_timeout();
Maxee5be3a2017-12-20 17:31:13 +0100186 void stop_timers(const char *reason);
187 bool timers_pending(enum tbf_timers t);
188 void t_stop(enum tbf_timers t, const char *reason);
Pau Espin Pedrol28f160e2019-09-05 14:48:35 +0200189 void t_start(enum tbf_timers t, int T, const char *reason, bool force,
Max467f6332017-12-20 18:13:29 +0100190 const char *file, unsigned line);
Holger Hans Peter Freytheraa9c3262013-10-26 17:49:36 +0200191
Jacob Erlbeckf2694b72016-01-26 21:46:26 +0100192 int check_polling(uint32_t fn, uint8_t ts,
Pau Espin Pedrol57dcde42021-02-01 18:14:23 +0100193 uint32_t *poll_fn, unsigned int *rrbp) const;
Pau Espin Pedrol86580e12021-03-29 18:15:30 +0200194 void set_polling(uint32_t poll_fn, uint8_t ts, enum pdch_ulc_tbf_poll_reason reason);
Pau Espin Pedrol16e16782021-03-29 19:10:19 +0200195 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 +0200196
Holger Hans Peter Freyther474685e2013-10-27 17:01:14 +0100197 /** tlli handling */
Holger Hans Peter Freyther474685e2013-10-27 17:01:14 +0100198 uint32_t tlli() const;
199 bool is_tlli_valid() const;
Holger Hans Peter Freyther474685e2013-10-27 17:01:14 +0100200
Holger Hans Peter Freyther34f6e5e2013-10-27 20:31:47 +0100201 uint8_t tfi() const;
202
Holger Hans Peter Freyther5464c9b2013-10-27 20:57:35 +0100203 const char *imsi() const;
Jacob Erlbeck9200ce62015-05-22 17:48:04 +0200204 uint8_t ta() const;
205 void set_ta(uint8_t);
Jacob Erlbeckbefc7602015-06-02 12:33:30 +0200206 uint8_t ms_class() const;
Pau Espin Pedrol2ae83372020-05-18 11:35:35 +0200207 enum CodingScheme current_cs() const;
Holger Hans Peter Freyther5464c9b2013-10-27 20:57:35 +0100208
Holger Hans Peter Freythera0047992014-01-16 10:07:20 +0100209 time_t created_ts() const;
Jacob Erlbeck617c7122015-06-30 09:18:30 +0200210 uint8_t dl_slots() const;
211 uint8_t ul_slots() const;
Daniel Willmann80367aa2014-01-15 17:40:28 +0100212
Jacob Erlbeck5643f352015-11-27 16:17:40 +0100213 /* EGPRS */
214 bool is_egprs_enabled() const;
Jacob Erlbeck5643f352015-11-27 16:17:40 +0100215
Holger Hans Peter Freyther7a5f3c22013-11-26 13:08:12 +0100216 /* attempt to make things a bit more fair */
217 void rotate_in_list();
218
Holger Hans Peter Freyther099535a2013-10-16 17:42:31 +0200219 enum gprs_rlcmac_tbf_direction direction;
Holger Hans Peter Freyther743bafa2013-09-29 07:50:50 +0200220 struct gprs_rlcmac_trx *trx;
Pau Espin Pedrole2ed40d2022-12-15 17:35:05 +0100221 struct gprs_rlcmac_pdch *control_ts; /* timeslot control messages and polling */
Holger Hans Peter Freyther099535a2013-10-16 17:42:31 +0200222 struct gprs_rlcmac_pdch *pdch[8]; /* list of PDCHs allocated to TBF */
Holger Hans Peter Freyther28e53782013-11-06 20:23:56 +0100223
224 gprs_llc m_llc;
Holger Hans Peter Freyther9241fd02013-11-13 19:51:55 +0100225 gprs_rlc m_rlc;
Max847ed9f2018-02-20 18:16:11 +0100226
Holger Hans Peter Freyther099535a2013-10-16 17:42:31 +0200227 unsigned int fT; /* fTxxxx number */
228 unsigned int num_fT_exp; /* number of consecutive fT expirations */
229
Jacob Erlbeckb6b3c7e2015-08-28 12:07:14 +0200230 struct Meas {
Stefan Sperlingf0f7df12018-05-25 15:12:30 +0200231 struct timespec rssi_tv; /* timestamp for rssi calculation */
Holger Hans Peter Freyther099535a2013-10-16 17:42:31 +0200232 int32_t rssi_sum; /* sum of rssi values */
233 int rssi_num; /* number of rssi values added since rssi_tv */
Jacob Erlbeckb6b3c7e2015-08-28 12:07:14 +0200234
235 Meas();
Holger Hans Peter Freyther099535a2013-10-16 17:42:31 +0200236 } meas;
237
Daniel Willmanncf1fae72014-05-30 17:58:01 +0200238 /* Can/should we upgrade this tbf to use multiple slots? */
Pau Espin Pedrol907f0372021-07-29 16:34:04 +0200239 bool upgrade_to_multislot;
Daniel Willmanncf1fae72014-05-30 17:58:01 +0200240
Holger Hans Peter Freyther9f0c1d22013-10-19 21:24:34 +0200241 /* store the BTS this TBF belongs to */
Pau Espin Pedrol2182e622021-01-14 16:48:38 +0100242 struct gprs_rlcmac_bts *bts;
Holger Hans Peter Freytherd9262b32013-10-26 20:12:59 +0200243
Holger Hans Peter Freyther474685e2013-10-27 17:01:14 +0100244 /*
245 * private fields. We can't make it private as it is breaking the
246 * llist macros.
247 */
Holger Hans Peter Freyther34f6e5e2013-10-27 20:31:47 +0100248 uint8_t m_tfi;
Holger Hans Peter Freythera0047992014-01-16 10:07:20 +0100249 time_t m_created_ts;
Holger Hans Peter Freyther474685e2013-10-27 17:01:14 +0100250
sivasankari53950732016-12-08 17:15:17 +0530251 struct rate_ctr_group *m_ctrs;
Pau Espin Pedrolf197f152022-11-17 20:18:46 +0100252 struct osmo_fsm_inst *state_fi;
Pau Espin Pedrol6ad11a62021-07-27 12:27:08 +0200253 struct tbf_ul_ass_fsm_ctx ul_ass_fsm;
Pau Espin Pedrol49a2f402021-07-27 17:33:07 +0200254 struct tbf_ul_ass_fsm_ctx dl_ass_fsm;
Pau Espin Pedrol6ad11a62021-07-27 12:27:08 +0200255
Pau Espin Pedrolda971ee2020-12-16 15:59:45 +0100256 struct llist_item m_ms_list;
Pau Espin Pedrol1a1557a2021-05-13 18:39:36 +0200257 struct llist_item m_trx_list;
sivasankari53950732016-12-08 17:15:17 +0530258
Holger Hans Peter Freytherd9262b32013-10-26 20:12:59 +0200259protected:
Jacob Erlbeck28c40b12015-08-16 18:19:32 +0200260 void merge_and_clear_ms(GprsMs *old_ms);
Holger Hans Peter Freyther4c06d912013-11-25 23:05:26 +0100261
Alexander Couzensd38b92e2016-08-21 19:38:30 +0200262 gprs_llc_queue *llc_queue();
263 const gprs_llc_queue *llc_queue() const;
264
Pau Espin Pedrolda971ee2020-12-16 15:59:45 +0100265 struct GprsMs *m_ms;
Jacob Erlbeckadcdf152015-03-03 14:45:55 +0100266private:
Pau Espin Pedrole9f77d32020-10-23 18:41:40 +0200267 void enable_egprs();
Jacob Erlbeck5643f352015-11-27 16:17:40 +0100268 bool m_egprs_enabled;
Pau Espin Pedrolef1fe582019-09-05 14:40:24 +0200269 struct osmo_timer_list Tarr[T_MAX];
270 uint8_t Narr[N_MAX];
Pau Espin Pedrol57843c52022-11-03 13:35:19 +0100271 mutable char m_name_buf[128];
Holger Hans Peter Freyther099535a2013-10-16 17:42:31 +0200272};
273
Pau Espin Pedroldc2aaac2021-05-14 12:50:46 +0200274inline bool gprs_rlcmac_tbf::state_is(enum tbf_fsm_states rhs) const
Holger Hans Peter Freyther1c344e22013-10-16 18:33:18 +0200275{
Pau Espin Pedroldc2aaac2021-05-14 12:50:46 +0200276 return tbf_state(this) == rhs;
Holger Hans Peter Freyther1c344e22013-10-16 18:33:18 +0200277}
278
Pau Espin Pedrol49a2f402021-07-27 17:33:07 +0200279inline bool gprs_rlcmac_tbf::dl_ass_state_is(enum tbf_dl_ass_fsm_states rhs) const
Max0e599802018-01-23 20:09:06 +0100280{
Pau Espin Pedrol49a2f402021-07-27 17:33:07 +0200281 return tbf_dl_ass_fi(this)->state == rhs;
Max0e599802018-01-23 20:09:06 +0100282}
283
Pau Espin Pedrol6ad11a62021-07-27 12:27:08 +0200284inline bool gprs_rlcmac_tbf::ul_ass_state_is(enum tbf_ul_ass_fsm_states rhs) const
Max0e599802018-01-23 20:09:06 +0100285{
Pau Espin Pedrol6ad11a62021-07-27 12:27:08 +0200286 return tbf_ul_ass_fi(this)->state == rhs;
Max0e599802018-01-23 20:09:06 +0100287}
288
Pau Espin Pedroldc2aaac2021-05-14 12:50:46 +0200289inline bool gprs_rlcmac_tbf::state_is_not(enum tbf_fsm_states rhs) const
Holger Hans Peter Freyther1c344e22013-10-16 18:33:18 +0200290{
Pau Espin Pedroldc2aaac2021-05-14 12:50:46 +0200291 return tbf_state(this) != rhs;
Holger Hans Peter Freyther1c344e22013-10-16 18:33:18 +0200292}
293
Pau Espin Pedroldc2aaac2021-05-14 12:50:46 +0200294
Daniel Willmann08e57c82014-08-15 18:11:57 +0200295inline const char *gprs_rlcmac_tbf::state_name() const
296{
Pau Espin Pedrolf197f152022-11-17 20:18:46 +0100297 return osmo_fsm_inst_state_name(state_fi);
Daniel Willmann08e57c82014-08-15 18:11:57 +0200298}
299
Jacob Erlbeck10ed7952015-06-02 11:37:22 +0200300inline GprsMs *gprs_rlcmac_tbf::ms() const
Jacob Erlbeckfecece02015-05-08 12:13:08 +0200301{
302 return m_ms;
303}
304
Holger Hans Peter Freyther474685e2013-10-27 17:01:14 +0100305inline bool gprs_rlcmac_tbf::is_tlli_valid() const
306{
Vadim Yanitskiycb988942020-11-08 13:27:35 +0700307 return tlli() != GSM_RESERVED_TMSI;
Holger Hans Peter Freyther474685e2013-10-27 17:01:14 +0100308}
309
Holger Hans Peter Freyther34f6e5e2013-10-27 20:31:47 +0100310inline uint8_t gprs_rlcmac_tbf::tfi() const
311{
312 return m_tfi;
313}
314
Holger Hans Peter Freythera0047992014-01-16 10:07:20 +0100315inline time_t gprs_rlcmac_tbf::created_ts() const
Daniel Willmann80367aa2014-01-15 17:40:28 +0100316{
Holger Hans Peter Freythera0047992014-01-16 10:07:20 +0100317 return m_created_ts;
Daniel Willmann80367aa2014-01-15 17:40:28 +0100318}
319
Jacob Erlbeck5643f352015-11-27 16:17:40 +0100320inline bool gprs_rlcmac_tbf::is_egprs_enabled() const
321{
322 return m_egprs_enabled;
323}
324
Jacob Erlbeckac89a552015-06-29 14:18:46 +0200325inline enum gprs_rlcmac_tbf_direction reverse(enum gprs_rlcmac_tbf_direction dir)
326{
327 return (enum gprs_rlcmac_tbf_direction)
328 ((int)GPRS_RLCMAC_UL_TBF - (int)dir + (int)GPRS_RLCMAC_DL_TBF);
329}
Jacob Erlbeckaa9daa12015-12-28 18:49:12 +0100330
Pau Espin Pedrol0ece97d2021-01-18 12:53:54 +0100331uint16_t egprs_window_size(const struct gprs_rlcmac_bts *bts, uint8_t slots);
Max9d7357e2017-12-14 15:02:33 +0100332
Daniel Willmannafa72f52014-01-15 17:06:19 +0100333#endif