MOD aaa-12 桥模型代码上传

SOL  桥模型代码上传
修改人:zhangliang
检视人:zhangliang
This commit is contained in:
zhanglianghy 2019-08-02 14:59:46 +08:00
parent 5000ef3411
commit 03fc657448
4 changed files with 219 additions and 22 deletions

View File

@ -11,8 +11,12 @@
typedef enum { typedef enum {
BR_CREATE_EVENT = 1, BR_CREATE_EVENT = 1,
BR_DELETE_EVENT, BR_DELETE_EVENT,
BR_CREATE_EVENT_PRE,
BR_DELETE_EVENT_PRE,
BR_IF_JOIN_EVENT, BR_IF_JOIN_EVENT,
BR_IF_LEAVE_EVENT, BR_IF_LEAVE_EVENT,
BR_IF_JOIN_EVENT_PRE,
BR_IF_LEAVE_EVENT_PRE,
BR_EVENT_INVALID BR_EVENT_INVALID
} BR_EVENT_TYPE; } BR_EVENT_TYPE;

View File

@ -4,7 +4,14 @@
#define IFCONFIG_PATH "/etc/network/interfaces" #define IFCONFIG_PATH "/etc/network/interfaces"
#define IF_BUFF_LEN 128 #define IF_BUFF_LEN 128
ret_code if_conf_file_add(char *if_name);
ret_code if_conf_file_del(char *if_name);
ret_code if_conf_file_set(char *if_name, char *conf_name, char *conf_buff);
ret_code if_conf_file_get(char *if_name, char *conf_name, char *conf_buff);
void ip_conf_file_set(char *if_name, char *conf_name, char *conf_buff); void ip_conf_file_set(char *if_name, char *conf_name, char *conf_buff);
void ip_conf_file_del(char *if_name, char *conf_buff); void ip_conf_file_del(char *if_name, char *conf_buff);
ret_code del_sub_string(char *str_in,char *str_sub);
#endif #endif

View File

@ -11,6 +11,7 @@
#include "parsefile.h" #include "parsefile.h"
#include "libbridge.h" #include "libbridge.h"
#include "brnetlink.h" #include "brnetlink.h"
#include "parsefile.h"
#include "list.h" #include "list.h"
#ifndef DESC("事件通知函数") #ifndef DESC("事件通知函数")
@ -184,7 +185,54 @@ ret_code br_if_bridge_check(char *port_list, int cnt, uint config_type)
return RET_OK; return RET_OK;
} }
ret_code br_if_bridge_add(char * br_name, char *port_list, int cnt, int *sys_err) ret_code br_save_file(BR_EVENT_TYPE event_type,
char *br_name, char *port_name)
{
char *key_str = "bridge_ports";
char config_str[IF_BUFF_LEN] = {0};
ret_code ret;
switch(event_type)
{
case BR_CREATE_EVENT:
if_conf_file_add(br_name);
break;
case BR_DELETE_EVENT:
if_conf_file_del(br_name)
break;
case BR_IF_JOIN_EVENT:
if(if_conf_file_get(br_name, key_str, config_str) == RET_OK)
{
if(strstr(config_str, port_name) != NULL)
{
return RET_OK;
}
strcat(config_str, " ");
strcat(config_str, port_name);
}
if_conf_file_set(br_name, key_str, config_str);
break;
case BR_IF_LEAVE_EVENT:
if(if_conf_file_get(br_name, key_str, config_str) == RET_OK)
{
if(strstr(config_str, port_name) != NULL)
{
del_sub_string(config_str, port_name);
rpc_log_info("BR_IF_LEAVE_EVENT: %s\n", config_str);
if_conf_file_set(br_name, key_str, config_str);
return RET_OK;
}
}
break;
default:
break;
}
return RET_OK;
}
ret_code br_if_bridge_add(char *br_name, char *port_list, int cnt, int *sys_err)
{ {
ret_code ret = RET_OK; ret_code ret = RET_OK;
char *port_name; char *port_name;
@ -193,6 +241,7 @@ ret_code br_if_bridge_add(char * br_name, char *port_list, int cnt, int *sys_err
for(i = 0; i < cnt) for(i = 0; i < cnt)
{ {
br_invoke_event(BR_IF_JOIN_EVENT_PRE, event_arg);
port_name = port_list + INTERFACE_NAMSIZ * i; port_name = port_list + INTERFACE_NAMSIZ * i;
err = br_add_interface(br_name, port_name); err = br_add_interface(br_name, port_name);
if(err != 0) if(err != 0)
@ -204,6 +253,8 @@ ret_code br_if_bridge_add(char * br_name, char *port_list, int cnt, int *sys_err
br_event_t event_arg = {br_name, port_name}; br_event_t event_arg = {br_name, port_name};
br_invoke_event(BR_IF_JOIN_EVENT, event_arg); br_invoke_event(BR_IF_JOIN_EVENT, event_arg);
br_save_file(BR_IF_JOIN_EVENT, br_name, port_name);
} }
return ret; return ret;
@ -218,6 +269,7 @@ ret_code br_if_bridge_del(char * br_name, char *port_list, int cnt, int *sys_err
for(i = 0; i < cnt) for(i = 0; i < cnt)
{ {
br_invoke_event(BR_IF_LEAVE_EVENT_PRE, event_arg);
port_name = port_list + INTERFACE_NAMSIZ * i; port_name = port_list + INTERFACE_NAMSIZ * i;
err = br_del_interface(br_name, port_name); err = br_del_interface(br_name, port_name);
if(err != 0) if(err != 0)
@ -229,6 +281,8 @@ ret_code br_if_bridge_del(char * br_name, char *port_list, int cnt, int *sys_err
br_event_t event_arg = {br_name, port_name}; br_event_t event_arg = {br_name, port_name};
br_invoke_event(BR_IF_LEAVE_EVENT, event_arg); br_invoke_event(BR_IF_LEAVE_EVENT, event_arg);
br_save_file(BR_IF_LEAVE_EVENT, br_name, port_name);
} }
return ret; return ret;
@ -244,11 +298,13 @@ int br_if_bridge_num(char *br_name)
return cnt; return cnt;
} }
ret_code br_bridge_add(char * br_name, int *sys_err) ret_code br_bridge_add(char *br_name, int *sys_err)
{ {
br_event_t event_arg = {br_name, NULL}; br_event_t event_arg = {br_name, NULL};
int sys_ret = 0; int sys_ret = 0;
br_invoke_event(BR_CREATE_EVENT_PRE, event_arg);
sys_ret = br_add_bridge(br_name); sys_ret = br_add_bridge(br_name);
*sys_err = sys_ret; *sys_err = sys_ret;
@ -259,6 +315,8 @@ ret_code br_bridge_add(char * br_name, int *sys_err)
br_invoke_event(BR_CREATE_EVENT, event_arg); br_invoke_event(BR_CREATE_EVENT, event_arg);
br_save_file(BR_CREATE_EVENT, br_name, NULL);
return RET_OK; return RET_OK;
} }
@ -267,6 +325,8 @@ ret_code br_bridge_del(char * br_name, int *sys_err)
br_event_t event_arg = {br_name, NULL}; br_event_t event_arg = {br_name, NULL};
int sys_ret = 0; int sys_ret = 0;
br_invoke_event(BR_DELETE_EVENT_PRE, event_arg);
sys_ret = br_del_bridge(br_name); sys_ret = br_del_bridge(br_name);
*sys_err = sys_ret; *sys_err = sys_ret;
@ -277,8 +337,9 @@ ret_code br_bridge_del(char * br_name, int *sys_err)
br_invoke_event(BR_DELETE_EVENT, event_arg); br_invoke_event(BR_DELETE_EVENT, event_arg);
return RET_OK; br_save_file(BR_DELETE_EVENT, br_name, NULL);
return RET_OK;
} }
#endif #endif

View File

@ -151,6 +151,116 @@ int conf_value_in_block_exist(char *conf_path, char *conf_buff)
return RET_NOTFOUND; return RET_NOTFOUND;
} }
/* 设置指定配置块中的配置 */
int conf_value_in_block_set_ex(char *conf_path,
char *start_str, char *end_str,
char *conf_name, char *conf_buff)
{
char config_linebuf[IF_BUFF_LEN];
int configbuf_lenth = strlen(conf_buff) + 5;
long config_lenth = 0;
boolean next_flag = FALSE;
char *start_line = NULL;
char *config_line = NULL;
FILE *f;
f = fopen(conf_path,"r+");
if(f == NULL)
{
rpc_log_error("OPEN CONFIG %s FALID\n", conf_path);
return RET_ERR;
}
fseek(f, 0, SEEK_END);
config_lenth = ftell(f);
char sum_buf[config_lenth + configbuf_lenth];
memset(sum_buf, 0, sizeof(sum_buf));
fseek(f, 0, SEEK_SET);
memset(config_linebuf, 0, sizeof(config_linebuf));
while(fgets(config_linebuf, IF_BUFF_LEN, f) != NULL)
{
/* 该做的事情已经做完 */
if(next_flag == TRUE)
{
strcat(sum_buf, config_linebuf);
goto next_while;
}
/* 判断是否是空行 */
if(strlen(config_linebuf) < 3)
{
strcat(sum_buf, config_linebuf);
goto next_while;
}
/* 没有找到配置块,则继续循环 */
if(start_line == NULL)
{
start_line = strstr(config_linebuf, start_str);
strcat(sum_buf, config_linebuf);
goto next_while;
}
/* 配置块结束 */
if(strstr(config_linebuf, end_str))
{
if(config_line == NULL)
{
strcat(sum_buf, conf_buff);
}
strcat(sum_buf, config_linebuf);
next_flag = TRUE;
goto next_while;
}
if(config_line == NULL)
{
config_line = strstr(config_linebuf, conf_name);
/* 找到配置行 */
if(config_line)
{
next_flag = TRUE;
strcat(sum_buf, conf_buff);
goto next_while;
}
}
strcat(sum_buf, config_linebuf);
next_while:
if(fgetc(f)==EOF)
{
break;
}
fseek(f,-1,SEEK_CUR);
memset(config_linebuf, 0, sizeof(config_linebuf));
}
fclose(f);
/* 整个配置块都没有,则新创建该配置块 */
if( next_flag == FALSE )
{
return RET_NOTFOUND;
}
remove(conf_path);
rpc_log_dbg("---sum_buf---->%s<----------\n",sum_buf);
return conf_file_write(conf_path, sum_buf);
}
/* 设置指定配置块中的配置 */ /* 设置指定配置块中的配置 */
int conf_value_in_block_set(char *conf_path, int conf_value_in_block_set(char *conf_path,
@ -530,51 +640,45 @@ int conf_value_block_del(char *conf_path, char *start_str, char *end_str)
} }
/* 增加接口配置块 */ /* 增加接口配置块 */
void if_conf_file_add(char *if_name) ret_code if_conf_file_add(char *if_name)
{ {
char auto_str[IF_BUFF_LEN] = {0}; char auto_str[IF_BUFF_LEN] = {0};
sprintf(auto_str, "auto %s", if_name); sprintf(auto_str, "auto %s", if_name);
conf_value_block_add(IFCONFIG_PATH, auto_str); return conf_value_block_add(IFCONFIG_PATH, auto_str);
return;
} }
/* 删除整个接口配置块 */ /* 删除整个接口配置块 */
void if_conf_file_del(char *if_name) ret_code if_conf_file_del(char *if_name)
{ {
char auto_str[IF_BUFF_LEN] = {0}; char auto_str[IF_BUFF_LEN] = {0};
sprintf(auto_str, "auto %s", if_name); sprintf(auto_str, "auto %s", if_name);
conf_value_block_del(IFCONFIG_PATH, auto_str, "auto"); return conf_value_block_del(IFCONFIG_PATH, auto_str, "auto");
return;
} }
/* 设置接口中的配置 */ /* 设置接口中的配置 */
void if_conf_file_set(char *if_name, char *conf_name, char *conf_buff) ret_code if_conf_file_set(char *if_name, char *conf_name, char *conf_buff)
{ {
char auto_str[IF_BUFF_LEN] = {0}; char auto_str[IF_BUFF_LEN] = {0};
sprintf(auto_str, "auto %s", if_name); sprintf(auto_str, "auto %s", if_name);
conf_value_in_block_set(IFCONFIG_PATH, auto_str, "auto", conf_name, conf_buff); return conf_value_in_block_set_ex(IFCONFIG_PATH, auto_str,
"auto", conf_name, conf_buff);
return;
} }
/* 获取接口中的配置 */ /* 获取接口中的配置 */
void if_conf_file_get(char *if_name, char *conf_name, char *conf_buff) ret_code if_conf_file_get(char *if_name, char *conf_name, char *conf_buff)
{ {
char auto_str[IF_BUFF_LEN] = {0}; char auto_str[IF_BUFF_LEN] = {0};
sprintf(auto_str, "auto %s", if_name); sprintf(auto_str, "auto %s", if_name);
conf_value_in_block_get(IFCONFIG_PATH, auto_str, "auto", conf_name, conf_buff); return conf_value_in_block_get(IFCONFIG_PATH, auto_str,
"auto", conf_name, conf_buff);
return;
} }
ret_code if_conf_file_exist(char *if_name, char *conf_buff) ret_code if_conf_file_exist(char *if_name, char *conf_buff)
@ -610,7 +714,6 @@ void ip_conf_file_set(char *if_name, char *conf_name, char *conf_buff)
return; return;
} }
/* /*
* *
* *
@ -628,3 +731,25 @@ void ip_conf_file_del(char *if_name, char *conf_buff)
return; return;
} }
ret_code del_sub_string(char *str_in,char *str_sub)
{
char* str_out = (char *)malloc(strlen(str_in) + 1);
char* p;
if(str_out == NULL)
{
return RET_NULLP;
}
while((p = strstr(str_in, str_sub)) != NULL)
{
*p = '\0';
strcpy(str_out, p + strlen(str_sub));
strcat(str_in, str_out);
}
return RET_OK;
}