This patch allows Abis/IP bind address config for osmo-nitb as well as the osmo-bscs, without touching openbsc.git.
This is the libosmo-abis part of making osmo-nitb's IP addresses configurable instead of always listening on 'any'. This will allow running more than one on the same box. Ctrl interface and vty are to follow, though not in this repo.
I did sink a bit of time until the penny dropped that all I need to do is add a VTY command in libosmo-abis, but I did find out eventually.
Neels Hofmeyr (1): ipa driver: make bind address vty configurable
include/internal.h | 3 +++ include/osmocom/abis/e1_input.h | 1 + src/e1_input_vty.c | 27 +++++++++++++++++++++++++++ src/input/ipaccess.c | 28 ++++++++++++++++++++++++++-- 4 files changed, 57 insertions(+), 2 deletions(-)
Add VTY function to set the ipa bind address: e1_input ipa bind (A.B.C.D|any)
Add a priv pointer to struct e1inp_driver in order to communicate the bind address parameter to ipaccess_line_update(). Add two "internal.h" functions to get/set it in the ipa driver struct.
Add static ip_bind_addr() to use the IP address set from the VTY or, if none, use "0.0.0.0". Apply in ipaccess_line_update(). --- include/internal.h | 3 +++ include/osmocom/abis/e1_input.h | 1 + src/e1_input_vty.c | 27 +++++++++++++++++++++++++++ src/input/ipaccess.c | 28 ++++++++++++++++++++++++++-- 4 files changed, 57 insertions(+), 2 deletions(-)
diff --git a/include/internal.h b/include/internal.h index 7f6e31a..740a86d 100644 --- a/include/internal.h +++ b/include/internal.h @@ -13,6 +13,9 @@ extern void *libosmo_abis_ctx; /* use libosmo_abis_init, this is only for internal use. */ void e1inp_init(void);
+void e1inp_ipaccess_set_bind(const char *ip_bind_addr); +const char *e1inp_ipaccess_get_bind(void); + /* ipaccess.c requires these functions defined here */ struct msgb; struct msgb *ipa_msg_alloc(int headroom); diff --git a/include/osmocom/abis/e1_input.h b/include/osmocom/abis/e1_input.h index e5d2991..4d00e03 100644 --- a/include/osmocom/abis/e1_input.h +++ b/include/osmocom/abis/e1_input.h @@ -139,6 +139,7 @@ struct e1inp_driver { void (*vty_show)(struct vty *vty, struct e1inp_line *line); int default_delay; int has_keepalive; + void *priv; };
struct e1inp_line_ops { diff --git a/src/e1_input_vty.c b/src/e1_input_vty.c index 0b4adb2..130c9bb 100644 --- a/src/e1_input_vty.c +++ b/src/e1_input_vty.c @@ -168,6 +168,25 @@ DEFUN(cfg_e1inp, cfg_e1inp_cmd, return CMD_SUCCESS; }
+DEFUN(cfg_ipa_bind, + cfg_ipa_bind_cmd, + "ipa bind (A.B.C.D|any)", + "ipa driver config\n" + "Set ipa local bind address\n" + "Listen only on this IP address\n" + "Listen on any local interface\n") +{ + const char *want_bind; + if (strcmp(argv[0], "any") == 0) + want_bind = NULL; + else + want_bind = argv[0]; + e1inp_ipaccess_set_bind(want_bind); + + return CMD_SUCCESS; +} + + static int e1inp_config_write(struct vty *vty) { struct e1inp_line *line; @@ -202,6 +221,12 @@ static int e1inp_config_write(struct vty *vty) VTY_NEWLINE);
} + + const char *ipa_bind = e1inp_ipaccess_get_bind(); + if (ipa_bind) + vty_out(vty, " ipa bind %s%s", + ipa_bind, VTY_NEWLINE); + return CMD_SUCCESS; }
@@ -351,6 +376,8 @@ int e1inp_vty_init(void) install_element(L_E1INP_NODE, &cfg_e1_line_keepalive_params_cmd); install_element(L_E1INP_NODE, &cfg_e1_line_no_keepalive_cmd);
+ install_element(L_E1INP_NODE, &cfg_ipa_bind_cmd); + install_element_ve(&show_e1drv_cmd); install_element_ve(&show_e1line_cmd); install_element_ve(&show_e1ts_cmd); diff --git a/src/input/ipaccess.c b/src/input/ipaccess.c index 8ffdb19..d645e24 100644 --- a/src/input/ipaccess.c +++ b/src/input/ipaccess.c @@ -804,6 +804,13 @@ struct ipaccess_line { int line_already_initialized; };
+static const char *ip_bind_addr() +{ + return ipaccess_driver.priv? + ((const char*)ipaccess_driver.priv) + : "0.0.0.0"; +} + static int ipaccess_line_update(struct e1inp_line *line) { int ret = -ENOENT; @@ -831,7 +838,7 @@ static int ipaccess_line_update(struct e1inp_line *line) LOGP(DLINP, LOGL_NOTICE, "enabling ipaccess BSC mode\n");
oml_link = ipa_server_link_create(tall_ipa_ctx, line, - "0.0.0.0", IPA_TCP_PORT_OML, + ip_bind_addr(), IPA_TCP_PORT_OML, ipaccess_bsc_oml_cb, NULL); if (oml_link == NULL) { LOGP(DLINP, LOGL_ERROR, "cannot create OML " @@ -845,7 +852,7 @@ static int ipaccess_line_update(struct e1inp_line *line) return -EIO; } rsl_link = ipa_server_link_create(tall_ipa_ctx, line, - "0.0.0.0", IPA_TCP_PORT_RSL, + ip_bind_addr(), IPA_TCP_PORT_RSL, ipaccess_bsc_rsl_cb, NULL); if (rsl_link == NULL) { LOGP(DLINP, LOGL_ERROR, "cannot create RSL " @@ -944,3 +951,20 @@ void e1inp_ipaccess_init(void) tall_ipa_ctx = talloc_named_const(libosmo_abis_ctx, 1, "ipa"); e1inp_driver_register(&ipaccess_driver); } + +void e1inp_ipaccess_set_bind(const char *ip_bind_addr) +{ + if (ipaccess_driver.priv) { + talloc_free(ipaccess_driver.priv); + ipaccess_driver.priv = NULL; + } + + if (ip_bind_addr) + ipaccess_driver.priv = (void*)talloc_strdup(tall_ipa_ctx, + ip_bind_addr); +} + +const char *e1inp_ipaccess_get_bind(void) +{ + return (const char*)ipaccess_driver.priv; +}