此文档是经过逆序推到出的,可能有错误之处,敬请指教,谢谢。

1)interfaces_update

更新一些接口信息

2)levent_iface_subscribe

该接口通过socket通信(非阻塞模式)来获取信息。增加了一个event,来接收信息。

3)levent_iface_trigger  直接调用

lldpd_update_localports

更新本地接口信息。

4)lldpd_reset_timer

重启有信息变更的端口的timer。

5)levent_schedule_pdu

安排发送pdu。如果接口(端口)对应的timer不存在,则需添加。

6)levent_send_pdu

int tx_interval = hardware->h_cfg->g_config.c_tx_interval; // 发送间隔

根据发送间隔,以及是否是快速帧(快速帧有自己的发送间隔,快于普通帧)来进行发送pdu。

7)lldpd_send

首先判断模式是否支持发送模式,以及接口是否正常运行状态,若否,则不发送。

if (cfg->g_config.c_receiveonly || cfg->g_config.c_paused) return;
     if ((hardware->h_flags & IFF_RUNNING) == 0)  return;

其次根据使用的协议还有协议是否enabeled来进行发送报文。

for (i=0; cfg->g_protocols[i].mode != 0; i++) {
           if (!cfg->g_protocols[i].enabled)
                      continue;
           /* We send only if we have at least one remote system
        * speaking this protocol or if the protocol is forced */
       if (cfg->g_protocols[i].enabled > 1) {
       cfg->g_protocols[i].send(cfg, hardware);
       sent++;
       continue;
    }

其中重要的结构体有:

struct lldpd_config {

int c_paused;       /* lldpd is paused */

int c_tx_interval;   //lldppdu发送间隔

int c_smart;    /* Bitmask for smart configuration (see SMART_*) */

int c_receiveonly;   //只接受模式,有三种模式,只发送、只接收、同时支持发送和接收

int c_max_neighbors;  //支持的最大邻居数

char *c_mgmt_pattern; /* Pattern to match a management address */

char *c_cid_pattern; /* Pattern to match interfaces to use for chassis ID */

char *c_iface_pattern; /* Pattern to match interfaces to use */

char *c_platform; /* Override platform description (for CDP) */

char *c_description; /* Override chassis description */

int c_advertise_version; /* Should the precise version be advertised? */

int c_set_ifdescr;  /* Set interface description */

#ifdef ENABLE_LLDPMED

int c_noinventory; /* Don't send inventory with LLDP-MED */

int c_enable_fast_start; /* enable fast start */ //是否启动fast start模式,每秒钟发送报文个数快于平常

int c_tx_fast_init; //fast start的报文数量

int c_tx_fast_interval;  // fast start报文发送间隔

#endif

int c_tx_hold;  /* Transmit hold */

int c_bond_slave_src_mac_type; /* Src mac type in lldp frames over bond slaves */

};

如果一个“新邻居”被识别,将会启用快速发送机制,在很短的时间内连续发送指定数量(txFastInit,默认值为4)的LLDPDU,以确保“新邻居”能被快速更新。

如果远端系统MIB信息库因为过载(tooManyNeighbors)而不能容纳新的邻居信息,则会为了避免过多的PDU传输而抑制快速发送行为。

同时为了防止在有多个端口需要发送LLDPDU的系统中,所有的端口的定时器都在同一时间到期,因而标准建议将采用某种机制将多个发送实例的定时器到期时间给错开,以避免一个系统在同一时刻发送大量的LLDPDU

lldpd-0.7.7代码解读(send_pdu部分)的更多相关文章

  1. 优秀开源代码解读之JS与iOS Native Code互调的优雅实现方案

    简介 本篇为大家介绍一个优秀的开源小项目:WebViewJavascriptBridge. 它优雅地实现了在使用UIWebView时JS与ios 的ObjC nativecode之间的互调,支持消息发 ...

  2. SoftmaxLayer and SoftmaxwithLossLayer 代码解读

    SoftmaxLayer and SoftmaxwithLossLayer 代码解读 Wang Xiao 先来看看 SoftmaxWithLoss 在prototext文件中的定义: layer { ...

  3. 【Away3D代码解读】(三):渲染核心流程(渲染)

    还是老样子,我们还是需要先简略的看一下View3D中render方法的渲染代码,已添加注释: //如果使用了 Filter3D 的话会判断是否需要渲染深度图, 如果需要的话会在实际渲染之前先渲染深度图 ...

  4. Hybrid----优秀开源代码解读之JS与iOS Native Code互调的优雅实现方案-备

    本篇为大家介绍一个优秀的开源小项目:WebViewJavascriptBridge. 它优雅地实现了在使用UIWebView时JS与ios 的ObjC nativecode之间的互调,支持消息发送.接 ...

  5. Jsoup代码解读之六-防御XSS攻击

    Jsoup代码解读之八-防御XSS攻击 防御XSS攻击的一般原理 cleaner是Jsoup的重要功能之一,我们常用它来进行富文本输入中的XSS防御. 我们知道,XSS攻击的一般方式是,通过在页面输入 ...

  6. Jsoup代码解读之四-parser

    Jsoup代码解读之四-parser 作为Java世界最好的HTML 解析库,Jsoup的parser实现非常具有代表性.这部分也是Jsoup最复杂的部分,需要一些数据结构.状态机乃至编译器的知识.好 ...

  7. Jsoup代码解读之三-Document的输出

    Jsoup代码解读之三-Document的输出   Jsoup官方说明里,一个重要的功能就是output tidy HTML.这里我们看看Jsoup是如何输出HTML的. HTML相关知识 分析代码前 ...

  8. Jsoup代码解读之一-概述

    Jsoup代码解读之一-概述 今天看到一个用python写的抽取正文的东东,美滋滋的用Java实现了一番,放到了webmagic里,然后发现Jsoup里已经有了…觉得自己各种不靠谱啊!算了,静下心来学 ...

  9. Jsoup代码解读之二-DOM相关对象

    Jsoup代码解读之二-DOM相关对象   之前在文章中说到,Jsoup使用了一套自己的DOM对象体系,和Java XML API互不兼容.这样做的好处是从XML的API里解脱出来,使得代码精炼了很多 ...

  10. MXNet--DMLC-Core代码解读与宏

    MXNet--DMLC-Core代码解读与宏 dmlc-core是Distributed (Deep) Machine Learning Community的一个基础模块,这个模块用被应用到了mxne ...

随机推荐

  1. TCP三次握手中,为什么需要第三次握手?

    为什么客户端A还要发送一次确认呢?(为什么需要第三次握手) 这主要是为了防止已失效的连接请求报文段突然又传送到了B(服务器端),因而产生错误. 所谓"已失效的连接请求报文段"是这样 ...

  2. 《JavaScript高级程序设计》读书笔记 ---Function 类型

    说起来ECMAScript 中什么最有意思,我想那莫过于函数了——而有意思的根源,则在于函数实际上是对象.每个函数都是Function 类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对 ...

  3. 10676 涂鸦跳跃(sort)

    10676 涂鸦跳跃 该题有题解 时间限制:1000MS  内存限制:65535K提交次数:240 通过次数:19 题型: 编程题   语言: G++;GCC Description 你玩过曾经风靡一 ...

  4. hexo常用命令笔记

    hexo npm install -g hexo npm update -g hexo hexo init 常用 hexo n == hexo new "a new post" 新 ...

  5. 转:Web网站性能测试分析及调优实例

    1.背景 前段时间,性能测试团队经历了一个规模较大的门户网站的性能优化工作,该网站的开发和合作涉及多个组织和部门,而且网站的重要性不言而喻,同时上线时间非常紧迫,关注度也很高,所以对于整个团队的压力也 ...

  6. L3-004. 肿瘤诊断

    L3-004. 肿瘤诊断 题目链接:https://www.patest.cn/contests/gplt/L3-004 BFS 之前尝试使用递归dfs,提交后发现有两个段错误,发现递归层数太多,然后 ...

  7. L2-007. 家庭房产

    L2-007. 家庭房产 题目链接:https://www.patest.cn/contests/gplt/L2-007 并查集 初学,看这题的时候完全没有什么好的想法,参考了@yinzm的blog用 ...

  8. 说说SACC2016第八届架构师大会

    每年这方面的会议很多,不知不觉已经连续举办八年了.一届比一届办的有质量,规模越大.今年也如约而至.2016-10-27在北京万达索菲特酒店.4000多人规模,云集各领域顶尖架构师,运维,云计算,技术专 ...

  9. openwrt增加串口登录需要密码

    https://wiki.openwrt.org/doc/howto/serial.console.password Openwrt 串口默认是没有密码的.Openwrt启动后,一个默认的密码将被启用 ...

  10. HTML5 学习总结

    1,h5比原来的h4.0版本的页面头部更为简化, <!doctype html> <meta charset="utf-8"/>sublime中快速生成格式 ...