📄 asnapi.c
字号:
#include "VxWorks.h"
#include "sockLib.h"
#include "inetLib.h"
#include "taskLib.h"
#include "stdioLib.h"
#include "strLib.h"
#include "ioLib.h"
#include "fioLib.h"
#include "snmp.h"
char *asnGetType(char *buf,int *buflen,char *type)
{
(*type) = buf[0];
(*buflen) = (*buflen) - 1;
return (buf + 1);
}
char *asnGetLen(char *buf,int *buflen,int *asnlen)
{
int count = 0;
int number,temp,len;
char backup;
if(buf[count] < 0x80)
{
(*asnlen) = buf[count];
(*buflen) = (*buflen) - 1;
if((*asnlen) > (*buflen))
return (char *)ERROR;
return (buf + 1);
}
else
{
number = buf[count]&0x7f;
if(number > (*buflen))
return (char *)ERROR;
count++;
for(temp = len = 0;temp < number;temp++)
{
backup = buf[count + temp];
len = (len <<8) + backup;
}
(*asnlen) = len;
(*buflen) = (*buflen) - 1 - number;
if((*asnlen) > (*buflen))
return (char *)ERROR;
return (buf + 1 + number);
}
}
char *asnGetVersion(SNMP_PDU *snmp,char *buf,int *buflen)
{
snmp->version = buf[0];
(*buflen) = (*buflen) - 1;
return (buf + 1);
}
char *asnGetCommuName(SNMP_PDU *snmp,char *buf,int *buflen,int *asnlen)
{
if((*asnlen) > (*buflen))
return (char *)ERROR;
snmp->community_len = (*asnlen);
snmp->community = snmpMalloc((*asnlen));
memcpy(snmp->community,buf,(*asnlen));
(*buflen) = (*buflen) - (*asnlen);
return (buf + (*asnlen));
}
char *asnGetPduCommand(SNMP_PDU *snmp,char *buf,int *buflen)
{
snmp->command = buf[0];
(*buflen) = (*buflen) - 1;
return (buf + 1);
}
char *asnGetRequestID(SNMP_PDU *snmp,char *buf,int *buflen,int *asnlen)
{
int len;
if((*asnlen) > (*buflen))
return (char *)ERROR;
for(len = snmp->reqid = 0 ; len < (*asnlen); len++)
snmp->reqid = (snmp->reqid<<8) + buf[len];
HTONL(snmp->reqid);
(*buflen) = (*buflen) - (*asnlen);
return (buf + (*asnlen));
}
char *asnGetErrorStatus(SNMP_PDU *snmp,char *buf,int *buflen,int *asnlen)
{
snmp->errstat = buf[0];
(*buflen) = (*buflen) - 1;
return (buf + 1);
}
char *asnGetErrorIndex(SNMP_PDU *snmp,char *buf,int *buflen,int *asnlen)
{
snmp->errindex = buf[0];
(*buflen) = (*buflen) - 1;
return (buf + 1);
}
//获取VARLIST中的OID以及紧跟着的VALUE
char *asnGetOID(SNMP_PDU *snmp,char *buf,int *buflen,int *asnlen)
{
int len;
VARLIST *temp,*swap;
temp = snmpMalloc(sizeof(VARLIST));
temp->next = temp->value = NULL;
temp->oid_len = (*asnlen);
memcpy(temp->oid, buf, (*asnlen));
(*buflen) = (*buflen) - (*asnlen);
buf = (buf + (*asnlen));
if((buf = (char *)asnGetType(buf,buflen,&(temp->type))) == (char *)ERROR)
return (char *)ERROR;
switch(temp->type)
{
case TAG_NULL:
(*buflen) = (*buflen) - 1;
buf = (buf + 1);
break;
case TAG_OCTET:
case TAG_INTERGER:
default:
if((buf = (char *)asnGetLen(buf,buflen,(int *)&len)) == (char *)ERROR)
return (char *)ERROR;
temp->value_len = len;
temp->value = snmpMalloc(len);
memcpy(temp->value, buf, len);
(*buflen) = (*buflen) - len;
buf = (buf + len);
break;
}
swap = snmp->variables;
if(swap == NULL)
snmp->variables = temp;
else
{
for(;swap->next != NULL; swap = swap->next);
swap->next = temp;
}
return buf;
}
//下面的全部都是Trap专用PDU报文处理函数
char *asnGetEntID(SNMP_PDU *snmp,char *buf,int *buflen,int *asnlen)
{
if((*asnlen) > (*buflen))
return (char *)ERROR;
snmp->enterprise_length = (*asnlen);
snmp->enterprise = snmpMalloc((*asnlen));
memcpy(snmp->enterprise, buf, (*asnlen));
(*buflen) = (*buflen) - (*asnlen);
return (buf + (*asnlen));
}
char *asnGetAgentIP(SNMP_PDU *snmp, char *buf,int *buflen,int *asnlen)
{
if((*asnlen) > (*buflen))
return (char *)ERROR;
memcpy(snmp->agent_addr, buf, (*asnlen));
(*buflen) = (*buflen) - (*asnlen);
return (buf + (*asnlen));
}
char *asnGetTraptype(SNMP_PDU *snmp,char *buf,int *buflen,int *asnlen)
{
snmp->trap_type = buf[0];
(*buflen) = (*buflen) - 1;
return (buf + 1);
}
char *asnGetSpecTrap(SNMP_PDU *snmp,char *buf,int *buflen,int *asnlen)
{
int len;
if((*asnlen) > (*buflen))
return (char *)ERROR;
for(len = snmp->specific_type = 0 ; len < (*asnlen); len++)
snmp->specific_type = (snmp->specific_type<<8) + buf[len];
(*buflen) = (*buflen) - (*asnlen);
return (buf + (*asnlen));
}
char *asnGetTrapTime(SNMP_PDU *snmp,char *buf,int *buflen,int *asnlen)
{
int len;
if((*asnlen) > (*buflen))
return (char *)ERROR;
for(len = snmp->time = 0 ; len < (*asnlen); len++)
snmp->time = (snmp->time<<8) + buf[len];
(*buflen) = (*buflen) - (*asnlen);
return (buf + (*asnlen));
}
//传入的OUT不要忘记申请内存
int OIDLongToChar(const u_long *input,int inlen,char *out,int *outlen)
{
int intemp,outemp;
long s1,s2;
if(inlen == 1)
{
s1 = input[0];
if(s1 < 4)
{
out[0] = s1 * 40;
return TRUE;
}
return ERROR;
}
for(intemp = outemp = 0; intemp < inlen; )
{
if(intemp == 0)
{
s1 = input[0];
s2 = input[1];
out[0] = s1 * 40 + s2;
if(out[0] > 0x7f)
{
return ERROR;
}
outemp = 1;
intemp = 2;
}
else
{
s1 = input[intemp];
if( (s1&0xffffff80) == 0 )
out[outemp] = (s1&0x7f);
else
{
out[outemp] = ((s1/128) | 0x80);
outemp++;
out[outemp] = (s1%128);
}
outemp++;
intemp++;
}
}
(*outlen) = outemp + 1;
return TRUE;
}
//传入的OUT不要忘记申请内存
int OIDCharToLong(char *input,int inlen,long *out,long *outlen)
{
int intemp,outemp;
long s1,s2;
for(intemp = outemp = 0; intemp < inlen; )
{
if(intemp == 0)
{
s1 = input[0]/40;
s2 = input[0]%40;
out[0] = s1;
out[1] = s2;
outemp = 2;
intemp = 1;
}
else
{
if(outemp > MAX_OIDLEN)
return ERROR;
s1 = input[intemp];
if( s1 < 0x80 )
out[outemp] = s1;
else
{
s2 = input[intemp + 1];
out[outemp] = ((s1&0x7f)*128) + s2;
intemp++;
}
outemp++;
intemp++;
}
}
(*outlen) = outemp;
return TRUE ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -