aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2011-01-22 17:06:34 +0100
committerHolger Hans Peter Freyther <zecke@selfish.org>2011-01-22 17:24:06 +0100
commitc6bfa27b5e56845491c6d03406d4dba65d86095f (patch)
tree91432548eb6f4958d425e4c0ef9cd0a3f567f83c
parent0b316224829d172a76c1f6145568f8470b0a7dd6 (diff)
udp: Allow to create multiple links via UDP
This is the easiest way to support multiple links over UDP. Specify the number you want and they will be initiated. All these links will run via the same UDP port.
-rw-r--r--include/bsc_data.h1
-rw-r--r--src/links.c51
-rw-r--r--src/main.c1
-rw-r--r--src/main_stp.c1
-rw-r--r--src/main_udt.c1
-rw-r--r--src/vty_interface.c10
6 files changed, 42 insertions, 23 deletions
diff --git a/include/bsc_data.h b/include/bsc_data.h
index 134a5b0..fdd35ec 100644
--- a/include/bsc_data.h
+++ b/include/bsc_data.h
@@ -115,6 +115,7 @@ struct bsc_data {
int src_port;
int udp_port;
char *udp_ip;
+ int udp_nr_links;
int once;
/* the network header to use */
diff --git a/src/links.c b/src/links.c
index 9bd202b..7a114fb 100644
--- a/src/links.c
+++ b/src/links.c
@@ -94,6 +94,7 @@ static void start_rest(void *start)
int link_init(struct bsc_data *bsc)
{
+ int i;
struct mtp_udp_link *lnk;
bsc->link_set = mtp_link_set_alloc();
@@ -106,14 +107,6 @@ int link_init(struct bsc_data *bsc)
bsc->link_set->spare = bsc->ni_spare;
bsc->link_set->bsc = bsc;
- lnk = talloc_zero(bsc->link_set, struct mtp_udp_link);
- lnk->base.pcap_fd = bsc->pcap_fd;
- lnk->bsc = bsc;
- lnk->data = &bsc->udp_data;
- lnk->link_index = 1;
- lnk->reset_timeout = bsc->udp_reset_timeout;
- mtp_link_set_add_link(bsc->link_set, (struct mtp_link *) lnk);
-
if (!bsc->src_port) {
LOGP(DINP, LOGL_ERROR, "You need to set a UDP address.\n");
return -1;
@@ -124,22 +117,34 @@ int link_init(struct bsc_data *bsc)
if (link_global_init(&bsc->udp_data, bsc->udp_ip, bsc->src_port) != 0)
return -1;
- /* now connect to the transport */
- if (link_udp_init(lnk, bsc->udp_ip, bsc->udp_port) != 0)
- 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(lnk->data->session,
- lnk->link_index);
- bsc->start_timer.cb = start_rest;
- bsc->start_timer.data = &bsc;
- bsc_schedule_timer(&bsc->start_timer, lnk->reset_timeout, 0);
- LOGP(DMSC, LOGL_NOTICE, "Making sure SLTM will timeout.\n");
+ for (i = 1; i <= bsc->udp_nr_links; ++i) {
+ lnk = talloc_zero(bsc->link_set, struct mtp_udp_link);
+ lnk->base.pcap_fd = bsc->pcap_fd;
+ lnk->bsc = bsc;
+ lnk->data = &bsc->udp_data;
+ lnk->link_index = i;
+ lnk->reset_timeout = bsc->udp_reset_timeout;
+ mtp_link_set_add_link(bsc->link_set, (struct mtp_link *) lnk);
+
+
+ /* now connect to the transport */
+ if (link_udp_init(lnk, bsc->udp_ip, bsc->udp_port) != 0)
+ 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(lnk->data->session,
+ lnk->link_index);
+ bsc->start_timer.cb = start_rest;
+ bsc->start_timer.data = &bsc;
+ bsc_schedule_timer(&bsc->start_timer, lnk->reset_timeout, 0);
+ LOGP(DMSC, LOGL_NOTICE, "Making sure SLTM will timeout.\n");
+ }
return 0;
}
diff --git a/src/main.c b/src/main.c
index 38c1575..3ae4f72 100644
--- a/src/main.c
+++ b/src/main.c
@@ -633,6 +633,7 @@ int main(int argc, char **argv)
bsc.isup_opc = -1;
bsc.udp_port = 3456;
bsc.udp_ip = NULL;
+ bsc.udp_nr_links = 1;
bsc.src_port = 1313;
bsc.ni_ni = MTP_NI_NATION_NET;
bsc.ni_spare = 0;
diff --git a/src/main_stp.c b/src/main_stp.c
index 328eabe..a957478 100644
--- a/src/main_stp.c
+++ b/src/main_stp.c
@@ -194,6 +194,7 @@ int main(int argc, char **argv)
bsc.src_port = 1313;
bsc.ni_ni = MTP_NI_NATION_NET;
bsc.ni_spare = 0;
+ bsc.udp_nr_links = 1;
mtp_link_set_init();
thread_init();
diff --git a/src/main_udt.c b/src/main_udt.c
index 436ae1b..f8c5c6c 100644
--- a/src/main_udt.c
+++ b/src/main_udt.c
@@ -193,6 +193,7 @@ int main(int argc, char **argv)
bsc.src_port = 1313;
bsc.ni_ni = MTP_NI_NATION_NET;
bsc.ni_spare = 0;
+ bsc.udp_nr_links = 1;
mtp_link_set_init();
thread_init();
diff --git a/src/vty_interface.c b/src/vty_interface.c
index c529e1c..7a9c157 100644
--- a/src/vty_interface.c
+++ b/src/vty_interface.c
@@ -74,6 +74,7 @@ static int config_write_cell(struct vty *vty)
vty_out(vty, " udp dest port %d%s", bsc.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, " udp number-links %d%s", bsc.udp_nr_links, VTY_NEWLINE);
vty_out(vty, " msc ip %s%s", bsc.msc_address, VTY_NEWLINE);
vty_out(vty, " msc ip-dscp %d%s", bsc.msc_ip_dscp, VTY_NEWLINE);
vty_out(vty, " msc token %s%s", bsc.token, VTY_NEWLINE);
@@ -171,6 +172,14 @@ DEFUN(cfg_udp_reset, cfg_udp_reset_cmd,
return CMD_SUCCESS;
}
+DEFUN(cfg_udp_nr_links, cfg_udp_nr_links_cmd,
+ "udp number-links <1-32>",
+ "Set the number of links to use\n")
+{
+ bsc.udp_nr_links = atoi(argv[0]);
+ return CMD_SUCCESS;
+}
+
DEFUN(cfg_sltm_once, cfg_sltm_once_cmd,
"mtp sltm once (0|1)",
"Send SLTMs until the link is established.")
@@ -361,6 +370,7 @@ void cell_vty_init(void)
install_element(CELLMGR_NODE, &cfg_udp_dst_port_cmd);
install_element(CELLMGR_NODE, &cfg_udp_src_port_cmd);
install_element(CELLMGR_NODE, &cfg_udp_reset_cmd);
+ install_element(CELLMGR_NODE, &cfg_udp_nr_links_cmd);
install_element(CELLMGR_NODE, &cfg_sltm_once_cmd);
install_element(CELLMGR_NODE, &cfg_msc_ip_cmd);
install_element(CELLMGR_NODE, &cfg_msc_token_cmd);