Adding flags for debugging assignment and polling timeout
This commit is contained in:
parent
802bb6eac8
commit
14db19ed11
|
@ -138,6 +138,7 @@ int gprs_bssgp_pcu_rx_dl_ud(struct msgb *msg, struct tlv_parsed *tp)
|
||||||
tbf->llc_length = len;
|
tbf->llc_length = len;
|
||||||
memset(&tbf->dir.dl, 0, sizeof(tbf->dir.dl)); /* reset
|
memset(&tbf->dir.dl, 0, sizeof(tbf->dir.dl)); /* reset
|
||||||
rlc states */
|
rlc states */
|
||||||
|
tbf->state_flags = 0;
|
||||||
if (!tbf->ms_class && ms_class)
|
if (!tbf->ms_class && ms_class)
|
||||||
tbf->ms_class = ms_class;
|
tbf->ms_class = ms_class;
|
||||||
tbf_update(tbf);
|
tbf_update(tbf);
|
||||||
|
|
|
@ -132,9 +132,19 @@ enum gprs_rlcmac_tbf_direction {
|
||||||
GPRS_RLCMAC_UL_TBF
|
GPRS_RLCMAC_UL_TBF
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define GPRS_RLCMAC_FLAG_CCCH 0 /* assignment on CCCH */
|
||||||
|
#define GPRS_RLCMAC_FLAG_PACCH 1 /* assignment on PACCH */
|
||||||
|
#define GPRS_RLCMAC_FLAG_UL_DATA 2 /* uplink data received */
|
||||||
|
#define GPRS_RLCMAC_FLAG_DL_ACK 3 /* downlink acknowledge received */
|
||||||
|
#define GPRS_RLCMAC_FLAG_TO_UL_ACK 4
|
||||||
|
#define GPRS_RLCMAC_FLAG_TO_DL_ACK 5
|
||||||
|
#define GPRS_RLCMAC_FLAG_TO_UL_ASS 6
|
||||||
|
#define GPRS_RLCMAC_FLAG_TO_DL_ASS 7
|
||||||
|
|
||||||
struct gprs_rlcmac_tbf {
|
struct gprs_rlcmac_tbf {
|
||||||
struct llist_head list;
|
struct llist_head list;
|
||||||
enum gprs_rlcmac_tbf_state state;
|
enum gprs_rlcmac_tbf_state state;
|
||||||
|
uint32_t state_flags;
|
||||||
enum gprs_rlcmac_tbf_direction direction;
|
enum gprs_rlcmac_tbf_direction direction;
|
||||||
uint8_t tfi;
|
uint8_t tfi;
|
||||||
uint32_t tlli;
|
uint32_t tlli;
|
||||||
|
|
|
@ -73,6 +73,24 @@ struct rlc_li_field {
|
||||||
} __attribute__ ((packed));
|
} __attribute__ ((packed));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int gprs_rlcmac_diag(struct gprs_rlcmac_tbf *tbf)
|
||||||
|
{
|
||||||
|
if ((tbf->state_flags & (1 << GPRS_RLCMAC_FLAG_CCCH)))
|
||||||
|
LOGP(DRLCMAC, LOGL_NOTICE, "- Assignment was on CCCH\n");
|
||||||
|
if ((tbf->state_flags & (1 << GPRS_RLCMAC_FLAG_PACCH)))
|
||||||
|
LOGP(DRLCMAC, LOGL_NOTICE, "- Assignment was on PACCH\n");
|
||||||
|
if ((tbf->state_flags & (1 << GPRS_RLCMAC_FLAG_UL_DATA)))
|
||||||
|
LOGP(DRLCMAC, LOGL_NOTICE, "- Uplink data was received\n");
|
||||||
|
else if (tbf->direction == GPRS_RLCMAC_UL_TBF)
|
||||||
|
LOGP(DRLCMAC, LOGL_NOTICE, "- No uplink data received yet\n");
|
||||||
|
if ((tbf->state_flags & (1 << GPRS_RLCMAC_FLAG_DL_ACK)))
|
||||||
|
LOGP(DRLCMAC, LOGL_NOTICE, "- Downlink ACK was received\n");
|
||||||
|
else if (tbf->direction == GPRS_RLCMAC_DL_TBF)
|
||||||
|
LOGP(DRLCMAC, LOGL_NOTICE, "- No downlink ACK received yet\n");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int gprs_rlcmac_poll_timeout(struct gprs_rlcmac_tbf *tbf)
|
int gprs_rlcmac_poll_timeout(struct gprs_rlcmac_tbf *tbf)
|
||||||
{
|
{
|
||||||
LOGP(DRLCMAC, LOGL_NOTICE, "Poll timeout for %s TBF=%d\n",
|
LOGP(DRLCMAC, LOGL_NOTICE, "Poll timeout for %s TBF=%d\n",
|
||||||
|
@ -81,8 +99,12 @@ int gprs_rlcmac_poll_timeout(struct gprs_rlcmac_tbf *tbf)
|
||||||
tbf->poll_state = GPRS_RLCMAC_POLL_NONE;
|
tbf->poll_state = GPRS_RLCMAC_POLL_NONE;
|
||||||
|
|
||||||
if (tbf->ul_ack_state == GPRS_RLCMAC_UL_ACK_WAIT_ACK) {
|
if (tbf->ul_ack_state == GPRS_RLCMAC_UL_ACK_WAIT_ACK) {
|
||||||
LOGP(DRLCMAC, LOGL_NOTICE, "- Timeout for polling PACKET "
|
if (!(tbf->state_flags & (1 << GPRS_RLCMAC_FLAG_TO_UL_ACK))) {
|
||||||
"CONTROL ACK for PACKET UPLINK ACK\n");
|
LOGP(DRLCMAC, LOGL_NOTICE, "- Timeout for polling "
|
||||||
|
"PACKET CONTROL ACK for PACKET UPLINK ACK\n");
|
||||||
|
gprs_rlcmac_diag(tbf);
|
||||||
|
tbf->state_flags |= (1 << GPRS_RLCMAC_FLAG_TO_UL_ACK);
|
||||||
|
}
|
||||||
tbf->ul_ack_state = GPRS_RLCMAC_UL_ACK_NONE;
|
tbf->ul_ack_state = GPRS_RLCMAC_UL_ACK_NONE;
|
||||||
if (tbf->state == GPRS_RLCMAC_FINISHED) {
|
if (tbf->state == GPRS_RLCMAC_FINISHED) {
|
||||||
struct gprs_rlcmac_bts *bts = gprs_rlcmac_bts;
|
struct gprs_rlcmac_bts *bts = gprs_rlcmac_bts;
|
||||||
|
@ -102,8 +124,13 @@ int gprs_rlcmac_poll_timeout(struct gprs_rlcmac_tbf *tbf)
|
||||||
if (tbf->ul_ass_state == GPRS_RLCMAC_UL_ASS_WAIT_ACK) {
|
if (tbf->ul_ass_state == GPRS_RLCMAC_UL_ASS_WAIT_ACK) {
|
||||||
struct gprs_rlcmac_bts *bts = gprs_rlcmac_bts;
|
struct gprs_rlcmac_bts *bts = gprs_rlcmac_bts;
|
||||||
|
|
||||||
LOGP(DRLCMAC, LOGL_NOTICE, "- Timeout for polling PACKET "
|
if (!(tbf->state_flags & (1 << GPRS_RLCMAC_FLAG_TO_UL_ASS))) {
|
||||||
"CONTROL ACK for PACKET UPLINK ASSIGNMENT.\n");
|
LOGP(DRLCMAC, LOGL_NOTICE, "- Timeout for polling "
|
||||||
|
"PACKET CONTROL ACK for PACKET UPLINK "
|
||||||
|
"ASSIGNMENT.\n");
|
||||||
|
gprs_rlcmac_diag(tbf);
|
||||||
|
tbf->state_flags |= (1 << GPRS_RLCMAC_FLAG_TO_UL_ASS);
|
||||||
|
}
|
||||||
tbf->ul_ass_state = GPRS_RLCMAC_UL_ASS_NONE;
|
tbf->ul_ass_state = GPRS_RLCMAC_UL_ASS_NONE;
|
||||||
tbf->n3105++;
|
tbf->n3105++;
|
||||||
if (tbf->n3105 == bts->n3105) {
|
if (tbf->n3105 == bts->n3105) {
|
||||||
|
@ -118,8 +145,13 @@ int gprs_rlcmac_poll_timeout(struct gprs_rlcmac_tbf *tbf)
|
||||||
if (tbf->dl_ass_state == GPRS_RLCMAC_DL_ASS_WAIT_ACK) {
|
if (tbf->dl_ass_state == GPRS_RLCMAC_DL_ASS_WAIT_ACK) {
|
||||||
struct gprs_rlcmac_bts *bts = gprs_rlcmac_bts;
|
struct gprs_rlcmac_bts *bts = gprs_rlcmac_bts;
|
||||||
|
|
||||||
LOGP(DRLCMAC, LOGL_NOTICE, "- Timeout for polling PACKET "
|
if (!(tbf->state_flags & (1 << GPRS_RLCMAC_FLAG_TO_DL_ASS))) {
|
||||||
"CONTROL ACK for PACKET DOWNLINK ASSIGNMENT.\n");
|
LOGP(DRLCMAC, LOGL_NOTICE, "- Timeout for polling "
|
||||||
|
"PACKET CONTROL ACK for PACKET DOWNLINK "
|
||||||
|
"ASSIGNMENT.\n");
|
||||||
|
gprs_rlcmac_diag(tbf);
|
||||||
|
tbf->state_flags |= (1 << GPRS_RLCMAC_FLAG_TO_DL_ASS);
|
||||||
|
}
|
||||||
tbf->dl_ass_state = GPRS_RLCMAC_DL_ASS_NONE;
|
tbf->dl_ass_state = GPRS_RLCMAC_DL_ASS_NONE;
|
||||||
tbf->n3105++;
|
tbf->n3105++;
|
||||||
if (tbf->n3105 == bts->n3105) {
|
if (tbf->n3105 == bts->n3105) {
|
||||||
|
@ -134,8 +166,12 @@ int gprs_rlcmac_poll_timeout(struct gprs_rlcmac_tbf *tbf)
|
||||||
if (tbf->direction == GPRS_RLCMAC_DL_TBF) {
|
if (tbf->direction == GPRS_RLCMAC_DL_TBF) {
|
||||||
struct gprs_rlcmac_bts *bts = gprs_rlcmac_bts;
|
struct gprs_rlcmac_bts *bts = gprs_rlcmac_bts;
|
||||||
|
|
||||||
LOGP(DRLCMAC, LOGL_NOTICE, "- Timeout for polling PACKET "
|
if (!(tbf->state_flags & (1 << GPRS_RLCMAC_FLAG_TO_DL_ACK))) {
|
||||||
" DOWNLINK ACK.\n");
|
LOGP(DRLCMAC, LOGL_NOTICE, "- Timeout for polling "
|
||||||
|
"PACKET DOWNLINK ACK.\n");
|
||||||
|
gprs_rlcmac_diag(tbf);
|
||||||
|
tbf->state_flags |= (1 << GPRS_RLCMAC_FLAG_TO_DL_ACK);
|
||||||
|
}
|
||||||
tbf->n3105++;
|
tbf->n3105++;
|
||||||
if (tbf->n3105 == bts->n3105) {
|
if (tbf->n3105 == bts->n3105) {
|
||||||
LOGP(DRLCMAC, LOGL_NOTICE, "- N3105 exceeded\n");
|
LOGP(DRLCMAC, LOGL_NOTICE, "- N3105 exceeded\n");
|
||||||
|
@ -187,6 +223,13 @@ int gprs_rlcmac_rcv_control_block(bitvec *rlc_block, uint8_t trx, uint8_t ts,
|
||||||
if (tbf->ul_ack_state == GPRS_RLCMAC_UL_ACK_WAIT_ACK) {
|
if (tbf->ul_ack_state == GPRS_RLCMAC_UL_ACK_WAIT_ACK) {
|
||||||
LOGP(DRLCMAC, LOGL_DEBUG, "TBF: [UPLINK] END TFI: %u TLLI: 0x%08x \n", tbf->tfi, tbf->tlli);
|
LOGP(DRLCMAC, LOGL_DEBUG, "TBF: [UPLINK] END TFI: %u TLLI: 0x%08x \n", tbf->tfi, tbf->tlli);
|
||||||
tbf->ul_ack_state = GPRS_RLCMAC_UL_ACK_NONE;
|
tbf->ul_ack_state = GPRS_RLCMAC_UL_ACK_NONE;
|
||||||
|
if ((tbf->state_flags &
|
||||||
|
(1 << GPRS_RLCMAC_FLAG_TO_UL_ACK))) {
|
||||||
|
tbf->state_flags &=
|
||||||
|
~(1 << GPRS_RLCMAC_FLAG_TO_UL_ACK);
|
||||||
|
LOGP(DRLCMAC, LOGL_NOTICE, "Recovered uplink "
|
||||||
|
"ack\n");
|
||||||
|
}
|
||||||
tbf_free(tbf);
|
tbf_free(tbf);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -204,6 +247,13 @@ int gprs_rlcmac_rcv_control_block(bitvec *rlc_block, uint8_t trx, uint8_t ts,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
tbf_new_state(tbf, GPRS_RLCMAC_FLOW);
|
tbf_new_state(tbf, GPRS_RLCMAC_FLOW);
|
||||||
|
if ((tbf->state_flags &
|
||||||
|
(1 << GPRS_RLCMAC_FLAG_TO_DL_ASS))) {
|
||||||
|
tbf->state_flags &=
|
||||||
|
~(1 << GPRS_RLCMAC_FLAG_TO_DL_ASS);
|
||||||
|
LOGP(DRLCMAC, LOGL_NOTICE, "Recovered downlink "
|
||||||
|
"assignment\n");
|
||||||
|
}
|
||||||
tbf_assign_control_ts(tbf);
|
tbf_assign_control_ts(tbf);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -221,6 +271,13 @@ int gprs_rlcmac_rcv_control_block(bitvec *rlc_block, uint8_t trx, uint8_t ts,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
tbf_new_state(tbf, GPRS_RLCMAC_FLOW);
|
tbf_new_state(tbf, GPRS_RLCMAC_FLOW);
|
||||||
|
if ((tbf->state_flags &
|
||||||
|
(1 << GPRS_RLCMAC_FLAG_TO_UL_ASS))) {
|
||||||
|
tbf->state_flags &=
|
||||||
|
~(1 << GPRS_RLCMAC_FLAG_TO_UL_ASS);
|
||||||
|
LOGP(DRLCMAC, LOGL_NOTICE, "Recovered uplink "
|
||||||
|
"assignment\n");
|
||||||
|
}
|
||||||
tbf_assign_control_ts(tbf);
|
tbf_assign_control_ts(tbf);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -236,6 +293,11 @@ int gprs_rlcmac_rcv_control_block(bitvec *rlc_block, uint8_t trx, uint8_t ts,
|
||||||
fn, tfi, trx, ts);
|
fn, tfi, trx, ts);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
tbf->state_flags |= (1 << GPRS_RLCMAC_FLAG_DL_ACK);
|
||||||
|
if ((tbf->state_flags & (1 << GPRS_RLCMAC_FLAG_TO_DL_ACK))) {
|
||||||
|
tbf->state_flags &= ~(1 << GPRS_RLCMAC_FLAG_TO_DL_ACK);
|
||||||
|
LOGP(DRLCMAC, LOGL_NOTICE, "Recovered downlink ack\n");
|
||||||
|
}
|
||||||
/* reset N3105 */
|
/* reset N3105 */
|
||||||
tbf->n3105 = 0;
|
tbf->n3105 = 0;
|
||||||
/* stop timer T3191 */
|
/* stop timer T3191 */
|
||||||
|
@ -280,6 +342,7 @@ uplink_request:
|
||||||
ul_tbf->dir.ul.contention_resolution_done = 1;
|
ul_tbf->dir.ul.contention_resolution_done = 1;
|
||||||
ul_tbf->ta = tbf->ta; /* use current TA */
|
ul_tbf->ta = tbf->ta; /* use current TA */
|
||||||
tbf_new_state(ul_tbf, GPRS_RLCMAC_ASSIGN);
|
tbf_new_state(ul_tbf, GPRS_RLCMAC_ASSIGN);
|
||||||
|
ul_tbf->state_flags |= (1 << GPRS_RLCMAC_FLAG_PACCH);
|
||||||
tbf_timer_start(ul_tbf, 3169, bts->t3169, 0);
|
tbf_timer_start(ul_tbf, 3169, bts->t3169, 0);
|
||||||
/* schedule uplink assignment */
|
/* schedule uplink assignment */
|
||||||
tbf->ul_ass_state = GPRS_RLCMAC_UL_ASS_SEND_ASS;
|
tbf->ul_ass_state = GPRS_RLCMAC_UL_ASS_SEND_ASS;
|
||||||
|
@ -355,6 +418,7 @@ void tbf_timer_cb(void *_tbf)
|
||||||
case 3195:
|
case 3195:
|
||||||
LOGP(DRLCMAC, LOGL_NOTICE, "TBF T%d timeout during "
|
LOGP(DRLCMAC, LOGL_NOTICE, "TBF T%d timeout during "
|
||||||
"transsmission\n", tbf->T);
|
"transsmission\n", tbf->T);
|
||||||
|
gprs_rlcmac_diag(tbf);
|
||||||
/* fall through */
|
/* fall through */
|
||||||
case 3193:
|
case 3193:
|
||||||
LOGP(DRLCMAC, LOGL_DEBUG, "TBF will be freed due to timeout\n");
|
LOGP(DRLCMAC, LOGL_DEBUG, "TBF will be freed due to timeout\n");
|
||||||
|
@ -662,6 +726,7 @@ int gprs_rlcmac_rcv_data_block_acknowledged(uint8_t trx, uint8_t ts,
|
||||||
rh->tfi);
|
rh->tfi);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
tbf->state_flags |= (1 << GPRS_RLCMAC_FLAG_UL_DATA);
|
||||||
|
|
||||||
LOGP(DRLCMACUL, LOGL_DEBUG, "UL DATA TBF=%d received (V(Q)=%d .. "
|
LOGP(DRLCMACUL, LOGL_DEBUG, "UL DATA TBF=%d received (V(Q)=%d .. "
|
||||||
"V(R)=%d)\n", rh->tfi, tbf->dir.ul.v_q, tbf->dir.ul.v_r);
|
"V(R)=%d)\n", rh->tfi, tbf->dir.ul.v_q, tbf->dir.ul.v_r);
|
||||||
|
@ -910,6 +975,7 @@ int gprs_rlcmac_rcv_rach(uint8_t ra, uint32_t Fn, int16_t qta)
|
||||||
qta = 252;
|
qta = 252;
|
||||||
tbf->ta = qta >> 2;
|
tbf->ta = qta >> 2;
|
||||||
tbf_new_state(tbf, GPRS_RLCMAC_FLOW);
|
tbf_new_state(tbf, GPRS_RLCMAC_FLOW);
|
||||||
|
tbf->state_flags |= (1 << GPRS_RLCMAC_FLAG_CCCH);
|
||||||
tbf_timer_start(tbf, 3169, bts->t3169, 0);
|
tbf_timer_start(tbf, 3169, bts->t3169, 0);
|
||||||
LOGP(DRLCMAC, LOGL_DEBUG, "TBF: [UPLINK] START TFI: %u\n", tbf->tfi);
|
LOGP(DRLCMAC, LOGL_DEBUG, "TBF: [UPLINK] START TFI: %u\n", tbf->tfi);
|
||||||
LOGP(DRLCMAC, LOGL_DEBUG, "RX: [PCU <- BTS] TFI: %u RACH qbit-ta=%d ra=%d, Fn=%d (%d,%d,%d)\n", tbf->tfi, qta, ra, Fn, (Fn / (26 * 51)) % 32, Fn % 51, Fn % 26);
|
LOGP(DRLCMAC, LOGL_DEBUG, "RX: [PCU <- BTS] TFI: %u RACH qbit-ta=%d ra=%d, Fn=%d (%d,%d,%d)\n", tbf->tfi, qta, ra, Fn, (Fn / (26 * 51)) % 32, Fn % 51, Fn % 26);
|
||||||
|
@ -1427,6 +1493,7 @@ int gprs_rlcmac_downlink_ack(struct gprs_rlcmac_tbf *tbf, uint8_t final,
|
||||||
LOGP(DRLCMAC, LOGL_DEBUG, "Trigger dowlink assignment on PACCH, "
|
LOGP(DRLCMAC, LOGL_DEBUG, "Trigger dowlink assignment on PACCH, "
|
||||||
"because another LLC PDU has arrived in between\n");
|
"because another LLC PDU has arrived in between\n");
|
||||||
memset(&tbf->dir.dl, 0, sizeof(tbf->dir.dl)); /* reset RLC states */
|
memset(&tbf->dir.dl, 0, sizeof(tbf->dir.dl)); /* reset RLC states */
|
||||||
|
tbf->state_flags = 0;
|
||||||
tbf_update(tbf);
|
tbf_update(tbf);
|
||||||
gprs_rlcmac_trigger_downlink_assignment(tbf, tbf, NULL);
|
gprs_rlcmac_trigger_downlink_assignment(tbf, tbf, NULL);
|
||||||
|
|
||||||
|
@ -1555,6 +1622,7 @@ void gprs_rlcmac_trigger_downlink_assignment(struct gprs_rlcmac_tbf *tbf,
|
||||||
tbf->ta = old_tbf->ta;
|
tbf->ta = old_tbf->ta;
|
||||||
/* change state */
|
/* change state */
|
||||||
tbf_new_state(tbf, GPRS_RLCMAC_ASSIGN);
|
tbf_new_state(tbf, GPRS_RLCMAC_ASSIGN);
|
||||||
|
tbf->state_flags |= (1 << GPRS_RLCMAC_FLAG_PACCH);
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
LOGP(DRLCMAC, LOGL_DEBUG, "Send dowlink assignment for TBF=%d on PCH, no TBF exist (IMSI=%s)\n", tbf->tfi, imsi);
|
LOGP(DRLCMAC, LOGL_DEBUG, "Send dowlink assignment for TBF=%d on PCH, no TBF exist (IMSI=%s)\n", tbf->tfi, imsi);
|
||||||
|
@ -1564,6 +1632,7 @@ void gprs_rlcmac_trigger_downlink_assignment(struct gprs_rlcmac_tbf *tbf,
|
||||||
}
|
}
|
||||||
/* change state */
|
/* change state */
|
||||||
tbf_new_state(tbf, GPRS_RLCMAC_ASSIGN);
|
tbf_new_state(tbf, GPRS_RLCMAC_ASSIGN);
|
||||||
|
tbf->state_flags |= (1 << GPRS_RLCMAC_FLAG_CCCH);
|
||||||
/* send immediate assignment */
|
/* send immediate assignment */
|
||||||
gprs_rlcmac_downlink_assignment(tbf, 0, imsi);
|
gprs_rlcmac_downlink_assignment(tbf, 0, imsi);
|
||||||
/* send immediate assignment */
|
/* send immediate assignment */
|
||||||
|
|
Loading…
Reference in New Issue