/* 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);
|