secgateway/Platform/user/configm/config-server/vlan_config/vlan_config.c

2380 lines
67 KiB
C
Raw Normal View History

#include "vlan_config.h"
extern boolean br_is_exist(char *br_name);
/* <20><><EFBFBD><EFBFBD>ȫ<EFBFBD>ֽӿ<D6BD>vlan<61><6E>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD> */
interface_vlan_info g_if_vlan_info[MAX_INTERFACES] = {0};
/* <20><><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB>error data<74><61>Ϣ */
char g_err_data[ERR_DATA_LEN] = {0};
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>vlan bitmapijλ
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
void vlan_bitmap_set(int *v, int i)
{
if(!v || i < 0){
printf("[vlan]vlan_bitmap_set: input error.\n");
return;
}
v[i >> SHIFT] |= (1 << (i & MASK));
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>vlan bitmapijλ
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
void vlan_bitmap_clear(int *v, int i)
{
if(!v || i < 0){
printf("[vlan]vlan_bitmap_clear: input error.\n");
return;
}
v[i >> SHIFT] &= ~(1 << (i & MASK));
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD>ѯvlan bitmapijλ<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
int vlan_bitmap_check(int *v, int i)
{
if(!v || i < 0){
printf("[vlan]vlan_bitmap_check: input error.\n");
return -1;
}
return v[i >> SHIFT] & (1 << (i & MASK));
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>if_name<EFBFBD><EFBFBD><EFBFBD><EFBFBD>attr<EFBFBD><EFBFBD>g_if_vlan_info[]<EFBFBD>б<EFBFBD><EFBFBD><EFBFBD>
* if_name<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>attr
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
interface_link_attr get_attr_from_ifname(char *if_name)
{
if(!if_name){
return LINK_TYPE_UNKNOWN;
}
int ifnode;
ifnode = get_ifnode_from_global(if_name);
if(ifnode == -1){
printf("[vlan]get_attr_from_ifname: ifnode is -1.\n");
return LINK_TYPE_UNKNOWN;
}
return g_if_vlan_info[ifnode].attr;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƺ<EFBFBD>vid<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽӿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:if_name<EFBFBD><EFBFBD>vid
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:subif
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
int if_vlan2subif(char *if_name, int vid, char *subif)
{
if(!if_name || !subif){
printf("[vlan]if_vlan2subif: input error.\n");
return -1;
}
sprintf(subif, "%s.%d", if_name, vid);
return 0;
}
int br_if_num_stub(char *br_name, operation_type op_type)
{
int ret = 0;
if(op_type == OP_ADD){
ret = 0;
}
else if(op_type == OP_MOD){
ret = 1;
}
else if(op_type == OP_DEL){
ret = 0;
}
return ret;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>br<EFBFBD>ϵĽӿ<EFBFBD><EFBFBD><EFBFBD>Ŀ
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
int br_if_num(char *br_name)
{
return br_if_num_stub(br_name, OP_ADD);
}
int create_br_stub(char *br_vlname)
{
char buf[SYSCALL_BUF_LEN] = {0};
sprintf(buf, "brctl addbr %s", br_vlname);
system(buf);
return 0;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>br
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
int create_br(char *br_vlname)
{
return create_br_stub(br_vlname);
}
int br_addif_stub(char *br_name, char *if_name)
{
char buf[SYSCALL_BUF_LEN] = {0};
sprintf(buf, "brctl addif %s %s", br_name, if_name);
system(buf);
return 0;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD>ӿڼ<EFBFBD><EFBFBD><EFBFBD>br
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
int br_addif(char *br_name, char *if_name)
{
return br_addif_stub(br_name, if_name);
}
int interface_br_stub(char *if_name, char *br_name)
{
return 0;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD>ж<EFBFBD>ij<EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD>br<EFBFBD>ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD>br<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:br_name
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
int interface_br(char *if_name, char *br_name)
{
/* <20>ȴ<EFBFBD>׮<EFBFBD><D7AE><EFBFBD><EFBFBD> */
return interface_br_stub(if_name, br_name);
}
int del_br_stub(char *br_name)
{
char buf[SYSCALL_BUF_LEN] = {0};
sprintf(buf, "brctl delbr %s", br_name);
system(buf);
return 0;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:ɾ<EFBFBD><EFBFBD>br
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
int del_br(char *br_name)
{
return del_br_stub(br_name);
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD>жϽӿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ں<EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>:·<EFBFBD><EFBFBD><EFBFBD>Ž<EFBFBD> or <EFBFBD>Ž<EFBFBD>
* Ŀǰֻ֧<EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD>Ž<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
interface_model which_interface_model(char *if_name)
{
return INTERFACE_MODEL_ROUTE_FORWARD;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>init<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>÷<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>init<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><EFBFBD><EFBFBD><EFBFBD>׶ε<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٵ<EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code vlan_config_init(void)
{
ret_code ret = RET_OK;
//int sys_ret = 0;
(void)system("modprobe 8021q");
ret = br_event_register(BR_IF_LEAVE_EVENT_PRE, del_interface_vlan_cb);
if(ret != RET_OK){
printf("[vlan]vlan_config_init: event register failed(%d).\n", ret);
return ret;
}
#if 0
/* <20><><EFBFBD><EFBFBD>br0 */
ret = br_bridge_add("br0", &sys_ret);
if(ret != RET_OK){
printf("[vlan]vlan_config_init: br0_bridge_add failed(%d)\n", sys_ret);
return;
}
/* <20><><EFBFBD>ӽӿ<D3BD><D3BF><EFBFBD><EFBFBD>ӽ<EFBFBD>br0 */
br_if_bridge_add("br0", "ens38", 1, &sys_ret);
if(sys_ret != 0){
printf("[vlan]vlan_config_init: br0_if_bridge_add failed(%d)(%s)\n", sys_ret, strerror(sys_ret));
return;
}
/* <20><><EFBFBD><EFBFBD>br1 */
ret = br_bridge_add("br1", &sys_ret);
if(ret != RET_OK){
printf("[vlan]vlan_config_init: br1_bridge_add failed(%d)\n", sys_ret);
return;
}
/* <20><><EFBFBD>ӽӿ<D3BD><D3BF><EFBFBD><EFBFBD>ӽ<EFBFBD>br1 */
br_if_bridge_add("br1", "ens39", 1, &sys_ret);
if(sys_ret != 0){
printf("[vlan]vlan_config_init: br1_if_bridge_add failed(%d)(%s)\n", sys_ret, strerror(sys_ret));
return;
}
#endif
return ret;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ž<EFBFBD>ģʽ<EFBFBD><EFBFBD>access vlan
* Ŀǰֻ֧<EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD>Ž<EFBFBD>,<EFBFBD><EFBFBD>Žӵ<EFBFBD><EFBFBD>ݲ<EFBFBD>ʵ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
int add_bridge_vlan_access(char *if_name, int vid)
{
//ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>("bridge vlan add vid %d dev %s pvid untagged", vid, if_name);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>iproute2<65>ӿڣ<D3BF><DAA3><EFBFBD><EFBFBD><EFBFBD>bridge vlan
return 0;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:У<EFBFBD>֮ǰ<EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӹ<EFBFBD><EFBFBD>ýӿ<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: 0:δ<EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD>
* 1:<EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD>
************************************************************/
int check_config(char *if_name)
{
int i;
for(i = 0; i < MAX_INTERFACES; i++){
if(!strcmp(g_if_vlan_info[i].if_name, if_name)){
printf("[vlan]check_config:already exists, return 1\n");
return 1;
}
}
return 0;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>access vlan
* Ŀǰֻ֧<EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD>Ž<EFBFBD>,<EFBFBD><EFBFBD>Žӵ<EFBFBD><EFBFBD>ݲ<EFBFBD>ʵ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
int add_interface_vlan_access(char *if_name, int *vlan_bitmap, interface_model if_model)
{
int i;
/* <20><><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD>ں<EFBFBD><DABA><EFBFBD>ģ<EFBFBD><C4A3> */
if(INTERFACE_MODEL_FORWARD != if_model){
printf("access<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ž<EFBFBD>ģ<EFBFBD><EFBFBD>,<2C><><EFBFBD>򱨴<EFBFBD>\n");
return -1;
}
for(i = VID_MIN; i <= VID_MAX; i++){
if(vlan_bitmap_check(vlan_bitmap, i)){
return add_bridge_vlan_access(if_name, i);
}
}
return -1;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>trunk vlan
* Ŀǰֻ֧<EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD>Ž<EFBFBD>,<EFBFBD><EFBFBD>Žӵ<EFBFBD><EFBFBD>ݲ<EFBFBD>ʵ<EFBFBD><EFBFBD>
* vids[i]<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ1<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>vlan<EFBFBD><EFBFBD>vidΪi
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
int add_bridge_vlan_trunk(char *if_name, int *vlan_bitmap)
{
int i;
char buf[SYSCALL_BUF_LEN] = {0};
if(!if_name || !vlan_bitmap){
return -1;
}
for(i = VID_MIN; i <= VID_MAX; i++){
if(vlan_bitmap_check(vlan_bitmap, i)){
sprintf(buf,"bridge vlan add vid %d dev %s", i, if_name);//after change to snprintf
system(buf);//after change to execv
return 0;
}
}
return -1;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>vlan<EFBFBD>ӽӿ<EFBFBD>
* vids[i]<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ1<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>vlan<EFBFBD><EFBFBD>vidΪi
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>vid<EFBFBD><EFBFBD>2<EFBFBD><EFBFBD>ʼ
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code add_vlan_sub_interface(char *if_name, int *vlan_bitmap)
{
if(!if_name || !vlan_bitmap){
printf("[vlan]add_vlan_sub_interface: input is null.\n");
return RET_NULLP;
}
printf("[vlan]add_vlan_sub_interface: begin.\n");
int vid;
char subif[IF_NAME_LEN] = {0};
char buf[SYSCALL_BUF_LEN] = {0};
char br_vlname[BR_VLAN_NAME_LEN] = {0};
char tmp_brname[BR_VLAN_NAME_LEN] = {0};
int sys_ret = 0, status = 0;
ret_code ret = RET_OK;
for(vid = VID_MIN; vid <= VID_MAX; vid++){
if(vlan_bitmap_check(vlan_bitmap, vid)){
/* vconfig<69><67><EFBFBD><EFBFBD><EFBFBD>ӽӿ<D3BD> */
sprintf(buf, "vconfig add %s %d", if_name, vid);
printf("[vlan]add_vlan_sub_interface: vconfig buf=%s\n", buf);
status = system(buf);
if(status != 0){
printf("[vlan]add_vlan_sub_if: subif status error. (%s)\n", strerror(errno));
return RET_SYS_VCONFIG_ERR;
}
memset(buf, 0, SYSCALL_BUF_LEN);
/* <20><><EFBFBD><EFBFBD><EFBFBD>ӽӿ<D3BD> */
(void)if_vlan2subif(if_name, vid, subif);
sprintf(buf, "ifconfig %s up", subif);
printf("[vlan]add_vlan_sub_interface: ifconfig sub buf=%s\n", buf);
status = system(buf);
if(status != 0){
printf("[vlan]add_vlan_sub_if: ifconfig subif status error. (%s)\n", strerror(errno));
return RET_SYS_IFCONFIG_ERR;
}
memset(buf, 0, SYSCALL_BUF_LEN);
/* WAN<41>ڲ<EFBFBD><DAB2><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD> */
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><D8B2><EFBFBD>RET_OK,<2C><>˵<EFBFBD><CBB5><EFBFBD><EFBFBD>WAN<41><4E>,<2C><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD>vlan<61><6E>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ѭ<EFBFBD><D1AD> */
if(RET_OK != br_if_bridge_get(if_name, tmp_brname)){
printf("[vlan]add_vlan_sub_interface: port is WAN, don't creat br-vl and addif, continue\n");
memset(subif, 0, IF_NAME_LEN);
memset(tmp_brname, 0, BR_VLAN_NAME_LEN);
continue;
}
/* <20><><EFBFBD><EFBFBD>br-vl<76><6C> */
sprintf(br_vlname, "br-vl%d", vid);
printf("[vlan]add_vlan_sub_interface: br_vlname=%s\n", br_vlname);
/* <20><>ѯ<EFBFBD><D1AF><EFBFBD>ɵ<EFBFBD>br-vl<76>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򴴽<EFBFBD>br-vl */
if(br_is_exist(br_vlname) == FALSE){
ret = br_bridge_add(br_vlname);
if(ret != RET_OK){
printf("[vlan]add_vlan_sub_interface: br_bridge_add failed(%s)\n", strerror(errno));
return ret;
}
}
/* <20><><EFBFBD>ӽӿ<D3BD><D3BF><EFBFBD><EFBFBD>ӽ<EFBFBD>br */
br_if_bridge_add(br_vlname, subif, 1);
if(ret != RET_OK){
printf("[vlan]add_vlan_sub_interface: br_if_bridge_add failed(%s)\n", strerror(errno));
return ret;
}
memset(subif, 0, IF_NAME_LEN);
memset(br_vlname, 0, BR_VLAN_NAME_LEN);
}
}
return RET_OK;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>vlan trunk
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code add_interface_vlan_trunk(char *if_name, int *vlan_bitmap, interface_model if_model)
{
ret_code ret = RET_OK;
/* <20>Ž<EFBFBD> */
if(INTERFACE_MODEL_FORWARD == if_model){
ret = add_bridge_vlan_trunk(if_name, vlan_bitmap);
}
/* ·<><C2B7><EFBFBD>Ž<EFBFBD>,<2C><EFBFBD><E8B4B4><EFBFBD>ӽӿں<D3BF>br-vlan */
else if(INTERFACE_MODEL_ROUTE_FORWARD == if_model){
ret = add_vlan_sub_interface(if_name, vlan_bitmap);
}
return ret;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD>ӽӿ<EFBFBD>vlan
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code add_interface_vlan(interface_vlan_info *if_vlan_info)
{
interface_link_attr new_attr = if_vlan_info->attr;
ret_code ret = RET_OK;
/* <20><><EFBFBD><EFBFBD>У<EFBFBD><D0A3> */
//ret = check_config(if_vlan_info->if_name);
//if(0 != ret){
//return -1;
//}
/* <20>ӿ<EFBFBD>ģ<EFBFBD>͸<EFBFBD>ֵ */
if_vlan_info->if_model = which_interface_model(if_vlan_info->if_name);
/* <20>ж<EFBFBD><D0B6><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD> */
if(new_attr == LINK_TYPE_TRUNK){
ret = add_interface_vlan_trunk(if_vlan_info->if_name, if_vlan_info->vlan_bitmap, if_vlan_info->if_model);
if(ret != RET_OK){
printf("[vlan]add_interface_vlan: add trunk failed.\n");
return ret;
}
}
else if(new_attr == LINK_TYPE_ACCESS){
ret = add_interface_vlan_access(if_vlan_info->if_name, if_vlan_info->vlan_bitmap, if_vlan_info->if_model);
if(ret != RET_OK){
printf("[vlan]add_interface_vlan: add access failed.\n");
return ret;
}
}
else{
printf("[vlan]add_interface_vlan: LINK-TYPE attr(%d) input error.\n", new_attr);
return RET_ATTR_INVALID;
}
/* <20><><EFBFBD><EFBFBD>ȫ<EFBFBD>ֽӿ<D6BD>vlan<61><6E><EFBFBD>ݽṹ */
ret = refresh_if_vlan_info(if_vlan_info);
return ret;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:ɾ<EFBFBD><EFBFBD>bridge vlan
* Ŀǰ<EFBFBD>ò<EFBFBD><EFBFBD><EFBFBD>,Ŀǰ<EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD><EFBFBD>Ž<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
int del_bridge_vlan_access(char *if_name)
{
int vid;
char buf[SYSCALL_BUF_LEN] = {0};
int ifnode;
ifnode = get_ifnode_from_global(if_name);
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>i<EFBFBD><69><EFBFBD>ٱ<EFBFBD><D9B1><EFBFBD>VLAN<41><4E><EFBFBD>ҵ<EFBFBD><D2B5>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD>е<EFBFBD>vlan j,j<>ж<EFBFBD><D0B6><EFBFBD>
<EFBFBD>ҵ<EFBFBD>һ<EFBFBD><EFBFBD>j,ƴ<EFBFBD>ӳ<EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ӽӿ<EFBFBD>,ɾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽӿ<EFBFBD>*/
for(vid = VID_MIN; vid <= VID_MAX; vid++){
if(vlan_bitmap_check(g_if_vlan_info[ifnode].vlan_bitmap, vid)){
sprintf(buf, "bridge vlan del vid %d dev %s pvid untagged", vid, if_name);
system(buf);
memset(buf, 0, SYSCALL_BUF_LEN);
sprintf(buf, "bridge vlan add vid %d dev %s pvid untagged", 1, if_name);
system(buf);
memset(buf, 0, SYSCALL_BUF_LEN);
}
}
return 0;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:ɾ<EFBFBD><EFBFBD>access vlan
* Ŀǰ<EFBFBD>ò<EFBFBD><EFBFBD><EFBFBD>,Ŀǰ<EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD><EFBFBD>Ž<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
int del_interface_vlan_access(char *if_name, interface_model if_model)
{
int ret;
/* <20><><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD>ں<EFBFBD><DABA><EFBFBD>ģ<EFBFBD><C4A3> */
if(INTERFACE_MODEL_FORWARD != if_model){
printf("access<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ž<EFBFBD>ģ<EFBFBD><EFBFBD>,<2C><><EFBFBD>򱨴<EFBFBD>\n");
return -1;
}
ret = del_bridge_vlan_access(if_name);
return ret;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:ɾ<EFBFBD><EFBFBD>trunk vlan
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
int del_bridge_vlan_trunk(char *if_name)
{
int ifnode, vid;
char buf[SYSCALL_BUF_LEN] = {0};
/* <20><><EFBFBD><EFBFBD>ifname<6D><65><EFBFBD><EFBFBD>ȫ<EFBFBD>ֽṹ<D6BD><E1B9B9><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8>ڵ<EFBFBD>i<EFBFBD><69>,iֻ<69><D6BB>һ<EFBFBD><D2BB> */
for(ifnode = 0; ifnode < MAX_INTERFACES; ifnode++){
if(!strcmp(g_if_vlan_info[ifnode].if_name, if_name)){
break;
}
}
/* û<>ҵ<EFBFBD> */
if(ifnode >= MAX_INTERFACES){
return -1;
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>i<EFBFBD><69><EFBFBD>ٱ<EFBFBD><D9B1><EFBFBD>VLAN<41><4E><EFBFBD>ҵ<EFBFBD><D2B5>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD>е<EFBFBD>vlan j,j<>ж<EFBFBD><D0B6><EFBFBD> */
for(vid = 1; vid < MAX_VLAN; vid++){
//if(g_if_vlan_info[i].vid[j]){
if(vlan_bitmap_check(g_if_vlan_info[ifnode].vlan_bitmap, vid)){
sprintf(buf, "bridge vlan del vid %d dev %s", vid, if_name);
system(buf);
memset(buf, 0, SYSCALL_BUF_LEN);
}
}
/* <20>ָ<EFBFBD>vlan 1 pvid untagged */
sprintf(buf, "bridge vlan add vid %d dev %s pvid untagged", 1, if_name);
system(buf);
return 0;
}
interface_network_type lan_or_wan_stub(char *if_name)
{
return IF_TYPE_LAN;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>LAN<EFBFBD><EFBFBD><EFBFBD><EFBFBD>WAN
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
interface_network_type lan_or_wan(char *if_name)
{
return lan_or_wan_stub(if_name);
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:ɾ<EFBFBD><EFBFBD>vlan<EFBFBD>ӽӿ<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,ǰ<EFBFBD><EFBFBD>chkУ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code del_vlan_sub_interface(char *if_name, int *vlan_bitmap)
{
int ifnode, vid;
char br_vlname[BR_VLAN_NAME_LEN] = {0};
char tmp_brname[BR_VLAN_NAME_LEN] = {0};
char subif[IF_NAME_LEN]= {0};
char buf[SYSCALL_BUF_LEN] = {0};
int sys_ret = 0, status = 0, num = 0;
ret_code ret = RET_OK;
if(!if_name || !vlan_bitmap){
return -1;
}
printf("[vlan]del_vlan_sub_interface: begin.\n");
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>i<EFBFBD><69><EFBFBD>ٱ<EFBFBD><D9B1><EFBFBD>VLAN<41><4E><EFBFBD>ҵ<EFBFBD><D2B5>ýڵ<C3BD><DAB5><EFBFBD><EFBFBD>е<EFBFBD>vlan j,j<>ж<EFBFBD><D0B6><EFBFBD>
<EFBFBD>ҵ<EFBFBD>һ<EFBFBD><EFBFBD>j,ƴ<EFBFBD>ӳ<EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ӽӿ<EFBFBD>,ɾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӽӿ<EFBFBD>*/
for(vid = VID_MIN; vid <= VID_MAX; vid++){
if(vlan_bitmap_check(vlan_bitmap, vid)){//<2F><><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>,<2C>·<EFBFBD><C2B7>ĸ<EFBFBD>vid,<2C><>ɾ<EFBFBD><C9BE><EFBFBD>ĸ<EFBFBD>
/* <20><><EFBFBD><EFBFBD><EFBFBD>ӽӿ<D3BD> */
(void)if_vlan2subif(if_name, vid, subif);
/* <20><>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
ret = br_if_bridge_get(if_name, tmp_brname);
/* û<>ҵ<EFBFBD><D2B5><EFBFBD>,<2C><>WAN,ֻɾ<D6BB><C9BE>VLAN<41>ӽӿ<D3BD> */
if(RET_NOTFOUND == ret){
printf("[vlan]del_vlan_sub_interface: %s is WAN,only del vlansubif\n", if_name);
/* ɾ<><C9BE>vlan<61>ӽӿ<D3BD> */
sprintf(buf, "vconfig rem %s", subif);
printf("[vlan]del_vlan_sub_interface: buf=%s\n", buf);
status = system(buf);
if(status != 0){
printf("[vlan]del_vlan_sub_if:status error. (%s)\n", strerror(errno));
return RET_SYS_VCONFIG_ERR;
}
memset(buf, 0, SYSCALL_BUF_LEN);
memset(tmp_brname, 0, BR_VLAN_NAME_LEN);
memset(subif, 0, IF_NAME_LEN);
}
/* <20>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD>,<2C><>LAN */
else if(RET_OK == ret){
sprintf(br_vlname, "br-vl%d", vid);
printf("[vlan]del_vlan_sub_interface: br_vlname=%s\n", br_vlname);
/* <20><><EFBFBD><EFBFBD>br-vlxx<78><78><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
if(br_is_exist(br_vlname) == FALSE){
printf("[vlan]del_vlan_sub_interface: %s is not exist, error,return.\n", br_vlname);
return RET_UNKNOWN;
}
/* brctl delifɾ<66><C9BE>br-vl<76>ϵ<EFBFBD>vlan<61>ӽӿ<D3BD> */
printf("[vlan]del_vlan_sub_interface: br-vl%d delif %s\n", vid, subif);
ret = br_if_bridge_del(br_vlname, subif, 1);
if(ret != RET_OK){
printf("[vlan]del_vlan_sub_interface: br_if_bridge_del error(%s).\n", strerror(errno));
return ret;
}
/* ɾ<><C9BE>vlan<61>ӽӿ<D3BD> */
sprintf(buf, "vconfig rem %s", subif);
printf("[vlan]del_vlan_sub_interface: buf=%s\n", buf);
status = system(buf);
if(status != 0){
printf("[vlan]del_vlan_sub_if:status error. (%s)\n",strerror(errno));
return RET_SYS_VCONFIG_ERR;
}
memset(buf, 0, SYSCALL_BUF_LEN);
/* br-vlan<61>ϵĽӿ<C4BD><D3BF><EFBFBD>Ϊ0,<2C><>ɾ<EFBFBD><C9BE>br-vlan */
num = br_if_bridge_num(br_vlname);
printf("[vlan]del_vlan_sub_interface: num=%d\n", num);
if(num == 0){
printf("[vlan]del_vlan_sub_interface: br's port is zero.\n");
ret = br_bridge_del(br_vlname);
if(ret != RET_OK){
printf("[vlan]del_vlan_sub_interface: del br failed(%s).\n", strerror(errno));
return ret;
}
}
memset(br_vlname, 0, BR_VLAN_NAME_LEN);
memset(subif, 0, IF_NAME_LEN);
memset(buf, 0, SYSCALL_BUF_LEN);
}
}
}
return RET_OK;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:ɾ<EFBFBD><EFBFBD>vlan trunk
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code del_interface_vlan_trunk(char *if_name, int *vlan_bitmap, interface_model if_model)
{
ret_code ret = RET_OK;
/* <20>Ž<EFBFBD> */
if(INTERFACE_MODEL_FORWARD == if_model){
ret = del_bridge_vlan_trunk(if_name);
}
/* ·<><C2B7><EFBFBD>Ž<EFBFBD>,<2C><EFBFBD><E8B4B4><EFBFBD>ӽӿں<D3BF>br-vlan */
else if(INTERFACE_MODEL_ROUTE_FORWARD == if_model){
ret = del_vlan_sub_interface(if_name, vlan_bitmap);
}
return ret;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD>ȫ<EFBFBD><EFBFBD>if_vlan<EFBFBD><EFBFBD>в<EFBFBD><EFBFBD><EFBFBD>֮ǰ<EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD><EFBFBD>Ľڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD>սڵ<EFBFBD>,<EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,һ<EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD>õĽӿڣ<EFBFBD><EFBFBD><EFBFBD>֮ǰ<EFBFBD>Ѿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD>,ƥ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴνڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>¾<EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮ǰû<EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD>,<EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD>½ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: -1:û<EFBFBD>п<EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ifnode:<EFBFBD><EFBFBD>ifnode<EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>
************************************************************/
int find_insert_ifnode_from_global(char *if_name)
{
int ifnode;
if(!if_name){
return -1;
}
/* <20>ҵ<EFBFBD>֮ǰ<D6AE>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>ù<EFBFBD><C3B9>Ľڵ<C4BD>λ<EFBFBD><CEBB> */
for(ifnode = 0; ifnode < MAX_INTERFACES; ifnode++){
if(!strcmp(g_if_vlan_info[ifnode].if_name, if_name)){
printf("[vlan]find_empty_ifnode_from_global: find exist gnode[%d].%s\n", ifnode, if_name);
return ifnode;
}
}
/* <20>ҵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>յ<EFBFBD>,<2C><><EFBFBD><EFBFBD> */
for(ifnode = 0; ifnode < MAX_INTERFACES; ifnode++){
if(!strcmp(g_if_vlan_info[ifnode].if_name, "")){
printf("[vlan]find_empty_ifnode_from_global: find empty gnode[%d]\n", ifnode);
return ifnode;
}
}
/* ˵<><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><>пյĿɲ<C4BF><C9B2><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>Ľڵ<C4BD><DAB5><EFBFBD> */
return -1;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:ADD<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD>ֽ
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code refresh_if_vlan_info_op_add(interface_vlan_info *if_vlan_info)
{
int ifnode;
int vid;
if(!if_vlan_info){
return -1;
}
ifnode = find_insert_ifnode_from_global(if_vlan_info->if_name);
/* û<>ҵ<EFBFBD><D2B5>հ׿ɲ<D7BF><C9B2><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>Ľڵ<C4BD>,add<64><64><EFBFBD><EFBFBD> */
if(-1 == ifnode){
printf("[vlan]refresh_if_vlan_info_op_add: donot find empty node.\n");
return -1;
}
printf("[vlan]refresh_if_vlan_info_op_add: find node[%d].ifname=%s\n", ifnode, if_vlan_info->if_name);
/* <20><><EFBFBD><EFBFBD>ifname, attr, op_type, if_model */
memcpy(g_if_vlan_info[ifnode].if_name, if_vlan_info->if_name, strlen(if_vlan_info->if_name));
g_if_vlan_info[ifnode].attr = if_vlan_info->attr;
g_if_vlan_info[ifnode].op_type = if_vlan_info->op_type;
g_if_vlan_info[ifnode].if_model = if_vlan_info->if_model;
printf("[vlan]refresh_op_add: node[%d]'s info::\nif_name=%s, attr=%d, op_type=%d, if_model=%d\n",
ifnode, if_vlan_info->if_name, if_vlan_info->attr,
if_vlan_info->op_type, if_vlan_info->if_model);
/* <20><><EFBFBD><EFBFBD>vlanbitmap */
printf("[vlan]refresh_op_add: vlan_info:\n<");
for(vid = VID_MIN; vid <= VID_MAX; vid++){
/* <20><><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD>vid<69><64><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>ȫ<EFBFBD>ֽṹ<D6BD><E1B9B9>vlan_bitmap<61><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD>vid bitmap */
if(vlan_bitmap_check(if_vlan_info->vlan_bitmap, vid)){
vlan_bitmap_set(g_if_vlan_info[ifnode].vlan_bitmap, vid);
g_if_vlan_info[ifnode].vidcnt++;
printf("%d, ", vid);
}
}
printf(">\n");
return 0;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:DEL<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD>ֽ
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code refresh_if_vlan_info_op_del(interface_vlan_info *if_vlan_info)
{
int ifnode;
int vid = 0;
if(!if_vlan_info){
return -1;
}
ifnode = get_ifnode_from_global(if_vlan_info->if_name);
/* <20><><EFBFBD><EFBFBD>==-1˵<31><CBB5>û<EFBFBD>ҵ<EFBFBD>,<2C>Ͳ<EFBFBD><CDB2><EFBFBD>del<65><6C> */
if(-1 == ifnode){
return -1;
}
/* û<>ҵ<EFBFBD><D2B5><EFBFBD>Ӧ<EFBFBD>Ľڵ<C4BD> */
if(ifnode >= MAX_INTERFACES){
return -1;
}
#if 0
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ifnode<64>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>Ϣ */
memset(&g_if_vlan_info[ifnode], 0, sizeof(g_if_vlan_info[ifnode]));
printf("\n\n\n\n\n[vlan]refresh_op_del: g.ifname=%s, g.attr=%d, g.op_type=%d, g.ifmodel=%d\n",
g_if_vlan_info[ifnode].if_name, g_if_vlan_info[ifnode].attr,
g_if_vlan_info[ifnode].op_type, g_if_vlan_info[ifnode].if_model);
printf("[vlan]refresh_op_del: if_vlan_info vid:\n");
for(vid = 2; vid < MAX_VLAN; vid++){
if(vlan_bitmap_check(if_vlan_info->vlan_bitmap, vid)){
printf("%d\n", vid);
}
}
printf("[vlan]refresh_op_del: g_if_vlan_info vid:\n");
for(vid = 2; vid < MAX_VLAN; vid++){
if(vlan_bitmap_check(g_if_vlan_info[ifnode].vlan_bitmap, vid)){
printf("%d\n", vid);
}
}
#endif
/* <20><>ӡ֮ǰȫ<C7B0><C8AB>g<EFBFBD><EFBFBD><E1B9B9>Ϣ */
printf("[vlan]refresh_if_vlan_info_op_del: Before Gloabl node information:::::\n");
printf("[vlan]refresh_if_vlan_info_op_del: nodeid=%d, if_name=%s, op_type=%d, attr=%d, vid=["
, ifnode, g_if_vlan_info[ifnode].if_name, g_if_vlan_info[ifnode].op_type
, g_if_vlan_info[ifnode].attr);
for(vid = VID_MIN; vid <= VID_MAX; vid++){
if(vlan_bitmap_check(g_if_vlan_info[ifnode].vlan_bitmap, vid)){
printf("%d, ", vid);
}
}
printf("]\n");
/* <20><>ӡ<EFBFBD><D3A1><EFBFBD>·<EFBFBD><C2B7><EFBFBD><E1B9B9>Ϣ */
printf("[vlan]refresh_if_vlan_info_op_del: config if_vlan_info node information:::::\n");
printf("[vlan]refresh_if_vlan_info_op_del: if_name=%s, op_type=%d, attr=%d, vid=["
, if_vlan_info->if_name, if_vlan_info->op_type
, if_vlan_info->attr);
for(vid = VID_MIN; vid <= VID_MAX; vid++){
if(vlan_bitmap_check(if_vlan_info->vlan_bitmap, vid)){
printf("%d, ", vid);
}
}
printf("]\n");
printf("[vlan]refresh_if_vlan_info_op_del: if_vlan_info delete vid:[");
for(vid = VID_MIN; vid <= VID_MAX; vid++){
/* ȥ<><C8A5><EFBFBD>·<EFBFBD><C2B7>ṹif_vlan_infoȡ<6F><C8A1><EFBFBD>õ<EFBFBD>vid,
<EFBFBD>ھɵĽȫ<EFBFBD><EFBFBD>g_if_vlan_info<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Щvid */
if(vlan_bitmap_check(if_vlan_info->vlan_bitmap, vid)){
printf("%d, ", vid);
vlan_bitmap_clear(g_if_vlan_info[ifnode].vlan_bitmap, vid);
g_if_vlan_info[ifnode].vidcnt--;
}
}
printf("]\n");
printf("[vlan]refresh_if_vlan_info_op_del: g_[%d].vidcnt=%d\n", ifnode, g_if_vlan_info[ifnode].vidcnt);
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD><D3BF>ϻ<EFBFBD><CFBB><EFBFBD>vid,<2C>򲻴<EFBFBD><F2B2BBB4><EFBFBD>,<2C><><EFBFBD><EFBFBD>û<EFBFBD><C3BB>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD><D3BF><EFBFBD>Ϣ */
/* <20><><EFBFBD><EFBFBD>vcnt == 0 ˵<><CBB5>idnode<64><65><EFBFBD>Ѿ<EFBFBD>û<EFBFBD><C3BB>vid<69><64>,<2C><><EFBFBD><EFBFBD>ifnode<64><65>Ϣ */
if(g_if_vlan_info[ifnode].vidcnt == 0){
printf("[vlan]refresh_if_vlan_info_op_del: clean g_if_vlan_info[%d] info.\n", ifnode);
memset(&g_if_vlan_info[ifnode], 0, sizeof(interface_vlan_info));
}
#if 0
printf("[vlan]refresh_if_vlan_info_op_del: g_vlan_info[%d],vid left:[", ifnode);
for(vid = VID_MIN; vid <= VID_MAX; vid++){
if(vlan_bitmap_check(g_if_vlan_info[ifnode].vlan_bitmap, vid)){
printf("%d, ", vid);
vcnt++;
}
}
printf("]\n");
/* <20><><EFBFBD><EFBFBD>vcnt == 0 ˵<><CBB5>idnode<64><65><EFBFBD>Ѿ<EFBFBD>û<EFBFBD><C3BB>vid<69><64>,<2C><><EFBFBD><EFBFBD>ifnode<64><65>Ϣ */
if(vcnt == 0){
printf("[vlan]refresh_if_vlan_info_op_del: clean g_if_vlan_info[%d] info.\n", ifnode);
memset(&g_if_vlan_info[ifnode], 0, sizeof(interface_vlan_info));
}
#endif
return 0;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ifname<EFBFBD><EFBFBD>ȡȫ<EFBFBD>ֽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: -1:û<EFBFBD>ҵ<EFBFBD>
ifnode: <EFBFBD><EFBFBD>ifnode<EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
************************************************************/
int get_ifnode_from_global(char *if_name)
{
int ifnode;
if(!if_name){
return -1;
}
if(!strcmp(if_name, "")){
printf("[vlan]get_ifnode_from_global: if_name is empty.\n");
return -1;
}
for(ifnode = 0; ifnode < MAX_INTERFACES; ifnode++){
if(!strcmp(g_if_vlan_info[ifnode].if_name, if_name)){
printf("[vlan]get_ifnode_from_global: find gnode[%d], ifname=%s\n", ifnode, if_name);
return ifnode;
}
}
return -1;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:ADD<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code vlan_save_conf_file_add(interface_vlan_info *if_vlan_info)
{
int vid;
char subif[IF_NAME_LEN] = {0};
char *addr_name = "address";
char addr_buff[IF_BUFF_LEN] = {0};
if(!if_vlan_info){
return RET_NULLP;
}
printf("[vlan]save_conf_file_add: begin.\n");
sprintf(addr_buff, "address %d\n", 0);
for(vid = VID_MIN; vid <= VID_MAX; vid++){
if(vlan_bitmap_check(if_vlan_info->vlan_bitmap, vid)){
(void)if_vlan2subif(if_vlan_info->if_name, vid, subif);
printf("[vlan]save_conf_file_add: vid is %d, subif is %s\n", vid, subif);
ip_conf_file_set(subif, addr_name, addr_buff);
}
}
printf("[vlan]save_conf_file_add: save file add end.\n");
return RET_OK;
}
ret_code vlan_conf_file_del(char *if_name, char *address)
{
if(!if_name || !address){
return RET_NULLP;
}
char buf[100] = {0};
int status = 0;
//sprintf(buf, "sed -r -i ':a;N;$!ba;s/auto[ \\t]+%s\\n[ \\t]*iface[ \\t]+%s[ \\t]+inet[ \\t]+static\\n[ \\t]*address[ \\t]+%s\\n//g' %s", if_name, if_name, address, ETC_NETWORK_IFS);
sprintf(buf, "sed -r -i '/^auto[ \\t]+%s*$/d' %s", if_name, ETC_NETWORK_IFS);
status = system(buf);
if(status != 0){
printf("[vlan]vlan_conf_file_del1: status error. (%s)\n", strerror(errno));
return RET_SYS_FILEOP_ERR;
}
memset(buf, 0, 100);
sprintf(buf, "sed -r -i '/^iface[ \\t]+%s[ \\t]+inet[ \\t]+static*$/,+1d' %s", if_name, ETC_NETWORK_IFS);
status = system(buf);
if(status != 0){
printf("[vlan]vlan_conf_file_del2: status error. (%s)\n", strerror(errno));
return RET_SYS_FILEOP_ERR;
}
memset(buf, 0, 100);
//sprintf(buf, "sed -r -i '/^address[ \\t]+%s*$/d' %s", address, ETC_NETWORK_IFS);
//system(buf);
return RET_OK;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:DEL<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code vlan_save_conf_file_del(interface_vlan_info *if_vlan_info)
{
//int ifnode;
int vid;
char subif[IF_NAME_LEN] = {0};
char *del_address = "0";
ret_code ret = RET_OK;
if(!if_vlan_info){
return RET_NULLP;
}
//ifnode = get_ifnode_from_global(if_vlan_info->if_name);
printf("[vlan]vlan_save_conf_file_del: begin.\n");
for(vid = VID_MIN; vid <= VID_MAX; vid++){
if(vlan_bitmap_check(if_vlan_info->vlan_bitmap, vid)){
(void)if_vlan2subif(if_vlan_info->if_name, vid, subif);
printf("[vlan]vlan_save_conf_file_del: vid=%d, subif=%s\n", vid, subif);
ret = vlan_conf_file_del(subif, del_address);
if(ret != RET_OK){
printf("[vlan]vlan_save_conf_file_del: vlan-conffile del failed(%d).\n", ret);
return ret;
}
}
}
printf("[vlan]vlan_save_conf_file_del: save file del end.\n");
return RET_OK;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code vlan_save_conf_file(interface_vlan_info *if_vlan_info)
{
ret_code ret = RET_OK;
if(!if_vlan_info){
return RET_NULLP;
}
if(if_vlan_info->op_type == OP_ADD){
ret = vlan_save_conf_file_add(if_vlan_info);
}
else if(if_vlan_info->op_type == OP_DEL){
ret = vlan_save_conf_file_del(if_vlan_info);
}
else{
printf("[vlan]vlan_save_conf_file: OP_TYPE ERROR.return\n");
ret = RET_OPTYPE_ERR;
}
return ret;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD>ֽ
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code refresh_if_vlan_info(interface_vlan_info *if_vlan_info)
{
ret_code ret = RET_OK;
if(!if_vlan_info){
return RET_NULLP;
}
/* ·<><C2B7><EFBFBD>Ž<EFBFBD>ģ<EFBFBD>ͲŻ<CDB2><C5BB>õ<EFBFBD><C3B5>ӽӿ<D3BD>,<2C><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD> */
if(INTERFACE_MODEL_ROUTE_FORWARD == if_vlan_info->if_model){
ret = vlan_save_conf_file(if_vlan_info);
if(ret != RET_OK){
printf("[vlan]refresh_if_vlan_info: save conf file failed.return.(%d)\n", ret);
return ret;
}
}
if(OP_ADD == if_vlan_info->op_type){
ret = refresh_if_vlan_info_op_add(if_vlan_info);
}
else if(OP_DEL == if_vlan_info->op_type){
ret = refresh_if_vlan_info_op_del(if_vlan_info);
}
else {
printf("[vlan]refresh_if_vlan_info: OP_TYPE ERROR.return\n");
ret = RET_OPTYPE_ERR;
}
return ret;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:ɾ<EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>vlan
* <EFBFBD>˺<EFBFBD><EFBFBD><EFBFBD><EFBFBD>϶<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>ɾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><EFBFBD>ɾ<EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>vlan<EFBFBD><EFBFBD>Ϣ
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><EFBFBD>ԭ<EFBFBD>ӿ<EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><EFBFBD>vlan,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><EFBFBD>ԭ<EFBFBD>ӿ<EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><EFBFBD>vlan<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* ͨ<EFBFBD><EFBFBD>mod<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD>Ҫͨ<EFBFBD><EFBFBD>del<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code del_interface_vlan(interface_vlan_info *if_vlan_info)
{
ret_code ret = RET_OK;
if(!if_vlan_info){
return RET_NULLP;
}
/* <20><><EFBFBD><EFBFBD>У<EFBFBD><D0A3> */
//ret = check_config(if_vlan_info->if_name);
//if(0 == ret){//Ϊ0<CEAA><30>ʾ֮ǰû<C7B0><C3BB><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0B5B1>ADD
//return -1;
//}
/* <20>ӿ<EFBFBD>ģ<EFBFBD>͸<EFBFBD>ֵ */
if_vlan_info->if_model = which_interface_model(if_vlan_info->if_name);
/* <20><>ѯ<EFBFBD><D1AF>ǰȫ<C7B0>ֽṹ<D6BD>д<EFBFBD>port<72><74>attr */
interface_link_attr old_attr = get_attr_from_ifname(if_vlan_info->if_name);
/* trunk */
if(old_attr == LINK_TYPE_TRUNK){
ret = del_interface_vlan_trunk(if_vlan_info->if_name, if_vlan_info->vlan_bitmap, if_vlan_info->if_model);
if(ret != RET_OK){
printf("[vlan]del_interface_vlan: del trunk failed(%d).\n", ret);
return ret;
}
}
else if(old_attr == LINK_TYPE_ACCESS){
ret = del_interface_vlan_access(if_vlan_info->if_name, if_vlan_info->if_model);
if(ret != RET_OK){
printf("[vlan]del_interface_vlan: del access failed(%d).\n", ret);
return ret;
}
}
else {
printf("[vlan]del_interface_vlan: LINK-TYPE attr(%d) input error.\n", old_attr);
return RET_ATTR_INVALID;
}
/* <20><><EFBFBD><EFBFBD>ȫ<EFBFBD>ֽӿ<D6BD>vlan<61><6E><EFBFBD>ݽṹ */
ret = refresh_if_vlan_info(if_vlan_info);
return ret;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD>ȫ<EFBFBD><EFBFBD>gloabl<EFBFBD><EFBFBD>л<EFBFBD>ȡold<EFBFBD>Ľӿ<EFBFBD>model
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
interface_model get_old_interface_model(char *if_name, interface_model *if_model)
{
int ifnode;
if(!if_name || !if_model){
printf("[vlan]get_old_interface_model: input or output para error.\n");
return -1;
}
ifnode = get_ifnode_from_global(if_name);
if(-1 == ifnode){
return -1;
}
*if_model = g_if_vlan_info[ifnode].if_model;
return 0;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD>ж<EFBFBD><EFBFBD>¾ɽӿ<EFBFBD>ģ<EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>һ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: 0: һ<EFBFBD>£<EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
-1: <EFBFBD><EFBFBD>һ<EFBFBD>£<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
************************************************************/
int if_model_is_change(interface_model old, interface_model new)
{
if(old == new){
return 0;
}
else{
return -1;
}
}
int get_old_interface_attr(char *if_name, interface_link_attr *attr)
{
int ifnode;
if(!if_name || !attr){
printf("[vlan]get_old_interface_attr: input or output para error.\n");
return -1;
}
ifnode = get_ifnode_from_global(if_name);
if(-1 == ifnode){
return -1;
}
*attr = g_if_vlan_info[ifnode].attr;
return 0;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD>ӿ<EFBFBD>vlan<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>add<EFBFBD><EFBFBD>mod<EFBFBD><EFBFBD>del
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>add<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>Ӽ<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>del<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD>ɾ
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code interface_vlan_set(interface_vlan_info *if_vlan_info)
{
operation_type op_type;
ret_code ret = RET_OK;
if(!if_vlan_info){
return RET_NULLP;
}
op_type = if_vlan_info->op_type;
/* ADDֻ<44><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
if(op_type == OP_ADD){
ret = add_interface_vlan(if_vlan_info);
}
/* ֻ<><D6BB><EFBFBD><EFBFBD>ǰ */
else if(op_type == OP_DEL){
ret = del_interface_vlan(if_vlan_info);
}
else{
printf("[vlan]interface_vlan_set: op_type error.\n");
ret = RET_OPTYPE_ERR;
}
return ret;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>json<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶε<EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD>ӽ<EFBFBD>port_vlan_info[]
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* ֻ<EFBFBD><EFBFBD>ADD<EFBFBD><EFBFBD>DEL<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD>chkУ<EFBFBD><EFBFBD>,get<EFBFBD><EFBFBD>getall<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ,ֱ<EFBFBD>ӷ<EFBFBD><EFBFBD><EFBFBD>
* ÿһ<EFBFBD><EFBFBD>proc<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>operate<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* {
* "operate" : "add",
* "conf_ifvlan": [
* {
* "if_name" : "eth0",
* "vid" : [
* 100,
* 200,
* ],
* "if_attr" : "trunk"
* },
* {
* "if_name" : "eth1",
* "vid" : [
* 300,
* 400,
* ],
* "if_attr" : "trunk"
* },
* ]
* }
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: if_vlnum<EFBFBD><EFBFBD>if_vlan_info
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code vlan_config_json_parse(pointer input, interface_vlan_info *if_vlan_info, int *if_vlnum)
{
ret_code ret = RET_OK;
int i, if_num = 0, vl_num = 0, j;
cJSON *root = NULL, *operate = NULL, *conf_ifvlan = NULL;
if(!if_vlan_info || !input){
ret = RET_NULLP;
goto out;
}
if(!(root = cJSON_Parse(input))){
printf("[vlan-test]vlan_config_json_parse: json parse error, return error.\n");
ret = RET_INPUTERR;
goto out;
}
if(!(operate = cJSON_GetObjectItem(root, "operate"))){
printf("[vlan]vlan_config_json_parse: Json No operate node.\n");
ret = RET_INPUTERR;
goto out;
}
if(!(conf_ifvlan = cJSON_GetObjectItem(root, "conf_ifvlan"))){
printf("[vlan]vlan_config_json_parse: Json No conf_ifvlan node.\n");
ret = RET_INPUTERR;
goto out;
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>interface<63><65><EFBFBD><EFBFBD> */
if_num = cJSON_GetArraySize(conf_ifvlan);
if(if_num == 0){
printf("[vlan]vlan_config_json_parse: Json array has no interface.\n");
ret = RET_INPUTERR;
goto out;
}
cJSON *node = NULL;
for(i = 0; i < if_num; i++){
/* <20><>ÿ<EFBFBD><C3BF><EFBFBD>ӿڵ<D3BF>op_type<70><65>ֵ */
if(NULL == operate->valuestring){
printf("[vlan]vlan_config_json_parse: operate->valuestring is null.\n");
ret = RET_INPUTERR;
goto out;
}
if(!strcmp(operate->valuestring, "add")){
if_vlan_info[i].op_type = OP_ADD;
}
else if(!strcmp(operate->valuestring, "del")){
if_vlan_info[i].op_type = OP_DEL;
}
else if(!strcmp(operate->valuestring, "mod")){
if_vlan_info[i].op_type = OP_MOD;
}
node = cJSON_GetArrayItem(conf_ifvlan, i);
if(!node){
continue;
}
cJSON *ifName = cJSON_GetObjectItem(node, "if_name");
if(!ifName){
//continue;
printf("[vlan]vlan_config_json_parse: json has no ifName node.\n");
ret = RET_INPUTERR;
goto out;
}
if(NULL == ifName->valuestring){
printf("[vlan]vlan_config_json_parse: ifName->valuestring is null.\n");
ret = RET_INPUTERR;
goto out;
}
memcpy(if_vlan_info[i].if_name, ifName->valuestring, strlen(ifName->valuestring));
printf("[vlan]if_vlan_info[%d].if_name=%s\n", i, if_vlan_info[i].if_name);
cJSON *ifAttr = cJSON_GetObjectItem(node, "if_attr");
if(!ifAttr){
//continue;
printf("[vlan]vlan_config_json_parse: Json has no ifAttr node.\n");
ret = RET_INPUTERR;
goto out;
}
if(NULL == ifAttr->valuestring){
printf("[vlan]vlan_config_json_parse: ifAttr->valuestring is null.\n");
ret = RET_INPUTERR;
goto out;
}
if(!strcmp(ifAttr->valuestring, "trunk")){
if_vlan_info[i].attr = LINK_TYPE_TRUNK;
}
else if(!strcmp(ifAttr->valuestring, "access")){
if_vlan_info[i].attr = LINK_TYPE_ACCESS;
}
else {
printf("[vlan]vlan_config_json_parse: errror: is not trunk or access.\n");
ret = RET_ATTR_INVALID;
goto out;
}
cJSON *vId = cJSON_GetObjectItem(node, "vid");
if(!vId){
//continue;
printf("[vlan]vlan_config_json_parse: Json has no vId node.\n");
ret = RET_INPUTERR;
goto out;
}
/* <20><><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD>vid<69><64><EFBFBD><EFBFBD> */
vl_num = cJSON_GetArraySize(vId);
if(vl_num == 0){
printf("[vlan]vlan_config_json_parse: Json array has no vid element.\n");
ret = RET_INPUTERR;
goto out;
}
/* У<><D0A3>vid<69><64><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD>,<2C><><EFBFBD><EFBFBD> */
ret = vid_num_chk(if_vlan_info[i].if_name, if_vlan_info[i].op_type, vl_num);
if(ret != RET_OK){
printf("[vlan]vlan_config_json_parse: vid-num-chk error.\n");
goto out;
}
cJSON *item = NULL;
for(j = 0; j < vl_num; j++){
item = cJSON_GetArrayItem(vId, j);
printf("i=%d, vid=%d\n", i, item->valueint);
/* vid<69><64>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>ΧУ<CEA7><D0A3> */
ret = vid_value_chk(item->valueint);
if(ret != RET_OK){
printf("[vlan]vlan_config_json_parse: vid check failed.\n");
goto out;
}
vlan_bitmap_set(if_vlan_info[i].vlan_bitmap, item->valueint);
}
}
if(if_vlnum){
*if_vlnum = if_num;
}
out:
if(root){
cJSON_Delete(root);
}
return ret;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:vlanģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code vlan_config_proc(uint source, uint config_type,
pointer input, int input_len,
pointer output, int *output_len)
{
operation_type op_type;
int if_vl_num = 0, i;
ret_code ret = RET_OK;
interface_vlan_info if_vlan_info[MAX_INTERFACES] = {0};
printf("[vlan]===config-proc begin.===\n");
/* <20><><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD> */
ret = vlan_config_json_parse(input, if_vlan_info, &if_vl_num);
if(ret != RET_OK){
printf("[vlan]vlan_config_proc: source:%d, json parse failed(%d).\n", source, ret);
return ret;
}
for(i = 0; i < if_vl_num; i++){
ret = interface_vlan_set(&if_vlan_info[i]);
if(ret != RET_OK){
printf("[vlan]vlan_config_proc: source:%d, vlan set failed(%d).\n", source, ret);
return ret;
}
}
return RET_OK;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD>get<EFBFBD><EFBFBD>json<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ifnameȥȫ<EFBFBD>ֽ<EFBFBD>в<EFBFBD>ѯ,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽڵ<EFBFBD><EFBFBD>±<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>interface<EFBFBD>,<EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>
* get<EFBFBD><EFBFBD>ʽ
* {
* "get_ifvlan": [
* {
* "if_name" : "eth0",
* },
* {
* "if_name" : "eth1",
* },
* }
*
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD>ʽ
* {
* "if_vlan": [
* {
* "if_name" : "eth0",
* "vid" : [
* 100,
* 200,
* ],
* "if_attr" : "trunk"
* },
* {
* "if_name" : "eth1",
* "vid" : [
* 300,
* 400,
* ],
* "if_attr" : "trunk"
* },
* }
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code vlan_get_json_parse(int *interface, pointer input)
{
ret_code ret = RET_OK;
int i, if_num, vl_num, j, ifnode;
cJSON *root = NULL, *operate = NULL, *get_ifvlan = NULL;
if(!interface){
printf("[vlan]vlan_get_json_parse: interface is null.\n");
ret = RET_NULLP;
goto out;
}
if(!(root = cJSON_Parse(input))){
printf("[vlan]vlan_get_json_parse: root failed.\n");
ret = RET_INPUTERR;
goto out;
}
if(!(operate = cJSON_GetObjectItem(root, "operate"))){
printf("[vlan]vlan_get_json_parse: No operate node.\n");
ret = RET_INPUTERR;
goto out;
}
//if(operate->valuestring == NULL || strcmp(operate->valuestring, "get") != 0){
//printf("[vlan]vlan_get_json_parse: error: operate-val is %s.\n", operate->valuestring);
//ret = RET_INPUTERR;
//goto out;
//}
if(!(get_ifvlan = cJSON_GetObjectItem(root, "get_ifvlan"))){
printf("[vlan]vlan_get_json_parse: No get_ifvlan node.\n");
ret = RET_INPUTERR;
goto out;
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>interface<63><65><EFBFBD><EFBFBD> */
if_num = cJSON_GetArraySize(get_ifvlan);
if(if_num == 0){
printf("[vlan]vlan_get_json_parse: json array has no interface.\n");
ret = RET_INPUTERR;
goto out;
}
cJSON *node = NULL;
for(i = 0; i < if_num; i++){
node = cJSON_GetArrayItem(get_ifvlan, i);
if(!node){//???
continue;
}
cJSON *ifName = cJSON_GetObjectItem(node, "if_name");
if(!ifName){
//continue;
printf("[vlan]vlan_get_json_parse: json has no ifName node.\n");
ret = RET_INPUTERR;
goto out;
}
if(NULL == ifName->valuestring){
printf("[vlan]vlan_get_json_parse: ifName->valuestring is null.\n");
ret = RET_INPUTERR;
goto out;
}
ret = if_name_chk(ifName->valuestring);
if(ret != RET_OK){
printf("[vlan-chk]vlan_get_json_parse: if-name-chk failed.\n");
goto out;
}
//if_vlan_info[i].if_name= ifName->valuestring;//memcpy
/* <20><><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>˶<EFBFBD>Ӧ<EFBFBD><D3A6>ifnode,<2C><><EFBFBD><EFBFBD>Ӧ<EFBFBD>±<EFBFBD><C2B1><EFBFBD>1 */
ifnode = get_ifnode_from_global(ifName->valuestring);
if(ifnode != -1){
interface[ifnode] = 1;
}
}
out:
if(root){
cJSON_Delete(root);
}
return ret;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>interface<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ1<EFBFBD>򽫴<EFBFBD><EFBFBD>±<EFBFBD><EFBFBD><EFBFBD>Ϊȫ<EFBFBD>ֽ
* <EFBFBD>±<EFBFBD>,ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD>json<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code vlan_config_format_json(int *interface, pointer output, int *output_len)
{
cJSON *root = NULL, *arr = NULL, *js_list = NULL, *js_vid = NULL;
char *out = NULL;
int i, j, vid, ret = RET_OK;
root = cJSON_CreateObject();
if(!root){
printf("[vlan]vlan_config_format_json: cJSON create root failed.\n");
return RET_ERR;
}
cJSON_AddItemToObject(root, "if_vlan", arr = cJSON_CreateArray());
for(i = 0; i < MAX_INTERFACES; i++){
//ifnode = get_ifnode_from_global(if_vlan_info[i].if_name)
if(!(interface[i])){
continue;
}
js_list = cJSON_CreateObject();
if(!js_list){
printf("[vlan]vlan_config_format_json: cJSON create js_list failed.\n");
cJSON_Delete(root);
return RET_ERR;
}
cJSON_AddStringToObject(js_list , "if_name", g_if_vlan_info[i].if_name);
if(g_if_vlan_info[i].attr == LINK_TYPE_TRUNK){
cJSON_AddStringToObject(js_list , "if_attr", "trunk");
}
//else if(g_if_vlan_info[i].attr == LINK_TYPE_ACCESS){
//cJSON_AddStringToObject(js_list , "if_attr", "access");
//}
else {
printf("[vlan]vlan_config_format_json: if_atrtr error.\n");
cJSON_Delete(root);
return RET_ERR;
}
cJSON_AddItemToObject(js_list, "vid", js_vid = cJSON_CreateArray());
for(vid = VID_MIN; vid <= VID_MAX;vid++){
if(vlan_bitmap_check(g_if_vlan_info[i].vlan_bitmap, vid)){
cJSON_AddItemToArray(js_vid, cJSON_CreateNumber(vid));
}
}
cJSON_AddItemToArray(arr, js_list);
}
out = cJSON_PrintUnformatted(root);
if(!out){
printf("[vlan]vlan_config_format_json: cJSON_PrintUnformatted failed.\n");
cJSON_Delete(root);
return RET_ERR;
}
*output_len = strlen(out) + 1;
memcpy(output, out, *output_len);
xfree(out);
if(root){
cJSON_Delete(root);
}
return ret;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:vlan<EFBFBD><EFBFBD><EFBFBD><EFBFBD>get<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code vlan_config_get(uint source,
pointer input, int input_len,
pointer output, int *output_len)
{
//interface_vlan_info if_vlan_info[MAX_INTERFACES] = {0};
ret_code ret = RET_OK;
int interface[MAX_INTERFACES] = {0};
if(!input){
printf("[vlan]vlan_config_get: input is null.\n");
return RET_INPUTERR;
}
printf("[vlan]===config-get begin.===\n");
/* <20><><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD>Ľڵ<C4BD><DAB5>±괫<C2B1><EAB4AB>interface<63>ж<EFBFBD>Ӧ<EFBFBD>±<EFBFBD> */
ret = vlan_get_json_parse(interface, input);
if(ret != RET_OK){
printf("[vlan]vlan_config_get: get json parse failed.\n");
return ret;
}
/* <20><><EFBFBD>ݶ<EFBFBD>Ӧinterface<63>±<EFBFBD><><C8A5>ȡȫ<C8A1><C8AB>g_if_vlan_info<66><6F>Ϣ */
ret = vlan_config_format_json(interface, output, output_len);
if(ret != RET_OK){
printf("[vlan]vlan_config_get: format json failed.\n");
return ret;
}
return RET_OK;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD>ж<EFBFBD>ȡ<EFBFBD>ӽӿ<EFBFBD><EFBFBD><EFBFBD>Ϣ
* "/etc/network/interfaces"
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֺ<EFBFBD>vlan id
* auto ens38.100
* | | |
* pauto pifname ppoint
*
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code vlan_get_from_conf_file(int *interface)
{
FILE *fp = NULL;
char line[FILE_BUF_LINE] = {0};
int vid;
int node_num = 0;
char *pauto = NULL;//"auto"ָ<><D6B8>λ<EFBFBD><CEBB>
char *point = NULL;//'.'ָ<><D6B8>λ<EFBFBD><CEBB>
char *ifname = NULL;//"ens38"ָ<><D6B8>λ<EFBFBD><CEBB>
char tmp_name[IF_NAME_LEN] = {0};//
int i;
if(!interface){
printf("[vlan]vlan_get_from_conf_file: para is null.\n");
return RET_NULLP;
}
if(!(fp = fopen(ETC_NETWORK_IFS, "r"))){
printf("[vlan]vlan_get_from_conf_file: file open failed.\n");
return RET_SYS_FILEOP_ERR;
}
//fseek(fp,0,SEEK_END);
//rewind(fp);
while(fgets(line, FILE_BUF_LINE, fp)){
/* <20>ҵ<EFBFBD>"auto" */
pauto = strstr(line, "auto");
if(!pauto){
continue;
}
/* <20>ҵ<EFBFBD>'.' */
point = strchr(pauto, '.');
if(!point){
continue;
}
/* auto<74><6F><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD> */
ifname = pauto + strlen("auto");
/* <20><><EFBFBD>˿ո<CBBF><D5B8><EFBFBD>TAB */
while(ifname && (*ifname == ' ' || *ifname == '\t')){
ifname++;
}
/* <20>ҵ<EFBFBD>ens38 */
if(ifname){
char *p;
printf("[vlan]vlan_get_from_conf_file: ifname=");
for(p = ifname; p < point && p; p++){
printf("%c", *p);
}
memcpy(tmp_name, ifname, point - ifname);
/* <20><><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>ӽ<EFBFBD>g<EFBFBD><67>node<64><65><EFBFBD>Ľṹ<C4BD>е<EFBFBD>if-name<6D><65><EFBFBD>Ƚ<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,˵<EFBFBD><EFBFBD><EFBFBD>ýڵʱ<EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>,ֻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>ǰ<EFBFBD>н<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>vid<EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
for(i = 0; i < node_num; i++){
if(!strcmp(g_if_vlan_info[i].if_name, tmp_name)){
vid = atoi(point+1);
printf("\n[vlan]vlan_get_from_conf_file: find same node, vid = %d\n", vid);
vlan_bitmap_set(g_if_vlan_info[i].vlan_bitmap, vid);
break;
}
}
/* i==node_num˵<6D><CBB5>ǰ<EFBFBD><C7B0>û<EFBFBD>ҵ<EFBFBD>,<2C><><EFBFBD>Ǹ<EFBFBD>ȫ<EFBFBD>µ<EFBFBD> */
if(i == node_num){
memcpy(g_if_vlan_info[node_num].if_name, ifname, point - ifname);
g_if_vlan_info[node_num].attr = LINK_TYPE_TRUNK;
g_if_vlan_info[node_num].op_type = OP_ADD;
g_if_vlan_info[node_num].if_model = INTERFACE_MODEL_ROUTE_FORWARD;
vid = atoi(point+1);
printf("\n[vlan]vlan_get_from_conf_file: vid = %d\n", vid);
vlan_bitmap_set(g_if_vlan_info[node_num].vlan_bitmap, vid);
interface[node_num] = 1;
node_num++;
}
}
}
fclose(fp);
return RET_OK;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:vlan<EFBFBD><EFBFBD><EFBFBD><EFBFBD>get all<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code vlan_config_get_all(uint source, pointer output, int *output_len)
{
int interface[MAX_INTERFACES] = {0};
int i;
ret_code ret= RET_OK;
printf("[vlan]===config-get-all begin.===\n");
/* WEB<45>·<EFBFBD>,g_if_vlan_info<66><6F>Ӧ<EFBFBD><D3A6>node<64><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>
ֻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĽڵ<EFBFBD>node<EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>interface<EFBFBD><EFBFBD><EFBFBD>*/
printf("[vlan]vlan_config_get_all: source=%d.\n", source);
if(source == CONFIG_FROM_WEB){
for(i = 0; i < MAX_INTERFACES; i++){
//if(get_ifnode_from_global(g_if_vlan_info[i].if_name) != -1)
/* <20><>Ϊ<EFBFBD>մ<EFBFBD><D5B4>Ÿ<EFBFBD>interface<63><65>1 */
if(strcmp(g_if_vlan_info[i].if_name, "")){
interface[i] = 1;
printf("[vlan]vlan_config_get_all: interface[%d].\n", i);
}
}
}
/* <20><><EFBFBD>ûָ<C3BB>g_if_vlan_info<66><6F><EFBFBD>ǿյ<C7BF>,<2C><>Ҫ<EFBFBD>ȴ<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>g_if_vlan_info[]<EFBFBD><EFBFBD>
Ȼ<EFBFBD><EFBFBD><EFBFBD>ٽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĽڵ<EFBFBD>node<EFBFBD><EFBFBD><EFBFBD><EFBFBD>interface*/
else if(source == CONFIG_FROM_RECOVER1){
ret = vlan_get_from_conf_file(interface);
if(ret != RET_OK){
printf("[vlan]vlan_config_get_all: source %d, get from cfg file failed(%d).\n", source, ret);
return ret;
}
}
ret = vlan_config_format_json(interface, output, output_len);
if(ret != RET_OK){
printf("[vlan]vlan_config_get_all: source %d, get from cfg file failed(%d).\n", source, ret);
return ret;
}
return RET_OK;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľӿ<EFBFBD>
* <EFBFBD><EFBFBD>װɾ<EFBFBD><EFBFBD>vlan<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code del_compose_if_vlan_info(char *if_name, interface_vlan_info *if_vlan_info)
{
int ifnode = -1, vid;
if(!if_name || !if_vlan_info){
printf("[vlan]del_compose_if_vlan_info: input pointer is null.\n");
return RET_NULLP;
}
/* <20><><EFBFBD><EFBFBD>ifname<6D><65><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD>ǰif<69>ڵ<EFBFBD>,<2C><><EFBFBD><EFBFBD>vlan<61><6E>ֵ<EFBFBD><D6B5>if_vlan_info */
ifnode = get_ifnode_from_global(if_name);
if(ifnode == -1){
printf("[vlan]del_compose_if_vlan_info: find empty ifnode.\n");
return RET_NOTFOUND;
}
if_vlan_info->attr = g_if_vlan_info[ifnode].attr;
if_vlan_info->if_model = g_if_vlan_info[ifnode].if_model;
if_vlan_info->op_type = OP_DEL;
if_vlan_info->vidcnt = g_if_vlan_info[ifnode].vidcnt;
memcpy(if_vlan_info->if_name, g_if_vlan_info[ifnode].if_name, strlen(g_if_vlan_info[ifnode].if_name));
printf("[vlan]del_compose_if_vlan_info: attr=%d, op_type=%d, ifname=%s\n",
if_vlan_info->attr, if_vlan_info->op_type, if_vlan_info->if_name);
/* <20><>ȡvlanbitmap */
printf("[vlan]del_compose_if_vlan_info: vlan_info:\n(");
for(vid = VID_MIN; vid <= VID_MAX; vid++){
/* <20><><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD>vid<69><64><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>½ṹ<C2BD><E1B9B9>vlan_bitmap<61><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD>vid bitmap */
if(vlan_bitmap_check(g_if_vlan_info[ifnode].vlan_bitmap, vid)){
vlan_bitmap_set(if_vlan_info->vlan_bitmap, vid);
printf("%d, ", vid);
}
}
printf(")\n");
return RET_OK;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľӿ<EFBFBD>
* ɾ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>vlan<EFBFBD>Ļص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
int del_interface_vlan_cb(BR_EVENT_TYPE event_type, br_event_t event_arg)
{
interface_vlan_info if_vlan_info = {0};
ret_code ret = RET_OK;
ret = del_compose_if_vlan_info(event_arg.if_name, &if_vlan_info);
if(ret != RET_OK){
printf("[vlan]del_interface_vlan_cb: compose-if-vlan-info failed(%d).\n", ret);
return ret;
}
ret = del_interface_vlan(&if_vlan_info);
if(ret != RET_OK){
printf("[vlan]del_interface_vlan_cb: del-if-vlan failed(%d).\n", ret);
return ret;
}
return RET_OK;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:vlan vidֵУ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code vid_value_chk(int vid)
{
if(!(vid >= VID_MIN && vid <= VID_MAX)){
printf("[vlan]vid_value_chk: vid value error,return error\n");
return RET_VID_INVALID;
}
return RET_OK;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:vlan<EFBFBD><EFBFBD>ĿУ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code vid_num_chk(char *if_name, operation_type op_type, int num)
{
int ifnode = -1;
int total = 0;
if(!if_name){
printf("[vlan]vid_num_chk: if_name is null.\n");
return RET_NULLP;
}
printf("[vlan]vid_num_chk: if_name=%s, op_type=%d, num=%d\n", if_name, op_type, num);
ifnode = get_ifnode_from_global(if_name);
if(ifnode == -1){
total = num;
printf("[vlan]vid_num_chk: get ifnode empty, total = %d\n", total);
}
else{
total = g_if_vlan_info[ifnode].vidcnt + num;
printf("[vlan]vid_num_chk: total = %d + %d = %d\n", g_if_vlan_info[ifnode].vidcnt, num, total);
}
if(op_type == OP_ADD && total > EACH_PORT_MAX_VLAN_NUM){
printf("[vlan]vid_num_chk: ADD operation's total vid num > EACH_PORT_MAX_VLAN_NUM\n");
return RET_VIDNUM_INVALID;
}
return RET_OK;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:vlan<EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD>
* Ŀǰֻ֧<EFBFBD><EFBFBD>trunk,<EFBFBD><EFBFBD>trunk<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code if_attr_chk(interface_link_attr attr)
{
if(attr != LINK_TYPE_TRUNK){
printf("[vlan]if_attr_chk: now we only support link-type trunk.\n");
return RET_ATTR_INVALID;
}
return RET_OK;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:vlan<EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ADDУ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD>vlan id<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD>򱨴<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code op_type_add_chk(interface_vlan_info *if_vlan_info)
{
int ifnode, vid;
ifnode = get_ifnode_from_global(if_vlan_info->if_name);
if(ifnode == -1){
printf("[vlan]op_type_add_chk: This if_name has no node, return OK.\n");
return RET_OK;
}
/* <20><><EFBFBD>·<EFBFBD><C2B7><EFBFBD>vid<69><64><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB>g<EFBFBD><67><EFBFBD><EFBFBD>,<2C>򱨴<EFBFBD><F2B1A8B4><EFBFBD><EFBFBD><EFBFBD> */
for(vid = VID_MIN; vid <= VID_MAX; vid++){
if(vlan_bitmap_check(if_vlan_info->vlan_bitmap, vid)
&& vlan_bitmap_check(g_if_vlan_info[ifnode].vlan_bitmap, vid)){
printf("[vlan]op_type_add_chk: Already have vid[%d], now return\n", vid);
return RET_VID_EXIST;
}
}
return RET_OK;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:vlan<EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DELУ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD>vid<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD>,<EFBFBD>򱨴<EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code op_type_del_chk(interface_vlan_info *if_vlan_info)
{
int ifnode, vid;
ret_code ret = RET_OK;
ifnode = get_ifnode_from_global(if_vlan_info->if_name);
if(ifnode == -1){
printf("[vlan]op_type_del_chk: get_ifnode failed.\n");
ret = RET_INTERFACE_NOT_EXIST;
goto out;
}
/* <20><><EFBFBD>·<EFBFBD><C2B7><EFBFBD>vid<69><64><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB>g<EFBFBD><67>û<EFBFBD><C3BB>,<2C>򱨴<EFBFBD><F2B1A8B4><EFBFBD><EFBFBD><EFBFBD> */
for(vid = VID_MIN; vid <= VID_MAX; vid++){
if(vlan_bitmap_check(if_vlan_info->vlan_bitmap, vid)
&& !vlan_bitmap_check(g_if_vlan_info[ifnode].vlan_bitmap, vid)){
printf("[vlan]op_type_del_chk: node[%d] do not have vid[%d], now return\n", ifnode, vid);
ret = RET_VID_NOT_EXIST;
goto out;
}
}
out:
return ret;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:vlan<EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD>
* ֻ֧<EFBFBD><EFBFBD>ADD<EFBFBD><EFBFBD>DEL<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code op_type_chk(interface_vlan_info *if_vlan_info)
{
ret_code ret = RET_OK;
if(!if_vlan_info){
printf("[vlan]op_type_chk: input is null.\n");
return RET_NULLP;
}
/* ADD<44><44><EFBFBD><EFBFBD>У<EFBFBD><D0A3> */
if(if_vlan_info->op_type == OP_ADD){
ret = op_type_add_chk(if_vlan_info);
}
/* DEL<45><4C><EFBFBD><EFBFBD>У<EFBFBD><D0A3> */
else if(if_vlan_info->op_type == OP_DEL){
ret = op_type_del_chk(if_vlan_info);
}
else {
printf("[vlan]op_type_chk: op_type error.\n");
ret = RET_OPTYPE_ERR;
}
return ret;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD>ӿ<EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD>Ľӿ<EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code if_name_chk(char *if_name)
{
if(!if_name){
printf("[vlan]if_name_chk: if_name null.\n");
return RET_NULLP;
}
if(!(strcmp(if_name, ""))){
printf("[vlan]if_name_chk: if-name is empty string, return error.\n");
return RET_INPUTERR;
}
return RET_OK;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:vlan<EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD>
* <EFBFBD>ӿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD>;vid<EFBFBD><EFBFBD><EFBFBD><EFBFBD>json<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱУ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code interface_vlan_check(interface_vlan_info *if_vlan_info)
{
ret_code ret = RET_OK;
if(!if_vlan_info){
return RET_NULLP;
}
printf("[vlan]interface_vlan_check: ifname=%s, op_type=%d, attr=%d\n",
if_vlan_info->if_name, if_vlan_info->op_type, if_vlan_info->attr);
/* if_nameУ<65><D0A3> */
ret = if_name_chk(if_vlan_info->if_name);
if(ret != RET_OK){
printf("[vlan-chk]interface_vlan_check: if-name-chk failed.\n");
goto out;
}
/* if_attrУ<72><D0A3> */
ret = if_attr_chk(if_vlan_info->attr);
if(ret != RET_OK){
printf("[vlan-chk]interface_vlan_check: if-attr-chk failed.\n");
goto out;
}
/* <20><><EFBFBD><EFBFBD>У<EFBFBD><D0A3> */
ret = op_type_chk(if_vlan_info);
if(ret != RET_OK){
printf("[vlan-chk]interface_vlan_check: op-type-chk failed.\n");
goto out;
}
out:
return ret;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:vlan<EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD>json<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>if_vlan_info[],Ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code vlan_config_set_chk(uint source, pointer input)
{
int if_vl_num = 0, i;
ret_code ret = RET_OK;
interface_vlan_info if_vlan_info[MAX_INTERFACES] = {0};
ret = vlan_config_json_parse(input, if_vlan_info, &if_vl_num);
if(ret != RET_OK){
printf("[vlan]vlan_config_set_chk: json-parse failed(%d).\n", ret);
goto out;
}
for(i = 0; i < if_vl_num; i++){
ret = interface_vlan_check(&if_vlan_info[i]);
if(ret != RET_OK){
printf("[vlan]vlan_config_set_chk: if-node[%d] vlan chk failed(%d).\n", i, ret);
goto out;
}
}
out:
return ret;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code vlan_operate_parse(pointer input, int *oper_type)
{
ret_code ret = RET_OK;
int i, if_num, vl_num, j;
cJSON *root = NULL, *operate = NULL, *conf_ifvlan = NULL;
if(!input || !oper_type){
printf("[vlan]vlan_operate_chk: input or oper_type para is null.\n");
ret = RET_INPUTERR;
goto out;
}
if(!(root = cJSON_Parse(input))){
printf("[vlan]vlan_operate_chk: json parse error, return error.\n");
ret = RET_INPUTERR;
goto out;
}
if(!(operate = cJSON_GetObjectItem(root, "operate"))){
printf("[vlan]vlan_operate_chk: No operate node.\n");
ret = RET_INPUTERR;
goto out;
}
if(operate->valuestring != NULL && !strcmp(operate->valuestring, "add")
|| operate->valuestring != NULL && !strcmp(operate->valuestring, "del")){
printf("[vlan]vlan_operate_chk: operate-val is SET.\n");
*oper_type = CM_CONFIG_SET;
ret = RET_OK;
goto out;
}
else if(operate->valuestring != NULL && !strcmp(operate->valuestring, "get")){
printf("[vlan]vlan_operate_chk: operate-val is GET.\n");
*oper_type = CM_CONFIG_GET;
ret = RET_OK;
goto out;
}
else if(operate->valuestring != NULL && !strcmp(operate->valuestring, "getall")){
printf("[vlan]vlan_operate_chk: operate-val is GETALL.\n");
*oper_type = CM_CONFIG_GET_ALL;
ret = RET_OK;
goto out;
}
else {
printf("[vlan]vlan_operate_chk: operate-val is UNKNOWN, error.\n");
ret = RET_INPUTERR;
goto out;
}
out:
if(root){
cJSON_Delete(root);
}
return ret;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:vlan get<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>operate<EFBFBD><EFBFBD><EFBFBD>ͷֱ<EFBFBD><EFBFBD><EFBFBD>set<EFBFBD><EFBFBD>get<EFBFBD><EFBFBD>getallУ<EFBFBD><EFBFBD>
* Ŀǰֻ<EFBFBD><EFBFBD>setУ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code vlan_config_get_chk(uint source, pointer input)
{
int ret = RET_OK;
int interface[MAX_INTERFACES] = {0};
if(!input){
printf("[vlan]vlan_config_get_chk: input null.\n");
return RET_NULLP;
}
ret = vlan_get_json_parse(interface, input);
if(ret != RET_OK){
printf("[vlan]vlan_config_get_chk: get json parse failed(%d).\n", ret);
return ret;
}
#if 0
for(i = 0; i < MAX_INTERFACES; i++){
if(interface[i] == 1){
printf("[vlan]find a node[%d]\n", i);
return RET_OK;
}
}
return RET_INPUTERR;
#endif
return RET_OK;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:vlan getall<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>operate<EFBFBD><EFBFBD><EFBFBD>ͷֱ<EFBFBD><EFBFBD><EFBFBD>set<EFBFBD><EFBFBD>get<EFBFBD><EFBFBD>getallУ<EFBFBD><EFBFBD>
* Ŀǰֻ<EFBFBD><EFBFBD>setУ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code vlan_config_get_all_chk(uint source, pointer input)
{
return RET_OK;
}
/************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:vlan<EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>operate<EFBFBD><EFBFBD><EFBFBD>ͷֱ<EFBFBD><EFBFBD><EFBFBD>set<EFBFBD><EFBFBD>get<EFBFBD><EFBFBD>getallУ<EFBFBD><EFBFBD>
* Ŀǰֻ<EFBFBD><EFBFBD>setУ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
************************************************************/
ret_code vlan_config_chk(uint source,uint *config_type,
pointer input, int *input_len,
pointer output, int *output_len)
{
printf("[vlan]===config-chk begin.===\n");
int if_vl_num = 0, i, ret = RET_OK;
interface_vlan_info if_vlan_info[MAX_INTERFACES] = {0};
int oper_type;
ret = vlan_operate_parse(input, &oper_type);
if(ret != RET_OK){
goto out;
}
//*config_type = oper_type;
printf("[vlan]vlan_config_chk: operate_type=%d\n", oper_type);
if(oper_type == CM_CONFIG_SET){
printf("[vlan]vlan_config_chk: SET chk\n");
ret = vlan_config_set_chk(source, input);
}
else if(oper_type == CM_CONFIG_GET){
printf("[vlan]vlan_config_chk: GET chk\n");
ret = vlan_config_get_chk(source, input);
}
else if(oper_type == CM_CONFIG_GET_ALL){
printf("[vlan]vlan_config_chk: GET-ALL chk\n");
ret = vlan_config_get_all_chk(source, input);
}
else {
printf("[vlan]vlan_config_chk: oper_type is unknown(%d).\n", oper_type);
ret = RET_OPTYPE_ERR;
}
out:
printf("[vlan]vlan_config_chk: return ret=%d\n", ret);
return ret;
}
void vlan_set_struct_stub(interface_vlan_info *if_vlan_info, operation_type op_type, int *if_vlnum)
{
int vid, i;
*if_vlnum = 0;
int cnt = 0;
if(op_type == OP_ADD){
/* <20><><EFBFBD><EFBFBD>ens38.100 */
memcpy(if_vlan_info[cnt].if_name, "ens38", strlen("ens38"));
if_vlan_info[cnt].op_type = op_type;
if_vlan_info[cnt].attr = LINK_TYPE_TRUNK;
if_vlan_info[cnt].if_model = INTERFACE_MODEL_ROUTE_FORWARD;
vid = 100;
vlan_bitmap_set(if_vlan_info[cnt].vlan_bitmap, vid);
cnt++;
/* <20><><EFBFBD><EFBFBD>ens39.200, ens39.300 */
memcpy(if_vlan_info[cnt].if_name, "ens39", strlen("ens39"));
if_vlan_info[cnt].op_type = op_type;
if_vlan_info[cnt].attr = LINK_TYPE_TRUNK;
if_vlan_info[cnt].if_model = INTERFACE_MODEL_ROUTE_FORWARD;
vid = 200;
vlan_bitmap_set(if_vlan_info[cnt].vlan_bitmap, vid);
vid = 300;
vlan_bitmap_set(if_vlan_info[cnt].vlan_bitmap, vid);
cnt++;
for(i = 0; i < cnt; i++){
printf("[vlan-stub]vlan_set_struct_stub: ADD-->if_vlan_info[%d].if_name=%s\n", i, if_vlan_info[i].if_name);
}
}
else if(op_type == OP_DEL){
/* ɾ<><C9BE>ens39.200 */
memcpy(if_vlan_info[cnt].if_name, "ens39", strlen("ens39"));
if_vlan_info[cnt].op_type = op_type;
if_vlan_info[cnt].attr = LINK_TYPE_TRUNK;
if_vlan_info[cnt].if_model = INTERFACE_MODEL_ROUTE_FORWARD;
vid = 200;
vlan_bitmap_set(if_vlan_info[cnt].vlan_bitmap, vid);
cnt++;
}
else if(op_type == OP_MOD){
/* <20>޸<EFBFBD>ens39.300-->ens39.400 */
memcpy(if_vlan_info[cnt].if_name, "ens39", strlen("ens39"));
if_vlan_info[cnt].op_type = op_type;
if_vlan_info[cnt].attr = LINK_TYPE_TRUNK;
if_vlan_info[cnt].if_model = INTERFACE_MODEL_ROUTE_FORWARD;
vid = 400;
vlan_bitmap_set(if_vlan_info[cnt].vlan_bitmap, vid);
cnt++;
for(i = 0; i < cnt; i++){
printf("[vlan-stub]vlan_set_struct_stub: MOD-->if_vlan_info[%d].if_name=%s\n", i, if_vlan_info[i].if_name);
}
}
*if_vlnum = cnt;
return;
}
void vlan_config_stub1(void)
{
int if_vlnum, i;
interface_vlan_info if_vlan_info_add[MAX_INTERFACES] = {0};
interface_vlan_info if_vlan_info_del[MAX_INTERFACES] = {0};
interface_vlan_info if_vlan_info_mod[MAX_INTERFACES] = {0};
/* ADD */
vlan_set_struct_stub(if_vlan_info_add, OP_ADD, &if_vlnum);
for(i = 0; i < if_vlnum; i++){
interface_vlan_set(&if_vlan_info_add[i]);
}
/* DEL */
vlan_set_struct_stub(if_vlan_info_del, OP_DEL, &if_vlnum);
for(i = 0; i < if_vlnum; i++){
interface_vlan_set(&if_vlan_info_del[i]);
}
/* MOD */
vlan_set_struct_stub(if_vlan_info_add, OP_MOD, &if_vlnum);
for(i = 0; i < if_vlnum; i++){
interface_vlan_set(&if_vlan_info_mod[i]);
}
return;
}
void vlan_config_stub(operation_type op_type)
{
int if_vlnum, i;
interface_vlan_info if_vlan_info[MAX_INTERFACES] = {0};
vlan_set_struct_stub(if_vlan_info, op_type, &if_vlnum);
for(i = 0; i < if_vlnum; i++){
interface_vlan_set(&if_vlan_info[i]);
}
return;
}
void vlan_config_format_json_stub(int *interface)
{
int i, vid;
for(i = 0; i < MAX_INTERFACES; i++){
if(!(interface[i])){
continue;
}
printf("[vlan]vlan_config_format_json_stub: g_if_vlan_info[%d].if_name=%s, attr=%d, if_model=%d, op_type=%d, vlan=\n",
i, g_if_vlan_info[i].if_name, g_if_vlan_info[i].attr,
g_if_vlan_info[i].if_model, g_if_vlan_info[i].op_type);
for(vid = 0; vid < MAX_VLAN;vid++){
if(vlan_bitmap_check(g_if_vlan_info[i].vlan_bitmap, vid)){
printf("%d,", vid);
}
}
printf("\n");
}
return;
}
void vlan_config_get_stub(void)
{
int interface[MAX_INTERFACES] = {0};
interface[1] = 1;
printf("[vlan]vlan_config_get_stub:start.\n");
/* <20><><EFBFBD>ݶ<EFBFBD>Ӧinterface<63>±<EFBFBD><><C8A5>ȡȫ<C8A1><C8AB>g_if_vlan_info<66><6F>Ϣ */
vlan_config_format_json_stub(interface);
return;
}
void vlan_config_get_all_stub(uint source)
{
int interface[MAX_INTERFACES] = {0};
int i = 0;
/* WEB<45>·<EFBFBD>,g_if_vlan_info<66><6F>Ӧ<EFBFBD><D3A6>node<64><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>
ֻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĽڵ<EFBFBD>node<EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>interface<EFBFBD><EFBFBD><EFBFBD>*/
if(source == CONFIG_FROM_WEB){
printf("[vlan]vlan_config_get_all: CONFIG_FROM_WEB.\n");
for(i = 0; i < MAX_INTERFACES; i++){
//if(get_ifnode_from_global(g_if_vlan_info[i].if_name) != -1)
/* <20><>Ϊ<EFBFBD>մ<EFBFBD><D5B4>Ÿ<EFBFBD>interface<63><65>1 */
if(strcmp(g_if_vlan_info[i].if_name, "")){
interface[i] = 1;
printf("[vlan]get_all_stub: interface[%d].\n", i);
}
}
}
/* <20><><EFBFBD>ûָ<C3BB>g_if_vlan_info<66><6F><EFBFBD>ǿյ<C7BF>,<2C><>Ҫ<EFBFBD>ȴ<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>g_if_vlan_info[]<EFBFBD><EFBFBD>
Ȼ<EFBFBD><EFBFBD><EFBFBD>ٽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵĽڵ<EFBFBD>node<EFBFBD><EFBFBD><EFBFBD><EFBFBD>interface*/
else if(source == CONFIG_FROM_RECOVER1){
printf("[vlan]vlan_config_get_all: CONFIG_FROM_RECOVER1.\n");
vlan_get_from_conf_file(interface);
}
vlan_config_format_json_stub(interface);
return;
}