aboutsummaryrefslogtreecommitdiffstats
path: root/src/tbf.h
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2019-09-25 17:47:02 +0200
committerPau Espin Pedrol <pespin@sysmocom.de>2019-09-25 17:50:06 +0200
commit9d1cdb1f697057033394590a9b2815efe6c08cd9 (patch)
tree6949835a400a15e75bfd8196c591d16727594fb8 /src/tbf.h
parent488aa2908387356b2ae0e84157974f962f45972a (diff)
Move out tbf subclasses from tbf.h to their own headers
It's a good start towards clearing current mess between parent and the 2 children classes. Change-Id: Ibc22ea2e02609af7ee058b8bc15df2115d4c6f60
Diffstat (limited to 'src/tbf.h')
-rw-r--r--src/tbf.h238
1 files changed, 0 insertions, 238 deletions
diff --git a/src/tbf.h b/src/tbf.h
index 6eab9d0..fd65b20 100644
--- a/src/tbf.h
+++ b/src/tbf.h
@@ -95,15 +95,6 @@ enum gprs_rlcmac_tbf_direction {
GPRS_RLCMAC_UL_TBF
};
-enum tbf_dl_prio {
- DL_PRIO_NONE,
- DL_PRIO_SENT_DATA, /* the data has been sent and not (yet) nacked */
- DL_PRIO_LOW_AGE, /* the age has reached the first threshold */
- DL_PRIO_NEW_DATA, /* the data has not been sent yet or nacked */
- DL_PRIO_HIGH_AGE, /* the age has reached the second threshold */
- DL_PRIO_CONTROL, /* a control block needs to be sent */
-};
-
enum tbf_rlc_counters {
TBF_CTR_RLC_NACKED,
};
@@ -127,28 +118,7 @@ enum tbf_egprs_counters {
TBF_CTR_EGPRS_DL_MCS9,
};
-enum tbf_gprs_ul_counters {
- TBF_CTR_GPRS_UL_CS1,
- TBF_CTR_GPRS_UL_CS2,
- TBF_CTR_GPRS_UL_CS3,
- TBF_CTR_GPRS_UL_CS4,
-};
-
-enum tbf_egprs_ul_counters {
- TBF_CTR_EGPRS_UL_MCS1,
- TBF_CTR_EGPRS_UL_MCS2,
- TBF_CTR_EGPRS_UL_MCS3,
- TBF_CTR_EGPRS_UL_MCS4,
- TBF_CTR_EGPRS_UL_MCS5,
- TBF_CTR_EGPRS_UL_MCS6,
- TBF_CTR_EGPRS_UL_MCS7,
- TBF_CTR_EGPRS_UL_MCS8,
- TBF_CTR_EGPRS_UL_MCS9,
-};
-
#define LOGPTBF(tbf, level, fmt, args...) LOGP(DTBF, level, "%s " fmt, tbf_name(tbf), ## args)
-#define LOGPTBFUL(tbf, level, fmt, args...) LOGP(DTBFUL, level, "%s " fmt, tbf_name(tbf), ## args)
-#define LOGPTBFDL(tbf, level, fmt, args...) LOGP(DTBFDL, level, "%s " fmt, tbf_name(tbf), ## args)
enum tbf_timers {
/* internal assign/reject timer */
@@ -612,220 +582,12 @@ inline void gprs_rlcmac_tbf::disable_egprs()
m_egprs_enabled = false;
}
-struct gprs_rlcmac_dl_tbf : public gprs_rlcmac_tbf {
- gprs_rlcmac_dl_tbf(BTS *bts);
- gprs_rlc_dl_window *window();
- void cleanup();
- void enable_egprs();
- /* dispatch Unitdata.DL messages */
- static int handle(struct gprs_rlcmac_bts *bts,
- const uint32_t tlli, const uint32_t old_tlli,
- const char *imsi, const uint8_t ms_class,
- const uint8_t egprs_ms_class, const uint16_t delay_csec,
- const uint8_t *data, const uint16_t len);
-
- int append_data(const uint8_t ms_class,
- const uint16_t pdu_delay_csec,
- const uint8_t *data, const uint16_t len);
-
- int rcvd_dl_ack(bool final, uint8_t ssn, uint8_t *rbb);
- int rcvd_dl_ack(bool final_ack, unsigned first_bsn, struct bitvec *rbb);
- struct msgb *create_dl_acked_block(uint32_t fn, uint8_t ts);
- void trigger_ass(struct gprs_rlcmac_tbf *old_tbf);
-
- bool handle_ack_nack();
- void request_dl_ack();
- bool need_control_ts() const;
- bool have_data() const;
- int frames_since_last_poll(unsigned fn) const;
- int frames_since_last_drain(unsigned fn) const;
- bool keep_open(unsigned fn) const;
- int release();
- int abort();
- uint16_t window_size() const;
- void set_window_size();
- void update_coding_scheme_counter_dl(enum CodingScheme cs);
-
- /* TODO: add the gettimeofday as parameter */
- struct msgb *llc_dequeue(bssgp_bvc_ctx *bctx);
-
- /* 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.
- */
- int32_t m_tx_counter; /* count all transmitted blocks */
- uint8_t m_wait_confirm; /* wait for CCCH IMM.ASS cnf */
- bool m_dl_ack_requested;
- int32_t m_last_dl_poll_fn;
- int32_t m_last_dl_drained_fn;
-
- struct BandWidth {
- struct timespec dl_bw_tv; /* timestamp for dl bw calculation */
- uint32_t dl_bw_octets; /* number of octets since bw_tv */
- uint32_t dl_throughput; /* throughput to be displayed in stats */
-
- struct timespec 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 */
-
- BandWidth();
- } m_bw;
-
- struct rate_ctr_group *m_dl_gprs_ctrs;
- struct rate_ctr_group *m_dl_egprs_ctrs;
-
-protected:
- struct ana_result {
- unsigned received_packets;
- unsigned lost_packets;
- unsigned received_bytes;
- unsigned lost_bytes;
- };
-
- int take_next_bsn(uint32_t fn, int previous_bsn,
- bool *may_combine);
- bool restart_bsn_cycle();
- int create_new_bsn(const uint32_t fn, GprsCodingScheme cs);
- struct msgb *create_dl_acked_block(const uint32_t fn, const uint8_t ts,
- int index, int index2 = -1);
- int update_window(const uint8_t ssn, const uint8_t *rbb);
- int update_window(unsigned first_bsn, const struct bitvec *rbb);
- int maybe_start_new_window();
- bool dl_window_stalled() const;
- void reuse_tbf();
- void start_llc_timer();
- int analyse_errors(char *show_rbb, uint8_t ssn, ana_result *res);
- void schedule_next_frame();
-
- enum egprs_rlc_dl_reseg_bsn_state egprs_dl_get_data
- (int bsn, uint8_t **block_data);
- unsigned int get_egprs_dl_spb_status(int bsn);
- enum egprs_rlcmac_dl_spb get_egprs_dl_spb(int bsn);
-
- struct osmo_timer_list m_llc_timer;
-
- /* Please note that all variables below 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.
- */
- gprs_rlc_dl_window m_window;
-};
-
-struct gprs_rlcmac_ul_tbf : public gprs_rlcmac_tbf {
- gprs_rlcmac_ul_tbf(BTS *bts);
- gprs_rlc_ul_window *window();
- struct msgb *create_ul_ack(uint32_t fn, uint8_t ts);
- bool ctrl_ack_to_toggle();
- bool handle_ctrl_ack();
- void enable_egprs();
- /* blocks were acked */
- int rcv_data_block_acknowledged(
- const struct gprs_rlc_data_info *rlc,
- uint8_t *data, struct pcu_l1_meas *meas);
-
-
- /* TODO: extract LLC class? */
- int assemble_forward_llc(const gprs_rlc_data *data);
- int snd_ul_ud();
-
- egprs_rlc_ul_reseg_bsn_state handle_egprs_ul_spb(
- const struct gprs_rlc_data_info *rlc,
- struct gprs_rlc_data *block,
- uint8_t *data, const uint8_t block_idx);
-
- egprs_rlc_ul_reseg_bsn_state handle_egprs_ul_first_seg(
- const struct gprs_rlc_data_info *rlc,
- struct gprs_rlc_data *block,
- uint8_t *data, const uint8_t block_idx);
-
- egprs_rlc_ul_reseg_bsn_state handle_egprs_ul_second_seg(
- const struct gprs_rlc_data_info *rlc,
- struct gprs_rlc_data *block,
- uint8_t *data, const uint8_t block_idx);
-
- uint16_t window_size() const;
- void set_window_size();
- void update_coding_scheme_counter_ul(enum CodingScheme cs);
-
- /* 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.
- */
- int32_t m_rx_counter; /* count all received blocks */
- uint8_t m_usf[8]; /* list USFs per PDCH (timeslot) */
- uint8_t m_contention_resolution_done; /* set after done */
- uint8_t m_final_ack_sent; /* set if we sent final ack */
-
- struct rate_ctr_group *m_ul_gprs_ctrs;
- struct rate_ctr_group *m_ul_egprs_ctrs;
-
-protected:
- void maybe_schedule_uplink_acknack(const gprs_rlc_data_info *rlc);
-
- /* Please note that all variables below 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.
- */
- gprs_rlc_ul_window m_window;
-};
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-void update_tbf_ta(struct gprs_rlcmac_ul_tbf *tbf, int8_t ta_delta);
-void set_tbf_ta(struct gprs_rlcmac_ul_tbf *tbf, uint8_t ta);
-#ifdef __cplusplus
-}
-#endif
-
inline enum gprs_rlcmac_tbf_direction reverse(enum gprs_rlcmac_tbf_direction dir)
{
return (enum gprs_rlcmac_tbf_direction)
((int)GPRS_RLCMAC_UL_TBF - (int)dir + (int)GPRS_RLCMAC_DL_TBF);
}
-inline uint16_t gprs_rlcmac_ul_tbf::window_size() const
-{
- return m_window.ws();
-}
-
-inline uint16_t gprs_rlcmac_dl_tbf::window_size() const
-{
- return m_window.ws();
-}
-
-inline void gprs_rlcmac_ul_tbf::enable_egprs()
-{
- m_window.set_sns(RLC_EGPRS_SNS);
- gprs_rlcmac_tbf::enable_egprs();
-}
-
-inline void gprs_rlcmac_dl_tbf::enable_egprs()
-{
- m_window.set_sns(RLC_EGPRS_SNS);
- gprs_rlcmac_tbf::enable_egprs();
-}
-
-inline gprs_rlcmac_ul_tbf *as_ul_tbf(gprs_rlcmac_tbf *tbf)
-{
- if (tbf && tbf->direction == GPRS_RLCMAC_UL_TBF)
- return static_cast<gprs_rlcmac_ul_tbf *>(tbf);
- else
- return NULL;
-}
-
-inline gprs_rlcmac_dl_tbf *as_dl_tbf(gprs_rlcmac_tbf *tbf)
-{
- if (tbf && tbf->direction == GPRS_RLCMAC_DL_TBF)
- return static_cast<gprs_rlcmac_dl_tbf *>(tbf);
- else
- return NULL;
-}
-
uint16_t egprs_window_size(const struct gprs_rlcmac_bts *bts_data, uint8_t slots);
#endif