[E1 INPUT] explicitly configure the E1 input driver for each line
This introduces a new 'e1_input' config node with a command to be used like: e1_line 0 driver misdn This allows us to have different input drivers in the future
This commit is contained in:
parent
760d471e37
commit
e76bea0fc3
|
@ -114,11 +114,17 @@ struct e1inp_line {
|
|||
/* register a driver with the E1 core */
|
||||
int e1inp_driver_register(struct e1inp_driver *drv);
|
||||
|
||||
/* fine a previously registered driver */
|
||||
struct e1inp_driver *e1inp_driver_find(const char *name);
|
||||
|
||||
/* register a line with the E1 core */
|
||||
int e1inp_line_register(struct e1inp_line *line);
|
||||
|
||||
/* ensure a certain line exists, return pointer to it */
|
||||
struct e1inp_line *e1inp_line_get_create(u_int8_t e1_nr);
|
||||
/* get a line by its ID */
|
||||
struct e1inp_line *e1inp_line_get(u_int8_t e1_nr);
|
||||
|
||||
/* create a line in the E1 input core */
|
||||
struct e1inp_line *e1inp_line_create(u_int8_t e1_nr, const char *driver_name);
|
||||
|
||||
/* find a sign_link for given TEI and SAPI in a TS */
|
||||
struct e1inp_sign_link *
|
||||
|
@ -169,4 +175,7 @@ int ipaccess_setup(struct gsm_network *gsmnet);
|
|||
extern struct llist_head e1inp_driver_list;
|
||||
extern struct llist_head e1inp_line_list;
|
||||
|
||||
int e1inp_vty_init(void);
|
||||
void e1inp_init(void);
|
||||
|
||||
#endif /* _E1_INPUT_H */
|
||||
|
|
|
@ -29,6 +29,7 @@ enum bsc_vty_node {
|
|||
NS_NODE,
|
||||
BSSGP_NODE,
|
||||
OML_NODE,
|
||||
E1INP_NODE,
|
||||
NAT_NODE,
|
||||
NAT_BSC_NODE,
|
||||
MSC_NODE,
|
||||
|
|
|
@ -19,7 +19,8 @@ noinst_LIBRARIES = libbsc.a libmsc.a libvty.a libmgcp.a
|
|||
libbsc_a_SOURCES = abis_rsl.c abis_nm.c gsm_data.c gsm_04_08_utils.c \
|
||||
chan_alloc.c debug.c socket.c abis_nm_vty.c \
|
||||
gsm_subscriber_base.c subchan_demux.c bsc_rll.c transaction.c \
|
||||
trau_frame.c trau_mux.c paging.c e1_config.c e1_input.c \
|
||||
trau_frame.c trau_mux.c paging.c \
|
||||
e1_config.c e1_input.c e1_input_vty.c \
|
||||
input/misdn.c input/ipaccess.c handover_logic.c \
|
||||
talloc_ctx.c system_information.c rest_octets.c \
|
||||
bts_siemens_bs11.c bts_ipaccess_nanobts.c mncc_upqueue.c \
|
||||
|
|
|
@ -238,6 +238,8 @@ int main(int argc, char **argv)
|
|||
bts_model_bs11_init();
|
||||
bts_model_nanobts_init();
|
||||
|
||||
e1inp_init();
|
||||
|
||||
/* enable filters */
|
||||
log_set_all_filter(stderr_target, 1);
|
||||
|
||||
|
|
|
@ -2702,6 +2702,7 @@ int bsc_vty_init(void)
|
|||
install_element(ENABLE_NODE, &pdch_act_cmd);
|
||||
|
||||
abis_nm_vty_init();
|
||||
e1inp_vty_init();
|
||||
|
||||
bsc_vty_init_extra();
|
||||
|
||||
|
|
|
@ -51,7 +51,7 @@ int e1_reconfig_ts(struct gsm_bts_trx_ts *ts)
|
|||
if (!e1_link->e1_ts)
|
||||
return 0;
|
||||
|
||||
line = e1inp_line_get_create(e1_link->e1_nr);
|
||||
line = e1inp_line_get(e1_link->e1_nr);
|
||||
if (!line)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -81,7 +81,7 @@ int e1_reconfig_trx(struct gsm_bts_trx *trx)
|
|||
return -EINVAL;
|
||||
|
||||
/* RSL Link */
|
||||
line = e1inp_line_get_create(e1_link->e1_nr);
|
||||
line = e1inp_line_get(e1_link->e1_nr);
|
||||
if (!line)
|
||||
return -ENOMEM;
|
||||
sign_ts = &line->ts[e1_link->e1_ts-1];
|
||||
|
@ -114,7 +114,7 @@ int e1_reconfig_bts(struct gsm_bts *bts)
|
|||
return -EINVAL;
|
||||
|
||||
/* OML link */
|
||||
line = e1inp_line_get_create(e1_link->e1_nr);
|
||||
line = e1inp_line_get(e1_link->e1_nr);
|
||||
if (!line)
|
||||
return -ENOMEM;
|
||||
sign_ts = &line->ts[e1_link->e1_ts-1];
|
||||
|
|
|
@ -322,7 +322,7 @@ int e1inp_ts_config(struct e1inp_ts *ts, struct e1inp_line *line,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static struct e1inp_line *e1inp_line_get(u_int8_t e1_nr)
|
||||
struct e1inp_line *e1inp_line_get(u_int8_t e1_nr)
|
||||
{
|
||||
struct e1inp_line *e1i_line;
|
||||
|
||||
|
@ -334,6 +334,37 @@ static struct e1inp_line *e1inp_line_get(u_int8_t e1_nr)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
struct e1inp_line *e1inp_line_create(u_int8_t e1_nr, const char *driver_name)
|
||||
{
|
||||
struct e1inp_driver *driver;
|
||||
struct e1inp_line *line;
|
||||
int i;
|
||||
|
||||
line = e1inp_line_get(e1_nr);
|
||||
if (line)
|
||||
return NULL;
|
||||
|
||||
driver = e1inp_driver_find(driver_name);
|
||||
if (!driver)
|
||||
return NULL;
|
||||
|
||||
line = talloc_zero(tall_bsc_ctx, struct e1inp_line);
|
||||
if (!line)
|
||||
return NULL;
|
||||
|
||||
line->driver = driver;
|
||||
|
||||
line->num = e1_nr;
|
||||
for (i = 0; i < NUM_E1_TS; i++) {
|
||||
line->ts[i].num = i+1;
|
||||
line->ts[i].line = line;
|
||||
}
|
||||
llist_add_tail(&line->list, &e1inp_line_list);
|
||||
|
||||
return line;
|
||||
}
|
||||
|
||||
#if 0
|
||||
struct e1inp_line *e1inp_line_get_create(u_int8_t e1_nr)
|
||||
{
|
||||
struct e1inp_line *line;
|
||||
|
@ -356,6 +387,7 @@ struct e1inp_line *e1inp_line_get_create(u_int8_t e1_nr)
|
|||
|
||||
return line;
|
||||
}
|
||||
#endif
|
||||
|
||||
static struct e1inp_ts *e1inp_ts_get(u_int8_t e1_nr, u_int8_t ts_nr)
|
||||
{
|
||||
|
@ -536,10 +568,23 @@ int e1inp_event(struct e1inp_ts *ts, int evt, u_int8_t tei, u_int8_t sapi)
|
|||
/* register a driver with the E1 core */
|
||||
int e1inp_driver_register(struct e1inp_driver *drv)
|
||||
{
|
||||
printf("registering driver %s\n", drv->name);
|
||||
llist_add_tail(&drv->list, &e1inp_driver_list);
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct e1inp_driver *e1inp_driver_find(const char *name)
|
||||
{
|
||||
struct e1inp_driver *drv;
|
||||
|
||||
printf("trying to find driver %s\n", name);
|
||||
llist_for_each_entry(drv, &e1inp_driver_list, list) {
|
||||
if (!strcasecmp(name, drv->name))
|
||||
return drv;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int e1inp_line_update(struct e1inp_line *line)
|
||||
{
|
||||
if (line->driver && line->driver->line_update)
|
||||
|
@ -563,9 +608,13 @@ static int e1i_sig_cb(unsigned int subsys, unsigned int signal,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static __attribute__((constructor)) void on_dso_load_e1_inp(void)
|
||||
void e1inp_misdn_init(void);
|
||||
|
||||
void e1inp_init(void)
|
||||
{
|
||||
tall_sigl_ctx = talloc_named_const(tall_bsc_ctx, 1,
|
||||
"e1inp_sign_link");
|
||||
register_signal_handler(SS_GLOBAL, e1i_sig_cb, NULL);
|
||||
|
||||
e1inp_misdn_init();
|
||||
}
|
||||
|
|
|
@ -0,0 +1,99 @@
|
|||
/* OpenBSC E1 vty interface */
|
||||
/* (C) 2011 by Harald Welte <laforge@gnumonks.org>
|
||||
* All Rights Reserved
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <osmocom/vty/command.h>
|
||||
#include <osmocom/vty/buffer.h>
|
||||
#include <osmocom/vty/vty.h>
|
||||
#include <osmocom/vty/logging.h>
|
||||
#include <osmocom/vty/telnet_interface.h>
|
||||
|
||||
#include <osmocore/linuxlist.h>
|
||||
#include <openbsc/gsm_data.h>
|
||||
#include <openbsc/e1_input.h>
|
||||
#include <osmocore/utils.h>
|
||||
#include <osmocore/gsm_utils.h>
|
||||
#include <osmocore/talloc.h>
|
||||
#include <openbsc/vty.h>
|
||||
#include <openbsc/debug.h>
|
||||
|
||||
#include "../bscconfig.h"
|
||||
|
||||
#define E1_DRIVER_NAMES "(misdn)"
|
||||
#define E1_DRIVER_HELP "mISDN supported E1 Card\n"
|
||||
|
||||
DEFUN(cfg_e1line_driver, cfg_e1_line_driver_cmd,
|
||||
"e1_line <0-255> driver " E1_DRIVER_NAMES,
|
||||
"Configure E1/T1/J1 Line\n" "Line Number\n" "Set driver for this line\n"
|
||||
E1_DRIVER_HELP)
|
||||
{
|
||||
struct e1inp_line *line;
|
||||
int e1_nr = atoi(argv[0]);
|
||||
|
||||
line = e1inp_line_get(e1_nr);
|
||||
if (line) {
|
||||
vty_out(vty, "%% Line %d already exists%s", e1_nr, VTY_NEWLINE);
|
||||
return CMD_WARNING;
|
||||
}
|
||||
line = e1inp_line_create(e1_nr, argv[1]);
|
||||
if (!line) {
|
||||
vty_out(vty, "%% Error creating line %d%s", e1_nr, VTY_NEWLINE);
|
||||
return CMD_WARNING;
|
||||
}
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
DEFUN(cfg_e1inp, cfg_e1inp_cmd,
|
||||
"e1_input",
|
||||
"Configure E1/T1/J1 TDM input\n")
|
||||
{
|
||||
vty->node = E1INP_NODE;
|
||||
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
static int e1inp_config_write(struct vty *vty)
|
||||
{
|
||||
struct e1inp_line *line;
|
||||
|
||||
llist_for_each_entry(line, &e1inp_line_list, list) {
|
||||
vty_out(vty, " e1_line %u driver %s%s", line->num,
|
||||
line->driver->name, VTY_NEWLINE);
|
||||
}
|
||||
return CMD_SUCCESS;
|
||||
}
|
||||
|
||||
struct cmd_node e1inp_node = {
|
||||
E1INP_NODE,
|
||||
"%s(e1_input)#",
|
||||
1,
|
||||
};
|
||||
|
||||
int e1inp_vty_init(void)
|
||||
{
|
||||
install_element(CONFIG_NODE, &cfg_e1inp_cmd);
|
||||
install_node(&e1inp_node, e1inp_config_write);
|
||||
install_element(E1INP_NODE, &cfg_e1_line_driver_cmd);
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -386,7 +386,7 @@ static int activate_bchan(struct e1inp_line *line, int ts, int act)
|
|||
static int mi_e1_line_update(struct e1inp_line *line);
|
||||
|
||||
struct e1inp_driver misdn_driver = {
|
||||
.name = "mISDNuser",
|
||||
.name = "mISDN",
|
||||
.want_write = ts_want_write,
|
||||
.default_delay = 50000,
|
||||
.line_update = &mi_e1_line_update,
|
||||
|
@ -486,16 +486,6 @@ static int mi_e1_line_update(struct e1inp_line *line)
|
|||
struct mISDN_devinfo devinfo;
|
||||
int sk, ret, cnt;
|
||||
|
||||
if (!line->driver) {
|
||||
/* this must be the first update */
|
||||
line->driver = &misdn_driver;
|
||||
} else {
|
||||
/* this is a subsequent update */
|
||||
/* FIXME: first close all sockets */
|
||||
fprintf(stderr, "incremental line updates not supported yet\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (line->driver != &misdn_driver)
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -544,7 +534,7 @@ static int mi_e1_line_update(struct e1inp_line *line)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static __attribute__((constructor)) void on_dso_load_sms(void)
|
||||
void e1inp_misdn_init(void)
|
||||
{
|
||||
/* register the driver with the core */
|
||||
e1inp_driver_register(&misdn_driver);
|
||||
|
|
Loading…
Reference in New Issue