Age | Commit message (Collapse) | Author | Files | Lines |
|
If just a few bytes are left to send to the MS, it makes sense to
reduce the coding scheme level to increase the throughput. This
has been shown by Chen and Goodman in their paper "Theoretical
Analysis of GPRS Throughput and Delay". See their throughput over C/I
measurement graphs (figures 4 and 5 in the paper) for details.
This commit implements a simplified CS downgrade feature for the
downlink. The coding scheme will be downgraded if there are only a
few octets are left to be send over the TBF (see the
downgrade-threshold command below) and the NACK rate is not low (the
CS will not get degraded on a high quality RF link). As an exception,
CS-3 will be degraded to CS-1, since CS-2 does not improve the
throughput in general when a few small packets are sent and the
signal fades slowly (see Chen/Goodman).
The following VTY command is added to the config-pcu node:
- cs downgrade-threshold <1-10000>
- cs no downgrade-threshold
to set the threshold of the number of remaining bytes to be RLC/MAC
encoded. The CS will only be reduced, if the number is below the
threshold. The 'no' command disables this feature completely. The
default value is 200 octets.
Sponsored-by: On-Waves ehf
|
|
Currently the UL CS values are set to the corresponding DL CS value,
eventually limited by a maximum value. This approach does not reflect
the general situation of the RF link between ME and BTS, which is
rather asymmetric e.g. due to a lower degree of TX efficiency of the
built-in antenna. This means, that UL and DL CS control should be
decoupled for better results.
This commit adds automatic UL CS selection based on the link quality
measurement parameter. Each coding scheme is mapped to a link quality
range. If the link quality value leaves that range, the current UL CS
value is increased/decreased accordingly. This value will be copied
when the next PACKET_UPLINK_ACK_NACK or PACKET_UPLINK_ASSIGMENT is
sent to the MS.
The following VTY command will be added to the config-pcu node:
- cs link-quality-ranges cs1 <0-35> cs2 <0-35> <0-35>
cs3 <0-35> <0-35> cs4 <0-35>
which sets the ranges for the four coding schemes. For instance the
example below reflects the current default values:
cs link-quality-ranges cs1 6 cs2 5 8 cs3 7 13 cs4 12
set the following ranges, where the overlapping is used to configure
a hysteresis:
CS1: -inf .. 6
CS2: 5 .. 8
CS3: 7 .. 13
CS4: 12 .. inf
Sponsored-by: On-Waves ehf
|
|
Currently the CS values can be increased to CS4 even when the "cs"
configuration command has been used with a lower value. The "cs"
command just sets the initial coding scheme, so other means are
needed to limit the selection. One approach is to use the CS flags
passed in SI, but these are currently ignored.
To make it possible to limit the CS selection by configuring the PCU,
this commit adds the following VTY commands to config-pcu:
- cs max <1-4> Limit DL and UL CS to the given value
- cs max <1-4> <1-4> Limit DL and UL CS separately (DL first)
- no cs max Don't limit
Ticket: #1674
Sponsored-by: On-Waves ehf
|
|
To cope with transmission failures due to bad radio conditions, a
different coding scheme with more redundance can be used.
This commit adds an implemenation that is based on the Ack/Nack
ratio per PACKET DOWNLINK ACK/NACK message received from the MS.
Basically the CS level is decreased, if the block error rate goes
above cs_adj_upper_limit (default 33%), and it is increased, if the
rate drops below cs_adj_lower_limit (default 10%). Only blocks that
have been encoded with the current CS are taken into account.
Note that this approach doesn't measure the MS->BTS conditions and
that the measurement values reported by the MS are not taken into
account.
Ticket: #1739
Sponsored-by: On-Waves ehf
|
|
Since the timing advance storage has been removed, the TA values are
lost, when the last TBF of a single MS is freed. The TA storage has
at least saved the last 30 TA values. So now in more cases a wrong TA
value can be transmitted to an MS. Note that this also could have
happened before the removal of the storage, especially if more than
30 MS were in use.
This commit changes the default value of ms_idle_sec to 60s which is
higher than default value for T3314 (44s, see TS 24.008, 11.2.2),
after which the SGSN will have to start paging anyway. In that case,
a RACH request will be triggered, that will trigger an update of the
TA value in the PCU.
Sponsored-by: On-Waves ehf
|
|
Currently the TA storage stores up to 30 TLLI->TA mappings, if more
entries are created the oldest one is dropped. In theory this can
lead to missing TA information if many MS are present.
This commit removes the TimingAdvance class completely, since the TA
value is now stored in the GprsMs objects.
Note that the GprsMs objects are currently not kept after the TBFs
have detached from them, so the TA values are now kept for a shorter
time than before.
Ticket: #1674
Sponsored-by: On-Waves ehf
|
|
Currently the BSSGP functions in libosmocore do not log correctly to
DBSSGP since the DBSSGP variable in common_vty.c is left
uninitialized.
This commit adds the call to bssgp_set_log_ss() to inform libosmocore
which sub system id it shall use for BSSGP.
Sponsored-by: On-Waves ehf
|
|
The current code tries to recover from dropped connections and resets the
pcu state so it can keep running. However, this never worked correctly
which is why the -e option is used. This option exits the pcu as soon as
the internal state needs to be reset.
This patch removes this option and makes this behaviour default.
Ticket: SYS#390
Sponsored-by: On-Waves ehf
|
|
This approach is somehow flawed. We need/want to debug problems on
systems with real traffic and re-compiling it with debug_diagram
is not an option. All internal logging needs to be expressive enough
so we can understand what is going on (e.g. create a script to
post-process the output).
|
|
Fixes: Coverity CID 1040949
|
|
This allows us to easily flush the state in case a PCU/BTS
connection is lost.
|
|
Compared to the previous code there will be a branch to get the
global pointer so the code will be slightly slower than the previous
version but it allows us to start creating objects but still use
the code from C. It is best approach I have found so far.
One downside of C++ is that by default talloc will not be used
(unless we override the new operator to use talloc. Right now
we need to memset the C data structure by hand. The benefit of
enforcing a better structure should is more important though.
|
|
Begin to make the BTS a real C++ object with real responsibilities.
The biggest issue will be the pcu_vty.c that might not like C++
at all.
|
|
The PCU does not properly re-set the state when the connection to the
BTS is lost (and the SGSN potentially is re-started during that). This
results in the BSSGP BVCI > 1 remaining blocked and no data will be
accepted by the SGSN.
Add the '-e' option and exit the PCU when the BSSGP/NS are getting
destroyed.
|
|
The timing advance of any TBF is stored when it ends. Whenever a new TBF
with the same TLLI is created (downlink TBF), the stored TA is recalled.
This algorithm assumes that the mobile does not move too fast during
transfer. Also the mobile must start a connection in order to get correct
initial timing advance.
This algorithm does not implement the timing advance procedure as defined
in TS 04.60. To implement the standard timing advance procedure, the BTS
must decode RACH on certain bursts, the mobile is expected to send them.
This requires much more complexity to a transceiver like USRP/UmTRX or
Calypso BTS.
The algorithm was tested at TA >= 8 and works quite well.
|
|
I ported the Holger's scheduling patch from sysmobts to osmo-pcu.
This is usefull, if PCU uses direct access to the DSP of sysmobts.
The latency to respond to a PH-READY_TO_SEND.ind may not be higher
than 18ms. Currently we are using nice to increase our priority but
for a heavily loaded cell this is not enough. Add an option to enable
realtime scheduling and use it in the screenrc.
Linux offers two realtime scheduling classes these are SCHED_FIFO
and SCHED_RR. For SCHED_FIFO the process is running as long as possible
(potentially taking all the CPU and never yielding it), for SCHED_RR
the process can still be pre-empted at the end of the timeslice.
Using SCHED_RR appears to be the more safe option as a run-a-way
sysmobts process will not be able to take all the CPU time.
|
|
This way the pcu can be easily stopped with a sysvinit script.
|
|
Since we don't know the RX and TX parameters of the BTS that might be used
with PCU, the MS should not adapt the TX power from the RX level. So the
MS should always transmits with same power.
Finding an 'alpha' and 'gamma' value that will result in a constant
RX level at the BTS is a task of deployment.
|
|
|
|
This allows to track memory leaks of all memory that is allocated by
talloc. Especially bitvector allocations is tracked now.
|
|
It is quite essential. It shows how TBFs are related and helps to estimate
states and timers (timeouts) of the MS.
In order to use it, it must be defined by a switch at gprs_rlcmac.h.
|
|
|
|
The initial power control value Alpha must be set in SI13.
|
|
The flow control interval can be set via VTY.
|
|
|
|
The current available algorithm only supports selecting a single slot
for downlink/uplink. (In the future, a multislot algorithm will follow.)
|
|
The signal handler will end the main loop, so clean exit is performed.
The allocated memory is dumped in order to detect memory leaks.
All talloc functions use tall_pcu_ctx context instead of NULL, to track
memory leaks.
|
|
Note: This requires new libosomocore that allows to compile VTY headers
with C++.
|
|
Merge is based on jolly_new branch with two modifications.
1. Modified PCU L1 interface.
pcu_l1_if.cpp - common functions for tx and rx messages on L1 interface.
sysmo_sock.cpp - SYSMO-PCU socket functions.
openbts_sock.cpp - OpenBTS-PCU socket functions.
pcuif_proto.h - L1 interface's primitives.
2. Modified encoding of RLC/MAC Control messages, now we use structures and encode_gsm_rlcmac_downlink() function for encode control blocks (without hand-coding).
|
|
|
|
The hack for resetting BSSGP instance is removed and now performed
whenever the NS state changes to UNBLOCKED.
The BSSGP instance is now created only once, as it should be.
Received STATUS messages are ignored as they should be.
The creation and destruction of BSSGP/NS instances is now handled by
layer 1 interface alone.
|
|
The option added is required to change PLMN that is announced to SGSN.
This allows BTS to have a different PLMN.
(Usefull for roaming in conjunction with simlock.)
|
|
For OpenBTS interface and BSSGP, fixed values are still used.
|
|
These informations provide RAI, timers, counters and other attributes to
the BSSGP and RLC/MAC processes.
The attributes are stored in gprs_rlcmac_bts global structure.
|
|
...and link against libosmogb (part of libosmocore.git)
|
|
|
|
|
|
Merged jolly branch with master, fixed conflicts.
|
|
The OpenBTS socket functions are moved from main to pcu_l1_if.cpp.
New sysmo_l1_if.cpp is introduced. It used special unix socket interface
to connect to sysmo-BTS. This is required to access CCCH/RACH and info
about cell layout. Traffic is also forwarded via this interface, but
it direct access of L1 baseband DSP will be added soon.
In order to handle ready-to-send requests above l1_if, the transmit
queue (for downlink blocks) is moved to gprs_rlcmac.cpp.
The TBF instance additionally holds TRX and TS info, but this is only
a hack currently. TBF instance requires more details about allocated
ressources in the future.
|
|
...and link against libosmogb (part of libosmocore.git)
|
|
The code corresponds to commit a9aa4777cc1144897a77dfb6c5c3d7325705251e
in openbts-p2.8.git (Tue Jun 12 18:14:49 2012 +0400)
|