aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKirill Zakharenko <earwin@gmail.com>2020-05-06 02:58:08 +0300
committerKirill Zakharenko <earwin@gmail.com>2020-05-06 02:58:08 +0300
commitb4b48947533c0eb6319eb66c3f8e07b20b81dc78 (patch)
tree50102d7d79cdfce549311b7d4f962a9927476039
parenta5247d871c305e4b9941835a8636fe36bb93a856 (diff)
parent7ab23b75afe9d095f30776c6778451d6fc107e79 (diff)
Merge master into fairwaves/production
-rw-r--r--include/osmocom/bsc/abis_om2000.h3
-rw-r--r--include/osmocom/bsc/gsm_data.h12
-rw-r--r--src/osmo-bsc/abis_om2000.c47
-rw-r--r--src/osmo-bsc/abis_om2000_vty.c36
-rw-r--r--src/osmo-bsc/lchan_fsm.c2
-rw-r--r--src/osmo-bsc/lchan_rtp_fsm.c8
6 files changed, 88 insertions, 20 deletions
diff --git a/include/osmocom/bsc/abis_om2000.h b/include/osmocom/bsc/abis_om2000.h
index 49e8510aa..0d48c0c2f 100644
--- a/include/osmocom/bsc/abis_om2000.h
+++ b/include/osmocom/bsc/abis_om2000.h
@@ -24,6 +24,7 @@
enum abis_om2k_mo_cls {
OM2K_MO_CLS_TRXC = 0x01,
+ OM2K_MO_CLS_TG = 0x02,
OM2K_MO_CLS_TS = 0x03,
OM2K_MO_CLS_TF = 0x04,
OM2K_MO_CLS_IS = 0x05,
@@ -112,7 +113,9 @@ int abis_om2k_tx_test_req(struct gsm_bts *bts, const struct abis_om2k_mo *mo);
int abis_om2k_tx_op_info(struct gsm_bts *bts, const struct abis_om2k_mo *mo,
uint8_t operational);
int abis_om2k_tx_cap_req(struct gsm_bts *bts, const struct abis_om2k_mo *mo);
+int abis_om2k_tx_arb(struct gsm_bts *bts, struct abis_om2k_mo *mo, uint16_t req, uint8_t *buf, int buf_len);
int abis_om2k_tx_is_conf_req(struct gsm_bts *bts);
+int abis_om2k_tx_con_conf_req(struct gsm_bts *bts);
int abis_om2k_tx_tf_conf_req(struct gsm_bts *bts);
int abis_om2k_tx_rx_conf_req(struct gsm_bts_trx *trx);
int abis_om2k_tx_tx_conf_req(struct gsm_bts_trx *trx);
diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h
index 9a1db07e5..6996905a4 100644
--- a/include/osmocom/bsc/gsm_data.h
+++ b/include/osmocom/bsc/gsm_data.h
@@ -1138,12 +1138,12 @@ struct gsm_bts {
} rbs2000;
struct {
uint8_t bts_type;
- unsigned int configured:1,
- skip_reset:1,
- no_loc_rel_cnf:1,
- bts_reset_timer_cnf,
- did_reset:1,
- wait_reset:1;
+ unsigned int configured:1, /* we sent the config data request */
+ skip_reset:1, /* skip reset at bootstrap */
+ no_loc_rel_cnf:1, /* don't wait for RSL REL CONF */
+ bts_reset_timer_cnf, /* timer for BTS RESET */
+ did_reset:1, /* we received a RESET ACK */
+ wait_reset:1; /* we are waiting for reset to complete */
struct osmo_timer_list reset_timer;
} nokia;
};
diff --git a/src/osmo-bsc/abis_om2000.c b/src/osmo-bsc/abis_om2000.c
index f8efa3990..c32a5fa9a 100644
--- a/src/osmo-bsc/abis_om2000.c
+++ b/src/osmo-bsc/abis_om2000.c
@@ -192,6 +192,10 @@ enum abis_om2k_msgtype {
OM2K_MSGT_TX_CONF_RES_NACK = 0x00b5,
OM2K_MSGT_TX_CONF_RES = 0x00b6,
+ OM2K_MSGT_CAPA_HW_INFOS_REP_ACK = 0x00e4,
+ OM2K_MSGT_CAPA_HW_INFOS_REP_NACK = 0x00e5,
+ OM2K_MSGT_CAPA_HW_INFOS_REP = 0x00e6,
+
OM2K_MSGT_CAPA_REQ = 0x00e8,
OM2K_MSGT_CAPA_REQ_ACK = 0x00ea,
OM2K_MSGT_CAPA_REQ_REJ = 0x00eb,
@@ -698,6 +702,7 @@ static const struct value_string om2k_attr_vals[] = {
const struct value_string om2k_mo_class_short_vals[] = {
{ 0x01, "TRXC" },
+ { 0x02, "TG" },
{ 0x03, "TS" },
{ 0x04, "TF" },
{ 0x05, "IS" },
@@ -1049,7 +1054,7 @@ static int abis_om2k_cal_time_resp(struct gsm_bts *bts)
}
static int abis_om2k_tx_simple(struct gsm_bts *bts, const struct abis_om2k_mo *mo,
- uint8_t msg_type)
+ uint16_t msg_type)
{
struct msgb *msg = om2k_msgb_alloc();
struct abis_om2k_hdr *o2k;
@@ -1128,6 +1133,21 @@ int abis_om2k_tx_cap_req(struct gsm_bts *bts, const struct abis_om2k_mo *mo)
return abis_om2k_tx_simple(bts, mo, OM2K_MSGT_CAPA_REQ);
}
+int abis_om2k_tx_arb(struct gsm_bts *bts, struct abis_om2k_mo *mo,
+ uint16_t req, uint8_t *buf, int buf_len)
+{
+ struct msgb *msg = om2k_msgb_alloc();
+ struct abis_om2k_hdr *o2k;
+
+ o2k = (struct abis_om2k_hdr *) msgb_put(msg, sizeof(*o2k));
+ fill_om2k_hdr(o2k, mo, req);
+
+ if (buf_len)
+ memcpy(msgb_put(msg, buf_len), buf, buf_len);
+
+ return abis_om2k_sendmsg(bts, msg);
+}
+
static void om2k_fill_is_conn_grp(struct om2k_is_conn_grp *grp, uint16_t icp1,
uint16_t icp2, uint8_t cont_idx)
{
@@ -1463,10 +1483,14 @@ int abis_om2k_tx_ts_conf_req(struct gsm_bts_trx_ts *ts)
msgb_tv_put(msg, OM2K_DEI_LSC_FILT_TIME, 10); /* units of 100ms */
msgb_tv_put(msg, OM2K_DEI_CALL_SUPV_TIME, 8);
msgb_tv_put(msg, OM2K_DEI_ENCR_ALG, 0x00);
- /* Not sure what those below mean */
- msgb_tv_put(msg, 0x9e, 0x00);
- msgb_tv_put(msg, 0x9f, 0x37);
- msgb_tv_put(msg, 0xa0, 0x01);
+
+ /* Those are only use for superchannel */
+ if (ts->trx->bts->rbs2000.use_superchannel) {
+ msgb_tv_put(msg, OM2K_DEI_CONFIG_TYPE, 0x00); /* 1-bit, lsb */
+ msgb_tv_put(msg, OM2K_DEI_JITTER_SIZE, 0x37);
+ msgb_tv_put(msg, OM2K_DEI_PACKING_ALGO, 0x01);
+ }
+
break;
}
@@ -1864,8 +1888,9 @@ struct osmo_fsm_inst *om2k_mo_fsm_start(struct osmo_fsm_inst *parent,
struct om2k_mo_fsm_priv *omfp;
char idbuf[64];
- snprintf(idbuf, sizeof(idbuf), "%s-%s", parent->id,
- om2k_mo_name(&mo->addr));
+ snprintf(idbuf, sizeof(idbuf), "%s-%s-%02x-%02x-%02x", parent->id,
+ get_value_string(om2k_mo_class_short_vals, mo->addr.class),
+ mo->addr.bts, mo->addr.assoc_so, mo->addr.inst);
fi = osmo_fsm_inst_alloc_child_id(&om2k_mo_fsm, parent,
term_event, idbuf);
@@ -2127,7 +2152,7 @@ struct osmo_fsm_inst *om2k_trx_fsm_start(struct osmo_fsm_inst *parent,
struct om2k_trx_fsm_priv *otfp;
char idbuf[32];
- snprintf(idbuf, sizeof(idbuf), "%u/%u", trx->bts->nr, trx->nr);
+ snprintf(idbuf, sizeof(idbuf), "%u-%u", trx->bts->nr, trx->nr);
fi = osmo_fsm_inst_alloc_child_id(&om2k_trx_fsm, parent, term_event,
idbuf);
@@ -2709,9 +2734,15 @@ int abis_om2k_rcvmsg(struct msgb *msg)
case OM2K_MSGT_TEST_RES:
rc = abis_om2k_tx_simple(bts, &o2h->mo, OM2K_MSGT_TEST_RES_ACK);
break;
+ case OM2K_MSGT_CAPA_HW_INFOS_REP:
+ rc = abis_om2k_tx_simple(bts, &o2h->mo, OM2K_MSGT_CAPA_HW_INFOS_REP_ACK);
+ break;
case OM2K_MSGT_CAPA_RES:
rc = abis_om2k_tx_simple(bts, &o2h->mo, OM2K_MSGT_CAPA_RES_ACK);
break;
+ case 0x0136: /* Unknown ... something for MCTR */
+ rc = abis_om2k_tx_simple(bts, &o2h->mo, 0x0134);
+ break;
/* ERrors */
case OM2K_MSGT_START_REQ_REJ:
case OM2K_MSGT_CONNECT_REJ:
diff --git a/src/osmo-bsc/abis_om2000_vty.c b/src/osmo-bsc/abis_om2000_vty.c
index 3ae870e8a..972fff04a 100644
--- a/src/osmo-bsc/abis_om2000_vty.c
+++ b/src/osmo-bsc/abis_om2000_vty.c
@@ -66,13 +66,15 @@ static int dummy_config_write(struct vty *v)
}
/* FIXME: auto-generate those strings from the value_string lists */
-#define OM2K_OBJCLASS_VTY "(trxc|ts|tf|is|con|dp|cf|tx|rx)"
+#define OM2K_OBJCLASS_VTY "(trxc|tg|ts|tf|is|con|dp|mctr|cf|tx|rx)"
#define OM2K_OBJCLASS_VTY_HELP "TRX Controller\n" \
+ "Trunk Group\n" \
"Timeslot\n" \
"Timing Function\n" \
"Interface Switch\n" \
"Abis Concentrator\n" \
"Digital Path\n" \
+ "Multi Carrier Transceiver\n" \
"Central Function\n" \
"Transmitter\n" \
"Receiver\n"
@@ -253,6 +255,34 @@ DEFUN(om2k_cap_req, om2k_cap_req_cmd,
return CMD_SUCCESS;
}
+DEFUN(om2k_arb, om2k_arb_cmd,
+ "arbitrary <0-65535> [HEXSTRING]",
+ "Send arbitrary OM2k message\n"
+ "Command identifier\n"
+ "Hex Encoded payload\n")
+{
+ struct oml_node_state *oms = vty->index;
+ uint8_t buf[128];
+ int rc;
+ int cmd = atoi(argv[0]);
+
+ if (argc >= 2) {
+ rc = osmo_hexparse(argv[1], buf, sizeof(buf));
+ if (rc < 0 || rc > sizeof(buf)) {
+ vty_out(vty, "Error parsing HEXSTRING%s", VTY_NEWLINE);
+ return CMD_WARNING;
+ }
+ } else {
+ rc = 0;
+ }
+
+ abis_om2k_tx_arb(oms->bts, &oms->mo, cmd, buf, rc);
+
+ return CMD_SUCCESS;
+}
+
+
+
static struct con_group *con_group_find_or_create(struct gsm_bts *bts, uint8_t cg)
{
struct con_group *ent;
@@ -492,6 +522,9 @@ DEFUN(om2k_conf_req, om2k_conf_req_cmd,
case OM2K_MO_CLS_IS:
abis_om2k_tx_is_conf_req(bts);
break;
+ case OM2K_MO_CLS_CON:
+ abis_om2k_tx_con_conf_req(bts);
+ break;
case OM2K_MO_CLS_TS:
trx = gsm_bts_trx_by_nr(bts, oms->mo.assoc_so);
if (!trx) {
@@ -590,6 +623,7 @@ int abis_om2k_vty_init(void)
install_element(OM2K_NODE, &om2k_test_cmd);
install_element(OM2K_NODE, &om2k_cap_req_cmd);
install_element(OM2K_NODE, &om2k_conf_req_cmd);
+ install_element(OM2K_NODE, &om2k_arb_cmd);
install_node(&om2k_con_group_node, dummy_config_write);
install_element(OM2K_CON_GROUP_NODE, &cfg_om2k_con_path_dec_cmd);
diff --git a/src/osmo-bsc/lchan_fsm.c b/src/osmo-bsc/lchan_fsm.c
index 9ca73dfd5..f55fbf97c 100644
--- a/src/osmo-bsc/lchan_fsm.c
+++ b/src/osmo-bsc/lchan_fsm.c
@@ -210,7 +210,7 @@ static void lchan_on_fully_established(struct gsm_lchan *lchan)
struct osmo_tdef_state_timeout lchan_fsm_timeouts[32] = {
[LCHAN_ST_WAIT_TS_READY] = { .T=23001 },
- [LCHAN_ST_WAIT_ACTIV_ACK] = { .T=23002 },
+ [LCHAN_ST_WAIT_ACTIV_ACK] = { .T=-23002 },
[LCHAN_ST_WAIT_RLL_RTP_ESTABLISH] = { .T=3101 },
[LCHAN_ST_WAIT_RLL_RTP_RELEASED] = { .T=3109 },
[LCHAN_ST_WAIT_BEFORE_RF_RELEASE] = { .T=3111 },
diff --git a/src/osmo-bsc/lchan_rtp_fsm.c b/src/osmo-bsc/lchan_rtp_fsm.c
index da09aec86..25aca1409 100644
--- a/src/osmo-bsc/lchan_rtp_fsm.c
+++ b/src/osmo-bsc/lchan_rtp_fsm.c
@@ -42,10 +42,10 @@ struct gsm_lchan *lchan_rtp_fi_lchan(struct osmo_fsm_inst *fi)
}
struct osmo_tdef_state_timeout lchan_rtp_fsm_timeouts[32] = {
- [LCHAN_RTP_ST_WAIT_MGW_ENDPOINT_AVAILABLE] = { .T=23004 },
- [LCHAN_RTP_ST_WAIT_IPACC_CRCX_ACK] = { .T=23005 },
- [LCHAN_RTP_ST_WAIT_IPACC_MDCX_ACK] = { .T=23006 },
- [LCHAN_RTP_ST_WAIT_MGW_ENDPOINT_CONFIGURED] = { .T=23004 },
+ [LCHAN_RTP_ST_WAIT_MGW_ENDPOINT_AVAILABLE] = { .T=-23004 },
+ [LCHAN_RTP_ST_WAIT_IPACC_CRCX_ACK] = { .T=-23005 },
+ [LCHAN_RTP_ST_WAIT_IPACC_MDCX_ACK] = { .T=-23006 },
+ [LCHAN_RTP_ST_WAIT_MGW_ENDPOINT_CONFIGURED] = { .T=-23004 },
};
/* Transition to a state, using the T timer defined in lchan_rtp_fsm_timeouts.