openlldp-0.4alpha實現詳解(六)——lldp_tlv、lldp_tlv_common、msap、lldp_neighbor模塊

    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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章