⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vlan_cli.c

📁 hammer-os vlan的部分代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************
*	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 + -