blob: 04ec4fd35cd42434e7ca8de79e47a16e84dd4508 [file] [log] [blame]
Holger Hans Peter Freytherb78adcd2013-10-17 20:12:37 +02001/* poll_controller.h
2 *
3 * Copyright (C) 2012 Andreas Eversberg <jolly@eversberg.eu>
4 * Copyright (C) 2013 by Holger Hans Peter Freyther
5 *
6 * All Rights Reserved
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU Affero General Public License as published by
10 * the Free Software Foundation; either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU Affero General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 *
21 */
22
23#include <poll_controller.h>
Holger Hans Peter Freyther34bd8bd2013-10-19 21:10:38 +020024#include <bts.h>
Holger Hans Peter Freytherb78adcd2013-10-17 20:12:37 +020025#include <tbf.h>
Pau Espin Pedrol9d1cdb12019-09-25 17:47:02 +020026#include <tbf_ul.h>
Pau Espin Pedrol2182e622021-01-14 16:48:38 +010027#include <tbf_dl.h>
Max1187a772018-01-26 13:31:42 +010028#include <cxx_linuxlist.h>
29#include <sba.h>
30
31extern "C" {
32#include <osmocom/core/linuxlist.h>
33#include <osmocom/gsm/gsm_utils.h>
34}
Holger Hans Peter Freytherb78adcd2013-10-17 20:12:37 +020035
Pau Espin Pedrol2182e622021-01-14 16:48:38 +010036PollController::PollController(struct gprs_rlcmac_bts& bts)
Holger Hans Peter Freytherb78adcd2013-10-17 20:12:37 +020037 : m_bts(bts)
38{}
39
Max9dabfa22017-05-16 16:10:45 +020040static inline bool elapsed_fn_check(unsigned max_delay, int frame_number, uint32_t from)
41{
42 uint32_t elapsed = (frame_number + GSM_MAX_FN - from) % GSM_MAX_FN;
43
44 if (elapsed > max_delay && elapsed < 2715400)
45 return true;
46
47 return false;
48}
49
Jacob Erlbeckac49d092015-08-27 13:18:24 +020050void PollController::expireTimedout(int frame_number, unsigned max_delay)
Holger Hans Peter Freytherb78adcd2013-10-17 20:12:37 +020051{
Daniel Willmann93d17112014-08-07 13:05:43 +020052 struct gprs_rlcmac_dl_tbf *dl_tbf;
53 struct gprs_rlcmac_ul_tbf *ul_tbf;
Holger Hans Peter Freytherb78adcd2013-10-17 20:12:37 +020054 struct gprs_rlcmac_sba *sba, *sba2;
Pau Espin Pedrol2182e622021-01-14 16:48:38 +010055 struct llist_item *pos;
Holger Hans Peter Freytherb78adcd2013-10-17 20:12:37 +020056
Pau Espin Pedrol2182e622021-01-14 16:48:38 +010057 llist_for_each_entry(pos, &m_bts.ul_tbfs, list) {
58 ul_tbf = as_ul_tbf((struct gprs_rlcmac_tbf *)pos->entry);
Maxcac6b662018-01-24 11:00:17 +010059 if (ul_tbf->poll_scheduled()) {
Max9dabfa22017-05-16 16:10:45 +020060 if (elapsed_fn_check(max_delay, frame_number, ul_tbf->poll_fn))
Daniel Willmann93d17112014-08-07 13:05:43 +020061 ul_tbf->poll_timeout();
Holger Hans Peter Freytherb78adcd2013-10-17 20:12:37 +020062 }
63 }
Pau Espin Pedrol2182e622021-01-14 16:48:38 +010064 llist_for_each_entry(pos, &m_bts.dl_tbfs, list) {
65 dl_tbf = as_dl_tbf((struct gprs_rlcmac_tbf *)pos->entry);
Maxcac6b662018-01-24 11:00:17 +010066 if (dl_tbf->poll_scheduled()) {
Max9dabfa22017-05-16 16:10:45 +020067 if (elapsed_fn_check(max_delay, frame_number, dl_tbf->poll_fn))
Daniel Willmann93d17112014-08-07 13:05:43 +020068 dl_tbf->poll_timeout();
Holger Hans Peter Freytherb78adcd2013-10-17 20:12:37 +020069 }
70 }
Pau Espin Pedrol2182e622021-01-14 16:48:38 +010071 llist_for_each_entry_safe(sba, sba2, &bts_sba(&m_bts)->m_sbas, list) {
Max9dabfa22017-05-16 16:10:45 +020072 if (elapsed_fn_check(max_delay, frame_number, sba->fn)) {
Holger Hans Peter Freytherb78adcd2013-10-17 20:12:37 +020073 /* sba will be freed here */
Pau Espin Pedrol2182e622021-01-14 16:48:38 +010074 bts_sba(&m_bts)->timeout(sba);
Holger Hans Peter Freytherb78adcd2013-10-17 20:12:37 +020075 }
76 }
77
78}