trx_toolkit/clck_gen: Fix clock generator to emit ticks with exactly GSM frame period
[osmocom-bb.git] / include / l1gprs.h
blob6a18da1f25e49ef3b62c10c1be0470e2e2283aaa
1 #pragma once
3 #include <stdint.h>
4 #include <stdbool.h>
5 #include <stddef.h>
7 #include <osmocom/core/linuxlist.h>
9 struct l1gprs_state;
10 struct msgb;
12 struct l1gprs_tbf_pending_req {
13 /*! Item in l1gprs_state->tbf_list_pending */
14 struct llist_head list;
15 /*! Uplink or Downlink */
16 bool uplink;
17 /*! TBF reference number (not index) */
18 uint8_t tbf_ref;
19 /*! PDCH timeslots used by this TBF */
20 uint8_t slotmask;
21 /*! (Downlink only) DL TFI (Temporary Flow Indentity): 0..31 */
22 uint8_t dl_tfi;
23 /*! TBF starting time (absolute TDMA Fn) */
24 uint32_t start_fn;
27 struct l1gprs_tbf {
28 /*! Item in l1gprs_state->tbf_list */
29 struct llist_head list;
30 /*! Uplink or Downlink */
31 bool uplink;
32 /*! TBF reference number (not index) */
33 uint8_t tbf_ref;
34 /*! PDCH timeslots used by this TBF */
35 uint8_t slotmask;
36 /*! (Downlink only) DL TFI (Temporary Flow Indentity): 0..31 */
37 uint8_t dl_tfi;
40 struct l1gprs_pdch {
41 /*! Timeslot number */
42 uint8_t tn;
43 /*! Backpointer to l1gprs_state we belong to */
44 struct l1gprs_state *gprs;
45 /*! UL TBF count */
46 uint8_t ul_tbf_count;
47 /*! DL TBF count */
48 uint8_t dl_tbf_count;
49 /*! DL TFI mask */
50 uint32_t dl_tfi_mask;
51 /*! Pending UL TBF count */
52 uint8_t pending_ul_tbf_count;
53 /*! Pending DL TBF count */
54 uint8_t pending_dl_tbf_count;
57 static inline size_t l1gprs_pdch_use_count(const struct l1gprs_pdch *pdch)
59 return pdch->ul_tbf_count + pdch->dl_tbf_count +
60 pdch->pending_ul_tbf_count + pdch->pending_dl_tbf_count;
64 typedef void (*l1gprs_pdch_changed_t)(struct l1gprs_pdch *pdch, bool active);
66 struct l1gprs_state {
67 /*! PDCH state for each timeslot */
68 struct l1gprs_pdch pdch[8];
69 /*! Uplink and Downlink TBFs (active), struct l1gprs_pending_tbf */
70 struct llist_head tbf_list;
71 /*! Uplink and Downlink TBFs (pending), struct l1gprs_tbf_pending_req */
72 struct llist_head tbf_list_pending;
73 /*! Logging context (used as prefix for messages) */
74 char *log_prefix;
75 /*! Some private data for API user */
76 void *priv;
77 /*! Callback triggered to signal lower layers when a PDCH TS has to be activated/deactivated */
78 l1gprs_pdch_changed_t pdch_changed_cb;
81 void l1gprs_logging_init(int logc);
82 struct l1gprs_state *l1gprs_state_alloc(void *ctx, const char *log_prefix, void *priv);
83 void l1gprs_state_free(struct l1gprs_state *gprs);
84 void l1gprs_state_set_pdch_changed_cb(struct l1gprs_state *gprs, l1gprs_pdch_changed_t pdch_changed_cb);
86 int l1gprs_handle_ul_tbf_cfg_req(struct l1gprs_state *gprs, const struct msgb *msg);
87 int l1gprs_handle_dl_tbf_cfg_req(struct l1gprs_state *gprs, const struct msgb *msg);
89 struct l1gprs_prim_block_hdr {
90 uint32_t fn;
91 uint8_t tn;
94 struct l1gprs_prim_ul_block_req {
95 struct l1gprs_prim_block_hdr hdr;
96 size_t data_len;
97 const uint8_t *data;
100 struct l1gprs_prim_dl_block_ind {
101 struct l1gprs_prim_block_hdr hdr;
102 struct {
103 uint16_t ber10k;
104 int16_t ci_cb;
105 uint8_t rx_lev;
106 } meas;
107 size_t data_len;
108 const uint8_t *data;
111 int l1gprs_handle_ul_block_req(struct l1gprs_state *gprs,
112 struct l1gprs_prim_ul_block_req *req,
113 const struct msgb *msg);
114 struct msgb *l1gprs_handle_ul_block_cnf(struct l1gprs_state *gprs,
115 uint32_t fn, uint8_t tn,
116 const uint8_t *data,
117 size_t data_len);
118 struct msgb *l1gprs_handle_dl_block_ind(struct l1gprs_state *gprs,
119 const struct l1gprs_prim_dl_block_ind *ind, uint8_t *usf);
120 struct msgb *l1gprs_handle_rts_ind(struct l1gprs_state *gprs, uint32_t fn, uint8_t tn, uint8_t usf);