我希望 SNMP 代理根据源请求者做出不同的响应,但找不到一种方法来神奇地传达一些数据以使其可被 SNMP 代理区分。
我尝试设置的是netsnmp_session
结构和netsnmp_pdu
结构。因为它们是 的两个参数snmp_send
。我试图促进的数据字段是 myvoid 和 callback_magic。
但是很遗憾在SNMP代理上,接收到的数据都是0,这不是我在SNMP客户端上设置的。
我希望 SNMP 代理根据源请求者做出不同的响应,但找不到一种方法来神奇地传达一些数据以使其可被 SNMP 代理区分。
我尝试设置的是netsnmp_session
结构和netsnmp_pdu
结构。因为它们是 的两个参数snmp_send
。我试图促进的数据字段是 myvoid 和 callback_magic。
但是很遗憾在SNMP代理上,接收到的数据都是0,这不是我在SNMP客户端上设置的。
很抱歉回答我自己的问题。
最后我发现了以下技巧来规避这个问题:在目标 SNMP 对象之后立即插入一个众所周知的 SNMP 对象(例如 ifNumber),以识别特定的 SNMP 查询。
代理中的处理函数应检查当前变量旁边的变量,以查看它是否正是众所周知的 SNMP 对象 ifNumber。如果是,则查询来自您,它使用 NET-SNMP API 来形成此查询的变量列表。
客户端代码:
oid dest_OID[ MAX_OID_LEN ] = {0};
size_t dest_OID_len = COUNT_OF(dest_OID);
get_node(g_snmp_name_ifNumber, dest_OID, &dest_OID_len );
snmp_add_null_var(pdu, dest_OID, dest_OID_len);
在代理方面:
int get_status(netsnmp_mib_handler *handler,
netsnmp_handler_registration *reginfo,
netsnmp_agent_request_info *reqinfo,
netsnmp_request_info *requests)
{
switch (reqinfo->mode) {
case MODE_GET:
{
bool is_sent_by_manager = false;
if( requests->requestvb->next_variable )
{
struct variable_list * v = requests->requestvb->next_variable;
oid dest_OID[ MAX_OID_LEN ] = {0};
size_t dest_OID_len = COUNT_OF(dest_OID);
get_node(g_snmp_name_ifNumber, dest_OID, &dest_OID_len );
const int nbytes = v->name_length * sizeof(v->name[0]);
if( dest_OID_len >= v->name_length
&& memcmp(dest_OID, v->name, nbytes) == 0 ) {
is_sent_by_manager = true;
}
}
if( is_sent_by_manager ) {
...
}
else {
...
}