Bug #3395
closedUplink CS/MCS control is broken osmo-pcu is used with osmo-bts-trx/osmo-trx
Added by ipse over 5 years ago. Updated about 4 years ago.
100%
Description
Not sure which project to assign this to.
GprsMs::update_cs_ul()
function (osmo-pcu/src/gprs_ms.cpp) is used to control the UL CS/MCS mode and in its current implementation is relies on the Quality "Q" value reported by L1. Osmo-trx does not really calculate the SNR of the link and thus osmo-bts-trx always report Q as 0. This misleads the current algorithm which always drops the CS/MCS to the lowest possible mode (CS-1/MCS-1).
Possible solutions I see:
1) Use another metric, like BER which are reported by osmo-bts-trx. A similar method is already used by the DL CS/MCS control.
2) Implement SNR calculation in osmo-trx. A better way, but much more involved.
Files
compute_edge_ci.diff | compute_edge_ci.diff | 3.36 KB | fixeria, 10/04/2019 08:33 PM |
Related issues
Updated by laforge over 5 years ago
- Related to Bug #1616: osmo-bts-trx / osmo-bts-octphy doesn't provide C/I information to PCU added
Updated by laforge over 5 years ago
- Related to Feature #1815: tool for building binary ipk from .list/.control added
Updated by laforge over 5 years ago
- Related to deleted (Feature #1815: tool for building binary ipk from .list/.control)
Updated by laforge over 5 years ago
- Related to Feature #1855: provide actual BER or C/I values from osmo-bts-trx into the PCU added
Updated by laforge over 5 years ago
on a more general notice, see https://osmocom.org/versions/122 for the various known issues of osmo-bts-trx compared with other osmo-bts-* variants.
Updated by msuraev about 5 years ago
- Related to Feature #2977: OsmoBTS measurment processing at L1SAP too complex / pass measurements along with data added
Updated by fixeria about 5 years ago
- Status changed from New to Feedback
2) Implement SNR calculation in osmo-trx. A better way, but much more involved.
A few days ago I did some research on this. As it turns out, OsmoTRX already does (AVG) noise measurements during IDLE frames, please see: https://git.osmocom.org/osmo-trx/tree/Transceiver52M/Transceiver.cpp#n627. After looking at debug output coming from Transceiver::logRxBurst(), I think that such noise measurements are being done correctly: in case of false-positive detections noise == rssi (that's expected), while the UL bursts coming from a MS have rssi > noise.
As far as I understand, we should attach noise level to every burst on TRXD (TRX Data interface) coming towards OsmoBTS. The problem is that the current version of TRX protocol is not flexible. A TRXD message (i.e. UL or DL burst) has a fixed header of fixed size, and there is no space left for noise level :/
As a possible solution, we can attach noise level at the end of TRXD messages - after the burst bits. OsmoTRX still does send two dummy (padding?) bytes at the end of UL TRXD messages (OsmoBTS just ignores them), so we can use one of them. But IMHO, this is more a hack than a proper solution. Ideally, we need a new version of TRX protocol, where we could use TLVs.
Updated by msuraev about 5 years ago
- Related to Bug #3834: MS set_mode()/set_current_cs_*() inconsistent results added
Updated by pespin over 4 years ago
fixeria is this related to the CI value (int16_t ci) added to UL burst indications in TRXDv1? How does that related to the value used in GprsMs::update_cs_ul()? What does exactly need to be done here?
Updated by pespin over 4 years ago
This is the commit I was talking about: https://git.osmocom.org/osmo-bts/commit/?id=54e104496a30c7a9a4a562e40cf59a025d111f1c
Updated by fixeria over 4 years ago
- Status changed from Stalled to Feedback
[...] Osmo-trx does not really calculate the SNR of the link and thus osmo-bts-trx always report Q as 0.
[...] is this related to the CI value (int16_t ci) added to UL burst indications in TRXDv1?
Yes, but it needs to be clarified that osmo-bts-trx is sending C/I (Carrier-to-Interference ratio) as Q to the PCU, not SNR (Signal-to-Noise ratio). It's used to pick a proper coding scheme for Uplink, and seems to work already (at least for GPRS). I am sure ipse and kluchnikov can comment more on this ticket.
What I noticed during testing is that somehow these C/I measurements are not getting attached to the control blocks, so OsmoPCU may still warn "Unable to update UL (M)CS because we don't have link quality measurements". Please see: https://git.osmocom.org/osmo-pcu/tree/src/pdch.cpp#n815
As can be seen, when calling rcv_data_block(data, data_len, fn, meas, cs) we pass the received measurements, but when calling rcv_control_block(data, data_len, block, fn) we don't. In case of EDGE, the code path is more complicated so I am not sure if it's also affected.
Also, I am working on TTCN-3 test cases for the link adaptation.
Updated by pespin over 4 years ago
I am actually seeing these messages while using Edge, that's why I was asking:
20190925123116705 DRLCMACMEAS <0007> osmo-pcu/src/gprs_ms.cpp:644 Unable to update UL (M)CS CS-2 because we don't have link quality measurements.
So actually I can see set_link_qual() being called, for instance in this code path:
(gdb) bt #0 pcu_rx_data_ind (data_ind=0x7fffffffdde4) at osmo-pcu/src/pcu_l1_if.cpp:291 #1 0x0000555555580112 in pcu_rx (msg_type=2 '\002', pcu_prim=0x7fffffffdde0) at osmo-pcu/src/pcu_l1_if.cpp:665 #2 0x00005555555a49b7 in pcu_sock_read (bfd=0x55555565e660) at osmo-pcu/src/osmobts_sock.cpp:152 #3 0x00005555555a4bbc in pcu_sock_cb (bfd=0x55555565e660, flags=1) at osmo-pcu/src/osmobts_sock.cpp:208 #4 0x00007ffff7cf87b6 in osmo_fd_disp_fds (_rset=0x7fffffffdfc0, _wset=0x7fffffffe040, _eset=0x7fffffffe0c0) at libosmocore/src/select.c:225 #5 0x00007ffff7cf898d in _osmo_select_main (polling=0) at libosmocore/src/select.c:263 #6 0x00007ffff7cf89b8 in osmo_select_main (polling=0) at libosmocore/src/select.c:272 #7 0x00005555555724d8 in main (argc=3, argv=0x7fffffffe2a8) at osmo-pcu/src/pcu_main.cpp:354
But in the code path triggering the error message pasted above, have_link_qual is obviously not set:
Breakpoint 5, GprsMs::update_cs_ul (this=0x5555557a4300, meas=0x7fffffffdb60) at osmo-pcu/src/gprs_ms.cpp:644 644 LOGP(DRLCMACMEAS, LOGL_ERROR, (gdb) bt #0 GprsMs::update_cs_ul (this=0x5555557a4300, meas=0x7fffffffdb60) at osmo-pcu/src/gprs_ms.cpp:644 #1 0x000055555557bda3 in GprsMs::update_l1_meas (this=0x5555557a4300, meas=0x7fffffffdb60) at osmo-pcu/src/gprs_ms.cpp:695 #2 0x0000555555598aea in gprs_rlcmac_pdch::rcv_resource_request ( this=0x5555555f8ce0 <s_bts+4096>, request=0x5555556f9790, fn=2093203) at osmo-pcu/src/pdch.cpp:625 #3 0x00005555555991d3 in gprs_rlcmac_pdch::rcv_control_block ( this=0x5555555f8ce0 <s_bts+4096>, data=0x7fffffffdde6 "@\027\375\344[\245\347\b\262\263qY\234", data_len=23 '\027', rlc_block=0x5555556f66e0, fn=2093203) at osmo-pcu/src/pdch.cpp:709 #4 0x0000555555599a7c in gprs_rlcmac_pdch::rcv_block_gprs ( this=0x5555555f8ce0 <s_bts+4096>, data=0x7fffffffdde6 "@\027\375\344[\245\347\b\262\263qY\234", data_len=23 '\027', fn=2093203, meas=0x7fffffffdd40, cs=...) at osmo-pcu/src/pdch.cpp:832 #5 0x0000555555599412 in gprs_rlcmac_pdch::rcv_block ( this=0x5555555f8ce0 <s_bts+4096>, data=0x7fffffffdde6 "@\027\375\344[\245\347\b\262\263qY\234", len=23 '\027', fn=2093203, meas=0x7fffffffdd40) at osmo-pcu/src/pdch.cpp:745 --Type <RET> for more, q to quit, c to continue without paging-- #6 0x000055555557dd3b in pcu_rx_data_ind_pdtch (trx_no=0 '\000', ts_no=7 '\a', data=0x7fffffffdde6 "@\027\375\344[\245\347\b\262\263qY\234", len=23 '\027', fn=2093203, meas=0x7fffffffdd40) at osmo-pcu/src/pcu_l1_if.cpp:253 #7 0x000055555557e0a2 in pcu_rx_data_ind (data_ind=0x7fffffffdde4) at osmo-pcu/src/pcu_l1_if.cpp:300 #8 0x0000555555580112 in pcu_rx (msg_type=2 '\002', pcu_prim=0x7fffffffdde0) at osmo-pcu/src/pcu_l1_if.cpp:665 #9 0x00005555555a49b7 in pcu_sock_read (bfd=0x55555565e660) at osmo-pcu/src/osmobts_sock.cpp:152 #10 0x00005555555a4bbc in pcu_sock_cb (bfd=0x55555565e660, flags=1) at osmo-pcu/src/osmobts_sock.cpp:208
So afaiu, filling of struct pcu_l1_meas meas
object occurs in rcv_resource_request(Packet_Resource_Request_t *request)
when it calls get_meas(&meas, request);
(pdch.cpp:624). But looking at the get_meas(struct pcu_l1_meas *meas, const Packet_Resource_Request_t *qr)
implementation, set_link_qual() is not called there, so of course have_link_qual is always 0 in that code path. The related Packet_Resource_Request_t received in that code path (and afaiu the struct from wher ewe probably need to extract the link_qual and fill it in the meas object):
Breakpoint 6, gprs_rlcmac_pdch::rcv_resource_request ( this=0x5555555f8ce0 <s_bts+4096>, request=0x5555556f9790, fn=2234955) at /home/pespin/dev/sysmocom/git/osmo-pcu/src/pdch.cpp:624 624 get_meas(&meas, request); (gdb) print request $9 = (Packet_Resource_Request_t *) 0x5555556f9790 (gdb) print *request $10 = {MESSAGE_TYPE = 5 '\005', PayloadType = 1 '\001', spare = 0 '\000', R = 0 '\000', Exist_ACCESS_TYPE = 1 '\001', ACCESS_TYPE = 3 '\003', ID = { UnionType = 1 '\001', u = {Global_TFI = {UnionType = 151 '\227', u = { UPLINK_TFI = 110 'n', DOWNLINK_TFI = 110 'n'}}, TLLI = 3079761559}}, Exist_MS_Radio_Access_capability = 1 '\001', MS_Radio_Access_capability = { Count_MS_RA_capability_value = 1 '\001', MS_RA_capability_value = {{ IndexOfAccTech = 2 '\002', u = {Content = { RF_Power_Capability = 1 '\001', Exist_A5_bits = 0 '\000', A5_bits = 0 '\000', ES_IND = 1 '\001', PS = 1 '\001', VGCS = 0 '\000', VBS = 0 '\000', Exist_Multislot_capability = 1 '\001', Multislot_capability = { Exist_HSCSD_multislot_class = 0 '\000', HSCSD_multislot_class = 0 '\000', Exist_GPRS_multislot_class = 1 '\001', GPRS_multislot_class = 12 '\f', GPRS_Extended_Dynamic_Allocation_Capability = 1 '\001', Exist_SM = 1 '\001', SMS_VALUE = 7 '\a', SM_VALUE = 1 '\001', Exist_ECSD_multislot_class = 0 '\000', ECSD_multislot_class = 0 '\000', Exist_EGPRS_multislot_class = 1 '\001', EGPRS_multislot_class = 12 '\f', EGPRS_Extended_Dynamic_Allocation_Capability = 1 '\001', Exist_DTM_GPRS_multislot_class = 1 '\001', --Type <RET> for more, q to quit, c to continue without paging-- DTM_GPRS_multislot_class = 3 '\003', Single_Slot_DTM = 0 '\000', DTM_EGPRS_Params = {Exist_DTM_EGPRS_multislot_class = 1 '\001', DTM_EGPRS_multislot_class = 3 '\003'}}, Exist_Eight_PSK_Power_Capability = 1 '\001', Eight_PSK_Power_Capability = 2 '\002', COMPACT_Interference_Measurement_Capability = 0 '\000', Revision_Level_Indicator = 1 '\001', UMTS_FDD_Radio_Access_Technology_Capability = 0 '\000', UMTS_384_TDD_Radio_Access_Technology_Capability = 0 '\000', CDMA2000_Radio_Access_Technology_Capability = 0 '\000', UMTS_128_TDD_Radio_Access_Technology_Capability = 0 '\000', GERAN_Feature_Package_1 = 1 '\001', Exist_Extended_DTM_multislot_class = 0 '\000', Extended_DTM_GPRS_multislot_class = 0 '\000', Extended_DTM_EGPRS_multislot_class = 0 '\000', Modulation_based_multislot_class_support = 0 '\000', Exist_HighMultislotCapability = 0 '\000', HighMultislotCapability = 0 '\000', Exist_GERAN_lu_ModeCapability = 0 '\000', GERAN_lu_ModeCapability = 0 '\000', GMSK_MultislotPowerProfile = 3 '\003', EightPSK_MultislotProfile = 3 '\003', MultipleTBF_Capability = 0 '\000', --Type <RET> for more, q to quit, c to continue without paging-- DownlinkAdvancedReceiverPerformance = 1 '\001', ExtendedRLC_MAC_ControlMessageSegmentionsCapability = 1 '\001', DTM_EnhancementsCapability = 1 '\001', Exist_DTM_GPRS_HighMultislotClass = 0 '\000', DTM_GPRS_HighMultislotClass = 0 '\000', DTM_EGPRS_HighMultislotClass = { Exist_DTM_EGPRS_HighMultislotClass = 0 '\000', DTM_EGPRS_HighMultislotClass = 0 '\000'}, PS_HandoverCapability = 0 '\000'}, Additional_access_technologies = { Count_additional_access_technologies = 1 '\001', Additional_access_technologies = {{ Access_Technology_Type = 16777217, GMSK_Power_class = 0 '\000', Eight_PSK_Power_class = 0 '\000'}}}}}, { IndexOfAccTech = 0 '\000', u = {Content = { RF_Power_Capability = 0 '\000', Exist_A5_bits = 0 '\000', A5_bits = 0 '\000', ES_IND = 0 '\000', PS = 0 '\000', VGCS = 0 '\000', VBS = 0 '\000', Exist_Multislot_capability = 0 '\000', Multislot_capability = { Exist_HSCSD_multislot_class = 0 '\000', HSCSD_multislot_class = 0 '\000', Exist_GPRS_multislot_class = 0 '\000', --Type <RET> for more, q to quit, c to continue without paging-- GPRS_multislot_class = 0 '\000', GPRS_Extended_Dynamic_Allocation_Capability = 0 '\000', Exist_SM = 0 '\000', SMS_VALUE = 0 '\000', SM_VALUE = 0 '\000', Exist_ECSD_multislot_class = 0 '\000', ECSD_multislot_class = 0 '\000', Exist_EGPRS_multislot_class = 0 '\000', EGPRS_multislot_class = 0 '\000', EGPRS_Extended_Dynamic_Allocation_Capability = 0 '\000', Exist_DTM_GPRS_multislot_class = 0 '\000', DTM_GPRS_multislot_class = 0 '\000', Single_Slot_DTM = 0 '\000', DTM_EGPRS_Params = {Exist_DTM_EGPRS_multislot_class = 0 '\000', DTM_EGPRS_multislot_class = 0 '\000'}}, Exist_Eight_PSK_Power_Capability = 0 '\000', Eight_PSK_Power_Capability = 0 '\000', COMPACT_Interference_Measurement_Capability = 0 '\000', Revision_Level_Indicator = 0 '\000', UMTS_FDD_Radio_Access_Technology_Capability = 0 '\000', UMTS_384_TDD_Radio_Access_Technology_Capability = 0 '\000', CDMA2000_Radio_Access_Technology_Capability = 0 '\000', UMTS_128_TDD_Radio_Access_Technology_Capability = 0 '\000', GERAN_Feature_Package_1 = 0 '\000', Exist_Extended_DTM_multislot_class = 0 '\000', Extended_DTM_GPRS_multislot_class = 0 '\000', --Type <RET> for more, q to quit, c to continue without paging-- Extended_DTM_EGPRS_multislot_class = 0 '\000', Modulation_based_multislot_class_support = 0 '\000', Exist_HighMultislotCapability = 0 '\000', HighMultislotCapability = 0 '\000', Exist_GERAN_lu_ModeCapability = 0 '\000', GERAN_lu_ModeCapability = 0 '\000', GMSK_MultislotPowerProfile = 0 '\000', EightPSK_MultislotProfile = 0 '\000', MultipleTBF_Capability = 0 '\000', DownlinkAdvancedReceiverPerformance = 0 '\000', ExtendedRLC_MAC_ControlMessageSegmentionsCapability = 0 '\000', DTM_EnhancementsCapability = 0 '\000', Exist_DTM_GPRS_HighMultislotClass = 0 '\000', DTM_GPRS_HighMultislotClass = 0 '\000', DTM_EGPRS_HighMultislotClass = { Exist_DTM_EGPRS_HighMultislotClass = 0 '\000', DTM_EGPRS_HighMultislotClass = 0 '\000'}, PS_HandoverCapability = 0 '\000'}, Additional_access_technologies = { Count_additional_access_technologies = 0 '\000', Additional_access_technologies = {{ Access_Technology_Type = AccTech_GSMP, GMSK_Power_class = 0 '\000', --Type <RET> for more, q to quit, c to continue without paging-- Eight_PSK_Power_class = 0 '\000'}}}}}}}, Channel_Request_Description = {PEAK_THROUGHPUT_CLASS = 0 '\000', RADIO_PRIORITY = 0 '\000', RLC_MODE = RLC_MODE_ACKNOWLEDGED, LLC_PDU_TYPE = 1 '\001', RLC_OCTET_COUNT = 52}, Exist_CHANGE_MARK = 0 '\000', CHANGE_MARK = 0 '\000', C_VALUE = 60 '<', Exist_SIGN_VAR = 0 '\000', SIGN_VAR = 0 '\000', Slot = {{Exist = 0, I_LEVEL = 0 '\000'}, {Exist = 0, I_LEVEL = 0 '\000'}, {Exist = 0, I_LEVEL = 0 '\000'}, {Exist = 0, I_LEVEL = 0 '\000'}, {Exist = 0, I_LEVEL = 0 '\000'}, {Exist = 0, I_LEVEL = 0 '\000'}, {Exist = 0, I_LEVEL = 0 '\000'}, {Exist = 0, I_LEVEL = 0 '\000'}}, Exist_AdditionsR99 = 1 '\001', AdditionsR99 = { Exist_EGPRS_BEP_LinkQualityMeasurements = 0, EGPRS_BEP_LinkQualityMeasurements = {Exist_MEAN_CV_BEP_GMSK = 0, MEAN_BEP_GMSK = 0 '\000', CV_BEP_GMSK = 0 '\000', Exist_MEAN_CV_BEP_8PSK = 0, MEAN_BEP_8PSK = 0 '\000', CV_BEP_8PSK = 0 '\000'}, Exist_EGPRS_TimeslotLinkQualityMeasurements = 0, EGPRS_TimeslotLinkQualityMeasurements = {Exist_BEP_MEASUREMENTS = 0, BEP_MEASUREMENTS = {{Exist = 0, UnionType = 0 '\000', u = { MEAN_BEP_GMSK = 0 '\000', MEAN_BEP_8PSK = 0 '\000'}}, {Exist = 0, UnionType = 0 '\000', u = {MEAN_BEP_GMSK = 0 '\000', MEAN_BEP_8PSK = 0 '\000'}}, {Exist = 0, UnionType = 0 '\000', u = { MEAN_BEP_GMSK = 0 '\000', MEAN_BEP_8PSK = 0 '\000'}}, {Exist = 0, --Type <RET> for more, q to quit, c to continue without paging-- UnionType = 0 '\000', u = {MEAN_BEP_GMSK = 0 '\000', MEAN_BEP_8PSK = 0 '\000'}}, {Exist = 0, UnionType = 0 '\000', u = { MEAN_BEP_GMSK = 0 '\000', MEAN_BEP_8PSK = 0 '\000'}}, {Exist = 0, UnionType = 0 '\000', u = {MEAN_BEP_GMSK = 0 '\000', MEAN_BEP_8PSK = 0 '\000'}}, {Exist = 0, UnionType = 0 '\000', u = { MEAN_BEP_GMSK = 0 '\000', MEAN_BEP_8PSK = 0 '\000'}}, {Exist = 0, UnionType = 0 '\000', u = {MEAN_BEP_GMSK = 0 '\000', MEAN_BEP_8PSK = 0 '\000'}}}, Exist_INTERFERENCE_MEASUREMENTS = 0, INTERFERENCE_MEASUREMENTS = {{Exist = 0, I_LEVEL = 0 '\000'}, { Exist = 0, I_LEVEL = 0 '\000'}, {Exist = 0, I_LEVEL = 0 '\000'}, { Exist = 0, I_LEVEL = 0 '\000'}, {Exist = 0, I_LEVEL = 0 '\000'}, { Exist = 0, I_LEVEL = 0 '\000'}, {Exist = 0, I_LEVEL = 0 '\000'}, { Exist = 0, I_LEVEL = 0 '\000'}}}, Exist_PFI = 0, PFI = 0 '\000', MS_RAC_AdditionalInformationAvailable = 0 '\000', RetransmissionOfPRR = 0 '\000'}}
Updated by pespin over 4 years ago
Ah I think I understand the issue now. So meas is filled in way before in the stack in pcu_rx_data_ind(), and passed down to rcv_block_gprs(). In there, in the rcv_data_block() case the meas object is further passed down, but in the rcv_control_block() case it's not, and a new meas object without link_qual is used. So I guess we should be passing the meas object there too.
Updated by pespin over 4 years ago
At least my errors got fixed by these ones:
remote: https://gerrit.osmocom.org/c/osmo-pcu/+/15600 pdch.cpp: Refactor bitvec param passing in rcv_control_block
remote: https://gerrit.osmocom.org/c/osmo-pcu/+/15601 pdch.cpp: Use pcu_l1_meas previously filled by lower layers
Updated by fixeria over 4 years ago
- Related to Bug #1833: UPLINK MCS gets reduced from MCS9->MCS6 when good radio condition exists added
Updated by fixeria over 4 years ago
Also, I am working on TTCN-3 test cases for the link adaptation.
We now have a test case for testing CS (only GPRS for now) adaptation during an active TBF:
https://gerrit.osmocom.org/r/Ia78d93e43a3c41b0b30e70df20a2da31077fd05f
Unfortunately it does not pass, because somehow OsmoPCU changes the coding scheme later that it's expected.
Updated by fixeria over 4 years ago
- Related to Bug #3929: Missing PCU_Tests.ttcn link adaptation tests added
Updated by fixeria over 4 years ago
- File compute_edge_ci.diff compute_edge_ci.diff added
There is also an issue observed by Fairwaves: OsmoTRX calculates relatively lower C/I values for EDGE/8-PSK bursts (compared to GMSK). Please see an attached patch that has never been submitted to the mainstream, but I believe it should fix the problem.
Updated by laforge over 4 years ago
- Status changed from Feedback to Stalled
- Assignee changed from lynxis to pespin
- Priority changed from Urgent to High
Updated by pespin about 4 years ago
- Related to Bug #4373: OsmoTRX calculates relatively lower C/I values for EDGE/8-PSK bursts (compared to GMSK) added
Updated by pespin about 4 years ago
- Status changed from Stalled to Resolved
- % Done changed from 0 to 100
Mentioned TTCN3 test TC_cs_lqual_ul_tbf is passing since a while ago.
EDGE C/I related issues to be handled in #4373.
Closing the ticket.