OM2000: Negotiation Resposne, send START on OML-up event
This commit is contained in:
parent
bc867d9a17
commit
7354107946
|
@ -22,7 +22,18 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
struct abis_om2k_mo {
|
||||||
|
uint8_t class;
|
||||||
|
uint8_t bts;
|
||||||
|
uint8_t assoc_so;
|
||||||
|
uint8_t inst;
|
||||||
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
int abis_om2k_rcvmsg(struct msgb *msg);
|
int abis_om2k_rcvmsg(struct msgb *msg);
|
||||||
|
|
||||||
|
extern const struct abis_om2k_mo om2k_mo_cf;
|
||||||
|
|
||||||
|
int abis_om2k_tx_reset_cmd(struct gsm_bts *bts, struct abis_om2k_mo *mo);
|
||||||
|
int abis_om2k_tx_start_req(struct gsm_bts *bts, struct abis_om2k_mo *mo);
|
||||||
|
|
||||||
#endif /* OPENBCS_ABIS_OM2K_H */
|
#endif /* OPENBCS_ABIS_OM2K_H */
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#include <openbsc/gsm_data.h>
|
#include <openbsc/gsm_data.h>
|
||||||
#include <openbsc/debug.h>
|
#include <openbsc/debug.h>
|
||||||
#include <openbsc/abis_nm.h>
|
#include <openbsc/abis_nm.h>
|
||||||
|
#include <openbsc/abis_om2000.h>
|
||||||
#include <openbsc/signal.h>
|
#include <openbsc/signal.h>
|
||||||
|
|
||||||
#define OM_ALLOC_SIZE 1024
|
#define OM_ALLOC_SIZE 1024
|
||||||
|
@ -48,13 +49,6 @@
|
||||||
* abis_om2k_sendmsg()
|
* abis_om2k_sendmsg()
|
||||||
*/
|
*/
|
||||||
|
|
||||||
struct abis_om2k_mo {
|
|
||||||
uint8_t class;
|
|
||||||
uint8_t bts;
|
|
||||||
uint8_t assoc_so;
|
|
||||||
uint8_t inst;
|
|
||||||
} __attribute__ ((packed));
|
|
||||||
|
|
||||||
struct abis_om2k_hdr {
|
struct abis_om2k_hdr {
|
||||||
struct abis_om_hdr om;
|
struct abis_om_hdr om;
|
||||||
uint16_t msg_type;
|
uint16_t msg_type;
|
||||||
|
@ -115,6 +109,8 @@ enum abis_om2k_msgtype {
|
||||||
enum abis_om2k_dei {
|
enum abis_om2k_dei {
|
||||||
OM2K_DEI_CAL_TIME = 0x0d,
|
OM2K_DEI_CAL_TIME = 0x0d,
|
||||||
OM2K_DEI_OP_INFO = 0x2e,
|
OM2K_DEI_OP_INFO = 0x2e,
|
||||||
|
OM2K_DEI_NEGOT_REC1 = 0x90,
|
||||||
|
OM2K_DEI_NEGOT_REC2 = 0x91,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum abis_om2k_mo_cls {
|
enum abis_om2k_mo_cls {
|
||||||
|
@ -487,7 +483,7 @@ static char *om2k_mo_name(const struct abis_om2k_mo *mo)
|
||||||
return mo_buf;
|
return mo_buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct abis_om2k_mo om2k_mo_cf = { OM2K_MO_CLS_CF, 0, 0xFF, 0 };
|
const struct abis_om2k_mo om2k_mo_cf = { OM2K_MO_CLS_CF, 0, 0xFF, 0 };
|
||||||
|
|
||||||
static int abis_om2k_cal_time_resp(struct gsm_bts *bts)
|
static int abis_om2k_cal_time_resp(struct gsm_bts *bts)
|
||||||
{
|
{
|
||||||
|
@ -522,9 +518,22 @@ static int abis_om2k_tx_simple(struct gsm_bts *bts, struct abis_om2k_mo *mo,
|
||||||
o2k = (struct abis_om2k_hdr *) msgb_put(msg, sizeof(*o2k));
|
o2k = (struct abis_om2k_hdr *) msgb_put(msg, sizeof(*o2k));
|
||||||
fill_om2k_hdr(o2k, mo, msg_type, 0);
|
fill_om2k_hdr(o2k, mo, msg_type, 0);
|
||||||
|
|
||||||
|
DEBUGP(DNM, "Tx MO=%s %s\n", om2k_mo_name(mo),
|
||||||
|
get_value_string(om2k_msgcode_vals, msg_type));
|
||||||
|
|
||||||
return abis_om2k_sendmsg(bts, msg);
|
return abis_om2k_sendmsg(bts, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int abis_om2k_tx_reset_cmd(struct gsm_bts *bts, struct abis_om2k_mo *mo)
|
||||||
|
{
|
||||||
|
return abis_om2k_tx_simple(bts, mo, OM2K_MSGT_RESET_CMD);
|
||||||
|
}
|
||||||
|
|
||||||
|
int abis_om2k_tx_start_req(struct gsm_bts *bts, struct abis_om2k_mo *mo)
|
||||||
|
{
|
||||||
|
return abis_om2k_tx_simple(bts, mo, OM2K_MSGT_START_REQ);
|
||||||
|
}
|
||||||
|
|
||||||
static int abis_om2k_tx_op_info(struct gsm_bts *bts, struct abis_om2k_mo *mo,
|
static int abis_om2k_tx_op_info(struct gsm_bts *bts, struct abis_om2k_mo *mo,
|
||||||
uint8_t operational)
|
uint8_t operational)
|
||||||
{
|
{
|
||||||
|
@ -536,15 +545,36 @@ static int abis_om2k_tx_op_info(struct gsm_bts *bts, struct abis_om2k_mo *mo,
|
||||||
|
|
||||||
msgb_tv_put(msg, OM2K_DEI_OP_INFO, operational);
|
msgb_tv_put(msg, OM2K_DEI_OP_INFO, operational);
|
||||||
|
|
||||||
|
DEBUGP(DNM, "Tx MO=%s %s\n", om2k_mo_name(mo),
|
||||||
|
get_value_string(om2k_msgcode_vals, OM2K_MSGT_OP_INFO));
|
||||||
|
|
||||||
return abis_om2k_sendmsg(bts, msg);
|
return abis_om2k_sendmsg(bts, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int abis_om2k_tx_negot_req_ack(struct gsm_bts *bts, struct abis_om2k_mo *mo,
|
||||||
|
uint8_t *data, unsigned int 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, OM2K_MSGT_NEGOT_REQ_ACK, 2+len);
|
||||||
|
|
||||||
|
msgb_tlv_put(msg, OM2K_DEI_NEGOT_REC2, len, data);
|
||||||
|
|
||||||
|
DEBUGP(DNM, "Tx MO=%s %s\n", om2k_mo_name(mo),
|
||||||
|
get_value_string(om2k_msgcode_vals, OM2K_MSGT_NEGOT_REQ_ACK));
|
||||||
|
|
||||||
|
return abis_om2k_sendmsg(bts, msg);
|
||||||
|
}
|
||||||
|
|
||||||
static int om2k_rx_negot_req(struct msgb *msg)
|
static int om2k_rx_negot_req(struct msgb *msg)
|
||||||
{
|
{
|
||||||
struct abis_om2k_hdr *o2h = msgb_l2(msg);
|
struct abis_om2k_hdr *o2h = msgb_l2(msg);
|
||||||
|
uint8_t *negot_data = o2h->data+2;
|
||||||
|
uint8_t negot_len = o2h->data[1];
|
||||||
|
|
||||||
/* FIXME */
|
return abis_om2k_tx_negot_req_ack(msg->trx->bts, &o2h->mo, negot_data, negot_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int om2k_rx_start_res(struct msgb *msg)
|
static int om2k_rx_start_res(struct msgb *msg)
|
||||||
|
@ -563,7 +593,7 @@ static int om2k_rx_op_info(struct msgb *msg)
|
||||||
struct abis_om2k_hdr *o2h = msgb_l2(msg);
|
struct abis_om2k_hdr *o2h = msgb_l2(msg);
|
||||||
uint8_t op_info = o2h->data[1];
|
uint8_t op_info = o2h->data[1];
|
||||||
|
|
||||||
DEBUGP(DNM, "MO=%s OPERATIONAL INFO: %u\n", om2k_mo_name(&o2h->mo), op_info);
|
DEBUGP(DNM, "Rx MO=%s OPERATIONAL INFO: %u\n", om2k_mo_name(&o2h->mo), op_info);
|
||||||
|
|
||||||
return abis_om2k_tx_simple(msg->trx->bts, &o2h->mo, OM2K_MSGT_OP_INFO_ACK);
|
return abis_om2k_tx_simple(msg->trx->bts, &o2h->mo, OM2K_MSGT_OP_INFO_ACK);
|
||||||
}
|
}
|
||||||
|
@ -597,7 +627,7 @@ int abis_om2k_rcvmsg(struct msgb *msg)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUGP(DNM, "MO=%s %s (%s)\n", om2k_mo_name(&o2h->mo),
|
DEBUGP(DNM, "Rx MO=%s %s (%s)\n", om2k_mo_name(&o2h->mo),
|
||||||
get_value_string(om2k_msgcode_vals, msg_type),
|
get_value_string(om2k_msgcode_vals, msg_type),
|
||||||
hexdump(msg->l2h, msgb_l2len(msg)));
|
hexdump(msg->l2h, msgb_l2len(msg)));
|
||||||
|
|
||||||
|
|
|
@ -40,6 +40,7 @@ static struct gsm_bts_model model_rbs2k = {
|
||||||
static void bootstrap_om_rbs2k(struct gsm_bts *bts)
|
static void bootstrap_om_rbs2k(struct gsm_bts *bts)
|
||||||
{
|
{
|
||||||
LOGP(DNM, LOGL_NOTICE, "bootstrapping OML for BTS %u\n", bts->nr);
|
LOGP(DNM, LOGL_NOTICE, "bootstrapping OML for BTS %u\n", bts->nr);
|
||||||
|
abis_om2k_tx_start_req(bts, &om2k_mo_cf);
|
||||||
/* FIXME */
|
/* FIXME */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue