⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nf_conntrack_h323_asn1.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		CHECK_BOUND(bs, 2);		len = get_len(bs) + f->lb;		break;	default:		/* 2 <= Range <= 255 */		len = get_bits(bs, f->sz) + f->lb;		BYTE_ALIGN(bs);		break;	}	bs->cur += len;	PRINT("\n");	CHECK_BOUND(bs, 0);	return H323_ERROR_NONE;}/****************************************************************************/int decode_bmpstr(bitstr_t * bs, field_t * f, char *base, int level){	unsigned len;	PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);	switch (f->sz) {	case BYTE:		/* Range == 256 */		BYTE_ALIGN(bs);		CHECK_BOUND(bs, 1);		len = (*bs->cur++) + f->lb;		break;	default:		/* 2 <= Range <= 255 */		len = get_bits(bs, f->sz) + f->lb;		BYTE_ALIGN(bs);		break;	}	bs->cur += len << 1;	CHECK_BOUND(bs, 0);	return H323_ERROR_NONE;}/****************************************************************************/int decode_seq(bitstr_t * bs, field_t * f, char *base, int level){	unsigned ext, bmp, i, opt, len = 0, bmp2, bmp2_len;	int err;	field_t *son;	unsigned char *beg = NULL;	PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);	/* Decode? */	base = (base && (f->attr & DECODE)) ? base + f->offset : NULL;	/* Extensible? */	ext = (f->attr & EXT) ? get_bit(bs) : 0;	/* Get fields bitmap */	bmp = get_bitmap(bs, f->sz);	if (base)		*(unsigned *) base = bmp;	/* Decode the root components */	for (i = opt = 0, son = f->fields; i < f->lb; i++, son++) {		if (son->attr & STOP) {			PRINT("%*.s%s\n", (level + 1) * TAB_SIZE, " ",			      son->name);			return H323_ERROR_STOP;		}		if (son->attr & OPT) {	/* Optional component */			if (!((0x80000000U >> (opt++)) & bmp))	/* Not exist */				continue;		}		/* Decode */		if (son->attr & OPEN) {	/* Open field */			CHECK_BOUND(bs, 2);			len = get_len(bs);			CHECK_BOUND(bs, len);			if (!base || !(son->attr & DECODE)) {				PRINT("%*.s%s\n", (level + 1) * TAB_SIZE,				      " ", son->name);				bs->cur += len;				continue;			}			beg = bs->cur;			/* Decode */			if ((err = (Decoders[son->type]) (bs, son, base,							  level + 1)) <			    H323_ERROR_NONE)				return err;			bs->cur = beg + len;			bs->bit = 0;		} else if ((err = (Decoders[son->type]) (bs, son, base,							 level + 1)) <			   H323_ERROR_NONE)			return err;	}	/* No extension? */	if (!ext)		return H323_ERROR_NONE;	/* Get the extension bitmap */	bmp2_len = get_bits(bs, 7) + 1;	CHECK_BOUND(bs, (bmp2_len + 7) >> 3);	bmp2 = get_bitmap(bs, bmp2_len);	bmp |= bmp2 >> f->sz;	if (base)		*(unsigned *) base = bmp;	BYTE_ALIGN(bs);	/* Decode the extension components */	for (opt = 0; opt < bmp2_len; opt++, i++, son++) {		/* Check Range */		if (i >= f->ub) {	/* Newer Version? */			CHECK_BOUND(bs, 2);			len = get_len(bs);			CHECK_BOUND(bs, len);			bs->cur += len;			continue;		}		if (son->attr & STOP) {			PRINT("%*.s%s\n", (level + 1) * TAB_SIZE, " ",			      son->name);			return H323_ERROR_STOP;		}		if (!((0x80000000 >> opt) & bmp2))	/* Not present */			continue;		CHECK_BOUND(bs, 2);		len = get_len(bs);		CHECK_BOUND(bs, len);		if (!base || !(son->attr & DECODE)) {			PRINT("%*.s%s\n", (level + 1) * TAB_SIZE, " ",			      son->name);			bs->cur += len;			continue;		}		beg = bs->cur;		if ((err = (Decoders[son->type]) (bs, son, base,						  level + 1)) <		    H323_ERROR_NONE)			return err;		bs->cur = beg + len;		bs->bit = 0;	}	return H323_ERROR_NONE;}/****************************************************************************/int decode_seqof(bitstr_t * bs, field_t * f, char *base, int level){	unsigned count, effective_count = 0, i, len = 0;	int err;	field_t *son;	unsigned char *beg = NULL;	PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);	/* Decode? */	base = (base && (f->attr & DECODE)) ? base + f->offset : NULL;	/* Decode item count */	switch (f->sz) {	case BYTE:		BYTE_ALIGN(bs);		CHECK_BOUND(bs, 1);		count = *bs->cur++;		break;	case WORD:		BYTE_ALIGN(bs);		CHECK_BOUND(bs, 2);		count = *bs->cur++;		count <<= 8;		count = *bs->cur++;		break;	case SEMI:		BYTE_ALIGN(bs);		CHECK_BOUND(bs, 2);		count = get_len(bs);		break;	default:		count = get_bits(bs, f->sz);		break;	}	count += f->lb;	/* Write Count */	if (base) {		effective_count = count > f->ub ? f->ub : count;		*(unsigned *) base = effective_count;		base += sizeof(unsigned);	}	/* Decode nested field */	son = f->fields;	if (base)		base -= son->offset;	for (i = 0; i < count; i++) {		if (son->attr & OPEN) {			BYTE_ALIGN(bs);			len = get_len(bs);			CHECK_BOUND(bs, len);			if (!base || !(son->attr & DECODE)) {				PRINT("%*.s%s\n", (level + 1) * TAB_SIZE,				      " ", son->name);				bs->cur += len;				continue;			}			beg = bs->cur;			if ((err = (Decoders[son->type]) (bs, son,							  i <							  effective_count ?							  base : NULL,							  level + 1)) <			    H323_ERROR_NONE)				return err;			bs->cur = beg + len;			bs->bit = 0;		} else			if ((err = (Decoders[son->type]) (bs, son,							  i <							  effective_count ?							  base : NULL,							  level + 1)) <			    H323_ERROR_NONE)				return err;		if (base)			base += son->offset;	}	return H323_ERROR_NONE;}/****************************************************************************/int decode_choice(bitstr_t * bs, field_t * f, char *base, int level){	unsigned type, ext, len = 0;	int err;	field_t *son;	unsigned char *beg = NULL;	PRINT("%*.s%s\n", level * TAB_SIZE, " ", f->name);	/* Decode? */	base = (base && (f->attr & DECODE)) ? base + f->offset : NULL;	/* Decode the choice index number */	if ((f->attr & EXT) && get_bit(bs)) {		ext = 1;		type = get_bits(bs, 7) + f->lb;	} else {		ext = 0;		type = get_bits(bs, f->sz);		if (type >= f->lb)			return H323_ERROR_RANGE;	}	/* Write Type */	if (base)		*(unsigned *) base = type;	/* Check Range */	if (type >= f->ub) {	/* Newer version? */		BYTE_ALIGN(bs);		len = get_len(bs);		CHECK_BOUND(bs, len);		bs->cur += len;		return H323_ERROR_NONE;	}	/* Transfer to son level */	son = &f->fields[type];	if (son->attr & STOP) {		PRINT("%*.s%s\n", (level + 1) * TAB_SIZE, " ", son->name);		return H323_ERROR_STOP;	}	if (ext || (son->attr & OPEN)) {		BYTE_ALIGN(bs);		len = get_len(bs);		CHECK_BOUND(bs, len);		if (!base || !(son->attr & DECODE)) {			PRINT("%*.s%s\n", (level + 1) * TAB_SIZE, " ",			      son->name);			bs->cur += len;			return H323_ERROR_NONE;		}		beg = bs->cur;		if ((err = (Decoders[son->type]) (bs, son, base, level + 1)) <		    H323_ERROR_NONE)			return err;		bs->cur = beg + len;		bs->bit = 0;	} else if ((err = (Decoders[son->type]) (bs, son, base, level + 1)) <		   H323_ERROR_NONE)		return err;	return H323_ERROR_NONE;}/****************************************************************************/int DecodeRasMessage(unsigned char *buf, size_t sz, RasMessage * ras){	static field_t ras_message = {		FNAME("RasMessage") CHOICE, 5, 24, 32, DECODE | EXT,		0, _RasMessage	};	bitstr_t bs;	bs.buf = bs.beg = bs.cur = buf;	bs.end = buf + sz;	bs.bit = 0;	return decode_choice(&bs, &ras_message, (char *) ras, 0);}/****************************************************************************/static int DecodeH323_UserInformation(unsigned char *buf, unsigned char *beg,				      size_t sz, H323_UserInformation * uuie){	static field_t h323_userinformation = {		FNAME("H323-UserInformation") SEQ, 1, 2, 2, DECODE | EXT,		0, _H323_UserInformation	};	bitstr_t bs;	bs.buf = buf;	bs.beg = bs.cur = beg;	bs.end = beg + sz;	bs.bit = 0;	return decode_seq(&bs, &h323_userinformation, (char *) uuie, 0);}/****************************************************************************/int DecodeMultimediaSystemControlMessage(unsigned char *buf, size_t sz,					 MultimediaSystemControlMessage *					 mscm){	static field_t multimediasystemcontrolmessage = {		FNAME("MultimediaSystemControlMessage") CHOICE, 2, 4, 4,		DECODE | EXT, 0, _MultimediaSystemControlMessage	};	bitstr_t bs;	bs.buf = bs.beg = bs.cur = buf;	bs.end = buf + sz;	bs.bit = 0;	return decode_choice(&bs, &multimediasystemcontrolmessage,			     (char *) mscm, 0);}/****************************************************************************/int DecodeQ931(unsigned char *buf, size_t sz, Q931 * q931){	unsigned char *p = buf;	int len;	if (!p || sz < 1)		return H323_ERROR_BOUND;	/* Protocol Discriminator */	if (*p != 0x08) {		PRINT("Unknown Protocol Discriminator\n");		return H323_ERROR_RANGE;	}	p++;	sz--;	/* CallReferenceValue */	if (sz < 1)		return H323_ERROR_BOUND;	len = *p++;	sz--;	if (sz < len)		return H323_ERROR_BOUND;	p += len;	sz -= len;	/* Message Type */	if (sz < 1)		return H323_ERROR_BOUND;	q931->MessageType = *p++;	PRINT("MessageType = %02X\n", q931->MessageType);	if (*p & 0x80) {		p++;		sz--;	}	/* Decode Information Elements */	while (sz > 0) {		if (*p == 0x7e) {	/* UserUserIE */			if (sz < 3)				break;			p++;			len = *p++ << 8;			len |= *p++;			sz -= 3;			if (sz < len)				break;			p++;			len--;			return DecodeH323_UserInformation(buf, p, len,							  &q931->UUIE);		}		p++;		sz--;		if (sz < 1)			break;		len = *p++;		if (sz < len)			break;		p += len;		sz -= len;	}	PRINT("Q.931 UUIE not found\n");	return H323_ERROR_BOUND;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -