diff options
Diffstat (limited to 'src/common/oml_router_ctrl.c')
-rw-r--r-- | src/common/oml_router_ctrl.c | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/common/oml_router_ctrl.c b/src/common/oml_router_ctrl.c new file mode 100644 index 00000000..018c5041 --- /dev/null +++ b/src/common/oml_router_ctrl.c @@ -0,0 +1,95 @@ + +#include <osmocom/core/msgb.h> +#include <osmocom/gsm/protocol/ipaccess.h> + +#include <osmo-bts/oml_routing.h> +#include <osmo-bts/oml_router_ctrl.h> +#include <osmo-bts/gsm_data.h> + +int abis_orc_sendmsg(struct msgb *msg) +{ + struct gsm_bts *bts = msg->trx->bts; + struct ipaccess_head_ext *he; + + he = (struct ipaccess_head_ext *) msgb_push(msg, sizeof(*he)); + he->proto = IPAC_PROTO_EXT_ORC; + + /* osmo-bts uses msg->trx internally, but libosmo-abis uses the + * signalling like at msg->dst */ + msg->dst = bts->osmo_link; + return abis_sendmsg(msg); +} + +static struct msgb *orc_msgb_alloc(void) +{ + return msgb_alloc_headroom(1000+40, 40, "OML Router Ctrl"); +} + +static struct msgb *__gen_orc_route(const struct oml_route *rt_in, int del) +{ + struct msgb *msg = orc_msgb_alloc(); + struct osmo_omlrctrl_hdr *oh; + struct oml_route *rt; + + oh = (struct osmo_omlrctrl_hdr *) msgb_put(msg, sizeof(*oh)); + rt = (struct oml_route *) msgb_put(msg, sizeof(*rt)); + + oh->version = 0; + if (del) + oh->msg_type = OSMO_ORC_MSGT_ROUTE_DEL_REQ; + else + oh->msg_type = OSMO_ORC_MSGT_ROUTE_ADD_REQ; + oh->data_len = sizeof(*rt); + + memcpy(rt, rt_in, sizeof (*rt)); + + return msg; +} + +struct msgb *gen_orc_route_add(const struct oml_route *rt_in) +{ + return __gen_orc_route(rt_in, 0); +} + +struct msgb *gen_orc_route_del(const struct oml_route *rt_in) +{ + return __gen_orc_route(rt_in, 1); +} + +int orc_add_route_mo(struct gsm_abis_mo *mo) +{ + struct oml_route rt; + struct msgb *msg; + + rt.flags = OML_RTF_MDISC | OML_RTF_OBJ_CLASS; + rt.key.mdisc = ABIS_OM_MDISC_FOM; + rt.key.obj_class = mo->obj_class; + + memcpy(&rt.key.obj_inst, &mo->obj_inst, sizeof(rt.key.obj_inst)); + + /* do w really need this? why not simply register for 0xFF ... */ + switch (mo->obj_class) { + case NM_OC_SITE_MANAGER: + break; + case NM_OC_BTS: + case NM_OC_GPRS_NSE: + case NM_OC_GPRS_CELL: + rt.flags |= OML_RTF_BTS_NR; + break; + case NM_OC_RADIO_CARRIER: + case NM_OC_BASEB_TRANSC: + case NM_OC_GPRS_NSVC: + rt.flags |= OML_RTF_BTS_NR | OML_RTF_TRX_NR; + break; + case NM_OC_CHANNEL: + rt.flags |= OML_RTF_BTS_NR | OML_RTF_TRX_NR | OML_RTF_TS_NR; + break; + } + + msg = gen_orc_route_add(&rt); + if (!msg) + return -1; + + msg->trx = mo->bts->c0; + return abis_orc_sendmsg(msg); +} |