diff --git a/include/osmocom/abis/e1_input.h b/include/osmocom/abis/e1_input.h index 9562928..757f3f2 100644 --- a/include/osmocom/abis/e1_input.h +++ b/include/osmocom/abis/e1_input.h @@ -126,15 +126,23 @@ struct e1inp_driver { struct llist_head list; const char *name; 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); int default_delay; }; 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; 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); diff --git a/src/e1_input.c b/src/e1_input.c index 22f38d8..81c5a99 100644 --- a/src/e1_input.c +++ b/src/e1_input.c @@ -610,8 +610,7 @@ int e1inp_line_update(struct e1inp_line *line) return 0; if (line->driver && line->ops && line->driver->line_update) { - rc = line->driver->line_update(line, line->ops->role, - line->ops->addr); + rc = line->driver->line_update(line); } else rc = 0; diff --git a/src/input/dahdi.c b/src/input/dahdi.c index 1b366e1..e4e4905 100644 --- a/src/input/dahdi.c +++ b/src/input/dahdi.c @@ -385,8 +385,7 @@ static int dahdi_fd_cb(struct osmo_fd *bfd, unsigned int what) return rc; } -static int dahdi_e1_line_update(struct e1inp_line *line, - enum e1inp_line_role role, const char *addr); +static int dahdi_e1_line_update(struct e1inp_line *line); struct e1inp_driver dahdi_driver = { .name = "dahdi", @@ -501,8 +500,7 @@ static int dahdi_e1_setup(struct e1inp_line *line) return 0; } -static int dahdi_e1_line_update(struct e1inp_line *line, - enum e1inp_line_role role, const char *addr) +static int dahdi_e1_line_update(struct e1inp_line *line) { if (line->driver != &dahdi_driver) return -EINVAL; diff --git a/src/input/hsl.c b/src/input/hsl.c index ab822c0..dc7532b 100644 --- a/src/input/hsl.c +++ b/src/input/hsl.c @@ -318,8 +318,7 @@ static void hsl_close(struct e1inp_sign_link *sign_link) } } -static int hsl_line_update(struct e1inp_line *line, - enum e1inp_line_role role, const char *addr); +static int hsl_line_update(struct e1inp_line *line); struct e1inp_driver hsl_driver = { .name = "hsl", @@ -421,7 +420,7 @@ static int hsl_bts_connect(struct ipa_client_link *link) struct msgb *msg; uint8_t *serno; 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; /* send the minimal message to identify this BTS. */ @@ -457,17 +456,17 @@ static int hsl_bts_connect(struct ipa_client_link *link) return 0; } -static int hsl_line_update(struct e1inp_line *line, - enum e1inp_line_role role, const char *addr) +static int hsl_line_update(struct e1inp_line *line) { int ret = -ENOENT; - switch(role) { + switch(line->ops->cfg.ipa.role) { case E1INP_LINE_R_BSC: LOGP(DLINP, LOGL_NOTICE, "enabling hsl BSC mode\n"); 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) return ret; @@ -489,7 +488,8 @@ static int hsl_line_update(struct e1inp_line *line, link = ipa_client_link_create(tall_hsl_ctx, &line->ts[E1INP_SIGN_OML-1], "hsl", E1INP_SIGN_OML, - addr, HSL_TCP_PORT, + line->ops->cfg.ipa.addr, + HSL_TCP_PORT, hsl_bts_connect, hsl_bts_process, hsl_bts_write, diff --git a/src/input/ipaccess.c b/src/input/ipaccess.c index 13b3cb1..5f35ab6 100644 --- a/src/input/ipaccess.c +++ b/src/input/ipaccess.c @@ -551,8 +551,7 @@ int ipaccess_fd_cb(struct osmo_fd *bfd, unsigned int what) return rc; } -static int ipaccess_line_update(struct e1inp_line *line, - enum e1inp_line_role role, const char *addr); +static int ipaccess_line_update(struct e1inp_line *line); struct e1inp_driver ipaccess_driver = { .name = "ipa", @@ -778,7 +777,7 @@ static int ipaccess_bts_cb(struct ipa_client_link *link, struct msgb *msg) link->ofd->fd = -1; 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); ipaccess_send(link->ofd->fd, rmsg->data, rmsg->len); msgb_free(rmsg); @@ -814,12 +813,11 @@ static int ipaccess_bts_cb(struct ipa_client_link *link, struct msgb *msg) return 0; } -static int ipaccess_line_update(struct e1inp_line *line, - enum e1inp_line_role role, const char *addr) +static int ipaccess_line_update(struct e1inp_line *line) { int ret = -ENOENT; - switch(role) { + switch(line->ops->cfg.ipa.role) { case E1INP_LINE_R_BSC: { 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, &line->ts[E1INP_SIGN_OML-1], "ipa", E1INP_SIGN_OML, - addr, IPA_TCP_PORT_OML, + line->ops->cfg.ipa.addr, + IPA_TCP_PORT_OML, NULL, ipaccess_bts_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, &line->ts[E1INP_SIGN_RSL-1], "ipa", E1INP_SIGN_RSL, - addr, IPA_TCP_PORT_RSL, + line->ops->cfg.ipa.addr, + IPA_TCP_PORT_RSL, NULL, ipaccess_bts_cb, ipaccess_bts_write_cb, diff --git a/src/input/misdn.c b/src/input/misdn.c index 7adcaa6..bb9145f 100644 --- a/src/input/misdn.c +++ b/src/input/misdn.c @@ -380,8 +380,7 @@ static int activate_bchan(struct e1inp_line *line, int ts, int act) return ret; } -static int mi_e1_line_update(struct e1inp_line *line, - enum e1inp_line_role role, const char *addr); +static int mi_e1_line_update(struct e1inp_line *line); struct e1inp_driver misdn_driver = { .name = "misdn", @@ -479,8 +478,7 @@ static int mi_e1_setup(struct e1inp_line *line, int release_l2) return 0; } -static int mi_e1_line_update(struct e1inp_line *line, - enum e1inp_line_role role, const char *addr) +static int mi_e1_line_update(struct e1inp_line *line) { struct mISDN_devinfo devinfo; int sk, ret, cnt; diff --git a/src/input/rs232.c b/src/input/rs232.c index eb6b5d0..2fd2a09 100644 --- a/src/input/rs232.c +++ b/src/input/rs232.c @@ -277,8 +277,7 @@ rs232_setup(struct e1inp_line *line, const char *serial_port, unsigned int delay return 0; } -static int rs232_line_update(struct e1inp_line *line, - enum e1inp_line_role role, const char *addr); +static int rs232_line_update(struct e1inp_line *line); static struct e1inp_driver rs232_driver = { .name = "rs232", @@ -286,13 +285,13 @@ static struct e1inp_driver rs232_driver = { .line_update = rs232_line_update, }; -static int rs232_line_update(struct e1inp_line *line, - enum e1inp_line_role role, const char *addr) +static int rs232_line_update(struct e1inp_line *line) { if (line->driver != &rs232_driver) 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) diff --git a/tests/e1inp_hsl_bsc_test.c b/tests/e1inp_hsl_bsc_test.c index 292a0e3..a909e02 100644 --- a/tests/e1inp_hsl_bsc_test.c +++ b/tests/e1inp_hsl_bsc_test.c @@ -190,8 +190,12 @@ int main(void) osmo_init_logging(&bsc_test_log_info); struct e1inp_line_ops ops = { - .addr = "0.0.0.0", - .role = E1INP_LINE_R_BSC, + .cfg = { + .ipa = { + .addr = "0.0.0.0", + .role = E1INP_LINE_R_BSC, + }, + }, .sign_link_up = sign_link_up, .sign_link_down = sign_link_down, .sign_link = sign_link, diff --git a/tests/e1inp_hsl_bts_test.c b/tests/e1inp_hsl_bts_test.c index 272eacf..18a06fe 100644 --- a/tests/e1inp_hsl_bts_test.c +++ b/tests/e1inp_hsl_bts_test.c @@ -231,9 +231,13 @@ int main(void) osmo_init_logging(&bts_test_log_info); struct e1inp_line_ops ops = { - .role = E1INP_LINE_R_BTS, - .addr = "127.0.0.1", - .data = &bts_dev_info, + .cfg = { + .ipa = { + .role = E1INP_LINE_R_BTS, + .addr = "127.0.0.1", + .dev = &bts_dev_info, + }, + }, .sign_link_up = sign_link_up, .sign_link_down = sign_link_down, .sign_link = sign_link, diff --git a/tests/e1inp_ipa_bsc_test.c b/tests/e1inp_ipa_bsc_test.c index ba3aabb..424c87b 100644 --- a/tests/e1inp_ipa_bsc_test.c +++ b/tests/e1inp_ipa_bsc_test.c @@ -205,8 +205,12 @@ int main(void) osmo_init_logging(&bsc_test_log_info); struct e1inp_line_ops ops = { - .addr = "0.0.0.0", - .role = E1INP_LINE_R_BSC, + .cfg = { + .ipa = { + .addr = "0.0.0.0", + .role = E1INP_LINE_R_BSC, + }, + }, .sign_link_up = sign_link_up, .sign_link_down = sign_link_down, .sign_link = sign_link, diff --git a/tests/e1inp_ipa_bts_test.c b/tests/e1inp_ipa_bts_test.c index 2c03d94..3549661 100644 --- a/tests/e1inp_ipa_bts_test.c +++ b/tests/e1inp_ipa_bts_test.c @@ -252,9 +252,13 @@ int main(void) osmo_init_logging(&bts_test_log_info); struct e1inp_line_ops ops = { - .role = E1INP_LINE_R_BTS, - .addr = "127.0.0.1", - .data = &bts_dev_info, + .cfg = { + .ipa = { + .role = E1INP_LINE_R_BTS, + .addr = "127.0.0.1", + .dev = &bts_dev_info, + }, + }, .sign_link_up = sign_link_up, .sign_link_down = sign_link_down, .sign_link = sign_link,