SNMP源码分析

2023-05-16

源码下载

http://www.net-snmp.org/download.html

源码目录结构

在这里插入图片描述

net-snmp程序逻辑

(1)main主函数

#ifdef WIN32SERVICE  //windows系统下使用snmp
static int
SnmpDaemonMain(int argc, TCHAR * argv[])
#else	//linux系统
int
main(int argc, char *argv[])  //主函数
#endif
{
    static const char options[] = "aAc:CdD::fhHI:l:L:m:M:n:p:P:qrsS:UvV-:Y:"  //支持的一些参数,比如snmpd -v
    
    /*下面是一些switch-case,根据输入参数返回不同的内容。比如输入snmpd -v,走到 case 'v':
            version();
            exit_code = 0;
            goto out;
	  调用version()函数<见下文>,返回
	  $:snmpd -v
		NET-SNMP version:  5.8
		Web:               http://www.net-snmp.org/
		Email:             net-snmp-coders@lists.sourceforge.net
	*/

业务逻辑代码分析见下文:
static void
version(void)
{
    printf("\nNET-SNMP version:  %s\n"
           "Web:               http://www.net-snmp.org/\n"
           "Email:             net-snmp-coders@lists.sourceforge.net\n\n",
           netsnmp_get_version());
}

搜了两篇不错的源码分析:
篇一:
snmpd代理(main主函数位于:net-snmp-5.9.3\agent\snmpd.c)完成两个功能:
1、接收网管发过来的snmp包,并对接收到的snmp包进行解析,校验后,找到并调用相应的处理函数进行处理。
2、调用注册了的告警函数,向网管发送告警信息。
Net-snmp代码流程图:(https://blog.csdn.net/jiangxin04211/category_9271012.html)
在这里插入图片描述
篇二:
在这里插入图片描述
来源:https://blog.csdn.net/fuyuande/article/details/83047765
以上两篇梳理的已经非常详细,不再赘述。

(2)整体框架

一般的网络框架处理流程如下(net-snmp也类似):

 - 使用IO多路复用(linux下的select, poll, epoll)分离网络IO。
 - 对分离出来的网络IO进行操作,分为socket句柄可读、可写和出错三种情况。
 - 定时器事件,即检测一个定时器事件列表,如果有定时器到期,则执行该定时器事件。
while (netsnmp_running) 
{
    //更新配置文件
    update_config();
    
    //IO multiplexing
    count = netsnmp_large_fd_set_select(numfds, &readfds, &writefds, &exceptfds, tvp);
    if(count)
    {
        snmp_read2(&readfds);
    }
    
    /*
     * 如果更新配置之后,要先保存配置,防止之后崩溃
     */
     snmp_store_if_needed();

     /*
      * 处理定时器事件
      */
      run_alarms();

     netsnmp_check_outstanding_agent_requests();
}

run_alarms()函数:处理定时器事件。即遍历一个升序定时器列表,将定时器对象与当前时间(t_now)做比较,如果当前时间已经大于或等于定时器设置的时间,则表明定时器时间已经到了,执行定时器对应的回调函数。

void
snmp_read2(netsnmp_large_fd_set * fdset) --> snmp_sess_read2 --> _sess_read函数:

int
_sess_read(void *sessp, netsnmp_large_fd_set * fdset)
{
    if (transport->flags & NETSNMP_TRANSPORT_FLAG_LISTEN) 
    {
        int             data_sock = transport->f_accept(transport);
        return 0;
    }
    length = netsnmp_transport_recv(transport, rxbuf, rxbuf_len, &opaque,
                                    &olength);
     _sess_process_packet(sessp, sp, isp, transport,
                                           ocopy, ocopy?olength:0, pptr,
                                           pdulen)
}

_sess_read()函数根据状态标识transport->flags确定一个socket是侦听的socket还是普通与客户端连接的socket,如果是侦听sokcet则f_accept接收客户端的连接;如果是与客户端连接的socket,则先检测socket上有多少字节可读,如果没有字节可读或者检测字节数时出错,则关闭socket,反之调用处理函数。

snmpd程序使用一个session_list链表来管理所有的socket。

struct session_list *Sessions = NULL;   /* MT_LIB_SESSION */
netsnmp_session *
snmp_open(netsnmp_session *session)
{
    struct session_list *slp;
    slp = (struct session_list *) snmp_sess_open(session);
    if (!slp) {
        return NULL;
    }

    snmp_res_lock(MT_LIBRARY_ID, MT_LIB_SESSION);
    slp->next = Sessions;
    Sessions = slp;
    snmp_res_unlock(MT_LIBRARY_ID, MT_LIB_SESSION);

    return (slp->session);
}

int
snmp_close(netsnmp_session * session)
{
    struct session_list *slp = NULL, *oslp = NULL;

    {                           /*MTCRITICAL_RESOURCE */
        snmp_res_lock(MT_LIBRARY_ID, MT_LIB_SESSION);
        if (Sessions && Sessions->session == session) { /* If first entry */
            slp = Sessions;
            S

来源链接:https://www.jianshu.com/p/4998161c6c6f

(3)网络模块初始化

snmpd进程可以根据用户的配置来决定使用哪种协议来创建server,以某个协议为例子查看到接口注册流程如下:

init_snmp
    _init_snmp
        netsnmp_tdomain_init
            snmp_transport_inits.h
                netsnmp_tdomain_register(add domain_list(核心数据结构)//snmp_transport_inits.h
//使用宏来区分使用udp还是tcp协议,如下:
#ifdef NETSNMP_TRANSPORT_UDP_DOMAIN //为1
netsnmp_udp_ctor();
#endif
#ifdef NETSNMP_TRANSPORT_TCP_DOMAIN //为1
netsnmp_tcp_ctor();
#endif
#ifdef NETSNMP_TRANSPORT_ALIAS_DOMAIN
netsnmp_alias_ctor();
#endif
#ifdef NETSNMP_TRANSPORT_UDPIPV6_DOMAIN
netsnmp_udpipv6_ctor();
#endif
#ifdef NETSNMP_TRANSPORT_TCPIPV6_DOMAIN
netsnmp_tcpipv6_ctor();
#endif

根据用户配置进行初始化流程如下:

init_master_agent
    netsnmp_tdomain_transport_full
        match = find_tdomain(mystring);//mystring即为用户的配置
            match->f_create_from_tstring_new(执行注册好的回调函数创建server)

调用过程可以使用如此命令进行查看,程序执行过程中会将相应的token打印在终端上,方便梳理逻辑:

snmpd  -Lo -f -Dsnmp_agent -Dread_config -Dtdomain

关键数据结构与接口:

typedef struct netsnmp_tdomain_s {
    const oid      *name;
    size_t          name_length;
    const char    **prefix;

    /*
     * The f_create_from_tstring field is deprecated, please do not use it
     * for new code and try to migrate old code away from using it.
     */
    netsnmp_transport *(*f_create_from_tstring) (const char *, int);

    netsnmp_transport *(*f_create_from_ostring) (const u_char *, size_t, int);

    struct netsnmp_tdomain_s *next;

    netsnmp_transport *(*f_create_from_tstring_new) (const char *, int,
                             const char*);

} netsnmp_tdomain;

/*
 * Our list of supported transport domains.  
 */

static netsnmp_tdomain *domain_list = NULL;

int             netsnmp_tdomain_register(netsnmp_tdomain *domain);
    
int             netsnmp_tdomain_unregister(netsnmp_tdomain *domain);

static netsnmp_tdomain *find_tdomain(const char* spec)

实现原理
将底层的tcp与udp处理数据的接口封装好,在上层创建一个中间层transport来隐藏底层的具体实现,使用一个链表来将具体的实现作为子节点连接起来,利用反射的方式根据用户的配置去找到对应的接口,去创建server,这是一个需要学习的思路。
来源链接:https://www.jianshu.com/p/6ec214aae144

梳理思路:

1、snmp基础概念:
https://www.jianshu.com/p/6a9e83aa41c0 (图-可参考)
https://blog.csdn.net/JIANGXIN04211/article/details/78444747 (内容-可参考)
以上图+内容两者结合理解。

2、https://blog.csdn.net/JIANGXIN04211/article/details/78444821 源码下载及编译安装
https://blog.csdn.net/JIANGXIN04211/article/details/78475155 扩展get
https://blog.csdn.net/JIANGXIN04211/article/details/78477890 扩展set
https://blog.csdn.net/JIANGXIN04211/article/details/78478429 扩展trap
以上扩展方式需要重新编译安装snmpd源码及重启程序,属于静态扩展方式,需要总结其他动态方式扩展。

3、源代码main-receive函数分析:
https://www.jianshu.com/p/4998161c6c6f

4、新增mib库转.c核心代码分析:(涉及如何修改适配应用这一块)
https://blog.csdn.net/JIANGXIN04211/article/details/78478581

5、梳理 项目 是如何动态扩展mib库的。

知识的搬运工,站在巨人肩膀上…

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SNMP源码分析 的相关文章

  • PX4源码分析6_uorb通信机制

    一 创建流程 xff1a 在Firmware msg下创建msg文件 xff0c eg xff1a xxx msg xff0c 内容格式仿照原有msg文件在Firmware msg CMakeLists txt中将对应的msg文件添加 xf
  • snmp v3 参数_SNMP V3的配置指南

    SNMP v3版本已经推出很久了 xff0c 但是其普及度一直不高 xff0c 原因就在于其配置过于复杂 xff0c 本文主要就以cisco2950 锐捷2600以及H3C 3600系列交换机的SNMP V3的配置为例进行说明 首先以锐捷2
  • apache源码分析v2.0

    一 概要 1 平台功能层 xff0c 可移植运行库层 xff0c 核心功能层 xff0c 可选功能层 xff0c 第三方支持库 2 核心功能层 xff1a mod core 处理配置文件中的大部分配置指令 mod so 动态加载其余模块 m
  • [JavaSE 源码分析] 关于HashMap的个人理解

    目录 HashMap是什么 HashMap的底层数据结构是什么 table容量为什么必须是二的倍数 table容量怎么做到二的倍数 Entry是怎样的结构 Node Entry在HashMap中的具体实现处理hash冲突的方法HashMap
  • elasticjob 源码分析

    简介 elasticjob是基于quartz构建支持分片的分布式弹性可伸缩的job执行组件 zookeeper节点数据设计 job leader election latch instance 主节点的实例ID 临时节点 在节点选举成功后添
  • 【Zabbix实战之部署篇】Zabbix使用SNMP监控Linux系统

    Zabbix实战之部署篇 Zabbix使用SNMP监控Linux系统 一 SNMP协议介绍 1 SNMP协议简介 2 SNMP协议特点 二 实践环境介绍 三 检查Zabbix监控平台环境 1 检查Zabbix相关组件容器状态 2 检查Zab
  • Mybatis执行过程源码解析

    使用Mybatis执行查询sql代码示例 SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder build Resources getResourceAsReade
  • kaldi中SHELL调用C++程序过程源码分析

    引入 kaldi真正的核心源码 都是C 写成的 这个结论可以从如下两点得以确认 1 在kaldi的源码kaldi src目录下 能看到很多扩展名为 cc的源程序 这是linux下C 源码 2 在源码中 比如kaldi src featbin
  • Faster RCNN 源码解读(1) -- 文件结构分析

    基本介绍 Faster RCNN 在目标检测及其相关领域得到了广泛的运用 其原型RCNN是将CNN引入到目标检测的开山之作 此外基于region proposal是一种十分值得学习的思想 因此将在后续的系列章节中 基于源码 对Faster
  • android ARouter源码分析

    背景 随着项目越做越大 代码量越来越多 项目也随之改造成组件化的开发模式 组件化开发非常适合庞大的项目 将每个业务模块 功能模块解耦 抽离成组件的形式 各个组件遵循严格的依赖关系 因为这层严格的依赖关系 使得组件化比模块化结构更加简洁和清晰
  • Wifi模块—源码分析Wifi热点扫描2(Android P)

    一 前言 这次接着讲Wifi工程流程中的Wifi热点扫描过程部分的获取扫描结果的过程 也是Wifi扫描过程的延续 可以先看前面Wifi扫描的分析过程 Wifi模块 源码分析Wifi热点扫描 Android P 二 图示调用流程 这次的调用流
  • 使用pysnmp报错lambda错误

    pip install pyasn1 0 4 8 pysnmp 4 4 12 python Takes exactly 3 arguments 4 given Stack Overflow
  • Golang 中实现注解功能的思路分析

    文章目录 注解的作用 一些实现注解的开源 Golang 工程 Golang 中实现注解的基本思路 第一步 源码词法分析 第二步 代码生成 第三步 自动执行 番外 Golang 中一种代替注解的方案 注解的作用 提到注解 需要短暂的说明其前世
  • GTest源码剖析(四)——TEST_P宏

    GTest源码剖析 TEST P宏 GTest源码剖析TEST P宏 TEST P宏用法 TestWithParam 类 1 TestWithParam 类定义 2 WithParamInterface 模版类定义 INSTANTIATE
  • 如何读取 SNMP OID 输出(位)(hrPrinterDetectedErrorState)

    我有一个快速的问题 这很可能是用户错误 所以在开始之前我深表歉意 我正在尝试为设备设置阈值 以便当我们的一台打印机处于某种状态时它会提醒我们 卡纸 碳粉用完 无纸等 我找到了处理此问题的特定 oid 1 3 6 1 2 1 25 3 5 1
  • 如何通过SNMP查找打印机计数器

    我目前正在从事一个项目 涉及通过 SNMP 从打印机获取信息 现在我一直在测试 使用的打印机是 Lexmark X950 我一直在努力解决的一个问题是 我希望这个程序也适用于 HP Kyocera 或 Brother 打印机 但我使用的 O
  • SNMP V3 CBC-DES:如何使用 8 字节长的加密密钥对 PDU 进行加密? (DES,前 IV)

    过去我已经实现了自己的 v1 v2 SNMP 管理器 现在我还想支持 v3 因此必须实现 PDU 的加密 根据RFC2274 第 8 1 1 1 章16 字节私有密钥的前 8 个字节代表 DES 密钥 私有密钥的后 8 个字节代表 Prev
  • ASN.1 编译器错误标记“SYNTAX”意外

    我目前正在尝试编译 ASN 1 代码片段 它看起来如下 RFC1213 MIB DEFINITIONS BEGIN IMPORTS experimental FROM RFC1155 SMI OBJECT TYPE FROM RFC 121
  • 如何使用pysnmp获取SNMP数据?

    我想通过使用 python pysnmp 模块获取 snmp 数据 我曾经使用命令行来获取 SNMP 数据 但现在我想使用 pysnmp 模块来读取它 SNMP命令 snmpwalk v 1 c public
  • PySNMP:导入错误:没有名为 pyasn1.compat.octets 的模块

    我尝试在 Windows 上使用 PySNMP 但是当我尝试导入 cmdgen 时 我看到以下错误 from pysnmp entity rfc3413 oneliner import cmdgen ImportError No modul

随机推荐

  • Git常用命令符

    1 强制推送 xff08 慎用 xff0c 除非你认为其他冲突等可以丢弃 或者不是很重要 xff09 git push force 2 创建文件等小命令 touch a 创建一个a文件 echo 1234 gt gt a 把1234这个内容
  • 全网最全的 LeetCode 国人大神刷题指南,全部 Go 语言实现

    大家好 xff0c 我是欧盆索思 xff08 opensource xff09 xff0c 每天为你带来优秀的开源项目 xff01 说到 LeetCode xff0c 作为一个程序员来说 xff0c 应该不陌生 xff0c 近几年参加面试都
  • ROS实现串口通信

    虚拟串口的搭建 参考Linux下添加虚拟串口 xff0c 接收和发送数据 com py文件代码如下 xff1a span class token comment usr bin env python span span class toke
  • 基于Linux的UART驱动框架源码分析笔记

    文章目录 前言一 I MX6ULL串口接收和发送方式1 非DMA方式1 1 接收方式1 2 发送方式 2 DMA方式2 1 接收方式2 2 发送方式 二 UART驱动注册1 uart register driver 函数解析2 serial
  • cmake install 命令

    install指令用于定义安装规则 xff0c 安装的内容可以包括目标二进制 动态库 静态库以及文件 目录 脚本等 需要引入一个新的cmake指令和一个非常有用的变量 cmake install prefix 法一 xff1a cmake
  • 基于全景相机的视觉里程计算法研究

    一 视觉里程计 视觉里程计技术首先建立相机的成像模型 xff0c 接着通过标定算法计算相机参数 xff0c 最后建立相邻图像的关联并估计相机运动轨迹 1 1相机在空间中运动的描述 描述相机在三维空间中的运动状态 xff0c 即求解相机在空间
  • 多旋翼无人机组成(小白上路)

    1 无人机组成 1 1 机架 四旋翼最常见的两种机身布局如下图 xff1a 机架指无人机的承载平台 xff0c 通常用轴距衡量机架的大小 xff0c 轴距是指对角线两个螺旋桨的距离 xff0c 一般以mm为单位 xff0c 如F330表示轴
  • freertos创建任务后进入prvStartFirstTask发生HardFault_Handler中断

    在stm32f103zet6环境中移植成功freertos之后 xff0c 创建第一个任务之后 xff0c 会进入硬件中断 xff0c 经过排查发现死在了prvStartFirstTask 排查原因 xff1a 发现是启动文件startup
  • 解决无法对docker容器进行端口映射的问题

    初学docker的时候 xff0c 不知道为啥 xff0c 按着教程里打的代码 xff0c 最后却出现了映射失败的情况 即 xff1a 在docker内部设置的映射端口 xff0c 外部却没有办法访问 想了想 xff0c 不外乎两个原因 x
  • K8s手工创建kubeconfig

    我们通过 kubectl 命令行连接 k8s apiserver 时需要依赖 kubeconfig 文件 kubeconfig 文件通常包含了 context xff08 上下文 xff09 列表 xff0c 每个 context 又会引用
  • grep命令总结

    grep命令总结 1 关于 nbsp ps ef grep php grep v grep wc l grep v grep 代表在查询的最终结果中去掉grep命令本身 wc l 标示统计查询到的结果数量 grep常用命令 1 grep n
  • Ubuntu 16.04安装realsense D435i SDK以及realsense-ros

    先直接上一个报错信息 xff0c 折腾了半天才解决 在使用catkin make编译realsense ros时 xff0c 报错 traversing 4 packages in topological order realsense c
  • 关于视觉SLAM的一些常识(纯小白学习笔记)

    本文只是小白对于视觉slam的一个非常泛的介绍 xff0c 对于视觉slam中的数学运算均没有提及 xff0c 适合于对没有接触过视觉slam的新人进行一个简单的科普 作者即小白 xff0c 文章如有错误 xff0c 非常非常非常欢迎指正
  • 使用CubeMX快速搭建FREERTOS

    如何使用STM32快速搭建FREERTOS 小编之前一直使用正点原子家的产品 xff0c 最近准备学习学习TOUCHGFX 要用到HAL 43 RTOS 原子家的使用起来不方便 于是琢磨着使用STM32CUBEMX直接生成FREERTOS
  • 使用DMA+SPI驱动Aliyun Things 上的ST7789H2 LCD屏幕

    目录 前言硬件CUBEMX时钟树GPIOSPI 代码部分LCD驱动中断服务函数测试代码现象 前言 1 xff1a 驱动程序参考自https blog csdn net BearPi article details 104311705 2 x
  • SLAM测试5-YGZ-Stereo-Inertial(GAAS双目视觉ygz -立体惯性SLAM)

    这篇主要测试GAAS开源无人机里用到的一种SLAM算法 xff0c 目的是先对该SLAM算法进行熟悉 xff0c 再开始入手GAAS视觉定位 GIThub上的代码地址为 xff1a https github com gaoxiang12 y
  • Linux之线程条件变量cond

    概念 xff1a 条件变量不是锁 xff0c 要和互斥量组合使用 条件变量就是生产者 生产 完成 xff0c 消费者才能 使用 xff0c 如果没有 产品 xff0c 消费者就会被条件变量cond阻塞等待生产者 生产 xff08 生产者与消
  • Linux之线程-信号量sem_*

    1 概念 信号量可理解为进化版的互斥锁 量 xff0c 允许多个线程访问共享资源 由于互斥锁的力度比较大 xff0c 如果希望在多个线程间对某一对象的部分数据进行共享 xff0c 使用互斥锁是没有办法实现的 xff0c 只能将整个数据对象锁
  • 4、树(中篇)

    前言 前节二叉树只能适用于静态查找 不能实现动态插入 删除等 如何解决以下两个问题 静态查找与动态查找 针对动态查找 数据如何组织 4 1 二叉搜索树 4 1 1 什么是二叉搜索树 二叉搜索树 BST Binary Search Tree
  • SNMP源码分析

    源码下载 http www net snmp org download html 源码目录结构 net snmp程序逻辑 xff08 1 xff09 main主函数 span class token macro property span