blob: 567babeb8b87a20c7c49e5181692b19d7a1731de [file] [log] [blame]
Holger Hans Peter Freyther621dc2f2013-10-19 20:11:46 +02001/* sba.cpp
2 *
3 * Copyright (C) 2012 Ivan Klyuchnikov
4 * Copyright (C) 2012 Andreas Eversberg <jolly@eversberg.eu>
5 * Copyright (C) 2013 by Holger Hans Peter Freyther
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 */
21
Holger Hans Peter Freythercedf8902013-10-19 20:47:12 +020022#include <sba.h>
Holger Hans Peter Freyther621dc2f2013-10-19 20:11:46 +020023#include <gprs_debug.h>
24#include <bts.h>
Max9dabfa22017-05-16 16:10:45 +020025#include <pcu_utils.h>
Max6dc90b82018-02-19 17:17:28 +010026#include <pdch.h>
Holger Hans Peter Freyther621dc2f2013-10-19 20:11:46 +020027
28extern "C" {
Max1187a772018-01-26 13:31:42 +010029#include <osmocom/core/logging.h>
Holger Hans Peter Freyther621dc2f2013-10-19 20:11:46 +020030#include <osmocom/core/talloc.h>
Max9bbe1602016-07-18 12:50:18 +020031#include <osmocom/gsm/protocol/gsm_04_08.h>
Max1187a772018-01-26 13:31:42 +010032#include <osmocom/gsm/gsm_utils.h>
Holger Hans Peter Freyther621dc2f2013-10-19 20:11:46 +020033}
34
35#include <errno.h>
36
37extern void *tall_pcu_ctx;
38
39/* starting time for assigning single slot
40 * This offset must be a multiple of 13. */
41#define AGCH_START_OFFSET 52
42
Holger Hans Peter Freythercedf8902013-10-19 20:47:12 +020043SBAController::SBAController(BTS &bts)
44 : m_bts(bts)
45{
46 INIT_LLIST_HEAD(&m_sbas);
47}
Holger Hans Peter Freyther621dc2f2013-10-19 20:11:46 +020048
Holger Hans Peter Freythercedf8902013-10-19 20:47:12 +020049int SBAController::alloc(
Holger Hans Peter Freyther621dc2f2013-10-19 20:11:46 +020050 uint8_t *_trx, uint8_t *_ts, uint32_t *_fn, uint8_t ta)
51{
52
53 struct gprs_rlcmac_pdch *pdch;
54 struct gprs_rlcmac_sba *sba;
Jacob Erlbeck506f1562015-07-02 13:19:49 +020055 int8_t trx, ts;
Holger Hans Peter Freyther621dc2f2013-10-19 20:11:46 +020056 uint32_t fn;
57
58 sba = talloc_zero(tall_pcu_ctx, struct gprs_rlcmac_sba);
59 if (!sba)
60 return -ENOMEM;
61
Max9bbe1602016-07-18 12:50:18 +020062 if (!gsm48_ta_is_valid(ta))
63 return -EINVAL;
64
Holger Hans Peter Freyther621dc2f2013-10-19 20:11:46 +020065 for (trx = 0; trx < 8; trx++) {
Jacob Erlbeck506f1562015-07-02 13:19:49 +020066 for (ts = 7; ts >= 0; ts--) {
Holger Hans Peter Freythercedf8902013-10-19 20:47:12 +020067 pdch = &m_bts.bts_data()->trx[trx].pdch[ts];
Holger Hans Peter Freyther621dc2f2013-10-19 20:11:46 +020068 if (!pdch->is_enabled())
69 continue;
70 break;
71 }
Jacob Erlbeck1139ec12015-07-15 14:17:19 +020072 if (ts >= 0)
Holger Hans Peter Freyther621dc2f2013-10-19 20:11:46 +020073 break;
74 }
75 if (trx == 8) {
76 LOGP(DRLCMAC, LOGL_NOTICE, "No PDCH available.\n");
77 talloc_free(sba);
78 return -EINVAL;
79 }
80
Max9dabfa22017-05-16 16:10:45 +020081 fn = next_fn(pdch->last_rts_fn, AGCH_START_OFFSET);
Holger Hans Peter Freyther621dc2f2013-10-19 20:11:46 +020082
Holger Hans Peter Freyther09ef27a2013-10-20 16:37:05 +020083 sba->trx_no = trx;
84 sba->ts_no = ts;
Holger Hans Peter Freyther621dc2f2013-10-19 20:11:46 +020085 sba->fn = fn;
86 sba->ta = ta;
87
Holger Hans Peter Freythercedf8902013-10-19 20:47:12 +020088 llist_add(&sba->list, &m_sbas);
Holger Hans Peter Freyther93e048f2013-10-27 10:00:47 +010089 m_bts.sba_allocated();
Holger Hans Peter Freyther621dc2f2013-10-19 20:11:46 +020090
91 *_trx = trx;
92 *_ts = ts;
93 *_fn = fn;
94 return 0;
95}
96
Holger Hans Peter Freythercedf8902013-10-19 20:47:12 +020097gprs_rlcmac_sba *SBAController::find(uint8_t trx, uint8_t ts, uint32_t fn)
Holger Hans Peter Freyther621dc2f2013-10-19 20:11:46 +020098{
99 struct gprs_rlcmac_sba *sba;
100
Holger Hans Peter Freythercedf8902013-10-19 20:47:12 +0200101 llist_for_each_entry(sba, &m_sbas, list) {
Holger Hans Peter Freyther09ef27a2013-10-20 16:37:05 +0200102 if (sba->trx_no == trx && sba->ts_no == ts && sba->fn == fn)
Holger Hans Peter Freyther621dc2f2013-10-19 20:11:46 +0200103 return sba;
104 }
105
106 return NULL;
107}
108
Holger Hans Peter Freytherdea63b92013-10-26 18:56:43 +0200109gprs_rlcmac_sba *SBAController::find(const gprs_rlcmac_pdch *pdch, uint32_t fn)
110{
111 return find(pdch->trx_no(), pdch->ts_no, fn);
112}
113
Holger Hans Peter Freythercedf8902013-10-19 20:47:12 +0200114uint32_t SBAController::sched(uint8_t trx, uint8_t ts, uint32_t fn, uint8_t block_nr)
Holger Hans Peter Freyther621dc2f2013-10-19 20:11:46 +0200115{
Max9dabfa22017-05-16 16:10:45 +0200116 uint32_t sba_fn = fn + 4;
Holger Hans Peter Freyther621dc2f2013-10-19 20:11:46 +0200117 struct gprs_rlcmac_sba *sba;
118
119 /* check special TBF for events */
Holger Hans Peter Freyther621dc2f2013-10-19 20:11:46 +0200120 if ((block_nr % 3) == 2)
Max9dabfa22017-05-16 16:10:45 +0200121 sba_fn++;
122 sba_fn = sba_fn % GSM_MAX_FN;
Holger Hans Peter Freythercedf8902013-10-19 20:47:12 +0200123 sba = find(trx, ts, sba_fn);
Holger Hans Peter Freyther621dc2f2013-10-19 20:11:46 +0200124 if (sba)
125 return sba_fn;
126
127 return 0xffffffff;
128}
129
Holger Hans Peter Freythercedf8902013-10-19 20:47:12 +0200130int SBAController::timeout(struct gprs_rlcmac_sba *sba)
Holger Hans Peter Freyther621dc2f2013-10-19 20:11:46 +0200131{
Max127a1e02017-01-12 11:37:58 +0100132 LOGP(DRLCMAC, LOGL_NOTICE,
133 "Poll timeout for SBA (TRX=%u, TS=%u, FN=%u, TA=%u)\n", sba->trx_no,
134 sba->ts_no, sba->fn, sba->ta);
Holger Hans Peter Freyther93e048f2013-10-27 10:00:47 +0100135 m_bts.sba_timedout();
Holger Hans Peter Freytherb98dd9e2013-10-27 10:20:37 +0100136 free_sba(sba);
Holger Hans Peter Freyther621dc2f2013-10-19 20:11:46 +0200137 return 0;
138}
139
Holger Hans Peter Freytherb98dd9e2013-10-27 10:20:37 +0100140void SBAController::free_sba(gprs_rlcmac_sba *sba)
141{
142 m_bts.sba_freed();
143 llist_del(&sba->list);
144 talloc_free(sba);
145}
146
Holger Hans Peter Freyther09ef27a2013-10-20 16:37:05 +0200147void SBAController::free_resources(struct gprs_rlcmac_pdch *pdch)
Holger Hans Peter Freythercedf8902013-10-19 20:47:12 +0200148{
149 struct gprs_rlcmac_sba *sba, *sba2;
Holger Hans Peter Freyther09ef27a2013-10-20 16:37:05 +0200150 const uint8_t trx_no = pdch->trx->trx_no;
151 const uint8_t ts_no = pdch->ts_no;
Holger Hans Peter Freythercedf8902013-10-19 20:47:12 +0200152
153 llist_for_each_entry_safe(sba, sba2, &m_sbas, list) {
Holger Hans Peter Freytherb98dd9e2013-10-27 10:20:37 +0100154 if (sba->trx_no == trx_no && sba->ts_no == ts_no)
155 free_sba(sba);
Holger Hans Peter Freythercedf8902013-10-19 20:47:12 +0200156 }
157}