openlldp-0.4alpha实现详解(六)——lldp_tlv、lldp_tlv_common、msap、lldp_neighbor模块

11 篇文章 0 订阅
7 篇文章 5 订阅

    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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值