/* poll_controller.h * * Copyright (C) 2012 Andreas Eversberg * Copyright (C) 2013 by Holger Hans Peter Freyther * * All Rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ #include #include #include #include #include #include #include extern "C" { #include #include } PollController::PollController(struct gprs_rlcmac_bts& bts) : m_bts(bts) {} static inline bool elapsed_fn_check(unsigned max_delay, int frame_number, uint32_t from) { uint32_t elapsed = (frame_number + GSM_MAX_FN - from) % GSM_MAX_FN; if (elapsed > max_delay && elapsed < 2715400) return true; return false; } void PollController::expireTimedout(int frame_number, unsigned max_delay) { struct gprs_rlcmac_dl_tbf *dl_tbf; struct gprs_rlcmac_ul_tbf *ul_tbf; struct gprs_rlcmac_sba *sba, *sba2; struct llist_item *pos; llist_for_each_entry(pos, &m_bts.ul_tbfs, list) { ul_tbf = as_ul_tbf((struct gprs_rlcmac_tbf *)pos->entry); if (ul_tbf->poll_scheduled()) { if (elapsed_fn_check(max_delay, frame_number, ul_tbf->poll_fn)) ul_tbf->poll_timeout(); } } llist_for_each_entry(pos, &m_bts.dl_tbfs, list) { dl_tbf = as_dl_tbf((struct gprs_rlcmac_tbf *)pos->entry); if (dl_tbf->poll_scheduled()) { if (elapsed_fn_check(max_delay, frame_number, dl_tbf->poll_fn)) dl_tbf->poll_timeout(); } } llist_for_each_entry_safe(sba, sba2, &bts_sba(&m_bts)->m_sbas, list) { if (elapsed_fn_check(max_delay, frame_number, sba->fn)) { /* sba will be freed here */ bts_sba(&m_bts)->timeout(sba); } } }