path: root/src
AgeCommit message (Collapse)AuthorFilesLines
2015-12-15edge: Add GprsCodingScheme classJacob Erlbeck3-2/+237
Currently the coding scheme is checked and compared at different places which makes in cumbersome to extend it for EGPRS. This class encapsules the coding scheme and provides required meta information like sizes as well as helper methods. Sponsored-by: On-Waves ehf
2015-12-15edge: Extend gprs_rlcmac_dl_tbf::handle by egprs_ms_classJacob Erlbeck3-4/+9
The multislot (MS) class and the EGPRS MS class can also be passed via BSSGP in an MS Radio Access Capability element which can optionally be contained in a DL-UNITDATA PDU. While this case is fully supported for GPRS, the EGPRS MS class in BSSGP messages is ignored. This commit extends gprs_rlcmac_dl_tbf::handle to pass the EGPRS MS class, too. Note, that the EGPRS class is not yet taken from the CSN.1 RA capability and is always set to 0. Note also, that append_data still uses ms_class only. Sponsored-by: On-Waves ehf
2015-12-15edge: Enable EGPRS if configured and egprs_ms_class presentJacob Erlbeck2-2/+11
Enable the TBF to use EGPRS if the bts->egprs_enabled config variable has been set via the VTY "egprs" command and if the MS has signaled a EGPRS multislot class. Tell the MS to use EGPRS if the condition above holds. Note that this will cause the MS to use EGPRS RLC block formats for further messages which are not yet understood by the PCU. Sponsored-by: On-Waves ehf
2015-12-15edge: Support EGPRS multislot class handling in tbf_allocJacob Erlbeck5-23/+28
Add an egprs_ms_class argument to the allocation functions and set/pass it where necessary. Sponsored-by: On-Waves ehf
2015-12-15edge: Add m_egprs_enabled and related methods to TBFJacob Erlbeck2-3/+27
Add the following methods to gprs_rlcmac_tbf: - is_egprs_enabled - enable_egprs - disable_egprs Also show the value of the flag in name() by displaying "EGPRS" if it is set. Sponsored-by: On-Waves ehf
2015-11-30edge: Support EGPRS in packet uplink assignment messageJacob Erlbeck3-13/+39
Currently the Encoding::write_packet_uplink_assignment method only supports the GPRS variant of the message. This commit adds the missing EGPRS variant to the encoder. Sponsored-by: On-Waves ehf
2015-11-30edge: Add egprs config commandJacob Erlbeck2-0/+37
Add a global config flag to enable the use EDGE/EGPRS. The following VTY commands are added to node config-pcu: - egprs Enables EGPRS - no egprs Disable EGPRS Note that enabling EGPRS is experimental and will most likely break packet transmission until a minimal required set of EGPRS functionality is implemented. Sponsored-by: On-Waves ehf
2015-11-30edge: Get EGPRS multislot classJacob Erlbeck6-2/+54
The EGPRS MS class ist contained in the MS_RA_capability information. Its presence indicates, that the MS is able (and willing) to use EGPRS. This commit implements basic support for retrieving, storing, and showing it in the VTY. The information is stored in the MS object. Sponsored-by: On-Waves ehf
2015-11-30pcu: Enable dl-tbf-idle-time and idle-ack-delay by defaultJacob Erlbeck1-0/+2
Currently these are enabled in the default config file. Since CoDel is enabled by default in main() but should not be used without at least dl-tbf-idle-time, the current default config may lead to packet loss and performance problems. This commit enables both features to provide a good (GPRS) performance experience even without a configuration. Sponsored-by: On-Waves ehf
2015-11-30stat: Add global stat groupJacob Erlbeck3-0/+46
Add a global stat_item group for measurement values and a corresponding macro to get and set the values. Add a stat_item STAT_MS_PRESET to monitor the number of MS objects in the storage. Sponsored-by: On-Waves ehf
2015-11-27encoder: Whitespace fixesJacob Erlbeck1-4/+4
Sponsored-by: On-Waves ehf
2015-11-17stats: Enable stats subsystemJacob Erlbeck2-0/+4
Sponsored-by: On-Waves ehf
2015-11-13remove obsolete OpenBTS PCU interface supportHarald Welte2-200/+1
This OpenBTS socket interface was originally added to enable GPRS capabilitie with a forked version of OpenBTS, at a time when the public OpenBTS release didn't yet have any GPRS support. Meanwhile, the later OpenBTS releases included their own version of GPRS, without any external PCU/SGSN/GGSN, so this interface is no longer needed. This also means that the OsmoBTS socket interface is now the default at compilation time. There is no other interface.
2015-11-12osmobts_sock.cpp: Add missing space in log statement.Harald Welte1-1/+1
2015-11-12print/log OpenBTS / OsmoBTS variant in PCU startupHarald Welte2-0/+4
Otherwise it can be very confusing, as Max had to figure out today...
2015-11-12rename sysmo_sock.cpp to osmobts_sock.cppHarald Welte2-8/+8
This also renames the --enable-sysmbts option to --enable-osmobts This socket interface was nevery sysmoBTS specific, but it is a generic socket interface to any OsmoBTS supported layer1/hardware. So it was a mis-nomer so far.
2015-11-07stats: Include the header file for the new class identifierHolger Hans Peter Freyther1-0/+1
2015-11-07stats: Attempt to compile fix the new rate_ctrHolger Hans Peter Freyther1-0/+1
We wanted to support gcc-4.2 and this didn't allow us to use the C99 initializers inside C++ code. Attempt to initialize the class_id correctly.
2015-09-11bssgp: Use measured leak rate for flow controlJacob Erlbeck5-6/+104
The leak rate sent to the SGSN does not reflect the current CS level, lost frames, and control message overhead. So the SGSN cannot do proper queue control under non-optimal conditions. This commit computes the leak rate for the last flow control interval by computing the maximum theoretical leak rate and basically substracting control blocks, nacked blocks, and reduced block sizes due to CS downgrade. By using this approach, the value will by more stable on low load, where the value will tend to be near the value derived from the configuration. On full load the transmitted value is completely derived from the measurements. Note that the MS default values are no adapted to the adapted BVC leak rate, since a single MS which has a lower link quality would otherwise be reducing the rate of another MS with good radio conditions, which would not make much sense if they did not share any PDCH. Sponsored-by: On-Waves ehf
2015-09-07poll: Count failed proceduresJacob Erlbeck3-0/+11
When a timeout has occured several times, the procedures handled by poll_timeout are aborted. This happens when the number of repetitions exceed N3105. Currently only the timeouts themselves are counted. This commits adds counters that are incremented if a procedure has really failed. New counter: - rlc.ass.failed: Count failing UL and DL assigments via PACCH - rlc.ack.failed: Count failing DL Ack/Nack requests Sponsored-by: On-Waves ehf
2015-09-01bts: Start a DL TBF if needed after establishment of an UL TBFJacob Erlbeck2-0/+15
Currently an existing DL TBF can get lost in the process of establishing an UL TBF via RACH. This can lead to stalled connections until the network sends more LLC frames. This commit adds a check for a non-empty LLC queue after the UL TBF has been established to rcv_control_ack (GPRS_RLCMAC_UL_ASS_WAIT_ACK path) to eventually establish a new DL TBF on the UL TBF's PACCH. Sponsored-by: On-Waves ehf
2015-09-01bts: Release DL TBF instead of killing in rcv_resource_requestJacob Erlbeck1-3/+9
Currently an existing DL TBF is freed immediately, when a resource request is received. This makes sense since the MS might have dropped it when switching to the PDCH signaled via the AGCH for the SBA. But if the TBF still is assumed to exist on the MS side, there might be TFI collisions if the old TBF object is not kept to block its TFI for some time. This commit changes rcv_resource_request to call release() instead of tbf_free() on the DL TBF object (if it exists). Sponsored-by: On-Waves ehf
2015-09-01tbf: Refactor reuse_tbf into releasing and DL TBF establishmentJacob Erlbeck3-35/+47
Currently reuse_tbf (partly) resets the old DL TBF and uses its PACCH to establish a new DL TBF. The method can not be used with UL TBFs. This commit replaces the reuse_tbf method into a gprs_rlcmac_dl_tbf:release method which triggers the TBF's timer based deletion (so that the TFI is still reserved for some time) and a gprs_rlcmac_tbf::establish_dl_tbf_on_pacch which can establish DL TBFs on existing PACCHs of either DL or UL TBFs. Sponsored-by: On-Waves ehf
2015-09-01tbf: Keep the old MS object alive in extract_tlliJacob Erlbeck1-1/+3
Currently when a second MS object has been created for an MS, because the TLLI was not known yet, the will be detected in gprs_rlcmac_tbf::extract_tlli and the two objects will be merged by update_ms. But when the dl_tbf is moved from the old to the new (second) MS object, the old MS object can get idle and be removed before the object are merged. This can cause LLC frame loss when the MS object is deleted immediately after getting idle (no timeout configured). This commit adds a guard to keep the MS object until extract_tlli has been executed. Sponsored-by: On-Waves ehf
2015-09-01Revert "tbf: Do not kill DL TBF on Packet Resource Request"Jacob Erlbeck2-8/+9
This reverts commit e91bd3babd5c04a154f296607b401a5050dcba31. That commit seems to cause hanging DL TBFs when there was a RACH based UL TBF establishment while it that TBF is active. This could be caused by the use of a different PDCH for the SBA. Conflicts: tests/tbf/TbfTest.cpp tests/tbf/TbfTest.err
2015-08-28l1: Use the FN of all data_ind/ra_ind DSP messagesJacob Erlbeck5-9/+25
Currently all of these messages are discarded if they are assumend to be caused by noise. But even in these cases, the FN and TN values which are added by the DSP are valid. So these can be used to update the current_frame value. The osmo-bts sets the fBFILevel of a physical channel to -200dB if it is used for PDTCH or PACCH which is the case for all PDCH. This way a data_ind or ra_ind message is already send at least once per block period (4 frames) per PDCH. These messages are passed to either handle_ph_data_ind or handle_ph_ra_ind even if they contain garbage data. The ra_ind messages are sometimes sent a few frames earlier than data_ind messages using the same frame. This commit adds calls to update the current_frame value based on all of these messages before they are discarded. The FN taken from ra_ind are passed with an increased max_delay (5) to compensate for early ra_ind messages. Sponsored-by: On-Waves ehf
2015-08-28poll: Count unexpected block FN valuesJacob Erlbeck2-1/+7
Currently a log entry is written if FN_data_ind - FN_time_ind <= -13. This commit adds a counter 'rlc.late-block' that is incremented in these cases. Sponsored-by: On-Waves ehf
2015-08-28poll: Use the data_ind FN as time source for current frameJacob Erlbeck2-0/+37
The FN of the data_ind taken from the DSP are monotonic, so latency does not affect the detection of poll timeouts if these FN are used. If the FN is larger than a poll_fn value, it can safely be assumed that the poll response will not arrive later on. Currently a max_delay of 60 frames is used, which has the drawback that additional ~250ms will pass until a lost ACK is detected. Using the data_ind's FN alone breaks the poll timeout detection if there are no other MS sending data blocks. This commit adds BTS::set_current_block_frame_number that is called with the FN taken from data_ind messages. The max_delay is set to 0 which removes the additional delay, when this FN is used to detect poll timeouts. So the average additional delay decreases with the number of data_ind per time. The current_frame is updated unless it seems to have been updated already (assumed if 0 < cur_fn - block_fn < 500). Thus the time_ind has still priority to update the current_frame value. Sponsored-by: On-Waves ehf
2015-08-28poll: Set the max_delay to 60 framesJacob Erlbeck1-2/+5
Currently the max_delay parameter is set to 13, since that is slightly above maximum number of frames that a time_ind can preceed a block's data_ind of the same frame. This assumes that these messages are not reordered after thay have been obtained from the DSP. In the current implementation, the GPRS data_ind can directly be taken from the DSP by the PCU while the time_ind messages are provided via the BTS. So the messages are queued differently in that case, resulting in a additional delay of the data_ind with respect to the time_ind. The propability for this raises with a increased CPU load of the PCU. If this happens, a poll timeout is detected by mistake and the poll is either retried or cleared. This commit increases the tolerance to 60 frames, since values for FN_data_ind - FN_time_ind of up to 50 frames have been observed under heavy PCU load. Sponsored-by: On-Waves ehf
2015-08-28poll: Add a max_delay parameter to PollController::expireTimedoutJacob Erlbeck3-13/+15
Currently the maximum additional delay is hard coded to 13. This value depends on the source of the frame number value. This commit adds the max_delay parameter to make it caller dependant. Sponsored-by: On-Waves ehf
2015-08-28tbf: Add logging for pollingJacob Erlbeck2-2/+12
This commit adds the relevant frame number to the "poll timeout" logging message. In addition, logging is added to the places where poll_fn gets set. The goal is to track down the source for frequent "poll timeout" messages. Sponsored-by: On-Waves ehf
2015-08-28tbf: Use explicit initialisations in constructor (Coverity)Jacob Erlbeck2-25/+92
Currently when allocating tbf_alloc_ul_tbf or tbf_alloc_dl_tbf objects, the allocated memory area is pre-initialised by talloc_zero before the C++ constructors are called. This is not recognised by Coverity, since there is no talloc model file yet. Thus Coverity complains about missing initialisers. On the other hand, it is still planned to convert the TBF classes into real C++ ones. So instead of silencing Coverity directly, this is an opportunity to do it the C++ way. This commit adds initialisers and initialisation code for all members that relied on talloc_zero. The corresponding calls to talloc_zero are replaced by calls to talloc to give ASAN/valgrind a chance to detect future initialisation errors. Some initialisation code is also moved from setup_tbf to the constructors, notably the initialisation of the bts pointer. Fixes: Coverity CID 1320604, 1320605, 1320606 Sponsored-by: On-Waves ehf
2015-08-27openbts: Remove unused declaration of fl1h in udp_read_cbJacob Erlbeck1-1/+0
Fixes: openbts_sock.cpp:94:22: warning: unused variable 'fl1h' Sponsored-by: On-Waves ehf
2015-08-27ms/vty: Show LLC queue octets and packets in both viewsJacob Erlbeck1-1/+5
Currently the per IMSI/TLLI view only shows the number of packets and the 'all' view does not show any LLC related information at all. A constant LLC queue length is often an indication for a stalled TCP connection where the RLC layer has stopped to send downlink data messages. This commit adds the number of packets to the 'all' view and the number of octets to the IMSI/TLLI views. Sponsored-by: On-Waves ehf
2015-08-24ms/vty: Show old TBFsJacob Erlbeck1-0/+9
This commit extends the 'show ms imsi|tlli' command to show the old TBFs, too. Sponsored-by: On-Waves ehf
2015-08-24ms: Store references to replaced TBFs in the MS objectJacob Erlbeck4-8/+43
Currently when calling GprsMs::attach_tbf and a TBF of the same direction already exists, the old TBF gets detached from the MS object. Therefore that TBF object loses access to that MS object including for instance TLLI and IMSI. This leads to failing DL TBF reuses, since the downlink assigment cannot be sent on the PACCH later on because that must be sent on the old DL TBF which ms() is NULL and the new DL TBF cannot be retrieved. This commit fixes this bug by changing the GprsMs implementation to keep a list of replaced (old) TBFs. TBFs are only removed when they are being detached explicitely (see tbf_free and set_ms). Addresses: tbf.cpp:741 We have a schedule for downlink assignment at uplink TBF(TFI=1 TLLI=0xf35a680e DIR=UL STATE=RELEASING), but there is no downlink TBF Sponsored-by: On-Waves ehf
2015-08-24bssgp: Only call bssgp_tx_llc_discarded if the bctx existsJacob Erlbeck1-1/+2
While this does not happen in real use, and unset btcx can lead to segfaults in test cases. The other code outside of gprs_bssgp_pcu.cpp does not depend on bctx being non-NULL: Sponsored-by: On-Waves ehf
2015-08-24llist: Add missing const qualifier in llist cast methodJacob Erlbeck1-1/+1
The missing const qualifier prevents the llist_empty() C++ wrapper function from being compiled successfully when it is used. Sponsored-by: On-Waves ehf
2015-08-24tbf: Use C++/talloc magic to support TBF constructors/destructorsJacob Erlbeck2-2/+36
The TBF object are currently created by using talloc_zero/talloc_free directly from plain functions. Therefore C++ constructors and destructors are not called. So the only initialisation that is done is setting every member to 0. Non POD members do not have their constructors called either, which makes it impossible to use the current LListHead class for real members when the LListHead::m_back member has to be set. This commit changes the TBF allocation functions to call the corresponding C++ constructor after the call to talloc_zero and to register the C++ destructor with the talloc context, so that is is called before talloc_free actually frees the memory. With this change, non-POD members and custom constructors/desctructors can be used with gprs_rlcmac_tbf, gprs_rlcmac_dl_tbf, and gprs_rlcmac_ul_tbf. Note that this change is only a single step of the plan to turn the TBF classes into real C++ classes. Sponsored-by: On-Waves ehf
2015-08-21tbf: Move pending LLC frames when merging MS objectsJacob Erlbeck1-0/+2
Currently the pending LLC packets are lost in some cases when MS objects are merged, for instance after a RACH when there were 2 MS object for the same MS (they get merged, when the TLLI is known for both objects). This patch modifies GprsMs::merge_old_ms to move all pending LLC packets (if there are any) to the current MS object. Sponsored-by: On-Waves ehf
2015-08-21llc: Add move_and_merge method to llc_queueJacob Erlbeck2-0/+54
This methods takes all LLC frames from the old LLC queue and moves them into the current. If both queues are ordered chronologically (recv_time), the resulting queue is also ordered. Sponsored-by: On-Waves ehf
2015-08-21tbf: Do not kill DL TBF on Packet Resource RequestJacob Erlbeck2-9/+8
Currently all active TBF of an MS are killed if a Packet Resource Request is received from the MS. In general this happens after a RACH request. This does not happen after a resource request that has been included into a Downlink Ack/Nack. Sometimes an UL TBF is requested by an MS via RACH while a DL TBF is running for instance to send a TCP Ack. This can happen, if a former request via PACCH did not work. This commit removes the killing of the DL TBF from gprs_rlcmac_pdch::rcv_resource_request(). Sponsored-by: On-Waves ehf
2015-08-21tbf/test: Fix existing testsJacob Erlbeck1-0/+6
This commit fixes several issues: - Set MS class in request - Set IMSI in establish_ul_tbf_two_phase - Fake assigment acknowledgement in establish_ul_tbf_two_phase - Fix TFI bit offset to 1 (was 2) Sponsored-by: On-Waves ehf
2015-08-21tbf: Fix typos in log messages concerning UL/DLJacob Erlbeck2-2/+2
The TBF in create_dl_ass can be of any direction. The text in rcv_resource_request uses DL instead of UL. Sponsored-by: On-Waves ehf
2015-08-18ms: Move MS information merging to GprsMSJacob Erlbeck4-10/+18
Currently the merging of the meta information (MS class, IMSI) takes place in gprs_rlcmac_tbf::merge_and_clear_ms(). This makes it difficult to merge the internal state and does not directly relate to TBFs anyway. This commit moves this into a new method GprsMs::merge_old_ms. Sponsored-by: On-Waves ehf
2015-08-17ns: Reconnect NSVC after timeoutJacob Erlbeck2-0/+31
Currently the signal S_NS_ALIVE_EXP emitted by the NS layer if the alive check has timed out too often is ignored. This prevents the PCU from reconnecting to the SGSN if it has not been accessible for some time. This commit modifies nsvc_signal_cb to reset the NSCV if S_NS_ALIVE_EXP is sent, so that the PCU continues to send NS RESET message if that happened. Sponsored-by: On-Waves ehf
2015-08-17ns: Add logging supportJacob Erlbeck3-0/+3
Currently there is not support for Network Service (NS) logging. This commit adds the missing definitions and sets the default level to INFO. Further configuration can now be done with the 'logging level ns' VTY command. Sponsored-by: On-Waves ehf
2015-08-17vty: Change API to have node installation be done by intJacob Erlbeck2-2/+2
This commit fixes the go_parent_cb API according to libosmocore's commit of the same name. Fixes: pcu_vty.c:799:2: warning: initialization from incompatible pointer type [enabled by default] .go_parent_cb = pcu_vty_go_parent, Sponsored-by: On-Waves ehf
2015-08-17ms: Do not retrieve MS with IMSI 000 from the storageJacob Erlbeck1-1/+3
The IMSI '000' is used as default value for an incoming BSSGP message's IMSI IE. This can lead to the retrieval of the wrong MS object from the storage. This commit changes the get_ms method to skip the IMSI search if such an IMSI is passed as selector. Note that changing the default value in the BSSGP code does not help here. Sponsored-by: On-Waves ehf
2015-08-17tbf: Use update_ms instead of confirm_tlli in handle()Jacob Erlbeck1-5/+1
The confirm_tlli method does not handle TLLI clashes in the MS storage. This commit changes gprs_rlcmac_dl_tbf::handle() to use update_ms instead. Sponsored-by: On-Waves ehf