path: root/src
AgeCommit message (Collapse)AuthorFilesLines
2016-02-16Add current state of Packet Timeslot Reconfiguremax/ptsrMax7-289/+222
The way it's used now (upgrade to multislot for DL TBF upon LLC frame arrival) doesn't seem right because DL and UL TBF do not exist at that moment. Nevertheless, encoding routine is complete for EGPRS (no GPRS yet) and trigger functions and state changes provide nice illustration into internal workings of the scheduler. Hence we'll keep it here for the time being. Signed-off-by: Max <msuraev@sysmocom.de>
Signed-off-by: Max <msuraev@sysmocom.de>
Signed-off-by: Max <msuraev@sysmocom.de>
Signed-off-by: Max <msuraev@sysmocom.de>
2016-02-11P.TS.R. WIPMax9-11/+320
Signed-off-by: Max <msuraev@sysmocom.de>
2016-02-08edge: Support all coding schemes for BSSGP flow controljerlbeck/masterJacob Erlbeck1-31/+50
Currently the MCS schemes are not supported when the leak rate is being computed. This leads to a lower value for the leak rate, thus limiting the throughput to GPRS-like ranges. Use the payload size reported by GprsCodingScheme instead. Sponsored-by: On-Waves ehf
2016-02-08edge: Work-around to not use MCS-6 with paddingJacob Erlbeck1-2/+6
Currently single BSN blocks of size 68 (a single unit from MCS-8) are put into a MCS-6 block with padding according to TS 44.060 Annex J. Unfortunately, these packets are ignored by the E71. This might be related to the currently incorrect usage of the puncturing schemes and the RSB bit (the puncturing schemes are not updated and the RBS flag is never set). Avoid downgrading from MCS-8 to MCS-6 if there is no second block available. Send the block twice instead. Sponsored-by: On-Waves ehf
2016-02-08edge: Compare len instead of using cs.isCombinableJacob Erlbeck2-12/+15
Comparing the coding scheme properties doesn't seem to be strong enough, since create_dl_acked_block(fn, ts, index, index2) sometimes had to combine data units of different size this way. Check the registered size of the BSN blocks instead, since these must match if two blocks are to be combined in a single RLC data message with MCS7-9. It is not yet clear, what exactly goes wrong with the current implementation, but this commit fixes the problem which trigger the assertion in create_dl_acked_block. Sponsored-by: On-Waves ehf
2016-02-08edge: Send a second BSN block in an RLC message if possibleJacob Erlbeck3-54/+109
Currently only one BSN block is encoded in each RLC data message, even if MSC7-9 are used, which transport two independant (except for a max BSN delta of 512) BSN blocks. In that case, the same block is just put twice into the same message. The current create_dl_acked_block(fn, ts) method handles block selection (resend, new BSN, dummy block, ...) and restart handling in one method and is too complex to extend it accordingly. Therefore this commit move the block selection/creation handling into a new method (take_next_bsn) which delivers the next BSN along with a hint, whether it may be combined with another block. In that case, the function can be called a second time (this time with a valid previous BSN, that's the one returned by the first call) to get the second BSN. The real block generation method create_dl_acked_block(fn, ts, index, index2) is then called with both BSNs as indices (the second must be -1, if there is only one BSN). Note that every BSN returned by take_next_bsn should be passed to create_dl_acked_block to avoid state inconsistencies. Sponsored-by: On-Waves ehf
2016-02-08edge: Refactor create_dl_acked_block for multi-block supportJacob Erlbeck2-25/+86
Currently the method is hard-coded to support a single BSN only. MCS-7 to MCS-9 encode 2 data blocks into a single RLC data message. This commit refactors create_dl_acked_block to process any number of blocks internally. Note that this does not extend the parameter list accordingly and just duplicates the BSN if these MCS are being used. Sponsored-by: On-Waves ehf
2016-02-08ms: Fix GprsMs::current_cs_dl()Jacob Erlbeck1-1/+1
Currently the queue length is overwritten by the remaining chunk length, which should be added instead. This may result in a lower CS/MCS value than expected. Add the chunk length instead if the TBF is present. Sponsored-by: On-Waves ehf
2016-02-08rlc: Use the rlc structure to access the data unit in the RLC messageJacob Erlbeck2-21/+31
Currently most offsets are hard-coded which makes it difficult to access the data units and their headers when padding has to be taken into account. These offset are already provided by the gprs_rlc_data_info_init_ul/dl functions. Change the encoder/decoder to use these values. Note that some assumptions (bit alignment) are still present in the code and checked by assertions. Sponsored-by: On-Waves ehf
2016-02-08rlc: Add gprs_rlc_mcs_cps_decodeJacob Erlbeck2-0/+31
To access EGPRS data blocks, the optional padding must be taken into account. Whether padding has been used must be dervied from the CPS field in the header of the RLC EGPRS data message. Add this function to decode the CPS value and extract that information. Sponsored-by: On-Waves ehf
2016-02-08rlc: Add with_padding argument to gprs_rlc_data_info_init_dl/ulJacob Erlbeck3-13/+23
The offsets of the data areas change when padding is used (see TS 44.060, and Annex J for details). Extend the parameter lists to pass the with_padding flag and use that information to compute the correct offsets. Sponsored-by: On-Waves ehf
2016-02-08cs: Add GprsCodingScheme::optionalPaddingBitsJacob Erlbeck2-14/+21
Return the amount of optional padding bits, which is 6*8 for MCS-3 and MCS-6 and 0 for all other coding schemes. The padding is needed the encode 68 byte data blocks (MCS-8) with these schemes. See TS 44.060, and Annex J for details. Sponsored-by: On-Waves ehf
2016-02-08cs: Add family related methodsJacob Erlbeck2-16/+73
Add family handling and the related methods family, isFamilyCompatible, isCombinable, decToSingleBlock to GprsCodingScheme. Sponsored-by: On-Waves ehf
2016-02-08edge/vty: Set initial MCSJacob Erlbeck1-0/+42
This adds the following VTY command (config-pcu node): - mcs <1-9> sets initial DL and UL MCS to the same value - mcs <1-9> <1-9> sets initial DL and UL MCS separately - no mcs sets the default values Sponsored-by: On-Waves ehf
2016-02-08rlc: Support encoding of EGPRS header type 1 + 2Jacob Erlbeck4-8/+104
Currently only header type 3 (MCS-1 to MCS-4) is supported. Add header structs to rlc.h and extend Encoding::rlc_write_dl_data_header accordingly. Sponsored-by: On-Waves ehf
2016-02-08tbf: Add state WAIT_ASSIGNJacob Erlbeck3-9/+23
Currently the state on the TBF is set to ASSIGN when it is created and in general changed to FLOW when it is acknowledged by the MS. The moment when the assignment is really transmitted to the MS (which can take some time) is not reflected by the state. A TBF can considered to be valid, when the assignment is received by the MS. Add the state WAIT_ASSIGN that is entered when the assigment has been send to the MS (more precisely: when the corresponding RTS has been processed or the message has been sent to the BTS). The TBF, its PDCH(s), and its TFI can be assumed to be valid, when the TBF has a state of WAIT_ASSIGN or higher (assuming that the TBF starting time has not been set, which is currently only done for SBA, which are not associated with a TBF). Note that due to queuing in the BTS there can still be a invalid time period for immediate assignments, when the request is lingering in the AGCH or PCH queues. Sponsored-by: On-Waves ehf
2016-02-08ms: Add current_pacch_slots methodJacob Erlbeck3-0/+34
The PACCH is specific to an MS and may change when a TBF is established or removed (see TS 44.060, For multislot class type 2 phones, more than one timeslot may be used to transmit RLC/MAC control messages. Add a method that returns a set of TS which can be used for the PACCH. Sponsored-by: On-Waves ehf
2016-02-08sched: Do PACCH assignments for the same direction lastJacob Erlbeck1-4/+23
Currently the selection of a pending control message is done round robin. It can possibly happen, that a DL assigment is sent on a DL TBF while an UL assignment is pending. The MS will replace the old DL TBF in that case, so that it can no longer be used for the PACCH so that the UL assignment is lost. Give assigment requests for the same direction a lower priority. Sponsored-by: On-Waves ehf
2016-02-08tbf: Only free TBF if it was replaced in rcv_control_ackJacob Erlbeck1-2/+4
Currently the TBF whose PACCH has been used to send an assigment is freed if it is in state WAIT_RELEASE. Sometimes this TBF could be used for several assignments (e.g. an 'old' DL TBF is used to assign an UL and then a DL TBF). The second of these assigments will never be sent in that case. On the other hand, the MS replaces a TBF of the same direction, so the old one can be freed in that case. Only free the TBF if it is in state WAIT_RELEASE and has the same direction like the new one. Sponsored-by: On-Waves ehf
2016-02-08edge: Support EGPRS in IMM ASSIGNMENTJacob Erlbeck1-0/+25
Tell the MS to use EGPRS if EGPRS is enabled on the TBF. Note that only downlink TBF will be supported so far. Thus single-phase uplink assignments may not work properly. Sponsored-by: On-Waves ehf
2016-02-08encoding: Redesign Encoding::write_immediate_assignment APIJacob Erlbeck3-35/+55
The EGPRS support will need more information to encode the IMMEDIATE ASSIGMENT. Instead of adding more parameters pass a pointer to the TBF unless an SBA shall be done (indicated by tbf == NULL). All values that can be derived from the TBF and are not needed for an SBA are removed from the parameter list. Return a negative value on error. Sponsored-by: On-Waves ehf
2016-02-08encoding: Refactor write_immediate_assignmentJacob Erlbeck1-79/+98
Move the IA rest encoding into separate functions fpr uplink and downlink. Sponsored-by: On-Waves ehf
2016-02-08encoding: Use explicit LH encoding in write_immediate_assignmentJacob Erlbeck1-2/+2
Currently bitvec_write_field is used which just sets the bits as given, while the spec 44.018 assumes LH encoding. Use the bitvec_write_field_lh function instead. Sponsored-by: On-Waves ehf
2016-02-08pcu: Add bitvec_write_field_lhJacob Erlbeck2-0/+19
While the bitvec functions from libosmocore support LH encoding, the C++ wrapper does not. Add a bitvec_write_field_lh function that is similar to bitvec_write_field, but writes L and H instead of ZERO and ONE. Sponsored-by: On-Waves ehf
2016-02-08tbf: Don't change type from CCCH to PACCH without ackJacob Erlbeck2-2/+11
Currently the CCCH flag is cleared and the PACCH flag is set when a multislot upgrade is scheduled for a downlink TBF, even if the MS has never confirmed in any way that the PACCH really exists. This can happen if the MS did not receive the DL IMM.ASS. Since the CCCH flags gets cleared in that case, the IMM.ASSS is never retried and all subsequent PACKET DOWNLINK ASSIGNMENTS will fail. This commit delays the update of these flags until the MS has responded with a corresponding CONTROL ACK. Sponsored-by: On-Waves ehf
2016-02-08tbf: Use TLLI as ID if TFI not yet assignedJacob Erlbeck4-9/+41
Currently the old TFI is always used as ID when a PACKET DOWNLINK ASSIGNMENT is generated. This fails if the old TBF has not been fully assigned yet. The MS will then ignore the PDA. This commit changes write_packet_downlink_assignment to accept an additional parameter old_tfi_is_valid and uses the new TBF's TLLI instead of the olf TFI if that parameter is set to false. Sponsored-by: On-Waves ehf
2016-02-08tbf: Add check_polling/set_pollingJacob Erlbeck7-69/+111
Currently the checks for and the actual polling is done in several places by copy & paste of several lines of code. This hinders changes of they polling is handled internally and also is likely source of programming mistakes. Separate this into a check_polling function, that checks whether polling is possible and returns the FN and the RRBP to be used in that case. Otherwise the cause is logged (LOGL_DEBUG) and a negative error value is returned. There are no other side effect beside the logging. If the call is successful, the set_polling method can be used to actually register the polling. Extend the encoder functions' parameters lists by an rrbp parameter. Sponsored-by: On-Waves ehf
2016-02-08tbf: Add and use tbf->poll_tsJacob Erlbeck5-9/+15
Currently tbf->control_ts is used to look up an incoming poll response. Since that may eventually change, poll timeouts could theoretically happen in that case. Store the real poll TS in tbf->poll_ts at all places where tbf->poll_fn is set. Do not use tbf->control_ts to look up outstanding polls. Sponsored-by: On-Waves ehf
2016-02-08tbf: Mark control slots in VTY TBF outJacob Erlbeck1-1/+2
Put an '!' after the PDCH number in the output of the 'show tbf' command, if is_control_ts() yields true. Sponsored-by: On-Waves ehf
2016-02-08tbf: Use is_control_ts() instead of comparing TS values directlyJacob Erlbeck4-8/+11
Currently there are some places where tbf->control_ts != ts is evaluated to check, whether ts is a control slot. Replace these expressions by tbf->is_control_ts(ts) which does the same whitout exposing internal fields. Sponsored-by: On-Waves ehf
2016-02-08sched: Pass the current TS to the control create functionsJacob Erlbeck4-15/+15
Currently the checks in that function are based on the different internal TS values of a TBF. It is assumed that they match the TS that the current RTS refers to. This commit adds a TS parameter to create_ul_ass, create_dl_ass, and create_ul_ack to make this more explicit. Sponsored-by: On-Waves ehf
2016-02-08tbf: Do not reuse old TBF after RACH requestsJacob Erlbeck2-15/+12
Currently existing TBF can be reused after an MS has sent a RACH request. Since the MS can be or most probably is in packet idle mode in that case, the TBF are no longer usable even if they share the PDCHs and the control TS with the new one. There are occasional freezes where the MS does no longer react to messages sent on the PACCH. This change aborts all pending TBFs if a new TBF is or has been established via RACH. Sponsored-by: On-Waves ehf
2016-02-08tbf: Add abort method for downlink TBFJacob Erlbeck3-1/+30
Currently the is a release() function which takes care of statistics and shutdown of properly finished TBFs, but which cannot be used for aborted TBFs. This commit add an abort() method which handles unacked RLC blocks as lost and doesn't start a release timer. This method will be invoked by tbf_free() for downlink TBF. Sponsored-by: On-Waves ehf
2016-02-08tbf: Add counters for aborted TBF in state FLOWJacob Erlbeck3-5/+19
Increment CTR_TBF_DL_ABORTED/CTR_TBF_UL_ABORTED if a TBF gets freed that is still in state GPRS_RLCMAC_FLOW. Sponsored-by: On-Waves ehf
2016-02-08Revert "tbf: Use the control TS for Immediate Assignments"Jacob Erlbeck1-2/+2
According to spec, the lowest numbered PDCH of the TBF shall be used for the PACCH, only when concurrent TBF are active, the lowest common PDCH shall be used. An immediate assigment is in general only sent, if no TBF is active, so the latter case never applies. This reverts commit fdd8a1ba2312be3f33576ee994c0b5da6272e815.
2016-02-08tbf: Use the control TS for Immediate AssignmentsJacob Erlbeck1-2/+2
Currently the first TS is used, which can be different from the control TS on downlink TBFs. Use the control TS instead. Sponsored-by: On-Waves ehf
2016-02-08tbf: Refactor calls to write_immediate_assignmentJacob Erlbeck1-14/+31
Make use of variables, log them to LOGL_DEBUG, and reduce code duplication. This should help to narrow down the cause why snd_dl_ass are not answered by the MS sometimes. Sponsored-by: On-Waves ehf
2016-02-08bssgp: Ignore downlink BSSGP RA Cap IEJacob Erlbeck1-0/+4
That IE may contain inaccurate or completely bogus data. This commit disables the parsing. Note that this should be replaced by a config option. Sponsored-by: On-Waves ehf
2016-02-08tbf: Low prio for BSSPG values for GPRS/EGPRS MS classJacob Erlbeck1-5/+8
Currently the values in the BSSGP RA Cap IE are eventually use overwrite the 'good' values obtained from the MS earlier. Use the 'good' values when the are present, which is assumed if at least one of ms->ms_class() or ms->egprs_ms_class() is set. Sponsored-by: On-Waves ehf
2016-02-08edge: Get EGPRS MS class from downlink BSSGPJacob Erlbeck1-27/+22
In case there is no MS object present that matches a DL UNITDATA, the EGPRS class is currently assumed to be 0, since the Radio Access Capabilities IE is not fully decoded if present. This commit uses the CSN.1 decoder to parse the IE and uses the same functions like the uplink related code does to get the GPRS and EGPRS multislot classes. Remove the old parse_ra_cap_ms_class function. Sponsored-by: On-Waves ehf
2016-02-08rlc: Add decode_gsm_ra_cap to decode Radio Access CapsJacob Erlbeck2-0/+9
This uses the CSN.1 decoder to fully parse the radio access capabilities as defined by TS 24.008, Sponsored-by: On-Waves ehf
2016-02-08Revert "bssgp: Add hand-coded extended RA Cap parser"Jacob Erlbeck1-66/+0
Just keep this for later reference, since a CSN.1 decoder based implementation will be used. This reverts commit b37ab36bb14d2d2c1363fbe521cd19984d0c3d4c.
2016-02-08bssgp: Add hand-coded extended RA Cap parserJacob Erlbeck1-0/+66
Add an extended parse_ra_cap function based on the existing parse_ra_cap_ms_class which also parses up to the EGPRS related fields. Sponsored-by: On-Waves ehf
2016-02-08tbf: Show window parameters in VTYJacob Erlbeck1-3/+18
Add V(Q), V(R), V(A), V(S) to the output of the "show tbf" command. Sponsored-by: On-Waves ehf
2016-02-08edge: Make window size configurableJacob Erlbeck6-6/+56
Currently the window size is fixed to 64 even for EGPRS. Support dynamic window sizes depending on the number of PDCH. The WS can be set to b + f * N_PDCH. If the result is not valid according to TS 44.060, Table, the value will be corrected to use the next lower valid value (or 64). The following VTY commands are added (config-pcu node): window-size <0-1024> set base (b) value and leave f unchanged window-size <0-1024> <0-256> set base (b) and factor (f) Sponsored-by: On-Waves ehf
2016-02-08tbf/vty: Fix the CS output and show the EGPRS MS classJacob Erlbeck1-3/+3
Currently only the GPRS MS class and the DL CS (even for UL TBFs) are shown. Add the EGPRS MS class and use the TBF's real CS. Sponsored-by: On-Waves ehf
2016-02-08utils: Add pcu_bitcount and pcu_lsbJacob Erlbeck2-21/+24
These functions are currently defined in src/gprs_rlcmac_ts_alloc.cpp but will be needed elsewhere. Turn them into template functions to support different types and move them to pcu_utils.h. Sponsored-by: On-Waves ehf