From ae03f22199fb93b104411f113e93134cf11d1bb2 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Sat, 26 Oct 2013 21:20:51 +0200 Subject: tbf: Move gprs_rlcmac_send_packet_uplink_assignment to the tbf Again the function was called send but didn't do any sending --- src/gprs_rlcmac.h | 3 -- src/gprs_rlcmac_data.cpp | 75 ----------------------------------------------- src/gprs_rlcmac_sched.cpp | 2 +- src/tbf.cpp | 73 +++++++++++++++++++++++++++++++++++++++++++++ src/tbf.h | 1 + 5 files changed, 75 insertions(+), 79 deletions(-) diff --git a/src/gprs_rlcmac.h b/src/gprs_rlcmac.h index 737f7c62..0e09f3f3 100644 --- a/src/gprs_rlcmac.h +++ b/src/gprs_rlcmac.h @@ -94,9 +94,6 @@ enum gprs_rlcmac_block_type { int gprs_rlcmac_tx_ul_ud(gprs_rlcmac_tbf *tbf); -struct msgb *gprs_rlcmac_send_packet_uplink_assignment( - struct gprs_rlcmac_tbf *tbf, uint32_t fn); - int gprs_rlcmac_downlink_ack( struct gprs_rlcmac_tbf *tbf, uint8_t final, uint8_t ssn, uint8_t *rbb); diff --git a/src/gprs_rlcmac_data.cpp b/src/gprs_rlcmac_data.cpp index 797b5250..aa5bfda7 100644 --- a/src/gprs_rlcmac_data.cpp +++ b/src/gprs_rlcmac_data.cpp @@ -41,87 +41,12 @@ extern void *tall_pcu_ctx; /* After sending these frames, we poll for ack/nack. */ #define POLL_ACK_AFTER_FRAMES 20 -/* If acknowledgement to uplink/downlink assignmentshould be polled */ -#define POLLING_ASSIGNMENT_UL 1 /* * UL data block flow */ -struct msgb *gprs_rlcmac_send_packet_uplink_assignment( - struct gprs_rlcmac_tbf *tbf, uint32_t fn) -{ - struct msgb *msg; - struct gprs_rlcmac_tbf *new_tbf; - gprs_rlcmac_bts *bts = tbf->bts->bts_data(); - -#if POLLING_ASSIGNMENT_UL == 1 - if (tbf->poll_state != GPRS_RLCMAC_POLL_NONE) { - LOGP(DRLCMACUL, LOGL_DEBUG, "Polling is already " - "sheduled for TBF=%d, so we must wait for uplink " - "assignment...\n", tbf->tfi); - return NULL; - } - if (tbf->bts->sba()->find(tbf->trx_no, tbf->control_ts, (fn + 13) % 2715648)) { - LOGP(DRLCMACUL, LOGL_DEBUG, "Polling is already scheduled for " - "single block allocation...\n"); - return NULL; - } -#endif - - /* on down TBF we get the uplink TBF to be assigned. */ - if (tbf->direction == GPRS_RLCMAC_DL_TBF) - new_tbf = tbf->bts->tbf_by_tlli(tbf->tlli, GPRS_RLCMAC_UL_TBF); - else - new_tbf = tbf; - - if (!new_tbf) { - LOGP(DRLCMACUL, LOGL_ERROR, "We have a schedule for uplink " - "assignment at downlink TBF=%d, but there is no uplink " - "TBF\n", tbf->tfi); - tbf->ul_ass_state = GPRS_RLCMAC_UL_ASS_NONE; - return NULL; - } - - msg = msgb_alloc(23, "rlcmac_ul_ass"); - if (!msg) - return NULL; - LOGP(DRLCMAC, LOGL_INFO, "TBF: START TFI: %u TLLI: 0x%08x Packet Uplink Assignment (PACCH)\n", new_tbf->tfi, new_tbf->tlli); - bitvec *ass_vec = bitvec_alloc(23); - if (!ass_vec) { - msgb_free(msg); - return NULL; - } - bitvec_unhex(ass_vec, - "2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"); - Encoding::write_packet_uplink_assignment(bts, ass_vec, tbf->tfi, - (tbf->direction == GPRS_RLCMAC_DL_TBF), tbf->tlli, - tbf->tlli_valid, new_tbf, POLLING_ASSIGNMENT_UL, bts->alpha, - bts->gamma, -1); - bitvec_pack(ass_vec, msgb_put(msg, 23)); - RlcMacDownlink_t * mac_control_block = (RlcMacDownlink_t *)talloc_zero(tall_pcu_ctx, RlcMacDownlink_t); - LOGP(DRLCMAC, LOGL_DEBUG, "+++++++++++++++++++++++++ TX : Packet Uplink Assignment +++++++++++++++++++++++++\n"); - decode_gsm_rlcmac_downlink(ass_vec, mac_control_block); - LOGPC(DCSN1, LOGL_NOTICE, "\n"); - LOGP(DRLCMAC, LOGL_DEBUG, "------------------------- TX : Packet Uplink Assignment -------------------------\n"); - bitvec_free(ass_vec); - talloc_free(mac_control_block); - -#if POLLING_ASSIGNMENT_UL == 1 - tbf->poll_state = GPRS_RLCMAC_POLL_SCHED; - tbf->poll_fn = (fn + 13) % 2715648; - tbf->ul_ass_state = GPRS_RLCMAC_UL_ASS_WAIT_ACK; -#else - tbf->ul_ass_state = GPRS_RLCMAC_UL_ASS_NONE; - tbf_new_state(new_tbf, GPRS_RLCMAC_FLOW); - tbf_assign_control_ts(new_tbf); -#endif - debug_diagram(bts->bts, tbf->diag, "send UL-ASS"); - - return msg; -} - /* send DL data block * * The messages are fragmented and forwarded as data blocks. diff --git a/src/gprs_rlcmac_sched.cpp b/src/gprs_rlcmac_sched.cpp index c44036c6..11a9630d 100644 --- a/src/gprs_rlcmac_sched.cpp +++ b/src/gprs_rlcmac_sched.cpp @@ -119,7 +119,7 @@ static struct msgb *sched_select_ctrl_msg(struct gprs_rlcmac_bts *bts, /* schedule PACKET UPLINK ASSIGNMENT (1st priority) */ if (ul_ass_tbf) { tbf = ul_ass_tbf; - msg = gprs_rlcmac_send_packet_uplink_assignment(tbf, fn); + msg = tbf->create_ul_ass(fn); } /* schedule PACKET DOWNLINK ASSIGNMENT (2nd priotiry) */ if (!msg && dl_ass_tbf) { diff --git a/src/tbf.cpp b/src/tbf.cpp index 53117bff..c640c8d2 100644 --- a/src/tbf.cpp +++ b/src/tbf.cpp @@ -36,6 +36,7 @@ extern "C" { /* If acknowledgement to downlink assignment should be polled */ #define POLLING_ASSIGNMENT_DL 1 +#define POLLING_ASSIGNMENT_UL 1 extern "C" { int bssgp_tx_llc_discarded(struct bssgp_bvc_ctx *bctx, uint32_t tlli, @@ -973,6 +974,78 @@ struct msgb *gprs_rlcmac_tbf::create_dl_ass(uint32_t fn) return msg; } +struct msgb *gprs_rlcmac_tbf::create_ul_ass(uint32_t fn) +{ + struct msgb *msg; + struct gprs_rlcmac_tbf *new_tbf; + +#if POLLING_ASSIGNMENT_UL == 1 + if (poll_state != GPRS_RLCMAC_POLL_NONE) { + LOGP(DRLCMACUL, LOGL_DEBUG, "Polling is already " + "sheduled for TBF=%d, so we must wait for uplink " + "assignment...\n", tfi); + return NULL; + } + if (bts->sba()->find(trx_no, control_ts, (fn + 13) % 2715648)) { + LOGP(DRLCMACUL, LOGL_DEBUG, "Polling is already scheduled for " + "single block allocation...\n"); + return NULL; + } +#endif + + /* on down TBF we get the uplink TBF to be assigned. */ +#warning "Probably want to find by IMSI too" + if (direction == GPRS_RLCMAC_DL_TBF) + new_tbf = bts->tbf_by_tlli(tlli, GPRS_RLCMAC_UL_TBF); + else + new_tbf = this; + + if (!new_tbf) { + LOGP(DRLCMACUL, LOGL_ERROR, "We have a schedule for uplink " + "assignment at downlink TBF=%d, but there is no uplink " + "TBF\n", tfi); + ul_ass_state = GPRS_RLCMAC_UL_ASS_NONE; + return NULL; + } + + msg = msgb_alloc(23, "rlcmac_ul_ass"); + if (!msg) + return NULL; + LOGP(DRLCMAC, LOGL_INFO, "TBF: START TFI: %u TLLI: 0x%08x Packet Uplink Assignment (PACCH)\n", new_tbf->tfi, new_tbf->tlli); + bitvec *ass_vec = bitvec_alloc(23); + if (!ass_vec) { + msgb_free(msg); + return NULL; + } + bitvec_unhex(ass_vec, + "2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b"); + Encoding::write_packet_uplink_assignment(bts_data(), ass_vec, tfi, + (direction == GPRS_RLCMAC_DL_TBF), tlli, + tlli_valid, new_tbf, POLLING_ASSIGNMENT_UL, bts_data()->alpha, + bts_data()->gamma, -1); + bitvec_pack(ass_vec, msgb_put(msg, 23)); + RlcMacDownlink_t * mac_control_block = (RlcMacDownlink_t *)talloc_zero(tall_pcu_ctx, RlcMacDownlink_t); + LOGP(DRLCMAC, LOGL_DEBUG, "+++++++++++++++++++++++++ TX : Packet Uplink Assignment +++++++++++++++++++++++++\n"); + decode_gsm_rlcmac_downlink(ass_vec, mac_control_block); + LOGPC(DCSN1, LOGL_NOTICE, "\n"); + LOGP(DRLCMAC, LOGL_DEBUG, "------------------------- TX : Packet Uplink Assignment -------------------------\n"); + bitvec_free(ass_vec); + talloc_free(mac_control_block); + +#if POLLING_ASSIGNMENT_UL == 1 + poll_state = GPRS_RLCMAC_POLL_SCHED; + poll_fn = (fn + 13) % 2715648; + ul_ass_state = GPRS_RLCMAC_UL_ASS_WAIT_ACK; +#else + ul_ass_state = GPRS_RLCMAC_UL_ASS_NONE; + tbf_new_state(new_tbf, GPRS_RLCMAC_FLOW); + tbf_assign_control_ts(new_tbf); +#endif + debug_diagram(bts, diag, "send UL-ASS"); + + return msg; +} + struct msgb *gprs_rlcmac_tbf::create_ul_ack(uint32_t fn) { int final = (state_is(GPRS_RLCMAC_FINISHED)); diff --git a/src/tbf.h b/src/tbf.h index b871946a..57fe3b9d 100644 --- a/src/tbf.h +++ b/src/tbf.h @@ -100,6 +100,7 @@ struct gprs_rlcmac_tbf { int assemble_forward_llc(uint8_t *data, uint8_t len); struct msgb *create_dl_ass(uint32_t fn); + struct msgb *create_ul_ass(uint32_t fn); struct msgb *create_ul_ack(uint32_t fn); int rlcmac_diag(); -- cgit v1.2.3