📄 interface_lsdb.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 + -