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

来源:互联网 发布:alphago软件 编辑:程序博客网 时间:2024/04/29 14:24

    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 0