2019-08-26 08:28:51 +00:00
|
|
|
|
#include "vlan_config.h"
|
|
|
|
|
|
2019-09-02 08:28:20 +00:00
|
|
|
|
extern boolean br_is_exist(char *br_name);
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD>ȫ<EFBFBD>ֽӿ<D6BD>vlan<61><6E>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
interface_vlan_info g_if_vlan_info[MAX_INTERFACES] = {0};
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB>error data<74><61>Ϣ */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
char g_err_data[ERR_DATA_LEN] = {0};
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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)
|
|
|
|
|
{
|
2019-09-06 08:58:31 +00:00
|
|
|
|
int ret = 0;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
int interface_br(char *if_name, char *br_name)
|
|
|
|
|
{
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20>ȴ<EFBFBD><EFBFBD><D7AE><EFBFBD><EFBFBD> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:ɾ<EFBFBD><EFBFBD>br
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
int del_br(char *br_name)
|
|
|
|
|
{
|
|
|
|
|
return del_br_stub(br_name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
interface_model which_interface_model(char *if_name)
|
|
|
|
|
{
|
|
|
|
|
return INTERFACE_MODEL_ROUTE_FORWARD;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
2019-09-02 07:56:35 +00:00
|
|
|
|
ret_code vlan_config_init(void)
|
2019-08-26 08:28:51 +00:00
|
|
|
|
{
|
|
|
|
|
ret_code ret = RET_OK;
|
2019-09-02 07:50:40 +00:00
|
|
|
|
//int sys_ret = 0;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
|
2019-09-02 07:50:40 +00:00
|
|
|
|
(void)system("modprobe 8021q");
|
2019-08-26 08:28:51 +00:00
|
|
|
|
|
|
|
|
|
ret = br_event_register(BR_IF_LEAVE_EVENT_PRE, del_interface_vlan_cb);
|
2019-09-02 07:50:40 +00:00
|
|
|
|
if(ret != RET_OK){
|
|
|
|
|
printf("[vlan]vlan_config_init: event register failed(%d).\n", ret);
|
2019-09-02 07:56:35 +00:00
|
|
|
|
return ret;
|
2019-09-02 07:50:40 +00:00
|
|
|
|
}
|
2019-08-26 08:28:51 +00:00
|
|
|
|
#if 0
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD>br0 */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD>ӽӿ<D3BD><D3BF><EFBFBD><EFBFBD>ӽ<EFBFBD>br0 */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD>br1 */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD>ӽӿ<D3BD><D3BF><EFBFBD><EFBFBD>ӽ<EFBFBD>br1 */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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
|
2019-09-02 07:56:35 +00:00
|
|
|
|
return ret;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
int add_bridge_vlan_access(char *if_name, int vid)
|
|
|
|
|
{
|
2019-09-29 03:50:50 +00:00
|
|
|
|
//ϵͳ<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
|
2019-08-26 08:28:51 +00:00
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
int add_interface_vlan_access(char *if_name, int *vlan_bitmap, interface_model if_model)
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD>ں<EFBFBD><DABA><EFBFBD>ģ<EFBFBD><C4A3> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
if(INTERFACE_MODEL_FORWARD != if_model){
|
2019-09-29 03:50:50 +00:00
|
|
|
|
printf("access<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ž<EFBFBD>ģ<EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>\n");
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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)){
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* vconfig<69><67><EFBFBD><EFBFBD><EFBFBD>ӽӿ<D3BD> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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));
|
2019-08-29 12:42:26 +00:00
|
|
|
|
return RET_SYS_VCONFIG_ERR;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
}
|
|
|
|
|
memset(buf, 0, SYSCALL_BUF_LEN);
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD>ӽӿ<D3BD> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
(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));
|
2019-08-29 12:42:26 +00:00
|
|
|
|
return RET_SYS_IFCONFIG_ERR;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
}
|
|
|
|
|
memset(buf, 0, SYSCALL_BUF_LEN);
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* 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> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD>br-vl<76><6C> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
sprintf(br_vlname, "br-vl%d", vid);
|
|
|
|
|
printf("[vlan]add_vlan_sub_interface: br_vlname=%s\n", br_vlname);
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><>ѯ<EFBFBD><D1AF><EFBFBD>ɵ<EFBFBD>br-vl<76>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>br-vl */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
if(br_is_exist(br_vlname) == FALSE){
|
2019-09-29 03:28:01 +00:00
|
|
|
|
ret = br_bridge_add(br_vlname);
|
2019-08-26 08:28:51 +00:00
|
|
|
|
if(ret != RET_OK){
|
2019-09-29 03:28:01 +00:00
|
|
|
|
printf("[vlan]add_vlan_sub_interface: br_bridge_add failed(%s)\n", strerror(errno));
|
2019-08-26 08:28:51 +00:00
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD>ӽӿ<D3BD><D3BF><EFBFBD><EFBFBD>ӽ<EFBFBD>br */
|
2019-09-29 03:28:01 +00:00
|
|
|
|
br_if_bridge_add(br_vlname, subif, 1);
|
2019-08-26 08:28:51 +00:00
|
|
|
|
if(ret != RET_OK){
|
2019-09-29 03:28:01 +00:00
|
|
|
|
printf("[vlan]add_vlan_sub_interface: br_if_bridge_add failed(%s)\n", strerror(errno));
|
2019-08-26 08:28:51 +00:00
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
memset(subif, 0, IF_NAME_LEN);
|
|
|
|
|
memset(br_vlname, 0, BR_VLAN_NAME_LEN);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return RET_OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
ret_code add_interface_vlan_trunk(char *if_name, int *vlan_bitmap, interface_model if_model)
|
|
|
|
|
{
|
|
|
|
|
ret_code ret = RET_OK;
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20>Ž<EFBFBD> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
if(INTERFACE_MODEL_FORWARD == if_model){
|
|
|
|
|
ret = add_bridge_vlan_trunk(if_name, vlan_bitmap);
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* ·<><C2B7><EFBFBD>Ž<EFBFBD>,<2C>贴<EFBFBD><E8B4B4><EFBFBD>ӽӿں<D3BF>br-vlan */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
else if(INTERFACE_MODEL_ROUTE_FORWARD == if_model){
|
|
|
|
|
ret = add_vlan_sub_interface(if_name, vlan_bitmap);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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;
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD>У<EFBFBD><D0A3> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
//ret = check_config(if_vlan_info->if_name);
|
|
|
|
|
//if(0 != ret){
|
|
|
|
|
//return -1;
|
|
|
|
|
//}
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20>ӿ<EFBFBD>ģ<EFBFBD><EFBFBD>ֵ */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
if_vlan_info->if_model = which_interface_model(if_vlan_info->if_name);
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20>ж<EFBFBD><D0B6><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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);
|
2019-08-29 12:42:26 +00:00
|
|
|
|
return RET_ATTR_INVALID;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
}
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD>ȫ<EFBFBD>ֽӿ<D6BD>vlan<61><6E><EFBFBD>ݽṹ */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
ret = refresh_if_vlan_info(if_vlan_info);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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);
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <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>*/
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
int del_interface_vlan_access(char *if_name, interface_model if_model)
|
|
|
|
|
{
|
|
|
|
|
int ret;
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD>ں<EFBFBD><DABA><EFBFBD>ģ<EFBFBD><C4A3> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
if(INTERFACE_MODEL_FORWARD != if_model){
|
2019-09-29 03:50:50 +00:00
|
|
|
|
printf("access<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ž<EFBFBD>ģ<EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>\n");
|
2019-08-26 08:28:51 +00:00
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
ret = del_bridge_vlan_access(if_name);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:ɾ<EFBFBD><EFBFBD>trunk vlan
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
int del_bridge_vlan_trunk(char *if_name)
|
|
|
|
|
{
|
|
|
|
|
int ifnode, vid;
|
|
|
|
|
char buf[SYSCALL_BUF_LEN] = {0};
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <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> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
for(ifnode = 0; ifnode < MAX_INTERFACES; ifnode++){
|
|
|
|
|
if(!strcmp(g_if_vlan_info[ifnode].if_name, if_name)){
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* û<>ҵ<EFBFBD> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
if(ifnode >= MAX_INTERFACES){
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <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> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20>ָ<EFBFBD>vlan 1 pvid untagged */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
|
|
|
|
|
interface_network_type lan_or_wan(char *if_name)
|
|
|
|
|
{
|
|
|
|
|
return lan_or_wan_stub(if_name);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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");
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <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>*/
|
2019-08-26 08:28:51 +00:00
|
|
|
|
for(vid = VID_MIN; vid <= VID_MAX; vid++){
|
2019-09-29 03:50:50 +00:00
|
|
|
|
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> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
(void)if_vlan2subif(if_name, vid, subif);
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
ret = br_if_bridge_get(if_name, tmp_brname);
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* û<>ҵ<EFBFBD><D2B5><EFBFBD>,<2C><>WAN,ֻɾ<D6BB><C9BE>VLAN<41>ӽӿ<D3BD> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
if(RET_NOTFOUND == ret){
|
|
|
|
|
printf("[vlan]del_vlan_sub_interface: %s is WAN,only del vlansubif\n", if_name);
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* ɾ<><C9BE>vlan<61>ӽӿ<D3BD> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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));
|
2019-08-29 12:42:26 +00:00
|
|
|
|
return RET_SYS_VCONFIG_ERR;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
}
|
|
|
|
|
memset(buf, 0, SYSCALL_BUF_LEN);
|
|
|
|
|
memset(tmp_brname, 0, BR_VLAN_NAME_LEN);
|
|
|
|
|
memset(subif, 0, IF_NAME_LEN);
|
|
|
|
|
}
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD>,<2C><>LAN */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
else if(RET_OK == ret){
|
|
|
|
|
sprintf(br_vlname, "br-vl%d", vid);
|
|
|
|
|
printf("[vlan]del_vlan_sub_interface: br_vlname=%s\n", br_vlname);
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD>br-vlxx<78><78><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
if(br_is_exist(br_vlname) == FALSE){
|
|
|
|
|
printf("[vlan]del_vlan_sub_interface: %s is not exist, error,return.\n", br_vlname);
|
2019-08-29 12:42:26 +00:00
|
|
|
|
return RET_UNKNOWN;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
}
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* brctl delifɾ<66><C9BE>br-vl<76>ϵ<EFBFBD>vlan<61>ӽӿ<D3BD> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
printf("[vlan]del_vlan_sub_interface: br-vl%d delif %s\n", vid, subif);
|
2019-09-29 03:28:01 +00:00
|
|
|
|
ret = br_if_bridge_del(br_vlname, subif, 1);
|
2019-08-26 08:28:51 +00:00
|
|
|
|
if(ret != RET_OK){
|
2019-09-29 03:28:01 +00:00
|
|
|
|
printf("[vlan]del_vlan_sub_interface: br_if_bridge_del error(%s).\n", strerror(errno));
|
2019-08-26 08:28:51 +00:00
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* ɾ<><C9BE>vlan<61>ӽӿ<D3BD> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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));
|
2019-08-29 12:42:26 +00:00
|
|
|
|
return RET_SYS_VCONFIG_ERR;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
}
|
|
|
|
|
memset(buf, 0, SYSCALL_BUF_LEN);
|
|
|
|
|
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* br-vlan<61>ϵĽӿ<C4BD><D3BF><EFBFBD>Ϊ0,<2C><>ɾ<EFBFBD><C9BE>br-vlan */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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");
|
2019-09-29 03:28:01 +00:00
|
|
|
|
ret = br_bridge_del(br_vlname);
|
2019-08-26 08:28:51 +00:00
|
|
|
|
if(ret != RET_OK){
|
2019-09-29 03:28:01 +00:00
|
|
|
|
printf("[vlan]del_vlan_sub_interface: del br failed(%s).\n", strerror(errno));
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:ɾ<EFBFBD><EFBFBD>vlan trunk
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
ret_code del_interface_vlan_trunk(char *if_name, int *vlan_bitmap, interface_model if_model)
|
|
|
|
|
{
|
|
|
|
|
ret_code ret = RET_OK;
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20>Ž<EFBFBD> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
if(INTERFACE_MODEL_FORWARD == if_model){
|
|
|
|
|
ret = del_bridge_vlan_trunk(if_name);
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* ·<><C2B7><EFBFBD>Ž<EFBFBD>,<2C>贴<EFBFBD><E8B4B4><EFBFBD>ӽӿں<D3BF>br-vlan */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
else if(INTERFACE_MODEL_ROUTE_FORWARD == if_model){
|
|
|
|
|
ret = del_vlan_sub_interface(if_name, vlan_bitmap);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
int find_insert_ifnode_from_global(char *if_name)
|
|
|
|
|
{
|
|
|
|
|
int ifnode;
|
|
|
|
|
if(!if_name){
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20>ҵ<EFBFBD>֮ǰ<D6AE>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>ù<EFBFBD><C3B9>Ľڵ<C4BD>λ<EFBFBD><CEBB> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20>ҵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>յ<EFBFBD>,<2C><><EFBFBD><EFBFBD> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* ˵<><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,û<>пյĿɲ<C4BF><C9B2><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>Ľڵ<C4BD><DAB5><EFBFBD> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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);
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* û<>ҵ<EFBFBD><D2B5>հɲ<D7BF><C9B2><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>Ľڵ<C4BD>,add<64><64><EFBFBD><EFBFBD> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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);
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD>ifname, attr, op_type, if_model */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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);
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD>vlanbitmap */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
printf("[vlan]refresh_op_add: vlan_info:\n<");
|
|
|
|
|
for(vid = VID_MIN; vid <= VID_MAX; vid++){
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <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 */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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);
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD>==-1˵<31><CBB5>û<EFBFBD>ҵ<EFBFBD>,<2C>Ͳ<EFBFBD><CDB2><EFBFBD>del<65><6C> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
if(-1 == ifnode){
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* û<>ҵ<EFBFBD><D2B5><EFBFBD>Ӧ<EFBFBD>Ľڵ<C4BD> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
if(ifnode >= MAX_INTERFACES){
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
#if 0
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ifnode<64>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>Ϣ */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><>ӡ֮ǰȫ<C7B0><C8AB>g<EFBFBD>ṹ<EFBFBD><E1B9B9>Ϣ */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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");
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><>ӡ<EFBFBD><D3A1><EFBFBD>·<EFBFBD><C2B7>ṹ<EFBFBD><E1B9B9>Ϣ */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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++){
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* ȥ<><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 */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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);
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <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>Ϣ */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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");
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD>vcnt == 0 ˵<><CBB5>idnode<64><65><EFBFBD>Ѿ<EFBFBD>û<EFBFBD><C3BB>vid<69><64>,<2C><><EFBFBD><EFBFBD>ifnode<64><65>Ϣ */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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);
|
2019-08-29 12:42:26 +00:00
|
|
|
|
printf("[vlan]save_conf_file_add: vid is %d, subif is %s\n", vid, subif);
|
2019-08-26 08:28:51 +00:00
|
|
|
|
ip_conf_file_set(subif, addr_name, addr_buff);
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-08-29 12:42:26 +00:00
|
|
|
|
printf("[vlan]save_conf_file_add: save file add end.\n");
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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));
|
2019-08-29 12:42:26 +00:00
|
|
|
|
return RET_SYS_FILEOP_ERR;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
}
|
|
|
|
|
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));
|
2019-08-29 12:42:26 +00:00
|
|
|
|
return RET_SYS_FILEOP_ERR;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
memset(buf, 0, 100);
|
|
|
|
|
|
|
|
|
|
//sprintf(buf, "sed -r -i '/^address[ \\t]+%s*$/d' %s", address, ETC_NETWORK_IFS);
|
|
|
|
|
//system(buf);
|
|
|
|
|
|
|
|
|
|
return RET_OK;
|
|
|
|
|
}
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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;
|
|
|
|
|
}
|
2019-08-29 12:42:26 +00:00
|
|
|
|
//ifnode = get_ifnode_from_global(if_vlan_info->if_name);
|
|
|
|
|
printf("[vlan]vlan_save_conf_file_del: begin.\n");
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-08-29 12:42:26 +00:00
|
|
|
|
printf("[vlan]vlan_save_conf_file_del: save file del end.\n");
|
2019-08-26 08:28:51 +00:00
|
|
|
|
return RET_OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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");
|
2019-08-29 12:42:26 +00:00
|
|
|
|
ret = RET_OPTYPE_ERR;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
}
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
ret_code refresh_if_vlan_info(interface_vlan_info *if_vlan_info)
|
|
|
|
|
{
|
|
|
|
|
ret_code ret = RET_OK;
|
|
|
|
|
if(!if_vlan_info){
|
|
|
|
|
return RET_NULLP;
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* ·<><C2B7><EFBFBD>Ž<EFBFBD>ģ<EFBFBD>ͲŻ<CDB2><C5BB>õ<EFBFBD><C3B5>ӽӿ<D3BD>,<2C><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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");
|
2019-08-29 12:42:26 +00:00
|
|
|
|
ret = RET_OPTYPE_ERR;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
ret_code del_interface_vlan(interface_vlan_info *if_vlan_info)
|
|
|
|
|
{
|
|
|
|
|
ret_code ret = RET_OK;
|
|
|
|
|
if(!if_vlan_info){
|
|
|
|
|
return RET_NULLP;
|
|
|
|
|
}
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD>У<EFBFBD><D0A3> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
//ret = check_config(if_vlan_info->if_name);
|
2019-09-29 03:50:50 +00:00
|
|
|
|
//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
|
2019-08-26 08:28:51 +00:00
|
|
|
|
//return -1;
|
|
|
|
|
//}
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20>ӿ<EFBFBD>ģ<EFBFBD><EFBFBD>ֵ */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
if_vlan_info->if_model = which_interface_model(if_vlan_info->if_name);
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><>ѯ<EFBFBD><D1AF>ǰȫ<C7B0>ֽṹ<D6BD>д<EFBFBD>port<72><74>attr */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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);
|
2019-08-29 12:42:26 +00:00
|
|
|
|
return RET_ATTR_INVALID;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
}
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD>ȫ<EFBFBD>ֽӿ<D6BD>vlan<61><6E><EFBFBD>ݽṹ */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
ret = refresh_if_vlan_info(if_vlan_info);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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;
|
|
|
|
|
}
|
2019-09-06 08:58:31 +00:00
|
|
|
|
op_type = if_vlan_info->op_type;
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* ADDֻ<44><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
if(op_type == OP_ADD){
|
|
|
|
|
ret = add_interface_vlan(if_vlan_info);
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* ֻ<><D6BB><EFBFBD><EFBFBD>ǰ */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
else if(op_type == OP_DEL){
|
|
|
|
|
ret = del_interface_vlan(if_vlan_info);
|
|
|
|
|
}
|
|
|
|
|
else{
|
|
|
|
|
printf("[vlan]interface_vlan_set: op_type error.\n");
|
2019-08-29 12:42:26 +00:00
|
|
|
|
ret = RET_OPTYPE_ERR;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
}
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>
|
2019-08-26 08:28:51 +00:00
|
|
|
|
* {
|
|
|
|
|
* "operate" : "add",
|
2019-09-24 03:05:21 +00:00
|
|
|
|
* "conf_ifvlan": [
|
2019-08-26 08:28:51 +00:00
|
|
|
|
* {
|
2019-09-24 03:05:21 +00:00
|
|
|
|
* "if_name" : "eth0",
|
2019-08-26 08:28:51 +00:00
|
|
|
|
* "vid" : [
|
|
|
|
|
* 100,
|
|
|
|
|
* 200,
|
|
|
|
|
* ],
|
2019-09-24 03:05:21 +00:00
|
|
|
|
* "if_attr" : "trunk"
|
2019-08-26 08:28:51 +00:00
|
|
|
|
* },
|
|
|
|
|
* {
|
2019-09-24 03:05:21 +00:00
|
|
|
|
* "if_name" : "eth1",
|
2019-08-26 08:28:51 +00:00
|
|
|
|
* "vid" : [
|
|
|
|
|
* 300,
|
|
|
|
|
* 400,
|
|
|
|
|
* ],
|
2019-09-24 03:05:21 +00:00
|
|
|
|
* "if_attr" : "trunk"
|
2019-08-26 08:28:51 +00:00
|
|
|
|
* },
|
|
|
|
|
* ]
|
|
|
|
|
* }
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>: if_vlnum<EFBFBD><EFBFBD>if_vlan_info
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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"))){
|
2019-08-28 11:30:00 +00:00
|
|
|
|
printf("[vlan]vlan_config_json_parse: Json No operate node.\n");
|
2019-08-26 08:28:51 +00:00
|
|
|
|
ret = RET_INPUTERR;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
2019-09-24 03:05:21 +00:00
|
|
|
|
if(!(conf_ifvlan = cJSON_GetObjectItem(root, "conf_ifvlan"))){
|
2019-08-28 11:30:00 +00:00
|
|
|
|
printf("[vlan]vlan_config_json_parse: Json No conf_ifvlan node.\n");
|
2019-08-26 08:28:51 +00:00
|
|
|
|
ret = RET_INPUTERR;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>interface<63><65><EFBFBD><EFBFBD> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
if_num = cJSON_GetArraySize(conf_ifvlan);
|
|
|
|
|
if(if_num == 0){
|
2019-08-28 11:30:00 +00:00
|
|
|
|
printf("[vlan]vlan_config_json_parse: Json array has no interface.\n");
|
2019-08-26 08:28:51 +00:00
|
|
|
|
ret = RET_INPUTERR;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
2019-08-29 12:42:26 +00:00
|
|
|
|
cJSON *node = NULL;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
for(i = 0; i < if_num; i++){
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><>ÿ<EFBFBD><C3BF><EFBFBD>ӿڵ<D3BF>op_type<70><65>ֵ */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
2019-09-24 03:05:21 +00:00
|
|
|
|
cJSON *ifName = cJSON_GetObjectItem(node, "if_name");
|
2019-08-26 08:28:51 +00:00
|
|
|
|
if(!ifName){
|
2019-08-28 11:30:00 +00:00
|
|
|
|
//continue;
|
|
|
|
|
printf("[vlan]vlan_config_json_parse: json has no ifName node.\n");
|
|
|
|
|
ret = RET_INPUTERR;
|
|
|
|
|
goto out;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
}
|
|
|
|
|
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);
|
2019-09-24 03:05:21 +00:00
|
|
|
|
cJSON *ifAttr = cJSON_GetObjectItem(node, "if_attr");
|
2019-08-26 08:28:51 +00:00
|
|
|
|
if(!ifAttr){
|
2019-08-28 11:30:00 +00:00
|
|
|
|
//continue;
|
|
|
|
|
printf("[vlan]vlan_config_json_parse: Json has no ifAttr node.\n");
|
|
|
|
|
ret = RET_INPUTERR;
|
|
|
|
|
goto out;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
}
|
|
|
|
|
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;
|
|
|
|
|
}
|
2019-08-28 11:30:00 +00:00
|
|
|
|
else {
|
|
|
|
|
printf("[vlan]vlan_config_json_parse: errror: is not trunk or access.\n");
|
2019-08-29 12:42:26 +00:00
|
|
|
|
ret = RET_ATTR_INVALID;
|
2019-08-28 11:30:00 +00:00
|
|
|
|
goto out;
|
|
|
|
|
}
|
2019-08-26 08:28:51 +00:00
|
|
|
|
cJSON *vId = cJSON_GetObjectItem(node, "vid");
|
|
|
|
|
if(!vId){
|
2019-08-28 11:30:00 +00:00
|
|
|
|
//continue;
|
|
|
|
|
printf("[vlan]vlan_config_json_parse: Json has no vId node.\n");
|
|
|
|
|
ret = RET_INPUTERR;
|
|
|
|
|
goto out;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
}
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD>vid<69><64><EFBFBD><EFBFBD> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
vl_num = cJSON_GetArraySize(vId);
|
|
|
|
|
if(vl_num == 0){
|
2019-08-28 11:30:00 +00:00
|
|
|
|
printf("[vlan]vlan_config_json_parse: Json array has no vid element.\n");
|
2019-08-26 08:28:51 +00:00
|
|
|
|
ret = RET_INPUTERR;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* У<><D0A3>vid<69><64><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD>,<2C><><EFBFBD><EFBFBD> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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);
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* vid<69><64>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>ΧУ<CEA7><D0A3> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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");
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD> */
|
2019-08-29 12:42:26 +00:00
|
|
|
|
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]);
|
2019-08-26 08:28:51 +00:00
|
|
|
|
if(ret != RET_OK){
|
2019-08-29 12:42:26 +00:00
|
|
|
|
printf("[vlan]vlan_config_proc: source:%d, vlan set failed(%d).\n", source, ret);
|
2019-08-26 08:28:51 +00:00
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return RET_OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ʽ
|
2019-08-26 08:28:51 +00:00
|
|
|
|
* {
|
2019-09-24 03:05:21 +00:00
|
|
|
|
* "get_ifvlan": [
|
2019-08-26 08:28:51 +00:00
|
|
|
|
* {
|
2019-09-24 03:05:21 +00:00
|
|
|
|
* "if_name" : "eth0",
|
2019-08-26 08:28:51 +00:00
|
|
|
|
* },
|
|
|
|
|
* {
|
2019-09-24 03:05:21 +00:00
|
|
|
|
* "if_name" : "eth1",
|
2019-08-26 08:28:51 +00:00
|
|
|
|
* },
|
|
|
|
|
* }
|
|
|
|
|
*
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD>ʽ
|
2019-08-26 08:28:51 +00:00
|
|
|
|
* {
|
2019-09-24 03:05:21 +00:00
|
|
|
|
* "if_vlan": [
|
2019-08-26 08:28:51 +00:00
|
|
|
|
* {
|
2019-09-24 03:05:21 +00:00
|
|
|
|
* "if_name" : "eth0",
|
2019-08-26 08:28:51 +00:00
|
|
|
|
* "vid" : [
|
|
|
|
|
* 100,
|
|
|
|
|
* 200,
|
|
|
|
|
* ],
|
2019-09-24 03:05:21 +00:00
|
|
|
|
* "if_attr" : "trunk"
|
2019-08-26 08:28:51 +00:00
|
|
|
|
* },
|
|
|
|
|
* {
|
2019-09-24 03:05:21 +00:00
|
|
|
|
* "if_name" : "eth1",
|
2019-08-26 08:28:51 +00:00
|
|
|
|
* "vid" : [
|
|
|
|
|
* 300,
|
|
|
|
|
* 400,
|
|
|
|
|
* ],
|
2019-09-24 03:05:21 +00:00
|
|
|
|
* "if_attr" : "trunk"
|
2019-08-26 08:28:51 +00:00
|
|
|
|
* },
|
|
|
|
|
* }
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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;
|
|
|
|
|
//}
|
|
|
|
|
|
2019-09-24 03:05:21 +00:00
|
|
|
|
if(!(get_ifvlan = cJSON_GetObjectItem(root, "get_ifvlan"))){
|
|
|
|
|
printf("[vlan]vlan_get_json_parse: No get_ifvlan node.\n");
|
2019-08-26 08:28:51 +00:00
|
|
|
|
ret = RET_INPUTERR;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>interface<63><65><EFBFBD><EFBFBD> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
2019-09-24 03:05:21 +00:00
|
|
|
|
cJSON *ifName = cJSON_GetObjectItem(node, "if_name");
|
2019-08-26 08:28:51 +00:00
|
|
|
|
if(!ifName){
|
2019-08-29 12:42:26 +00:00
|
|
|
|
//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;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
}
|
2019-08-30 10:18:37 +00:00
|
|
|
|
|
|
|
|
|
ret = if_name_chk(ifName->valuestring);
|
|
|
|
|
if(ret != RET_OK){
|
|
|
|
|
printf("[vlan-chk]vlan_get_json_parse: if-name-chk failed.\n");
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
2019-08-26 08:28:51 +00:00
|
|
|
|
//if_vlan_info[i].if_name= ifName->valuestring;//memcpy
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>˶<EFBFBD>Ӧ<EFBFBD><D3A6>ifnode,<2C><><EFBFBD><EFBFBD>Ӧ<EFBFBD>±<EFBFBD><C2B1><EFBFBD>1 */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
ifnode = get_ifnode_from_global(ifName->valuestring);
|
|
|
|
|
if(ifnode != -1){
|
|
|
|
|
interface[ifnode] = 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
out:
|
|
|
|
|
if(root){
|
|
|
|
|
cJSON_Delete(root);
|
|
|
|
|
}
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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;
|
2019-08-30 10:18:37 +00:00
|
|
|
|
int i, j, vid, ret = RET_OK;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
root = cJSON_CreateObject();
|
|
|
|
|
if(!root){
|
2019-08-30 10:18:37 +00:00
|
|
|
|
printf("[vlan]vlan_config_format_json: cJSON create root failed.\n");
|
2019-08-26 08:28:51 +00:00
|
|
|
|
return RET_ERR;
|
|
|
|
|
}
|
2019-09-24 03:05:21 +00:00
|
|
|
|
cJSON_AddItemToObject(root, "if_vlan", arr = cJSON_CreateArray());
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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){
|
2019-08-30 10:18:37 +00:00
|
|
|
|
printf("[vlan]vlan_config_format_json: cJSON create js_list failed.\n");
|
2019-08-26 08:28:51 +00:00
|
|
|
|
cJSON_Delete(root);
|
|
|
|
|
return RET_ERR;
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-24 03:05:21 +00:00
|
|
|
|
cJSON_AddStringToObject(js_list , "if_name", g_if_vlan_info[i].if_name);
|
2019-08-30 10:18:37 +00:00
|
|
|
|
if(g_if_vlan_info[i].attr == LINK_TYPE_TRUNK){
|
2019-09-24 03:05:21 +00:00
|
|
|
|
cJSON_AddStringToObject(js_list , "if_attr", "trunk");
|
2019-08-30 10:18:37 +00:00
|
|
|
|
}
|
|
|
|
|
//else if(g_if_vlan_info[i].attr == LINK_TYPE_ACCESS){
|
2019-09-24 03:05:21 +00:00
|
|
|
|
//cJSON_AddStringToObject(js_list , "if_attr", "access");
|
2019-08-30 10:18:37 +00:00
|
|
|
|
//}
|
|
|
|
|
else {
|
2019-09-24 03:05:21 +00:00
|
|
|
|
printf("[vlan]vlan_config_format_json: if_atrtr error.\n");
|
2019-08-30 10:18:37 +00:00
|
|
|
|
cJSON_Delete(root);
|
|
|
|
|
return RET_ERR;
|
|
|
|
|
|
|
|
|
|
}
|
2019-08-26 08:28:51 +00:00
|
|
|
|
cJSON_AddItemToObject(js_list, "vid", js_vid = cJSON_CreateArray());
|
2019-08-29 12:42:26 +00:00
|
|
|
|
for(vid = VID_MIN; vid <= VID_MAX;vid++){
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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);
|
2019-08-30 10:18:37 +00:00
|
|
|
|
if(root){
|
|
|
|
|
cJSON_Delete(root);
|
|
|
|
|
}
|
|
|
|
|
return ret;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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");
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD>Ľڵ<C4BD><DAB5>±괫<C2B1><EAB4AB>interface<63>ж<EFBFBD>Ӧ<EFBFBD>±<EFBFBD> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
ret = vlan_get_json_parse(interface, input);
|
|
|
|
|
if(ret != RET_OK){
|
|
|
|
|
printf("[vlan]vlan_config_get: get json parse failed.\n");
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD>ݶ<EFBFBD>Ӧinterface<63>±<EFBFBD>,ȥ<><C8A5>ȡȫ<C8A1><C8AB>g_if_vlan_info<66><6F>Ϣ */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD>ж<EFBFBD>ȡ<EFBFBD>ӽӿ<EFBFBD><EFBFBD><EFBFBD>Ϣ
|
2019-08-26 08:28:51 +00:00
|
|
|
|
* "/etc/network/interfaces"
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֺ<EFBFBD>vlan id
|
2019-08-26 08:28:51 +00:00
|
|
|
|
* auto ens38.100
|
|
|
|
|
* | | |
|
|
|
|
|
* pauto pifname ppoint
|
|
|
|
|
*
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
ret_code vlan_get_from_conf_file(int *interface)
|
|
|
|
|
{
|
2019-09-06 08:58:31 +00:00
|
|
|
|
FILE *fp = NULL;
|
|
|
|
|
char line[FILE_BUF_LINE] = {0};
|
|
|
|
|
int vid;
|
|
|
|
|
int node_num = 0;
|
2019-09-29 03:50:50 +00:00
|
|
|
|
char *pauto = NULL;//"auto"ָ<><D6B8>λ<EFBFBD><CEBB>
|
|
|
|
|
char *point = NULL;//'.'ָ<><D6B8>λ<EFBFBD><CEBB>
|
|
|
|
|
char *ifname = NULL;//"ens38"ָ<><D6B8>λ<EFBFBD><CEBB>
|
2019-09-06 08:58:31 +00:00
|
|
|
|
char tmp_name[IF_NAME_LEN] = {0};//
|
|
|
|
|
int i;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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");
|
2019-08-29 12:42:26 +00:00
|
|
|
|
return RET_SYS_FILEOP_ERR;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
}
|
|
|
|
|
//fseek(fp,0,SEEK_END);
|
|
|
|
|
//rewind(fp);
|
2019-09-06 08:58:31 +00:00
|
|
|
|
|
2019-08-26 08:28:51 +00:00
|
|
|
|
while(fgets(line, FILE_BUF_LINE, fp)){
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20>ҵ<EFBFBD>"auto" */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
pauto = strstr(line, "auto");
|
|
|
|
|
if(!pauto){
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20>ҵ<EFBFBD>'.' */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
point = strchr(pauto, '.');
|
|
|
|
|
if(!point){
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* auto<74><6F><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
ifname = pauto + strlen("auto");
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD>˿ո<CBBF><D5B8><EFBFBD>TAB */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
while(ifname && (*ifname == ' ' || *ifname == '\t')){
|
|
|
|
|
ifname++;
|
|
|
|
|
}
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20>ҵ<EFBFBD>ens38 */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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);
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <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>*/
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* i==node_num˵<6D><CBB5>ǰ<EFBFBD><C7B0>û<EFBFBD>ҵ<EFBFBD>,<2C><><EFBFBD>Ǹ<EFBFBD>ȫ<EFBFBD>µ<EFBFBD> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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");
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* 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>T<EFBFBD><EFBFBD>*/
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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)
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><>Ϊ<EFBFBD>մ<EFBFBD><D5B4>Ÿ<EFBFBD>interface<63><65>1 */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
if(strcmp(g_if_vlan_info[i].if_name, "")){
|
|
|
|
|
interface[i] = 1;
|
|
|
|
|
printf("[vlan]vlan_config_get_all: interface[%d].\n", i);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <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*/
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD>ifname<6D><65><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD>ǰif<69>ڵ<EFBFBD>,<2C><><EFBFBD><EFBFBD>vlan<61><6E>ֵ<EFBFBD><D6B5>if_vlan_info */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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);
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><>ȡvlanbitmap */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
printf("[vlan]del_compose_if_vlan_info: vlan_info:\n(");
|
|
|
|
|
for(vid = VID_MIN; vid <= VID_MAX; vid++){
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <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 */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:vlan vidֵУ<EFBFBD><EFBFBD>
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|
|
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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");
|
2019-08-29 12:42:26 +00:00
|
|
|
|
return RET_VID_INVALID;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
}
|
|
|
|
|
return RET_OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
ret_code vid_num_chk(char *if_name, operation_type op_type, int num)
|
|
|
|
|
{
|
|
|
|
|
int ifnode = -1;
|
2019-08-27 11:08:10 +00:00
|
|
|
|
int total = 0;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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){
|
2019-08-27 11:08:10 +00:00
|
|
|
|
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);
|
2019-08-26 08:28:51 +00:00
|
|
|
|
}
|
2019-08-27 11:08:10 +00:00
|
|
|
|
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");
|
2019-08-29 12:42:26 +00:00
|
|
|
|
return RET_VIDNUM_INVALID;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return RET_OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
2019-08-30 10:18:37 +00:00
|
|
|
|
ret_code if_attr_chk(interface_link_attr attr)
|
2019-08-26 08:28:51 +00:00
|
|
|
|
{
|
2019-08-30 10:18:37 +00:00
|
|
|
|
if(attr != LINK_TYPE_TRUNK){
|
2019-08-26 08:28:51 +00:00
|
|
|
|
printf("[vlan]if_attr_chk: now we only support link-type trunk.\n");
|
2019-08-29 12:42:26 +00:00
|
|
|
|
return RET_ATTR_INVALID;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
}
|
|
|
|
|
return RET_OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD>·<EFBFBD><C2B7><EFBFBD>vid<69><64><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB>g<EFBFBD><67><EFBFBD><EFBFBD>,<2C><EFBFBD><F2B1A8B4><EFBFBD><EFBFBD><EFBFBD> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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);
|
2019-08-29 12:42:26 +00:00
|
|
|
|
return RET_VID_EXIST;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return RET_OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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");
|
2019-08-29 12:42:26 +00:00
|
|
|
|
ret = RET_INTERFACE_NOT_EXIST;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD>·<EFBFBD><C2B7><EFBFBD>vid<69><64><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB>g<EFBFBD><67>û<EFBFBD><C3BB>,<2C><EFBFBD><F2B1A8B4><EFBFBD><EFBFBD><EFBFBD> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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);
|
2019-08-29 12:42:26 +00:00
|
|
|
|
ret = RET_VID_NOT_EXIST;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
out:
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
ret_code op_type_chk(interface_vlan_info *if_vlan_info)
|
|
|
|
|
{
|
|
|
|
|
ret_code ret = RET_OK;
|
2019-08-30 10:18:37 +00:00
|
|
|
|
if(!if_vlan_info){
|
|
|
|
|
printf("[vlan]op_type_chk: input is null.\n");
|
|
|
|
|
return RET_NULLP;
|
|
|
|
|
}
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* ADD<44><44><EFBFBD><EFBFBD>У<EFBFBD><D0A3> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
if(if_vlan_info->op_type == OP_ADD){
|
|
|
|
|
ret = op_type_add_chk(if_vlan_info);
|
|
|
|
|
}
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* DEL<45><4C><EFBFBD><EFBFBD>У<EFBFBD><D0A3> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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");
|
2019-08-29 12:42:26 +00:00
|
|
|
|
ret = RET_OPTYPE_ERR;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
}
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
2019-08-30 10:18:37 +00:00
|
|
|
|
ret_code if_name_chk(char *if_name)
|
2019-08-26 08:28:51 +00:00
|
|
|
|
{
|
2019-08-30 10:18:37 +00:00
|
|
|
|
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");
|
2019-08-29 12:42:26 +00:00
|
|
|
|
return RET_INPUTERR;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
}
|
|
|
|
|
return RET_OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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);
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* if_nameУ<65><D0A3> */
|
2019-08-30 10:18:37 +00:00
|
|
|
|
ret = if_name_chk(if_vlan_info->if_name);
|
2019-08-26 08:28:51 +00:00
|
|
|
|
if(ret != RET_OK){
|
|
|
|
|
printf("[vlan-chk]interface_vlan_check: if-name-chk failed.\n");
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* if_attrУ<72><D0A3> */
|
2019-08-30 10:18:37 +00:00
|
|
|
|
ret = if_attr_chk(if_vlan_info->attr);
|
2019-08-26 08:28:51 +00:00
|
|
|
|
if(ret != RET_OK){
|
|
|
|
|
printf("[vlan-chk]interface_vlan_check: if-attr-chk failed.\n");
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD>У<EFBFBD><D0A3> */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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;
|
|
|
|
|
}
|
2019-08-28 11:30:00 +00:00
|
|
|
|
else {
|
|
|
|
|
printf("[vlan]vlan_operate_chk: operate-val is UNKNOWN, error.\n");
|
|
|
|
|
ret = RET_INPUTERR;
|
|
|
|
|
goto out;
|
|
|
|
|
}
|
2019-08-26 08:28:51 +00:00
|
|
|
|
out:
|
|
|
|
|
if(root){
|
|
|
|
|
cJSON_Delete(root);
|
|
|
|
|
}
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
}
|
2019-08-27 11:08:10 +00:00
|
|
|
|
#if 0
|
2019-08-26 08:28:51 +00:00
|
|
|
|
for(i = 0; i < MAX_INTERFACES; i++){
|
|
|
|
|
if(interface[i] == 1){
|
2019-08-27 11:08:10 +00:00
|
|
|
|
printf("[vlan]find a node[%d]\n", i);
|
2019-08-26 08:28:51 +00:00
|
|
|
|
return RET_OK;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return RET_INPUTERR;
|
2019-08-27 11:08:10 +00:00
|
|
|
|
#endif
|
|
|
|
|
return RET_OK;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
|
|
|
|
|
ret_code vlan_config_get_all_chk(uint source, pointer input)
|
|
|
|
|
{
|
|
|
|
|
return RET_OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
2019-09-29 03:50:50 +00:00
|
|
|
|
* <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>ֵ:
|
2019-08-26 08:28:51 +00:00
|
|
|
|
************************************************************/
|
|
|
|
|
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;
|
|
|
|
|
}
|
2019-08-27 11:08:10 +00:00
|
|
|
|
//*config_type = oper_type;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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);
|
2019-08-29 12:42:26 +00:00
|
|
|
|
ret = RET_OPTYPE_ERR;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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){
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD>ens38.100 */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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++;
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD>ens39.200, ens39.300 */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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){
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* ɾ<><C9BE>ens39.200 */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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){
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><EFBFBD>ens39.300-->ens39.400 */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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 */
|
2019-09-06 08:58:31 +00:00
|
|
|
|
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]);
|
|
|
|
|
}
|
2019-08-26 08:28:51 +00:00
|
|
|
|
|
|
|
|
|
/* 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)
|
|
|
|
|
{
|
2019-09-06 08:58:31 +00:00
|
|
|
|
int i, vid;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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");
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><><EFBFBD>ݶ<EFBFBD>Ӧinterface<63>±<EFBFBD>,ȥ<><C8A5>ȡȫ<C8A1><C8AB>g_if_vlan_info<66><6F>Ϣ */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
vlan_config_format_json_stub(interface);
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void vlan_config_get_all_stub(uint source)
|
|
|
|
|
{
|
|
|
|
|
int interface[MAX_INTERFACES] = {0};
|
2019-09-06 08:58:31 +00:00
|
|
|
|
int i = 0;
|
2019-08-26 08:28:51 +00:00
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* 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>T<EFBFBD><EFBFBD>*/
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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)
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <20><>Ϊ<EFBFBD>մ<EFBFBD><D5B4>Ÿ<EFBFBD>interface<63><65>1 */
|
2019-08-26 08:28:51 +00:00
|
|
|
|
if(strcmp(g_if_vlan_info[i].if_name, "")){
|
|
|
|
|
interface[i] = 1;
|
|
|
|
|
printf("[vlan]get_all_stub: interface[%d].\n", i);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-09-29 03:50:50 +00:00
|
|
|
|
/* <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*/
|
2019-08-26 08:28:51 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|