/* poll_controller.h
 *
 * Copyright (C) 2012 Andreas Eversberg <jolly@eversberg.eu>
 * 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 <http://www.gnu.org/licenses/>.
 *
 */

#include <poll_controller.h>
#include <bts.h>
#include <tbf.h>

PollController::PollController(BTS& bts)
	: m_bts(bts)
{}

void PollController::expireTimedout(int frame_number)
{
	struct gprs_rlcmac_bts *bts = m_bts.bts_data();
	struct gprs_rlcmac_tbf *tbf;
	struct gprs_rlcmac_sba *sba, *sba2;
	uint32_t elapsed;

	/* check for poll timeout */
	llist_for_each_entry(tbf, &bts->ul_tbfs, list) {
		if (tbf->poll_state == GPRS_RLCMAC_POLL_SCHED) {
			elapsed = (frame_number + 2715648 - tbf->poll_fn)
								% 2715648;
			if (elapsed >= 20 && elapsed < 2715400)
				tbf->poll_timeout();
		}
	}
	llist_for_each_entry(tbf, &bts->dl_tbfs, list) {
		if (tbf->poll_state == GPRS_RLCMAC_POLL_SCHED) {
			elapsed = (frame_number + 2715648 - tbf->poll_fn)
								% 2715648;
			if (elapsed >= 20 && elapsed < 2715400)
				tbf->poll_timeout();
		}
	}
	llist_for_each_entry_safe(sba, sba2, &m_bts.sba()->m_sbas, list) {
		elapsed = (frame_number + 2715648 - sba->fn) % 2715648;
		if (elapsed >= 20 && elapsed < 2715400) {
			/* sba will be freed here */
			m_bts.sba()->timeout(sba);
		}
	}

}
