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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? arp.c

?? 很好的TCP_IP協(xié)議源代碼分析,很適用很好
?? C
字號(hào):
//* Address Resolution Protocol (ARP) functions. Sits between IP and
//* Level 2, mapping IP to Level 2 addresses for all outgoing datagrams.
#include "global.h"
#include "mbuf.h"
#include "timer.h"
#include "iface.h"
#include "enet.h"
#include "ax25.h"
#include "icmp.h"
#include "ip.h"
#include "arp.h"
#include "icmp.h"

static void arp_output(struct iface *iface,enum arp_hwtype hardware,int32 target);

/* Hash table headers */
struct arp_tab *Arp_tab[HASHMOD];

struct arp_stat Arp_stat;

//********************************************************************************
//* Resolve an IP address to a hardware address; if not found,initiate query
//* and return NULL.  If an address is returned, the interface driver may  
//* send the packet; if NULL is returned,res_arp() will have saved the packet 
//* on its pending queue,so no further action (like freeing the packet) is 
//* necessary.
uint8 * res_arp(
                 struct iface *iface,		/* Pointer to interface block */
                 enum   arp_hwtype hardware,	/* Hardware type */
                 int32  target,			/* Target IP address */
                 struct mbuf **bpp)		/* IP datagram to be queued if unresolved */                
{
	register struct arp_tab *arp;
	struct ip ip;

	if((arp = arp_lookup(hardware,target)) != NULL && arp->state == ARP_VALID)
		return arp->hw_addr;
	if(arp != NULL){
		/* Earlier packets are already pending, kick this one back
		 * as a source quench
		 */
		ntohip(&ip,bpp);
		icmp_output(&ip,*bpp,ICMP_QUENCH,0,NULL);
		free_p(bpp);
	} else {
		/* Create an entry and put the datagram on the
		 * queue pending an answer
		 */
		arp = arp_add(target,hardware,NULL,0);
		enqueue(&arp->pending,bpp);
		arp_output(iface,hardware,target);
	}
	return NULL;
}
/* Handle incoming ARP packets. This is almost a direct implementation of
 * the algorithm on page 5 of RFC 826, except for:
 * 1. Outgoing datagrams to unresolved addresses are kept on a queue
 *    pending a reply to our ARP request.
 * 2. The names of the fields in the ARP packet were made more mnemonic.
 * 3. Requests for IP addresses listed in our table as "published" are
 *    responded to, even if the address is not our own.
 */
void
arp_input(
struct iface *iface,
struct mbuf **bpp
){
	struct arp arp;
	struct arp_tab *ap;
	struct arp_type *at;
	int i;
	
	Arp_stat.recv++;
	if(ntoharp(&arp,bpp) == -1)	/* Convert into host format */
		return;
	if(arp.hardware >= NHWTYPES){
		/* Unknown hardware type, ignore */
		Arp_stat.badtype++;
		return;
	}
	at = &Arp_type[arp.hardware];
	if(arp.protocol != at->iptype){
		/* Unsupported protocol type, ignore */
		Arp_stat.badtype++;
		return;
	}
	if(arp.hwalen > MAXHWALEN || arp.pralen != sizeof(int32)){
		/* Incorrect protocol addr length (different hw addr lengths
		 * are OK since AX.25 addresses can be of variable length)
		 */
		Arp_stat.badlen++;
		return;
	}
	if(memcmp(arp.shwaddr,at->bdcst,at->hwalen) == 0){
		/* This guy is trying to say he's got the broadcast address! */
		Arp_stat.badaddr++;
		return;
	}
	/* If this guy is already in the table, update its entry
	 * unless it's a manual entry (noted by the lack of a timer)
	 */
	ap = NULL;	/* ap plays the role of merge_flag in the spec */
	if((ap = arp_lookup(arp.hardware,arp.sprotaddr)) != NULL
	 && dur_timer(&ap->timer) != 0){
		ap = arp_add(arp.sprotaddr,arp.hardware,arp.shwaddr,0);
	}
	/* See if we're the address they're looking for */
	if(ismyaddr(arp.tprotaddr) != NULL){
		if(ap == NULL)	/* Only if not already in the table */
			arp_add(arp.sprotaddr,arp.hardware,arp.shwaddr,0);

		if(arp.opcode == ARP_REQUEST){
			/* Swap sender's and target's (us) hardware and protocol
			 * fields, and send the packet back as a reply
			 */
			memcpy(arp.thwaddr,arp.shwaddr,(uint16)arp.hwalen);
			/* Mark the end of the sender's AX.25 address
			 * in case he didn't
			 */
			if(arp.hardware == ARP_AX25)
				arp.thwaddr[arp.hwalen-1] |= E;

			memcpy(arp.shwaddr,iface->hwaddr,at->hwalen);
			arp.tprotaddr = arp.sprotaddr;
			arp.sprotaddr = iface->addr;
			arp.opcode = ARP_REPLY;
			if((*bpp = htonarp(&arp)) == NULL)
				return;

			if(iface->forw != NULL)
				(*iface->forw->output)(iface->forw,
				 arp.thwaddr,iface->forw->hwaddr,at->arptype,bpp);
			else 
				(*iface->output)(iface,arp.thwaddr,
				 iface->hwaddr,at->arptype,bpp);
			Arp_stat.inreq++;
		} else {
			Arp_stat.replies++;
		}
	} else if(arp.opcode == ARP_REQUEST
	 && (ap = arp_lookup(arp.hardware,arp.tprotaddr)) != NULL
	 && ap->pub){
		/* Otherwise, respond if the guy he's looking for is
		 * published in our table.
		 */
		memcpy(arp.thwaddr,arp.shwaddr,(uint16)arp.hwalen);
		memcpy(arp.shwaddr,ap->hw_addr,at->hwalen);
		arp.tprotaddr = arp.sprotaddr;
		arp.sprotaddr = ap->ip_addr;
		arp.opcode = ARP_REPLY;
		if((*bpp = htonarp(&arp)) == NULL)
			return;
		if(iface->forw != NULL)
			(*iface->forw->output)(iface->forw,
			 arp.thwaddr,iface->forw->hwaddr,at->arptype,bpp);
		else 
			(*iface->output)(iface,arp.thwaddr,
			 iface->hwaddr,at->arptype,bpp);
		Arp_stat.inreq++;
	} else if(arp.opcode == REVARP_REQUEST){
		for(i=0;i<HASHMOD;i++)
			for(ap = Arp_tab[i];ap != NULL;ap = ap->next)
				if(memcmp(ap->hw_addr,arp.thwaddr,at->hwalen) == 0)
					goto found;
	found:	if(ap != NULL && ap->pub){
			memcpy(arp.shwaddr,iface->hwaddr,at->hwalen);
			arp.tprotaddr = ap->ip_addr;
			arp.sprotaddr = iface->addr;
			arp.opcode = REVARP_REPLY;
			if((*bpp = htonarp(&arp)) == NULL)
				return;
			if(iface->forw != NULL)
				(*iface->forw->output)(iface->forw,
				 arp.thwaddr,iface->forw->hwaddr,REVARP_TYPE,bpp);
			else 
				(*iface->output)(iface,arp.thwaddr,
				 iface->hwaddr,REVARP_TYPE,bpp);
			Arp_stat.inreq++;
		}
	}
}
/* Add an IP-addr / hardware-addr pair to the ARP table */
struct arp_tab *
arp_add(ipaddr,hardware,hw_addr,pub)
int32 ipaddr;			/* IP address, host order */
enum arp_hwtype hardware;	/* Hardware type */
uint8 *hw_addr;			/* Hardware address, if known; NULL otherwise */
int pub;			/* Publish this entry? */
{
	struct mbuf *bp;
	register struct arp_tab *ap;
	struct arp_type *at;
	unsigned hashval;

	if(hardware >=NHWTYPES)
		return NULL;	/* Invalid hardware type */
	at = &Arp_type[hardware];

	if((ap = arp_lookup(hardware,ipaddr)) == NULL){
		/* New entry */
		ap = (struct arp_tab *)callocw(1,sizeof(struct arp_tab));
		ap->hw_addr = mallocw(at->hwalen);
		ap->timer.func = arp_drop;
		ap->timer.arg = ap;
		ap->hardware = hardware;
		ap->ip_addr = ipaddr;

		/* Put on head of hash chain */
		hashval = hash_ip(ipaddr);
		ap->prev = NULL;
		ap->next = Arp_tab[hashval];
		Arp_tab[hashval] = ap;
		if(ap->next != NULL){
			ap->next->prev = ap;
		}
	}
	if(hw_addr == NULL){
		/* Await response */
		ap->state = ARP_PENDING;
		set_timer(&ap->timer,Arp_type[hardware].pendtime * 1000L);
	} else {
		/* Response has come in, update entry and run through queue */
		ap->state = ARP_VALID;
		set_timer(&ap->timer,ARPLIFE*1000L);
		memcpy(ap->hw_addr,hw_addr,at->hwalen);
		ap->pub = pub;
		while((bp = dequeue(&ap->pending)) != NULL)
			ip_route(NULL,&bp,0);
	}
	start_timer(&ap->timer);
	return ap;
}

/* Remove an entry from the ARP table */
void
arp_drop(p)
void *p;
{
	register struct arp_tab *ap;

	ap = (struct arp_tab *)p;
	if(ap == NULL)
		return;
	stop_timer(&ap->timer);	/* Shouldn't be necessary */
	if(ap->next != NULL)
		ap->next->prev = ap->prev;
	if(ap->prev != NULL)
		ap->prev->next = ap->next;
	else
		Arp_tab[hash_ip(ap->ip_addr)] = ap->next;
	free_q(&ap->pending);
	free(ap->hw_addr);
	free(ap);
}

/* Look up the given IP address in the ARP table */
struct arp_tab *
arp_lookup(hardware,ipaddr)
enum arp_hwtype hardware;
int32 ipaddr;
{
	register struct arp_tab *ap;

	for(ap = Arp_tab[hash_ip(ipaddr)]; ap != NULL; ap = ap->next){
		if(ap->ip_addr == ipaddr && ap->hardware == hardware)
			break;
	}
	return ap;
}
/* Send an ARP request to resolve IP address target_ip */
static void
arp_output(iface,hardware,target)
struct iface *iface;
enum arp_hwtype hardware;
int32 target;
{
	struct arp arp;
	struct mbuf *bp;
	struct arp_type *at;

	at = &Arp_type[hardware];
	if(iface->output == NULL)
		return;
	
	arp.hardware = hardware;
	arp.protocol = at->iptype;
	arp.hwalen = at->hwalen;
	arp.pralen = sizeof(int32);
	arp.opcode = ARP_REQUEST;
	memcpy(arp.shwaddr,iface->hwaddr,at->hwalen);
	arp.sprotaddr = iface->addr;
	memset(arp.thwaddr,0,at->hwalen);
	arp.tprotaddr = target;
	if((bp = htonarp(&arp)) == NULL)
		return;
	(*iface->output)(iface,at->bdcst,
		iface->hwaddr,at->arptype,&bp);
	Arp_stat.outreq++;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲国产精品成人综合| 777色狠狠一区二区三区| 国产女同性恋一区二区| 国产成人综合自拍| 欧美激情一区在线| 色综合久久综合网97色综合| 亚洲久本草在线中文字幕| 色婷婷av一区二区三区之一色屋| 亚洲欧洲一区二区三区| 日本丶国产丶欧美色综合| 亚洲国产精品嫩草影院| 欧美一级在线观看| 韩国av一区二区三区| 亚洲国产经典视频| 欧美亚洲图片小说| 日本欧美久久久久免费播放网| 911精品国产一区二区在线| 另类小说一区二区三区| 国产女人18毛片水真多成人如厕| 成+人+亚洲+综合天堂| 亚洲自拍偷拍图区| 精品国精品自拍自在线| 成人av在线播放网站| 亚洲国产精品精华液网站| 制服丝袜亚洲精品中文字幕| 国产精品一区在线观看乱码| 亚洲人一二三区| 正在播放亚洲一区| 粉嫩嫩av羞羞动漫久久久| 亚洲电影在线免费观看| 久久午夜电影网| 色悠悠亚洲一区二区| 老司机午夜精品| 亚洲欧美欧美一区二区三区| 欧美一级在线观看| 91麻豆精品国产91久久久久| 麻豆国产精品777777在线| 国产精品毛片无遮挡高清| 5月丁香婷婷综合| 成人av在线电影| 青青草原综合久久大伊人精品优势 | 高清久久久久久| 亚洲国产色一区| 国产午夜精品一区二区| 欧美日韩一区二区三区四区五区| 国产精品综合av一区二区国产馆| 一区二区三区在线视频免费观看| 精品国产一区二区在线观看| 欧美色中文字幕| 不卡电影免费在线播放一区| 青椒成人免费视频| 一区二区三区免费| 国产精品久久久久一区二区三区 | 国产女主播视频一区二区| 欧美精品免费视频| eeuss影院一区二区三区| 麻豆国产91在线播放| 亚洲444eee在线观看| 国产精品久久久一本精品| 久久麻豆一区二区| 日韩三级视频在线看| 欧美日韩免费电影| 欧美在线观看视频一区二区三区| 成人性生交大片免费| 国产精品99久久久久久宅男| 日本91福利区| 五月天欧美精品| 午夜av一区二区三区| 一区二区国产盗摄色噜噜| 亚洲欧美在线视频| 国产精品三级av| 欧美国产综合色视频| 久久久久久毛片| 精品国产一区二区亚洲人成毛片| 777色狠狠一区二区三区| 欧美日韩国产首页| 欧美亚洲动漫另类| 欧美亚洲国产怡红院影院| 91官网在线免费观看| 色婷婷亚洲一区二区三区| 91麻豆国产福利在线观看| 99精品热视频| 日本久久一区二区三区| 欧美自拍丝袜亚洲| 欧美日韩免费高清一区色橹橹| 91成人看片片| 欧美年轻男男videosbes| 中文字幕一区二区三区乱码在线| 国产午夜精品一区二区三区视频 | 国产精品女同互慰在线看| 国产欧美一区二区精品秋霞影院 | 成人免费视频网站在线观看| 国产精品一二三区在线| 懂色av一区二区夜夜嗨| 波多野结衣的一区二区三区| 91麻豆免费观看| 欧美人牲a欧美精品| 日韩欧美一级片| 国产喷白浆一区二区三区| 亚洲欧美综合另类在线卡通| 亚洲一区在线电影| 蜜芽一区二区三区| 国产美女在线精品| 94色蜜桃网一区二区三区| 欧美亚洲国产bt| 欧美不卡一二三| 国产精品丝袜在线| 亚洲国产aⅴ天堂久久| 久久9热精品视频| 成人一区二区三区视频| 91福利视频网站| 精品精品国产高清一毛片一天堂| 国产网红主播福利一区二区| 亚洲欧美偷拍卡通变态| 日本亚洲一区二区| 国产成人免费9x9x人网站视频| av一区二区三区黑人| 欧美另类高清zo欧美| 国产亚洲欧洲一区高清在线观看| 亚洲人午夜精品天堂一二香蕉| 午夜成人免费电影| 成年人国产精品| 日韩一区二区在线观看视频播放| 国产日韩av一区| 午夜精品爽啪视频| 国产成人精品一区二| 欧美日韩综合在线| 国产亚洲一区二区在线观看| 亚洲综合成人在线视频| 国产精品一区二区在线观看网站| 色综合av在线| 中文字幕av一区二区三区免费看| 亚洲成a人v欧美综合天堂下载 | 亚洲bt欧美bt精品777| 国产剧情一区二区| 欧美亚洲国产一卡| 国产精品欧美久久久久一区二区| 日本怡春院一区二区| 色综合中文综合网| **性色生活片久久毛片| 日韩成人免费电影| 色欧美片视频在线观看| 久久香蕉国产线看观看99| 日韩主播视频在线| 色女孩综合影院| 国产精品不卡一区| 国产精选一区二区三区| 欧美一区二区三区免费在线看| 亚洲少妇中出一区| 国产91清纯白嫩初高中在线观看| 91麻豆精品国产91久久久久| 一区二区三区高清不卡| 粉嫩高潮美女一区二区三区| 日韩欧美一二区| 亚洲成人激情自拍| 欧美在线一区二区| 中文字幕一区二区5566日韩| 国产精品1024久久| 亚洲精品在线观看网站| 蜜桃一区二区三区在线| 欧美电影一区二区| 亚洲国产成人av好男人在线观看| hitomi一区二区三区精品| 国产欧美一区二区在线观看| 国产一区二区免费看| 精品电影一区二区三区 | 国产一区二区伦理片| 欧美一二区视频| 美女在线视频一区| 精品久久国产字幕高潮| 精品一区二区三区久久| 精品久久久久久亚洲综合网| 九色综合狠狠综合久久| 精品国产污网站| 国产综合色精品一区二区三区| 精品三级在线观看| 国产伦精品一区二区三区在线观看| 2024国产精品| 成人h动漫精品| 亚洲免费在线视频一区 二区| 不卡欧美aaaaa| 亚洲欧美视频在线观看视频| 欧美综合一区二区| 亚洲成人动漫在线免费观看| 欧美高清视频不卡网| 日韩电影在线观看电影| 日韩美女一区二区三区四区| 韩国av一区二区| 国产精品私人影院| 在线观看视频一区二区| 日韩精品久久久久久| 精品剧情v国产在线观看在线| 国产中文一区二区三区| 亚洲欧美中日韩| 欧美精品精品一区| 国产久卡久卡久卡久卡视频精品| 国产精品久久久久天堂| 欧美日韩小视频| 国产一区二区三区高清播放| 国产精品电影一区二区三区|