aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gprs_rlcmac.cpp1
-rw-r--r--src/gprs_rlcmac.h97
-rw-r--r--src/gprs_rlcmac_meas.cpp1
-rw-r--r--src/gprs_rlcmac_sched.cpp1
-rw-r--r--src/pcu_l1_if.cpp1
-rw-r--r--src/tbf.h100
6 files changed, 103 insertions, 98 deletions
diff --git a/src/gprs_rlcmac.cpp b/src/gprs_rlcmac.cpp
index 6546f8a4..3dab44f4 100644
--- a/src/gprs_rlcmac.cpp
+++ b/src/gprs_rlcmac.cpp
@@ -22,6 +22,7 @@
#include <gprs_bssgp_pcu.h>
#include <pcu_l1_if.h>
#include <gprs_rlcmac.h>
+#include <tbf.h>
/* 3GPP TS 05.02 Annex B.1 */
diff --git a/src/gprs_rlcmac.h b/src/gprs_rlcmac.h
index 8de74174..6fdf600f 100644
--- a/src/gprs_rlcmac.h
+++ b/src/gprs_rlcmac.h
@@ -155,103 +155,6 @@ enum gprs_rlcmac_tbf_direction {
#define GPRS_RLCMAC_FLAG_TO_DL_ASS 7
#define GPRS_RLCMAC_FLAG_TO_MASK 0xf0 /* timeout bits */
-struct gprs_rlcmac_tbf {
- struct llist_head list;
- enum gprs_rlcmac_tbf_state state;
- uint32_t state_flags;
- enum gprs_rlcmac_tbf_direction direction;
- uint8_t tfi;
- uint32_t tlli;
- uint8_t tlli_valid;
- uint8_t trx;
- uint16_t arfcn;
- uint8_t tsc;
- uint8_t first_ts; /* first TS used by TBF */
- uint8_t first_common_ts; /* first TS that the phone can send and
- reveive simultaniously */
- uint8_t control_ts; /* timeslot control messages and polling */
- uint8_t ms_class;
- struct gprs_rlcmac_pdch *pdch[8]; /* list of PDCHs allocated to TBF */
- uint16_t ta;
- uint8_t llc_frame[LLC_MAX_LEN]; /* current DL or UL frame */
- uint16_t llc_index; /* current write/read position of frame */
- uint16_t llc_length; /* len of current DL LLC_frame, 0 == no frame */
- struct llist_head llc_queue; /* queued LLC DL data */
-
- enum gprs_rlcmac_tbf_dl_ass_state dl_ass_state;
- enum gprs_rlcmac_tbf_ul_ass_state ul_ass_state;
- enum gprs_rlcmac_tbf_ul_ack_state ul_ack_state;
-
- enum gprs_rlcmac_tbf_poll_state poll_state;
- uint32_t poll_fn; /* frame number to poll */
-
- uint16_t ws; /* window size */
- uint16_t sns; /* sequence number space */
-
- /* Please note that all variables here will be reset when changing
- * from WAIT RELEASE back to FLOW state (re-use of TBF).
- * All states that need reset must be in this struct, so this is why
- * variables are in both (dl and ul) structs and not outside union.
- */
- union {
- struct {
- uint16_t bsn; /* block sequence number */
- uint16_t v_s; /* send state */
- uint16_t v_a; /* ack state */
- char v_b[RLC_MAX_SNS/2]; /* acknowledge state array */
- int32_t tx_counter; /* count all transmitted blocks */
- char imsi[16]; /* store IMSI for PCH retransmission */
- uint8_t wait_confirm; /* wait for CCCH IMM.ASS cnf */
- } dl;
- struct {
- uint16_t bsn; /* block sequence number */
- 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 */
- uint8_t n3103; /* N3103 counter */
- uint8_t usf[8]; /* list USFs per PDCH (timeslot) */
- uint8_t contention_resolution_done; /* set after done */
- uint8_t final_ack_sent; /* set if we sent final ack */
- } 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 */
-
- uint8_t n3105; /* N3105 counter */
-
- struct osmo_timer_list timer;
- unsigned int T; /* Txxxx number */
- unsigned int num_T_exp; /* number of consecutive T expirations */
-
- struct osmo_gsm_timer_list gsm_timer;
- unsigned int fT; /* fTxxxx number */
- unsigned int num_fT_exp; /* number of consecutive fT expirations */
-
- struct {
- char imsi[16];
-
- struct timeval dl_bw_tv; /* timestamp for dl bw calculation */
- uint32_t dl_bw_octets; /* number of octets since bw_tv */
-
- struct timeval rssi_tv; /* timestamp for rssi calculation */
- int32_t rssi_sum; /* sum of rssi values */
- int rssi_num; /* number of rssi values added since rssi_tv */
-
- struct timeval dl_loss_tv; /* timestamp for loss calculation */
- uint16_t dl_loss_lost; /* sum of lost packets */
- uint16_t dl_loss_received; /* sum of received packets */
-
- } meas;
-
- uint8_t cs; /* current coding scheme */
-
-#ifdef DEBUG_DIAGRAM
- int diag; /* number where TBF is presented in diagram */
- int diag_new; /* used to format output of new TBF */
-#endif
-};
-
extern struct llist_head gprs_rlcmac_ul_tbfs; /* list of uplink TBFs */
extern struct llist_head gprs_rlcmac_dl_tbfs; /* list of downlink TBFs */
extern struct llist_head gprs_rlcmac_sbas; /* list of single block allocs */
diff --git a/src/gprs_rlcmac_meas.cpp b/src/gprs_rlcmac_meas.cpp
index 75da835a..3229795c 100644
--- a/src/gprs_rlcmac_meas.cpp
+++ b/src/gprs_rlcmac_meas.cpp
@@ -20,6 +20,7 @@
#include <gprs_rlcmac.h>
#include <gprs_debug.h>
#include <pcu_l1_if.h>
+#include <tbf.h>
#include <string.h>
#include <errno.h>
diff --git a/src/gprs_rlcmac_sched.cpp b/src/gprs_rlcmac_sched.cpp
index 6290c5d8..f3edaaca 100644
--- a/src/gprs_rlcmac_sched.cpp
+++ b/src/gprs_rlcmac_sched.cpp
@@ -20,6 +20,7 @@
#include <gprs_bssgp_pcu.h>
#include <gprs_rlcmac.h>
#include <pcu_l1_if.h>
+#include <tbf.h>
uint32_t sched_poll(uint8_t trx, uint8_t ts, uint32_t fn, uint8_t block_nr,
struct gprs_rlcmac_tbf **poll_tbf,
diff --git a/src/pcu_l1_if.cpp b/src/pcu_l1_if.cpp
index 218dc23a..47bf7404 100644
--- a/src/pcu_l1_if.cpp
+++ b/src/pcu_l1_if.cpp
@@ -37,6 +37,7 @@ extern "C" {
#include <gprs_debug.h>
#include <gprs_bssgp_pcu.h>
#include <pcuif_proto.h>
+#include <tbf.h>
// FIXME: move this, when changed from c++ to c.
extern "C" {
diff --git a/src/tbf.h b/src/tbf.h
index 330eac1d..a6dfced6 100644
--- a/src/tbf.h
+++ b/src/tbf.h
@@ -18,9 +18,107 @@
#pragma once
+#include "gprs_rlcmac.h"
+
#include <stdint.h>
-struct gprs_rlcmac_bts;
+struct gprs_rlcmac_tbf {
+ struct llist_head list;
+ enum gprs_rlcmac_tbf_state state;
+ uint32_t state_flags;
+ enum gprs_rlcmac_tbf_direction direction;
+ uint8_t tfi;
+ uint32_t tlli;
+ uint8_t tlli_valid;
+ uint8_t trx;
+ uint16_t arfcn;
+ uint8_t tsc;
+ uint8_t first_ts; /* first TS used by TBF */
+ uint8_t first_common_ts; /* first TS that the phone can send and
+ reveive simultaniously */
+ uint8_t control_ts; /* timeslot control messages and polling */
+ uint8_t ms_class;
+ struct gprs_rlcmac_pdch *pdch[8]; /* list of PDCHs allocated to TBF */
+ uint16_t ta;
+ uint8_t llc_frame[LLC_MAX_LEN]; /* current DL or UL frame */
+ uint16_t llc_index; /* current write/read position of frame */
+ uint16_t llc_length; /* len of current DL LLC_frame, 0 == no frame */
+ struct llist_head llc_queue; /* queued LLC DL data */
+
+ enum gprs_rlcmac_tbf_dl_ass_state dl_ass_state;
+ enum gprs_rlcmac_tbf_ul_ass_state ul_ass_state;
+ enum gprs_rlcmac_tbf_ul_ack_state ul_ack_state;
+
+ enum gprs_rlcmac_tbf_poll_state poll_state;
+ uint32_t poll_fn; /* frame number to poll */
+
+ uint16_t ws; /* window size */
+ uint16_t sns; /* sequence number space */
+
+ /* Please note that all variables here will be reset when changing
+ * from WAIT RELEASE back to FLOW state (re-use of TBF).
+ * All states that need reset must be in this struct, so this is why
+ * variables are in both (dl and ul) structs and not outside union.
+ */
+ union {
+ struct {
+ uint16_t bsn; /* block sequence number */
+ uint16_t v_s; /* send state */
+ uint16_t v_a; /* ack state */
+ char v_b[RLC_MAX_SNS/2]; /* acknowledge state array */
+ int32_t tx_counter; /* count all transmitted blocks */
+ char imsi[16]; /* store IMSI for PCH retransmission */
+ uint8_t wait_confirm; /* wait for CCCH IMM.ASS cnf */
+ } dl;
+ struct {
+ uint16_t bsn; /* block sequence number */
+ 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 */
+ uint8_t n3103; /* N3103 counter */
+ uint8_t usf[8]; /* list USFs per PDCH (timeslot) */
+ uint8_t contention_resolution_done; /* set after done */
+ uint8_t final_ack_sent; /* set if we sent final ack */
+ } 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 */
+
+ uint8_t n3105; /* N3105 counter */
+
+ struct osmo_timer_list timer;
+ unsigned int T; /* Txxxx number */
+ unsigned int num_T_exp; /* number of consecutive T expirations */
+
+ struct osmo_gsm_timer_list gsm_timer;
+ unsigned int fT; /* fTxxxx number */
+ unsigned int num_fT_exp; /* number of consecutive fT expirations */
+
+ struct {
+ char imsi[16];
+
+ struct timeval dl_bw_tv; /* timestamp for dl bw calculation */
+ uint32_t dl_bw_octets; /* number of octets since bw_tv */
+
+ struct timeval rssi_tv; /* timestamp for rssi calculation */
+ int32_t rssi_sum; /* sum of rssi values */
+ int rssi_num; /* number of rssi values added since rssi_tv */
+
+ struct timeval dl_loss_tv; /* timestamp for loss calculation */
+ uint16_t dl_loss_lost; /* sum of lost packets */
+ uint16_t dl_loss_received; /* sum of received packets */
+
+ } meas;
+
+ uint8_t cs; /* current coding scheme */
+
+#ifdef DEBUG_DIAGRAM
+ int diag; /* number where TBF is presented in diagram */
+ int diag_new; /* used to format output of new TBF */
+#endif
+};
+
/* dispatch Unitdata.DL messages */
int tbf_handle(struct gprs_rlcmac_bts *bts,