diff options
author | Holger Hans Peter Freyther <zecke@selfish.org> | 2011-01-24 20:21:11 +0100 |
---|---|---|
committer | Holger Hans Peter Freyther <zecke@selfish.org> | 2011-01-24 20:21:11 +0100 |
commit | 3a1c0af8681f16d9ed3cebe4c23eaf50372e6932 (patch) | |
tree | 4e7556eba3cc65d111410e80142ff4ead27cb3ee /src | |
parent | 4e2e242d708a946363313a7320e5619255870396 (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')
-rw-r--r-- | src/link_udp.c | 24 | ||||
-rw-r--r-- | src/links.c | 4 |
2 files changed, 13 insertions, 15 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); 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; |