e1_input: rework configuration of virtual E1 line operations
struct e1inp_line_ops { - enum e1inp_line_role role; - char *addr; - void *data; + union { + struct { + enum e1inp_line_role role; /* BSC or BTS mode. */ + const char *addr; /* IP address .*/ + void *dev; /* device parameters. */ + } ipa; + struct { + const char *port; /* e.g. /dev/ttyUSB0 */ + unsigned int delay; + } rs232; + } cfg; Now this structure contains the configuration details for the virtual E1 line, instead of using a pointer. This also get the line_update callback to its original layout: + int (*line_update)(struct e1inp_line *line);
This commit is contained in:
parent
7e0d006e3c
commit
4e862cbf4b
|
@ -126,15 +126,23 @@ struct e1inp_driver {
|
||||||
struct llist_head list;
|
struct llist_head list;
|
||||||
const char *name;
|
const char *name;
|
||||||
int (*want_write)(struct e1inp_ts *ts);
|
int (*want_write)(struct e1inp_ts *ts);
|
||||||
int (*line_update)(struct e1inp_line *line, enum e1inp_line_role role, const char *addr);
|
int (*line_update)(struct e1inp_line *line);
|
||||||
void (*close)(struct e1inp_sign_link *link);
|
void (*close)(struct e1inp_sign_link *link);
|
||||||
int default_delay;
|
int default_delay;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct e1inp_line_ops {
|
struct e1inp_line_ops {
|
||||||
enum e1inp_line_role role;
|
union {
|
||||||
char *addr;
|
struct {
|
||||||
void *data;
|
enum e1inp_line_role role; /* BSC or BTS mode. */
|
||||||
|
const char *addr; /* IP address .*/
|
||||||
|
void *dev; /* device parameters. */
|
||||||
|
} ipa;
|
||||||
|
struct {
|
||||||
|
const char *port; /* e.g. /dev/ttyUSB0 */
|
||||||
|
unsigned int delay;
|
||||||
|
} rs232;
|
||||||
|
} cfg;
|
||||||
|
|
||||||
struct e1inp_sign_link * (*sign_link_up)(void *unit_info, struct e1inp_line *line, enum e1inp_sign_type type);
|
struct e1inp_sign_link * (*sign_link_up)(void *unit_info, struct e1inp_line *line, enum e1inp_sign_type type);
|
||||||
void (*sign_link_down)(struct e1inp_line *line);
|
void (*sign_link_down)(struct e1inp_line *line);
|
||||||
|
|
|
@ -610,8 +610,7 @@ int e1inp_line_update(struct e1inp_line *line)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (line->driver && line->ops && line->driver->line_update) {
|
if (line->driver && line->ops && line->driver->line_update) {
|
||||||
rc = line->driver->line_update(line, line->ops->role,
|
rc = line->driver->line_update(line);
|
||||||
line->ops->addr);
|
|
||||||
} else
|
} else
|
||||||
rc = 0;
|
rc = 0;
|
||||||
|
|
||||||
|
|
|
@ -385,8 +385,7 @@ static int dahdi_fd_cb(struct osmo_fd *bfd, unsigned int what)
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dahdi_e1_line_update(struct e1inp_line *line,
|
static int dahdi_e1_line_update(struct e1inp_line *line);
|
||||||
enum e1inp_line_role role, const char *addr);
|
|
||||||
|
|
||||||
struct e1inp_driver dahdi_driver = {
|
struct e1inp_driver dahdi_driver = {
|
||||||
.name = "dahdi",
|
.name = "dahdi",
|
||||||
|
@ -501,8 +500,7 @@ static int dahdi_e1_setup(struct e1inp_line *line)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dahdi_e1_line_update(struct e1inp_line *line,
|
static int dahdi_e1_line_update(struct e1inp_line *line)
|
||||||
enum e1inp_line_role role, const char *addr)
|
|
||||||
{
|
{
|
||||||
if (line->driver != &dahdi_driver)
|
if (line->driver != &dahdi_driver)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
|
@ -318,8 +318,7 @@ static void hsl_close(struct e1inp_sign_link *sign_link)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hsl_line_update(struct e1inp_line *line,
|
static int hsl_line_update(struct e1inp_line *line);
|
||||||
enum e1inp_line_role role, const char *addr);
|
|
||||||
|
|
||||||
struct e1inp_driver hsl_driver = {
|
struct e1inp_driver hsl_driver = {
|
||||||
.name = "hsl",
|
.name = "hsl",
|
||||||
|
@ -421,7 +420,7 @@ static int hsl_bts_connect(struct ipa_client_link *link)
|
||||||
struct msgb *msg;
|
struct msgb *msg;
|
||||||
uint8_t *serno;
|
uint8_t *serno;
|
||||||
char serno_buf[16];
|
char serno_buf[16];
|
||||||
struct hsl_unit *unit = link->line->ops->data;
|
struct hsl_unit *unit = link->line->ops->cfg.ipa.dev;
|
||||||
struct e1inp_sign_link *sign_link;
|
struct e1inp_sign_link *sign_link;
|
||||||
|
|
||||||
/* send the minimal message to identify this BTS. */
|
/* send the minimal message to identify this BTS. */
|
||||||
|
@ -457,17 +456,17 @@ static int hsl_bts_connect(struct ipa_client_link *link)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hsl_line_update(struct e1inp_line *line,
|
static int hsl_line_update(struct e1inp_line *line)
|
||||||
enum e1inp_line_role role, const char *addr)
|
|
||||||
{
|
{
|
||||||
int ret = -ENOENT;
|
int ret = -ENOENT;
|
||||||
|
|
||||||
switch(role) {
|
switch(line->ops->cfg.ipa.role) {
|
||||||
case E1INP_LINE_R_BSC:
|
case E1INP_LINE_R_BSC:
|
||||||
LOGP(DLINP, LOGL_NOTICE, "enabling hsl BSC mode\n");
|
LOGP(DLINP, LOGL_NOTICE, "enabling hsl BSC mode\n");
|
||||||
|
|
||||||
ret = osmo_sock_init(AF_INET, SOCK_STREAM, IPPROTO_TCP,
|
ret = osmo_sock_init(AF_INET, SOCK_STREAM, IPPROTO_TCP,
|
||||||
addr, HSL_TCP_PORT, OSMO_SOCK_F_BIND);
|
line->ops->cfg.ipa.addr,
|
||||||
|
HSL_TCP_PORT, OSMO_SOCK_F_BIND);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@ -489,7 +488,8 @@ static int hsl_line_update(struct e1inp_line *line,
|
||||||
link = ipa_client_link_create(tall_hsl_ctx,
|
link = ipa_client_link_create(tall_hsl_ctx,
|
||||||
&line->ts[E1INP_SIGN_OML-1],
|
&line->ts[E1INP_SIGN_OML-1],
|
||||||
"hsl", E1INP_SIGN_OML,
|
"hsl", E1INP_SIGN_OML,
|
||||||
addr, HSL_TCP_PORT,
|
line->ops->cfg.ipa.addr,
|
||||||
|
HSL_TCP_PORT,
|
||||||
hsl_bts_connect,
|
hsl_bts_connect,
|
||||||
hsl_bts_process,
|
hsl_bts_process,
|
||||||
hsl_bts_write,
|
hsl_bts_write,
|
||||||
|
|
|
@ -551,8 +551,7 @@ int ipaccess_fd_cb(struct osmo_fd *bfd, unsigned int what)
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ipaccess_line_update(struct e1inp_line *line,
|
static int ipaccess_line_update(struct e1inp_line *line);
|
||||||
enum e1inp_line_role role, const char *addr);
|
|
||||||
|
|
||||||
struct e1inp_driver ipaccess_driver = {
|
struct e1inp_driver ipaccess_driver = {
|
||||||
.name = "ipa",
|
.name = "ipa",
|
||||||
|
@ -778,7 +777,7 @@ static int ipaccess_bts_cb(struct ipa_client_link *link, struct msgb *msg)
|
||||||
link->ofd->fd = -1;
|
link->ofd->fd = -1;
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
rmsg = ipa_bts_id_resp(link->line->ops->data,
|
rmsg = ipa_bts_id_resp(link->line->ops->cfg.ipa.dev,
|
||||||
data + 1, len - 1);
|
data + 1, len - 1);
|
||||||
ipaccess_send(link->ofd->fd, rmsg->data, rmsg->len);
|
ipaccess_send(link->ofd->fd, rmsg->data, rmsg->len);
|
||||||
msgb_free(rmsg);
|
msgb_free(rmsg);
|
||||||
|
@ -814,12 +813,11 @@ static int ipaccess_bts_cb(struct ipa_client_link *link, struct msgb *msg)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ipaccess_line_update(struct e1inp_line *line,
|
static int ipaccess_line_update(struct e1inp_line *line)
|
||||||
enum e1inp_line_role role, const char *addr)
|
|
||||||
{
|
{
|
||||||
int ret = -ENOENT;
|
int ret = -ENOENT;
|
||||||
|
|
||||||
switch(role) {
|
switch(line->ops->cfg.ipa.role) {
|
||||||
case E1INP_LINE_R_BSC: {
|
case E1INP_LINE_R_BSC: {
|
||||||
struct ipa_server_link *oml_link, *rsl_link;
|
struct ipa_server_link *oml_link, *rsl_link;
|
||||||
|
|
||||||
|
@ -864,7 +862,8 @@ static int ipaccess_line_update(struct e1inp_line *line,
|
||||||
link = ipa_client_link_create(tall_ipa_ctx,
|
link = ipa_client_link_create(tall_ipa_ctx,
|
||||||
&line->ts[E1INP_SIGN_OML-1],
|
&line->ts[E1INP_SIGN_OML-1],
|
||||||
"ipa", E1INP_SIGN_OML,
|
"ipa", E1INP_SIGN_OML,
|
||||||
addr, IPA_TCP_PORT_OML,
|
line->ops->cfg.ipa.addr,
|
||||||
|
IPA_TCP_PORT_OML,
|
||||||
NULL,
|
NULL,
|
||||||
ipaccess_bts_cb,
|
ipaccess_bts_cb,
|
||||||
ipaccess_bts_write_cb,
|
ipaccess_bts_write_cb,
|
||||||
|
@ -884,7 +883,8 @@ static int ipaccess_line_update(struct e1inp_line *line,
|
||||||
rsl_link = ipa_client_link_create(tall_ipa_ctx,
|
rsl_link = ipa_client_link_create(tall_ipa_ctx,
|
||||||
&line->ts[E1INP_SIGN_RSL-1],
|
&line->ts[E1INP_SIGN_RSL-1],
|
||||||
"ipa", E1INP_SIGN_RSL,
|
"ipa", E1INP_SIGN_RSL,
|
||||||
addr, IPA_TCP_PORT_RSL,
|
line->ops->cfg.ipa.addr,
|
||||||
|
IPA_TCP_PORT_RSL,
|
||||||
NULL,
|
NULL,
|
||||||
ipaccess_bts_cb,
|
ipaccess_bts_cb,
|
||||||
ipaccess_bts_write_cb,
|
ipaccess_bts_write_cb,
|
||||||
|
|
|
@ -380,8 +380,7 @@ static int activate_bchan(struct e1inp_line *line, int ts, int act)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mi_e1_line_update(struct e1inp_line *line,
|
static int mi_e1_line_update(struct e1inp_line *line);
|
||||||
enum e1inp_line_role role, const char *addr);
|
|
||||||
|
|
||||||
struct e1inp_driver misdn_driver = {
|
struct e1inp_driver misdn_driver = {
|
||||||
.name = "misdn",
|
.name = "misdn",
|
||||||
|
@ -479,8 +478,7 @@ static int mi_e1_setup(struct e1inp_line *line, int release_l2)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mi_e1_line_update(struct e1inp_line *line,
|
static int mi_e1_line_update(struct e1inp_line *line)
|
||||||
enum e1inp_line_role role, const char *addr)
|
|
||||||
{
|
{
|
||||||
struct mISDN_devinfo devinfo;
|
struct mISDN_devinfo devinfo;
|
||||||
int sk, ret, cnt;
|
int sk, ret, cnt;
|
||||||
|
|
|
@ -277,8 +277,7 @@ rs232_setup(struct e1inp_line *line, const char *serial_port, unsigned int delay
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rs232_line_update(struct e1inp_line *line,
|
static int rs232_line_update(struct e1inp_line *line);
|
||||||
enum e1inp_line_role role, const char *addr);
|
|
||||||
|
|
||||||
static struct e1inp_driver rs232_driver = {
|
static struct e1inp_driver rs232_driver = {
|
||||||
.name = "rs232",
|
.name = "rs232",
|
||||||
|
@ -286,13 +285,13 @@ static struct e1inp_driver rs232_driver = {
|
||||||
.line_update = rs232_line_update,
|
.line_update = rs232_line_update,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int rs232_line_update(struct e1inp_line *line,
|
static int rs232_line_update(struct e1inp_line *line)
|
||||||
enum e1inp_line_role role, const char *addr)
|
|
||||||
{
|
{
|
||||||
if (line->driver != &rs232_driver)
|
if (line->driver != &rs232_driver)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
return rs232_setup(line, addr, 0);
|
return rs232_setup(line, line->ops->cfg.rs232.port,
|
||||||
|
line->ops->cfg.rs232.delay);
|
||||||
}
|
}
|
||||||
|
|
||||||
int e1inp_rs232_init(void)
|
int e1inp_rs232_init(void)
|
||||||
|
|
|
@ -190,8 +190,12 @@ int main(void)
|
||||||
osmo_init_logging(&bsc_test_log_info);
|
osmo_init_logging(&bsc_test_log_info);
|
||||||
|
|
||||||
struct e1inp_line_ops ops = {
|
struct e1inp_line_ops ops = {
|
||||||
.addr = "0.0.0.0",
|
.cfg = {
|
||||||
.role = E1INP_LINE_R_BSC,
|
.ipa = {
|
||||||
|
.addr = "0.0.0.0",
|
||||||
|
.role = E1INP_LINE_R_BSC,
|
||||||
|
},
|
||||||
|
},
|
||||||
.sign_link_up = sign_link_up,
|
.sign_link_up = sign_link_up,
|
||||||
.sign_link_down = sign_link_down,
|
.sign_link_down = sign_link_down,
|
||||||
.sign_link = sign_link,
|
.sign_link = sign_link,
|
||||||
|
|
|
@ -231,9 +231,13 @@ int main(void)
|
||||||
osmo_init_logging(&bts_test_log_info);
|
osmo_init_logging(&bts_test_log_info);
|
||||||
|
|
||||||
struct e1inp_line_ops ops = {
|
struct e1inp_line_ops ops = {
|
||||||
.role = E1INP_LINE_R_BTS,
|
.cfg = {
|
||||||
.addr = "127.0.0.1",
|
.ipa = {
|
||||||
.data = &bts_dev_info,
|
.role = E1INP_LINE_R_BTS,
|
||||||
|
.addr = "127.0.0.1",
|
||||||
|
.dev = &bts_dev_info,
|
||||||
|
},
|
||||||
|
},
|
||||||
.sign_link_up = sign_link_up,
|
.sign_link_up = sign_link_up,
|
||||||
.sign_link_down = sign_link_down,
|
.sign_link_down = sign_link_down,
|
||||||
.sign_link = sign_link,
|
.sign_link = sign_link,
|
||||||
|
|
|
@ -205,8 +205,12 @@ int main(void)
|
||||||
osmo_init_logging(&bsc_test_log_info);
|
osmo_init_logging(&bsc_test_log_info);
|
||||||
|
|
||||||
struct e1inp_line_ops ops = {
|
struct e1inp_line_ops ops = {
|
||||||
.addr = "0.0.0.0",
|
.cfg = {
|
||||||
.role = E1INP_LINE_R_BSC,
|
.ipa = {
|
||||||
|
.addr = "0.0.0.0",
|
||||||
|
.role = E1INP_LINE_R_BSC,
|
||||||
|
},
|
||||||
|
},
|
||||||
.sign_link_up = sign_link_up,
|
.sign_link_up = sign_link_up,
|
||||||
.sign_link_down = sign_link_down,
|
.sign_link_down = sign_link_down,
|
||||||
.sign_link = sign_link,
|
.sign_link = sign_link,
|
||||||
|
|
|
@ -252,9 +252,13 @@ int main(void)
|
||||||
osmo_init_logging(&bts_test_log_info);
|
osmo_init_logging(&bts_test_log_info);
|
||||||
|
|
||||||
struct e1inp_line_ops ops = {
|
struct e1inp_line_ops ops = {
|
||||||
.role = E1INP_LINE_R_BTS,
|
.cfg = {
|
||||||
.addr = "127.0.0.1",
|
.ipa = {
|
||||||
.data = &bts_dev_info,
|
.role = E1INP_LINE_R_BTS,
|
||||||
|
.addr = "127.0.0.1",
|
||||||
|
.dev = &bts_dev_info,
|
||||||
|
},
|
||||||
|
},
|
||||||
.sign_link_up = sign_link_up,
|
.sign_link_up = sign_link_up,
|
||||||
.sign_link_down = sign_link_down,
|
.sign_link_down = sign_link_down,
|
||||||
.sign_link = sign_link,
|
.sign_link = sign_link,
|
||||||
|
|
Loading…
Reference in New Issue