diff options
Diffstat (limited to 'src/osmo-bsc')
-rw-r--r-- | src/osmo-bsc/abis_om2000.c | 47 | ||||
-rw-r--r-- | src/osmo-bsc/abis_om2000_vty.c | 36 | ||||
-rw-r--r-- | src/osmo-bsc/lchan_fsm.c | 2 | ||||
-rw-r--r-- | src/osmo-bsc/lchan_rtp_fsm.c | 8 |
4 files changed, 79 insertions, 14 deletions
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. |