aboutsummaryrefslogtreecommitdiffstats
path: root/src/gprs_rlcmac.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/gprs_rlcmac.h')
-rw-r--r--src/gprs_rlcmac.h103
1 files changed, 92 insertions, 11 deletions
diff --git a/src/gprs_rlcmac.h b/src/gprs_rlcmac.h
index 83ef7bd9..50d2e84c 100644
--- a/src/gprs_rlcmac.h
+++ b/src/gprs_rlcmac.h
@@ -29,13 +29,60 @@ extern "C" {
#include <osmocom/core/timer.h>
}
+/*
+ * PDCH instanc
+ */
+
+struct gprs_rlcmac_tbf;
+
+struct gprs_rlcmac_pdch {
+ uint8_t enable; /* TS is enabled */
+ uint8_t tsc; /* TSC of this slot */
+ uint8_t next_ul_tfi; /* next uplink TBF/TFI to schedule (0..31) */
+ uint8_t next_dl_tfi; /* next downlink TBF/TFI to schedule (0..31) */
+ struct gprs_rlcmac_tbf *tbf[32]; /* array of TBF pointers, by TFI */
+};
+
+struct gprs_rlcmac_trx {
+ uint16_t arfcn;
+ struct gprs_rlcmac_pdch pdch[8];
+};
+
+struct gprs_rlcmac_bts {
+ struct gprs_rlcmac_trx trx[8];
+};
+
+extern struct gprs_rlcmac_bts *gprs_rlcmac_bts;
+
+/*
+ * TBF instance
+ */
+
#define LLC_MAX_LEN 1543
+#define RLC_MAX_SNS 128 /* GPRS, must be power of 2 */
+#define RLC_MAX_WS 64 /* max window size */
+#define RLC_MAX_LEN 52 /* CS-4 */
#define UL_RLC_DATA_BLOCK_LEN 23
+#define T3169 6 /* 5 seconds + one second, because we don't use
+ * counters before starting timer. */
+#define N3103_MAX 4 /* how many tries to poll PACKET CONTROL ACK */
+
enum gprs_rlcmac_tbf_state {
- GPRS_RLCMAC_WAIT_DATA_SEQ_START,
- GPRS_RLCMAC_WAIT_NEXT_DATA_BLOCK,
- GPRS_RLCMAC_WAIT_NEXT_DATA_SEQ
+ GPRS_RLCMAC_FLOW, /* RLC/MAC flow, ressource needed */
+ GPRS_RLCMAC_FINISHED, /* flow finished, wait for release */
+ GPRS_RLCMAC_RELEASING, /* releasing, wait to free TBI/USF */
+};
+
+enum gprs_rlcmac_tbf_poll_state {
+ GPRS_RLCMAC_POLL_NONE = 0,
+ GPRS_RLCMAC_POLL_SCHED, /* a polling was scheduled */
+};
+
+enum gprs_rlcmac_tbf_ul_substate {
+ GPRS_RLCMAC_UL_NONE = 0,
+ GPRS_RLCMAC_UL_SEND_ACK, /* send acknowledge on next RTS */
+ GPRS_RLCMAC_UL_WAIT_POLL, /* wait for PACKET CONTROL ACK */
};
enum gprs_rlcmac_tbf_direction {
@@ -49,11 +96,36 @@ struct gprs_rlcmac_tbf {
enum gprs_rlcmac_tbf_direction direction;
uint8_t tfi;
uint32_t tlli;
- uint8_t rlc_data[LLC_MAX_LEN];
- uint16_t data_index;
- uint8_t bsn;
+ uint8_t tlli_valid;
uint8_t trx, ts, tsc;
uint16_t arfcn, ta;
+ uint8_t llc_frame[LLC_MAX_LEN];
+ uint16_t llc_index;
+
+ enum gprs_rlcmac_tbf_poll_state poll_state;
+ uint32_t poll_fn;
+
+ uint16_t bsn; /* block sequence number */
+ uint16_t ws; /* window size */
+ uint16_t sns; /* sequence number space */
+ union {
+ struct {
+ uint16_t v_s; /* send state */
+ uint16_t v_a; /* ack state */
+ char v_b[RLC_MAX_SNS/2]; /* acknowledge state array */
+ } dl;
+ struct {
+ uint16_t v_r; /* receive state */
+ uint16_t v_q; /* receive window state */
+ char v_n[RLC_MAX_SNS/2]; /* receive state array */
+ int32_t rx_counter; /* count all received blocks */
+ enum gprs_rlcmac_tbf_ul_substate substate;
+ uint8_t usf; /* USF */
+ uint8_t n3103; /* N3103 counter */
+ } ul;
+ } dir;
+ uint8_t rlc_block[RLC_MAX_SNS/2][RLC_MAX_LEN]; /* block history */
+ uint8_t rlc_block_len[RLC_MAX_SNS/2]; /* block len of history */
struct osmo_timer_list timer;
unsigned int T; /* Txxxx number */
@@ -66,9 +138,7 @@ struct gprs_rlcmac_tbf {
extern struct llist_head gprs_rlcmac_tbfs;
-int select_pdch(uint8_t *_trx, uint8_t *_ts);
-
-int tfi_alloc();
+int tfi_alloc(uint8_t *_trx, uint8_t *_ts);
struct gprs_rlcmac_tbf *tbf_alloc(uint8_t tfi, uint8_t trx, uint8_t ts);
@@ -78,6 +148,11 @@ struct gprs_rlcmac_tbf *tbf_by_tlli(uint8_t tlli);
void tbf_free(struct gprs_rlcmac_tbf *tbf);
+void tbf_timer_start(struct gprs_rlcmac_tbf *tbf, unsigned int T,
+ unsigned int seconds);
+
+void tbf_timer_stop(struct gprs_rlcmac_tbf *tbf);
+
/* TS 44.060 Section 10.4.7 Table 10.4.7.1: Payload Type field */
enum gprs_rlcmac_block_type {
GPRS_RLCMAC_DATA_BLOCK = 0x0,
@@ -94,9 +169,9 @@ int gprs_rlcmac_rcv_data_block(bitvec *rlc_block);
int gprs_rlcmac_rcv_control_block(bitvec *rlc_block);
-void gprs_rlcmac_rcv_block(bitvec *rlc_block);
+int gprs_rlcmac_rcv_block(uint8_t *data, uint8_t len, uint32_t fn);
-void gprs_rlcmac_rcv_rts_block(uint8_t trx, uint8_t ts, uint16_t arfcn,
+int gprs_rlcmac_rcv_rts_block(uint8_t trx, uint8_t ts, uint16_t arfcn,
uint32_t fn, uint8_t block_nr);
int gprs_rlcmac_rcv_rach(uint8_t ra, uint32_t Fn, int16_t qta);
@@ -111,5 +186,11 @@ void gprs_rlcmac_downlink_assignment(gprs_rlcmac_tbf *tbf);
void gprs_rlcmac_packet_downlink_assignment(gprs_rlcmac_tbf *tbf);
+void gprs_rlcmac_enqueue_block(bitvec *block, int len);
+
+int gprs_rlcmac_rcv_data_block_acknowledged(uint8_t *data, uint8_t len);
+
+struct msgb *gprs_rlcmac_send_uplink_ack(struct gprs_rlcmac_tbf *tbf,
+ uint32_t fn);
#endif // GPRS_RLCMAC_H