aboutsummaryrefslogtreecommitdiffstats
path: root/src/link_udp.c
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 /src/link_udp.c
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.
Diffstat (limited to 'src/link_udp.c')
-rw-r--r--src/link_udp.c24
1 files changed, 11 insertions, 13 deletions
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);