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

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

?? ipt_recent.c

?? 優龍2410linux2.6.8內核源代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* Kernel module to check if the source address has been seen recently. *//* Copyright 2002-2003, Stephen Frost, 2.5.x port by laforge@netfilter.org *//* Author: Stephen Frost <sfrost@snowman.net> *//* Project Page: http://snowman.net/projects/ipt_recent/ *//* This software is distributed under the terms of the GPL, Version 2 *//* This copyright does not cover user programs that use kernel services * by normal system calls. */#include <linux/module.h>#include <linux/skbuff.h>#include <linux/proc_fs.h>#include <linux/spinlock.h>#include <linux/interrupt.h>#include <asm/uaccess.h>#include <linux/ctype.h>#include <linux/ip.h>#include <linux/vmalloc.h>#include <linux/netfilter_ipv4/ip_tables.h>#include <linux/netfilter_ipv4/ipt_recent.h>#undef DEBUG#define HASH_LOG 9/* Defaults, these can be overridden on the module command-line. */static int ip_list_tot = 100;static int ip_pkt_list_tot = 20;static int ip_list_hash_size = 0;static int ip_list_perms = 0644;#ifdef DEBUGstatic int debug = 1;#endifstatic char version[] =KERN_INFO RECENT_NAME " " RECENT_VER ": Stephen Frost <sfrost@snowman.net>.  http://snowman.net/projects/ipt_recent/\n";MODULE_AUTHOR("Stephen Frost <sfrost@snowman.net>");MODULE_DESCRIPTION("IP tables recently seen matching module " RECENT_VER);MODULE_LICENSE("GPL");MODULE_PARM(ip_list_tot,"i");MODULE_PARM(ip_pkt_list_tot,"i");MODULE_PARM(ip_list_hash_size,"i");MODULE_PARM(ip_list_perms,"i");#ifdef DEBUGMODULE_PARM(debug,"i");MODULE_PARM_DESC(debug,"debugging level, defaults to 1");#endifMODULE_PARM_DESC(ip_list_tot,"number of IPs to remember per list");MODULE_PARM_DESC(ip_pkt_list_tot,"number of packets per IP to remember");MODULE_PARM_DESC(ip_list_hash_size,"size of hash table used to look up IPs");MODULE_PARM_DESC(ip_list_perms,"permissions on /proc/net/ipt_recent/* files");/* Structure of our list of recently seen addresses. */struct recent_ip_list {	u_int32_t addr;	u_int8_t  ttl;	unsigned long last_seen;	unsigned long *last_pkts;	u_int32_t oldest_pkt;	u_int32_t hash_entry;	u_int32_t time_pos;};struct time_info_list {	u_int32_t position;	u_int32_t time;};/* Structure of our linked list of tables of recent lists. */struct recent_ip_tables {	char name[IPT_RECENT_NAME_LEN];	int count;	int time_pos;	struct recent_ip_list *table;	struct recent_ip_tables *next;	spinlock_t list_lock;	int *hash_table;	struct time_info_list *time_info;#ifdef CONFIG_PROC_FS	struct proc_dir_entry *status_proc;#endif /* CONFIG_PROC_FS */};/* Our current list of addresses we have recently seen. * Only added to on a --set, and only updated on --set || --update  */static struct recent_ip_tables *r_tables = NULL;/* We protect r_list with this spinlock so two processors are not modifying * the list at the same time.  */static spinlock_t recent_lock = SPIN_LOCK_UNLOCKED;#ifdef CONFIG_PROC_FS/* Our /proc/net/ipt_recent entry */static struct proc_dir_entry *proc_net_ipt_recent = NULL;#endif/* Function declaration for later. */static intmatch(const struct sk_buff *skb,      const struct net_device *in,      const struct net_device *out,      const void *matchinfo,      int offset,      int *hotdrop);/* Function to hash a given address into the hash table of table_size size */int hash_func(unsigned int addr, int table_size){	int result = 0;	unsigned int value = addr;	do { result ^= value; } while((value >>= HASH_LOG));#ifdef DEBUG	if(debug) printk(KERN_INFO RECENT_NAME ": %d = hash_func(%u,%d)\n",			 result & (table_size - 1),			 addr,			 table_size);#endif	return(result & (table_size - 1));}#ifdef CONFIG_PROC_FS/* This is the function which produces the output for our /proc output * interface which lists each IP address, the last seen time and the  * other recent times the address was seen. */static int ip_recent_get_info(char *buffer, char **start, off_t offset, int length, int *eof, void *data){	int len = 0, count, last_len = 0, pkt_count;	off_t pos = 0;	off_t begin = 0;	struct recent_ip_tables *curr_table;	curr_table = (struct recent_ip_tables*) data;	spin_lock_bh(&curr_table->list_lock);	for(count = 0; count < ip_list_tot; count++) {		if(!curr_table->table[count].addr) continue;		last_len = len;		len += sprintf(buffer+len,"src=%u.%u.%u.%u ",NIPQUAD(curr_table->table[count].addr));		len += sprintf(buffer+len,"ttl: %u ",curr_table->table[count].ttl);		len += sprintf(buffer+len,"last_seen: %lu ",curr_table->table[count].last_seen);		len += sprintf(buffer+len,"oldest_pkt: %u ",curr_table->table[count].oldest_pkt);		len += sprintf(buffer+len,"last_pkts: %lu",curr_table->table[count].last_pkts[0]);		for(pkt_count = 1; pkt_count < ip_pkt_list_tot; pkt_count++) {			if(!curr_table->table[count].last_pkts[pkt_count]) break;			len += sprintf(buffer+len,", %lu",curr_table->table[count].last_pkts[pkt_count]);		}		len += sprintf(buffer+len,"\n");		pos = begin + len;		if(pos < offset) { len = 0; begin = pos; }		if(pos > offset + length) { len = last_len; break; }	}	*start = buffer + (offset - begin);	len -= (offset - begin);	if(len > length) len = length;	spin_unlock_bh(&curr_table->list_lock);	return len;}/* ip_recent_ctrl provides an interface for users to modify the table * directly.  This allows adding entries, removing entries, and * flushing the entire table. * This is done by opening up the appropriate table for writing and * sending one of: * xx.xx.xx.xx   -- Add entry to table with current time * +xx.xx.xx.xx  -- Add entry to table with current time * -xx.xx.xx.xx  -- Remove entry from table * clear         -- Flush table, remove all entries */static int ip_recent_ctrl(struct file *file, const char __user *input, unsigned long size, void *data){	static const u_int32_t max[4] = { 0xffffffff, 0xffffff, 0xffff, 0xff };	u_int32_t val;	int base, used = 0;	char c, *cp;	union iaddr {		uint8_t bytes[4];		uint32_t word;	} res;	uint8_t *pp = res.bytes;	int digit;	char buffer[20];	int len, check_set = 0, count;	u_int32_t addr = 0;	struct sk_buff *skb;	struct ipt_recent_info *info;	struct recent_ip_tables *curr_table;	curr_table = (struct recent_ip_tables*) data;	if(size > 20) len = 20; else len = size;	if(copy_from_user(buffer,input,len)) return -EFAULT;	if(len < 20) buffer[len] = '\0';#ifdef DEBUG	if(debug) printk(KERN_INFO RECENT_NAME ": ip_recent_ctrl len: %d, input: `%.20s'\n",len,buffer);#endif	cp = buffer;	while(isspace(*cp)) { cp++; used++; if(used >= len-5) return used; }	/* Check if we are asked to flush the entire table */	if(!memcmp(cp,"clear",5)) {		used += 5;		spin_lock_bh(&curr_table->list_lock);		curr_table->time_pos = 0;		for(count = 0; count < ip_list_hash_size; count++) {			curr_table->hash_table[count] = -1;		}		for(count = 0; count < ip_list_tot; count++) {			curr_table->table[count].last_seen = 0;			curr_table->table[count].addr = 0;			curr_table->table[count].ttl = 0;			memset(curr_table->table[count].last_pkts,0,ip_pkt_list_tot*sizeof(u_int32_t));			curr_table->table[count].oldest_pkt = 0;			curr_table->table[count].time_pos = 0;			curr_table->time_info[count].position = count;			curr_table->time_info[count].time = 0;		}		spin_unlock_bh(&curr_table->list_lock);		return used;	}        check_set = IPT_RECENT_SET;	switch(*cp) {		case '+': check_set = IPT_RECENT_SET; cp++; used++; break;		case '-': check_set = IPT_RECENT_REMOVE; cp++; used++; break;		default: if(!isdigit(*cp)) return (used+1); break;	}#ifdef DEBUG	if(debug) printk(KERN_INFO RECENT_NAME ": ip_recent_ctrl cp: `%c', check_set: %d\n",*cp,check_set);#endif	/* Get addr (effectively inet_aton()) */	/* Shamelessly stolen from libc, a function in the kernel for doing	 * this would, of course, be greatly preferred, but our options appear	 * to be rather limited, so we will just do it ourselves here.	 */	res.word = 0;	c = *cp;	for(;;) {		if(!isdigit(c)) return used;		val = 0; base = 10; digit = 0;		if(c == '0') {			c = *++cp;			if(c == 'x' || c == 'X') base = 16, c = *++cp;			else { base = 8; digit = 1; }		}		for(;;) {			if(isascii(c) && isdigit(c)) {				if(base == 8 && (c == '8' || c == '0')) return used;				val = (val * base) + (c - '0');				c = *++cp;				digit = 1;			} else if(base == 16 && isascii(c) && isxdigit(c)) {				val = (val << 4) | (c + 10 - (islower(c) ? 'a' : 'A'));				c = *++cp;				digit = 1;			} else break;		}		if(c == '.') {			if(pp > res.bytes + 2 || val > 0xff) return used;			*pp++ = val;			c = *++cp;		} else break;	}	used = cp - buffer;	if(c != '\0' && (!isascii(c) || !isspace(c))) return used;	if(c == '\n') used++;	if(!digit) return used;	if(val > max[pp - res.bytes]) return used;	addr = res.word | htonl(val);	if(!addr && check_set == IPT_RECENT_SET) return used;#ifdef DEBUG	if(debug) printk(KERN_INFO RECENT_NAME ": ip_recent_ctrl c: %c, addr: %u used: %d\n",c,addr,used);#endif	/* Set up and just call match */	info = kmalloc(sizeof(struct ipt_recent_info),GFP_KERNEL);	if(!info) { return -ENOMEM; }	info->seconds = 0;	info->hit_count = 0;	info->check_set = check_set;	info->invert = 0;	info->side = IPT_RECENT_SOURCE;	strncpy(info->name,curr_table->name,IPT_RECENT_NAME_LEN);	info->name[IPT_RECENT_NAME_LEN-1] = '\0';	skb = kmalloc(sizeof(struct sk_buff),GFP_KERNEL);	if (!skb) {		used = -ENOMEM;		goto out_free_info;	}	skb->nh.iph = kmalloc(sizeof(struct iphdr),GFP_KERNEL);	if (!skb->nh.iph) {		used = -ENOMEM;		goto out_free_skb;	}	skb->nh.iph->saddr = addr;	skb->nh.iph->daddr = 0;	/* Clear ttl since we have no way of knowing it */	skb->nh.iph->ttl = 0;	match(skb,NULL,NULL,info,0,NULL);	kfree(skb->nh.iph);out_free_skb:	kfree(skb);out_free_info:	kfree(info);#ifdef DEBUG	if(debug) printk(KERN_INFO RECENT_NAME ": Leaving ip_recent_ctrl addr: %u used: %d\n",addr,used);#endif	return used;}#endif /* CONFIG_PROC_FS */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
gogogo免费视频观看亚洲一| 亚洲色图欧美在线| 一区二区三区在线免费播放| 毛片av一区二区| 精品视频一区二区不卡| 亚洲欧洲日韩综合一区二区| 久久精品国产99| 69堂亚洲精品首页| 亚洲精品乱码久久久久久黑人 | 久久这里只有精品6| 亚洲成人综合在线| 色www精品视频在线观看| 久久久久久影视| 精品一区二区三区视频| 欧美日韩高清在线播放| 中文字幕中文字幕在线一区 | 韩国中文字幕2020精品| 欧美精品久久久久久久久老牛影院| 自拍偷拍亚洲综合| 国产一区二区网址| 精品成人a区在线观看| 婷婷综合久久一区二区三区| 91在线视频播放地址| 国产日韩欧美一区二区三区综合| 精品在线你懂的| 欧美videossexotv100| 青娱乐精品在线视频| 欧美视频一区在线观看| 亚洲日本青草视频在线怡红院| 丁香五精品蜜臀久久久久99网站 | 欧美mv日韩mv| 青青青爽久久午夜综合久久午夜| 91官网在线观看| 亚洲精品日韩一| 欧美大片一区二区三区| 日韩黄色小视频| 在线综合视频播放| 日日欢夜夜爽一区| 91精品国产乱| 男男gaygay亚洲| 日韩欧美国产一区在线观看| 蜜臀久久99精品久久久画质超高清 | 蜜臀91精品一区二区三区| 91精品国产综合久久久久久久 | 亚洲综合激情另类小说区| 色婷婷综合久久久久中文一区二区| 中文字幕在线观看不卡| 96av麻豆蜜桃一区二区| 亚洲三级电影网站| 欧美亚洲愉拍一区二区| 亚洲精品国产a久久久久久| 色哟哟亚洲精品| 亚洲国产日韩a在线播放| 色婷婷av一区二区三区gif| 亚洲日本va午夜在线影院| 91福利资源站| 日韩电影在线免费观看| 日韩亚洲欧美高清| 国产精品一区二区三区乱码| 国产亚洲短视频| eeuss鲁片一区二区三区在线观看| 国产精品久久网站| 91成人在线免费观看| 午夜久久电影网| 日韩欧美中文字幕公布| 国产成人一级电影| 亚洲美女屁股眼交| 欧美美女激情18p| 久久99精品久久久久久动态图| 久久久久久一级片| 91免费视频网址| 日韩一区精品字幕| 国产午夜三级一区二区三| 成人av第一页| 亚洲电影中文字幕在线观看| 日韩一区二区三区三四区视频在线观看 | 亚洲伦理在线精品| 欧美日韩夫妻久久| 国内成人免费视频| 亚洲三级在线观看| 日韩一区二区三区在线视频| 国产成人在线观看| 一二三区精品视频| 日韩精品一区二区三区视频播放| 成人精品一区二区三区中文字幕| 日韩av在线播放中文字幕| 久久精品人人做人人综合| 成人av动漫网站| 日韩国产精品91| 国产色综合一区| 91国产免费看| 精品夜夜嗨av一区二区三区| 一区视频在线播放| 欧美一区二区免费| 91在线看国产| 美女网站一区二区| 亚洲美女视频在线观看| 欧美mv和日韩mv国产网站| 色婷婷亚洲婷婷| 国产在线精品一区二区夜色 | 亚洲日本青草视频在线怡红院| 日韩一区二区三区免费看| 99精品视频在线播放观看| 丝袜美腿成人在线| √…a在线天堂一区| 欧美电影免费观看完整版| 91在线国内视频| 极品少妇xxxx精品少妇偷拍| 亚洲一区在线观看网站| 国产女人18毛片水真多成人如厕 | 欧美日韩一区三区四区| 国产精品中文字幕日韩精品| 亚洲福利一二三区| 亚洲欧洲国产日本综合| 欧美精品一区二区三区高清aⅴ| 欧美中文字幕一区二区三区亚洲| 国产乱一区二区| 日韩av一区二| 一区二区三区国产豹纹内裤在线| 久久精品免视看| 欧美老肥妇做.爰bbww视频| 成人av资源站| 国产精品一区二区三区四区| 日韩专区欧美专区| 亚洲精品日产精品乱码不卡| 欧美国产一区视频在线观看| 精品日本一线二线三线不卡| 欧美体内she精视频| 成人精品亚洲人成在线| 激情综合一区二区三区| 日韩综合在线视频| 亚洲第一电影网| 亚洲精选一二三| 中国色在线观看另类| 亚洲精品一区二区三区四区高清| 777a∨成人精品桃花网| 欧美日韩一区二区三区高清 | 国产99久久久国产精品潘金| 老汉av免费一区二区三区| 亚洲一级二级在线| 亚洲日本丝袜连裤袜办公室| 国产精品入口麻豆九色| 精品久久久久久无| 日韩欧美一区二区三区在线| 欧美高清激情brazzers| 欧美激情自拍偷拍| 精品国产乱码久久久久久图片| 欧美日韩一区二区欧美激情 | 国产乱码精品一区二区三区忘忧草| 日本不卡视频一二三区| 五月天一区二区| 亚洲观看高清完整版在线观看| 亚洲一区二区在线免费观看视频| 亚洲丝袜制服诱惑| 亚洲日本在线视频观看| 亚洲欧美日韩国产一区二区三区| 成人欧美一区二区三区黑人麻豆| 国产精品久久久爽爽爽麻豆色哟哟| 国产视频911| 国产精品久久久久久久浪潮网站| 欧美国产综合色视频| 国产精品美女久久福利网站| 国产精品婷婷午夜在线观看| 久久久99久久| 中文欧美字幕免费| 亚洲欧洲韩国日本视频| 一区二区三区中文字幕在线观看| 一区二区三区高清不卡| 香蕉久久一区二区不卡无毒影院 | 久久99久久久欧美国产| 久久99精品国产.久久久久| 国产一区二区在线观看视频| 国产成人综合自拍| 91社区在线播放| 欧美性受xxxx黑人xyx性爽| 欧美另类久久久品| 精品国产a毛片| 国产精品人妖ts系列视频| **欧美大码日韩| 亚洲第一搞黄网站| 久久99精品久久只有精品| 国产最新精品免费| 不卡在线视频中文字幕| 日本伦理一区二区| 在线播放国产精品二区一二区四区 | 久草热8精品视频在线观看| 国产一区二区在线免费观看| 成人教育av在线| 欧美三级三级三级爽爽爽| 欧美大片免费久久精品三p| 国产亚洲午夜高清国产拍精品 | 精品久久国产97色综合| 亚洲国产精品二十页| 一区二区三区国产精华| 蜜桃视频免费观看一区| 国产美女一区二区| 一道本成人在线| 日韩欧美的一区二区| 中文字幕第一页久久| 亚洲不卡一区二区三区|