<br /><br />typedef unsigned char uint8;<br />typedef unsigned short uint16;<br />typedef unsigned int uint32;<br /><br />typedef signed char sint8;<br />typedef signed short sint16;<br />typedef signed int sint32;<br /><br />#define MAXOID 20<br />#define MAXKEY 4<br />#define MAXKLEN 22<br />#define MAXVAR 60<br /><br />#define scompare(a, b) strcmp((const char *)a, (const char *)b)<br />#define sncompare(a, b, c) strncmp((const char *)a, (const char *)b, c)<br />#define slength(a) strlen((const char *)a)<br />#define scopy(a, b) strcpy((char *)a, (const char *)b)<br />#define sncopy(a, b, c) strncpy((char *)a, (const char *)b, c)<br /><br />#define Integer 0x02ul<br />#define String 0x04ul<br />#define Null 0x05ul<br />#define Identifier 0x06ul<br />#define OctetString 0x14ul<br />#define Sequence 0x30ul<br />#define IpAddress 0x40ul<br />#define Counter 0x41ul<br />#define Counter32 0x41ul<br />#define Gauge 0x42ul<br />#define Ticks 0x43ul<br /><br />#define GetRequest 0xa0ul<br />#define GetNextRequest 0xa1ul<br />#define GetResponse 0xa2ul<br />#define TrapV1 0xa4ul<br />#define SetRequest 0xa3ul<br />#define GetBulkRequest 0xa5ul<br />#define Trap 0xa7ul<br />#define Report 0xa8ul<br /><br />/* Version 2 error values */<br />#define tooBig 1<br />#define noSuchName 2<br />#define badValue 3<br />#define readOnly 4<br />#define genErr 5<br />#define noAccess 6<br />#define wrongType 7<br />#define wrongLength 8<br />#define wrongEncoding 9<br />#define wrongValue 10<br />#define noCreation 11<br />#define inconsistentValue 12<br />#define resourceUnavailable 13<br />#define commitFailed 14<br />#define undoFailed 15<br />#define authorizationError 16<br />#define notWritable 17<br />#define inconsistentName 18<br /><br />#define IMMED 0x01 /* Immediate value in mvp->len */<br />#define IMMED2 0x02 /* Immediate value in mvp->type + len */<br />#define BASE1 0x03 /* Base 0 in data space, base 1 in MIB */<br />#define SCALAR 0x04 /* Table not indexed (no offset) */<br />#define W 0x08 /* Write allowed */<br />#define SX 0x10 /* Sequential table index inferred */<br />#define NWORDER 0x20 /* Network byte ordering for basic type */<br />#define CAR 0x40 /* Call application after read */<br />#define CAW 0x80 /* Call application before write */<br /><br />/* VACM return values */<br />#define accessAllowed 0<br />#define noSuchContext 1<br /><br />struct COUNTER64<br />{<br /> uint32 hi, lo;<br />};<br /><br />typedef struct<br />{<br /> uint8 nlen, name[MAXOID];<br />} OID;<br /><br />typedef struct<br />{<br /> OID oid; /* Object ID name and length */<br /> uint16 ix; /* Index values (offsets) */<br /> uint16 len; /* Length of table */<br /> void *empty; /* empty flag */<br />} MIBTAB;<br /><br />typedef struct<br />{<br /> OID oid; /* Object ID name and length */<br /> uint16 opt; /* Options (with choice) */<br /> uint8 type; /* Type of variable */<br /> sint16 len; /* Length of pointer field */<br /> void *ptr; /* Pointer to possible variable data */<br />} MIBVAR;<br /><br />/* Define SNMP access to a particular MIB */<br />typedef struct<br />{<br /> const MIBVAR *mvp; /* MIB variables */<br /> sint16 (*numvars)(void); /* Number of variables */<br /> const MIBTAB *mtp; /* MIB tables */<br /> sint16 (*numtabs)(void); /* Number of tables */<br /> void (*get)(sint16 varix, sint16 tabix, uint8 **vvptr);<br /> sint16 (*set)(sint16 varix, sint16 tabix);<br /> sint16 (*index)(sint16 varix, sint16 index);<br /> void (*init)(uint16 type); /* Initialize the MIB */<br /> sint16 (*check)(sint16 varix, sint16 tabix, const uint8 *inp);<br />} MIB;<br /><br />typedef struct<br />{<br /> const MIB **mibs; /* Array of pointers to host MIBs */<br /> uint16 nummibs; /* Number of host MIBs */<br /> uint16 trapv; /* Trap version and startup trap type */<br />} AGENT_CONTEXT;<br /><br />/* Function prototypes */<br />void snmpInit(void);<br />void SnmpRefresh(void);<br />sint16 inReqOutRep(uint8 **obp, uint16 olen, const uint8 *ibp, uint16 ilen);<br /><br />/* Mid-level API */<br />sint16 ussSNMPAgentInit(const AGENT_CONTEXT *ac);<br />sint16 ussSNMPAgentTrap(uint8 type, uint8 spec, unsigned char*contextName,<br /> const uint8 *vbs, uint16 len);<br /><br />/* Utility */<br />void snmpEncodeIndex(uint8 **pp, const MIB *mibp, const MIBTAB *mtp,<br /> sint16 tabix);<br /> <br />sint32 snmpVCompare(const uint8 *op1, sint16 len1, const uint8 *op2, sint16 len2);<br /><br />sint32 snmpFindOID(const uint8 **retp, const uint8 *base, sint16 osize,<br /> sint16 onum, const uint8 *valp, sint16 vlen);<br />sint32 snmpFindIndex(sint16 *tabixp, const MIBTAB *mtp,<br /> const MIB *mibp, const MIBVAR *mvp,<br /> const uint8 *reqixname, uint8 reqixlen, uint8 nflag);<br /> <br />void snmpEncodeID(uint8 **pp, uint8 olen, uint32 val);<br /><br />sint16 snmpReadLength(const uint8 **pp, uint16 type);<br />sint16 snmpReadInt(uint32 *outp, uint8 olen, const uint8 **inp, uint16 type);<br />sint16 snmpReadVal(uint8 *outp, uint8 olen, const uint8 **inp, uint16 type);<br /><br />void snmpRWriteLength(uint8 **pp, uint16 type, sint16 len);<br />void snmpRWriteInt(uint8 **pp, uint32 val, uint16 type, sint16 len);<br />void snmpRWriteVal(uint8 **pp, const uint8 *vp, uint16 type, sint16 len);<br /><br />/* VACM module */<br />sint16 isAccessAllowed(const uint8 *contextName); <br /><br /><br /><br /><br />// snmpFindIndex() Find a table entry index<br /><br />sint32 snmpFindIndex(sint16 *tabixp, const MIBTAB *mtp,<br /> const MIB *mibp, const MIBVAR *mvp,<br /> const uint8 *reqixname, uint8 reqixlen, uint8 nflag)<br />{<br /> <br /> <br /> uint8 *cp;<br /> sint32 sl1, sl2;<br /> sint16 i1, i3;<br /> uint8 ixname[MAXKLEN];<br /><br /> /* Default return values */<br /> *tabixp = -1;<br /> sl2 = 0;<br /><br /> /* Search through each table entry's index for the element */<br /> for (i1 = 0; ; i1++)<br /> {<br /> i3 = mibp->index(mvp - mibp->mvp, i1);<br /> if (i3 < 0)<br /> break; /* -1 -- End of table reached */<br /> if (i3 == 0)<br /> continue; /* 0 -- Skip table entry */<br /><br /> /* Encode the table entry at the current index */<br /> cp = ixname + MAXKLEN;<br /> snmpEncodeIndex(&cp, mibp, mtp, i1);<br /><br /> /*<br /> ** Compare agent encoding with requested encoding.<br /> ** Save the smallest positive difference.<br /> */<br /> sl1 = snmpVCompare(cp, (const uint8 *)&ixname[MAXKLEN] - cp,<br /> reqixname, reqixlen);<br /> <br /> if (nflag)<br /> {<br /> if (sl1 >= 255) <br /> {<br /> sl2 = 1;<br /> break;<br /> }<br /> }<br /> else<br /> {<br /> if (sl1 == 0)<br /> {<br /> sl2 = 1;<br /> break;<br /> }<br /> }<br /> }<br /> <br /> *tabixp = i1;<br /><br /> return sl2;<br />} |
|