/* snmp protocol stuff */ #define DROCOMM "public" #define DRWCOMM "private" #define DTIMEOUT 5 #define DRETRIES 1 #define DNREP 5 #define DMAXREP 10 #define DMAX_PKT 20480 #define DPORT "snmp" #define DVERSION 1 #define MAX_LEN 50 /* max char len of oids and values */ #define MAX_ELEM 32 /* max number of in a single snmp packet */ #define MAX_OID 16 /* max oid length */ /* error codes */ #define FATAL 2 int DEBUG = 0; /* snmp asn1 primitive types */ enum { IpAddress = 0x40, Counter = 0x41, Gauge = 0x42, TimeTicks = 0x43, Opaque = 0x44, NsapAddress = 0x45, Counter64 = 0x46, UIInteger32 = 0x47, EndOfMIB = 0x82 }; /* error codes for pdu parsing */ enum { noError, tooBig, noSuchName, badValue, readOnly, genErr, noAccess, wrongType, wrongLength, wrongEncoding, wrongValue, noCreation, inconsistenValue, resourceUnavailable, commitFailed, undoFailed, authorizationError, notWritable, inconsistentName }; /* error codes for trap-pdu */ enum { coldstart, warmstart, linkdown, linkup, authfailure, neightborloss, enterprise }; /* pdu types for snmp v1 and v2 (implicit sequences) */ /* WalkRequest is ficticious, and GetNextRequest is used */ /* to walk the snmp tree. See dosnmp() for the details. */ enum { GetRequest = 0xa0, GetNextRequest = 0xa1, WalkRequest = 0xa8, GetResponse = 0xa2, SetRequest = 0xa3, Trap = 0xa4, GetBulkRequest = 0xa5, InformRequest = 0xa6, SNMPv2Trap = 0xa7 }; /* snmp structures */ typedef struct Pdu Pdu; typedef struct Packet Packet; typedef struct Traps Traps; typedef struct Tuple Tuple; typedef struct Session Session; struct Pdu { uchar type; int reqid; int errstat; int erridx; int nrep; int maxrep; int nbind; Tuple *varbind; }; struct Packet { int ver; char *comm; Pdu pdu; }; struct Traps { char *oid; char *addr; int type; char *ts; int nbind; Tuple *varbind; }; struct Tuple { char *oid; char *value; }; /* communities and hostnames are 20 chars max */ /* behaviour is truncate larger ones */ struct Session { char *host; char *port; char *rocomm; char *rwcomm; int timeout; int retries; }; /* snmp.c */ int error(int level, char *format, ... ); int alarmtr(void *v,char *why); int canwalk(Packet *orig, Packet * p1, Packet * p2); char* asn2char(Elem e); int encpkt(Packet *p, Bytes **pbytes); int dec_pdu(Elist * el, Pdu *p); int mkreqid(void); int decpkt(uchar *buff,int n,Packet *p); int pdu2asn(Elem *epdu,Elem * e); Elem char2asn(char *data); Elem mkvarbind(Packet *p); Elem mkpdu(int type, Elist *el); Elist * mkgetbulkreq(Packet *p); Elist * mkgetnreq(Packet *p); int mkwalk(Packet *p, Packet *o); int talk(Session *s, Packet *req, Packet *recv); char * dumppkt(Packet *s); char * doget(Session *s, Packet * req); char * dowalk(Session *s, Packet * req); char * dobulk(Session *s, Packet * req); char * doset(Session *s, Packet *req); char * dosnmp(Session *s, Packet * req); void freesession(Session *s); void freepdu(Pdu *p); void freepacket(Packet * p); void debugpkt(Packet *p); void debugses(Session *s);