aboutsummaryrefslogtreecommitdiffstats
path: root/src/link_udp.c
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2011-02-22 20:57:08 +0100
committerHolger Hans Peter Freyther <zecke@selfish.org>2011-02-23 15:25:35 +0100
commit7176030e02ca59d5b4ee015f24ee2bf733eeed8e (patch)
treeeed6a2bb6bd74d365a09e77cbdc875bfcac689ed /src/link_udp.c
parent2917644d503b706f0df5cf7228fc284a79436e31 (diff)
vty: Add all mighty new vty interface for osmo-stp
This new interface allows to have multiple linksets, msc connections and ways to connect those in one instance of the osmo-stp. Forbid to reset linksets without an app.
Diffstat (limited to 'src/link_udp.c')
-rw-r--r--src/link_udp.c78
1 files changed, 57 insertions, 21 deletions
diff --git a/src/link_udp.c b/src/link_udp.c
index bea67de..69d2ee9 100644
--- a/src/link_udp.c
+++ b/src/link_udp.c
@@ -231,28 +231,12 @@ static int udp_link_start(struct mtp_link *link)
int link_udp_init(struct mtp_udp_link *link, char *remote, int port)
{
- /* setup SNMP first, it is blocking */
- link->session = snmp_mtp_session_create(remote);
- if (!link->session)
- return -1;
- link->session->data = link;
-
- /* function table */
- link->base->shutdown = udp_link_shutdown;
- link->base->clear_queue = udp_link_dummy;
-
- link->base->reset = udp_link_reset;
- link->base->start = udp_link_start;
- link->base->write = udp_link_write;
-
/* prepare the remote */
memset(&link->remote, 0, sizeof(link->remote));
link->remote.sin_family = AF_INET;
link->remote.sin_port = htons(port);
inet_aton(remote, &link->remote.sin_addr);
- /* add it to the list of udp connections */
- llist_add_tail(&link->entry, &link->data->links);
return 0;
}
@@ -263,12 +247,8 @@ static void snmp_poll(void *_data)
bsc_schedule_timer(&data->snmp_poll, 0, 5000);
}
-int link_global_init(struct mtp_udp_data *data, int src_port)
+int link_global_init(struct mtp_udp_data *data)
{
- struct sockaddr_in addr;
- int fd;
- int on;
-
INIT_LLIST_HEAD(&data->links);
write_queue_init(&data->write_queue, 100);
@@ -278,6 +258,15 @@ int link_global_init(struct mtp_udp_data *data, int src_port)
data->write_queue.read_cb = udp_read_cb;
data->write_queue.write_cb = udp_write_cb;
+ return 0;
+}
+
+int link_global_bind(struct mtp_udp_data *data, int src_port)
+{
+ struct sockaddr_in addr;
+ int fd;
+ int on;
+
data->write_queue.bfd.fd = fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd < 0) {
LOGP(DINP, LOGL_ERROR, "Failed to create UDP socket.\n");
@@ -359,3 +348,50 @@ void snmp_mtp_callback(struct snmp_mtp_session *session,
area, link->nr, link->name, link->set->nr, link->set->name);
}
}
+
+struct mtp_udp_link *mtp_udp_link_init(struct mtp_link *blnk)
+{
+ struct bsc_data *bsc;
+ struct mtp_udp_link *lnk;
+
+ lnk = talloc_zero(blnk, struct mtp_udp_link);
+ if (!lnk) {
+ LOGP(DINP, LOGL_ERROR, "Failed to allocate.\n");
+ return NULL;
+ }
+
+ /* setup SNMP first, it is blocking */
+ lnk->session = snmp_mtp_session_create();
+ if (!lnk->session) {
+ LOGP(DINP, LOGL_ERROR, "Failed to allocate snmp session.\n");
+ talloc_free(lnk);
+ return NULL;
+ }
+ lnk->session->data = lnk;
+
+ bsc = blnk->set->bsc;
+ lnk->data = &bsc->udp_data;
+ lnk->reset_timeout = bsc->udp_reset_timeout;
+
+ lnk->base = blnk;
+ lnk->base->data = lnk;
+ lnk->base->type = SS7_LTYPE_UDP;
+ lnk->bsc = bsc;
+
+ /* function table */
+ lnk->base->shutdown = udp_link_shutdown;
+ lnk->base->clear_queue = udp_link_dummy;
+
+ lnk->base->reset = udp_link_reset;
+ lnk->base->start = udp_link_start;
+ lnk->base->write = udp_link_write;
+
+ /* prepare the remote */
+ memset(&lnk->remote, 0, sizeof(lnk->remote));
+ lnk->remote.sin_family = AF_INET;
+
+ /* add it to the list of udp connections */
+ llist_add_tail(&lnk->entry, &lnk->data->links);
+
+ return lnk;
+}