9
0
Fork 0

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.
This commit is contained in:
Holger Hans Peter Freyther 2011-01-24 20:21:11 +01:00
parent 4e2e242d70
commit 3a1c0af868
3 changed files with 18 additions and 18 deletions

View File

@ -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 *);

View File

@ -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);

View File

@ -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;