Use ALPHA value received in SI13 from PCUIF
The old VTY command is marked as deprecated and still overrides the use in case it's used. Related: SYS#5358 Depends: libosmocore.git Change-Id I74fb0a3afc1ac4aadbfc609b882d929401f790eb Depends: osmo-bsc.git Change-Id I8b97ea11bad5fe05f2f634945b5703ee9abde81d Change-Id: I46f2a955b157a409055fca7fb917dc4f75482426
This commit is contained in:
parent
4df2658884
commit
fe8de457ac
|
@ -2,5 +2,4 @@ pcu
|
||||||
flow-control-interval 10
|
flow-control-interval 10
|
||||||
cs 2
|
cs 2
|
||||||
alloc-algorithm dynamic
|
alloc-algorithm dynamic
|
||||||
alpha 0
|
|
||||||
gamma 0
|
gamma 0
|
||||||
|
|
|
@ -15,14 +15,12 @@ pcu
|
||||||
flow-control-interval 10 <1>
|
flow-control-interval 10 <1>
|
||||||
cs 2 <2>
|
cs 2 <2>
|
||||||
alloc-algorithm dynamic <3>
|
alloc-algorithm dynamic <3>
|
||||||
alpha 0 <4>
|
|
||||||
gamma 0
|
gamma 0
|
||||||
----
|
----
|
||||||
<1> send a BSSGP flow-control PDU every 10 seconds
|
<1> send a BSSGP flow-control PDU every 10 seconds
|
||||||
<2> start a TBF with the initial coding scheme 2
|
<2> start a TBF with the initial coding scheme 2
|
||||||
<3> dynamically chose between single-slot or multi-slot TBF allocations
|
<3> dynamically chose between single-slot or multi-slot TBF allocations
|
||||||
depending on system load
|
depending on system load
|
||||||
<4> disable MS power control loop
|
|
||||||
|
|
||||||
However, there are plenty of tuning parameters for people interested to
|
However, there are plenty of tuning parameters for people interested to
|
||||||
optimize PCU throughput or latency according to their requirements.
|
optimize PCU throughput or latency according to their requirements.
|
||||||
|
@ -212,13 +210,15 @@ parameters.
|
||||||
|
|
||||||
You can set those parameters at the `pcu` VTY config node as follows:
|
You can set those parameters at the `pcu` VTY config node as follows:
|
||||||
|
|
||||||
`alpha <0-10>`::
|
|
||||||
Alpha parameter for MS power control in units of 0.1.
|
|
||||||
Make sure to set the alpha value at System Information 13 (in
|
|
||||||
the BSC), too!
|
|
||||||
`gamma <0-62>`::
|
`gamma <0-62>`::
|
||||||
Set the gamma parameter for MS power control in units of dB.
|
Set the gamma parameter for MS power control in units of dB.
|
||||||
|
|
||||||
|
Parameter `ALPHA` is set on the BSC VTY configuration file on a per-BTS basis,
|
||||||
|
and forwarded by OsmoPCU to the MS through the SI13 received from the former
|
||||||
|
over PCUIF. OsmoPCU VTY command `alpha <0-10>` overrides the value received over
|
||||||
|
PCUIF to keep backward compatibility with existing config files, but it is
|
||||||
|
currently deprecated and its use is discouraged; one should configure it per-BTS
|
||||||
|
in OsmoBSC VTY instead.
|
||||||
|
|
||||||
=== Configuring Network Assisted Cell Change (NACC)
|
=== Configuring Network Assisted Cell Change (NACC)
|
||||||
|
|
||||||
|
|
15
src/bts.cpp
15
src/bts.cpp
|
@ -918,7 +918,7 @@ send_imm_ass_rej:
|
||||||
plen = Encoding::write_immediate_assignment(
|
plen = Encoding::write_immediate_assignment(
|
||||||
&bts->trx[trx_no].pdch[ts_no], tbf, bv,
|
&bts->trx[trx_no].pdch[ts_no], tbf, bv,
|
||||||
false, rip->ra, Fn, ta, usf, false, sb_fn,
|
false, rip->ra, Fn, ta, usf, false, sb_fn,
|
||||||
bts->pcu->vty.alpha, bts->pcu->vty.gamma, -1,
|
bts_get_ms_pwr_alpha(bts), bts->pcu->vty.gamma, -1,
|
||||||
rip->burst_type);
|
rip->burst_type);
|
||||||
bts_do_rate_ctr_inc(bts, CTR_IMMEDIATE_ASSIGN_UL_TBF);
|
bts_do_rate_ctr_inc(bts, CTR_IMMEDIATE_ASSIGN_UL_TBF);
|
||||||
}
|
}
|
||||||
|
@ -999,7 +999,7 @@ void bts_snd_dl_ass(struct gprs_rlcmac_bts *bts, struct gprs_rlcmac_tbf *tbf, bo
|
||||||
tbf, immediate_assignment, true, 125,
|
tbf, immediate_assignment, true, 125,
|
||||||
(tbf->pdch[ts_no]->last_rts_fn + 21216) % GSM_MAX_FN,
|
(tbf->pdch[ts_no]->last_rts_fn + 21216) % GSM_MAX_FN,
|
||||||
tbf->ta(), 7, poll, tbf->poll_fn,
|
tbf->ta(), 7, poll, tbf->poll_fn,
|
||||||
bts->pcu->vty.alpha, bts->pcu->vty.gamma, -1,
|
bts_get_ms_pwr_alpha(bts), bts->pcu->vty.gamma, -1,
|
||||||
GSM_L1_BURST_TYPE_ACCESS_0);
|
GSM_L1_BURST_TYPE_ACCESS_0);
|
||||||
if (plen >= 0) {
|
if (plen >= 0) {
|
||||||
bts_do_rate_ctr_inc(bts, CTR_IMMEDIATE_ASSIGN_DL_TBF);
|
bts_do_rate_ctr_inc(bts, CTR_IMMEDIATE_ASSIGN_DL_TBF);
|
||||||
|
@ -1292,3 +1292,14 @@ const struct llist_head* bts_ms_list(struct gprs_rlcmac_bts *bts)
|
||||||
{
|
{
|
||||||
return bts_ms_store(bts)->ms_list();
|
return bts_ms_store(bts)->ms_list();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t bts_get_ms_pwr_alpha(const struct gprs_rlcmac_bts *bts)
|
||||||
|
{
|
||||||
|
if (bts->pcu->vty.force_alpha != (uint8_t)-1)
|
||||||
|
return bts->pcu->vty.force_alpha;
|
||||||
|
if (bts->si13_is_set)
|
||||||
|
return bts->si31_ro_decoded.pwr_ctrl_pars.alpha;
|
||||||
|
/* default if no SI13 is received yet: closed loop control, TS 44.060
|
||||||
|
* B.2 Closed loop control */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
@ -35,6 +35,7 @@ extern "C" {
|
||||||
#include <osmocom/gprs/gprs_ns2.h>
|
#include <osmocom/gprs/gprs_ns2.h>
|
||||||
#include <osmocom/gsm/l1sap.h>
|
#include <osmocom/gsm/l1sap.h>
|
||||||
#include <osmocom/gsm/protocol/gsm_04_08.h>
|
#include <osmocom/gsm/protocol/gsm_04_08.h>
|
||||||
|
#include <osmocom/gsm/gsm48_rest_octets.h>
|
||||||
#include <osmocom/gsm/gsm48.h>
|
#include <osmocom/gsm/gsm48.h>
|
||||||
#include "mslot_class.h"
|
#include "mslot_class.h"
|
||||||
#include "gsm_rlcmac.h"
|
#include "gsm_rlcmac.h"
|
||||||
|
@ -224,6 +225,7 @@ struct gprs_rlcmac_bts {
|
||||||
uint8_t si3[GSM_MACBLOCK_LEN];
|
uint8_t si3[GSM_MACBLOCK_LEN];
|
||||||
bool si3_is_set;
|
bool si3_is_set;
|
||||||
uint8_t si13[GSM_MACBLOCK_LEN];
|
uint8_t si13[GSM_MACBLOCK_LEN];
|
||||||
|
struct osmo_gsm48_si13_info si31_ro_decoded;
|
||||||
bool si13_is_set;
|
bool si13_is_set;
|
||||||
|
|
||||||
/* State for dynamic algorithm selection */
|
/* State for dynamic algorithm selection */
|
||||||
|
@ -346,6 +348,7 @@ void bts_set_max_mcs_dl(struct gprs_rlcmac_bts *bts, uint8_t mcs_dl);
|
||||||
void bts_set_max_mcs_ul(struct gprs_rlcmac_bts *bts, uint8_t mcs_ul);
|
void bts_set_max_mcs_ul(struct gprs_rlcmac_bts *bts, uint8_t mcs_ul);
|
||||||
bool bts_cs_dl_is_supported(const struct gprs_rlcmac_bts *bts, enum CodingScheme cs);
|
bool bts_cs_dl_is_supported(const struct gprs_rlcmac_bts *bts, enum CodingScheme cs);
|
||||||
const struct llist_head* bts_ms_list(struct gprs_rlcmac_bts *bts);
|
const struct llist_head* bts_ms_list(struct gprs_rlcmac_bts *bts);
|
||||||
|
uint8_t bts_get_ms_pwr_alpha(const struct gprs_rlcmac_bts *bts);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -65,7 +65,7 @@ struct gprs_pcu *gprs_pcu_alloc(void *ctx)
|
||||||
pcu->vty.max_cs_dl = MAX_GPRS_CS;
|
pcu->vty.max_cs_dl = MAX_GPRS_CS;
|
||||||
pcu->vty.max_mcs_ul = MAX_EDGE_MCS;
|
pcu->vty.max_mcs_ul = MAX_EDGE_MCS;
|
||||||
pcu->vty.max_mcs_dl = MAX_EDGE_MCS;
|
pcu->vty.max_mcs_dl = MAX_EDGE_MCS;
|
||||||
pcu->vty.alpha = 0; /* a = 0.0 */
|
pcu->vty.force_alpha = (uint8_t)-1; /* don't force by default, use BTS SI13 provided value */
|
||||||
pcu->vty.dl_tbf_preemptive_retransmission = true;
|
pcu->vty.dl_tbf_preemptive_retransmission = true;
|
||||||
/* By default resegmentation is supported in DL can also be configured
|
/* By default resegmentation is supported in DL can also be configured
|
||||||
* through VTY */
|
* through VTY */
|
||||||
|
|
|
@ -90,7 +90,7 @@ struct gprs_pcu {
|
||||||
uint8_t max_cs_dl, max_cs_ul;
|
uint8_t max_cs_dl, max_cs_ul;
|
||||||
uint8_t max_mcs_dl, max_mcs_ul;
|
uint8_t max_mcs_dl, max_mcs_ul;
|
||||||
uint8_t force_two_phase;
|
uint8_t force_two_phase;
|
||||||
uint8_t alpha, gamma;
|
uint8_t force_alpha, gamma;
|
||||||
bool dl_tbf_preemptive_retransmission;
|
bool dl_tbf_preemptive_retransmission;
|
||||||
enum egprs_arq_type dl_arq_type; /* EGPRS_ARQ1 to support resegmentation in DL, EGPRS_ARQ2 for no reseg */
|
enum egprs_arq_type dl_arq_type; /* EGPRS_ARQ1 to support resegmentation in DL, EGPRS_ARQ2 for no reseg */
|
||||||
bool cs_adj_enabled; /* whether cs_adj_{upper,lower}_limit are used to adjust DL CS */
|
bool cs_adj_enabled; /* whether cs_adj_{upper,lower}_limit are used to adjust DL CS */
|
||||||
|
|
|
@ -42,6 +42,7 @@ extern "C" {
|
||||||
#include <osmocom/gprs/gprs_ns2.h>
|
#include <osmocom/gprs/gprs_ns2.h>
|
||||||
#include <osmocom/gsm/l1sap.h>
|
#include <osmocom/gsm/l1sap.h>
|
||||||
#include <osmocom/gsm/protocol/gsm_04_08.h>
|
#include <osmocom/gsm/protocol/gsm_04_08.h>
|
||||||
|
#include <osmocom/gsm/gsm48_rest_octets.h>
|
||||||
#include <osmocom/gsm/sysinfo.h>
|
#include <osmocom/gsm/sysinfo.h>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -291,6 +292,7 @@ int pcu_rx_data_ind_pdtch(struct gprs_rlcmac_bts *bts, uint8_t trx_no, uint8_t t
|
||||||
|
|
||||||
static int pcu_rx_data_ind_bcch(struct gprs_rlcmac_bts *bts, uint8_t *data, uint8_t len)
|
static int pcu_rx_data_ind_bcch(struct gprs_rlcmac_bts *bts, uint8_t *data, uint8_t len)
|
||||||
{
|
{
|
||||||
|
const uint8_t *si_ro;
|
||||||
switch (len) {
|
switch (len) {
|
||||||
case 0:
|
case 0:
|
||||||
/* Due to historical reasons also accept a completely empty message as
|
/* Due to historical reasons also accept a completely empty message as
|
||||||
|
@ -337,6 +339,9 @@ static int pcu_rx_data_ind_bcch(struct gprs_rlcmac_bts *bts, uint8_t *data, uint
|
||||||
case GSM48_MT_RR_SYSINFO_13:
|
case GSM48_MT_RR_SYSINFO_13:
|
||||||
memcpy(bts->si13, data, GSM_MACBLOCK_LEN);
|
memcpy(bts->si13, data, GSM_MACBLOCK_LEN);
|
||||||
bts->si13_is_set = true;
|
bts->si13_is_set = true;
|
||||||
|
si_ro = ((struct gsm48_system_information_type_13*)data)->rest_octets;
|
||||||
|
if (osmo_gsm48_rest_octets_si13_decode(&bts->si31_ro_decoded, si_ro) < 0)
|
||||||
|
LOGP(DPCU, LOGL_ERROR, "Error decoding SI13\n");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
LOGP(DL1IF, LOGL_ERROR,
|
LOGP(DL1IF, LOGL_ERROR,
|
||||||
|
|
|
@ -230,7 +230,8 @@ static int config_write_pcu(struct vty *vty)
|
||||||
vty_out(vty, " alloc-algorithm dynamic%s", VTY_NEWLINE);
|
vty_out(vty, " alloc-algorithm dynamic%s", VTY_NEWLINE);
|
||||||
if (the_pcu->vty.force_two_phase)
|
if (the_pcu->vty.force_two_phase)
|
||||||
vty_out(vty, " two-phase-access%s", VTY_NEWLINE);
|
vty_out(vty, " two-phase-access%s", VTY_NEWLINE);
|
||||||
vty_out(vty, " alpha %d%s", the_pcu->vty.alpha, VTY_NEWLINE);
|
if (the_pcu->vty.force_alpha != (uint8_t)-1)
|
||||||
|
vty_out(vty, " alpha %u%s", the_pcu->vty.force_alpha, VTY_NEWLINE);
|
||||||
vty_out(vty, " gamma %d%s", the_pcu->vty.gamma * 2, VTY_NEWLINE);
|
vty_out(vty, " gamma %d%s", the_pcu->vty.gamma * 2, VTY_NEWLINE);
|
||||||
if (!the_pcu->vty.dl_tbf_preemptive_retransmission)
|
if (!the_pcu->vty.dl_tbf_preemptive_retransmission)
|
||||||
vty_out(vty, " no dl-tbf-preemptive-retransmission%s", VTY_NEWLINE);
|
vty_out(vty, " no dl-tbf-preemptive-retransmission%s", VTY_NEWLINE);
|
||||||
|
@ -735,13 +736,19 @@ DEFUN_ATTR(cfg_pcu_no_two_phase,
|
||||||
|
|
||||||
DEFUN_ATTR(cfg_pcu_alpha,
|
DEFUN_ATTR(cfg_pcu_alpha,
|
||||||
cfg_pcu_alpha_cmd,
|
cfg_pcu_alpha_cmd,
|
||||||
"alpha <0-10>",
|
"alpha (si13|<0-10>)",
|
||||||
"Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "
|
"Alpha parameter for MS power control in units of 0.1 (see TS 05.08) "
|
||||||
"NOTE: Be sure to set Alpha value at System information 13 too.\n"
|
"NOTE: Be sure to set Alpha value at System information 13 too.\n"
|
||||||
"Alpha in units of 0.1\n",
|
"Use value received from BSC in System Intormation 13 (default)\n"
|
||||||
CMD_ATTR_IMMEDIATE)
|
"Force Alpha in units of 0.1\n",
|
||||||
|
CMD_ATTR_IMMEDIATE | CMD_ATTR_DEPRECATED)
|
||||||
{
|
{
|
||||||
the_pcu->vty.alpha = atoi(argv[0]);
|
vty_out(vty, "%% 'alpha <0-10>' is now deprecated: use osmo-bsc's 'gprs power-control alpha <0-10>' instead%s",
|
||||||
|
VTY_NEWLINE);
|
||||||
|
if (strcmp(argv[0], "si13") == 0)
|
||||||
|
the_pcu->vty.force_alpha = (uint8_t) -1;
|
||||||
|
else
|
||||||
|
the_pcu->vty.force_alpha = atoi(argv[0]);
|
||||||
return CMD_SUCCESS;
|
return CMD_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -930,7 +930,7 @@ struct msgb *gprs_rlcmac_tbf::create_dl_ass(uint32_t fn, uint8_t ts)
|
||||||
Encoding::write_packet_downlink_assignment(mac_control_block,
|
Encoding::write_packet_downlink_assignment(mac_control_block,
|
||||||
old_tfi_is_valid, m_tfi, (direction == GPRS_RLCMAC_DL_TBF),
|
old_tfi_is_valid, m_tfi, (direction == GPRS_RLCMAC_DL_TBF),
|
||||||
new_dl_tbf, poll_ass_dl, rrbp,
|
new_dl_tbf, poll_ass_dl, rrbp,
|
||||||
the_pcu->vty.alpha, the_pcu->vty.gamma, -1, 0,
|
bts_get_ms_pwr_alpha(new_dl_tbf->bts), the_pcu->vty.gamma, -1, 0,
|
||||||
is_egprs_enabled());
|
is_egprs_enabled());
|
||||||
LOGP(DTBF, LOGL_DEBUG, "+++++++++++++++++++++++++ TX : Packet Downlink Assignment +++++++++++++++++++++++++\n");
|
LOGP(DTBF, LOGL_DEBUG, "+++++++++++++++++++++++++ TX : Packet Downlink Assignment +++++++++++++++++++++++++\n");
|
||||||
rc = encode_gsm_rlcmac_downlink(&bv, mac_control_block);
|
rc = encode_gsm_rlcmac_downlink(&bv, mac_control_block);
|
||||||
|
@ -1033,7 +1033,7 @@ struct msgb *gprs_rlcmac_tbf::create_ul_ass(uint32_t fn, uint8_t ts)
|
||||||
mac_control_block = (RlcMacDownlink_t *)talloc_zero(tall_pcu_ctx, RlcMacDownlink_t);
|
mac_control_block = (RlcMacDownlink_t *)talloc_zero(tall_pcu_ctx, RlcMacDownlink_t);
|
||||||
Encoding::write_packet_uplink_assignment(mac_control_block, m_tfi,
|
Encoding::write_packet_uplink_assignment(mac_control_block, m_tfi,
|
||||||
(direction == GPRS_RLCMAC_DL_TBF), tlli(),
|
(direction == GPRS_RLCMAC_DL_TBF), tlli(),
|
||||||
is_tlli_valid(), new_tbf, 1, rrbp, the_pcu->vty.alpha,
|
is_tlli_valid(), new_tbf, 1, rrbp, bts_get_ms_pwr_alpha(new_tbf->bts),
|
||||||
the_pcu->vty.gamma, -1, is_egprs_enabled());
|
the_pcu->vty.gamma, -1, is_egprs_enabled());
|
||||||
|
|
||||||
LOGP(DTBF, LOGL_DEBUG, "+++++++++++++++++++++++++ TX : Packet Uplink Assignment +++++++++++++++++++++++++\n");
|
LOGP(DTBF, LOGL_DEBUG, "+++++++++++++++++++++++++ TX : Packet Uplink Assignment +++++++++++++++++++++++++\n");
|
||||||
|
|
|
@ -77,7 +77,6 @@ static void init_pcu(struct gprs_pcu *pcu)
|
||||||
if (!pcu->alloc_algorithm)
|
if (!pcu->alloc_algorithm)
|
||||||
pcu->alloc_algorithm = alloc_algorithm_b;
|
pcu->alloc_algorithm = alloc_algorithm_b;
|
||||||
pcu->vty.fc_interval = 100;
|
pcu->vty.fc_interval = 100;
|
||||||
pcu->vty.alpha = 0; /* a = 0.0 */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void bvci_unblocked(struct gprs_bssgp_pcu *pcu)
|
static void bvci_unblocked(struct gprs_bssgp_pcu *pcu)
|
||||||
|
|
Loading…
Reference in New Issue