对于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不在第一串中
}