331 lines
8.0 KiB
C
331 lines
8.0 KiB
C
/*************************************************/
|
|
/*Title: snmp.h */
|
|
/*Descr: SNMP Agent(Head File) */
|
|
/*Author: Liang Hanxi */
|
|
/*Create: 2002-4-1 */
|
|
/*Modify: 2002-6-25 */
|
|
/*************************************************/
|
|
|
|
#ifndef _SNMP_HEAD_FILE
|
|
#define _SNMP_HEAD_FILE
|
|
#include "../../../debug/src/include/debug.h"
|
|
#include "../../../iptrans/src/include/iptrans.h"
|
|
#include <stdarg.h>
|
|
#include <stdlib.h>
|
|
#include <time.h>
|
|
#include <ctype.h>
|
|
#include <math.h>
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <unistd.h>
|
|
#include <string.h>
|
|
|
|
|
|
#define SNMP_DEBUG_MASK 0
|
|
#define SNMP_DEBUG_LOG 0
|
|
|
|
#define SNMP_VERSION {9, 0, 1}
|
|
#define SNMP_V1 0
|
|
#define SNMP_V2 1
|
|
#define COMMUNITY "public"
|
|
#define SNMP_ANY_COMMUNITY 0 //Should be set to 1 if snmp module is invoked in OMC
|
|
#define BIND_MAX 50
|
|
#define OID_MAXLEN 32
|
|
//#define FIX_OID {0x2b,0x06,0x01,0x04,0x01,0x8a,0x5d,0x01,0x01}
|
|
#define FIX_OID {1,3,6,1,4,1,1373,1,3}
|
|
//{iso(1).org(3).dod(6).internet(1).private(4).enterprises(1).interWAVE(1373).1.1}
|
|
#define FIX_OIDLEN 8
|
|
#define SNMP_OID {1,3,6,1,4,1,1373,1,3,2,3,3}
|
|
#define SNMP_OIDLEN 12
|
|
|
|
#define HEAP_SIZE 500*1024
|
|
#define SNMP_PORT 4957
|
|
#define SNMP_VAR_MAX 1600
|
|
//PDU
|
|
#define PDU_GET 0
|
|
#define PDU_GETNEXT 1
|
|
#define PDU_RSP 2
|
|
#define PDU_SET 3
|
|
#define PDU_GETBULK 5
|
|
#define PDU_INFORM 6
|
|
#define PDU_TRAP 7
|
|
#define PDU_REPORT 8
|
|
//variable type
|
|
#define NoSuchObject 0x80
|
|
#define NosuchInstance 0x81
|
|
#define EndOfMibView 0x82
|
|
|
|
//Debug
|
|
#define SNMPDB_IN 0x00
|
|
#define SNMPDB_OUT 0x01
|
|
#define SNMPDB_ERR 0x02
|
|
#define SNMPDB_NOREG 0x04
|
|
#define SNMPDB_VALUE 0x10
|
|
#define SNMPDB_ALARM 0x20
|
|
#define SNMPDB_MIB 0x40
|
|
#define SNMPDB_SYS 0x80
|
|
|
|
#ifndef _T_BYTE
|
|
#define _T_BYTE
|
|
typedef unsigned char BYTE;
|
|
#endif
|
|
|
|
#ifndef _T_BOOL
|
|
#define _T_BOOL
|
|
typedef unsigned char BOOL;
|
|
#endif
|
|
|
|
#ifndef _T_DWORD
|
|
#define _T_DWORD
|
|
typedef unsigned int DWORD;
|
|
#endif
|
|
|
|
#ifndef _T_WORD
|
|
#define _T_WORD
|
|
typedef unsigned short WORD;
|
|
#endif
|
|
|
|
// by simon at 23/9/25
|
|
//char SnmpVer[16];
|
|
|
|
typedef struct var_list{
|
|
DWORD oid[OID_MAXLEN];
|
|
BYTE oidlen;
|
|
BYTE vartype;
|
|
short msglen;
|
|
BYTE msg[SNMP_VAR_MAX];
|
|
}var_list;
|
|
|
|
typedef struct snmp_pdu //protocol data unit
|
|
{
|
|
BYTE pdu_type; //0-get request 2-get(set) respond 3-set request 7-trap
|
|
DWORD request_id;
|
|
char community[16];
|
|
BYTE var_num;
|
|
var_list var[BIND_MAX];
|
|
BYTE error_status; //0:no error 1:too big 2:nosuchname 3:badvalue 4:readonly 5:generr
|
|
BYTE error_index;
|
|
//add by yizane start
|
|
DWORD non_repeaters; //in getbulk replace error_status
|
|
DWORD max_repetitions; //in getbulk replace error_index
|
|
//add by yizane end
|
|
} snmp_pdu;
|
|
|
|
typedef struct snmp_addr
|
|
{
|
|
unsigned int remote_ip; //DWORD remote_ip;
|
|
unsigned int local_ip; //DWORD local_ip;
|
|
WORD remote_port;
|
|
WORD local_port;
|
|
BYTE broadcast;
|
|
} snmp_addr;
|
|
|
|
typedef struct snmp_msg
|
|
{
|
|
snmp_addr addr;
|
|
message_list msglist;
|
|
}snmp_msg;
|
|
|
|
typedef struct snmp_buf
|
|
{
|
|
snmp_msg msgout[256];
|
|
BYTE readsub, writesub;
|
|
}snmp_buf;
|
|
|
|
//snmp_buf snmp_outbuf;
|
|
|
|
typedef struct snmp_filter
|
|
{
|
|
BYTE flag;
|
|
BYTE type;
|
|
BYTE oidlen;
|
|
DWORD ip;
|
|
DWORD oid[OID_MAXLEN];
|
|
short local_port;
|
|
short remote_port;
|
|
|
|
|
|
}snmp_filter;
|
|
|
|
#define MAX_SNMP_RECORD 32
|
|
#define SNMP_SHM_KEY 0x60000001
|
|
#define SNMP_SHM_PERM 0666
|
|
|
|
typedef struct snmp_log_info
|
|
{
|
|
BYTE currentNo; /*from 0-MAX_SNMP_RECORD-1 */
|
|
char log_info[MAX_SNMP_RECORD][512];
|
|
}snmp_log_info;
|
|
|
|
|
|
/*---------------------------------------*/
|
|
typedef void (*trapcall)(BYTE oidlen, DWORD *oid, BYTE *pdata,WORD len,snmp_addr *addr);
|
|
typedef int (*setcall)(BYTE oidlen, DWORD *oid, BYTE *pdata,WORD len);
|
|
typedef int (*getcall)(BYTE oidlen, DWORD *oid, BYTE *pdata,BYTE *vartype);
|
|
//add by yizane start
|
|
typedef int (*getnextcall)(BYTE in_oidlen, DWORD *in_oid, BYTE *oidlen, DWORD *oid, BYTE *pdata,BYTE *vartype);
|
|
//add by yizane end
|
|
typedef void (*rspcall)(snmp_pdu *pdu,snmp_addr *addr);
|
|
typedef int (*snmpcall)(snmp_pdu *pdu,snmp_addr *addr);
|
|
|
|
typedef struct mib_nod{
|
|
DWORD id;
|
|
trapcall trap_proc;
|
|
setcall set_proc;
|
|
getcall get_proc;
|
|
//add by yizane start
|
|
getnextcall getnext_proc;
|
|
//add by yizane end
|
|
rspcall rsp_proc;
|
|
snmpcall snmp_proc;
|
|
struct mib_nod *pnext;
|
|
struct mib_nod *psub;
|
|
}mib_nod;
|
|
|
|
typedef struct snmp_csta{
|
|
DWORD timestamp;
|
|
DWORD trap_in;
|
|
DWORD trap_out;
|
|
DWORD set_in;
|
|
DWORD set_out;
|
|
DWORD get_in;
|
|
DWORD get_out;
|
|
//add by yizane start
|
|
DWORD getnext_in;
|
|
DWORD getnext_out;
|
|
DWORD getbulk_in;
|
|
DWORD getbulk_out;
|
|
//add by yizane end
|
|
DWORD rsp_in;
|
|
DWORD rsp_out;
|
|
DWORD fail_parse;
|
|
DWORD not_register;
|
|
DWORD fail_build;
|
|
}snmp_csta;
|
|
|
|
typedef struct snmp_mib{
|
|
BYTE sysid[2];
|
|
BYTE setpasswd[10];
|
|
BYTE getpasswd[10];
|
|
DWORD set_oid[64][20];
|
|
DWORD get_oid[64][20];
|
|
DWORD trap_oid[64][20];
|
|
DWORD rsp_oid[64][20];
|
|
}snmp_mib;
|
|
|
|
/********************************************************************/
|
|
/* Macros For ASN.1 Encoding */
|
|
/********************************************************************/
|
|
#define insert_length(buf,pos,len) {\
|
|
if(len<0)\
|
|
{\
|
|
snmp_debug(SNMPDB_ERR,"length should be larger than zero.");\
|
|
return 0;\
|
|
}\
|
|
else if(len<0x80)\
|
|
*(buf+pos--)=len;\
|
|
else if(len<0x100)\
|
|
{\
|
|
*(buf+pos--)=len;\
|
|
*(buf+pos--)=0x81;\
|
|
}\
|
|
else if(len<1600)\
|
|
{\
|
|
*(buf+pos--)=len & 0xFF;\
|
|
*(buf+pos--)=len >>8;\
|
|
*(buf+pos--)=0x82;\
|
|
}\
|
|
else\
|
|
{\
|
|
snmp_debug(SNMPDB_ERR,"Length(%d) exceed limit.varindex=%d",len,var_num);\
|
|
return 0;\
|
|
}\
|
|
}
|
|
|
|
#define enc_integer(buf,pos,val) {\
|
|
if(val<0)\
|
|
{\
|
|
snmp_debug(SNMPDB_ERR,"integer should larger than zero.val=%d",val);\
|
|
return -1;\
|
|
}\
|
|
else if(val<0x80)\
|
|
{\
|
|
*(buf+pos--)=(BYTE)val;\
|
|
*(buf+pos--)=1;\
|
|
}\
|
|
else if(val<0x8000)\
|
|
{\
|
|
*(buf+pos--)=val & 0xFF;\
|
|
*(buf+pos--)=val>>8;\
|
|
*(buf+pos--)=2;\
|
|
}\
|
|
else if(val<0x800000)\
|
|
{\
|
|
*(buf+pos--)= val & 0xFF;\
|
|
*(buf+pos--)=(val & 0xFFFF)>>8;\
|
|
*(buf+pos--)=val>>16;\
|
|
*(buf+pos--)=3;\
|
|
}\
|
|
else if(val<0x80000000)\
|
|
{\
|
|
*(buf+pos--)= val & 0xFF;\
|
|
*(buf+pos--)=(val & 0xFFFF)>>8;\
|
|
*(buf+pos--)=(val & 0xFFFFFF)>>16;\
|
|
*(buf+pos--)=val>>24;\
|
|
*(buf+pos--)=4;\
|
|
}\
|
|
else if(val<0xFFFFFFFF)\
|
|
{\
|
|
*(buf+pos--)= val & 0xFF;\
|
|
*(buf+pos--)=(val & 0xFFFF)>>8;\
|
|
*(buf+pos--)=(val & 0xFFFFFF)>>16;\
|
|
*(buf+pos--)=val>>24;\
|
|
*(buf+pos--)=0;\
|
|
*(buf+pos--)=5;\
|
|
}\
|
|
else\
|
|
{\
|
|
snmp_debug(SNMPDB_ERR,"Integer's value exceed limit.val=%d",val);\
|
|
return -1;\
|
|
}\
|
|
}
|
|
|
|
void snmp_init(WORD nport);
|
|
void snmpmib_init();
|
|
void snmp_timer();
|
|
int snmp_send(snmp_pdu *msgbuf,snmp_addr *addr);
|
|
int snmp_plat_send(snmp_pdu *msgbuf,snmp_addr *addr);
|
|
int snmp_receive(snmp_pdu *msgbuf,snmp_addr *addr);
|
|
int get_response(BYTE oidlen, DWORD *oid, BYTE *pdata,BYTE *vartype);
|
|
int set_response(BYTE oidlen, DWORD *oid, BYTE *pdata,WORD datalen);
|
|
//add by yizane start
|
|
int getnext_response(BYTE pr_oidlen, DWORD *pre_oid, BYTE *oidlen, DWORD *oid, BYTE *pdata,BYTE *vartype);
|
|
//add by yizane end
|
|
void inquire_trapmsg(trapcall trap_proc);
|
|
void inquire_setmsg(BYTE oidlen,DWORD *oid,setcall set_proc);
|
|
void inquire_getmsg(BYTE oidlen,DWORD *oid,getcall get_proc);
|
|
void inquire_rspmsg(BYTE oidlen,DWORD *oid,rspcall rsp_proc);
|
|
void inquire_snmpmsg(BYTE oidlen,DWORD *oid,snmpcall snmp_proc);
|
|
//add by yizane start
|
|
void inquire_getnextmsg(BYTE oidlen,DWORD *oid,getnextcall getnext_proc);
|
|
//add by yizane end
|
|
void rob_trapmsg(BYTE oidlen,DWORD *oid,trapcall trap_proc);
|
|
BYTE encode_integer(BYTE *buf,DWORD val);
|
|
DWORD decode_integer(BYTE *buf,BYTE len);
|
|
void snmp_log(char *info);
|
|
void snmp_debug(DWORD mask, const char *fmt,...);
|
|
void snmp_showbuf(DWORD mask, BYTE *buf, int len);
|
|
void snmp_logmsg(DWORD mask, snmp_pdu *pdu, snmp_addr *addr);
|
|
void snmp_debug_setup();
|
|
void snmp_debug_timer();
|
|
void snmp_debug_csta(BYTE npage,int instance);
|
|
void snmp_debug_hb(BYTE npage);
|
|
void snmp_init_serial_number(BYTE *Serial);
|
|
void snmp_set_timenosync();//call of this function will tell snmp module do not sync the omc time
|
|
|
|
#include "table.h"
|
|
|
|
/********************************************************************/
|
|
#endif
|
|
|