blob: a259c03d5b157b046c0dc525c7b06e176dfe073c [file] [log] [blame]
Pau Espin Pedrol49a2f402021-07-27 17:33:07 +02001/* tbf_dl_ass_fsm.h
2 *
3 * Copyright (C) 2021 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
4 * Author: Pau Espin Pedrol <pespin@sysmocom.de>
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
Pau Espin Pedrol49a2f402021-07-27 17:33:07 +020015 */
16#pragma once
17
18#include <osmocom/core/fsm.h>
19#include <osmocom/core/tdef.h>
20
21#include <gprs_pcu.h>
22
23struct gprs_rlcmac_tbf;
24
25enum tbf_dl_ass_fsm_event {
26 TBF_DL_ASS_EV_SCHED_ASS, /* Tx Uplink Assignment is pending */
27 TBF_DL_ASS_EV_CREATE_RLCMAC_MSG, /* Scheduler wants to gen+Tx the Ass (rej): data=tbf_dl_ass_ev_create_rlcmac_msg_ctx */
28 TBF_DL_ASS_EV_RX_ASS_CTRL_ACK, /* Received CTRL ACK answering poll set on Pkt Dl Ass */
29 TBF_DL_ASS_EV_ASS_POLL_TIMEOUT, /* Pdch Ul Controller signals timeout for poll set on Pkt Dl Ass */
30};
31
32enum tbf_dl_ass_fsm_states {
33 TBF_DL_ASS_NONE = 0,
34 TBF_DL_ASS_SEND_ASS, /* send downlink assignment on next RTS */
35 TBF_DL_ASS_WAIT_ACK, /* wait for PACKET CONTROL ACK */
36};
37
38struct tbf_dl_ass_fsm_ctx {
39 struct osmo_fsm_inst *fi;
40 struct gprs_rlcmac_tbf* tbf; /* back pointer */
41};
42
43extern const struct osmo_tdef_state_timeout tbf_dl_ass_fsm_timeouts[32];
44/* Transition to a state, using the T timer defined in tbf_dl_ass_fsm_timeouts.
45 * The actual timeout value is in turn obtained from conn->T_defs.
46 * Assumes local variable fi exists. */
47#define tbf_dl_ass_fsm_state_chg(fi, NEXT_STATE) \
48 osmo_tdef_fsm_inst_state_chg(fi, NEXT_STATE, \
49 tbf_dl_ass_fsm_timeouts, \
50 the_pcu->T_defs, \
51 -1)
52
53extern struct osmo_fsm tbf_dl_ass_fsm;
54
55
56/* passed as data in TBF_DL_ASS_EV_CREATE_RLCMAC_MSG */
57struct tbf_dl_ass_ev_create_rlcmac_msg_ctx {
58 uint32_t fn; /* FN where the created DL ctrl block is to be sent */
59 uint8_t ts; /* TS where the created DL ctrl block is to be sent */
60 struct msgb *msg; /* to be filled by FSM during event processing */
61};
62
63
64struct msgb *tbf_dl_ass_create_rlcmac_msg(const struct gprs_rlcmac_tbf* tbf, uint32_t fn, uint8_t ts);
65bool tbf_dl_ass_rts(const struct gprs_rlcmac_tbf* tbf);