| This document describes the handling of TBFs |
| -------------------------------------------- |
| |
| Notes: |
| TBF |
| Instance for one temporary block flow. |
| |
| LLC Frame |
| Current frame to be transmitted or received. If tbf->llc_length is not 0, |
| the frame exists, if 0, the frame does not exist. If tbf->llc_index is not |
| 0, parts of the frame have been transmitted or received so far. |
| |
| LLC Queue |
| Queue of next frames to be transmitted. |
| |
| States: |
| TBF_ST_ASSIGN |
| After a downlink TBF is created, it resides in this state until the |
| block flow can start. This is required to give the mobile time to listen |
| to connect to downlink PDCH. |
| |
| TBF_ST_FLOW, |
| During packet flow, this state indicates downlink and uplink TBF block |
| flow. |
| |
| TBF_ST_FINISHED, |
| Uplink TBF: |
| After final block is received AND all other blocks are completely |
| received, the state is entered. The PACKET CONTROL ACK is still not |
| received. (Counter N3103 is counted on each poll request.) |
| Downlink TBF: |
| All blocks including the final block has been transmitted. Not all |
| downlink blocks are acknowledged yet. (Counter N3015 is counted on each |
| poll request.) |
| |
| TBF_ST_WAIT_RELEASE, |
| The all blocks on downlink TBF have been acked by mobile. The penalty |
| timer T3192 is running on mobile. |
| |
| TBF_ST_RELEASING, |
| Wait for TFI/USF to be re-used. This state is entered when a counter |
| reaches it's maximum and T3169 is running. |
| |
| |
| When downlink LLC PDU is received: |
| |
| If downlink TBF exists for given TLLI, but not in RELEASING state: |
| If downlink TBF is in FLOW or FINISHED state: |
| Enqueue PDU to LLC Queue of TBF. |
| Done. |
| If downlink TBF is in WAIT RELEASE state: |
| Attach PDU to LLC Frame of TBF. |
| Put TBF back into FLOW state. |
| Done. |
| If downlink TBF does not exists for given TLLI, or in RELEASING state: |
| Create new downlink TBF. |
| Attach PDU to LLC Frame of TBF. |
| If uplink TBF exists for given TLLI, but not in RELEASING state: |
| Assign packet channel PACCH. |
| Done. |
| If uplink TBF does not exists for given TLLI, or in RELEASING state: |
| Assign packet channel AGCH. |
| Done. |
| |
| When channel request for uplink TBF is received: |
| |
| Create new uplink TBF. |
| If channel request was received on RACH |
| Assign packet channel AGCH. |
| Done |
| If channel request was received on PACCH |
| Assign packet channel PACCH. |
| Done |
| |
| Handling of LLC Frame of downlink TBF and LLC Queue of downlink TBF: |
| |
| If a downlink TBF is created, the LLC PDU is attached to LLC Frame of TBF |
| (downlink flow is assigned to MS). |
| |
| If a downlink TBF exists, the LLC PDU is enqueued to LLC Queue of TBF. |
| |
| During transfer of downlink blocks, the LLC Queue is dequeued whenever all |
| segments of LLC Frame were used for generation of downlink blocks. (If a |
| block is partly filled with LLC Frame segment, its remaining space is filled |
| with the next LLC Frame from the Queue.) |
| |
| If the transfer is finished, no more LLC Frames are dequeued from the LLC |
| Queue, in case a new frame has arrived during lifetime of TBF. |
| |
| If the all downlink blocks have been acknowledged, the LLC Queue is |
| dequeued and an existing frame is attached to LLC Frame. If so, the new |
| state is FLOW (downlink flow is assigned to MS), otherwise WAIT RELEASE. |
| |
| If a new LLC PDU is attached to LLC Frame during WAIT RELEASE state, the |
| state is changed to FLOW (downlink flow is assigned to MS). |
| |
| |
| Handling of LLC Frame on uplink TBF: |
| |
| Received uplink blocks are appended to LLC Frame of TBF. If the PDU is |
| complete, it is forwarded to the upper layer. |
| |
| |
| Control TS: |
| On uplink or downlink assignment, it is required to have one timeslot that |
| can be used to receive and transmit. This timeslot is used at uplink TBF |
| to acknowledge and to assign other TBF. This timeslot is used at downlink |
| TBF to poll acknowledgement and to assign other TBF. |
| |
| The first common TS (first_common_ts) is calculated when channels are |
| allocated. After creation of TBF or after assignment to different TS layout, |
| the first common TS is used for control TS. |
| |
| The first common TS (and so control TS) must not need to be allocated to |
| MS as uplink TBF. (E.g. in case of non-available USF for this slot) |
| |
| |
| Polling: |
| In order to poll uplink control block from MS, a special poll state and |
| frame number is stored at PDCH UL Controller. The scheduler reads that value |
| and will not assign uplink resource for other TBFs at that frame number. |
| |
| On receipt of an Uplink RLCMAC block, it's the duty of each specific message |
| handler to release the expectancies previously stored in the PDCH UL |
| Controller. After the specific handler returns, the generic return path will |
| expire all reserved events up to the curent FN for that PDCH, eventually |
| calling timeout functions on TBFs and SBAs owning those reservations. Hence, |
| the layer 1 interface is expected to provide DATA.ind for each FN block, |
| containing data=0 if decoding failed, in order to keep the clock up-to-date in |
| upper layers. |
| |
| Because polling requires uplink response from MS, the polling must be |
| performed at control TS. |
| |
| |
| Data structures of TBFs and PDCHs: |
| |
| There is a global structure for PCU (struct gprs_pcu the_pcu). |
| |
| A BTS is created and put into PCU's list for each PCUIF INFO_IND with a unique |
| bts_nr received. |
| |
| Each BTS structure has 8 TRX structures. |
| |
| Each TRX structure has 8 PDCH structures, one for each timeslot. |
| |
| Each BTS structure has a list of MS (struct GprsMs). |
| |
| Each MS can have 1 UL TBF and 1 DL TBF, and 1 TBF is always assigned to an |
| existing GprsMS structure. |
| |
| Each BTS also has two linked lists of TBF instances: |
| - uplink TBFs |
| - downlink TBFs |
| |
| Each TBF instance also has: |
| - a direction |
| - a TFI of range 0..31 |
| - an array of 8 PDCH structures, one for each assigned timeslot |
| - in case of uplink TBF: an array of 8 USFs, one for each assigned timeslot |
| |
| Each TRX and all it's PDCH structures also have: |
| - an array of 32 uplink TBFs that are assigned to this PDCH |
| - an array of 32 downlink TBFs that are assigned to this PDCH |
| |
| On creation of a new TBF, it links to all assigned PDCHs. |
| Each PDCH links to that TBF. The TBF is added to the list of TBFs. |
| In case of uplink TBF: The allocated USFs are stored for each timeslot. |
| |
| On release of a TBF, the link to this PDCH is removed from all assigned |
| PDCHs. The TBF is removed from the list of TBFs. The TBF is destroyed. |
| |
| GprsMs structures are kept alive for a while once they become unused, in order to |
| have a cache of MS related information it would otherwise need to acquire |
| again once it interacts with the PCU again. |