如何通过 net-snmp API 判断请求的 OID 是否在 Table 中?
How to figure out if requested OID is in Table with net-snmp API?
我正在研究 Windows SNMP 代理扩展的解决方案。同时,我使用 Net-SNMP 从 MIB 文件中读取和加载 OID。将旧的 SNMP 对象与 Net-SNMP 对象匹配是 C++ 中的一项艰巨工作,我认真地完成了它。现在很多问题出现在对 Table 个对象的 Set、Get-Next 请求上。
现在重要的是如何设置引用table个条目或字段的OID。
我如何检查 Get 或 Set 请求的请求 OID 是否是带有 Net-SNMP API 的 MIB 中 table 的字段或条目?
这是我准备用来计算 table 个元素的函数:
如果Oid是table的字段:
BOOL IsInTable(AsnObjectIdentifier pAsnOid) {
char * szOidTemp;
char * pch;
oid root[MAX_OID_LEN];
size_t rootlen;
SnmpMgrOidToStr(&pAsnOid, &szOidTemp);
memset(root, 0, sizeof(root));
rootlen = MAX_OID_LEN;
if (snmp_parse_oid(szOidTemp, root, &rootlen) == NULL) {
snmp_perror(szOidTemp);
//exit(1);
return false;
}
struct tree *tbl = NULL;
tbl = get_tree(root, rootlen, get_tree_head());
if (tbl) {
if (tbl->parent && strstr(strlwr(tbl->parent->label), "entry") > 0) {
return true;
}
}
return false;
}
如果 Oid 是 table 的根:
BOOL IsTableRoot(AsnObjectIdentifier pAsnOid) {
char * szOidTemp;
char * pch;
oid root[MAX_OID_LEN];
size_t rootlen;
SnmpMgrOidToStr(&pAsnOid, &szOidTemp);
memset(root, 0, sizeof(root));
rootlen = MAX_OID_LEN;
if (snmp_parse_oid(szOidTemp, root, &rootlen) == NULL) {
snmp_perror(szOidTemp);
//exit(1);
return false;
}
struct tree *tbl = NULL;
tbl = get_tree(root, rootlen, get_tree_head());
if (tbl) {
if (strstr(strlwr(tbl->label), "table") > 0) {
return true;
}
}
return false;
}
如果 Oid 是 table 的条目或第一个 child:
BOOL IsTableEntry(AsnObjectIdentifier pAsnOid) {
char * szOidTemp;
char * pch;
oid root[MAX_OID_LEN];
size_t rootlen;
SnmpMgrOidToStr(&pAsnOid, &szOidTemp);
memset(root, 0, sizeof(root));
rootlen = MAX_OID_LEN;
if (snmp_parse_oid(szOidTemp, root, &rootlen) == NULL) {
snmp_perror(szOidTemp);
//exit(1);
return false;
}
struct tree *tbl = NULL;
tbl = get_tree(root, rootlen, get_tree_head());
if (tbl) {
if (strstr(strlwr(tbl->label), "entry") > 0) {
return true;
}
}
return false;
}
我正在研究 Windows SNMP 代理扩展的解决方案。同时,我使用 Net-SNMP 从 MIB 文件中读取和加载 OID。将旧的 SNMP 对象与 Net-SNMP 对象匹配是 C++ 中的一项艰巨工作,我认真地完成了它。现在很多问题出现在对 Table 个对象的 Set、Get-Next 请求上。
现在重要的是如何设置引用table个条目或字段的OID。
我如何检查 Get 或 Set 请求的请求 OID 是否是带有 Net-SNMP API 的 MIB 中 table 的字段或条目?
这是我准备用来计算 table 个元素的函数:
如果Oid是table的字段:
BOOL IsInTable(AsnObjectIdentifier pAsnOid) {
char * szOidTemp;
char * pch;
oid root[MAX_OID_LEN];
size_t rootlen;
SnmpMgrOidToStr(&pAsnOid, &szOidTemp);
memset(root, 0, sizeof(root));
rootlen = MAX_OID_LEN;
if (snmp_parse_oid(szOidTemp, root, &rootlen) == NULL) {
snmp_perror(szOidTemp);
//exit(1);
return false;
}
struct tree *tbl = NULL;
tbl = get_tree(root, rootlen, get_tree_head());
if (tbl) {
if (tbl->parent && strstr(strlwr(tbl->parent->label), "entry") > 0) {
return true;
}
}
return false;
}
如果 Oid 是 table 的根:
BOOL IsTableRoot(AsnObjectIdentifier pAsnOid) {
char * szOidTemp;
char * pch;
oid root[MAX_OID_LEN];
size_t rootlen;
SnmpMgrOidToStr(&pAsnOid, &szOidTemp);
memset(root, 0, sizeof(root));
rootlen = MAX_OID_LEN;
if (snmp_parse_oid(szOidTemp, root, &rootlen) == NULL) {
snmp_perror(szOidTemp);
//exit(1);
return false;
}
struct tree *tbl = NULL;
tbl = get_tree(root, rootlen, get_tree_head());
if (tbl) {
if (strstr(strlwr(tbl->label), "table") > 0) {
return true;
}
}
return false;
}
如果 Oid 是 table 的条目或第一个 child:
BOOL IsTableEntry(AsnObjectIdentifier pAsnOid) {
char * szOidTemp;
char * pch;
oid root[MAX_OID_LEN];
size_t rootlen;
SnmpMgrOidToStr(&pAsnOid, &szOidTemp);
memset(root, 0, sizeof(root));
rootlen = MAX_OID_LEN;
if (snmp_parse_oid(szOidTemp, root, &rootlen) == NULL) {
snmp_perror(szOidTemp);
//exit(1);
return false;
}
struct tree *tbl = NULL;
tbl = get_tree(root, rootlen, get_tree_head());
if (tbl) {
if (strstr(strlwr(tbl->label), "entry") > 0) {
return true;
}
}
return false;
}