0

我能够将 95% 的专用 MIB 转换为 C 代码,并使其在子代理中运行,如本Net-SNMP 教程的最后部分所述

为此,我自然而然地使用mib2c.mfd.conf(我刚刚读到mfd代表 Mib For Dummies ......都说了......)

mib2c -I -c mib2c.mfd.conf my_mib_node

它生成了一个长长的 .c 文件,其中几乎所有的 oid 如下所示。

几乎没有为 VideoInetAddr OID 生成任何行

//ABSTRACT OF SOURCE FILE GENERATED BY MIB2C
//...

long    VideoFormat = 0;  /* XXX: set default value */
// <<<=== NOTHING GENERATED HERE FOR VideoInetAddr OF TYPE INETADDRESS
// WHEREAS OTHER INTEGERS ARE NORMALLY PRESENT
long    VideoInetPort = 0;  /* XXX: set default value */
//...

void init_my_mib_node(void)
{
 //...

    const oid VideoFormat_oid[] = { 1,3,6,1,4,1,a,b,c,d,e };
    static netsnmp_watcher_info VideoFormat_winfo;
    // <<<=== NO OID GENERATED for VideoInetAddr OF TYPE INETADDRESS
    // WHEREAS OTHER OIDs ARE NORMALLY GENERATED
    static netsnmp_watcher_info VideoInetAddr_winfo; //We have the winfo after all
    const oid VideoInetPort_oid[] = { 1,3,6,1,4,1,a,b,c,d,g };
    static netsnmp_watcher_info VideoInetPort_winfo;

    DEBUGMSGTL(("my_mib_node",
    "Initializing VideoFormat scalar integer.  Default value = %d\n",
                VideoFormat));

    reg = netsnmp_create_handler_registration(
         "VideoFormat", NULL,
          VideoFormat_oid, OID_LENGTH(VideoFormat_oid),
          HANDLER_CAN_RWRITE);

    netsnmp_init_watcher_info(&VideoFormat_winfo, &VideoFormat, 
    sizeof(long),ASN_INTEGER, WATCHER_FIXED_SIZE);

   if (netsnmp_register_watched_scalar( reg, &VideoFormat_winfo ) < 0 ) {
    snmp_log( LOG_ERR, "Failed to register watched VideoFormat" );
   //...
}

这工作得很好,需要 5 分钟(无需编写代码,只需调用 init() 函数),我能够获取和设置所有...整数...

未生成某些类型为 InetAddress 的 oid,字符串也未生成

问题

  • 是否有能够为每种类型生成代码的 mib conf 文件

我尝试了mib2c.old-api.conf,它也为非整数 oid 生成代码,但我发现它不太方便。还有更多样板代码要编写。

4

2 回答 2

1

是的,mib2c可以为 IP 地址生成代码。我不能说 mfd 会这样做,但肯定有一些 mib2c.iterate.conf(用于表)会这样做。

SNMP 中的 IP 类型是ASN_IPADDRESS ,由 C 中的unint32_t表示。此外,您需要确保在代表 IP 的对象的 MIB 文件中,您有“ SYNTAX IpAddress ”。

看一下: 查看带有 IP 对象的 MIB 文件C 中的实现

于 2017-11-07T22:49:32.337 回答
0

一个答案,但我离理解还很远,所以问题仍然存在

非常务实地我设法手动添加

//I put here ONLY what I added, see question above to complete code
#define STR_LENGTH_IPV4 sizeof("xxx.yyy.zzz.www")
char   VideoInetAddr[STR_LENGTH_IPV4] = "192.168.2.3";
//...
const oid VideoInetAddr_oid[] = { 1,3,6,1,4,1,a,b,c,d,f };

reg = netsnmp_create_handler_registration(
         "VideoInetAddr", NULL,
          VideoInetAddr_oid, OID_LENGTH(VideoInetAddr_oid),
          HANDLER_CAN_RWRITE);

netsnmp_init_watcher_info(&VideoInetAddr_winfo, &VideoInetAddr, sizeof(VideoInetAddr),
              ASN_OCTET_STR,  WATCHER_MAX_SIZE );

if (netsnmp_register_watched_scalar( reg, &VideoInetAddr_winfo ) < 0 ) {
    snmp_log( LOG_ERR, "Failed to register watched VideoInetAddr" );
}

它仍然需要准确理解诸如 WATCHER_MAX_SIZE 之类的选项(它是好选项吗?)

于 2017-10-26T16:24:11.193 回答