static BOOL mib2UdpEntryQuery(BYTE bPduType, SnmpVarBind *pVarBind, AsnInteger32 *pErrorStatus) { AsnObjectIdentifier myOid = DEFINE_OID(mib2UdpEntry); BOOL ret = TRUE; TRACE("(0x%02x, %s, %p)\n", bPduType, SnmpUtilOidToA(&pVarBind->name), pErrorStatus); switch (bPduType) { case SNMP_PDU_GET: case SNMP_PDU_GETNEXT: if (!udpTable) *pErrorStatus = SNMP_ERRORSTATUS_NOSUCHNAME; else { UINT tableIndex = 0, item = 0; *pErrorStatus = getItemAndInstanceFromTable(&pVarBind->name, &myOid, 5, bPduType, (struct GenericTable *)udpTable, sizeof(MIB_UDPROW), oidToUdpRow, compareUdpRow, &item, &tableIndex); if (!*pErrorStatus) { assert(tableIndex); assert(item); *pErrorStatus = mapStructEntryToValue(mib2UdpEntryMap, DEFINE_SIZEOF(mib2UdpEntryMap), &udpTable->table[tableIndex - 1], item, pVarBind); if (!*pErrorStatus && bPduType == SNMP_PDU_GETNEXT) { AsnObjectIdentifier oid; ret = setOidWithItemAndIpAddr(&pVarBind->name, &myOid, item, udpTable->table[tableIndex - 1].dwLocalAddr); if (ret) { oid.idLength = 1; oid.ids = &udpTable->table[tableIndex - 1].dwLocalPort; ret = SnmpUtilOidAppend(&pVarBind->name, &oid); } } } } break; case SNMP_PDU_SET: *pErrorStatus = SNMP_ERRORSTATUS_READONLY; ret = FALSE; break; default: FIXME("0x%02x: unsupported PDU type\n", bPduType); *pErrorStatus = SNMP_ERRORSTATUS_NOSUCHNAME; } return ret; }
static void setOidWithItemAndInteger(AsnObjectIdentifier *dst, AsnObjectIdentifier *base, UINT item, UINT instance) { AsnObjectIdentifier oid; setOidWithItem(dst, base, item); oid.idLength = 1; oid.ids = &instance; SnmpUtilOidAppend(dst, &oid); }
static void setOidWithItem(AsnObjectIdentifier *dst, AsnObjectIdentifier *base, UINT item) { UINT id; AsnObjectIdentifier oid; SnmpUtilOidCpy(dst, base); oid.idLength = 1; oid.ids = &id; id = item; SnmpUtilOidAppend(dst, &oid); }
static INT setOidWithItemAndInteger(AsnObjectIdentifier *dst, AsnObjectIdentifier *base, UINT item, UINT instance) { AsnObjectIdentifier oid; INT ret; ret = setOidWithItem(dst, base, item); if (ret) { oid.idLength = 1; oid.ids = &instance; ret = SnmpUtilOidAppend(dst, &oid); } return ret; }
static void setOidWithItemAndIpAddr(AsnObjectIdentifier *dst, AsnObjectIdentifier *base, UINT item, DWORD addr) { UINT id; BYTE *ptr; AsnObjectIdentifier oid; setOidWithItem(dst, base, item); oid.idLength = 1; oid.ids = &id; for (ptr = (BYTE *)&addr; ptr < (BYTE *)&addr + sizeof(DWORD); ptr++) { id = *ptr; SnmpUtilOidAppend(dst, &oid); } }
static INT setOidWithItem(AsnObjectIdentifier *dst, AsnObjectIdentifier *base, UINT item) { UINT id; AsnObjectIdentifier oid; INT ret; SnmpUtilOidFree(dst); ret = SnmpUtilOidCpy(dst, base); if (ret) { oid.idLength = 1; oid.ids = &id; id = item; ret = SnmpUtilOidAppend(dst, &oid); } return ret; }
static INT setOidWithItemAndIpAddr(AsnObjectIdentifier *dst, AsnObjectIdentifier *base, UINT item, DWORD addr) { UINT id; BYTE *ptr; AsnObjectIdentifier oid; INT ret; ret = setOidWithItem(dst, base, item); if (ret) { oid.idLength = 1; oid.ids = &id; for (ptr = (BYTE *)&addr; ret && ptr < (BYTE *)&addr + sizeof(DWORD); ptr++) { id = *ptr; ret = SnmpUtilOidAppend(dst, &oid); } } return ret; }
// // MIB_sess_func // High level routine for handling operations on the session table // // Notes: // // Return Codes: // None. // // Error Codes: // None. // UINT MIB_sess_func( IN UINT Action, IN MIB_ENTRY *MibPtr, IN OUT RFC1157VarBind *VarBind ) { int Found; UINT Entry; UINT Field; UINT ErrStat; switch ( Action ) { case MIB_ACTION_GETFIRST: // Fill the Session table with the info from server if ( SNMPAPI_ERROR == MIB_sess_lmget() ) { ErrStat = SNMP_ERRORSTATUS_GENERR; goto Exit; } // If no elements in table, then return next MIB var, if one if ( MIB_SessionTable.Len == 0 ) { if ( MibPtr->MibNext == NULL ) { ErrStat = SNMP_ERRORSTATUS_NOSUCHNAME; goto Exit; } // Do get first on the next MIB var ErrStat = (*MibPtr->MibNext->MibFunc)( Action, MibPtr->MibNext, VarBind ); break; } // // Place correct OID in VarBind // Assuming the first field in the first record is the "start" { UINT temp_subs[] = { SESS_FIRST_FIELD }; AsnObjectIdentifier FieldOid = { 1, temp_subs }; SnmpUtilOidFree( &VarBind->name ); SnmpUtilOidCpy( &VarBind->name, &MIB_OidPrefix ); SnmpUtilOidAppend( &VarBind->name, &MIB_SessPrefix ); SnmpUtilOidAppend( &VarBind->name, &FieldOid ); SnmpUtilOidAppend( &VarBind->name, &MIB_SessionTable.Table[0].Oid ); } // // Let fall through on purpose // case MIB_ACTION_GET: ErrStat = MIB_sess_get( VarBind ); break; case MIB_ACTION_GETNEXT: // Fill the Session table with the info from server if ( SNMPAPI_ERROR == MIB_sess_lmget() ) { ErrStat = SNMP_ERRORSTATUS_GENERR; goto Exit; } // Lookup OID in table Found = MIB_sess_match( &VarBind->name, &Entry, TRUE ); // Determine which field Field = VarBind->name.ids[SESS_FIELD_SUBID]; // Index not found, but could be more fields to base GET on if ( Found == MIB_TBL_POS_END ) { // Index not found in table, get next from field // Field ++; // Make sure not past last field // if ( Field > SESS_LAST_FIELD ) // { // Get next VAR in MIB ErrStat = (*MibPtr->MibNext->MibFunc)( MIB_ACTION_GETFIRST, MibPtr->MibNext, VarBind ); break; // } } // Get next TABLE entry if ( Found == MIB_TBL_POS_FOUND ) { Entry ++; if ( Entry > MIB_SessionTable.Len-1 ) { Entry = 0; Field ++; /* item not implemented. Skip */ if (Field == SESS_NUMCONS_FIELD) { Field++; } if ( Field > SESS_LAST_FIELD ) { // Get next VAR in MIB ErrStat = (*MibPtr->MibNext->MibFunc)( MIB_ACTION_GETFIRST, MibPtr->MibNext, VarBind ); break; } } } // // Place correct OID in VarBind // Assuming the first field in the first record is the "start" { UINT temp_subs[1]; AsnObjectIdentifier FieldOid; temp_subs[0] = Field; FieldOid.idLength = 1; FieldOid.ids = temp_subs; SnmpUtilOidFree( &VarBind->name ); SnmpUtilOidCpy( &VarBind->name, &MIB_OidPrefix ); SnmpUtilOidAppend( &VarBind->name, &MIB_SessPrefix ); SnmpUtilOidAppend( &VarBind->name, &FieldOid ); SnmpUtilOidAppend( &VarBind->name, &MIB_SessionTable.Table[Entry].Oid ); } ErrStat = MIB_sess_copyfromtable( Entry, Field, VarBind ); break; case MIB_ACTION_SET: // Make sure OID is long enough if ( SESS_FIELD_SUBID + 1 > VarBind->name.idLength ) { ErrStat = SNMP_ERRORSTATUS_NOSUCHNAME; goto Exit; } // Get field number Field = VarBind->name.ids[SESS_FIELD_SUBID]; // If the field being set is not the STATE field, error if ( Field != SESS_STATE_FIELD ) { ErrStat = SNMP_ERRORSTATUS_NOSUCHNAME; goto Exit; } // Check for proper type before setting if ( ASN_INTEGER != VarBind->value.asnType ) { ErrStat = SNMP_ERRORSTATUS_BADVALUE; goto Exit; } // Make sure that the value is valid if ( VarBind->value.asnValue.number < SESS_STATE_ACTIVE && VarBind->value.asnValue.number > SESS_STATE_DELETED ) { ErrStat = SNMP_ERRORSTATUS_BADVALUE; goto Exit; } ErrStat = MIB_sess_lmset( &VarBind->name, Field, &VarBind->value ); break; default: ErrStat = SNMP_ERRORSTATUS_GENERR; } Exit: return ErrStat; } // MIB_sess_func