Conta com um grupo de rotinas que podem ser utilizadas em programas escritos na linguagem C.
O código da aplicação que se utilize da API deve incluir os seguintes arquivos em seu código fonte:
#include "snmp.h"
#include "snmp_impl.h"
#include "asn1.h"
#include "snmp_api.c"
#include "snmp_client.h"
3.2.1 snmp_open, snmp_close e snmp_send
Recebem como parâmetro de entrada um ponteiro para um objeto com a estrutura snmp_session. Adicionalmente, snmp_open também retorna um ponteiro para um objeto com mesma estrutura, mostrada abaixo.
A estrutura mencionada contém informações para um conjunto de transações que deverão compartilhar características similares de transporte.
typedef struct sockaddr_in ipaddr;
struct snmp_session {
u_char * community;
/* Comunidade destino das requisições
*/
int community_len; /*
Tamanho do nome da comunidade */
int retries;
/* Número de retentativas antes do timeout */
long timeout; /*
Número de microssegundos até o primeiro timeout */
char * peername; /*
Nome do domínio ou endereço IP do parceiro default */
u_short remote_port; /*
Porta UDP do parceiro */
u_short local_port; /*
Minha porta UDP local, 0 para default */
u_char *(*authenticator) (); /*
Função de autenticação ou NULL se é
utilizada autenticação nula */
int (*callback)(); /*
Função para interpretar dados que chegam */
void * callback_magic; /*
Ponteiro para dados que a função callback possa considerar
importantes */
}
Configurar campos na sessão e pdu para os valores seguintes, para ter um valor default:
#define SNMP_DEFAULT_COMMUNITY_LEN 0
#define SNMP_DEFAULT_RETRIES -1
#define SNMP_DEFAULT_TIMEOUT -1
#define SNMP_DEFAULT_REMPORT 0
#define SNMP_DEFAULT_REQID 0
#define SNMP_DEFAULT_ERRSTAT -1
#define SNMP_DEFAULT_ERRINDEX -1
#define SNMP_DEFAULT_ADDRESS 0
#define SNMP_DEFAULT_PEERNAME NULL
#define SNMP_DEFAULT_ENTERPRISE_LENGTH 0
#define SNMP_DEFAULT_TIME 0
A rotina u_char * authenticator (pdu, length, community, community_len) deve aparecer na aplicação, no caso de haver autenticação, onde:
u_char *pdu; /*
O resto da PDU a ser autenticada */
int *length; /*
O comprimento da PDU (atualizado pelo autenticador) */
u_char *community; /*
Nome da comunidade sobre a qual deve autenticar */
int community_len; /*
O comprimento do nome da comunidade */
A rotina retorna a pdu autenticada, ou NULL se a autenticação falhar. Se autenticação nula é utilizada, o autenticador em snmp_session pode ser configurado para NULL.
A rotina int callback (operation, session, reqid, pdu, magic) também deve ser suprida pela aplicação, onde:
int operation; /*
As operações são definidas abaixo */
struct snmp_session * session; /*
A sessão autenticada */
int reqid; /*
identificador para esta PDU (0 para trap) */
struct snmp_pdu *pdu; /*
A informação da PDU */
void * magic; /*
um link para os dados a serem passados a esta rotina */
Retorna 1 se o pedido retornou com sucesso, 0 se está pendente. Qualquer dado na pdu deve ser copiado porque será liberado.
Abaixo são definidas as operações:
#define RECEIVED_MESSAGE 1
#define TIMED_OUT 2
3.2.2 snmp_send e snmp_free_pdu
Recebem como parâmetro de entrada um ponteiro para um objeto com a estrutura snmp_pdu. A estrutura contém informações que descrevem uma transação que será realizada sobre uma sessão aberta.
struct snmp_pdu {
ipaddr address; /*
Endereço do parceiro */
int command; /*
Tipo de sua PDU */
u_long regid; /*
Identificação da requisição */
u_long errstat; /*
status de erro */
/* Informação de trap */
oid *enterprise; /*
OID do sistema */
int enterprise_length;
ipaddr agent_addr; /* endereço do objeto
gerador da trap */
int trap_type; /*
tipo da trap */
int specific_type; /*
tipo específico */
u_long time; /*
tempo que está ativo */
struct variable_list * variables;
};
struct variable_list {
struct variable_list * next_variable; /*
NULL para a última variável */
oid *name; /*
identificador da variável */
int name_length; /*
número do subid no nome */
u_char type; /*
tipo ASN de variável */
union { /* valor
da variável */
long *integer;
u_char *string;
oid *objid;
} val;
int val_len;
}
3.2.3 snmp_read e snmp_select_info e snmp_timeout
Provêm uma interface para o uso da chamada de sistema select de modo que transações SNMP possam ocorrer assincronamente. À snmp_select_info é dada a informação que seria passada a função select convencional. Esta informação é modificada a fim de que SNMP possa pegar o serviço que ele requisita da chamada ao select. Neste caso, numfds, fdset e timeout correspondem aos argumentos nfds, readfds e timeout do select, respectivamente. A única exceção é que timeout deve sempre apontar para uma estrutural timeval alocada. Se for passado um valor NULL para o timeout, o campo block é passado para TRUE e o timeout é tratado como indefinido. A mesma regra se aplica ao retorno da operação snmp_select_info.
Após chamar a operação snmp_select_info, select é chamada com o dado retornado. Quando select retorna, snmp_read é chamada com o fd_set retornado do select. Ele fará a leitura de todos os sockets SNMP com entrada. Se ocorrer um timeout na função select , snmp_timeout deveria ser chamada para ver o timeout era intencionado para SNMP.