lldpd-0.7.7代码解读(send_pdu部分)
此文档是经过逆序推到出的,可能有错误之处,敬请指教,谢谢。
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部分)的更多相关文章
- 优秀开源代码解读之JS与iOS Native Code互调的优雅实现方案
简介 本篇为大家介绍一个优秀的开源小项目:WebViewJavascriptBridge. 它优雅地实现了在使用UIWebView时JS与ios 的ObjC nativecode之间的互调,支持消息发 ...
- SoftmaxLayer and SoftmaxwithLossLayer 代码解读
SoftmaxLayer and SoftmaxwithLossLayer 代码解读 Wang Xiao 先来看看 SoftmaxWithLoss 在prototext文件中的定义: layer { ...
- 【Away3D代码解读】(三):渲染核心流程(渲染)
还是老样子,我们还是需要先简略的看一下View3D中render方法的渲染代码,已添加注释: //如果使用了 Filter3D 的话会判断是否需要渲染深度图, 如果需要的话会在实际渲染之前先渲染深度图 ...
- Hybrid----优秀开源代码解读之JS与iOS Native Code互调的优雅实现方案-备
本篇为大家介绍一个优秀的开源小项目:WebViewJavascriptBridge. 它优雅地实现了在使用UIWebView时JS与ios 的ObjC nativecode之间的互调,支持消息发送.接 ...
- Jsoup代码解读之六-防御XSS攻击
Jsoup代码解读之八-防御XSS攻击 防御XSS攻击的一般原理 cleaner是Jsoup的重要功能之一,我们常用它来进行富文本输入中的XSS防御. 我们知道,XSS攻击的一般方式是,通过在页面输入 ...
- Jsoup代码解读之四-parser
Jsoup代码解读之四-parser 作为Java世界最好的HTML 解析库,Jsoup的parser实现非常具有代表性.这部分也是Jsoup最复杂的部分,需要一些数据结构.状态机乃至编译器的知识.好 ...
- Jsoup代码解读之三-Document的输出
Jsoup代码解读之三-Document的输出 Jsoup官方说明里,一个重要的功能就是output tidy HTML.这里我们看看Jsoup是如何输出HTML的. HTML相关知识 分析代码前 ...
- Jsoup代码解读之一-概述
Jsoup代码解读之一-概述 今天看到一个用python写的抽取正文的东东,美滋滋的用Java实现了一番,放到了webmagic里,然后发现Jsoup里已经有了…觉得自己各种不靠谱啊!算了,静下心来学 ...
- Jsoup代码解读之二-DOM相关对象
Jsoup代码解读之二-DOM相关对象 之前在文章中说到,Jsoup使用了一套自己的DOM对象体系,和Java XML API互不兼容.这样做的好处是从XML的API里解脱出来,使得代码精炼了很多 ...
- MXNet--DMLC-Core代码解读与宏
MXNet--DMLC-Core代码解读与宏 dmlc-core是Distributed (Deep) Machine Learning Community的一个基础模块,这个模块用被应用到了mxne ...
随机推荐
- zstu 4214 高楼扔鸡蛋(google 面试题)dp
input T 1<=T<=10000 n m 1<=n<=2000000007 1<=m<=32 output m个鸡蛋从1到n哪一楼x扔下去刚好没碎,而再x+1 ...
- Python 函数之路
---恢复内容开始--- python函数的定义 def add(): a = 1 b = 2 c == a + b print(c) 函数就是把一段实现某一个功能的代放进一个封装的方法名里,这个方法 ...
- Webstrom 连接svn报错怎么解决
Subversion: (Accessing URL: https://192.168.1.249:8443/svn/H5/seif ) Received fatal alert: handshak ...
- Linux 朝花夕拾
.bash_profile和.bashrc .bashrc要保存个人的一些个性化设置,如命令别名.路径等. 每次修改.bashrc后,使用source ~/.bashrc(或者 . ~/.bashrc ...
- Activity的生命周期和启动模式
Activity的生命周期分析 典型情况下的生命周期.是指在用户参与的情况下,Activity所经过的生命周期的改变. 异常情况下的生命周期.是指Activity被系统回收或者由于当前设备的Confi ...
- Ray Tracing
Ray Tracing 题目链接:http://codeforces.com/problemset/problem/724/C 拓展欧几里得 //为什么这次C题这么难啊=.= 可以观察到,光线在矩形中 ...
- [妙味JS基础]第七课:运算符、流程控制
知识点总结 &&(与).||(或).!(非) 与: alert(20 && 20>100) => false alert(20 && 20& ...
- C#的面向对象
一.面向对象编程(OOP)是将现实中的事物抽象花,其设计的重点就是类的设计. 二.类是面向对象编程的设计核心,实际上是一种复杂的数据类型.将不同类型的数据和与这些数据就相关的操作封装在一起,就构成类. ...
- PAT 团体程序设计天梯赛-练习集 L1-015. 跟奥巴马一起画方块
美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统.2014年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正 ...
- ubuntu环境下jdk安装及jenkins安装
本文内容参考http://jingyan.baidu.com/article/c33e3f48a3365dea15cbb5c9.html 1 jdk下载 安装 http://www.oracle.co ...