/*++ Copyright (c) 1996 Microsoft Corporation Module Name: snmpexts.h Abstract: Definitions for SNMP extension agents. --*/ #ifndef _INC_SNMPEXTS_ #define _INC_SNMPEXTS_ /////////////////////////////////////////////////////////////////////////////// // // // Mib version // // // /////////////////////////////////////////////////////////////////////////////// #define MIB_VERSION 0x01 // increment if structure changes /////////////////////////////////////////////////////////////////////////////// // // // Mib view types (use opaque if SnmpExtensionQuery preferred) // // // /////////////////////////////////////////////////////////////////////////////// #define MIB_VIEW_NORMAL 0x01 // callback via mib structure #define MIB_VIEW_OPAQUE 0x02 // call directly with varbinds /////////////////////////////////////////////////////////////////////////////// // // // Mib entry access types // // // /////////////////////////////////////////////////////////////////////////////// #define MIB_ACCESS_NONE 0x00 // entry not accessible #define MIB_ACCESS_READ 0x01 // entry can be read #define MIB_ACCESS_WRITE 0x02 // entry can be written #define MIB_ACCESS_ALL 0x03 // entry can be read and written /////////////////////////////////////////////////////////////////////////////// // // // Mib callback request types // // // /////////////////////////////////////////////////////////////////////////////// #define MIB_ACTION_SET ASN_RFC1157_SETREQUEST #define MIB_ACTION_GET ASN_RFC1157_GETREQUEST #define MIB_ACTION_GETNEXT ASN_RFC1157_GETNEXTREQUEST #define MIB_ACTION_GETFIRST (ASN_PRIVATE|ASN_CONSTRUCTOR|0x00) #define MIB_ACTION_VALIDATE (ASN_PRIVATE|ASN_CONSTRUCTOR|0x01) #define MIB_ACTION_CLEANUP (ASN_PRIVATE|ASN_CONSTRUCTOR|0x02) /////////////////////////////////////////////////////////////////////////////// // // // Callback definitions // // // /////////////////////////////////////////////////////////////////////////////// typedef UINT (* MIB_ACTION_FUNC)( IN UINT actionId, // action requested IN OUT AsnAny * objectArray, // array of variables OUT UINT * errorIndex // index of item in error ); typedef UINT (* MIB_EVENT_FUNC)(); // event callback #define MIB_S_SUCCESS ERROR_SUCCESS #define MIB_S_NOT_SUPPORTED ERROR_NOT_SUPPORTED #define MIB_S_NO_MORE_ENTRIES ERROR_NO_MORE_ITEMS #define MIB_S_ENTRY_NOT_FOUND ERROR_FILE_NOT_FOUND #define MIB_S_INVALID_PARAMETER ERROR_INVALID_PARAMETER /////////////////////////////////////////////////////////////////////////////// // // // Mib entry definition // // // /////////////////////////////////////////////////////////////////////////////// typedef struct _SnmpMibEntry { AsnObjectIdentifier mibOid; // relative oid UCHAR mibType; // asn scalar type UCHAR mibAccess; // mib access type UCHAR mibGetBufOff; // index into get array UCHAR mibSetBufOff; // index into set array USHORT mibGetBufLen; // total size of get array USHORT mibSetBufLen; // total size of set array MIB_ACTION_FUNC mibGetFunc; // user-supplied callback MIB_ACTION_FUNC mibSetFunc; // user-supplied callback INT mibMinimum; // minimum value allowed INT mibMaximum; // maximum value allowed } SnmpMibEntry; typedef struct _SnmpMibEntryList { SnmpMibEntry * list; // list of mib entries UINT len; // list length } SnmpMibEntryList; /////////////////////////////////////////////////////////////////////////////// // // // Mib table definition // // // /////////////////////////////////////////////////////////////////////////////// typedef struct _SnmpMibTable { UINT numColumns; // number of table entries UINT numIndices; // number of table indices SnmpMibEntry * tableEntry; // pointer to table root SnmpMibEntry ** tableIndices; // pointer to index indices } SnmpMibTable; typedef struct _SnmpMibTableList { SnmpMibTable * list; // list of mib tables UINT len; // list length } SnmpMibTableList; /////////////////////////////////////////////////////////////////////////////// // // // Mib view definition // // // /////////////////////////////////////////////////////////////////////////////// typedef struct _SnmpMibView { DWORD viewVersion; // structure version DWORD viewType; // opaque or normal AsnObjectIdentifier viewOid; // root oid of view SnmpMibEntryList viewScalars; // list of entries SnmpMibTableList viewTables; // list of tables } SnmpMibView; typedef struct _SnmpMibViewList { SnmpMibView * list; // list of supported views UINT len; // list length } SnmpMibViewList; /////////////////////////////////////////////////////////////////////////////// // // // Mib event definition // // // /////////////////////////////////////////////////////////////////////////////// typedef struct _SnmpMibEvent { HANDLE event; // subagent event handle MIB_EVENT_FUNC eventFunc; // subagent event callback } SnmpMibEvent; typedef struct _SnmpMibEventList { SnmpMibEvent * list; // list of supported events UINT len; // list length } SnmpMibEventList; /////////////////////////////////////////////////////////////////////////////// // // // Extension agent framework functions // // // /////////////////////////////////////////////////////////////////////////////// typedef LPVOID SnmpTfxHandle; SnmpTfxHandle SNMP_FUNC_TYPE SnmpTfxOpen( DWORD numViews, SnmpMibView * supportedViews ); BOOL SNMP_FUNC_TYPE SnmpTfxQuery( SnmpTfxHandle tfxHandle, BYTE requestType, RFC1157VarBindList * vbl, AsnInteger * errorStatus, AsnInteger * errorIndex ); VOID SNMP_FUNC_TYPE SnmpTfxClose( SnmpTfxHandle tfxHandle ); /////////////////////////////////////////////////////////////////////////////// // // // Other definitions // // // /////////////////////////////////////////////////////////////////////////////// #define ASN_PRIVATE_EOM (ASN_PRIVATE|ASN_PRIMATIVE|0x00) #define ASN_PRIVATE_NODE (ASN_PRIVATE|ASN_PRIMATIVE|0x01) #define IDS_SIZEOF(ids) (sizeof(ids)/sizeof(UINT)) #define MIB_OID(ids) {IDS_SIZEOF(ids),(ids)} #define ELIST_SIZEOF(x) (sizeof(x)/sizeof(SnmpMibEntry)) #define MIB_ENTRIES(x) {(x),ELIST_SIZEOF(x)} #define TLIST_SIZEOF(x) (sizeof(x)/sizeof(SnmpMibTable)) #define MIB_TABLES(x) {(x),TLIST_SIZEOF(x)} #define MIB_ADDR(x) (&(x)) #define MIB_ID(x) x #define MIB_VIEW(x) \ {MIB_VERSION, \ MIB_VIEW_NORMAL, \ MIB_OID(ids_ ## x), \ MIB_ENTRIES(mib_ ## x), \ MIB_TABLES(tbl_ ## x)} #define MIB_GROUP(x) \ {MIB_OID(ids_ ## x), \ ASN_PRIVATE_NODE, \ MIB_ACCESS_NONE, \ 0, \ 0, \ 0, \ 0, \ NULL, \ NULL, \ 0, \ 0} #define MIB_END() \ {{0,NULL}, \ ASN_PRIVATE_EOM, \ MIB_ACCESS_NONE, \ 0, \ 0, \ 0, \ 0, \ NULL, \ NULL, \ 0, \ 0} #define MIB_ROOT(x) MIB_GROUP(x) #define MIB_TABLE_ROOT(x) MIB_GROUP(x) #define MIB_TABLE_ENTRY(x) MIB_GROUP(x) #define MIB_OFFSET(x,y) (((UINT_PTR)&(((x *)0)->y))/sizeof(AsnAny)) #define MIB_OFFSET_GB(x) MIB_OFFSET(MIB_ID(gb_ ## x),x) #define MIB_OFFSET_SB(x) MIB_OFFSET(MIB_ID(sb_ ## x),x) #define MIB_SIZEOF_GB(x) sizeof(MIB_ID(gb_ ## x)) #define MIB_SIZEOF_SB(x) sizeof(MIB_ID(sb_ ## x)) #define MIB_ANY_RO_L(x,y,a,z) \ {MIB_OID(ids_ ## x), \ y, \ MIB_ACCESS_READ, \ MIB_OFFSET_GB(x), \ 0, \ MIB_SIZEOF_GB(x), \ 0, \ MIB_ID(gf_ ## x), \ NULL, \ a, \ z} #define MIB_ANY_RW_L(x,y,a,z) \ {MIB_OID(ids_ ## x), \ y, \ MIB_ACCESS_ALL, \ MIB_OFFSET_GB(x), \ MIB_OFFSET_SB(x), \ MIB_SIZEOF_GB(x), \ MIB_SIZEOF_SB(x), \ MIB_ID(gf_ ## x), \ MIB_ID(sf_ ## x), \ a, \ z} #define MIB_ANY_NA_L(x,y,a,z) \ {MIB_OID(ids_ ## x), \ y, \ MIB_ACCESS_NONE, \ MIB_OFFSET_GB(x), \ 0, \ MIB_SIZEOF_GB(x), \ 0, \ NULL, \ NULL, \ a, \ z} #define MIB_ANY_AC_L(x,y,a,z) \ {MIB_OID(ids_ ## x), \ y, \ MIB_ACCESS_NONE, \ MIB_OFFSET_GB(x), \ MIB_OFFSET_SB(x), \ MIB_SIZEOF_GB(x), \ MIB_SIZEOF_SB(x), \ NULL, \ NULL, \ a, \ z} #define MIB_ANY_RO(x,y) MIB_ANY_RO_L(x,y,0,0) #define MIB_ANY_RW(x,y) MIB_ANY_RW_L(x,y,0,0) #define MIB_ANY_NA(x,y) MIB_ANY_NA_L(x,y,0,0) #define MIB_ANY_AC(x,y) MIB_ANY_AC_L(x,y,0,0) #define MIB_INTEGER(x) MIB_ANY_RO(x,ASN_INTEGER) #define MIB_OCTETSTRING(x) MIB_ANY_RO(x,ASN_OCTETSTRING) #define MIB_OBJECTIDENTIFIER(x) MIB_ANY_RO(x,ASN_OBJECTIDENTIFIER) #define MIB_IPADDRESS(x) MIB_ANY_RO(x,ASN_RFC1155_IPADDRESS) #define MIB_COUNTER(x) MIB_ANY_RO(x,ASN_RFC1155_COUNTER) #define MIB_GAUGE(x) MIB_ANY_RO(x,ASN_RFC1155_GAUGE) #define MIB_TIMETICKS(x) MIB_ANY_RO(x,ASN_RFC1155_TIMETICKS) #define MIB_OPAQUE(x) MIB_ANY_RO(x,ASN_RFC1155_OPAQUE) #define MIB_DISPSTRING(x) MIB_ANY_RO(x,ASN_RFC1213_DISPSTRING) #define MIB_PHYSADDRESS(x) MIB_ANY_RO(x,ASN_OCTETSTRING) #define MIB_INTEGER_RW(x) MIB_ANY_RW(x,ASN_INTEGER) #define MIB_OCTETSTRING_RW(x) MIB_ANY_RW(x,ASN_OCTETSTRING) #define MIB_OBJECTIDENTIFIER_RW(x) MIB_ANY_RW(x,ASN_OBJECTIDENTIFIER) #define MIB_IPADDRESS_RW(x) MIB_ANY_RW(x,ASN_RFC1155_IPADDRESS) #define MIB_COUNTER_RW(x) MIB_ANY_RW(x,ASN_RFC1155_COUNTER) #define MIB_GAUGE_RW(x) MIB_ANY_RW(x,ASN_RFC1155_GAUGE) #define MIB_TIMETICKS_RW(x) MIB_ANY_RW(x,ASN_RFC1155_TIMETICKS) #define MIB_OPAQUE_RW(x) MIB_ANY_RW(x,ASN_RFC1155_OPAQUE) #define MIB_DISPSTRING_RW(x) MIB_ANY_RW(x,ASN_RFC1213_DISPSTRING) #define MIB_PHYSADDRESS_RW(x) MIB_ANY_RW(x,ASN_OCTETSTRING) #define MIB_INTEGER_NA(x) MIB_ANY_NA(x,ASN_INTEGER) #define MIB_OCTETSTRING_NA(x) MIB_ANY_NA(x,ASN_OCTETSTRING) #define MIB_OBJECTIDENTIFIER_NA(x) MIB_ANY_NA(x,ASN_OBJECTIDENTIFIER) #define MIB_IPADDRESS_NA(x) MIB_ANY_NA(x,ASN_RFC1155_IPADDRESS) #define MIB_COUNTER_NA(x) MIB_ANY_NA(x,ASN_RFC1155_COUNTER) #define MIB_GAUGE_NA(x) MIB_ANY_NA(x,ASN_RFC1155_GAUGE) #define MIB_TIMETICKS_NA(x) MIB_ANY_NA(x,ASN_RFC1155_TIMETICKS) #define MIB_OPAQUE_NA(x) MIB_ANY_NA(x,ASN_RFC1155_OPAQUE) #define MIB_DISPSTRING_NA(x) MIB_ANY_NA(x,ASN_RFC1213_DISPSTRING) #define MIB_PHYSADDRESS_NA(x) MIB_ANY_NA(x,ASN_OCTETSTRING) #define MIB_INTEGER_AC(x) MIB_ANY_AC(x,ASN_INTEGER) #define MIB_OCTETSTRING_AC(x) MIB_ANY_AC(x,ASN_OCTETSTRING) #define MIB_OBJECTIDENTIFIER_AC(x) MIB_ANY_AC(x,ASN_OBJECTIDENTIFIER) #define MIB_IPADDRESS_AC(x) MIB_ANY_AC(x,ASN_RFC1155_IPADDRESS) #define MIB_COUNTER_AC(x) MIB_ANY_AC(x,ASN_RFC1155_COUNTER) #define MIB_GAUGE_AC(x) MIB_ANY_AC(x,ASN_RFC1155_GAUGE) #define MIB_TIMETICKS_AC(x) MIB_ANY_AC(x,ASN_RFC1155_TIMETICKS) #define MIB_OPAQUE_AC(x) MIB_ANY_AC(x,ASN_RFC1155_OPAQUE) #define MIB_DISPSTRING_AC(x) MIB_ANY_AC(x,ASN_RFC1213_DISPSTRING) #define MIB_PHYSADDRESS_AC(x) MIB_ANY_AC(x,ASN_OCTETSTRING) #define MIB_INTEGER_L(x,a,z) MIB_ANY_RO_L(x,ASN_INTEGER,a,z) #define MIB_OCTETSTRING_L(x,a,z) MIB_ANY_RO_L(x,ASN_OCTETSTRING,a,z) #define MIB_OPAQUE_L(x,a,z) MIB_ANY_RO_L(x,ASN_RFC1155_OPAQUE,a,z) #define MIB_DISPSTRING_L(x,a,z) MIB_ANY_RO_L(x,ASN_RFC1213_DISPSTRING,a,z) #define MIB_PHYSADDRESS_L(x,a,z) MIB_ANY_RO_L(x,ASN_OCTETSTRING,a,z) #define MIB_INTEGER_RW_L(x,a,z) MIB_ANY_RW_L(x,ASN_INTEGER,a,z) #define MIB_OCTETSTRING_RW_L(x,a,z) MIB_ANY_RW_L(x,ASN_OCTETSTRING,a,z) #define MIB_OPAQUE_RW_L(x,a,z) MIB_ANY_RW_L(x,ASN_RFC1155_OPAQUE,a,z) #define MIB_DISPSTRING_RW_L(x,a,z) MIB_ANY_RW_L(x,ASN_RFC1213_DISPSTRING,a,z) #define MIB_PHYSADDRESS_RW_L(x,a,z) MIB_ANY_RW_L(x,ASN_OCTETSTRING,a,z) #define MIB_INTEGER_NA_L(x,a,z) MIB_ANY_NA_L(x,ASN_INTEGER,a,z) #define MIB_OCTETSTRING_NA_L(x,a,z) MIB_ANY_NA_L(x,ASN_OCTETSTRING,a,z) #define MIB_OPAQUE_NA_L(x,a,z) MIB_ANY_NA_L(x,ASN_RFC1155_OPAQUE,a,z) #define MIB_DISPSTRING_NA_L(x,a,z) MIB_ANY_NA_L(x,ASN_RFC1213_DISPSTRING,a,z) #define MIB_PHYSADDRESS_NA_L(x,a,z) MIB_ANY_NA_L(x,ASN_OCTETSTRING,a,z) #define MIB_INTEGER_AC_L(x,a,z) MIB_ANY_AC_L(x,ASN_INTEGER,a,z) #define MIB_OCTETSTRING_AC_L(x,a,z) MIB_ANY_AC_L(x,ASN_OCTETSTRING,a,z) #define MIB_OPAQUE_AC_L(x,a,z) MIB_ANY_AC_L(x,ASN_RFC1155_OPAQUE,a,z) #define MIB_DISPSTRING_AC_L(x,a,z) MIB_ANY_AC_L(x,ASN_RFC1213_DISPSTRING,a,z) #define MIB_PHYSADDRESS_AC_L(x,a,z) MIB_ANY_AC_L(x,ASN_OCTETSTRING,a,z) #define MIB_ENTRY_PTR(x,y) \ MIB_ADDR(MIB_ID(mib_ ## x)[MIB_ID(mi_ ## y)]) #define MIB_TABLE(x,y,z) \ {MIB_ID(ne_ ## y), MIB_ID(ni_ ## y), MIB_ENTRY_PTR(x,y), z} #define asn_t asnType #define asn_v asnValue #define asn_n asnValue.number #define asn_s asnValue.string #define asn_sl asnValue.string.length #define asn_ss asnValue.string.stream #define asn_sd asnValue.string.dynamic #define asn_o asnValue.object #define asn_ol asnValue.object.idLength #define asn_oi asnValue.object.ids #define asn_l asnValue.sequence #define asn_a asnValue.address #define asn_c asnValue.counter #define asn_g asnValue.gauge #define asn_tt asnValue.timeticks #define asn_x asnValue.arbitrary #endif // _INC_SNMPEXTS_