bts: Allow config of RACH control parameters tx-integer & max retrans
Tweaking theses can be useful especially tx-integer that influence both the spread of rach attemps and the delay between two attemps. Looking up GSM 04.08 3.3.1.1.2 & 10.5.2.29 can help determine good values. The default are choosed with a wide spacing between attemps (tx integer = 9 -> T=12 & S=217 (non-combined CCCH/SDCCH) or 115 (for combined CCCH/SDCCH)). This alleviates the problem of responding to several RACH attempts by a same MS, allocating several RF channels when only 1 is needed. Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
This commit is contained in:
parent
ff1f19e199
commit
4010f1e6f4
|
@ -37,5 +37,12 @@ int ms_pwr_dbm(enum gsm_band band, u_int8_t lvl);
|
|||
int rxlev2dbm(u_int8_t rxlev);
|
||||
u_int8_t dbm2rxlev(int dbm);
|
||||
|
||||
/* According to GSM 04.08 Chapter 10.5.2.29 */
|
||||
static inline int rach_max_trans_val2raw(int val) { return (val >> 1) & 3; }
|
||||
static inline int rach_max_trans_raw2val(int raw) {
|
||||
const int tbl[4] = { 1, 2, 4, 7 };
|
||||
return tbl[raw & 3];
|
||||
}
|
||||
|
||||
void generate_backtrace();
|
||||
#endif
|
||||
|
|
|
@ -823,11 +823,6 @@ static int bootstrap_bts(struct gsm_bts *bts)
|
|||
/* T3212 is set from vty/config */
|
||||
|
||||
/* some defaults for our system information */
|
||||
bts->si_common.rach_control.re = 1; /* no re-establishment */
|
||||
bts->si_common.rach_control.tx_integer = 5; /* 8 slots spread */
|
||||
bts->si_common.rach_control.max_trans = 3; /* 7 retransmissions */
|
||||
bts->si_common.rach_control.t2 = 4; /* no emergency calls */
|
||||
|
||||
bts->si_common.cell_options.radio_link_timeout = 2; /* 12 */
|
||||
bts->si_common.cell_options.dtx = 2; /* MS shall not use upplink DTX */
|
||||
bts->si_common.cell_options.pwrc = 0; /* PWRC not set */
|
||||
|
|
|
@ -175,6 +175,10 @@ struct gsm_bts *gsm_bts_alloc(struct gsm_network *net, enum gsm_bts_type type,
|
|||
bts->si_common.cell_alloc.data = bts->si_common.data.cell_alloc;
|
||||
bts->si_common.cell_alloc.data_len =
|
||||
sizeof(bts->si_common.data.cell_alloc);
|
||||
bts->si_common.rach_control.re = 1; /* no re-establishment */
|
||||
bts->si_common.rach_control.tx_integer = 9; /* 12 slots spread - 217/115 slots delay */
|
||||
bts->si_common.rach_control.max_trans = 3; /* 7 retransmissions */
|
||||
bts->si_common.rach_control.t2 = 4; /* no emergency calls */
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(bts->gprs.nsvc); i++) {
|
||||
bts->gprs.nsvc[i].bts = bts;
|
||||
|
|
|
@ -168,6 +168,11 @@ static void bts_dump_vty(struct vty *vty, struct gsm_bts *bts)
|
|||
VTY_NEWLINE);
|
||||
vty_out(vty, "Cell Reselection Hysteresis: %u dBm%s",
|
||||
bts->si_common.cell_sel_par.cell_resel_hyst*2, VTY_NEWLINE);
|
||||
vty_out(vty, "RACH TX-Integer: %u%s", bts->si_common.rach_control.tx_integer,
|
||||
VTY_NEWLINE);
|
||||
vty_out(vty, "RACH Max transmissions: %u%s",
|
||||
rach_max_trans_raw2val(bts->si_common.rach_control.max_trans),
|
||||
VTY_NEWLINE);
|
||||
if (bts->si_common.rach_control.cell_bar)
|
||||
vty_out(vty, " CELL IS BARRED%s", VTY_NEWLINE);
|
||||
if (is_ipaccess_bts(bts))
|
||||
|
@ -290,6 +295,11 @@ static void config_write_bts_single(struct vty *vty, struct gsm_bts *bts)
|
|||
vty_out(vty, " channel allocator %s%s",
|
||||
bts->chan_alloc_reverse ? "descending" : "ascending",
|
||||
VTY_NEWLINE);
|
||||
vty_out(vty, " rach tx integer %u%s",
|
||||
bts->si_common.rach_control.tx_integer, VTY_NEWLINE);
|
||||
vty_out(vty, " rach max transmission %u%s",
|
||||
rach_max_trans_raw2val(bts->si_common.rach_control.max_trans),
|
||||
VTY_NEWLINE);
|
||||
if (bts->si_common.rach_control.cell_bar)
|
||||
vty_out(vty, " cell barred 1%s", VTY_NEWLINE);
|
||||
if (is_ipaccess_bts(bts)) {
|
||||
|
@ -1263,6 +1273,26 @@ DEFUN(cfg_bts_challoc, cfg_bts_challoc_cmd,
|
|||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN(cfg_bts_rach_tx_integer,
|
||||
cfg_bts_rach_tx_integer_cmd,
|
||||
"rach tx integer <0-15>",
|
||||
"Set the raw tx integer value in RACH Control parameters IE")
|
||||
{
|
||||
struct gsm_bts *bts = vty->index;
|
||||
bts->si_common.rach_control.tx_integer = atoi(argv[0]) & 0xf;
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN(cfg_bts_rach_max_trans,
|
||||
cfg_bts_rach_max_trans_cmd,
|
||||
"rach max transmission (1|2|4|7)",
|
||||
"Set the maximum number of RACH burst transmissions")
|
||||
{
|
||||
struct gsm_bts *bts = vty->index;
|
||||
bts->si_common.rach_control.max_trans = rach_max_trans_val2raw(atoi(argv[0]));
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN(cfg_bts_cell_barred, cfg_bts_cell_barred_cmd,
|
||||
"cell barred (0|1)",
|
||||
"Should this cell be barred from access?")
|
||||
|
@ -1550,6 +1580,8 @@ int bsc_vty_init(struct gsm_network *net)
|
|||
install_element(BTS_NODE, &cfg_bts_oml_e1_cmd);
|
||||
install_element(BTS_NODE, &cfg_bts_oml_e1_tei_cmd);
|
||||
install_element(BTS_NODE, &cfg_bts_challoc_cmd);
|
||||
install_element(BTS_NODE, &cfg_bts_rach_tx_integer_cmd);
|
||||
install_element(BTS_NODE, &cfg_bts_rach_max_trans_cmd);
|
||||
install_element(BTS_NODE, &cfg_bts_cell_barred_cmd);
|
||||
install_element(BTS_NODE, &cfg_bts_ms_max_power_cmd);
|
||||
install_element(BTS_NODE, &cfg_bts_per_loc_upd_cmd);
|
||||
|
|
Loading…
Reference in New Issue