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

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

?? digest.c

?? Ubuntu公司提供免費的iSCSI Target
?? C
字號:
/* * iSCSI digest handling. * (C) 2004 - 2006 Xiranet Communications GmbH <arne.redlich@xiranet.com> * This code is licensed under the GPL. */#include <asm/types.h>#include <asm/scatterlist.h>#include "iscsi.h"#include "digest.h"#include "iscsi_dbg.h"void digest_alg_available(unsigned int *val){	if (*val & DIGEST_CRC32C &&	    !crypto_has_alg("crc32c", 0, CRYPTO_ALG_ASYNC)) {		printk("CRC32C digest algorithm not available in kernel\n");		*val |= ~DIGEST_CRC32C;	}}/** * initialize support for digest calculation. * * digest_init - * @conn: ptr to connection to make use of digests * * @return: 0 on success, < 0 on error */int digest_init(struct iscsi_conn *conn){	int err = 0;	if (!(conn->hdigest_type & DIGEST_ALL))		conn->hdigest_type = DIGEST_NONE;	if (!(conn->ddigest_type & DIGEST_ALL))		conn->ddigest_type = DIGEST_NONE;	if (conn->hdigest_type & DIGEST_CRC32C ||	    conn->ddigest_type & DIGEST_CRC32C) {		conn->rx_hash.tfm = crypto_alloc_hash("crc32c", 0,						      CRYPTO_ALG_ASYNC);		conn->rx_hash.flags = 0;		if (IS_ERR(conn->rx_hash.tfm)) {			conn->rx_hash.tfm = NULL;			err = -ENOMEM;			goto out;		}		conn->tx_hash.tfm = crypto_alloc_hash("crc32c", 0,						      CRYPTO_ALG_ASYNC);		conn->tx_hash.flags = 0;		if (IS_ERR(conn->tx_hash.tfm)) {			conn->tx_hash.tfm = NULL;			err = -ENOMEM;			goto out;		}	}out:	if (err)		digest_cleanup(conn);	return err;}/** * free resources used for digest calculation. * * digest_cleanup - * @conn: ptr to connection that made use of digests */void digest_cleanup(struct iscsi_conn *conn){	if (conn->tx_hash.tfm)		crypto_free_hash(conn->tx_hash.tfm);	if (conn->rx_hash.tfm)		crypto_free_hash(conn->rx_hash.tfm);}/** * debug handling of header digest errors: * simulates a digest error after n PDUs / every n-th PDU of type * HDIGEST_ERR_CORRUPT_PDU_TYPE. */static inline void __dbg_simulate_header_digest_error(struct iscsi_cmnd *cmnd){#define HDIGEST_ERR_AFTER_N_CMNDS 1000#define HDIGEST_ERR_ONLY_ONCE     1#define HDIGEST_ERR_CORRUPT_PDU_TYPE ISCSI_OP_SCSI_CMD#define HDIGEST_ERR_CORRUPT_PDU_WITH_DATA_ONLY 0	static int num_cmnds = 0;	static int num_errs = 0;	if (cmnd_opcode(cmnd) == HDIGEST_ERR_CORRUPT_PDU_TYPE) {		if (HDIGEST_ERR_CORRUPT_PDU_WITH_DATA_ONLY) {			if (cmnd->pdu.datasize)				num_cmnds++;		} else			num_cmnds++;	}	if ((num_cmnds == HDIGEST_ERR_AFTER_N_CMNDS)	    && (!(HDIGEST_ERR_ONLY_ONCE && num_errs))) {		printk("*** Faking header digest error ***\n");		printk("\tcmnd: 0x%x, itt 0x%x, sn 0x%x\n",		       cmnd_opcode(cmnd),		       be32_to_cpu(cmnd->pdu.bhs.itt),		       be32_to_cpu(cmnd->pdu.bhs.sn));		cmnd->hdigest = ~cmnd->hdigest;		/* make things even worse by manipulating header fields */		cmnd->pdu.datasize += 8;		num_errs++;		num_cmnds = 0;	}	return;}/** * debug handling of data digest errors: * simulates a digest error after n PDUs / every n-th PDU of type * DDIGEST_ERR_CORRUPT_PDU_TYPE. */static inline void __dbg_simulate_data_digest_error(struct iscsi_cmnd *cmnd){#define DDIGEST_ERR_AFTER_N_CMNDS 50#define DDIGEST_ERR_ONLY_ONCE     1#define DDIGEST_ERR_CORRUPT_PDU_TYPE   ISCSI_OP_SCSI_DATA_OUT#define DDIGEST_ERR_CORRUPT_UNSOL_DATA_ONLY 0	static int num_cmnds = 0;	static int num_errs = 0;	if ((cmnd->pdu.datasize)	    && (cmnd_opcode(cmnd) == DDIGEST_ERR_CORRUPT_PDU_TYPE)) {		switch (cmnd_opcode(cmnd)) {		case ISCSI_OP_SCSI_DATA_OUT:			if ((DDIGEST_ERR_CORRUPT_UNSOL_DATA_ONLY)			    && (cmnd->pdu.bhs.ttt != ISCSI_RESERVED_TAG))				break;		default:			num_cmnds++;		}	}	if ((num_cmnds == DDIGEST_ERR_AFTER_N_CMNDS)	    && (!(DDIGEST_ERR_ONLY_ONCE && num_errs))	    && (cmnd->pdu.datasize)	    && (!cmnd->conn->read_overflow)) {		printk("*** Faking data digest error: ***");		printk("\tcmnd 0x%x, itt 0x%x, sn 0x%x\n",		       cmnd_opcode(cmnd),		       be32_to_cpu(cmnd->pdu.bhs.itt),		       be32_to_cpu(cmnd->pdu.bhs.sn));		cmnd->ddigest = ~cmnd->ddigest;		num_errs++;		num_cmnds = 0;	}}static void digest_header(struct hash_desc *hash, struct iscsi_pdu *pdu,			  u8 *crc){	struct scatterlist sg[2];	unsigned int nbytes = sizeof(struct iscsi_hdr);	sg_init_table(sg, pdu->ahssize ? 2 : 1);	sg_set_buf(&sg[0], &pdu->bhs, nbytes);	if (pdu->ahssize) {		sg_set_buf(&sg[1], pdu->ahs, pdu->ahssize);		nbytes += pdu->ahssize;	}	crypto_hash_init(hash);	crypto_hash_update(hash, sg, nbytes);	crypto_hash_final(hash, crc);}int digest_rx_header(struct iscsi_cmnd *cmnd){	u32 crc;	digest_header(&cmnd->conn->rx_hash, &cmnd->pdu, (u8 *) &crc);	if (crc != cmnd->hdigest)		return -EIO;	return 0;}void digest_tx_header(struct iscsi_cmnd *cmnd){	digest_header(&cmnd->conn->tx_hash, &cmnd->pdu, (u8 *) &cmnd->hdigest);}static void digest_data(struct hash_desc *hash, struct iscsi_cmnd *cmnd,			struct tio *tio, u32 offset, u8 *crc){	struct scatterlist *sg = cmnd->conn->hash_sg;	u32 size, length;	int i, idx, count;	unsigned int nbytes;	size = cmnd->pdu.datasize;	nbytes = size = (size + 3) & ~3;	offset += tio->offset;	idx = offset >> PAGE_CACHE_SHIFT;	offset &= ~PAGE_CACHE_MASK;	count = get_pgcnt(size, offset);	assert(idx + count <= tio->pg_cnt);	assert(count <= ISCSI_CONN_IOV_MAX);	sg_init_table(sg, ARRAY_SIZE(cmnd->conn->hash_sg));	crypto_hash_init(hash);	for (i = 0; size; i++) {		if (offset + size > PAGE_CACHE_SIZE)			length = PAGE_CACHE_SIZE - offset;		else			length = size;		sg_set_page(&sg[i], tio->pvec[idx + i], length, offset);		size -= length;		offset = 0;	}	sg_mark_end(&sg[i - 1]);	crypto_hash_update(hash, sg, nbytes);	crypto_hash_final(hash, crc);}int digest_rx_data(struct iscsi_cmnd *cmnd){	struct tio *tio;	struct iscsi_cmnd *scsi_cmnd;	struct iscsi_data_out_hdr *req;	u32 offset, crc;	switch (cmnd_opcode(cmnd)) {	case ISCSI_OP_SCSI_REJECT:	case ISCSI_OP_PDU_REJECT:	case ISCSI_OP_DATA_REJECT:		return 0;	case ISCSI_OP_SCSI_DATA_OUT:		scsi_cmnd = cmnd->req;		req = (struct iscsi_data_out_hdr *) &cmnd->pdu.bhs;		tio = scsi_cmnd->tio;		offset = be32_to_cpu(req->buffer_offset);		break;	default:		tio = cmnd->tio;		offset = 0;	}	digest_data(&cmnd->conn->rx_hash, cmnd, tio, offset, (u8 *) &crc);	if (!cmnd->conn->read_overflow &&	    (cmnd_opcode(cmnd) != ISCSI_OP_PDU_REJECT)) {		if (crc != cmnd->ddigest)			return -EIO;	}	return 0;}void digest_tx_data(struct iscsi_cmnd *cmnd){	struct tio *tio = cmnd->tio;	struct iscsi_data_out_hdr *req = (struct iscsi_data_out_hdr *)&cmnd->pdu.bhs;	assert(tio);	digest_data(&cmnd->conn->tx_hash, cmnd, tio,		    be32_to_cpu(req->buffer_offset), (u8 *) &cmnd->ddigest);}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本aⅴ亚洲精品中文乱码| 亚洲精品免费一二三区| 国产黄色精品视频| 中文字幕中文字幕一区二区| 99国产精品国产精品久久| 综合精品久久久| 欧洲av在线精品| 久久国产免费看| 国产精品欧美久久久久无广告| av在线一区二区| 精品一区二区三区的国产在线播放| 91精品国产色综合久久| 国产在线播精品第三| 国产精品美女久久久久久2018| 色哟哟亚洲精品| 捆绑调教一区二区三区| 亚洲欧洲99久久| 欧美精选午夜久久久乱码6080| 精品影视av免费| 亚洲色欲色欲www在线观看| 欧美日韩激情在线| 国产精品一区二区无线| 亚洲精品视频在线| 日韩精品中文字幕在线不卡尤物| 国产成人在线观看免费网站| 亚洲精品免费电影| 欧美r级在线观看| 在线免费亚洲电影| 国产一二精品视频| 亚洲一二三区在线观看| 亚洲精品在线免费播放| 欧美亚洲动漫精品| 国产精品资源网站| 日韩电影一区二区三区四区| 欧美国产成人精品| 日韩三级伦理片妻子的秘密按摩| 成人美女视频在线看| 蜜乳av一区二区三区| 亚洲人xxxx| 国产午夜精品一区二区| 欧美群妇大交群中文字幕| 成人黄动漫网站免费app| 日本在线不卡视频| 亚洲卡通动漫在线| 久久久久久久av麻豆果冻| 欧美日韩一区 二区 三区 久久精品| 国内精品免费在线观看| 日本成人在线视频网站| 一区二区在线免费观看| 亚洲午夜电影在线观看| 国产精品乱码一区二三区小蝌蚪| 欧美一级高清大全免费观看| 色婷婷综合激情| 国产成人福利片| 国产主播一区二区| 久久精品国产免费| 日韩电影在线观看电影| 香蕉成人伊视频在线观看| 日韩码欧中文字| 国产精品久久久久久久久图文区| 欧美tk丨vk视频| 在线综合视频播放| 色狠狠色噜噜噜综合网| 91视频免费观看| www.日韩精品| av午夜精品一区二区三区| 国产**成人网毛片九色| 国产伦精一区二区三区| 蜜臀av国产精品久久久久| 一区二区三区精品视频在线| 亚洲精品日日夜夜| 国产精品久久久久影院老司| 中文字幕精品一区二区三区精品| 国产午夜精品一区二区三区四区| 久久综合久久99| 久久这里只精品最新地址| 精品粉嫩超白一线天av| 日韩欧美的一区二区| 日韩欧美高清dvd碟片| 精品久久久久久综合日本欧美| 9191精品国产综合久久久久久 | 亚洲免费在线观看视频| 亚洲三级视频在线观看| 亚洲蜜臀av乱码久久精品| 亚洲欧美日韩人成在线播放| 亚洲综合久久av| 亚洲高清不卡在线观看| 天天色综合天天| 欧美aⅴ一区二区三区视频| 久久99国产精品免费| 国产精品一区二区在线观看不卡| 成人免费三级在线| 日本道精品一区二区三区| 欧美日韩一区二区三区在线| 欧美一区二区三区视频免费 | 色88888久久久久久影院按摩 | 亚洲男人天堂av网| 亚洲v中文字幕| 轻轻草成人在线| 国产suv精品一区二区三区 | 欧美色爱综合网| 欧美一级二级三级乱码| 久久新电视剧免费观看| 国产精品国产三级国产aⅴ中文 | 日韩精品久久久久久| 久久91精品国产91久久小草| 成人一区二区三区| 欧美亚洲一区二区在线| 精品粉嫩超白一线天av| 亚洲欧美乱综合| 久久99精品国产麻豆婷婷洗澡| 成人黄色软件下载| 欧美麻豆精品久久久久久| 国产无一区二区| 香蕉久久夜色精品国产使用方法| 国产一区二区三区四区五区入口| 99视频有精品| 欧美一区二区三区电影| 一色桃子久久精品亚洲| 蜜桃视频一区二区三区在线观看| 国产91精品一区二区麻豆网站 | 91福利在线导航| 久久先锋资源网| 亚洲综合无码一区二区| 国产黄色精品网站| 91精品在线一区二区| 成人欧美一区二区三区黑人麻豆| 日本成人在线电影网| 91九色最新地址| 亚洲国产高清不卡| 卡一卡二国产精品| 在线观看av一区| 国产精品久久久久7777按摩| 麻豆国产精品官网| 欧美日韩一级二级三级| 国产精品国产三级国产aⅴ原创| 麻豆精品视频在线观看视频| 在线免费视频一区二区| 国产精品久线在线观看| 国产精品小仙女| 日韩一区二区免费在线观看| 一区二区三区国产豹纹内裤在线| 国产999精品久久久久久绿帽| 欧美丰满一区二区免费视频| 亚洲精品免费电影| 成人国产精品视频| 国产三级精品视频| 国产一区在线精品| 91精品国产91久久久久久一区二区 | 欧美videos中文字幕| 香港成人在线视频| 欧美在线小视频| 一区二区三区在线免费视频| 99国内精品久久| 中文字幕在线不卡视频| 成人久久视频在线观看| 国产无遮挡一区二区三区毛片日本| 久久电影网电视剧免费观看| 在线电影国产精品| 午夜久久电影网| 欧美日本在线播放| 亚洲午夜在线视频| 欧美视频一区在线观看| 亚洲综合色丁香婷婷六月图片| 97精品国产露脸对白| 综合欧美亚洲日本| 一本一道波多野结衣一区二区 | 亚洲v精品v日韩v欧美v专区| 欧美网站大全在线观看| 亚洲另类春色国产| 欧美性高清videossexo| 亚洲一本大道在线| 制服丝袜亚洲精品中文字幕| 日韩精品一区第一页| 欧美一区三区四区| 免费成人结看片| 久久新电视剧免费观看| 春色校园综合激情亚洲| 日韩毛片视频在线看| 精品视频在线免费观看| 日韩国产在线观看一区| 日韩精品一区二区三区四区| 国产精品一区在线观看乱码| 国产精品夫妻自拍| 色久优优欧美色久优优| 天堂av在线一区| 精品久久一区二区三区| 国产成人一级电影| 一区二区三区日韩| 日韩一区二区视频在线观看| 国产麻豆9l精品三级站| 亚洲日本va午夜在线电影| 欧美日韩高清不卡| 国产呦萝稀缺另类资源| 中文字幕亚洲一区二区va在线| 欧美日韩一区国产| 国产一区二区精品在线观看| 亚洲男人的天堂在线aⅴ视频| 欧美精品一卡两卡| 国产成人av在线影院|