?? mgmtapi.c
字號:
/*++
Routine Description:
Cleanup session structure after processing response.
Arguments:
pSMS - pointer to mgmtapi session structure.
Return Values:
Returns true if successful.
--*/
{
BOOL fOk = TRUE;
SNMPAPI_STATUS status;
// validate session ptr
WSNMP_ASSERT(pSMS != NULL);
// validate handle
if (pSMS->hPdu != (HSNMP_PDU)NULL) {
// free vbl
FreeVbl(pSMS);
// actually release pdu handle
status = SnmpFreePdu(pSMS->hPdu);
// validate return code
if (WSNMP_FAILED(status)) {
SNMPDBG((
SNMP_LOG_ERROR,
"MGMTAPI: SnmpFreePdu returned %d.\n",
SnmpGetLastError(pSMS->hSnmpSession)
));
// failure
fOk = FALSE;
}
// re-initialize handle
pSMS->hPdu = (HSNMP_PDU)NULL;
}
return fOk;
}
BOOL
CopyOid(
AsnObjectIdentifier * pDstOID,
smiLPOID pSrcOID
)
/*++
Routine Description:
Copies object identifier from WinSNMP format to MGMTAPI format.
Arguments:
pDstOID - points to MGMTAPI structure to receive OID.
pSrcOID - points to WinSNMP structure to copy.
Return Values:
Returns true if successful.
--*/
{
BOOL fOk = FALSE;
// validate pointers
WSNMP_ASSERT(pDstOID != NULL);
WSNMP_ASSERT(pSrcOID != NULL);
WSNMP_ASSERT(pSrcOID->len != 0);
WSNMP_ASSERT(pSrcOID->ptr != NULL);
// store the number of subids
pDstOID->idLength = pSrcOID->len;
// allocate memory for subidentifiers
pDstOID->ids = SnmpUtilMemAlloc(pDstOID->idLength * sizeof(DWORD));
// validate pointer
if (pDstOID->ids != NULL) {
// transfer memory
memcpy(pDstOID->ids,
pSrcOID->ptr,
pDstOID->idLength * sizeof(DWORD)
);
// success
fOk = TRUE;
}
// now release memory for original oid
SnmpFreeDescriptor(SNMP_SYNTAX_OID, (smiLPOPAQUE)pSrcOID);
return fOk;
}
BOOL
CopyOctets(
AsnOctetString * pDstOctets,
smiLPOCTETS pSrcOctets
)
/*++
Routine Description:
Copies octet string from WinSNMP format to MGMTAPI format.
Arguments:
pDstOctets - points to MGMTAPI structure to receive octets.
pSrcOctets - points to WinSNMP structure to copy.
Return Values:
Returns true if successful.
--*/
{
BOOL fOk = FALSE;
SNMPAPI_STATUS status;
// validate pointers
WSNMP_ASSERT(pDstOctets != NULL);
WSNMP_ASSERT(pSrcOctets != NULL);
WSNMP_ASSERT(pSrcOctets->len != 0);
WSNMP_ASSERT(pSrcOctets->ptr != NULL);
// octet string allocated
pDstOctets->dynamic = TRUE;
// store the number of bytes
pDstOctets->length = pSrcOctets->len;
// allocate memory for octet string
pDstOctets->stream = SnmpUtilMemAlloc(pDstOctets->length);
// validate pointer
if (pDstOctets->stream != NULL) {
// transfer memory
memcpy(pDstOctets->stream,
pSrcOctets->ptr,
pDstOctets->length
);
// success
fOk = TRUE;
}
// now release memory for original string
SnmpFreeDescriptor(SNMP_SYNTAX_OCTETS, (smiLPOPAQUE)pSrcOctets);
return fOk;
}
CopyVb(
PSNMP_MGR_SESSION pSMS,
DWORD iVarBind,
SnmpVarBind * pVarBind
)
/*++
Routine Description:
Copy variable binding from WinSNMP structure to MGMTAPI structure.
Arguments:
pSMS - pointer to mgmtapi session structure.
iVarBind - index of varbind structure to copy.
pVarBind - pointer to varbind structure.
Return Values:
Returns true if successful.
--*/
{
BOOL fOk = FALSE;
SNMPAPI_STATUS status;
smiOID tmpOID;
smiVALUE tmpValue;
// validate session ptr
WSNMP_ASSERT(pSMS != NULL);
WSNMP_ASSERT(pVarBind != NULL);
// attempt to retrieve varbind data from winsnmp structure
status = SnmpGetVb(pSMS->hVbl, iVarBind, &tmpOID, &tmpValue);
// validate return code
if (WSNMP_SUCCEEDED(status)) {
// transfer object identifier value
fOk = CopyOid(&pVarBind->name, &tmpOID);
// syntax values are equivalent
pVarBind->value.asnType = (BYTE)(smiINT32)tmpValue.syntax;
// determine syntax
switch (tmpValue.syntax) {
case SNMP_SYNTAX_INT32:
// transfer signed int
pVarBind->value.asnValue.number = tmpValue.value.sNumber;
break;
case SNMP_SYNTAX_UINT32:
case SNMP_SYNTAX_CNTR32:
case SNMP_SYNTAX_GAUGE32:
case SNMP_SYNTAX_TIMETICKS:
// transfer unsigned int
pVarBind->value.asnValue.unsigned32 = tmpValue.value.uNumber;
break;
case SNMP_SYNTAX_CNTR64:
// transfer 64-bit counter
pVarBind->value.asnValue.counter64.LowPart =
tmpValue.value.hNumber.lopart;
pVarBind->value.asnValue.counter64.HighPart =
tmpValue.value.hNumber.hipart;
break;
case SNMP_SYNTAX_OPAQUE:
case SNMP_SYNTAX_IPADDR:
case SNMP_SYNTAX_OCTETS:
case SNMP_SYNTAX_BITS:
// transfer octet string
if (!CopyOctets(&pVarBind->value.asnValue.string,
&tmpValue.value.string)) {
// re-initialize
pVarBind->value.asnType = ASN_NULL;
// failure
fOk = FALSE;
}
break;
case SNMP_SYNTAX_OID:
// transfer object identifier
if (!CopyOid(&pVarBind->value.asnValue.object,
&tmpValue.value.oid)) {
// re-initialize
pVarBind->value.asnType = ASN_NULL;
// failure
fOk = FALSE;
}
break;
case SNMP_SYNTAX_NULL:
case SNMP_SYNTAX_NOSUCHOBJECT:
case SNMP_SYNTAX_NOSUCHINSTANCE:
case SNMP_SYNTAX_ENDOFMIBVIEW:
break; // do nothing...
default:
SNMPDBG((
SNMP_LOG_ERROR,
"MGMTAPI: SnmpGetVb returned invalid type.\n"
));
// re-initialize
pVarBind->value.asnType = ASN_NULL;
// failure
fOk = FALSE;
break;
}
} else {
SNMPDBG((
SNMP_LOG_ERROR,
"MGMTAPI: SnmpGetVb returned %d.\n",
SnmpGetLastError(pSMS->hSnmpSession)
));
}
return fOk;
}
BOOL
CopyVbl(
PSNMP_MGR_SESSION pSMS,
SnmpVarBindList * pVarBindList
)
/*++
Routine Description:
Copy variable bindings from WinSNMP structure to MGMTAPI structure.
Arguments:
pSMS - pointer to mgmtapi session structure.
pVarBindList - pointer to varbind list structure.
Return Values:
Returns true if successful.
--*/
{
BOOL fOk = TRUE;
// validate session ptr
WSNMP_ASSERT(pSMS != NULL);
WSNMP_ASSERT(pVarBindList != NULL);
// initialize
pVarBindList->len = 0;
pVarBindList->list = NULL;
// validate varbind list handle
if (pSMS->hVbl != (HSNMP_VBL)NULL) {
// determine number of varbinds
pVarBindList->len = SnmpCountVbl(pSMS->hVbl);
// validate number of varbinds
if (WSNMP_SUCCEEDED(pVarBindList->len)) {
// allocate memory for varbinds
pVarBindList->list = SnmpUtilMemAlloc(
pVarBindList->len *
sizeof(SnmpVarBind)
);
// validate pointer
if (pVarBindList->list != NULL) {
DWORD cVarBind = 1;
SnmpVarBind * pVarBind;
// save pointer to varbinds
pVarBind = pVarBindList->list;
// process varbinds in the list
while (fOk && (cVarBind <= pVarBindList->len)) {
// copy varbind from winsnmp to mgmtapi
fOk = CopyVb(pSMS, cVarBind++, pVarBind++);
}
} else {
SNMPDBG((
SNMP_LOG_ERROR,
"MGMTAPI: Could not allocate VBL.\n"
));
// re-initialize
pVarBindList->len = 0;
// failure
fOk = FALSE;
}
} else if (pVarBindList->len != SNMPAPI_NOOP) {
SNMPDBG((
SNMP_LOG_ERROR,
"MGMTAPI: SnmpCountVbl returned %s.\n",
SnmpGetLastError(pSMS->hSnmpSession)
));
// re-initialize
pVarBindList->len = 0;
// failure
fOk = FALSE;
}
}
if (!fOk) {
// cleanup any varbinds allocated
SnmpUtilVarBindListFree(pVarBindList);
}
return fOk;
}
BOOL
ParseVbl(
PSNMP_MGR_SESSION pSMS,
PTRAP_LIST_ENTRY pTLE
)
/*++
Routine Description:
Parse varbind list for trap-related varbinds.
Arguments:
pSMS - pointer to MGMTAPI session structure.
pTLE - pointer to trap list entry.
Return Values:
Returns true if successful.
--*/
{
BOOL fOk = FALSE;
SnmpVarBind * pVarBind;
AsnObjectIdentifier * pOID;
AsnNetworkAddress * pAgentAddress = NULL;
AsnObjectIdentifier * pEnterpriseOID = NULL;
// object identifiers to convert snmpv2 trap format
static UINT _sysUpTime[] = { 1, 3, 6, 1, 2, 1, 1, 3 };
static UINT _snmpTrapOID[] = { 1, 3, 6, 1, 6, 3, 1, 1, 4, 1 };
static UINT _snmpAddress[] = { 1, 3, 6, 1, 3, 1057, 1 };
static UINT _snmpTrapEnterprise[] = { 1, 3, 6, 1, 6, 3, 1, 1, 4, 3 };
static UINT _snmpTraps[] = { 1, 3, 6, 1, 6, 3, 1, 1, 5 };
static AsnObjectIdentifier sysUpTime = DEFINE_OID(_sysUpTime);
static AsnObjectIdentifier snmpTrapOID = DEFINE_OID(_snmpTrapOID);
static AsnObjectIdentifier snmpAddress = DEFINE_OID(_snmpAddress);
static AsnObjectIdentifier snmpTrapEnterprise = DEFINE_OID(_snmpTrapEnterprise);
static AsnObjectIdentifier snmpTraps = DEFINE_OID(_snmpTraps);
// validate pointers
WSNMP_ASSERT(pSMS != NULL);
WSNMP_ASSERT(pTLE != NULL);
// validate vbl have minimum entries
if (pTLE->VarBindList.len >= MINVARBINDLEN) {
// point to sysUpTime varbind structure
pVarBind = &pTLE->VarBindList.list[SYSUPTIMEINDEX];
// verify variable is sysUpTime
if ((pVarBind->value.asnType == ASN_TIMETICKS) &&
!SnmpUtilOidNCmp(&pVarBind->name,
&sysUpTime,
sysUpTime.idLength)) {
// transfer sysUpTime value to trap entry
pTLE->TimeStamp = pVarBind->value.asnValue.ticks;
} else {
SNMPDBG((
SNMP_LOG_ERROR,
"MGMTAPI: Could not find sysUpTime.\n"
));
goto cleanup; // bail...
}
// see if any additional varbinds present
if (pTLE->VarBindList.len > MINVARBINDLEN) {
// point to snmpTrapEnterprise varbind structure (maybe)
pVarBind = &pTLE->VarBindList.list[pTLE->VarBindList.len - 1];
// verify variable is snmpTrapEnterprise
if ((pVarBind->value.asnType == ASN_OBJECTIDENTIFIER) &&
!SnmpUtilOidNCmp(&pVarBind->name,
&snmpTrapEnterprise,
snmpTrapEnterprise.idLength)) {
// transfer enterprise oid to list entry
pTLE->EnterpriseOID = pVarBind->value.asnValue.object;
// store enterprise oid for later
pEnterpriseOID = &pTLE->EnterpriseOID;
// modify type to avoid deallocation
pVarBind->value.asnType = ASN_NULL;
} else {
SNMPDBG((
SNMP_LOG_TRACE,
"MGMTAPI: Could not find snmpTrapEnterprise.\n"
));
}
}
// see if the agent address is present
if (pTLE->VarBindList.len > MINVARBINDLEN+1) {
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -