aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/bsc_data.h4
-rw-r--r--src/link_udp.c15
-rw-r--r--src/links.c104
-rw-r--r--src/main.c2
-rw-r--r--src/main_udt.c2
-rw-r--r--src/vty_interface.c101
6 files changed, 163 insertions, 65 deletions
diff --git a/include/bsc_data.h b/include/bsc_data.h
index ad45982..9e4be92 100644
--- a/include/bsc_data.h
+++ b/include/bsc_data.h
@@ -103,7 +103,6 @@ struct bsc_data {
int pcap_fd;
int udp_reset_timeout;
struct llist_head links;
- struct link_data first_link;
const char *token;
@@ -180,4 +179,7 @@ int linkset_send_bsc_data(struct bsc_data *link, int sls, const uint8_t *data, i
/* another callback for SCCP data from the linkset */
void linkset_forward_sccp(struct bsc_data *bsc, struct msgb *msg, int sls);
+/* find the link */
+struct link_data *linkset_find_link(struct bsc_data *bsc, int link_index);
+
#endif
diff --git a/src/link_udp.c b/src/link_udp.c
index d33f85e..ea23e24 100644
--- a/src/link_udp.c
+++ b/src/link_udp.c
@@ -38,17 +38,6 @@
#define OSMO_CB_LI(msg) msg->cb[0]
-static struct link_data *find_link(struct bsc_data *bsc, int link_index)
-{
- struct link_data *link;
-
- llist_for_each_entry(link, &bsc->links, entry)
- if (link->link_index == link_index)
- return link;
-
- return NULL;
-}
-
static int udp_write_cb(struct bsc_fd *fd, struct msgb *msg)
{
struct bsc_data *bsc;
@@ -57,7 +46,7 @@ static int udp_write_cb(struct bsc_fd *fd, struct msgb *msg)
bsc = (struct bsc_data *) fd->data;
- link = find_link(bsc, OSMO_CB_LI(msg));
+ link = linkset_find_link(bsc, OSMO_CB_LI(msg));
if (!link) {
LOGP(DINP, LOGL_ERROR, "No link_data for %lu\n", OSMO_CB_LI(msg));
return -1;
@@ -104,7 +93,7 @@ static int udp_read_cb(struct bsc_fd *fd)
hdr = (struct udp_data_hdr *) msgb_put(msg, sizeof(*hdr));
- link = find_link(bsc, ntohs(hdr->data_link_index));
+ link = linkset_find_link(bsc, ntohs(hdr->data_link_index));
if (!link) {
LOGP(DINP, LOGL_ERROR, "Failed to find a link.\n");
rc = -1;
diff --git a/src/links.c b/src/links.c
index d8fa9a6..24a1738 100644
--- a/src/links.c
+++ b/src/links.c
@@ -24,6 +24,17 @@
#include <cellmgr_debug.h>
#include <snmp_mtp.h>
+struct link_data *linkset_find_link(struct bsc_data *bsc, int link_index)
+{
+ struct link_data *link;
+
+ llist_for_each_entry(link, &bsc->links, entry)
+ if (link->link_index == link_index)
+ return link;
+
+ return NULL;
+}
+
void link_stop_all(struct bsc_data *bsc)
{
struct link_data *link;
@@ -87,49 +98,70 @@ static void start_rest(void *start)
int link_setup_start(struct bsc_data *bsc)
{
- bsc->first_link.the_link = mtp_link_alloc();
- bsc->first_link.the_link->data = &bsc->first_link;
- bsc->first_link.the_link->dpc = bsc->dpc;
- bsc->first_link.the_link->opc = bsc->opc;
- bsc->first_link.the_link->sccp_opc = bsc->sccp_opc > -1 ? bsc->sccp_opc : bsc->opc;
- bsc->first_link.the_link->link = 0;
- bsc->first_link.the_link->sltm_once = bsc->once;
- bsc->first_link.the_link->ni = bsc->ni_ni;
- bsc->first_link.the_link->spare = bsc->ni_spare;
- bsc->first_link.bsc = bsc;
- bsc->first_link.pcap_fd = bsc->pcap_fd;
- bsc->first_link.udp.reset_timeout = bsc->udp_reset_timeout;
- bsc->first_link.link_index = 1;
-
- llist_add(&bsc->first_link.entry, &bsc->links);
-
- if (!bsc->first_link.udp.udp_ip) {
- LOGP(DINP, LOGL_ERROR, "Need to set a UDP IP.\n");
- return -1;
- }
-
- LOGP(DINP, LOGL_NOTICE, "Using UDP MTP mode.\n");
+ struct link_data *link;
- /* setup SNMP first, it is blocking */
- bsc->first_link.udp.session = snmp_mtp_session_create(bsc->first_link.udp.udp_ip);
- if (!bsc->first_link.udp.session)
+ if (llist_empty(&bsc->links)) {
+ LOGP(DINP, LOGL_ERROR, "No links defined.\n");
return -1;
+ }
if (link_udp_network_init(bsc) != 0)
return -1;
- /* now connect to the transport */
- if (link_udp_init(&bsc->first_link, bsc->first_link.udp.udp_ip, bsc->first_link.udp.udp_port) != 0)
- return -1;
+ llist_for_each_entry(link, &bsc->links, entry) {
+ link->the_link = mtp_link_alloc();
+ link->the_link->data = link;
+ link->the_link->dpc = bsc->dpc;
+ link->the_link->opc = bsc->opc;
+ link->the_link->sccp_opc = bsc->sccp_opc > -1 ? bsc->sccp_opc : bsc->opc;
+ link->the_link->link = 0;
+ link->the_link->sltm_once = bsc->once;
+ link->the_link->ni = bsc->ni_ni;
+ link->the_link->spare = bsc->ni_spare;
+ link->bsc = bsc;
+ link->pcap_fd = bsc->pcap_fd;
+ link->udp.reset_timeout = bsc->udp_reset_timeout;
+
+ if (!link->udp.udp_ip) {
+ LOGP(DINP, LOGL_ERROR, "Need to set a UDP IP on %d.\n",
+ link->link_index);
+ return -1;
+ }
+
+ if (!link->udp.udp_port) {
+ LOGP(DINP, LOGL_ERROR, "Need to set a UDP Port on %d.\n",
+ link->link_index);
+ return -1;
+ }
+ }
+
+ LOGP(DINP, LOGL_NOTICE, "Using UDP MTP mode.\n");
+
+ llist_for_each_entry(link, &bsc->links, entry) {
+ /* setup SNMP first, it is blocking */
+ link->udp.session = snmp_mtp_session_create(link->udp.udp_ip);
+ if (!link->udp.session) {
+ LOGP(DINP, LOGL_ERROR,
+ "Failed to initialize SNMP on %d\n", link->link_index);
+ return -1;
+ }
+
+ /* now connect to the transport */
+ if (link_udp_init(link, link->udp.udp_ip, link->udp.udp_port) != 0) {
+ LOGP(DINP, LOGL_ERROR,
+ "Failed to init the link on %d\n", link->link_index);
+ return -1;
+ }
+
+ /*
+ * We will ask the MTP link to be taken down for two
+ * timeouts of the BSC to make sure we are missing the
+ * SLTM and it begins a reset. Then we will take it up
+ * again and do the usual business.
+ */
+ snmp_mtp_deactivate(link->udp.session, link->link_index);
+ }
- /*
- * We will ask the MTP link to be taken down for two
- * timeouts of the BSC to make sure we are missing the
- * SLTM and it begins a reset. Then we will take it up
- * again and do the usual business.
- */
- snmp_mtp_deactivate(bsc->first_link.udp.session,
- bsc->first_link.link_index);
bsc->start_timer.cb = start_rest;
bsc->start_timer.data = bsc;
bsc_schedule_timer(&bsc->start_timer, bsc->udp_reset_timeout, 0);
diff --git a/src/main.c b/src/main.c
index 95736c8..8b9ae1a 100644
--- a/src/main.c
+++ b/src/main.c
@@ -636,8 +636,6 @@ int main(int argc, char **argv)
bsc.dpc = 1;
bsc.opc = 0;
bsc.sccp_opc = -1;
- bsc.first_link.udp.udp_port = 3456;
- bsc.first_link.udp.udp_ip = NULL;
bsc.src_port = 1313;
bsc.ni_ni = MTP_NI_NATION_NET;
bsc.ni_spare = 0;
diff --git a/src/main_udt.c b/src/main_udt.c
index 3327178..f4be646 100644
--- a/src/main_udt.c
+++ b/src/main_udt.c
@@ -187,8 +187,6 @@ int main(int argc, char **argv)
bsc.dpc = 1;
bsc.opc = 0;
bsc.sccp_opc = -1;
- bsc.first_link.udp.udp_port = 3456;
- bsc.first_link.udp.udp_ip = NULL;
bsc.src_port = 1313;
bsc.ni_ni = MTP_NI_NATION_NET;
bsc.ni_spare = 0;
diff --git a/src/vty_interface.c b/src/vty_interface.c
index ac982ea..33fae34 100644
--- a/src/vty_interface.c
+++ b/src/vty_interface.c
@@ -21,6 +21,7 @@
*/
#include <bsc_data.h>
+#include <cellmgr_debug.h>
#include <osmocore/talloc.h>
#include <osmocore/gsm48.h>
@@ -59,6 +60,8 @@ static struct cmd_node cell_node = {
static int config_write_cell(struct vty *vty)
{
+ struct link_data *link;
+
vty_out(vty, "cellmgr%s", VTY_NEWLINE);
vty_out(vty, " mtp dpc %d%s", bsc.dpc, VTY_NEWLINE);
vty_out(vty, " mtp opc %d%s", bsc.opc, VTY_NEWLINE);
@@ -69,9 +72,14 @@ static int config_write_cell(struct vty *vty)
vty_out(vty, " country-code %d%s", bsc.mcc, VTY_NEWLINE);
vty_out(vty, " network-code %d%s", bsc.mnc, VTY_NEWLINE);
vty_out(vty, " location-area-code %d%s", bsc.lac, VTY_NEWLINE);
- if (bsc.first_link.udp.udp_ip)
- vty_out(vty, " udp dest ip %s%s", bsc.first_link.udp.udp_ip, VTY_NEWLINE);
- vty_out(vty, " udp dest port %d%s", bsc.first_link.udp.udp_port, VTY_NEWLINE);
+
+ llist_for_each_entry(link, &bsc.links, entry) {
+ vty_out(vty, " udp dest-ip %d %s%s",
+ link->link_index, link->udp.udp_ip, VTY_NEWLINE);
+ vty_out(vty, " udp dest-port %d %d%s",
+ link->link_index, link->udp.udp_port, VTY_NEWLINE);
+ }
+
vty_out(vty, " udp src port %d%s", bsc.src_port, VTY_NEWLINE);
vty_out(vty, " udp reset %d%s", bsc.udp_reset_timeout, VTY_NEWLINE);
vty_out(vty, " msc ip %s%s", bsc.msc_address, VTY_NEWLINE);
@@ -128,30 +136,98 @@ DEFUN(cfg_net_mtp_spare, cfg_net_mtp_spare_cmd,
return CMD_SUCCESS;
}
+static struct link_data *find_or_create(struct bsc_data *bsc, int index)
+{
+ struct link_data *link = linkset_find_link(bsc, index);
+ if (link)
+ return link;
+
+ link = talloc_zero(NULL, struct link_data);
+ if (!link) {
+ LOGP(DINP, LOGL_ERROR, "Failed to allocate link.\n");
+ return NULL;
+ }
-DEFUN(cfg_udp_dst_ip, cfg_udp_dst_ip_cmd,
- "udp dest ip IP",
- "Set the IP when UDP mode is supposed to be used.")
+ link->link_index = index;
+ llist_add(&link->entry, &bsc->links);
+ return link;
+}
+
+static int set_dest_ip(struct vty *vty, struct link_data *link, const char *name)
{
struct hostent *hosts;
struct in_addr *addr;
- hosts = gethostbyname(argv[0]);
+ hosts = gethostbyname(name);
if (!hosts || hosts->h_length < 1 || hosts->h_addrtype != AF_INET) {
- vty_out(vty, "Failed to resolve '%s'%s", argv[0], VTY_NEWLINE);
+ vty_out(vty, "Failed to resolve '%s'%s", name, VTY_NEWLINE);
return CMD_WARNING;
}
addr = (struct in_addr *) hosts->h_addr_list[0];
- bsc.first_link.udp.udp_ip = talloc_strdup(NULL, inet_ntoa(*addr));
+ link->udp.udp_ip = talloc_strdup(NULL, inet_ntoa(*addr));
return CMD_SUCCESS;
}
-DEFUN(cfg_udp_dst_port, cfg_udp_dst_port_cmd,
+DEFUN_DEPRECATED(cfg_udp_dst_ip, cfg_udp_dst_ip_cmd,
+ "udp dest ip IP",
+ "Set the IP when UDP mode is supposed to be used.")
+{
+ struct link_data *link;
+
+ link = find_or_create(&bsc, 1);
+ if (!link) {
+ vty_out(vty, "Failed to create a link.\n");
+ return CMD_WARNING;
+ }
+
+ return set_dest_ip(vty, link, argv[0]);
+}
+
+DEFUN_DEPRECATED(cfg_udp_dst_port, cfg_udp_dst_port_cmd,
"udp dest port PORT_NR",
"If UDP mode is used specify the UDP dest port")
{
- bsc.first_link.udp.udp_port = atoi(argv[0]);
+ struct link_data *link;
+
+ link = find_or_create(&bsc, 1);
+ if (!link) {
+ vty_out(vty, "Failed to create a link.\n");
+ return CMD_WARNING;
+ }
+
+ link->udp.udp_port = atoi(argv[0]);
+ return CMD_SUCCESS;
+}
+
+DEFUN(cfg_link_dest_ip, cfg_link_dest_ip_cmd,
+ "udp dest-ip <0-64> IP",
+ "Set the dest-ip for a link.\n" "The link index\n" "IP or hostname\n")
+{
+ struct link_data *link;
+
+ link = find_or_create(&bsc, atoi(argv[0]));
+ if (!link) {
+ vty_out(vty, "Failed to create a link.\n");
+ return CMD_WARNING;
+ }
+
+ return set_dest_ip(vty, link, argv[1]);
+}
+
+DEFUN(cfg_link_port_ip, cfg_link_port_ip_cmd,
+ "udp dest-port <0-64> PORT_NR",
+ "Set the dest-port for a link.\n" "The link index\n" "port number\n")
+{
+ struct link_data *link;
+
+ link = find_or_create(&bsc, atoi(argv[0]));
+ if (!link) {
+ vty_out(vty, "Failed to create a link.\n");
+ return CMD_WARNING;
+ }
+
+ link->udp.udp_port = atoi(argv[1]);
return CMD_SUCCESS;
}
@@ -305,6 +381,9 @@ void cell_vty_init(void)
install_element(CELLMGR_NODE, &cfg_mcc_cmd);
install_element(CELLMGR_NODE, &cfg_mnc_cmd);
install_element(CELLMGR_NODE, &cfg_lac_cmd);
+
+ install_element(CELLMGR_NODE, &cfg_link_dest_ip_cmd);
+ install_element(CELLMGR_NODE, &cfg_link_port_ip_cmd);
}
const char *openbsc_copyright = "";