From 099535a1a7118d195d91584d05659e7ee936e422 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Wed, 16 Oct 2013 17:42:31 +0200 Subject: tbf: Move the struct to the tbf.h header file This is the begin of a long march of turning tbf into a C++ class and properly hiding the secrets inside this implementation instead of having it spread across various different files. --- src/gprs_rlcmac.cpp | 1 + src/gprs_rlcmac.h | 97 -------------------------------------------- src/gprs_rlcmac_meas.cpp | 1 + src/gprs_rlcmac_sched.cpp | 1 + src/pcu_l1_if.cpp | 1 + src/tbf.h | 100 +++++++++++++++++++++++++++++++++++++++++++++- 6 files changed, 103 insertions(+), 98 deletions(-) (limited to 'src') 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 #include #include +#include /* 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 #include #include +#include #include #include 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 #include #include +#include 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 #include #include +#include // 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 -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, -- cgit v1.2.3