/*++

Copyright (C) 1992 - 1996 Microsoft Corporation

Module Name:

    snmputil.h

Abstract:

    Definitions for SNMP Extension Agent development (internal).

--*/

#ifndef _INC_SNMPUTIL
#define _INC_SNMPUTIL

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// Additional header files                                                   //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

#include <snmp.h>

#ifdef __cplusplus
extern "C" {
#endif

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// AUTH API type definitions                                                 //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

typedef struct {        
    RFC1157VarBindList  varBinds;
    AsnInteger          requestType;
    AsnInteger          requestId;
    AsnInteger          errorStatus;
    AsnInteger          errorIndex;
} RFC1157Pdu;

typedef struct {
    RFC1157VarBindList  varBinds;
    AsnObjectIdentifier enterprise;
    AsnNetworkAddress   agentAddr;
    AsnInteger          genericTrap;
    AsnInteger          specificTrap;
    AsnTimeticks        timeStamp;
} RFC1157TrapPdu;

typedef struct {
   BYTE pduType;
   union {
      RFC1157Pdu        pdu;
      RFC1157TrapPdu    trap;
   } pduValue;
} RFC1157Pdus;

typedef struct {
    AsnObjectIdentifier dstParty;
    AsnObjectIdentifier srcParty;
    RFC1157Pdus         pdu;
    AsnOctetString      community;
} SnmpMgmtCom;

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// AUTH API prototypes                                                       //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

SNMPAPI
SNMP_FUNC_TYPE
SnmpSvcEncodeMessage(
    IN     UINT          snmpAuthType,       
    IN     SnmpMgmtCom * snmpMgmtCom, 
    IN OUT BYTE **       pBuffer,     
    IN OUT UINT *        nLength      
    );

SNMPAPI
SNMP_FUNC_TYPE
SnmpSvcDecodeMessage(
       OUT UINT *        snmpAuthType,       
       OUT SnmpMgmtCom * snmpMgmtCom, 
    IN     BYTE *        pBuffer,     
    IN     UINT          nLength,
    IN     BOOL          fAuthMsg
    );

SNMPAPI
SNMP_FUNC_TYPE
SnmpSvcReleaseMessage(
    IN OUT SnmpMgmtCom * snmpMgmtCom 
    );

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// Internal utility prototypes (publish via snmp.h as needed)                //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

VOID 
SNMP_FUNC_TYPE
SnmpUtilPrintOid(
    IN AsnObjectIdentifier *Oid 
    );

LPSTR 
SNMP_FUNC_TYPE
SnmpUtilOidToA(
    IN AsnObjectIdentifier *Oid
    );

LPSTR 
SNMP_FUNC_TYPE
SnmpUtilIdsToA(
    IN UINT *Ids,
    IN UINT IdLength
    );

LONG 
SNMP_FUNC_TYPE
SnmpUtilUnicodeToAnsi(
    LPSTR   *ansi_string,
    LPWSTR  uni_string,
    BOOLEAN alloc_it
    );

LONG
SNMP_FUNC_TYPE
SnmpUtilUnicodeToUTF8(
    LPSTR   *pUtfString,
    LPWSTR  wcsString,
    BOOLEAN bAllocBuffer
    );

LONG 
SNMP_FUNC_TYPE
SnmpUtilAnsiToUnicode(
    LPWSTR  *uni_string,
    LPSTR   ansi_string,
    BOOLEAN alloc_it
    );

LONG
SNMP_FUNC_TYPE
SnmpUtilUTF8ToUnicode(
    LPWSTR  *pWcsString,
    LPSTR   utfString,
    BOOLEAN bAllocBuffer
    );

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// Service utility prototypes (leave these unpublished)                      //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

DWORD
SNMP_FUNC_TYPE
SnmpSvcInitUptime(
    );

DWORD
SNMP_FUNC_TYPE 
SnmpSvcGetUptime(
    );

DWORD
SNMP_FUNC_TYPE 
SnmpSvcGetUptimeFromTime(
    DWORD time
    );

SNMPAPI 
SNMP_FUNC_TYPE
SnmpSvcGenerateTrap(
    IN AsnObjectIdentifier * enterprise,
    IN AsnInteger            genericTrap,
    IN AsnInteger            specificTrap,
    IN AsnTimeticks          timeStamp,
    IN RFC1157VarBindList *  variableBindings
    );

SNMPAPI 
SNMP_FUNC_TYPE
SnmpSvcGenerateColdStartTrap(
    IN AsnInteger timeStamp
    );

SNMPAPI 
SNMP_FUNC_TYPE
SnmpSvcGenerateWarmStartTrap(
    IN AsnInteger timeStamp
    );

SNMPAPI 
SNMP_FUNC_TYPE
SnmpSvcGenerateLinkUpTrap(
    IN AsnInteger           timeStamp,
    IN RFC1157VarBindList * variableBindings
    );

SNMPAPI 
SNMP_FUNC_TYPE
SnmpSvcGenerateLinkDownTrap(
    IN AsnInteger           timeStamp,
    IN RFC1157VarBindList * variableBindings
    );

SNMPAPI 
SNMP_FUNC_TYPE
SnmpSvcGenerateAuthFailTrap(
    AsnInteger timeStamp
    );

VOID 
SNMP_FUNC_TYPE
SnmpSvcReportEvent(
    IN DWORD nMsgId,
    IN DWORD cSubStrings,
    IN LPSTR *SubStrings,
    IN DWORD nErrorCode
    );                  

VOID 
SNMP_FUNC_TYPE
SnmpSvcBufRevInPlace(
    IN OUT BYTE * pBuf, 
    IN     UINT   nLen   
    );

VOID 
SNMP_FUNC_TYPE
SnmpSvcBufRevAndCpy(
       OUT BYTE * pDstBuf,
    IN     BYTE * pSrcBuf,
    IN     UINT   nLen     
    );

BOOL 
SNMP_FUNC_TYPE
SnmpSvcAddrIsIpx(
    IN     LPSTR addrText,
       OUT char  pNetNum[],
       OUT char  pNodeNum[]
    );

BOOL 
SNMP_FUNC_TYPE
SnmpSvcAddrToSocket(
    IN     LPSTR             addrText,
       OUT struct sockaddr * addrEncoding
    );

AsnObjectIdentifier *
SNMP_FUNC_TYPE
SnmpSvcGetEnterpriseOID(
    );

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// SNMP debugging definitions                                                //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

#define SNMP_OUTPUT_TO_CONSOLE      0x1
#define SNMP_OUTPUT_TO_LOGFILE      0x2
#define SNMP_OUTPUT_TO_EVENTLOG     0x4
#define SNMP_OUTPUT_TO_DEBUGGER     0x8

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// SNMP debugging prototypes                                                 //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

VOID 
SNMP_FUNC_TYPE
SnmpSvcSetLogLevel(
    IN INT nLevel
    );

VOID 
SNMP_FUNC_TYPE
SnmpSvcSetLogType(
    IN INT nOutput
    );

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// Miscellaneous definitions                                                 //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

#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

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// Support for old definitions (support disabled via SNMPSTRICT)             //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

#ifndef SNMPSTRICT

#define dbgprintf                   SnmpUtilDbgPrint

#define SNMP_oiddisp                SnmpUtilPrintOid
#define SNMP_oidtoa                 SnmpUtilOidToA
#define SNMP_oidtoa2                SnmpUtilIdsToA

#define SNMP_bufrev                 SnmpUtilBufRevInPlace
#define SNMP_bufcpyrev              SnmpUtilBufRevAndCpy
#define addrtosocket                SnmpUtilAddrToSocket
#define isIPX                       SnmpUtilAddrIsIpx

#define DBGCONSOLEBASEDLOG          SNMP_OUTPUT_TO_CONSOLE 
#define DBGFILEBASEDLOG             SNMP_OUTPUT_TO_LOGFILE 
#define DBGEVENTLOGBASEDLOG         SNMP_OUTPUT_TO_EVENTLOG

#endif // SNMPSTRICT

#ifdef __cplusplus
}
#endif

#endif // _INC_SNMPUTIL