openlldp-0.4alpha实现详解(六)——lldp_tlv、lldp_tlv_common、msap、lldp_neighbor模块_lldp tlv_baidu20008的博客-程序员秘密

技术标签: c语言  linux  lldp  

    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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/baidu20008/article/details/19812975

智能推荐

sample_venc.c中sample_venc_h265_h264调用_从0开始搞计算机的博客-程序员秘密

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

苹果电脑如何正确断网 Mac电脑断网方法_苹果笔记本要怎么断开网络连接_喵小姐的鱼的博客-程序员秘密

电脑在我们日常生活几乎不可缺少的,有时候我们需要设置电脑断网,使用win大的朋友都知道断网在本地连接中,那么对于刚接手Mac的小白来说,苹果电脑如何正确断网呢?简单粗暴——拔网线,NO!这里小编为大家带来了Mac电脑断网方法让你轻松断网。##Mac断网方法点击左上角的苹果电脑图标,选择系统偏好设置,如图:单击网络,如图:进入“网络”界面,单击左下角“设置”图标,在设置的下拉菜单中选择“停用服务”,如图:单击右下角“应用”,即可断开网络连接。...

sql 取当月 所有日期_sql 当月所有日期_realbeckham的博客-程序员秘密

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'))

INFORMATION_SCHEMA.PROFILING_weixin_33711647的博客-程序员秘密

INFORMATION_SCHEMA PROFILING TablePROFILING表提供了语句分析信息。 其内容对应于SHOW PROFILES和SHOW PROFILE语句生成的信息.INFORMATION_SCHEMA NameSHOW NameNotesQUERY_IDQuery_ID标识SEQ具有相同QUERY_ID值的行的显示顺序的序列号S...

selenium报错Message: This version of ChromeDriver only supports Chrome version xx_Student-F的博客-程序员秘密

发生这种情况大部分原因是因为Google浏览器的自动更新,导致chromedriver.exe版本和Google浏览器版本不一致,有两种解决办法。1.将Google浏览器版本降级为chromedriver.exe对应的版本2.将chromedriver.exe升级为Google浏览器对应的版本下面的解决办法基于第二种Step1 查看Google版本,地址栏输入Chrome://version,回车,可以看到版本为90.0.4430Step2 打开chromedriver镜像网址,找到对应版本的ch

随便推点

SIGCLD 和今日单词_wwwjjq123的博客-程序员秘密

一般的,父进程在生成子进程之后会有两种情况,一种是父进程继续去做别的事情,另一种是父进程啥都不做,一直在wait子进程退出[b].SIGCHLD信号就是为这第一种情况准备的,[/b]它让父进程去做别的事情,而只要父进程注册了处理该信号的函数,在子进程退出时就会调用该函数,在该函数中又可以调用wait得到终止的子进程的状态。处理信号的函数执行完后,再继续做父进程的事情.也就是说,如果父进程在...

程序员沟通技巧_6种使程序员生活更轻松的技巧_weixin_26705651的博客-程序员秘密

程序员沟通技巧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日期和时间函数汇总_db2时间函数_欧晨eli的博客-程序员秘密

 上一篇提到过在DB2中,可以通过SYSIBM.SYSDUMMY1、SYSIBM.DUAL获取寄存器中的值,也可以通过VALUES关键字获取寄存器中的值。则在这篇中,我们直接用VALUES关键字来看看这些函数。1.CURRENT DATE获取当前日期;CURRENT TIME获取当前时间;CURRENT TIMESTAMP获取当前时间戳(含年、月、日、时、分、秒);YEAR()获取年;MONTH()获取月;DAY()获取日;HOUR()获取小时;MINUTE()获取分钟;SECOND()获取秒;DAT.

采药2_纪中2540_dp_olahiuj的博客-程序员秘密

Description  辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”

SPFA求最短路并保存最短路径_luyehao1的博客-程序员秘密

#include &amp;lt;iostream&amp;gt;#include &amp;lt;cstdio&amp;gt;#include &amp;lt;cstring&amp;gt;#include &amp;lt;cmath&amp;gt;#include &amp;lt;vector&amp;gt;#include &amp;lt;queue&amp;gt;#include &amp;lt;algorithm&amp;gt;using namespace std;const

推荐文章

热门文章

相关标签