blob: 0bf616ef38e1c750e3f6e5c28dbee3890cb1f1ab [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>
26
27PollController::PollController(BTS& bts)
28 : m_bts(bts)
29{}
30
31void PollController::expireTimedout(int frame_number)
32{
33 struct gprs_rlcmac_bts *bts = m_bts.bts_data();
Daniel Willmann93d17112014-08-07 13:05:43 +020034 struct gprs_rlcmac_dl_tbf *dl_tbf;
35 struct gprs_rlcmac_ul_tbf *ul_tbf;
Holger Hans Peter Freytherb78adcd2013-10-17 20:12:37 +020036 struct gprs_rlcmac_sba *sba, *sba2;
Daniel Willmann1b3864f2014-07-30 13:25:19 +020037 struct llist_pods *lpods;
Holger Hans Peter Freytherb78adcd2013-10-17 20:12:37 +020038 uint32_t elapsed;
39
Daniel Willmann1c155732014-08-25 16:20:09 +020040 /* check for poll timeout
41 * The UL frame numbers lag 3 behind the DL frames and the data
42 * indication is only sent after all 4 frames of the block have been
43 * received. Sometimes there is an idle frame between the end of one
44 * and start of another frame (every 3 blocks). So the timeout should
45 * definitely be there if we're more than 8 frames past poll_fn. Let's
46 * stay on the safe side and say 13 or more. */
Daniel Willmann93d17112014-08-07 13:05:43 +020047 llist_pods_for_each_entry(ul_tbf, &bts->ul_tbfs, list, lpods) {
48 if (ul_tbf->poll_state == GPRS_RLCMAC_POLL_SCHED) {
49 elapsed = (frame_number + 2715648 - ul_tbf->poll_fn)
Holger Hans Peter Freytherb78adcd2013-10-17 20:12:37 +020050 % 2715648;
Daniel Willmann1c155732014-08-25 16:20:09 +020051 if (elapsed >= 13 && elapsed < 2715400)
Daniel Willmann93d17112014-08-07 13:05:43 +020052 ul_tbf->poll_timeout();
Holger Hans Peter Freytherb78adcd2013-10-17 20:12:37 +020053 }
54 }
Daniel Willmann93d17112014-08-07 13:05:43 +020055 llist_pods_for_each_entry(dl_tbf, &bts->dl_tbfs, list, lpods) {
56 if (dl_tbf->poll_state == GPRS_RLCMAC_POLL_SCHED) {
57 elapsed = (frame_number + 2715648 - dl_tbf->poll_fn)
Holger Hans Peter Freytherb78adcd2013-10-17 20:12:37 +020058 % 2715648;
Daniel Willmann1c155732014-08-25 16:20:09 +020059 if (elapsed >= 13 && elapsed < 2715400)
Daniel Willmann93d17112014-08-07 13:05:43 +020060 dl_tbf->poll_timeout();
Holger Hans Peter Freytherb78adcd2013-10-17 20:12:37 +020061 }
62 }
Holger Hans Peter Freythercedf8902013-10-19 20:47:12 +020063 llist_for_each_entry_safe(sba, sba2, &m_bts.sba()->m_sbas, list) {
Holger Hans Peter Freytherb78adcd2013-10-17 20:12:37 +020064 elapsed = (frame_number + 2715648 - sba->fn) % 2715648;
Daniel Willmann1c155732014-08-25 16:20:09 +020065 if (elapsed >= 13 && elapsed < 2715400) {
Holger Hans Peter Freytherb78adcd2013-10-17 20:12:37 +020066 /* sba will be freed here */
Holger Hans Peter Freythercedf8902013-10-19 20:47:12 +020067 m_bts.sba()->timeout(sba);
Holger Hans Peter Freytherb78adcd2013-10-17 20:12:37 +020068 }
69 }
70
71}