如何使用net-snmp将特定于请求的数据设置为SNMP代理?

时间:2010-11-16 03:44:14

标签: net-snmp

我希望SNMP代理能够以不同的方式响应,具体取决于源请求者,但无法通过SNMP代理找到一种魔术传达某些数据的方法。

我尝试设置的是netsnmp_session结构和netsnmp_pdu结构。因为它们是snmp_send的两个参数。我试图促成的数据字段是myvoid和callback_magic。

但不幸的是,在SNMP代理上,收到的数据都是0,这不是我在SNMP客户端上设置的。

1 个答案:

答案 0 :(得分:0)

很抱歉回答myselv的问题。

最后,我找到了以下技巧来规避问题: 在目标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 {
                       ...
                    }