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

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

?? neighbour.c

?? 一個基于linux的TCP/IP協議棧的實現
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* neighbour.c * linqianghe@163.com * 2006-09-26 */#include "neighbour.h"#include "log.h"#include <linux/proc_fs.h>#include <linux/random.h>#include <net/dst.h>#define PNEIGH_HASHMASK		0xFstruct neigh_table myarp_tbl;static DEFINE_RWLOCK( myneigh_tbl_lock );static struct neigh_table *myneigh_tables;#ifdef CONFIG_PROC_FSstatic struct neighbour *myneigh_get_first(struct seq_file *seq){	struct neigh_seq_state *state = seq->private;	struct neigh_table *tbl = state->tbl;	struct neighbour *n = NULL;	int bucket = state->bucket;	state->flags &= ~NEIGH_SEQ_IS_PNEIGH;	for (bucket = 0; bucket <= tbl->hash_mask; bucket++) {		n = tbl->hash_buckets[bucket];		while (n) {			if (state->neigh_sub_iter) {				loff_t fakep = 0;				void *v;				v = state->neigh_sub_iter(state, n, &fakep);				if (!v)					goto next;			}			if (!(state->flags & NEIGH_SEQ_SKIP_NOARP))				break;			if (n->nud_state & ~NUD_NOARP)				break;		next:			n = n->next;		}		if (n) break;	}	state->bucket = bucket;	return n;}static struct neighbour *myneigh_get_next(struct seq_file *seq,					struct neighbour *n,					loff_t *pos){	struct neigh_seq_state *state = seq->private;	struct neigh_table *tbl = state->tbl;	if (state->neigh_sub_iter) {		void *v = state->neigh_sub_iter(state, n, pos);		if (v) return n;	}	n = n->next;	while (1) {		while (n) {			if (state->neigh_sub_iter) {				void *v = state->neigh_sub_iter(state, n, pos);				if (v) return n;				goto next;			}			if (!(state->flags & NEIGH_SEQ_SKIP_NOARP))				break;			if (n->nud_state & ~NUD_NOARP)				break;next:			n = n->next;		}		if (n) break;		if (++state->bucket > tbl->hash_mask)			break;		n = tbl->hash_buckets[state->bucket];	}	if (n && pos)		--(*pos);	return n;}static struct neighbour *myneigh_get_idx(struct seq_file *seq, loff_t *pos){	struct neighbour *n = myneigh_get_first(seq);	if (n) {		while (*pos) {			n = myneigh_get_next(seq, n, pos);			if (!n) break;		}	}	return *pos ? NULL : n;}static struct pneigh_entry *mypneigh_get_first(struct seq_file *seq){	struct neigh_seq_state *state = seq->private;	struct neigh_table *tbl = state->tbl;	struct pneigh_entry *pn = NULL;	int bucket = state->bucket;	state->flags |= NEIGH_SEQ_IS_PNEIGH;	for (bucket = 0; bucket <= PNEIGH_HASHMASK; bucket++) {		pn = tbl->phash_buckets[bucket];		if (pn) break;	}	state->bucket = bucket;	return pn;}static struct pneigh_entry *mypneigh_get_next( struct seq_file *seq,					    struct pneigh_entry *pn, loff_t *pos ){	struct neigh_seq_state *state = seq->private;	struct neigh_table *tbl = state->tbl;	pn = pn->next;	while (!pn) {		if (++state->bucket > PNEIGH_HASHMASK)			break;		pn = tbl->phash_buckets[state->bucket];		if (pn) break;	}	if (pn && pos) --(*pos);	return pn;}static struct pneigh_entry *mypneigh_get_idx(struct seq_file *seq, loff_t *pos){	struct pneigh_entry *pn = mypneigh_get_first(seq);	if (pn) {		while (*pos) {			pn = mypneigh_get_next(seq, pn, pos);			if (!pn) break;		}	}	return *pos ? NULL : pn;}static void *myneigh_get_idx_any(struct seq_file *seq, loff_t *pos){	struct neigh_seq_state *state = seq->private;	void *rc;	rc = myneigh_get_idx(seq, pos);	if (!rc && !(state->flags & NEIGH_SEQ_NEIGH_ONLY))		rc = mypneigh_get_idx(seq, pos);	return rc;}void *myneigh_seq_start(struct seq_file *seq, loff_t *pos, 				struct neigh_table *tbl, unsigned int neigh_seq_flags){	struct neigh_seq_state *state = seq->private;	loff_t pos_minus_one;	state->tbl = tbl;	state->bucket = 0;	state->flags = (neigh_seq_flags & ~NEIGH_SEQ_IS_PNEIGH);	read_lock_bh(&tbl->lock);	pos_minus_one = *pos - 1;	return *pos ? myneigh_get_idx_any(seq, &pos_minus_one) : SEQ_START_TOKEN;}EXPORT_SYMBOL_GPL( myneigh_seq_start );void *myneigh_seq_next(struct seq_file *seq, void *v, loff_t *pos){	struct neigh_seq_state *state;	void *rc;	if (v == SEQ_START_TOKEN) {		rc = myneigh_get_idx(seq, pos);		goto out;	}	state = seq->private;	if (!(state->flags & NEIGH_SEQ_IS_PNEIGH)) {		rc = myneigh_get_next(seq, v, NULL);		if (rc)			goto out;		if (!(state->flags & NEIGH_SEQ_NEIGH_ONLY))			rc = mypneigh_get_first(seq);	} else {		BUG_ON(state->flags & NEIGH_SEQ_NEIGH_ONLY);		rc = mypneigh_get_next(seq, v, NULL);	}out:	++(*pos);	return rc;}EXPORT_SYMBOL_GPL( myneigh_seq_next );void myneigh_seq_stop(struct seq_file *seq, void *v){	struct neigh_seq_state *state = seq->private;	struct neigh_table *tbl = state->tbl;	read_unlock_bh(&tbl->lock);}EXPORT_SYMBOL_GPL( myneigh_seq_stop );static void *myneigh_stat_seq_start(struct seq_file *seq, loff_t *pos){	struct proc_dir_entry *pde = seq->private;	struct neigh_table *tbl = pde->data;	int cpu;	if (*pos == 0)		return SEQ_START_TOKEN;		for (cpu = *pos-1; cpu < NR_CPUS; ++cpu) {		if (!cpu_possible(cpu))			continue;		*pos = cpu+1;		return per_cpu_ptr(tbl->stats, cpu);	}	return NULL;}static void *myneigh_stat_seq_next(struct seq_file *seq, void *v, loff_t *pos){	struct proc_dir_entry *pde = seq->private;	struct neigh_table *tbl = pde->data;	int cpu;	for (cpu = *pos; cpu < NR_CPUS; ++cpu) {		if (!cpu_possible(cpu))			continue;		*pos = cpu+1;		return per_cpu_ptr(tbl->stats, cpu);	}	return NULL;}static void myneigh_stat_seq_stop(struct seq_file *seq, void *v){}static int myneigh_stat_seq_show(struct seq_file *seq, void *v){	struct proc_dir_entry *pde = seq->private;	struct neigh_table *tbl = pde->data;	struct neigh_statistics *st = v;	if (v == SEQ_START_TOKEN) {		seq_printf(seq, "entries  allocs destroys hash_grows"						"  lookups hits  res_failed  rcv_probes_mcast"						" rcv_probes_ucast  periodic_gc_runs forced_gc_runs\n");		return 0;	}	seq_printf(seq, "%08x  %08lx %08lx %08lx  %08lx %08lx  %08lx  "			"%08lx %08lx  %08lx %08lx\n",		   atomic_read(&tbl->entries), st->allocs,		   st->destroys, st->hash_grows, st->lookups,		   st->hits, st->res_failed, st->rcv_probes_mcast,		   st->rcv_probes_ucast, st->periodic_gc_runs, st->forced_gc_runs );	return 0;}static struct seq_operations myneigh_stat_seq_ops = {	.start	= myneigh_stat_seq_start,	.next	= myneigh_stat_seq_next,	.stop	= myneigh_stat_seq_stop,	.show	= myneigh_stat_seq_show,};static int myneigh_stat_seq_open( struct inode *inode, struct file *file ){	int ret = seq_open(file, &myneigh_stat_seq_ops);	if (!ret) {		struct seq_file *sf = file->private_data;		sf->private = PDE(inode);	}	return ret;};static struct file_operations myneigh_stat_seq_fops = {	.owner	 = THIS_MODULE,	.open 	 = myneigh_stat_seq_open,	.read	 = seq_read,	.llseek	 = seq_lseek,	.release = seq_release,};#endif /* CONFIG_PROC_FS */static int myneigh_blackhole(struct sk_buff *skb){	kfree_skb(skb);	return -ENETDOWN;}static void myneigh_hash_free(struct neighbour **hash, unsigned int entries){	unsigned long size = entries * sizeof(struct neighbour *);	if (size <= PAGE_SIZE)		kfree(hash);	else		free_pages((unsigned long)hash, get_order(size));}static int myneigh_forced_gc(struct neigh_table *tbl){	int shrunk = 0;	int i;	NEIGH_CACHE_STAT_INC( tbl, forced_gc_runs );	write_lock_bh(&tbl->lock);	for( i = 0; i <= tbl->hash_mask; i++ ){		struct neighbour *n, **np;		np = &tbl->hash_buckets[i];		while ((n = *np) != NULL) {			write_lock( &n->lock );			if( atomic_read(&n->refcnt) == 1 && !(n->nud_state & NUD_PERMANENT) ){				*np	= n->next;				n->dead = 1;				shrunk	= 1;				write_unlock( &n->lock );				myneigh_release( n );				continue;			}			write_unlock(&n->lock);			np = &n->next;		}	}	tbl->last_flush = jiffies;	write_unlock_bh(&tbl->lock);	return shrunk;}static __inline__ int myneigh_max_probes( struct neighbour *n ){	struct neigh_parms *p = n->parms;	return ( n->nud_state & NUD_PROBE ? p->ucast_probes :					p->ucast_probes + p->app_probes + p->mcast_probes);}static void myneigh_timer_handler(unsigned long arg){	unsigned long now, next;	struct neighbour *neigh = (struct neighbour *)arg;	unsigned state;	int notify = 0;	write_lock(&neigh->lock);	state = neigh->nud_state;	now = jiffies;	next = now + HZ;	if( !(state & NUD_IN_TIMER) ){#ifndef CONFIG_SMP		printk(KERN_WARNING "neigh: timer & !nud_in_timer\n");#endif		goto out;	}	if( state & NUD_REACHABLE ){		;	}else if( state & NUD_DELAY ){		;	}else{		next = now + neigh->parms->retrans_time;	}	PR_DEBUG( "net time: %lu\n", next );	if( (neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) &&					atomic_read(&neigh->probes) >= myneigh_max_probes(neigh) ){		struct sk_buff *skb;		neigh->nud_state = NUD_FAILED;		notify = 1;		NEIGH_CACHE_STAT_INC(neigh->tbl, res_failed);		PR_ERR("neigh %p is failed.\n", neigh);		myneigh_release( neigh );			//TMPCODE FIXME!!		while( neigh->nud_state == NUD_FAILED &&		       (skb = __skb_dequeue(&neigh->arp_queue)) != NULL ){			write_unlock(&neigh->lock);			neigh->ops->error_report( neigh, skb );				dev_put( skb->dev );				//TMPCODE FIXME!!			write_lock(&neigh->lock);		}		skb_queue_purge(&neigh->arp_queue);	}	if (neigh->nud_state & NUD_IN_TIMER) {		if( time_before(next, jiffies + HZ/2) )			next = jiffies + HZ/2;		if( !mod_timer(&neigh->timer, next) )			neigh_hold(neigh);		PR_DEBUG( "neigh: %d\n", atomic_read( &neigh->refcnt ) );		PR_DEBUG( "next time: %lu\n", next );	}	if( neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE) ){		struct sk_buff *skb = skb_peek( &neigh->arp_queue );		if( skb )			skb_get(skb);		write_unlock( &neigh->lock );		neigh->ops->solicit( neigh, skb );		atomic_inc( &neigh->probes );		if( skb )			kfree_skb(skb);	}else{out:		write_unlock(&neigh->lock);	}	PR_DEBUG( "neigh refcnt: %d\n", atomic_read(&neigh->refcnt) );	myneigh_release(neigh);}static struct neighbour *myneigh_alloc( struct neigh_table *tbl ){	struct neighbour *n = NULL;	unsigned long now = jiffies;	int entries;	entries = atomic_inc_return( &tbl->entries ) - 1;	PR_DEBUG( "the entryies alrady in tbl: %d\n", entries );	if( entries >= tbl->gc_thresh3 || (entries >= tbl->gc_thresh2 &&							time_after(now, tbl->last_flush + 5 * HZ)) ){		if( !myneigh_forced_gc( tbl ) && entries >= tbl->gc_thresh3 )			goto out_entries;	}	n = kmem_cache_alloc( tbl->kmem_cachep, SLAB_ATOMIC );	if( !n )		goto out_entries;	memset( n, 0, tbl->entry_size );	skb_queue_head_init( &n->arp_queue );	rwlock_init( &n->lock );	n->updated		= n->used = now;	n->nud_state	= NUD_NONE;	n->output		= myneigh_blackhole;	n->parms		= myneigh_parms_clone(&tbl->parms);	init_timer( &n->timer );	n->timer.function = myneigh_timer_handler;	n->timer.data	  = (unsigned long)n;	NEIGH_CACHE_STAT_INC(tbl, allocs);	n->tbl		  	= tbl;	atomic_set(&n->refcnt, 1);	n->dead		  	= 1;out:	return n;out_entries:	atomic_dec( &tbl->entries );	goto out;}static struct neighbour **myneigh_hash_alloc( unsigned int entries ){	unsigned long size = entries * sizeof(struct neighbour *);	struct neighbour **ret;	if (size <= PAGE_SIZE) {		ret = kmalloc(size, GFP_ATOMIC);	} else {		ret = (struct neighbour **)			__get_free_pages(GFP_ATOMIC, get_order(size));	}	if (ret)		memset(ret, 0, size);	return ret;}static void myneigh_hash_grow( struct neigh_table *tbl, unsigned long new_entries ){	struct neighbour **new_hash, **old_hash;	unsigned int i, new_hash_mask, old_entries;	PR_DEEP_DEBUG( "grow the tbl hash to size: %lu\n", new_entries );	NEIGH_CACHE_STAT_INC(tbl, hash_grows);	BUG_ON( new_entries & (new_entries - 1) );	new_hash = myneigh_hash_alloc( new_entries );	if (!new_hash)		return;	old_entries = tbl->hash_mask + 1;	new_hash_mask = new_entries - 1;	old_hash = tbl->hash_buckets;	get_random_bytes(&tbl->hash_rnd, sizeof(tbl->hash_rnd));	for( i = 0; i < old_entries; i++ ){		struct neighbour *n, *next;		for( n = old_hash[i]; n; n = next ){			unsigned int hash_val = tbl->hash( n->primary_key, n->dev );			hash_val &= new_hash_mask;			next = n->next;			n->next = new_hash[hash_val];			new_hash[hash_val] = n;		}	}	tbl->hash_buckets = new_hash;	tbl->hash_mask = new_hash_mask;	myneigh_hash_free( old_hash, old_entries );}struct neighbour *myneigh_lookup(struct neigh_table *tbl, const void *pkey,				struct net_device *dev){	struct neighbour *n;	int key_len = tbl->key_len;	u32 hash_val = tbl->hash(pkey, dev) & tbl->hash_mask;	PR_DEEP_DEBUG( "the pkey is %u.%u.%u.%u, the hash value is: %u\n",					NIPQUAD( *((u32 *)pkey) ), hash_val );	NEIGH_CACHE_STAT_INC(tbl, lookups);	read_lock_bh( &tbl->lock );	for( n = tbl->hash_buckets[hash_val]; n; n = n->next ){		if( dev == n->dev && !memcmp(n->primary_key, pkey, key_len) ){			neigh_hold( n );

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线观看91视频| 国产精品久久久久精k8 | 欧美日韩大陆在线| 亚洲精品一区二区三区影院 | 日韩视频免费观看高清完整版在线观看 | 国产亚洲美州欧州综合国| 1区2区3区精品视频| 蜜桃一区二区三区在线观看| 成人理论电影网| 日韩三级在线免费观看| 亚洲一区在线电影| av一二三不卡影片| 精品久久久久久久一区二区蜜臀| 亚洲一区二区在线视频| 成人va在线观看| 久久久久国产一区二区三区四区| 亚洲成人av资源| 欧美成人精品高清在线播放| 一区二区视频在线| 成人免费视频网站在线观看| 久久蜜桃av一区二区天堂| 日本视频在线一区| 欧美精品一二三| 亚洲高清免费观看高清完整版在线观看| 国产电影一区二区三区| 精品久久国产老人久久综合| 亚洲一二三区在线观看| 欧美亚州韩日在线看免费版国语版| 中文在线一区二区| 国产成人无遮挡在线视频| 久久综合视频网| 国产一区视频在线看| 日韩精品一区在线| 麻豆免费精品视频| 欧美xxxx在线观看| 国产乱人伦精品一区二区在线观看| 91精品国产入口| 蜜桃精品视频在线| 日韩欧美一级特黄在线播放| 奇米精品一区二区三区四区| 日韩一区二区三区在线| 久久99久久久久久久久久久| 日韩精品一区二区三区在线观看| 美国十次了思思久久精品导航| 91精品国产色综合久久ai换脸| 国产一区二区三区美女| 国产亚洲午夜高清国产拍精品| 中文字幕一区二区三区四区| 粉嫩av一区二区三区在线播放| 欧美激情在线免费观看| 99精品国产热久久91蜜凸| 一区二区成人在线| 日韩欧美久久久| 国产精品一线二线三线精华| 日本一区二区视频在线观看| 成人国产亚洲欧美成人综合网| 亚洲欧洲精品天堂一级 | 国产清纯白嫩初高生在线观看91 | 99精品久久只有精品| 亚洲激情一二三区| 欧美一级免费大片| 国产激情视频一区二区三区欧美| 中文字幕一区二区三区四区| 欧美亚洲图片小说| 精品一区在线看| 亚洲欧洲韩国日本视频| 欧美日韩亚洲高清一区二区| 老司机免费视频一区二区| 国产亚洲成年网址在线观看| 日本精品一区二区三区四区的功能| 天堂久久久久va久久久久| 337p粉嫩大胆色噜噜噜噜亚洲| 波多野结衣亚洲一区| 日韩激情一二三区| 国产精品久久影院| 欧美一级艳片视频免费观看| 成人av在线观| 日本不卡的三区四区五区| 国产精品国产三级国产a| 欧美视频一区二区三区在线观看 | 中文字幕精品三区| 欧美一级免费观看| 日本韩国精品一区二区在线观看| 日韩av电影天堂| 亚洲精品视频在线看| 久久综合九色欧美综合狠狠| 欧美三级电影精品| 成人黄色片在线观看| 蜜桃视频一区二区三区在线观看| 亚洲欧美一区二区三区孕妇| 26uuu亚洲综合色欧美| 欧美丰满一区二区免费视频| 99视频精品免费视频| 国产综合成人久久大片91| 性做久久久久久久免费看| 中文字幕不卡在线播放| 欧美zozozo| 欧美一区二区三区视频在线观看| 色综合天天综合网天天狠天天| 国产精品911| 久久精品99久久久| 日韩影院精彩在线| 亚洲国产aⅴ天堂久久| 亚洲老司机在线| 亚洲男帅同性gay1069| 国产精品久久久久久久久搜平片| 精品久久久久久久一区二区蜜臀| 亚洲美女区一区| 亚洲国产电影在线观看| 久久亚洲二区三区| 精品福利一区二区三区| 日韩三级视频在线看| 日韩一区二区三区视频| 欧美一卡二卡在线观看| 日韩欧美亚洲国产另类| 欧美一区二区三区免费观看视频| 欧美日韩一区二区在线视频| 欧美色综合网站| 欧美日韩一区在线观看| 欧美视频你懂的| 欧美理论电影在线| 日韩一区二区三区电影在线观看| 欧美精品三级在线观看| 欧美丰满少妇xxxxx高潮对白| 6080午夜不卡| 欧美一级黄色片| 日韩欧美国产高清| 精品国产区一区| 国产偷国产偷精品高清尤物| 国产日韩综合av| 中文字幕一区二区三| 玉米视频成人免费看| 午夜激情综合网| 麻豆国产精品一区二区三区 | 亚洲欧美偷拍三级| 亚洲综合一二三区| 美女一区二区视频| 国产精品99久久不卡二区| kk眼镜猥琐国模调教系列一区二区 | 2020日本不卡一区二区视频| 国产清纯白嫩初高生在线观看91| 亚洲视频在线一区观看| 亚洲午夜久久久久| 久久99国产精品久久99果冻传媒| 国产成人av福利| 色综合天天综合网天天看片| 欧美精品色综合| 日本一区二区免费在线观看视频 | 亚洲在线视频一区| 麻豆91在线播放| 成人免费黄色大片| 欧美日韩成人综合天天影院| 久久女同精品一区二区| 亚洲免费观看高清完整版在线 | 日韩免费福利电影在线观看| 久久综合成人精品亚洲另类欧美| 亚洲欧洲色图综合| 裸体健美xxxx欧美裸体表演| 成人h动漫精品一区二区| 51精品视频一区二区三区| 欧美国产综合色视频| 偷拍自拍另类欧美| 成人黄色综合网站| 精品女同一区二区| 一区二区在线观看免费视频播放| 久久99国产精品免费网站| 欧美优质美女网站| 欧美激情综合在线| 美腿丝袜在线亚洲一区| 日本道色综合久久| 中文成人综合网| 美女视频第一区二区三区免费观看网站| 北岛玲一区二区三区四区| 欧美v日韩v国产v| 偷偷要91色婷婷| 日本韩国一区二区| 国产精品系列在线| 精品一区二区国语对白| 欧美日韩国产高清一区| 国产精品国产三级国产| 国产福利一区在线观看| 日韩一区二区免费在线观看| 亚洲欧美日韩国产一区二区三区| 国产精品影视在线观看| 日韩欧美中文一区| 日韩精品视频网站| 欧美日韩精品久久久| 亚洲女人****多毛耸耸8| 成人va在线观看| 欧美国产丝袜视频| 国产精品亚洲а∨天堂免在线| 91精品国产91久久久久久最新毛片 | 国产一区二区三区免费在线观看| 欧美日韩一区二区三区视频| 一区二区三区资源| 91黄色免费观看| 亚洲男人电影天堂| 色狠狠一区二区三区香蕉| 综合久久综合久久| 91免费版pro下载短视频|