aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/osmo-bts/bts.h6
-rw-r--r--include/osmo-bts/bts_trx.h2
-rw-r--r--include/osmo-bts/gsm_data.h67
-rw-r--r--src/common/bts.c6
-rw-r--r--src/common/bts_trx.c4
-rw-r--r--src/common/gsm_data.c28
6 files changed, 107 insertions, 6 deletions
diff --git a/include/osmo-bts/bts.h b/include/osmo-bts/bts.h
index 6d8b5706..0b224beb 100644
--- a/include/osmo-bts/bts.h
+++ b/include/osmo-bts/bts.h
@@ -321,10 +321,14 @@ struct gsm_bts {
bool vty_override; /* OML value overridden by VTY */
} radio_link_timeout;
- /* Uplink/Downlink power control */
+ /* Uplink/Downlink power control (legacy parameters) */
struct bts_power_ctrl_params ul_power_ctrl;
struct bts_power_ctrl_params dl_power_ctrl;
+ /* Default (fall-back) Dynamic Power Control parameters for all transceivers */
+ struct gsm_power_ctrl_params bs_dpc_params; /* BS Dynamic Power Control */
+ struct gsm_power_ctrl_params ms_dpc_params; /* MS Dynamic Power Control */
+
/* used by the sysmoBTS to adjust band */
uint8_t auto_band;
diff --git a/include/osmo-bts/bts_trx.h b/include/osmo-bts/bts_trx.h
index 08eaf659..44749035 100644
--- a/include/osmo-bts/bts_trx.h
+++ b/include/osmo-bts/bts_trx.h
@@ -32,6 +32,8 @@ struct gsm_bts_trx {
struct trx_power_params power_params;
+ struct gsm_power_ctrl_params *bs_dpc_params; /* BS Dynamic Power Control */
+ struct gsm_power_ctrl_params *ms_dpc_params; /* MS Dynamic Power Control */
bool ms_pwr_ctl_soft; /* is power control loop done by osmocom software? */
struct {
diff --git a/include/osmo-bts/gsm_data.h b/include/osmo-bts/gsm_data.h
index fdd5ba34..b9e0e887 100644
--- a/include/osmo-bts/gsm_data.h
+++ b/include/osmo-bts/gsm_data.h
@@ -161,10 +161,65 @@ struct gsm_rep_facch {
uint32_t fn;
};
-/* Depending on the context (MS or BS power control), fields 'current' and 'max'
- * reflect either the MS power level (magic numbers), or BS Power reduction level
- * (attenuation, in dB). Field 'avg100_rxlev_dbm' is always in dBm. */
+/* MS/BS Power related measurement averaging algo */
+enum gsm_power_ctrl_meas_avg_algo {
+ GSM_PWR_CTRL_MEAS_AVG_ALGO_NONE = 0x00,
+ GSM_PWR_CTRL_MEAS_AVG_ALGO_UNWEIGHTED = 0x01,
+ GSM_PWR_CTRL_MEAS_AVG_ALGO_WEIGHTED = 0x02,
+ GSM_PWR_CTRL_MEAS_AVG_ALGO_MOD_MEDIAN = 0x03,
+ /* EWMA is an Osmocom specific algo */
+ GSM_PWR_CTRL_MEAS_AVG_ALGO_OSMO_EWMA = 0x04,
+};
+
+/* MS/BS Power related measurement parameters */
+struct gsm_power_ctrl_meas_params {
+ /* Thresholds (see 3GPP TS 45.008, section A.3.2.1) */
+ uint8_t lower_thresh; /* lower (decreasing) direction */
+ uint8_t upper_thresh; /* upper (increasing) direction */
+
+ /* Threshold Comparators for lower (decreasing) direction */
+ uint8_t lower_cmp_p; /* P1 for RxLev, P3 for RxQual */
+ uint8_t lower_cmp_n; /* N1 for RxLev, N3 for RxQual */
+ /* Threshold Comparators for upper (increasing) direction */
+ uint8_t upper_cmp_p; /* P2 for RxLev, P4 for RxQual */
+ uint8_t upper_cmp_n; /* N2 for RxLev, N4 for RxQual */
+
+ /* Hreqave and Hreqt (see 3GPP TS 45.008, Annex A) */
+ uint8_t h_reqave;
+ uint8_t h_reqt;
+
+ /* AVG algorithm and its specific parameters */
+ enum gsm_power_ctrl_meas_avg_algo algo;
+ union {
+ /* Exponentially Weighted Moving Average */
+ struct {
+ /* Smoothing factor: higher the value - less smoothing */
+ uint8_t alpha; /* 1 .. 99 (in %) */
+ } ewma;
+ };
+};
+
+/* MS/BS Power Control parameters */
+struct gsm_power_ctrl_params {
+ /* Power change step size (maximum) */
+ uint8_t inc_step_size_db; /* increasing direction */
+ uint8_t red_step_size_db; /* reducing direction */
+
+ /* Measurement averaging parameters for RxLev & RxQual */
+ struct gsm_power_ctrl_meas_params rxqual_meas;
+ struct gsm_power_ctrl_meas_params rxlev_meas;
+};
+
+/* Default MS/BS Power Control parameters */
+extern const struct gsm_power_ctrl_params power_ctrl_params_def;
+
struct lchan_power_ctrl_state {
+ /* Dynamic Power Control parameters (NULL in static mode) */
+ const struct gsm_power_ctrl_params *dpc_params;
+
+ /* Depending on the context (MS or BS power control), fields 'current' and 'max'
+ * reflect either the MS power level (magic numbers), or BS Power reduction level
+ * (attenuation, in dB). */
uint8_t current;
uint8_t max;
bool fixed;
@@ -319,10 +374,14 @@ struct gsm_lchan {
/* RTP header Marker bit to indicate beginning of speech after pause */
bool rtp_tx_marker;
- /* MS/BS power control */
+ /* MS/BS power control state */
struct lchan_power_ctrl_state ms_power_ctrl;
struct lchan_power_ctrl_state bs_power_ctrl;
+ /* MS/BS Dynamic Power Control parameters */
+ struct gsm_power_ctrl_params ms_dpc_params;
+ struct gsm_power_ctrl_params bs_dpc_params;
+
struct msgb *pending_rel_ind_msg;
/* ECU (Error Concealment Unit) state */
diff --git a/src/common/bts.c b/src/common/bts.c
index ba244973..de079577 100644
--- a/src/common/bts.c
+++ b/src/common/bts.c
@@ -330,7 +330,7 @@ int bts_init(struct gsm_bts *bts)
bts->rtp_port_range_next = bts->rtp_port_range_start;
bts->rtp_ip_dscp = -1;
- /* Default UL/DL power control parameters */
+ /* Default UL/DL power control parameters (legacy) */
bts->ul_power_ctrl = bts->dl_power_ctrl = \
(struct bts_power_ctrl_params) {
.target_dbm = -75,
@@ -346,6 +346,10 @@ int bts_init(struct gsm_bts *bts)
}
};
+ /* Default (fall-back) MS/BS Power control parameters */
+ bts->bs_dpc_params = power_ctrl_params_def;
+ bts->ms_dpc_params = power_ctrl_params_def;
+
/* configurable via OML */
bts->load.ccch.load_ind_period = 112;
load_timer_start(bts);
diff --git a/src/common/bts_trx.c b/src/common/bts_trx.c
index 38fb90a2..9fc18e46 100644
--- a/src/common/bts_trx.c
+++ b/src/common/bts_trx.c
@@ -113,6 +113,10 @@ struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts)
if (trx->nr != 0)
trx->nominal_power = bts->c0->nominal_power;
+ /* Default (fall-back) Dynamic Power Control parameters */
+ trx->bs_dpc_params = &bts->bs_dpc_params;
+ trx->ms_dpc_params = &bts->ms_dpc_params;
+
llist_add_tail(&trx->list, &bts->trx_list);
return trx;
diff --git a/src/common/gsm_data.c b/src/common/gsm_data.c
index 978edc45..44ed7e95 100644
--- a/src/common/gsm_data.c
+++ b/src/common/gsm_data.c
@@ -420,3 +420,31 @@ int lchan2ecu_codec(const struct gsm_lchan *lchan)
return -1;
}
}
+
+/* Default MS/BS Power Control parameters (see 3GPP TS 45.008, table A.1) */
+const struct gsm_power_ctrl_params power_ctrl_params_def = {
+ /* Power increasing/reducing step size */
+ .inc_step_size_db = 4, /* FIXME: PWR_RAISE_MAX_DB */
+ .red_step_size_db = 8, /* FIXME: PWR_LOWER_MAX_DB */
+
+ /* RxLev measurement parameters */
+ .rxlev_meas = {
+ /* Thresholds for RxLev (see 3GPP TS 45.008, A.3.2.1) */
+ .lower_thresh = 32, /* L_RXLEV_XX_P (-78 dBm) */
+ .upper_thresh = 38, /* U_RXLEV_XX_P (-72 dBm) */
+
+ /* NOTE: only Osmocom specific EWMA is supported */
+ .algo = GSM_PWR_CTRL_MEAS_AVG_ALGO_OSMO_EWMA,
+ .ewma.alpha = 50, /* Smoothing factor 50% */
+ },
+
+ /* RxQual measurement parameters */
+ .rxqual_meas = {
+ /* Thresholds for RxQual (see 3GPP TS 45.008, A.3.2.1) */
+ .lower_thresh = 3, /* U_RXQUAL_XX_P (0.8% <= BER < 1.6%) */
+ .upper_thresh = 0, /* L_RXQUAL_XX_P (BER < 0.2%) */
+
+ /* FIXME: RxQual averaging is not yet implemented */
+ .algo = GSM_PWR_CTRL_MEAS_AVG_ALGO_NONE,
+ },
+};