📄 vlan_cli.c
字号:
/******************************************************************************
* VLAN CLI 2 Implementaion
* Syntax: no vlan <name> ipaddress
* 语义:delete VLAN <name> 的IP地址和掩码
*******************************************************************************/
int NoVlanIpAddr(int argc, char ** argv,struct vty * vty)
{
struct _vlanentry * v = vlan_get_by_name(argv[0]);
int masklen,mask;
long ipaddr;
if(!v)
{
vty_out(vty,"vlan %s not exist \r\n",argv[0]);
return -1;
}
else
{
if(v->ipaddr == 0)
{
vty_out(vty,"Vlan %s have no IP address. \r\n",argv[0]);
return -1;
}
}
return vlan_set_ipaddr(v,0,0);
}
/******************************************************************************
* VLAN CLI 3 Implementaion
* Syntax: config VLAN <name> Tag <1-4095>
* 语义:配置VLAN <name> 的Tag
*******************************************************************************/
int ConfigVlanTag(char *name,int tag,struct vty *vty)
{
int prevVID;
struct _vlanentry * old, * cur;
struct net_bridge_port * p;
cur = vlan_get_by_name(name);
if(!cur)
{
vty_out(vty,"Vlan %s not exist.\r\n",name);
return -1;
}
/* if(tag == 2047)
{
vty_out(vty,"Tag 2047 is default vlan's tag ,can't assign to other vlans.\r\n");
return -1;
}
*/
if((tag <1)||(tag >4095))
{
vty_out(vty,"Invalid tag value, system support tag range is 1-4095.\r\n");
return -1;
}
prevVID = cur->VID;
if(prevVID == tag)
return 0;
BEGIN_PARSE_ALL_PORT(p)
{
if(vlan_port_relation(cur,p) != 0)
{
port_enter_critical_region(p);
}
}END_PARSE_ALL_PORT(p);
/* 要改变vlan 的VID 值,必须先清空其Mac 地址表 */
if(!(cur->flag & VlanFlagPseduo))
{
br_fdb_static_clear_hw(cur);
}
/* 先找在这个Tag 位置上有没有被其他的VLAN 占用 */
old = vlan_get_by_VID(tag);
if(old && old != cur)
{
/* 已经被vlan old 占用了*/
if( old->flag & VlanFlagTagged)
{
vty_out(vty,"System had already exist a vlan %s, it's tag is configured as %d. \r\n",old->name, tag);
BEGIN_PARSE_ALL_PORT(p)
{
if(vlan_port_relation(cur,p) != 0)
{
port_leave_critical_region(p);
}
}END_PARSE_ALL_PORT(p);
return -1;
}
old->VID = cur->VID;
cur->VID = tag;
}
else{
/*未被占用*/
cur->VID = tag;
VlanTableMap[tag] = 1;
VlanTableMap[prevVID] = 0;
}
cur->flag |=VlanFlagTagged;
vlan_flush(cur);
if(old)
{
if(!(old->flag & VlanFlagPseduo))
{
/*修改与vlan old有关系的所有mac address table entry*/
br_fdb_static_clear_hw(old);
}
vlan_flush(old);
}else{
/* invalid the prev VID entry */
clearVlanTableByVID(prevVID);
}
BEGIN_PARSE_ALL_PORT(p)
{
if(vlan_port_relation(cur,p) != 0)
{
port_leave_critical_region(p);
}
}END_PARSE_ALL_PORT(p);
return 0;
}
/******************************************************************************
* VLAN CLI 4 Implementaion
* Syntax: config vlan <name> [add|delete] port <portlist> [tagged|untagged]
* 语义:配置<portlist>属于VLAN
*******************************************************************************/
int ConfigVlanPort(int argc,char **argv,struct vty *vty)
{
int action,tagged;
short portno;
struct net_bridge_port * p;
struct _vlanentry * v;
v = vlan_get_by_name(argv[0]);
if(!v)
{
vty_out(vty,"Vlan %s not existed. \r\n",argv[0]);
return -1;
}
if(!strcmp("default",argv[0]))
{
vty_out(vty,"Default vlan can not change port information. \r\n");
return -1;
}
if(strcmp("add",argv[1])==0)
action = 0; /* add */
else if(strcmp("delete",argv[1])==0)
action = 1; /*delete*/
else{
vty_out(vty,"Error action :%s. \r\n",argv[1]);
return -1;
}
if(strcmp("tagged",argv[argc-1])==0)
tagged = 1; /* tagged */
else
tagged = 0; /* untagged */
if(!CheckPortListValid(argv[2],vty))
{
vty_out(vty,"Invalid port list <%s>. \r\n",argv[2]);
return -1;
}
BEGIN_PARSE_PORT_LIST(argv[2],portno)
{
p = br_get_port_byno(portno);
if(!p)
{
vty_out(vty, "Port not exist. \r\n");
return -1;
}
if((p->flags & PortFlagTrunked) && (!(p->flags & PortFlagTrunkMaster)))
{
vty_out(vty, "Command failed. Port %d is a load-sharing group member, but not the master. Please input master port number.\r\n", portno);
return -1;
}
}END_PARSE_PORT_LIST();
BEGIN_PARSE_PORT_LIST(argv[2],portno)
{
p = br_get_port_byno(portno);
if(!p)
{
vty_out(vty, "Port not exist. \r\n");
return -1;
}
if(p->flags & PortFlagTrunkMaster)
{
int i, groupno;
groupno = p->trunkgroupindex;
for(i=0; i<trunk[groupno].memnum; i++)
{
portno = trunk[groupno].member[i];
p = br_get_port_byno(portno);
if(action)
vlan_del_port(v,p,tagged,vty);
else
vlan_add_port(v, p, tagged,vty);
}
}
else
{
if(action)
vlan_del_port(v,p,tagged,vty);
else
vlan_add_port(v, p, tagged,vty);
}
}END_PARSE_PORT_LIST();
return 1;
}
/******************************************************************************
* VLAN CLI 5 Implementaion
* Syntax: delete vlan <name>
* 语义:删除名字为name的VLAN
*******************************************************************************/
int ConfigDeleteVlan(const char *name,struct vty* vty)
{
struct _vlanentry * v;
/* default vlan not allow to delete */
if(!strcmp("default",name))
{
vty_out(vty,"Default vlan not allowed to delete.\r\n");
return -1;
}
v = vlan_get_by_name(name);
if((!v) ||(v->flag & VlanFlagPseduo))
{
vty_out(vty,"Vlan %s not exist,can't delete\r\n",name);
return -1;
}
if(!(v->flag & VlanFlagSub))
{
int res;
/* 首先判断该VLAN是否还有子VLAN,如果还存在,则不能直接删除*/
if(res = vlan_exist_sub_vlan(v))
{
if(res == 2)
{
vty_out(vty,"Vlan %s still have configed static mac addr,can't delete directly.\r\n",name);
}else{
vty_out(vty,"Vlan %s still have sub vlan,can't delete directly.\r\n",name);
}
return -1;
}
}
vlan_destrory(v);
return 0;
}
/******************************************************************************
* VLAN CLI 6 Implementaion
* Syntax: show vlan {<name>}*1
* 语义:显示VLAN信息,缺省值为all
*******************************************************************************/
int ShowVlan(const char *name,struct vty *vty)
{
short i;
struct _vlanentry * v;
if(name == NULL)
{
BEGIN_PARSE_VLAN(i)
{
vlan_show(&vlan[i], vty);
}END_PARSE_VLAN(i)
}
else
{
v = vlan_get_by_name(name);
if(!v)
{
vty_out(vty,"Vlan %s not exist. \r\n",name);
return -1;
}
vlan_show(v, vty);
}
return 0;
}
/***************************************************************************
*
* Vlan CLI Initialize Part
*
****************************************************************************/
int vlan_cmd_init()
{
/* VLAN CLI */
install_element(VIEW_NODE,&ShowVlan_CMD);
install_element(VIEW_NODE,&ShowDot1q_CMD);
#ifdef _Test_Debug_
install_element(CONFIG_NODE,&ShowCompileTime_CMD);
#endif
install_element(CONFIG_NODE,&ShowDot1q_CMD);
install_element(CONFIG_NODE,&ConfigCreateVlan_CMD);
install_element(CONFIG_NODE,&ConfigDot1q_CMD);
install_element(CONFIG_NODE,&ConfigVlanIpAddr_CMD);
install_element(CONFIG_NODE,&ConfigVlanIpAddrMask_CMD);
/*
install_element(CONFIG_NODE,&NoVlanIpAddr_CMD);
*/
install_element(CONFIG_NODE,&ConfigVlanTag_CMD);
install_element(CONFIG_NODE,&ConfigVlanPort_CMD);
install_element(CONFIG_NODE,&ShowVlan_CMD);
install_element(CONFIG_NODE,&DeleteVlan_CMD);
};
void vlan_showrun(struct vty * vty)
{
short index,i ;
#ifdef _FLEX_HAMMER_
char tagportlist[100],untagportlist[100];
#endif
char *cp,*sp;
struct net_bridge_port * p;
#ifdef _BIG_HAMMER_
char tagportlist[1024],untagportlist[1024];
short slot=0,slot_port = 0;
short tagportno[MAXPortNum],untagportno[MAXPortNum];
#endif
vty_out(vty,"!vlan config -------------------------------------------------\r\n\r\n");
if(ethertype != 0x8100)
{
vty_out(vty,"config dot1q ethertype %x \r\n",ethertype);
}
BEGIN_PARSE_VLAN(index)
{
if(!(vlan[index].flag & VlanFlagPseduo))
{
/* create vlan <name> */
if(strcmp(vlan[index].name,"default"))
vty_out(vty,"create vlan %s \r\n",vlan[index].name);
/* config vlan <name> tag <1-2047> */
if(vlan[index].flag & VlanFlagTagged)
vty_out(vty,"config vlan %s tag %d \r\n",vlan[index].name,vlan[index].VID);
/* config vlan <name> ipaddress <A.B.C.D> [<1-32>|<A.B.C.D>] */
if((vlan[index].ipaddr !=0) && (vlan[index].masklen != 0))
{
char ipaddrstr[20];
char strMask[20];
unsigned int mask;
get_ipdotstring_from_long(ipaddrstr,vlan[index].ipaddr);
mask = get_long_from_masklen(vlan[index].masklen);
get_ipdotstring_from_long(strMask,mask);
vty_out(vty,"config vlan %s ipaddress %s %s \r\n",vlan[index].name,ipaddrstr,strMask);
}
if(strcmp(vlan[index].name,"default"))
{
#ifdef _FLEX_HAMMER_
memset(tagportlist,0,101);
memset(untagportlist,0,101);
#endif
#ifdef _BIG_HAMMER_
memset(tagportlist,0,1024);
memset(untagportlist,0,1024);
memset((char*)tagportno,0,MAXPortNum*sizeof(short));
memset((char*)untagportno,0,MAXPortNum*sizeof(short));
#endif
/*config vlan <name> [add|delete] port <portlist> [tagged|untagged] */
cp = tagportlist;
sp = untagportlist;
for(i = 1;i < MAXPortNum+1;i++)
{
p = br_get_port_byno(i);
if(!p)
continue;
if((p->flags & PortFlagTrunked) &&(!(p->flags & PortFlagTrunkMaster)))
continue;
switch(vlan_port_relation(i,&vlan[index]))
{
#ifdef _FLEX_HAMMER_
case 1:
if(cp != tagportlist)
{
sprintf(cp,",%d",i);
if(i>=100)
{
cp = cp+4;
}
else
{
if(i>=10)
{
cp = cp +3;
}
else
{
cp = cp+2;
}
}
}
else
{
sprintf(cp,"%d",i);
if(i>=100)
{
cp = cp+3;
}
else
{
if(i>=10)
{
cp = cp +2;
}
else
{
cp = cp+1;
}
}
}
break;
case 2:
if(sp != untagportlist)
{
sprintf(sp,",%d",i);
if(i >= 100)
{
sp = sp+4;
}
else
{
if(i >= 10)
{
sp = sp +3;
}
else
{
sp = sp+2;
}
}
}
else
{
sprintf(sp,"%d",i);
if(i >= 100)
{
sp = sp+3;
}
else
{
if(i >= 10)
{
sp = sp +2;
}
else
{
sp = sp+1;
}
}
}
break;
#endif
#ifdef _BIG_HAMMER_
case 1:
tagportno[i-1] = 1;
break;
case 2:
untagportno[i-1] = 1;
break;
#endif
case 0:
default:
break;
}
}
#ifdef _BIG_HAMMER_
{
int m=0;
short begin=0,end=0;
short conti_flag = 0;
for(m=1;m<MAXPortNum+1;m++){
if(tagportno[m-1]){
if(!begin)
begin = m;
else if(m==begin+1){
conti_flag = 1;
}
}
else{
if(begin&&conti_flag){
if(cp != tagportlist){
cp+=sprintf(cp,",");
}
sml_port2slotport(begin,&slot,&slot_port);
cp+=sprintf(cp,"%d:%d-",slot,slot_port);
sml_port2slotport(m-1,&slot,&slot_port);
cp+=sprintf(cp,"%d:%d",slot,slot_port);
begin = 0;
conti_flag = 0;
}
else if(begin){
if(cp != tagportlist){
cp+=sprintf(cp,",");
}
sml_port2slotport(begin,&slot,&slot_port);
cp+=sprintf(cp,"%d:%d",slot,slot_port);
begin = 0;
conti_flag = 0;
}
}
}
if(begin&&conti_flag){
if(cp != tagportlist){
cp+=sprintf(cp,",");
}
sml_port2slotport(begin,&slot,&slot_port);
cp+=sprintf(cp,"%d:%d-",slot,slot_port);
sml_port2slotport(m-1,&slot,&slot_port);
cp+=sprintf(cp,"%d:%d",slot,slot_port);
}
else if(begin){
if(cp != tagportlist){
cp+=sprintf(cp,",");
}
sml_port2slotport(begin,&slot,&slot_port);
cp+=sprintf(cp,"%d:%d",slot,slot_port);
}
begin = 0;
conti_flag = 0;
for(m=1;m<MAXPortNum+1;m++){
if(untagportno[m-1]){
if(!begin)
begin = m;
else if(m==begin+1){
conti_flag = 1;
}
}
else{
if(begin&&conti_flag){
if(sp != untagportlist){
sp+=sprintf(sp,",");
}
sml_port2slotport(begin,&slot,&slot_port);
sp+=sprintf(sp,"%d:%d-",slot,slot_port);
sml_port2slotport(m-1,&slot,&slot_port);
sp+=sprintf(sp,"%d:%d",slot,slot_port);
begin = 0;
conti_flag = 0;
}
else if(begin){
if(sp != untagportlist){
sp+=sprintf(sp,",");
}
sml_port2slotport(begin,&slot,&slot_port);
sp+=sprintf(sp,"%d:%d",slot,slot_port);
begin = 0;
conti_flag = 0;
}
}
}
if(begin&&conti_flag){
if(sp != untagportlist){
sp+=sprintf(sp,",");
}
sml_port2slotport(begin,&slot,&slot_port);
sp+=sprintf(sp,"%d:%d-",slot,slot_port);
sml_port2slotport(m-1,&slot,&slot_port);
sp+=sprintf(sp,"%d:%d",slot,slot_port);
}
else if(begin){
if(sp != untagportlist){
sp+=sprintf(sp,",");
}
sml_port2slotport(begin,&slot,&slot_port);
sp+=sprintf(sp,"%d:%d",slot,slot_port);
}
}
#endif
if(cp != tagportlist)
vty_out(vty,"config vlan %s add port %s tagged \r\n",vlan[index].name,tagportlist);
if(sp != untagportlist)
vty_out(vty,"config vlan %s add port %s untagged \r\n",vlan[index].name,untagportlist);
}
}
}END_PARSE_VLAN(index)
vty_out(vty,"\r\n");
}
struct cl_cmd_module vlan_cmd_module;
char vlan_cmd_module_name[] = "vlan";
int vlan_cmd_module_init()
{
bzero((char *)&vlan_cmd_module,sizeof(struct cl_cmd_module));
vlan_cmd_module.module_name = (char *)vlan_cmd_module_name;
vlan_cmd_module.init_func = vlan_cmd_init;
vlan_cmd_module.showrun_func = vlan_showrun;
vlan_cmd_module.next = NULL;
vlan_cmd_module.prev = NULL;
cl_install_module(&vlan_cmd_module);
};
#ifdef _cplusplus
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -