ctrl/abis: When the max_power_reduction changes, send it to the BTS

In case the max_power_reduction changes, issue a new Set Radio
Carrier Attributes command. OML 12.21 allows to not include the
ARFCN list and the semantic I picked/understand is that a partial
update is possible.

Fixes: SYS#267
This commit is contained in:
Holger Hans Peter Freyther 2014-03-26 14:24:42 +01:00
parent a27303094a
commit 8a158bb1ea
3 changed files with 31 additions and 1 deletions

View File

@ -183,4 +183,7 @@ int abis_nm_parse_sw_config(const uint8_t *data, const size_t len,
struct abis_nm_sw_descr *res, const int res_len);
int abis_nm_select_newest_sw(const struct abis_nm_sw_descr *sw, const size_t len);
/* Helper functions for updating attributes */
int abis_nm_update_max_power_red(struct gsm_bts_trx *trx);
#endif /* _NM_H */

View File

@ -1466,6 +1466,12 @@ int abis_nm_set_radio_attr(struct gsm_bts_trx *trx, uint8_t *attr, int attr_len)
return abis_nm_sendmsg(trx->bts, msg);
}
int abis_nm_update_max_power_red(struct gsm_bts_trx *trx)
{
uint8_t attr[] = { NM_ATT_RF_MAXPOWR_R, trx->max_power_red / 2 };
return abis_nm_set_radio_attr(trx, attr, ARRAY_SIZE(attr));
}
static int verify_chan_comb(struct gsm_bts_trx_ts *ts, uint8_t chan_comb,
const char **reason)
{

View File

@ -22,6 +22,8 @@
#include <openbsc/control_cmd.h>
#include <openbsc/ipaccess.h>
#include <openbsc/gsm_data.h>
#include <openbsc/abis_nm.h>
#include <openbsc/debug.h>
#define CTRL_CMD_VTY_STRING(cmdname, cmdstr, dtype, element) \
CTRL_HELPER_GET_STRING(cmdname, dtype, element) \
@ -153,7 +155,6 @@ CTRL_CMD_DEFINE(net_mcc_mnc_apply, "mcc-mnc-apply");
/* TRX related commands below here */
CTRL_HELPER_GET_INT(trx_max_power, struct gsm_bts_trx, max_power_red);
CTRL_HELPER_SET_INT(trx_max_power, struct gsm_bts_trx, max_power_red);
static int verify_trx_max_power(struct ctrl_cmd *cmd, const char *value, void *_data)
{
int tmp = atoi(value);
@ -170,6 +171,26 @@ static int verify_trx_max_power(struct ctrl_cmd *cmd, const char *value, void *_
return 0;
}
static int set_trx_max_power(struct ctrl_cmd *cmd, void *_data)
{
struct gsm_bts_trx *trx = cmd->node;
int old_power;
/* remember the old value, set the new one */
old_power = trx->max_power_red;
trx->max_power_red = atoi(cmd->value);
/* Maybe update the value */
if (old_power != trx->max_power_red) {
LOGP(DCTRL, LOGL_NOTICE,
"%s updating max_pwr_red(%d)\n",
gsm_trx_name(trx), trx->max_power_red);
abis_nm_update_max_power_red(trx);
}
return get_trx_max_power(cmd, _data);
}
CTRL_CMD_DEFINE(trx_max_power, "max-power-reduction");
int bsc_base_ctrl_cmds_install(void)