如何检查第二串vlan是否在第一串中

对于vlan,比较特殊。内容是数字,或者数字范围。但是是用字符串来存储的,例如:"1-100,200,300-400"、"1000"、"200,300-500"。想要检测两串vlan是否重复,可以利用strtok()函数结合数组来处理。下面是一个例子:

//pvlan 是端口vlan的一些属性,例如范围,优先级,action,端口号port等等。
int ftr_check_vlan_range(FTR_PTP_EDIT_INFO *pvlan)
{
	char srcvlan[128] = {0};
	char destvlan[128] = {0};
	int port = 0;
	int portNum = 0; //需要比较的端口数量
	int ret = 1;	
	int i = 0;	

	port = pvlan->port;
	
	memset(srcvlan,0,128);
	memcpy(srcvlan,pvlan->tvlan.vlanRange,128);
	
	if (isEGBDevice())
	{
		portNum = 2; //EGB 1-2口需要比较
	}
	else if (isEGADevice())
	{
		portNum = 4; //EGA 1-4口需要比较
	}

	for(i = 0; i < portNum; i++)
	{	
		if(((port-1) == i) || (strlen(g_vlan_info[i].vlanRange) == 0))
		{
			continue;
		}
		else
		{
			memset(srcvlan,0,128);
			memset(destvlan,0,128);
			memcpy(srcvlan,pvlan->tvlan.vlanRange,128);
			memcpy(destvlan,g_vlan_info[i].vlanRange,128);
			ret = check_vlan_overlap(destvlan,srcvlan);
			if(g_cx_print_control & 0x1)
				printS("%s:%d ret:%d\n",__FUNCTION__,__LINE__,ret);
			if(1 == ret)
			{
				return TRUE;
			}
		}
	}
	
	return FALSE;
}

//检查第二串vlan是否在第一串中
int check_vlan_overlap(char* vlan_dest, char* vlan_src) 
{
    int vlan1[4095] = {0};
	int vlan2[4095] = {0};
	char* dash = NULL;    
	char* token = NULL;
	int vlan_id = 0;
	
	int start_id = 0;
	int end_id = 0;
	int i = 0;
	
    memset(vlan1, 0, sizeof(vlan1));
    memset(vlan2, 0, sizeof(vlan2));
    
	if(g_cx_print_control & 0x1)
		printS("%s:%d vlan_src:%s vlan_dest:%s\n",__FUNCTION__,__LINE__,vlan_src,vlan_dest);
	
    // 将第一串vlan的范围转换成数组
    token = strtok(vlan_dest, ",");
    while (token != NULL) 
	{
        dash = strstr(token, "-");
        if (dash == NULL)
		{
            vlan_id = atoi(token);
			if(g_cx_print_control & 0x1)
				printS("%s:%d vlan_id:%d\n",__FUNCTION__,__LINE__,vlan_id);
            vlan1[vlan_id] = 1;
        } 
		else 
		{
            *dash = '\0';
            start_id = atoi(token);
            end_id = atoi(dash+1);		
			if(g_cx_print_control & 0x1)
				printS("%s:%d start_id:%d end_id:%d\n",__FUNCTION__,__LINE__,start_id,end_id);
            for (i = start_id; i <= end_id; i++) 
			{
                vlan1[i] = 1;
            }
        }
        token = strtok(NULL, ",");
    }
    
    // 将第二串vlan的范围转换成数组
    token = strtok(vlan_src, ",");
    while (token != NULL) 
	{
        dash = strstr(token, "-");
        if (dash == NULL) 
		{
            vlan_id = atoi(token);
			if(g_cx_print_control & 0x1)
				printS("%s:%d vlan_id:%d\n",__FUNCTION__,__LINE__,vlan_id);
            vlan2[vlan_id] = 1;
        } else
		{
            *dash = '\0';
            start_id = atoi(token);
            end_id = atoi(dash+1);
			if(g_cx_print_control & 0x1)
				printS("%s:%d start_id:%d end_id:%d\n",__FUNCTION__,__LINE__,start_id,end_id);
            for (i = start_id; i <= end_id; i++) 
			{
                vlan2[i] = 1;
            }
        }
        token = strtok(NULL, ",");
    }
    
    // 检查第二串vlan是否在第一串中
    for (i = 1; i <= 4095; i++) 
	{
        if ((vlan2[i] == 1) && (vlan1[i] == 1)) 
		{
            return 1; // 第二串vlan在第一串中
        }
    }
    return 0; // 第二串vlan不在第一串中
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值