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

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

?? bootpdip.c

?? 這是新華龍(www.xhl.xom.xn)開發的
?? C
?? 第 1 頁 / 共 2 頁
字號:
	dr->dr_raddr = da;	/* Verify this address next time around. */
	dr->dr_rtime = time(NULL);
}


/*
 * Fill the reclaimation list from the used list.  Take addresses off the head
 * of the used queue until the reclaim queue is full, the used queue is empty,
 * or the address at the head of the used queue has been verified (responded
 * to an ARP) within dr_time_addrretry tocks.
 */
static int
da_fill_reclaim(dr)
struct drange_desc *dr;
{
        struct daddr *da;
        long now;

        now = time(NULL);

        while(dr->dr_rcount < RECLAIM_QUEUE_MAX){
		/* Look at first address on used queue. */
                da = (struct daddr *) dr->dr_usedq.head;
                if(da == NULL)
			return 0;    /* If used queue is empty, done filling. */
                if(now - da->da_time < dr->dr_time_addrretry)
                        return 0;

		/* If the first element has responded to in ARP recently.
		 * I am done filling.
		 */
		/* Get first address on used queue. */
                da = (struct daddr *) q_dequeue(&dr->dr_usedq);
		/* Mark time addr put in reclaim queue. */
                da->da_time = now;
		/* Put it at end of reclaim queue. */
                q_enqueue(&dr->dr_reclaimq,(struct q_elt *)da);
                ++dr->dr_rcount;
        }
        return 0;
}


/*
 * Address assignment routines.
 */

/*
 * Assign an address.
 */
int
da_assign(iface, hwaddr, ipaddr)
struct iface *iface;	/* -> Pointer to lnet struct of net on which to assign addr. */
uint8	*hwaddr;	/* -> Pointer to hardware address of hosts. */
int32	*ipaddr;	/* <- Address assigned to host. */
{
	struct drange_desc *dr;	
	struct daddr *da;	
	int status;
	struct arp_type	*at;

	/* Find the network table */
	for(dr = (struct drange_desc *) rtabq.head; dr != NULL; dr = dr->dr_next){
		if(iface == dr->dr_iface)
			break;	
	}

	if(dr == NULL){
		*ipaddr = 0;
		return ERR_NOIPADDRESS;
	}

	/* If this host had an address assigned previously, try to reassign
	 * that. If no previous address, assign a new one.
	 */
	status = da_get_old_addr(dr, hwaddr, &da);
	if(status != 0) 
		status = da_get_free_addr(dr, &da);
	
	/* If I got an address, assign it and link it in to the use list. */
	if(status == 0){
		memcpy(da->da_hwaddr, hwaddr, dr->dr_hwaddrlen);
		*ipaddr = da->da_addr;
		da->da_time = time(NULL);	/* Time assigned */
		q_enqueue(&dr->dr_usedq,(struct q_elt *)da);
		at = &Arp_type[dr->dr_iface->iftype->type];
		bp_log("IP addr %s assigned to %s on network %s\n",
		 inet_ntoa(*ipaddr),
		 (*at->format)(bp_ascii, hwaddr), dr->dr_iface->name);
	}

        switch(dr->dr_rstate){
        case R_OFF:
        case R_DONE:
                if(dr->dr_fcount <= dr->dr_thon) 
			da_enter_reclaim(dr);
                /* Fall through. */
        case R_RECLAIM:
                if(dr->dr_fcount <= dr->dr_thcritical) 
			da_enter_critical(dr);
                break;
        /* case R_CRITICAL: is not handled. */
        }
        return status;
}


/*
 * Enter the reclaimation state.
 */
static void
da_enter_reclaim(dr)
struct drange_desc *dr;
{
        char ipa[16], ipb[16];

        iptoa(dr->dr_start, ipa);
        iptoa(dr->dr_end, ipb);

        if(dr->dr_rstate & R_OFF){
                dr->dr_vstate = V_SWAIT;  /* da_enter_reclaim: R_OFF */
                dr->dr_rtime = 0;
        }
        dr->dr_rstate = R_RECLAIM;
        dr->dr_time_addrretry = TIME_ADDRRETRY;         /* Wait a while before retrying addresses. */
}

/*
 * Search for hwaddr on the used list, the reclaimation list, and the free list.
 */
static int
da_get_free_addr(dr, dap)
struct drange_desc *dr;
struct daddr **dap;
{
        *dap = (struct daddr *) q_dequeue(&(dr->dr_freeq));
        if(*dap == NULL) 
		return ERR_NOIPADDRESS;
        --dr->dr_fcount;

        return 0;
}

/*
 * Search for hwaddr on the used list, the reclaimation list, and the free list.
 */
static int
da_get_old_addr(dr, hwaddr, dap)
struct drange_desc *dr;
uint8  	*hwaddr;
struct daddr **dap;
{
        struct daddr *da;

	/* Search the used queue */
        for(da = (struct daddr *) dr->dr_usedq.head; da != NULL; da = da->da_next){
                if(memcmp(da->da_hwaddr, hwaddr, dr->dr_hwaddrlen) == 0){
                        q_remove(&dr->dr_usedq,(struct q_elt *)da);
                        *dap = da;
                        return 0;
                }
        }

	/* Search the relaimq queue */
        for(da = (struct daddr *) dr->dr_reclaimq.head; da != NULL; 
		da = da->da_next){
                if(memcmp(da->da_hwaddr, hwaddr, dr->dr_hwaddrlen) == 0){
                        /* Here is the address.  I have to be carefull in removing it from
			 * reclaim queue, I may be verifying this address.
                         * If I am, I have to fix up the pointers before removing this
                         * element.
                         */
                        if((dr->dr_rstate & R_OFF) == 0 && dr->dr_vstate == V_VERIFY 
				&& dr->dr_raddr == da){ 
				/* I am verifying this very address.  */
                                /* Start over.  
				 * This should happen very infrequently at most. */
                                dr->dr_vstate = V_SWAIT;  /* get_old_addr */
                        }
                        q_remove(&dr->dr_reclaimq,(struct q_elt *)da);
                        *dap = da;
                        return 0;
                }
        }

	/* Search the free queue */
        for(da = (struct daddr *) dr->dr_freeq.head; da != NULL; da = da->da_next){
                if(memcmp(da->da_hwaddr, hwaddr, dr->dr_hwaddrlen) == 0){
                        q_remove(&dr->dr_freeq,(struct q_elt *)da);
                        --dr->dr_fcount;
                        *dap = da;
                        return 0;
                }
        }
        return ERR_NOIPADDRESS;
}

#ifdef	notdef
static void
dprint_dr_record(dr)
struct drange_desc *dr;
{
        bp_log("Queue link   x%lx\n", dr->dr_next);
        bp_log("Pointer to network information         x%lx\n", dr->dr_iface);
        bp_log("First IP address in range              x%lx\n", dr->dr_start);
        bp_log("Last IP address in range               x%lx\n", dr->dr_end);
        bp_log("Number of IP addresses in range        %d\n", dr->dr_acount);
        bp_log("Number of IP addresses in free         %d\n", dr->dr_fcount);
        bp_log("Number of IP addresses on reclaimation queue %d\n", 
		dr->dr_rcount);
        bp_log("Threshold for turning on reclaimation  %d\n", dr->dr_thon);
        bp_log("Threshold for critical reclaimation    %d\n", dr->dr_thcritical);
        bp_log("Threshold for turning off reclaimation %d\n", dr->dr_thoff);
        bp_log("Time to wait before retrying addresses %ld\n", 
		dr->dr_time_addrretry);
        bp_log("Length of hardware address             %d\n", dr->dr_hwaddrlen);
        bp_log("Reclaimation state                     %d\n",(int)dr->dr_rstate);
        bp_log("Verification state                     %d\n",(int)dr->dr_vstate);
        bp_log("Time stamp for reclaimation            %ld\n", dr->dr_rtime);
        bp_log("Address being verified                 x%lx\n", dr->dr_raddr);
        bp_log("Pointer to table of addresses          x%lx\n", dr->dr_table);
        bp_log("uesdq x%lx  reclaimq                   x%lx  freeq x%lx\n", dr->dr_usedq, 
		dr->dr_reclaimq, dr->dr_freeq);
}
#endif


/*
 * Enter the critical reclaimation state.
 */
static void
da_enter_critical(dr)
struct drange_desc *dr;
{
        char ipa[16], ipb[16];
	char *ipc;

	ipc = inet_ntoa(dr->dr_start);
	strcpy(ipa, ipc);
	ipc = inet_ntoa(dr->dr_end);
	strcpy(ipb, ipc);

        if((dr->dr_rstate & R_OFF) == 0){
                dr->dr_vstate = V_SWAIT;	/* Enter critical, & R_OFF */
                dr->dr_rtime = 0;
        }
        dr->dr_rstate = R_CRITICAL;
        dr->dr_time_addrretry = 0;      /* Retry addresses as fast as possible. */
}

/*
 * Initialization	
 */
/*
 * Initialize the Dynamic address assignment module.
 */
int
da_init()
{
        q_init(&rtabq);
        return 0;
}

/*
 * Begin dynamic address service for a network.
 */
int
da_serve_net(iface, rstart, rend)
struct iface *iface;		/* Pointer to lnet record. */
int32 rstart;			/* First address in range. */
int32 rend;			/* Last address in range. */
{
	struct drange_desc *dr;	/* Pointer to the range descriptor. */
	struct daddr *da;	/* Pointer to an address structure. */
	int32 rcount;		/* Number of addresses range. */
	time_t now;		/* Current time. */
	uint16 i;
	char ipc[16], ipd[16];

        /* Find the network table */
        for(dr = (struct drange_desc *) rtabq.head; dr != NULL;
	 dr = dr->dr_next){
                if(iface == dr->dr_iface)
                        break;
        }

	
	if(dr == NULL){
		/* If there is no network table, allocate a new one
		 *
 		 * Allocate the memory I need.
 		 */
		dr = (struct drange_desc *) calloc(1, sizeof(*dr));
		if(dr == NULL) 
			return E_NOMEM;
	} else if((dr->dr_start != rstart) || (dr->dr_end != rend)) 
		/* If the range is different, create a new range */
		free(dr->dr_table);
	else
		return 0; /* There is no change, return */


	rcount = (rend - rstart) + 1;
	da = (struct daddr *) calloc(1,(sizeof (*da) + iface->iftype->hwalen) * rcount);
	if(da == NULL) 
		return E_NOMEM;

	/* 
	 * Got the memory, fill in the structures.
	 */
	dr->dr_iface = iface;
	dr->dr_start = rstart;
	dr->dr_end = rend;
	dr->dr_acount = rcount;
	dr->dr_fcount = 0;
	dr->dr_rcount = 0;
	dr->dr_thon = (rcount * THRESH_ON) / 100;
	dr->dr_thcritical = THRESH_CRITICAL;
	dr->dr_thoff = (rcount * THRESH_OFF) / 100;
	dr->dr_time_addrretry = 0;
        dr->dr_hwaddrlen = iface->iftype->hwalen;
	dr->dr_rstate = R_OFF;
	dr->dr_vstate = V_SWAIT;			/* Initialize */
	dr->dr_rtime = 0;
	dr->dr_raddr = NULL;
	dr->dr_table = da;

	/* 
	 * Fill in the table and link them all onto the used list.
	 */
	time(&now);
	for(i = 0, da = dr->dr_table; i < dr->dr_acount; ++i, da = da_getnext(dr, da)){
		da->da_addr = rstart++;
		da->da_time = 0;		/* Initiallize at 0, only here */
		q_enqueue(&dr->dr_usedq,(struct q_elt *)da);
	}
	/* and set up the timer stuff */
	if(rtabq.head == NULL){
		set_timer(&da_timer,TIME_RWAIT*1000L);
       		da_timer.func = da_runtask;
	       	da_timer.arg = (void *) 0;
		start_timer(&da_timer);
	}
	q_enqueue(&rtabq,(struct q_elt *)dr);
	da_enter_critical(dr);	/* Start reclaiming some of these addresses. */

	iptoa(dr->dr_start, ipc);
	iptoa(dr->dr_end, ipd);
	bp_log("DynamicIP range: %s - %s\n", ipc, ipd);
	return 0;
}


/*
 * Routines to implement a simple forward linked queue.
 */

/*
 *      q_init()
 *      Initialize simple Q descriptor
 */
static void
q_init(queue)
struct q *queue;
{
        queue->head = 0;
        queue->tail = 0;
}


/*
 *      q_enqueue()
 *              Enqueue an element in a simple Q.
 */
void
q_enqueue(queue, elem)
struct q *queue;
struct q_elt *elem;
{
        struct q_elt *last;

        if(queue->tail != NULL){  /* If not empty Q... */
                last = (struct q_elt *) queue->tail;
                last->next = elem;
        }
        else
		queue->head = (char *) elem;

        queue->tail = (char *) elem;
        elem->next = NULL;
}


/*
 *      q_dequeue       ()
 *      Pull an element off of the head of a Q.
 */
struct q_elt *
q_dequeue(queue)
struct q *queue;
{
        struct q_elt *elem;

        if(queue->head == NULL)
		return NULL; /* return NULL when empty Q */
        elem = (struct q_elt *) queue->head;
        queue->head = (char *) elem->next;
        elem->next = NULL;
        if(queue->head == NULL)
		queue->tail = NULL;
        return elem;
}


/*
 *      Remove an element from the middle of a queue.  Note that
 *      there is no mutex here, so this shouldn't be used on
 *      critical Qs
 */

static int
q_remove(source_queue, qel)
struct q *source_queue;
struct q_elt *qel;
{
        struct q_elt *prev, *e;

        /*   Case : removing first in Q */

        if(qel == (struct q_elt *) source_queue->head){
                source_queue->head = (char *)qel->next;  /* trying to remove first in queue... */
                if(source_queue->head == NULL)  	/* nothing left... */
                        source_queue->tail = NULL; 	/* blank out the Q */
                else if(source_queue->head == source_queue->tail){ /* One thing left */
                        e = (struct q_elt *) source_queue->head; /* As insurance, set it's next to NULL. */
                        e->next = NULL;
                }
                return 0;
        }

        /* find Q element before qel, so that we can link around qel */
        for(prev = (struct q_elt *) source_queue->head; prev->next != qel; prev = prev->next)
                if(prev == NULL)
                        return 1;

        /* Case : Removing last in Q */

        if(qel == (struct q_elt *) source_queue->tail){     /* trying to remove last one in queue... */
                prev->next = NULL;   /* there is a prev elt, since we return on first */
                source_queue->tail = (char *) prev;
                return 0;
        }

        /*  else, removing a queue element in the middle...  */
        prev->next = qel->next;
        return 0;
}

/*
 * Support Routines
 */

static void
iptoa(ipaddr, ipstr)
int32 ipaddr;
char ipstr[16];
{
	char *tmpStr;

	tmpStr = inet_ntoa(ipaddr);
	strcpy(ipstr, tmpStr);
}


#ifdef	notdef
static  void
build_hex_string(fromstr, len, tostr)
char *fromstr; int  len;
char *tostr;
{
	int i;

	for(i=0; i < len; i++){
		sprintf(tostr, "%02x", fromstr[i]);
		tostr++;
		tostr++;
	}
	fromstr[len] = 0;
}
#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品日产卡一卡二卡麻豆| 午夜av一区二区| 国产福利电影一区二区三区| 精品国产成人在线影院| 另类小说一区二区三区| 久久综合九色综合97_久久久 | 午夜av一区二区三区| 欧美一区二区视频免费观看| 蜜臀精品一区二区三区在线观看 | 2023国产一二三区日本精品2022| 国产一区二区三区在线观看免费| 日本一区二区动态图| 91麻豆国产香蕉久久精品| 亚洲成人精品一区| 精品国产a毛片| 不卡视频免费播放| 亚洲国产成人av好男人在线观看| 亚洲美女屁股眼交| 蜜桃精品视频在线| 日韩免费视频一区二区| 国产乱码精品一区二区三区五月婷| 精品噜噜噜噜久久久久久久久试看| 国产精品一区二区91| 亚洲欧美一区二区三区孕妇| 51久久夜色精品国产麻豆| 国产精品99久久久久久久女警| 亚洲免费观看视频| 欧美一区二区三区在线电影| 成人精品视频一区二区三区| 亚洲第一成人在线| 久久综合久久综合九色| 欧洲精品一区二区| 国产精品亚洲第一区在线暖暖韩国 | 韩国精品久久久| 26uuu亚洲| 色综合av在线| 久久99热99| 亚洲精品乱码久久久久久黑人| 日韩欧美中文字幕精品| 一本到不卡免费一区二区| 免费成人av在线| 亚洲男同1069视频| 久久久777精品电影网影网| 欧美日韩中文一区| 波多野结衣在线一区| 久久99最新地址| 午夜精品福利一区二区三区av | 91精品久久久久久蜜臀| 成人av网站免费观看| 日本成人在线不卡视频| 亚洲综合网站在线观看| 国产日韩精品一区二区三区| 91精品国产综合久久香蕉麻豆| 99久久国产免费看| 国产福利一区二区三区视频| 蜜桃av一区二区三区电影| 国产最新精品免费| 久久一二三国产| 3atv一区二区三区| 色8久久人人97超碰香蕉987| 国产美女一区二区| 老司机精品视频线观看86| 亚洲成av人片| 亚洲电影激情视频网站| 亚洲欧美偷拍卡通变态| 国产精品久久久久一区二区三区| 欧美不卡一区二区三区| 中文字幕一区二区三区蜜月| 久久久久久一二三区| 精品久久人人做人人爰| 欧美一区二区三区喷汁尤物| 欧美日本国产视频| 欧美乱妇一区二区三区不卡视频| 色综合久久久久网| 色婷婷av一区二区三区软件| 91片在线免费观看| 99麻豆久久久国产精品免费优播| 成人天堂资源www在线| 成人动漫在线一区| a4yy欧美一区二区三区| 99热这里都是精品| 色久优优欧美色久优优| 91成人免费网站| 欧美久久一二区| 99re热视频这里只精品| 免播放器亚洲一区| 日韩极品在线观看| 日日欢夜夜爽一区| 免费日韩伦理电影| 婷婷激情综合网| 美腿丝袜亚洲色图| 韩国av一区二区三区在线观看| 国产精品羞羞答答xxdd| 丁香婷婷综合五月| 一本色道a无线码一区v| 欧美调教femdomvk| 欧美成人综合网站| 中文字幕国产一区| 一级做a爱片久久| 日韩国产欧美在线播放| 国产在线不卡一区| 成人av在线播放网站| 欧美亚洲一区二区在线观看| 宅男噜噜噜66一区二区66| 欧美精品一区二区三区一线天视频| 久久久久久电影| 亚洲欧美日韩国产手机在线| 欧洲精品一区二区三区在线观看| 国产福利91精品一区| 成人黄色av电影| 欧洲另类一二三四区| 欧美成人性战久久| 日韩美女精品在线| 日韩国产精品久久久久久亚洲| 国产91露脸合集magnet| 欧美午夜在线一二页| 2014亚洲片线观看视频免费| 亚洲人快播电影网| 麻豆精品视频在线观看免费| av电影天堂一区二区在线观看| 欧美性三三影院| 久久久久国产精品麻豆ai换脸| 又紧又大又爽精品一区二区| 日本v片在线高清不卡在线观看| 成人综合在线网站| 欧美丰满少妇xxxxx高潮对白 | 久久综合九色综合欧美98| 中文字幕一区二区三区不卡| 免费高清视频精品| 色天使久久综合网天天| 精品国产污网站| 亚洲国产视频直播| 成人性生交大片免费看视频在线| 欧美福利一区二区| 伊人夜夜躁av伊人久久| 国产超碰在线一区| 日韩一区二区电影网| 亚洲美女屁股眼交3| 国产成人精品免费| 欧美videos中文字幕| 亚洲综合色区另类av| 国产91精品一区二区| 精品久久国产字幕高潮| 亚洲一区免费视频| av一区二区三区在线| 久久精品一区蜜桃臀影院| 日韩va亚洲va欧美va久久| 日本高清免费不卡视频| 国产精品午夜在线| 国产在线视视频有精品| 欧美一区欧美二区| 手机精品视频在线观看| 日本精品一级二级| 中文字幕一区二区三区乱码在线| 国内精品伊人久久久久av一坑| 制服丝袜亚洲网站| 亚洲h动漫在线| 欧美在线观看视频一区二区三区| 一色桃子久久精品亚洲| 成人不卡免费av| 亚洲国产精品成人综合色在线婷婷| 久久激情五月婷婷| 欧美成人a在线| 久久成人av少妇免费| 欧美一级片在线观看| 日韩avvvv在线播放| 欧美精品乱人伦久久久久久| 亚洲不卡av一区二区三区| 在线观看网站黄不卡| 亚洲一区二区三区激情| 欧美影片第一页| 亚洲国产一区二区三区青草影视| 色噜噜狠狠成人中文综合| 一区二区三区四区不卡在线| 在线观看日韩高清av| 亚洲一线二线三线久久久| 欧美中文一区二区三区| 亚洲国产成人porn| 日韩欧美一区电影| 国产尤物一区二区| 国产精品美女久久福利网站| www.综合网.com| 一区二区在线电影| 欧美日韩夫妻久久| 久久99最新地址| 久久久久99精品国产片| 成人动漫一区二区三区| 亚洲男帅同性gay1069| 欧美精品在欧美一区二区少妇| 日韩av电影免费观看高清完整版在线观看| 91精品国产美女浴室洗澡无遮挡| 蜜臀91精品一区二区三区| 久久久久国产精品厨房| 91欧美一区二区| 日韩av在线播放中文字幕| 久久久久久久综合| 国产精品视频观看| 国产精品区一区二区三区| 91麻豆福利精品推荐| 亚洲成人午夜电影|