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

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

?? packet_history.c

?? 底層驅動開發
?? C
字號:
/* *  net/dccp/packet_history.h * *  Copyright (c) 2005 The University of Waikato, Hamilton, New Zealand. * *  An implementation of the DCCP protocol * *  This code has been developed by the University of Waikato WAND *  research group. For further information please see http://www.wand.net.nz/ *  or e-mail Ian McDonald - iam4@cs.waikato.ac.nz * *  This code also uses code from Lulea University, rereleased as GPL by its *  authors: *  Copyright (c) 2003 Nils-Erik Mattsson, Joacim Haggmark, Magnus Erixzon * *  Changes to meet Linux coding standards, to make it meet latest ccid3 draft *  and to make it work as a loadable module in the DCCP stack written by *  Arnaldo Carvalho de Melo <acme@conectiva.com.br>. * *  Copyright (c) 2005 Arnaldo Carvalho de Melo <acme@conectiva.com.br> * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */#include <linux/config.h>#include <linux/module.h>#include <linux/string.h>#include "packet_history.h"struct dccp_rx_hist *dccp_rx_hist_new(const char *name){	struct dccp_rx_hist *hist = kmalloc(sizeof(*hist), GFP_ATOMIC);	static const char dccp_rx_hist_mask[] = "rx_hist_%s";	char *slab_name;	if (hist == NULL)		goto out;	slab_name = kmalloc(strlen(name) + sizeof(dccp_rx_hist_mask) - 1,			    GFP_ATOMIC);	if (slab_name == NULL)		goto out_free_hist;	sprintf(slab_name, dccp_rx_hist_mask, name);	hist->dccprxh_slab = kmem_cache_create(slab_name,					     sizeof(struct dccp_rx_hist_entry),					       0, SLAB_HWCACHE_ALIGN,					       NULL, NULL);	if (hist->dccprxh_slab == NULL)		goto out_free_slab_name;out:	return hist;out_free_slab_name:	kfree(slab_name);out_free_hist:	kfree(hist);	hist = NULL;	goto out;}EXPORT_SYMBOL_GPL(dccp_rx_hist_new);void dccp_rx_hist_delete(struct dccp_rx_hist *hist){	const char* name = kmem_cache_name(hist->dccprxh_slab);	kmem_cache_destroy(hist->dccprxh_slab);	kfree(name);	kfree(hist);}EXPORT_SYMBOL_GPL(dccp_rx_hist_delete);void dccp_rx_hist_purge(struct dccp_rx_hist *hist, struct list_head *list){	struct dccp_rx_hist_entry *entry, *next;	list_for_each_entry_safe(entry, next, list, dccphrx_node) {		list_del_init(&entry->dccphrx_node);		kmem_cache_free(hist->dccprxh_slab, entry);	}}EXPORT_SYMBOL_GPL(dccp_rx_hist_purge);struct dccp_rx_hist_entry *		dccp_rx_hist_find_data_packet(const struct list_head *list){	struct dccp_rx_hist_entry *entry, *packet = NULL;	list_for_each_entry(entry, list, dccphrx_node)		if (entry->dccphrx_type == DCCP_PKT_DATA ||		    entry->dccphrx_type == DCCP_PKT_DATAACK) {			packet = entry;			break;		}	return packet;}EXPORT_SYMBOL_GPL(dccp_rx_hist_find_data_packet);int dccp_rx_hist_add_packet(struct dccp_rx_hist *hist,			    struct list_head *rx_list,			    struct list_head *li_list,			    struct dccp_rx_hist_entry *packet){	struct dccp_rx_hist_entry *entry, *next, *iter;	u8 num_later = 0;	iter = dccp_rx_hist_head(rx_list);	if (iter == NULL)		dccp_rx_hist_add_entry(rx_list, packet);	else {		const u64 seqno = packet->dccphrx_seqno;		if (after48(seqno, iter->dccphrx_seqno))			dccp_rx_hist_add_entry(rx_list, packet);		else {			if (dccp_rx_hist_entry_data_packet(iter))				num_later = 1;			list_for_each_entry_continue(iter, rx_list,						     dccphrx_node) {				if (after48(seqno, iter->dccphrx_seqno)) {					dccp_rx_hist_add_entry(&iter->dccphrx_node,							       packet);					goto trim_history;				}				if (dccp_rx_hist_entry_data_packet(iter))					num_later++;				if (num_later == TFRC_RECV_NUM_LATE_LOSS) {					dccp_rx_hist_entry_delete(hist, packet);					return 1;				}			}			if (num_later < TFRC_RECV_NUM_LATE_LOSS)				dccp_rx_hist_add_entry(rx_list, packet);			/*			 * FIXME: else what? should we destroy the packet			 * like above?			 */		}	}trim_history:	/*	 * Trim history (remove all packets after the NUM_LATE_LOSS + 1	 * data packets)	 */	num_later = TFRC_RECV_NUM_LATE_LOSS + 1;	if (!list_empty(li_list)) {		list_for_each_entry_safe(entry, next, rx_list, dccphrx_node) {			if (num_later == 0) {				list_del_init(&entry->dccphrx_node);				dccp_rx_hist_entry_delete(hist, entry);			} else if (dccp_rx_hist_entry_data_packet(entry))				--num_later;		}	} else {		int step = 0;		u8 win_count = 0; /* Not needed, but lets shut up gcc */		int tmp;		/*		 * We have no loss interval history so we need at least one		 * rtt:s of data packets to approximate rtt.		 */		list_for_each_entry_safe(entry, next, rx_list, dccphrx_node) {			if (num_later == 0) {				switch (step) {				case 0:					step = 1;					/* OK, find next data packet */					num_later = 1;					break;				case 1:					step = 2;					/* OK, find next data packet */					num_later = 1;					win_count = entry->dccphrx_ccval;					break;				case 2:					tmp = win_count - entry->dccphrx_ccval;					if (tmp < 0)						tmp += TFRC_WIN_COUNT_LIMIT;					if (tmp > TFRC_WIN_COUNT_PER_RTT + 1) {						/*						 * We have found a packet older						 * than one rtt remove the rest						 */						step = 3;					} else /* OK, find next data packet */						num_later = 1;					break;				case 3:					list_del_init(&entry->dccphrx_node);					dccp_rx_hist_entry_delete(hist, entry);					break;				}			} else if (dccp_rx_hist_entry_data_packet(entry))				--num_later;		}	}	return 0;}EXPORT_SYMBOL_GPL(dccp_rx_hist_add_packet);u64 dccp_rx_hist_detect_loss(struct list_head *rx_list,			     struct list_head *li_list, u8 *win_loss){	struct dccp_rx_hist_entry *entry, *next, *packet;	struct dccp_rx_hist_entry *a_loss = NULL;	struct dccp_rx_hist_entry *b_loss = NULL;	u64 seq_loss = DCCP_MAX_SEQNO + 1;	u8 num_later = TFRC_RECV_NUM_LATE_LOSS;	list_for_each_entry_safe(entry, next, rx_list, dccphrx_node) {		if (num_later == 0) {			b_loss = entry;			break;		} else if (dccp_rx_hist_entry_data_packet(entry))			--num_later;	}	if (b_loss == NULL)		goto out;	num_later = 1;	list_for_each_entry_safe_continue(entry, next, rx_list, dccphrx_node) {		if (num_later == 0) {			a_loss = entry;			break;		} else if (dccp_rx_hist_entry_data_packet(entry))			--num_later;	}	if (a_loss == NULL) {		if (list_empty(li_list)) {			/* no loss event have occured yet */			LIMIT_NETDEBUG("%s: TODO: find a lost data packet by "				       "comparing to initial seqno\n",				       __FUNCTION__);			goto out;		} else {			LIMIT_NETDEBUG("%s: Less than 4 data pkts in history!",				       __FUNCTION__);			goto out;		}	}	/* Locate a lost data packet */	entry = packet = b_loss;	list_for_each_entry_safe_continue(entry, next, rx_list, dccphrx_node) {		u64 delta = dccp_delta_seqno(entry->dccphrx_seqno,					     packet->dccphrx_seqno);		if (delta != 0) {			if (dccp_rx_hist_entry_data_packet(packet))				--delta;			/*			 * FIXME: check this, probably this % usage is because			 * in earlier drafts the ndp count was just 8 bits			 * long, but now it cam be up to 24 bits long.			 */#if 0			if (delta % DCCP_NDP_LIMIT !=			    (packet->dccphrx_ndp -			     entry->dccphrx_ndp) % DCCP_NDP_LIMIT)#endif			if (delta != packet->dccphrx_ndp - entry->dccphrx_ndp) {				seq_loss = entry->dccphrx_seqno;				dccp_inc_seqno(&seq_loss);			}		}		packet = entry;		if (packet == a_loss)			break;	}out:	if (seq_loss != DCCP_MAX_SEQNO + 1)		*win_loss = a_loss->dccphrx_ccval;	else		*win_loss = 0; /* Paranoia */	return seq_loss;}EXPORT_SYMBOL_GPL(dccp_rx_hist_detect_loss);struct dccp_tx_hist *dccp_tx_hist_new(const char *name){	struct dccp_tx_hist *hist = kmalloc(sizeof(*hist), GFP_ATOMIC);	static const char dccp_tx_hist_mask[] = "tx_hist_%s";	char *slab_name;	if (hist == NULL)		goto out;	slab_name = kmalloc(strlen(name) + sizeof(dccp_tx_hist_mask) - 1,			    GFP_ATOMIC);	if (slab_name == NULL)		goto out_free_hist;	sprintf(slab_name, dccp_tx_hist_mask, name);	hist->dccptxh_slab = kmem_cache_create(slab_name,					     sizeof(struct dccp_tx_hist_entry),					       0, SLAB_HWCACHE_ALIGN,					       NULL, NULL);	if (hist->dccptxh_slab == NULL)		goto out_free_slab_name;out:	return hist;out_free_slab_name:	kfree(slab_name);out_free_hist:	kfree(hist);	hist = NULL;	goto out;}EXPORT_SYMBOL_GPL(dccp_tx_hist_new);void dccp_tx_hist_delete(struct dccp_tx_hist *hist){	const char* name = kmem_cache_name(hist->dccptxh_slab);	kmem_cache_destroy(hist->dccptxh_slab);	kfree(name);	kfree(hist);}EXPORT_SYMBOL_GPL(dccp_tx_hist_delete);struct dccp_tx_hist_entry *	dccp_tx_hist_find_entry(const struct list_head *list, const u64 seq){	struct dccp_tx_hist_entry *packet = NULL, *entry;	list_for_each_entry(entry, list, dccphtx_node)		if (entry->dccphtx_seqno == seq) {			packet = entry;			break;		}	return packet;}EXPORT_SYMBOL_GPL(dccp_tx_hist_find_entry);void dccp_tx_hist_purge_older(struct dccp_tx_hist *hist,			      struct list_head *list,			      struct dccp_tx_hist_entry *packet){	struct dccp_tx_hist_entry *next;	list_for_each_entry_safe_continue(packet, next, list, dccphtx_node) {		list_del_init(&packet->dccphtx_node);		dccp_tx_hist_entry_delete(hist, packet);	}}EXPORT_SYMBOL_GPL(dccp_tx_hist_purge_older);void dccp_tx_hist_purge(struct dccp_tx_hist *hist, struct list_head *list){	struct dccp_tx_hist_entry *entry, *next;	list_for_each_entry_safe(entry, next, list, dccphtx_node) {		list_del_init(&entry->dccphtx_node);		dccp_tx_hist_entry_delete(hist, entry);	}}EXPORT_SYMBOL_GPL(dccp_tx_hist_purge);MODULE_AUTHOR("Ian McDonald <iam4@cs.waikato.ac.nz>, "	      "Arnaldo Carvalho de Melo <acme@ghostprotocols.net>");MODULE_DESCRIPTION("DCCP TFRC library");MODULE_LICENSE("GPL");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区免费在线| 欧美在线你懂的| 日韩电影一区二区三区四区| 日韩一区二区免费视频| 色香蕉成人二区免费| 国产一区 二区| 免费在线成人网| 亚洲午夜三级在线| 亚洲欧洲av在线| 91精品国产一区二区三区香蕉| 国产高清在线精品| 久久成人18免费观看| 日本不卡一区二区| 亚洲精品久久久蜜桃| 日韩码欧中文字| 日韩免费视频线观看| 91麻豆精品国产91久久久久| 欧美在线观看一区| 91国内精品野花午夜精品| 国产精品一二三四| 国产精品18久久久久久久久久久久| 亚洲欧美另类久久久精品| 国产精品久久久久永久免费观看| 国产午夜精品理论片a级大结局 | 欧美大片在线观看| 91精品国产综合久久久蜜臀图片| 欧美视频自拍偷拍| 91久久精品国产91性色tv | 日韩二区在线观看| 亚洲国产成人av网| 蜜臀国产一区二区三区在线播放 | 成人一区二区三区视频在线观看| 色综合久久天天综合网| 欧美日韩1区2区| 精品国产乱码久久久久久久| 国产精品天干天干在观线| 亚洲视频综合在线| 日韩电影在线一区| 国产白丝网站精品污在线入口| 不卡视频一二三| 欧美日韩高清影院| 精品国产91洋老外米糕| 国产精品电影一区二区三区| 亚洲国产视频直播| 国产一区二区成人久久免费影院 | 久久久久国产免费免费| 亚洲视频免费在线| 男人的j进女人的j一区| 高清beeg欧美| 在线成人av网站| 中文成人av在线| 天天av天天翘天天综合网色鬼国产| 美女任你摸久久| 99vv1com这只有精品| 欧美一区二区三区免费视频| 国产精品每日更新| 婷婷综合另类小说色区| 成人精品亚洲人成在线| 在线综合+亚洲+欧美中文字幕| 国产精品久久久久四虎| 免播放器亚洲一区| 色8久久精品久久久久久蜜| 26uuu精品一区二区三区四区在线| 亚洲日本在线视频观看| 激情偷乱视频一区二区三区| 一本久久精品一区二区| 国产亚洲成年网址在线观看| 午夜伊人狠狠久久| 99久久精品国产麻豆演员表| 日韩欧美国产午夜精品| 亚洲制服欧美中文字幕中文字幕| 国产成人av电影免费在线观看| 欧美日韩国产小视频在线观看| 国产精品色噜噜| 国产专区欧美精品| 欧美一级日韩免费不卡| 亚洲综合一区二区三区| 成人91在线观看| 久久久激情视频| 久久99精品一区二区三区| 色94色欧美sute亚洲13| 最好看的中文字幕久久| 国产精品一二三四五| 日韩精品在线网站| 日日嗨av一区二区三区四区| 色老汉av一区二区三区| 国产精品乱码妇女bbbb| 国产呦萝稀缺另类资源| 日韩片之四级片| 三级一区在线视频先锋 | 久久久亚洲高清| 免费精品99久久国产综合精品| 精品婷婷伊人一区三区三| 亚洲日本va午夜在线影院| 丁香婷婷综合激情五月色| 2023国产精品视频| 久久国产夜色精品鲁鲁99| 91精品国产丝袜白色高跟鞋| 亚洲大片在线观看| 欧美影视一区在线| 一区二区三区日韩精品视频| 97久久精品人人澡人人爽| 国产精品欧美综合在线| 懂色av一区二区三区免费观看| 久久综合久久综合亚洲| 激情五月激情综合网| 精品国产露脸精彩对白| 国产呦萝稀缺另类资源| 国产丝袜欧美中文另类| 粉嫩aⅴ一区二区三区四区五区| 久久久99精品免费观看不卡| 国产在线精品不卡| 欧美国产日韩一二三区| eeuss鲁片一区二区三区| 国产精品久久久久久久久久久免费看| 国产成人精品www牛牛影视| 国产农村妇女精品| 99久久综合色| 一区二区三区在线免费播放| 欧美午夜不卡在线观看免费| 日韩专区一卡二卡| 精品国产一二三区| 国产成人亚洲精品青草天美| 国产精品久久久久久久久动漫| av电影在线观看一区| 艳妇臀荡乳欲伦亚洲一区| 欧美三电影在线| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美tk—视频vk| 国产成人av电影在线观看| 国产精品你懂的| 欧美体内she精高潮| 蜜桃av噜噜一区二区三区小说| 久久综合九色综合97婷婷女人| 国产成人av电影免费在线观看| 亚洲欧洲av一区二区三区久久| 精品视频在线免费| 国产精品资源站在线| 中文字幕亚洲一区二区va在线| 欧美专区亚洲专区| 久久成人免费网| 亚洲婷婷综合色高清在线| 51精品视频一区二区三区| 国产精选一区二区三区| 一区二区高清在线| 欧美成人一区二区| 91蝌蚪国产九色| 裸体一区二区三区| 亚洲欧洲韩国日本视频| 日韩欧美色综合| 99re成人在线| 日本不卡一二三| 亚洲人成人一区二区在线观看| 91精品国产手机| 96av麻豆蜜桃一区二区| 日本不卡一区二区三区 | 成人综合婷婷国产精品久久| 一区2区3区在线看| 精品处破学生在线二十三| 91视频国产观看| 国产乱码精品一区二区三| 樱桃视频在线观看一区| 久久久久国产精品免费免费搜索| 欧美最猛黑人xxxxx猛交| 国产在线精品一区二区三区不卡| 亚洲品质自拍视频网站| 久久综合九色综合久久久精品综合| 色婷婷久久久综合中文字幕| 韩国av一区二区| 亚洲午夜av在线| 亚洲欧洲一区二区在线播放| 欧美成人性战久久| 欧美三级欧美一级| 99国产精品一区| 国产伦精品一区二区三区免费迷 | 亚洲综合一区二区三区| 欧美极品aⅴ影院| 日韩亚洲欧美一区二区三区| 91首页免费视频| 粉嫩一区二区三区在线看| 奇米影视在线99精品| 亚洲国产一区视频| 亚洲男人的天堂在线观看| 久久亚洲精品国产精品紫薇| 欧美日韩中文字幕一区| 色综合久久综合| 成人av电影在线观看| 国产精品主播直播| 黑人精品欧美一区二区蜜桃 | 在线精品视频一区二区三四 | 欧美一区二区女人| 欧美日韩精品一区二区三区蜜桃| 波多野结衣中文字幕一区二区三区| 久久aⅴ国产欧美74aaa| 日韩精品色哟哟| 亚洲成人资源在线| 亚洲在线视频免费观看| 亚洲制服丝袜av| 亚洲国产精品久久久男人的天堂| 一区二区在线观看av|