lldp_tlv主要是用来创建各种lldp报文所需的tlv,并提供验证。而lldp_tlv_common模块则是对于标准tlv进行修整。之前我们知道,lldp的tlv的type只有7个bit位,而length则有9个bit位,这样的结构对于程序的使用是十分不便的,故此进行转化。将7个bit位的type,转化为uint8_t。9bit的length转为为uint16_t的。
msap模块
该模块主要负责邻居信息的更新和插入以及创建。
lldp_neighbor.c模块
该模块主要是获取系统信息,并将该主机上所存储的所有邻居信息整合在一个字符串中。
/*
同一台主机上存储的邻居信息,之后通过unix套接字将这些信息输出到文件中或是屏幕中
*/
char *lldp_neighbor_information(struct lldp_port *lldp_ports) {
struct lldp_port *lldp_port = lldp_ports;
struct lldp_msap *msap_cache = NULL;
struct lldp_tlv_list *tlv_list = NULL;
int neighbor_count = 0;
char *result = malloc(2048);
char *buffer = malloc(2048);
char *info_buffer = malloc(2048);
char *tmp_buffer = malloc(2048);
char *tlv_name = NULL;
char *tlv_subtype = NULL;
memset(result, 0x0, 2048);
memset(buffer, 0x0, 2048);
memset(info_buffer, 0x0, 2048);
memset(tmp_buffer, 0x0, 2048);
sprintf(result, "\nOpenLLDP Neighbor Info: \n\n");
while(lldp_port != NULL) {
neighbor_count = 0;
memset(buffer, 0x0, 2048);
memset(info_buffer, 0x0, 2048);
memset(tmp_buffer, 0x0, 2048);
sprintf(buffer, "Interface '%s' has ", lldp_port->if_name);
strncat(result, buffer, 2048);
msap_cache = lldp_port->msap_cache;
while(msap_cache != NULL) {
neighbor_count++;
tlv_list = msap_cache->tlv_list;
sprintf(tmp_buffer, "Neighbor %d:\n", neighbor_count);
strncat(info_buffer, tmp_buffer, 2048);
memset(tmp_buffer, 0x0, 2048);
while(tlv_list != NULL) {
memset(tmp_buffer, 0x0, 2048);
if(tlv_list->tlv != NULL) {
tlv_name = tlv_typetoname(tlv_list->tlv->type);
if(tlv_name != NULL) {
sprintf(tmp_buffer, "\t%s: ", tlv_name);
strncat(info_buffer, tmp_buffer, 2048);
//free(tlv_name);
//tlv_name = NULL;
memset(tmp_buffer, 0x0, 2048);
tlv_subtype = decode_tlv_subtype(tlv_list->tlv);
if(tlv_subtype != NULL) {
sprintf(tmp_buffer, "\t%s\n", tlv_subtype);
strncat(info_buffer, tmp_buffer, 2048);
memset(tmp_buffer, 0x0, 2048);
free(tlv_subtype);
tlv_subtype = NULL;
}
} else {
sprintf(tmp_buffer, "\t\tUnknown TLV Type (%d)\n", tlv_list->tlv->type);
strncat(info_buffer, tmp_buffer, 2048);
}
} else {
debug_printf(DEBUG_NORMAL, "Yikes... NULL TLV in MSAP cache!\n");
}
tlv_list = tlv_list->next;
}
strncat(info_buffer, "\n", 2048);
msap_cache = msap_cache->next;
}
memset(buffer, 0x0, 2048);
sprintf(buffer, "%d LLDP Neighbors: \n\n", neighbor_count);
strncat(result, buffer, 2048);
strncat(result, info_buffer, 2048);
lldp_port = lldp_port->next;
}
free(tmp_buffer);
free(info_buffer);
free(buffer);
return(result);
}
本人享有博客文章的版权,转载请标明出处http://blog.csdn.net/baidu20008
SAMPLE_VENC_H265_H264 SAMPLE_COMM_SYS_GetPicSize SAMPLE_COMM_VI_GetSensorInfo SAMPLE_VENC_CheckSensor SAMPLE_VENC_GetDefaultVpssAttr SAMPLE_VENC_GetCommVbAttr SAMPLE_VENC_SYS_Init SAMPLE_VENC_VI_Init SAMPLE_VENC_VPSS_Init
电脑在我们日常生活几乎不可缺少的,有时候我们需要设置电脑断网,使用win大的朋友都知道断网在本地连接中,那么对于刚接手Mac的小白来说,苹果电脑如何正确断网呢?简单粗暴——拔网线,NO!这里小编为大家带来了Mac电脑断网方法让你轻松断网。##Mac断网方法点击左上角的苹果电脑图标,选择系统偏好设置,如图:单击网络,如图:进入“网络”界面,单击左下角“设置”图标,在设置的下拉菜单中选择“停用服务”,如图:单击右下角“应用”,即可断开网络连接。...
SELECT to_date(to_char(TO_DATE('2017-06-01' ,'yyyy-mm-dd') + LEVEL - 1 , 'yyyy-mm-dd'),'yyyy-MM-dd') dt FROM DUAL CONNECT BY LEVEL <= to_number(to_char(LAST_DAY(TO_DATE('2017-06-01' ,'yyyy-mm-dd'))
Elasticsearch基础和入门(连载中)
INFORMATION_SCHEMA PROFILING TablePROFILING表提供了语句分析信息。 其内容对应于SHOW PROFILES和SHOW PROFILE语句生成的信息.INFORMATION_SCHEMA NameSHOW NameNotesQUERY_IDQuery_ID标识SEQ具有相同QUERY_ID值的行的显示顺序的序列号S...
发生这种情况大部分原因是因为Google浏览器的自动更新,导致chromedriver.exe版本和Google浏览器版本不一致,有两种解决办法。1.将Google浏览器版本降级为chromedriver.exe对应的版本2.将chromedriver.exe升级为Google浏览器对应的版本下面的解决办法基于第二种Step1 查看Google版本,地址栏输入Chrome://version,回车,可以看到版本为90.0.4430Step2 打开chromedriver镜像网址,找到对应版本的ch
杜利特尔分解Doolittle转化为克洛特分解Crout_解线性方程组的直接解法
一般的,父进程在生成子进程之后会有两种情况,一种是父进程继续去做别的事情,另一种是父进程啥都不做,一直在wait子进程退出[b].SIGCHLD信号就是为这第一种情况准备的,[/b]它让父进程去做别的事情,而只要父进程注册了处理该信号的函数,在子进程退出时就会调用该函数,在该函数中又可以调用wait得到终止的子进程的状态。处理信号的函数执行完后,再继续做父进程的事情.也就是说,如果父进程在...
程序员沟通技巧Whether you are a novice or experienced programmer, following these helpful professional tips will save you time and greatly improve the quality of your code. 无论您是新手还是经验丰富的程序员,遵循这些有用的专业提示都将节省您的...
上一篇提到过在DB2中,可以通过SYSIBM.SYSDUMMY1、SYSIBM.DUAL获取寄存器中的值,也可以通过VALUES关键字获取寄存器中的值。则在这篇中,我们直接用VALUES关键字来看看这些函数。1.CURRENT DATE获取当前日期;CURRENT TIME获取当前时间;CURRENT TIMESTAMP获取当前时间戳(含年、月、日、时、分、秒);YEAR()获取年;MONTH()获取月;DAY()获取日;HOUR()获取小时;MINUTE()获取分钟;SECOND()获取秒;DAT.
Description 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”
#include &lt;iostream&gt;#include &lt;cstdio&gt;#include &lt;cstring&gt;#include &lt;cmath&gt;#include &lt;vector&gt;#include &lt;queue&gt;#include &lt;algorithm&gt;using namespace std;const