⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interface_lsdb.c

📁 实现禁位自动排列在禁位中具体实现了此方法所以这是一个创新很有应用价值在VC平台上调试通过
💻 C
字号:


#include "ospfh.h"
#include "ospfh_patch.h"
//从数据库中得到一个lsa的列表//

struct list *ospfh_lsalist_get ( int lsdb )
{
   char *table[]={"table_layer_0","table_layer_1","table_layer_2","table_layer_3"};
   char query[255];
   MYSQL* conn;
   MYSQL_RES *res_set;
   MYSQL_ROW row;
   struct listnode *newnode;
   struct list *newlist;
   struct ospf_lsa *newlsa;


   newnode=listnode_new ();
   
   newlist=list_new();     
   
   newlsa=(struct ospf_lsa*)malloc(sizeof(struct ospf_lsa));    
   conn = connect_mysql("192.168.0.1", "root", NULL, "lsdb", 0, NULL, 0); 
   
   if (conn==NULL)                           
   { 
       printf("connect mysql error!\n"); 
       exit(0); 
   }     

   sprintf(query,"select * from %s",table[lsdb]);

   if(mysql_query(conn,query) != 0)
   {
      printf("process_query failed!\nMaybe the layer number of database is out of value !\n\n");
     // exit(0);
   }

   res_set=mysql_store_result(conn);
   
   if(res_set==NULL)
   {
      printf("result errorring");
	  mysql_close(conn);
	  return NULL;
      
   }
   else
   {
      while((row=mysql_fetch_row(res_set))!=NULL)
      {	
		newnode->data=set_ospf_lsa_value(row);
		listnode_add (newlist, ((struct ospf_lsa*)newnode->data));
		
	  }
	  printf("get a newlist of %d lsas successful\n",newlist->count);
	  mysql_free_result(res_set);
	  mysql_close(conn);
      return newlist;
      
   }   
}
	  
//将一个列表写入数据库//

void ospfh_lsalist_install ( struct list *lsalist , int lsdb )
{
//	unsigned int m;
    struct listnode *node;
    struct ospf_lsa *lsa_node;
//	delete_list(lsdb);     
    for(node=lsalist->head;node;node=node->next)   
    {   
       lsa_node=(struct ospf_lsa*)node->data;
	   ospf_lsa_install ( lsdb , lsa_node);
		   
	}
	/*
	if(!m)
	{
		printf("the list of %d lsas installed successful \n",lsalist->count);
	}
	else
	{
		printf("install list failed\n");
		exit(1);
	}*/	
}

//从数据中读出一条lsa,feed-down时使用//

struct ospf_lsa *ospfh_lsa_get ( int lsdb , unsigned char entry_id )
{

   char query[255];
   MYSQL* conn;
   MYSQL_RES *res_set;
   MYSQL_ROW row;
   char *table[]={"table_layer_0","table_layer_1","table_layer_2","table_layer_3"};  
   struct ospf_lsa *newlsa;
   newlsa=(struct ospf_lsa*)malloc(sizeof(struct ospf_lsa));  
   
   conn = connect_mysql("192.168.0.1", "root", NULL, "lsdb", 0, NULL, 0); 

   if (conn==NULL)                           
   { 
       printf("connect mysql error!\n"); 
       exit(0); 
   }  
   
   sprintf(query,"select * from %s where index_lsa=%d",table[lsdb],entry_id);

   if(mysql_query(conn,query) != 0)
   {
      printf("process_query failed!\nMaybe the layer number of database is out of value !\n\n");
      exit(0);
   }

   res_set=mysql_store_result(conn);
   
   if(res_set==NULL)
   {
      printf("result errorring");
	  exit(0);
      
   }
   else
   {
	   if(!mysql_num_rows(res_set))
	   {
		   printf("this lsa is not exist!\n");
		   mysql_close(conn);
		   return NULL;
	   }
	   else
	   {
		   while((row=mysql_fetch_row(res_set))!=NULL)
		   {
			   newlsa=set_ospf_lsa_value(row);
		   }
		   printf("find one lsa in %s\n",table[lsdb]);
		   mysql_free_result(res_set);
		   mysql_close(conn);
		   return newlsa;
		   
	   }
           		
	}
   
}


//在数据库中寻找某一条lsa,如果存在,则返回此lsa;如果不存在,返回NULL;

struct ospf_lsa *ospf_lsa_lookup_in_lsdb ( int lsdb , struct ospf_lsa *lsa )
{
	MYSQL *conn;
	char *table[]={"table_layer_0","table_layer_1","table_layer_2","table_layer_3"};
	char strsql[255];
	MYSQL_RES *res_set;
	MYSQL_ROW row;

	
	struct ospf_lsa *lsdb_lsa;
    struct in_addr local_id;
	struct in_addr remote_id;
	char *lid;
	char *rid;
	local_id=lsa->lp->local_id.value;
	remote_id=lsa->lp->remote_id.value;
	lid=ipcon(local_id);
	rid=ipcon(remote_id);	
	conn = connect_mysql("192.168.0.1", "root", NULL, "lsdb", 0, NULL, 0); 
    if (conn==NULL) 
	{                       
           printf("connect mysql error!\n"); 
		   exit(0);
          
	}
	
	sprintf(strsql, "select * from %s where lnode_id_val='%s' and rnode_id_val='%s'",table[lsdb],lid,rid);

	if(mysql_query(conn,strsql)!=0) 
	{
		printf("process_query failed!\nMaybe the layer number of database is out of value !\n\n");
		exit(1);
			
	}
	res_set=mysql_store_result(conn);

	if(res_set==NULL)
    {
		printf("process_query failed\n");    
		exit(0);
    }
    else
    {
		if(mysql_num_rows(res_set)==0)
		{
			printf("this lsa is not exist\n");
			mysql_free_result(res_set);
			return NULL;
		}
		else
		{
			while((row=mysql_fetch_row(res_set))!=NULL)
			{
			   lsdb_lsa=set_ospf_lsa_value(row);
			}
			mysql_free_result(res_set);
			mysql_close(conn);
		    return lsdb_lsa;
            
		}	
					
	}
}

//根据查找,插入一条lsa//

int ospf_lsa_install (  int lsdb , struct ospf_lsa *newlsa  )
{
	struct ospf_lsa *current_lsa;
	current_lsa=ospf_lsa_lookup_in_lsdb ( lsdb , newlsa );
	if(current_lsa!=NULL)
	{
		printf("find one matched old lsa\n");
		ospf_lsa_delete_in_lsdb ( lsdb , current_lsa);
	}

	return(insert_lsa (newlsa,lsdb));
  // printf("lsa installed into lsdb\n");
}


//***********************************************************************************//

//数据库连接函数//

MYSQL *connect_mysql(char *hostname, char *username, char *passwd, char *dbname,  
        unsigned portnum, char *socketname, unsigned flags) 
{ 
        MYSQL *conn; 
        conn = mysql_init(NULL); 
        if (conn == NULL) 
		{ 
                return(NULL);
				printf("initialize failed\n");
        } 
        if (mysql_real_connect(conn, hostname, username, passwd, dbname, portnum,  
                socketname, flags) == NULL)
		{ 
                
			printf("can not connect mysql databases\n");
		 
            return(NULL); 
        } 
        else
		{
		//	printf("connect successful\n");
			return(conn); 
		}
}

//写入一条lsa到数据库//

int insert_lsa ( struct ospf_lsa *lsa , int lsdb)        
{
	MYSQL *conn;
	char *table[]={"table_layer_0","table_layer_1","table_layer_2","table_layer_3"};
	char strsql[2000];
    static int  index=1;


	conn = connect_mysql("192.168.0.1", "root", NULL, "lsdb", 0, NULL, 0); 
    if (conn==NULL) 
	{                       
        printf("connect mysql error!\n"); 
		exit(0);
    } 
	else
	{
        lsa->id=index;
		sprintf(strsql,"insert into %s values(%d,%d,%d,%d,%d,'%s',%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,'%s',%d,%d,%d,%d,%d,%d,%d,%d,'%s','%s',%d,%d,'%s',%d,%d,'%s',%d,%d,%d,%d,%d,%d,%d,'%s',%d,%d,'%s','%s','%s')",
		                                   table[lsdb],lsa->id,ntohs(lsa->data->ls_age),lsa->data->options,lsa->data->type,ntohl(lsa->data->id),
                                           ipcon(lsa->data->adv_router),ntohl(lsa->data->ls_seqnum),ntohs(lsa->data->checksum),
                                           ntohs(lsa->data->length),ntohs(lsa->lp->link_header.header.type),ntohs(lsa->lp->link_header.header.length),
                                           ntohs(lsa->lp->link_type.header.type),ntohs(lsa->lp->link_type.header.length),lsa->lp->link_type.value.link_type,
                                           ntohs(lsa->lp->link_id.header.type),ntohs(lsa->lp->link_id.header.length),ipcon(lsa->lp->link_id.value),
                                           ntohs(lsa->lp->te_metric.header.type),ntohs(lsa->lp->te_metric.header.length),ntohl(lsa->lp->te_metric.value),
                                           ntohs(lsa->lp->rsc_clsclr.header.type),ntohs(lsa->lp->rsc_clsclr.header.length),ntohl(lsa->lp->rsc_clsclr.value),
                                           ntohs(lsa->lp->id_identifier.header.type),ntohs(lsa->lp->id_identifier.header.length),ipcon(lsa->lp->id_identifier.value[0]),
                                           ipcon(lsa->lp->id_identifier.value[1]),ntohs(lsa->lp->local_id.header.type),ntohs(lsa->lp->local_id.header.length),
                                           ipcon(lsa->lp->local_id.value),ntohs(lsa->lp->remote_id.header.type),ntohs(lsa->lp->remote_id.header.length),
                                           ipcon(lsa->lp->remote_id.value),ntohs(lsa->lp->ifswitch_cap.header.type),ntohs(lsa->lp->ifswitch_cap.header.length),
                                           lsa->lp->ifswitch_cap.value.switchcap,lsa->lp->ifswitch_cap.value.encoding,ntohl(lsa->lp->ifswitch_cap.value.snum),
                                           ntohs(lsa->lp->ancestor_id.header.type),ntohs(lsa->lp->ancestor_id.header.length),ipcon(lsa->lp->ancestor_id.value),
                                           ntohs(lsa->lp->hierarchy_list.header.type),ntohs(lsa->lp->hierarchy_list.header.length),ipcon(lsa->lp->hierarchy_list.value[0]),
                                           ipcon(lsa->lp->hierarchy_list.value[1]),ipcon(lsa->lp->hierarchy_list.value[2]));
      
	 

	  if(mysql_query(conn,strsql)!=0) 
	  {                                           
          printf("insert error\n");
		  mysql_close(conn);
		  return;
	  }
	  else
	  {
		   printf("The lsa has been inserted \n"); 
		   index++;
		   mysql_close(conn);
           return index;
	  }
	}
}



//在数据库中删除一个列表//

void delete_list(int lsdb)
{
	MYSQL *conn;
	char *table[]={"table_layer_0","table_layer_1","table_layer_2","table_layer_3"};
	char strsql[2000];
	
	conn = connect_mysql("192.168.0.1", "root", NULL, "lsdb", 0, NULL, 0); 
    if (conn==NULL) 
	  {                       
           printf("connect mysql error!\n"); 
		   exit(0);
          
	  } 
	else
	{
		sprintf(strsql,"delete from %s",table[lsdb]);
		if(mysql_query(conn,strsql)!=0) 
		{                                           
            printf("delete list error\n");    
			
		}
	}
	mysql_close(conn);
}

//在数据库中删除一条特定的lsa//

void ospf_lsa_delete_in_lsdb ( int lsdb , struct ospf_lsa *lsa)
{
	MYSQL *conn;
	char *table[]={"table_layer_0","table_layer_1","table_layer_2","table_layer_3"};
	char strsql[255];

	struct in_addr local_id;
	struct in_addr remote_id;
	char *lid;
	char *rid;
	local_id=lsa->lp->local_id.value;
	remote_id=lsa->lp->remote_id.value;
	lid=ipcon(local_id);
	rid=ipcon(remote_id);	

	conn = connect_mysql("192.168.0.1", "root", NULL, "lsdb", 0, NULL, 0); 
    if (conn==NULL) 
	  {                       
           printf("connect mysql error!\n"); 
		   exit(0);
          
	  }
	
	sprintf(strsql, "delete from %s where lnode_id_val='%s' and rnode_id_val='%s'",table[lsdb],lid,rid);

	if(mysql_query(conn,strsql)!=0) 
	{
		printf("delete error\n");
		exit(0);
	}
	else
	{
		printf("delete completed\n");
		mysql_close(conn);
				
	}
}

//将struct in_addr 格式的变量转换为字符串//

char *ipcon(struct in_addr ip)
{
	int cal=0;
	char *s;
	char *t;

//	ip.S_un.S_addr=ntohl(ip.S_un.S_addr);
	t=inet_ntoa(ip);
	while(t[cal]!='\0')
	{
		cal++;
	}
	cal+=1;
	s=(char*)malloc(sizeof(char)*cal);
	memcpy(s,t,cal);
	return(s);
}
//给一条lsa进行赋值//

struct ospf_lsa  *set_ospf_lsa_value (char *row[])
{
	struct ospf_lsa *newlsa;
	struct lsa_header *head;
	struct mpls_te_link *te;
    newlsa=(struct ospf_lsa*)malloc(sizeof(struct ospf_lsa));
	head=(struct lsa_header*)malloc(sizeof(struct lsa_header));
	te=(struct mpls_te_link*)malloc(sizeof(struct mpls_te_link));
	
	newlsa->id=atoi(row[0]);

    head->ls_age=htons(atoi(row[1]));
    head->options=atoi(row[2]);
    head->type=atoi(row[3]);
	head->id=htonl(atoi(row[4]));
    head->adv_router.S_un.S_addr=inet_addr(row[5]);
    head->ls_seqnum=htonl(atoi(row[6]));
    head->checksum=htons(atoi(row[7]));
    head->length=htons(atoi(row[8]));

	te->link_header.header.type=htons(atoi(row[9]));
    te->link_header.header.length=htons(atoi(row[10]));

    te->link_type.header.type=htons(atoi(row[11]));
    te->link_type.header.length=htons(atoi(row[12]));
    te->link_type.value.link_type=atoi(row[13]);

    te->link_id.header.type=htons(atoi(row[14]));
    te->link_id.header.length=htons(atoi(row[15]));
    te->link_id.value.S_un.S_addr=inet_addr(row[16]);

    te->te_metric.header.type=htons(atoi(row[17]));
    te->te_metric.header.length=htons(atoi(row[18]));
    te->te_metric.value=htonl(atoi(row[19]));


	te->rsc_clsclr.header.type=htons(atoi(row[20]));
	te->rsc_clsclr.header.length=htons(atoi(row[21]));
	te->rsc_clsclr.value=htonl(atoi(row[22]));


	te->id_identifier.header.type=htons(atoi(row[23]));
	te->id_identifier.header.length=htons(atoi(row[24]));
	te->id_identifier.value[0].S_un.S_addr=inet_addr(row[25]);
	te->id_identifier.value[1].S_un.S_addr=inet_addr(row[26]);

	te->local_id.header.type=htons(atoi(row[27]));
	te->local_id.header.length=htons(atoi(row[28]));
	te->local_id.value.S_un.S_addr=inet_addr(row[29]);

	te->remote_id.header.type=htons(atoi(row[30]));
	te->remote_id.header.length=htons(atoi(row[31]));
	te->remote_id.value.S_un.S_addr=inet_addr(row[32]);

	te->ifswitch_cap.header.type=htons(atoi(row[33]));
	te->ifswitch_cap.header.length=htons(atoi(row[34]));
	te->ifswitch_cap.value.switchcap=atoi(row[35]);
	te->ifswitch_cap.value.encoding=atoi(row[36]);
	te->ifswitch_cap.value.snum=htonl(atoi(row[36]));

	te->ancestor_id.header.type=htons(atoi(row[38]));
	te->ancestor_id.header.length=htons(atoi(row[39]));
	te->ancestor_id.value.S_un.S_addr=inet_addr(row[40]);

	te->hierarchy_list.header.type=htons(atoi(row[41]));
	te->hierarchy_list.header.length=htons(atoi(row[42]));
	te->hierarchy_list.value[0].S_un.S_addr=inet_addr(row[43]);
	te->hierarchy_list.value[1].S_un.S_addr=inet_addr(row[44]);
	te->hierarchy_list.value[2].S_un.S_addr=inet_addr(row[45]);


	newlsa->data=head;
	newlsa->lp=te;
	ospf_lsa_new(newlsa);

    return newlsa;
}














⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -