70 lines
1.5 KiB
C
70 lines
1.5 KiB
C
/* B-channel handler management. Handles registration of and routing to
|
|
* various potentially registered B-channel handlers / routes
|
|
*
|
|
* (C) 2022 by Harald Welte <laforge@gnumonks.org>
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
|
*/
|
|
|
|
#include <osmocom/core/utils.h>
|
|
#include <osmocom/core/linuxlist.h>
|
|
#include <string.h>
|
|
#include <talloc.h>
|
|
|
|
#include "bchan.h"
|
|
|
|
static LLIST_HEAD(g_handlers);
|
|
static LLIST_HEAD(g_routes);
|
|
|
|
struct bchan_handler *bchan_handler_find(const char *name)
|
|
{
|
|
struct bchan_handler *bch;
|
|
|
|
llist_for_each_entry(bch, &g_handlers, list) {
|
|
if (!strcmp(bch->name, name))
|
|
return bch;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void bchan_handler_register(struct bchan_handler *hdlr)
|
|
{
|
|
OSMO_ASSERT(!bchan_handler_find(hdlr->name));
|
|
OSMO_ASSERT(hdlr->list.next == NULL);
|
|
|
|
llist_add_tail(&hdlr->list, &g_handlers);
|
|
}
|
|
|
|
|
|
void bchan_route_add(int cip, const char *msn, const char *hdlr_name)
|
|
{
|
|
struct bchan_handler *bch = bchan_handler_find(hdlr_name);
|
|
struct bchan_route *rt;
|
|
|
|
OSMO_ASSERT(bch);
|
|
|
|
rt = talloc_zero(g_ctx, struct bchan_route);
|
|
rt->cip = cip;
|
|
rt->msn = talloc_strdup(rt, msn);
|
|
rt->hdlr = bch;
|
|
|
|
llist_add_tail(&rt->list, &g_routes);
|
|
}
|
|
|
|
|
|
/* find b-channel handler for given CIP + MSN */
|
|
struct bchan_handler *bchan_handler_for_call(uint16_t cip, const char *msn)
|
|
{
|
|
struct bchan_route *route;
|
|
|
|
llist_for_each_entry(route, &g_routes, list) {
|
|
if (route->cip != -1 && route->cip != cip)
|
|
continue;
|
|
if (route->msn && strcmp(route->msn, msn))
|
|
continue;
|
|
return route->hdlr;
|
|
}
|
|
|
|
return NULL;
|
|
}
|