Fixed bugs in handling of TBFs.

This commit is contained in:
Ivan Kluchnikov 2012-03-18 15:04:48 +04:00
parent 8ee6051b72
commit c320d86052
3 changed files with 40 additions and 26 deletions

View File

@ -64,7 +64,8 @@ int gprs_bssgp_pcu_rx_dl_ud(struct msgb *msg)
DEBUGP(DBSSGP, "BSSGP Catch from SGSN=%u octets. Send it to OpenBTS.\n", data_index);
gsmtap_send_llc(tbf->rlc_data,data_index);
tbf->data_index = data_index;
gprs_rlcmac_segment_llc_pdu(tbf);
gprs_rlcmac_downlink_assignment(tbf);
}
/* Receive a BSSGP PDU from a BSS on a PTP BVCI */

View File

@ -59,10 +59,9 @@ static struct gprs_rlcmac_tbf *tbf_by_tfi(uint8_t tfi)
return NULL;
}
static struct gprs_rlcmac_tbf *tbf_by_tlli(uint8_t tlli)
static struct gprs_rlcmac_tbf *tbf_by_tlli(uint32_t tlli)
{
struct gprs_rlcmac_tbf *tbf;
llist_for_each_entry(tbf, &gprs_rlcmac_tbfs, list) {
if ((tbf->tlli == tlli)&&(tbf->direction == GPRS_RLCMAC_UL_TBF))
return tbf;
@ -79,7 +78,6 @@ struct gprs_rlcmac_tbf *tbf_alloc(uint8_t tfi)
return NULL;
tbf->tfi = tfi;
llist_add(&tbf->list, &gprs_rlcmac_tbfs);
return tbf;
@ -315,6 +313,7 @@ int gprs_rlcmac_rcv_data_block(BitVector *rlc_block)
if (!tbf) {
tbf = tbf_alloc(ul_data_block->TFI);
if (tbf) {
tbf->tlli = ul_data_block->TLLI;
tbf->direction = GPRS_RLCMAC_UL_TBF;
tbf->state = GPRS_RLCMAC_WAIT_DATA_SEQ_START;
} else {
@ -373,21 +372,13 @@ int gprs_rlcmac_rcv_control_block(BitVector *rlc_block)
COUT("RLCMAC_CONTROL_BLOCK_END------------------------------");
//gprs_rlcmac_control_block_get_tfi_tlli(ul_control_block, &tfi, &tlli);
tbf = tbf_by_tfi(tfi);
if (!tbf) {
return 0;
}
//tbf = tbf_by_tfi(tfi);
//if (!tbf) {
// return 0;
//}
switch (ul_control_block->u.MESSAGE_TYPE) {
case MT_PACKET_CONTROL_ACK:
/*
COUT("SEND IA Rest Octets Downlink Assignment>>>>>>>>>>>>>>>>>>");
BitVector IARestOctetsDownlinkAssignment(23*8);
IARestOctetsDownlinkAssignment.unhex("2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b");
writeIARestOctetsDownlinkAssignment(&IARestOctetsDownlinkAssignment, 20, *tlli);
sendToOpenBTS(&IARestOctetsDownlinkAssignment);
*/
//usleep(500000);
tlli = ul_control_block->u.Packet_Control_Acknowledgement.TLLI;
tbf = tbf_by_tlli(tlli);
if (!tbf) {
@ -402,11 +393,11 @@ int gprs_rlcmac_rcv_control_block(BitVector *rlc_block)
if (!tbf) {
return 0;
}
//COUT("SEND PacketUplinkAssignment>>>>>>>>>>>>>>>>>>");
//BitVector PacketUplinkAssignment(23*8);
//PacketUplinkAssignment.unhex("2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b");
//writePUassignment(&PacketUplinkAssignment, tbf->tfi, tbf->tlli);
//sendToOpenBTS(&PacketUplinkAssignment);
COUT("SEND PacketUplinkAssignment>>>>>>>>>>>>>>>>>>");
BitVector packet_uplink_assignment(23*8);
packet_uplink_assignment.unhex("2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b");
write_packet_uplink_assignment(&packet_uplink_assignment, tbf->tfi, tbf->tlli);
pcu_l1if_tx(&packet_uplink_assignment);
break;
}
free(ul_control_block);
@ -433,7 +424,7 @@ void gprs_rlcmac_rcv_block(BitVector *rlc_block)
}
// Send RLC data to OpenBTS.
void gprs_rlcmac_tx_dl_data_block(uint32_t tlli, uint8_t *pdu, int start_index, int end_index, uint8_t bsn, uint8_t fbi)
void gprs_rlcmac_tx_dl_data_block(uint32_t tlli, uint8_t tfi, uint8_t *pdu, int start_index, int end_index, uint8_t bsn, uint8_t fbi)
{
int spare_len = 0;
BitVector data_block_vector(BLOCK_LEN*8);
@ -444,7 +435,7 @@ void gprs_rlcmac_tx_dl_data_block(uint32_t tlli, uint8_t *pdu, int start_index,
data_block->SP = 1;
data_block->USF = 1;
data_block->PR = 0;
data_block->TFI = 20;
data_block->TFI = tfi;
data_block->FBI = fbi;
data_block->BSN = bsn;
if ((end_index - start_index) < 20) {
@ -499,13 +490,13 @@ int gprs_rlcmac_segment_llc_pdu(struct gprs_rlcmac_tbf *tbf)
fbi = 1;
}
end_index = start_index + block_data_len;
gprs_rlcmac_tx_dl_data_block(tbf->tlli, tbf->rlc_data, start_index, end_index, i, fbi);
gprs_rlcmac_tx_dl_data_block(tbf->tlli, tbf->tfi, tbf->rlc_data, start_index, end_index, i, fbi);
start_index += block_data_len;
}
}
else
{
gprs_rlcmac_tx_dl_data_block(tbf->tlli, tbf->rlc_data, 0, tbf->data_index, 0, 1);
gprs_rlcmac_tx_dl_data_block(tbf->tlli, tbf->tfi, tbf->rlc_data, 0, tbf->data_index, 0, 1);
}
}
@ -520,8 +511,28 @@ void gprs_rlcmac_tx_ul_ud(gprs_rlcmac_tbf *tbf)
//for (unsigned i = 0; i < dataLen; i++)
// LOGP(DBSSGP, LOGL_DEBUG, " Data[%u] = %u", i, rlc_data[i]);
bctx->cell_id = CELL_ID;
bctx->nsei = NSEI;
bctx->ra_id.mnc = MNC;
bctx->ra_id.mcc = MCC;
bctx->ra_id.lac = PCU_LAC;
bctx->ra_id.rac = PCU_RAC;
bctx->bvci = BVCI;
llc_pdu = msgb_alloc_headroom(msg_len, msg_len,"llc_pdu");
msgb_tvlv_push(llc_pdu, BSSGP_IE_LLC_PDU, sizeof(uint8_t)*tbf->data_index, tbf->rlc_data);
bssgp_tx_ul_ud(bctx, tbf->tlli, &qos_profile, llc_pdu);
}
void gprs_rlcmac_downlink_assignment(gprs_rlcmac_tbf *tbf)
{
COUT("SEND IA Rest Octets Downlink Assignment>>>>>>>>>>>>>>>>>>");
BitVector ia_rest_octets_downlink_assignment(23*8);
ia_rest_octets_downlink_assignment.unhex("2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b");
write_ia_rest_octets_downlink_assignment(&ia_rest_octets_downlink_assignment, tbf->tfi, tbf->tlli);
pcu_l1if_tx(&ia_rest_octets_downlink_assignment);
usleep(500000);
gprs_rlcmac_segment_llc_pdu(tbf);
}

View File

@ -79,10 +79,12 @@ int gprs_rlcmac_rcv_control_block(BitVector *rlc_block);
void gprs_rlcmac_rcv_block(BitVector *rlc_block);
void gprs_rlcmac_tx_dl_data_block(uint32_t tlli, uint8_t *pdu, int start_index, int end_index, uint8_t bsn, uint8_t fbi);
void gprs_rlcmac_tx_dl_data_block(uint32_t tlli, uint8_t tfi, uint8_t *pdu, int start_index, int end_index, uint8_t bsn, uint8_t fbi);
int gprs_rlcmac_segment_llc_pdu(struct gprs_rlcmac_tbf *tbf);
void gprs_rlcmac_tx_ul_ud(gprs_rlcmac_tbf *tbf);
void gprs_rlcmac_downlink_assignment(gprs_rlcmac_tbf *tbf);
#endif // GPRS_RLCMAC_H