/* 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>
#include <tbf_ul.h>
#include <tbf_dl.h>
#include <cxx_linuxlist.h>
#include <sba.h>

extern "C" {
#include <osmocom/core/linuxlist.h>
#include <osmocom/gsm/gsm_utils.h>
}

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);
		}
	}

}
