aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2011-01-24 20:21:11 +0100
committerHolger Hans Peter Freyther <zecke@selfish.org>2011-01-24 20:21:11 +0100
commit3a1c0af8681f16d9ed3cebe4c23eaf50372e6932 (patch)
tree4e7556eba3cc65d111410e80142ff4ead27cb3ee
parent4e2e242d708a946363313a7320e5619255870396 (diff)
udp: Create a SNMP session per UDP
We do not have the multiple callbacks from SNMP under control and we can only save the last request if the SNMP Session is inside the link. This is mostly a workaround for Net-SNMP and the missing documentation on the async functionality.
-rw-r--r--include/bsc_data.h8
-rw-r--r--src/link_udp.c24
-rw-r--r--src/links.c4
3 files changed, 18 insertions, 18 deletions
diff --git a/include/bsc_data.h b/include/bsc_data.h
index 8b72785..698a33f 100644
--- a/include/bsc_data.h
+++ b/include/bsc_data.h
@@ -42,7 +42,6 @@ struct snmp_mtp_session;
struct mtp_udp_data {
struct write_queue write_queue;
- struct snmp_mtp_session *session;
struct timer_list snmp_poll;
struct llist_head links;
@@ -61,6 +60,9 @@ struct mtp_udp_link {
struct mtp_udp_data *data;
struct llist_head entry;
+
+ /* snmp for controlling the link */
+ struct snmp_mtp_session *session;
};
enum {
@@ -150,8 +152,8 @@ void update_con_state(struct mtp_link_set *link, int rc, struct sccp_parse_resul
unsigned int sls_for_src_ref(struct sccp_source_reference *ref);
/* udp init */
-int link_global_init(struct mtp_udp_data *data, char *dest_ip, int src_port);
-int link_udp_init(struct mtp_udp_link *data, const char *dest_ip, int port);
+int link_global_init(struct mtp_udp_data *data, int src_port);
+int link_udp_init(struct mtp_udp_link *data, char *dest_ip, int port);
int link_init(struct bsc_data *bsc);
int link_shutdown_all(struct mtp_link_set *);
int link_reset_all(struct mtp_link_set *);
diff --git a/src/link_udp.c b/src/link_udp.c
index 2dfc34b..c0df050 100644
--- a/src/link_udp.c
+++ b/src/link_udp.c
@@ -159,7 +159,7 @@ static void do_start(void *_data)
{
struct mtp_udp_link *link = (struct mtp_udp_link *) _data;
- snmp_mtp_activate(link->data->session, link->link_index);
+ snmp_mtp_activate(link->session, link->link_index);
}
static int udp_link_reset(struct mtp_link *link)
@@ -168,7 +168,7 @@ static int udp_link_reset(struct mtp_link *link)
ulnk = (struct mtp_udp_link *) link;
- snmp_mtp_deactivate(ulnk->data->session, ulnk->link_index);
+ snmp_mtp_deactivate(ulnk->session, ulnk->link_index);
return 0;
}
@@ -209,8 +209,14 @@ static int udp_link_start(struct mtp_link *link)
return 0;
}
-int link_udp_init(struct mtp_udp_link *link, const char *remote, int port)
+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;
@@ -237,18 +243,12 @@ static void snmp_poll(void *_data)
bsc_schedule_timer(&data->snmp_poll, 0, 5000);
}
-int link_global_init(struct mtp_udp_data *data, char *udp_ip, int src_port)
+int link_global_init(struct mtp_udp_data *data, int src_port)
{
struct sockaddr_in addr;
int fd;
int on;
- /* setup SNMP first, it is blocking */
- data->session = snmp_mtp_session_create(udp_ip);
- if (!data->session)
- return -1;
- data->session->data = data;
-
INIT_LLIST_HEAD(&data->links);
write_queue_init(&data->write_queue, 100);
@@ -295,12 +295,10 @@ int link_global_init(struct mtp_udp_data *data, char *udp_ip, int src_port)
void snmp_mtp_callback(struct snmp_mtp_session *session,
int area, int res, int link_id)
{
- struct mtp_udp_data *data;
struct mtp_udp_link *ulink;
struct mtp_link *link;
- data = session->data;
- ulink = find_link(data, link_id);
+ ulink = session->data;
if (!ulink)
return LOGP(DINP, LOGL_ERROR, "Failed to find link %d\n", link_id);
diff --git a/src/links.c b/src/links.c
index 086b95c..3977daf 100644
--- a/src/links.c
+++ b/src/links.c
@@ -116,7 +116,7 @@ int link_init(struct bsc_data *bsc)
LOGP(DINP, LOGL_NOTICE, "Using UDP MTP mode.\n");
- if (link_global_init(&bsc->udp_data, bsc->udp_ip, bsc->src_port) != 0)
+ if (link_global_init(&bsc->udp_data, bsc->src_port) != 0)
return -1;
@@ -140,7 +140,7 @@ int link_init(struct bsc_data *bsc)
* SLTM and it begins a reset. Then we will take it up
* again and do the usual business.
*/
- snmp_mtp_deactivate(lnk->data->session,
+ snmp_mtp_deactivate(lnk->session,
lnk->link_index);
bsc->start_timer.cb = start_rest;
bsc->start_timer.data = &bsc;