diff options
author | Max <msuraev@sysmocom.de> | 2018-01-30 16:56:43 +0100 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2018-02-03 15:05:29 +0000 |
commit | 5d7f757e4918da9d26189f6c6a5f96938234d309 (patch) | |
tree | f26703257fdf9f3a665903cd4ef69f7c0229a41d /src | |
parent | 0fdaa9d383eb22f276fa0404315be3a5bb8718c6 (diff) |
TBF: add helpers for assignment type handling
* add function to set/unset given assignment type
* log assignment type flag changes
* update tests output with additional logs
This enables us to carefully track the TBF assignment type transitions.
Change-Id: I3fe9d52472be8b7f257e8326b2f84e8e7d7bd1f4
Related: OS#1759
Diffstat (limited to 'src')
-rw-r--r-- | src/bts.cpp | 4 | ||||
-rw-r--r-- | src/tbf.h | 51 | ||||
-rw-r--r-- | src/tbf_dl.cpp | 8 |
3 files changed, 54 insertions, 9 deletions
diff --git a/src/bts.cpp b/src/bts.cpp index 72e1621b..3d29ad69 100644 --- a/src/bts.cpp +++ b/src/bts.cpp @@ -759,7 +759,7 @@ int BTS::rcv_rach(uint16_t ra, uint32_t Fn, int16_t qta, bool is_11bit, } else { tbf->set_ta(ta); TBF_SET_STATE(tbf, GPRS_RLCMAC_FLOW); - tbf->state_flags |= (1 << GPRS_RLCMAC_FLAG_CCCH); + TBF_ASS_TYPE_SET(tbf, GPRS_RLCMAC_FLAG_CCCH); T_START(tbf, T3169, m_bts.t3169, 0, "RACH (new UL-TBF)", true); LOGPTBF(tbf, LOGL_DEBUG, "[UPLINK] START\n"); LOGPTBF(tbf, LOGL_DEBUG, "RX: [PCU <- BTS] RACH " @@ -1042,7 +1042,7 @@ void gprs_rlcmac_pdch::rcv_control_ack(Packet_Control_Acknowledgement_t *packet, LOGPTBF(new_tbf, LOGL_INFO, "The TBF has been confirmed on the PACCH, " "changed type from CCCH to PACCH\n"); - new_tbf->state_flags |= (1 << GPRS_RLCMAC_FLAG_PACCH); + TBF_ASS_TYPE_SET(new_tbf, GPRS_RLCMAC_FLAG_PACCH); } TBF_SET_STATE(new_tbf, GPRS_RLCMAC_FLOW); /* stop pending assignment timer */ @@ -191,6 +191,8 @@ enum tbf_timers { #define TBF_POLL_SCHED_SET(t) do { t->poll_sched_set(__FILE__, __LINE__); } while(0) #define TBF_POLL_SCHED_UNSET(t) do { t->poll_sched_unset(__FILE__, __LINE__); } while(0) #define TBF_SET_ASS_ON(t, fl, chk) do { t->set_assigned_on(fl, chk, __FILE__, __LINE__); } while(0) +#define TBF_ASS_TYPE_SET(t, kind) do { t->ass_type_mod(kind, false, __FILE__, __LINE__); } while(0) +#define TBF_ASS_TYPE_UNSET(t, kind) do { t->ass_type_mod(kind, true, __FILE__, __LINE__); } while(0) struct gprs_rlcmac_tbf { gprs_rlcmac_tbf(BTS *bts_, gprs_rlcmac_tbf_direction dir); @@ -213,6 +215,7 @@ struct gprs_rlcmac_tbf { void check_pending_ass(); bool check_n_clear(uint8_t state_flag); void set_assigned_on(uint8_t state_flag, bool check_ccch, const char *file, int line); + void ass_type_mod(uint8_t t, bool unset, const char *file, int line); const char *state_name() const; const char *name() const; @@ -422,11 +425,57 @@ inline void gprs_rlcmac_tbf::set_assigned_on(uint8_t state_flag, bool check_ccch set_state(GPRS_RLCMAC_ASSIGN, file, line); if (check_ccch) { if (!(state_flags & (1 << GPRS_RLCMAC_FLAG_CCCH))) - state_flags |= (1 << state_flag); + ass_type_mod(state_flag, false, file, line); } else state_flags |= (1 << state_flag); } +inline void gprs_rlcmac_tbf::ass_type_mod(uint8_t t, bool unset, const char *file, int line) +{ + const char *ch = "UNKNOWN"; + switch (t) { + case GPRS_RLCMAC_FLAG_CCCH: + if (unset) { + if (!(state_flags & (1 << GPRS_RLCMAC_FLAG_CCCH))) + return; + } else { + if (state_flags & (1 << GPRS_RLCMAC_FLAG_CCCH)) + LOGPSRC(DTBF, LOGL_ERROR, file, line, + "%s attempted to set ass. type CCCH which is already set.\n", + tbf_name(this)); + } + ch = "CCCH"; + break; + case GPRS_RLCMAC_FLAG_PACCH: + if (unset) { + if (!(state_flags & (1 << GPRS_RLCMAC_FLAG_PACCH))) + return; + } else { + if (state_flags & (1 << GPRS_RLCMAC_FLAG_PACCH)) + LOGPSRC(DTBF, LOGL_ERROR, file, line, + "%s attempted to set ass. type PACCH which is already set.\n", + tbf_name(this)); + } + ch = "PACCH"; + break; + default: + LOGPSRC(DTBF, LOGL_ERROR, file, line, "%s attempted to %sset unexpected ass. type %d - FIXME!\n", + tbf_name(this), unset ? "un" : "", t); + return; + } + + LOGPSRC(DTBF, LOGL_INFO, file, line, "%s %sset ass. type %s [prev CCCH:%u, PACCH:%u]\n", + tbf_name(this), unset ? "un" : "", ch, + state_flags & (1 << GPRS_RLCMAC_FLAG_CCCH), + state_flags & (1 << GPRS_RLCMAC_FLAG_PACCH)); + + if (unset) { + state_flags &= GPRS_RLCMAC_FLAG_TO_MASK; /* keep to flags */ + state_flags &= ~(1 << t); + } else + state_flags |= (1 << t); +} + inline void gprs_rlcmac_tbf::set_state(enum gprs_rlcmac_tbf_state new_state, const char *file, int line) { LOGPSRC(DTBF, LOGL_DEBUG, file, line, "%s changes state from %s to %s\n", diff --git a/src/tbf_dl.cpp b/src/tbf_dl.cpp index 0587a4a6..dc4fa6ae 100644 --- a/src/tbf_dl.cpp +++ b/src/tbf_dl.cpp @@ -1104,9 +1104,7 @@ int gprs_rlcmac_dl_tbf::release() m_wait_confirm = 0; m_window.reset(); - /* keep to flags */ - state_flags &= GPRS_RLCMAC_FLAG_TO_MASK; - state_flags &= ~(1 << GPRS_RLCMAC_FLAG_CCCH); + TBF_ASS_TYPE_UNSET(this, GPRS_RLCMAC_FLAG_CCCH); return 0; } @@ -1132,9 +1130,7 @@ int gprs_rlcmac_dl_tbf::abort() /* reset rlc states */ m_window.reset(); - /* keep to flags */ - state_flags &= GPRS_RLCMAC_FLAG_TO_MASK; - state_flags &= ~(1 << GPRS_RLCMAC_FLAG_CCCH); + TBF_ASS_TYPE_UNSET(this, GPRS_RLCMAC_FLAG_CCCH); return 0; } |