diff mbox

ipa driver: make bind address vty configurable

Message ID 1456222189-13203-2-git-send-email-nhofmeyr@sysmocom.de
State Superseded
Headers show

Commit Message

Neels Hofmeyr Feb. 23, 2016, 10:09 a.m. UTC
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 mbox

Patch

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;
+}