亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? vlan.c

?? 模擬vlan的環境,可以創建端口, 刪除vlan 等操作,
?? C
字號:

/* 
 * vlan.c
 * Original Author:  zhough@ruijie.com.cn 2007-8-30  
 * Vlan相關的操作函數的定義
 */

#include<stdio.h>
#include "vlan.h"

static struct vlan_t  *vlan_table[HASH_SIZE_VLAN];      /* vlan表*/

static int vlan_cnt;        /* 已建立的vlan數目 */



struct vlan_t * create_vlan(int vid, char *name);
struct vlan_t * vid_to_vlan(int vid);
static int  hash_vlan(int id);
 void insert_to_vlan_table( struct vlan_t *vlan,int vid);
 char * strdup(char *s);

void del_port_from_vlan(int vid, int pid);
void  destory_vlan(int vid);

 void delete_vlan_from_port_table(  int vid);
 
static struct port_t * port_table[HASH_SIZE_PORT];     /* port表*/
static int max_port_num;        /* 最大port數目 */
static int phy_port_cnt;           /* 已添加的port數目 */


/* 
 * 初始化vlan表
 */
void  init_vlan(void)
{
    int i;

    vlan_cnt = 0;
    for (i = 0; i < HASH_SIZE_VLAN; i++)
    {
        vlan_table[i] = NULL;
    }

    create_vlan(DEFAULT_VLAN, "Vlan0");/* 系統默認創建vlan1 */
}


/* 
 * @vid: vlan的id
 * @name:vlan的名字
 *
 * 根據vid和vlan的名字創建一個vlan, 如果創建成功則返回創建好的vlan, 否則返回空
 */
struct vlan_t * create_vlan(int vid, char *name)
{
    int index;
    struct vlan_t *vlan;
	int port_number_count=0;
    
    if (vid <=0 || vid > 4095)
    {   
        printf("invalid vid %d  \n", vid);
        return NULL;
    }
    if (vlan_cnt >= VLAN_NUM)
    {
        printf("can't create more vlan \n");
        return NULL;
    }
   
    vlan = vid_to_vlan(vid);
    if (vlan)
        return vlan; /* 如果已經存在就直接返回 */

    vlan = (struct vlan_t *)malloc(sizeof(struct vlan_t));
    if (!vlan)
    {
        printf("Cannot allocate memory \n");
        return NULL;
    }

	 for(port_number_count=0 ;port_number_count<PORT_NUM;port_number_count++)
	 	      vlan->same_vlan_port_table[port_number_count]=NULL;
   
    vlan->vid = vid;
    vlan->name = strdup(name);
    vlan->next=NULL;
   
	 insert_to_vlan_table(vlan, vid);
   
    vlan_cnt++;
    return vlan;
}



/* 
 * @vid: vlan的id
 *
 * 根據vid查找vlan,如果存在這個vlan, 返回一個vlan結構, 否則返回空
 */
struct vlan_t * vid_to_vlan(int vid)
{
    struct vlan_t *vlan_begin;
   
    int index;

    if (vid <= 0 || vid > 4095)
    {
        printf("invalid vid %d \n", vid);
        return NULL;
    }

    index = hash_vlan(vid);

    vlan_begin=vlan_table[index];
	if(vlan_begin==NULL)
		{ 
		   printf("can't find  vid %d \n", vid);
		   return NULL ;
		}
   
    else
    	{  
	   while(vlan_begin !=NULL)
		{
		     if(vlan_begin->vid==vid)
		   	 return vlan_begin;
			else
			vlan_begin=vlan_begin->next;
		  }
		   printf("can't find  vid %d \n", vid);
		   return NULL ;	   
    	}

}


/* 
 * @id: vlan的ID
 *
 * 根據id取哈希表vlan的索引
 * 返回哈希表的索引
 */
static int  hash_vlan(int id)
{

 /* 采用簡單的取余法*/
    return id & HASH_MASK_VLAN;
}
   

/* 
 * @id: vlan的ID
 * @vlan: the pointer to the vlan node   
 * 根據id取哈希表vlan的索引
 * 返回哈希表的索引
 */
 void insert_to_vlan_table( struct vlan_t *vlan,int vid)
 {
    struct vlan_t *vlan_begin;
   
    int index;

	index = hash_vlan(vid);

    vlan_begin=vlan_table[index];
	if(vlan_begin==NULL)
	 { 
	   vlan_table[index]=vlan;
	   return  ;
	}
   
    else
    	{  
	   vlan_table[index]=vlan;
	   vlan->next=vlan_begin;
	  return  ;	   
    	}

 }


/* 
 * @max_port_number: 最大port數目,由系統檢測出并傳遞過來
 *
 * 初始化port表
 */
void init_port()
{
    int i;

    max_port_num=PORT_NUM;
    phy_port_cnt = 0;

    for (i = 0; i < HASH_SIZE_PORT; i++)
    {
        port_table[i] = NULL;
    }
	
}

/* 
 * @s: 字符串指針
 *
 * 將字符串s的內容拷貝到一個新的地方, 返回新的字符串地址
 */
 char * strdup(char *s)
{
    char *p;
    p = (char *) malloc(strlen(s)+1); /* +1 for '\0' */
    if (p != NULL)
        strcpy(p, s);
    
    return p;
}


/* 
 * @pid: port的id
 *
 * 根據pid查找port,如果存在這個port,返回一個port結構,否則返回空
 */
struct port_t *  pid_to_port(int pid)
{
    struct port_t *port_begin;
   
    int index;

    if (pid < 0 || (pid >= 512 && pid < 2048) || pid >= 2175)
    {
        printf("invalid pid %d \n", pid);
        return NULL;
    }

    index = hash_port(pid);
   
    port_begin=port_table[index];
	if(port_begin==NULL)
	{ 
          printf("can't find  pid  %d  \n", pid);
	  return NULL ;
	}
   
    else
    	{  
           while(port_begin !=NULL)
	     {
	       if(port_begin->pid==pid)
		   return port_begin;
		else
		  port_begin=port_begin->next;
	    }
		printf("can't find  pid  %d \n", pid);
		return NULL ;	   
    	}
    return NULL;
}



/* 
 * @pid: port的id
 * @speed: port的速度
 * @duplex: 是否支持雙工
 *
 * 添加一個port到port表中,如果添加成功則返回創建好的port, 否則返回空
 */
struct port_t * add_port(int pid, int speed, int duplex)
{
    int index;
    struct port_t *port;
	 struct port_t *port_begin;
    int i;
 
    if (pid < 0 || (pid >= 512 && pid < 2048) || pid >= 2175)
    {
        printf("invalid pid %d \n", pid);
        return NULL;
    }
	//printf("phy_port_cnt=%d,max_port_num=%d  \n",phy_port_cnt,max_port_num);
    if (phy_port_cnt >= max_port_num)
    {
        printf("can't add more port\n");
        return NULL;
    }

    port = pid_to_port(pid);
	
    if (port)
    	{
    	 printf("this port is exist already \n");
        return port;    /* 如果已存在直接返回 */

    	}	

    port = (struct port_t *)malloc(sizeof(struct port_t));
    if (!port)
    {
        printf("Cannot allocate memory  \n");
        return NULL;
    }
     for(i=0;i<VLAN_NUM;i++)
	 	port->same_port_vlan_table[i]=NULL;
	 
    
    port->pid = pid;
    port->speed = speed;
    port->duplex = duplex;
    port->next=NULL;
	
    /* 添加到port表中 */
    index = hash_port(pid);
    port_begin=port_table[index];

	printf("index=%d \n",index );
	if(port_begin==NULL)
		{ 
		   port_table[index]=port;
		      printf("port->pid=%d \n",port->pid);
		  
		}
   
    else
    	{  
		   port_table[index]=port;
		   port->next=port_begin;
		   printf("port->pid=%d \n",port->pid);
		     
    	}
    phy_port_cnt++;
   printf("port->pid=%d \n",port->pid);
    return port;
}


/* 
 * @id: port的ID
 *
 * 根據id取哈希表port的索引,返回哈希表的索引
 */
static int hash_port(int id)
{
/* 采用簡單的取余法*/
    return id & HASH_MASK_PORT;
}


/* 
 * @vid: vlan的id
 * @pid: port的id
 *
 * 將pid的port加入到vid的vlan, 如果加入成功就返回1,否則返回0
 */
int add_port_to_vlan(int vid, int pid)
{
    
    struct vlan_t *vlan;
    struct port_t *port;
    int index;
  
    if (pid < 0 || (pid >= 512 && pid < 2048) || pid >= 2175 
        || vid <= 0 || vid > 4095)
    {
        printf("invalid vid %d or pid %d \n", vid, pid);
        return 0;
    }

    if (is_contain(vid, pid))
        return 1;
   
    if ((vlan = vid_to_vlan(vid)) == NULL)
        if ((vlan = create_vlan(vid, "tmpvlan")) == NULL)
        {
            printf("can't create a new vlan %d\n", vid);
            return 0;
        }
    if ((port = pid_to_port(pid)) == NULL)
    {
        printf("port %d doesn't exists \n", pid);
        return 0;
    }

	 vlan->same_vlan_port_table[pid]=port;
	 return 1 ;
    
    
}


/* 
 * @vid: vlan的id
 * @pid: port的id
 *
 * 判斷pid的port是否屬于一個vid的vlan, 如果屬于就返回1, 否則返回0
 */
int is_contain(int vid, int pid)
{
     
    struct vlan_t *vlan_node;
    int index;

    if (pid < 0 || (pid >= 512 && pid < 2048) || pid >= 2175 
        || vid <= 0 || vid > 4095)
    {
        printf("invalid vid %d or pid %d \n", vid, pid);
        return 0;
    }
   
   vlan_node=vid_to_vlan(vid);
   if(vlan_node==NULL)
   	{
     	printf(" the vlan does not exist \n");
		return 0 ;
		
   	}
   if( vlan_node->same_vlan_port_table[pid]==NULL)
   	    return 0;
   else
   	      return 1;

}



void print_vlan(int vid )
{
  int vlan_row;
  int port_num;

 struct vlan_t  *  print ;

  print= vid_to_vlan(vid);
  if(print==NULL)
   	{
	   	 printf("no port inclueded \n");
		 return;
   	} 	
    
for(port_num=0;port_num<PORT_NUM;port_num++)
	{
	 printf("vlan=%d has the followed ports \n",vid);
	 printf("---------------------------------------\n");
	 if(print->same_vlan_port_table[port_num]!=NULL)
	 	{
	 	   printf("vid=%d, port=%d \n",print->vid ,port_num);
	 	} 
	 printf("---------------------------------------\n");
	}
	  print=print->next;
}




/* 
 * @vid: vlan的id
 * @pid: port的id
 *
 * 將pid的port從vid的vlan中刪除
 */
void del_port_from_vlan(int vid, int pid)
{
    struct vlan_t *vlan_node;
    struct port_t * port_node;
    int index_vlan;
	int index_port;

    if (pid < 0 || (pid >= 512 && pid < 2048) || pid >= 2175 
        || vid <= 0 || vid > 4095)
    {
        printf("invalid vid %d or pid %d\n", vid, pid);
        return;
    }
       
         vlan_node= vid_to_vlan(vid);
         port_node= pid_to_port( pid);
		 if((vlan_node!=NULL) &(port_node!=NULL) )
		 	{
				 vlan_node->same_vlan_port_table[pid]=NULL;
				 port_node->same_port_vlan_table[vid]=NULL;
				  return ;
		 	}
		 else
		 	{
		 	  printf("delete failure \n");
			  return ;
		 	}
}



/* 
 * @vid: vlan的id
 *
 * 根據vid刪除一個vlan
 */
void  destory_vlan(int vid)
{
    int index;
    int pid;
    struct vlan_t *vlan;
    struct vlan_t *vlan_begin;

    if (vid <= 1 || vid > 4095)
    {/* shouldn't destroy vlan1 */
        printf("invalid vid %d\n", vid);
        return;
    }

     vlan = vid_to_vlan(vid);
	 delete_vlan_from_port_table(vid);
     if(vlan)
     	{
	      index = hash_vlan(vid);
	      vlan_begin=vlan_table[index];
		   if(vlan_begin==vlan)
		   	 vlan_table[index]=NULL;
		   else
			{
				while(vlan_begin->next !=vlan)
			   	vlan=vlan->next;
				vlan_begin->next=vlan->next;
		        
		    	}
		    free(vlan);
			vlan = NULL;
	        vlan_cnt--;
     	}
    }




/* 
 * @vid: vlan的id
 *
 * 根據vid刪除一個vlan
 */
 void delete_vlan_from_port_table(  int vid)
{
      
    int index;
	int index_vlan_num;
	struct port_t * port ;
	  for (index=0 ; index<HASH_SIZE_PORT;index++)
	  	{
	  	       port =port_table[index];
			   while(port!=NULL)
			   	{
					port->same_port_vlan_table[vid]=NULL;
					port=port->next;
			   	}
	  	}
}



?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
蜜桃精品在线观看| 欧美日韩精品一区二区| 在线观看亚洲a| 久久网站最新地址| 亚洲va中文字幕| av影院午夜一区| 精品国产自在久精品国产| 亚洲天堂久久久久久久| 国产一区二区在线观看视频| 欧美性感一区二区三区| 国产日韩欧美综合在线| 精品一区在线看| 51午夜精品国产| 香蕉乱码成人久久天堂爱免费| 粉嫩av一区二区三区| 欧美成人高清电影在线| 性做久久久久久免费观看| 91在线免费看| 自拍偷自拍亚洲精品播放| 成人免费av在线| 中文字幕欧美三区| 成人综合婷婷国产精品久久蜜臀 | 亚洲一区av在线| 成人午夜电影网站| 精品不卡在线视频| 久久激情五月激情| 制服丝袜中文字幕亚洲| 午夜精品福利视频网站| 欧美日韩精品电影| 天堂影院一区二区| 欧美一区二区三区婷婷月色| 午夜欧美在线一二页| 欧美日韩中字一区| 石原莉奈在线亚洲三区| 日韩欧美国产三级| 国产真实乱子伦精品视频| 精品入口麻豆88视频| 黑人精品欧美一区二区蜜桃| 久久婷婷一区二区三区| 国产成人免费高清| 亚洲私人影院在线观看| 欧美午夜不卡视频| 青青草91视频| 久久免费美女视频| 99视频在线观看一区三区| 亚洲美女一区二区三区| 欧美日韩国产大片| 精品一区二区三区蜜桃| 久久精品欧美日韩精品| 色呦呦网站一区| 日韩有码一区二区三区| 26uuu亚洲| av在线不卡网| 婷婷久久综合九色综合伊人色| 日韩免费视频线观看| 高清不卡一区二区在线| 亚洲日本在线看| 91精品国产免费| 国产精品123| 亚洲一区二区三区国产| 亚洲精品一区二区三区精华液| av在线免费不卡| 久久精品av麻豆的观看方式| 国产精品美女久久久久高潮| 欧美三级一区二区| 国产美女精品一区二区三区| 亚洲男人天堂av| 精品女同一区二区| 色偷偷一区二区三区| 国产一区高清在线| 调教+趴+乳夹+国产+精品| 久久久国际精品| 91精品国产综合久久精品app| 国产一区久久久| 日韩电影在线看| 亚洲免费av高清| 国产日本欧美一区二区| 91精品国产综合久久精品| 91丨porny丨最新| 精品一区二区三区日韩| 亚洲成人激情av| 偷拍一区二区三区四区| 久久久久久一二三区| 欧美女孩性生活视频| 不卡的看片网站| 久久er精品视频| 亚洲午夜久久久久久久久电影院 | 国产成人免费xxxxxxxx| 亚洲成av人片一区二区梦乃| 欧美国产日韩精品免费观看| 91麻豆精品国产综合久久久久久| av在线播放一区二区三区| 国内成+人亚洲+欧美+综合在线| 亚洲第一成人在线| 亚洲精品视频免费看| 中文字幕中文字幕在线一区 | 精品国产亚洲在线| 在线观看视频91| 91影院在线观看| 成人午夜视频在线| 国产精品99久| 国产精品69毛片高清亚洲| 久久疯狂做爰流白浆xx| 日韩av一区二| 日韩成人av影视| 偷拍日韩校园综合在线| 亚洲国产欧美在线人成| 一区二区三区国产| 一区二区三区四区中文字幕| 亚洲同性gay激情无套| 亚洲色图清纯唯美| 亚洲女人小视频在线观看| 国产精品不卡一区| 亚洲柠檬福利资源导航| 最新热久久免费视频| 亚洲人成网站在线| 亚洲日本在线视频观看| 一区二区久久久久久| 亚洲精品视频在线看| 亚洲综合自拍偷拍| 亚洲成人久久影院| 日韩高清一级片| 国产一区二区三区四区五区美女| 久久er99热精品一区二区| 国产成人午夜精品影院观看视频| 国产精品一区久久久久| 成av人片一区二区| 欧美综合在线视频| 67194成人在线观看| 欧美大片顶级少妇| 国产日产精品一区| 亚洲欧美日韩在线不卡| 午夜久久久影院| 韩日欧美一区二区三区| a级精品国产片在线观看| 在线观看亚洲一区| 日韩精品一区二区三区老鸭窝| 久久精品一二三| 亚洲精品中文在线| 久久电影国产免费久久电影| 国产精品88av| 欧美日韩在线观看一区二区 | 成人a级免费电影| 欧美性大战久久| 久久亚洲精品国产精品紫薇 | 亚洲乱码一区二区三区在线观看| 亚洲欧美日韩中文播放 | 亚洲成人先锋电影| 国产伦精一区二区三区| 91九色02白丝porn| 精品国产乱子伦一区| 日韩美女精品在线| 久久精品国产亚洲高清剧情介绍| 成人美女视频在线观看| 欧美日韩精品久久久| 国产精品私人自拍| 麻豆成人免费电影| 欧美中文字幕一二三区视频| 欧美精品一区二区三区久久久| 亚洲精品第1页| 国产乱理伦片在线观看夜一区| 欧美亚洲动漫制服丝袜| 久久久午夜电影| 首页国产欧美久久| 99国产精品国产精品久久| 精品久久久影院| 亚洲小说春色综合另类电影| 成人免费观看视频| 久久女同精品一区二区| 日韩精品欧美精品| 色8久久精品久久久久久蜜| 久久久久国产精品麻豆| 石原莉奈在线亚洲三区| 日本韩国欧美一区二区三区| 国产免费久久精品| 韩日av一区二区| 91精品国产高清一区二区三区| 亚洲欧美色一区| bt欧美亚洲午夜电影天堂| 久久久久综合网| 国产在线视频精品一区| 日韩欧美在线不卡| 三级精品在线观看| 欧美精品自拍偷拍动漫精品| 亚洲影视在线观看| 色综合天天综合色综合av| 国产性做久久久久久| 国产在线精品不卡| 欧美成人综合网站| 人人精品人人爱| 日韩写真欧美这视频| 奇米精品一区二区三区在线观看| 欧美午夜一区二区| 亚洲综合精品自拍| 欧美日韩在线一区二区| 丝袜诱惑制服诱惑色一区在线观看 | 天天综合网天天综合色| 日本道免费精品一区二区三区| 国产精品福利影院| 91毛片在线观看|