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

📄 iax2-parser.c

📁 Asterisk中信道部分的源码 。。。。
💻 C
📖 第 1 页 / 共 3 页
字号:
		case IAX_IE_RDNIS:			ies->rdnis = (char *)data + 2;			break;		case IAX_IE_AUTHMETHODS:			if (len != (int)sizeof(unsigned short))  {				snprintf(tmp, (int)sizeof(tmp), "Expecting authmethods to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);				errorf(tmp);			} else				ies->authmethods = ntohs(get_unaligned_uint16(data + 2));			break;		case IAX_IE_ENCRYPTION:			if (len != (int)sizeof(unsigned short))  {				snprintf(tmp, (int)sizeof(tmp), "Expecting encryption to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);				errorf(tmp);			} else				ies->encmethods = ntohs(get_unaligned_uint16(data + 2));			break;		case IAX_IE_CHALLENGE:			ies->challenge = (char *)data + 2;			break;		case IAX_IE_MD5_RESULT:			ies->md5_result = (char *)data + 2;			break;		case IAX_IE_RSA_RESULT:			ies->rsa_result = (char *)data + 2;			break;		case IAX_IE_APPARENT_ADDR:			ies->apparent_addr = ((struct sockaddr_in *)(data + 2));			break;		case IAX_IE_REFRESH:			if (len != (int)sizeof(unsigned short)) {				snprintf(tmp, (int)sizeof(tmp),  "Expecting refresh to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);				errorf(tmp);			} else				ies->refresh = ntohs(get_unaligned_uint16(data + 2));			break;		case IAX_IE_DPSTATUS:			if (len != (int)sizeof(unsigned short)) {				snprintf(tmp, (int)sizeof(tmp),  "Expecting dpstatus to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);				errorf(tmp);			} else				ies->dpstatus = ntohs(get_unaligned_uint16(data + 2));			break;		case IAX_IE_CALLNO:			if (len != (int)sizeof(unsigned short)) {				snprintf(tmp, (int)sizeof(tmp),  "Expecting callno to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);				errorf(tmp);			} else				ies->callno = ntohs(get_unaligned_uint16(data + 2));			break;		case IAX_IE_CAUSE:			ies->cause = (char *)data + 2;			break;		case IAX_IE_CAUSECODE:			if (len != 1) {				snprintf(tmp, (int)sizeof(tmp), "Expecting causecode to be single byte but was %d\n", len);				errorf(tmp);			} else {				ies->causecode = data[2];			}			break;		case IAX_IE_IAX_UNKNOWN:			if (len == 1)				ies->iax_unknown = data[2];			else {				snprintf(tmp, (int)sizeof(tmp), "Expected single byte Unknown command, but was %d long\n", len);				errorf(tmp);			}			break;		case IAX_IE_MSGCOUNT:			if (len != (int)sizeof(unsigned short)) {				snprintf(tmp, (int)sizeof(tmp), "Expecting msgcount to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);				errorf(tmp);			} else				ies->msgcount = ntohs(get_unaligned_uint16(data + 2));				break;		case IAX_IE_AUTOANSWER:			ies->autoanswer = 1;			break;		case IAX_IE_MUSICONHOLD:			ies->musiconhold = 1;			break;		case IAX_IE_TRANSFERID:			if (len != (int)sizeof(unsigned int)) {				snprintf(tmp, (int)sizeof(tmp), "Expecting transferid to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len);				errorf(tmp);			} else				ies->transferid = ntohl(get_unaligned_uint32(data + 2));			break;		case IAX_IE_DATETIME:			if (len != (int)sizeof(unsigned int)) {				snprintf(tmp, (int)sizeof(tmp), "Expecting date/time to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len);				errorf(tmp);			} else				ies->datetime = ntohl(get_unaligned_uint32(data + 2));			break;		case IAX_IE_FIRMWAREVER:			if (len != (int)sizeof(unsigned short)) {				snprintf(tmp, (int)sizeof(tmp), "Expecting firmwarever to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);				errorf(tmp);			} else				ies->firmwarever = ntohs(get_unaligned_uint16(data + 2));				break;		case IAX_IE_DEVICETYPE:			ies->devicetype = (char *)data + 2;			break;		case IAX_IE_SERVICEIDENT:			ies->serviceident = (char *)data + 2;			break;		case IAX_IE_FWBLOCKDESC:			if (len != (int)sizeof(unsigned int)) {				snprintf(tmp, (int)sizeof(tmp), "Expected block desc to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len);				errorf(tmp);			} else				ies->fwdesc = ntohl(get_unaligned_uint32(data + 2));			break;		case IAX_IE_FWBLOCKDATA:			ies->fwdata = data + 2;			ies->fwdatalen = len;			break;		case IAX_IE_ENCKEY:			ies->enckey = data + 2;			ies->enckeylen = len;			break;		case IAX_IE_PROVVER:			if (len != (int)sizeof(unsigned int)) {				snprintf(tmp, (int)sizeof(tmp), "Expected provisioning version to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len);				errorf(tmp);			} else {				ies->provverpres = 1;				ies->provver = ntohl(get_unaligned_uint32(data + 2));			}			break;		case IAX_IE_CALLINGPRES:			if (len == 1)				ies->calling_pres = data[2];			else {				snprintf(tmp, (int)sizeof(tmp), "Expected single byte callingpres, but was %d long\n", len);				errorf(tmp);			}			break;		case IAX_IE_CALLINGTON:			if (len == 1)				ies->calling_ton = data[2];			else {				snprintf(tmp, (int)sizeof(tmp), "Expected single byte callington, but was %d long\n", len);				errorf(tmp);			}			break;		case IAX_IE_CALLINGTNS:			if (len != (int)sizeof(unsigned short)) {				snprintf(tmp, (int)sizeof(tmp), "Expecting callingtns to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);				errorf(tmp);			} else				ies->calling_tns = ntohs(get_unaligned_uint16(data + 2));				break;               case IAX_IE_RR_JITTER:                       if (len != (int)sizeof(unsigned int)) {                               snprintf(tmp, (int)sizeof(tmp), "Expected jitter rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len);                               errorf(tmp);                       } else {                               ies->rr_jitter = ntohl(get_unaligned_uint32(data + 2));                       }                       break;               case IAX_IE_RR_LOSS:                       if (len != (int)sizeof(unsigned int)) {                               snprintf(tmp, (int)sizeof(tmp), "Expected loss rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len);                               errorf(tmp);                       } else {                               ies->rr_loss = ntohl(get_unaligned_uint32(data + 2));                       }                       break;               case IAX_IE_RR_PKTS:                       if (len != (int)sizeof(unsigned int)) {                               snprintf(tmp, (int)sizeof(tmp), "Expected packets rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len);                               errorf(tmp);                       } else {                               ies->rr_pkts = ntohl(get_unaligned_uint32(data + 2));                       }                       break;               case IAX_IE_RR_DELAY:                       if (len != (int)sizeof(unsigned short)) {                               snprintf(tmp, (int)sizeof(tmp), "Expected loss rr to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);                        errorf(tmp);                       } else {                               ies->rr_delay = ntohs(get_unaligned_uint16(data + 2));                       }                       break;		case IAX_IE_RR_DROPPED:			if (len != (int)sizeof(unsigned int)) {				snprintf(tmp, (int)sizeof(tmp), "Expected packets rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len);				errorf(tmp);			} else {				ies->rr_dropped = ntohl(get_unaligned_uint32(data + 2));			}			break;		case IAX_IE_RR_OOO:			if (len != (int)sizeof(unsigned int)) {				snprintf(tmp, (int)sizeof(tmp), "Expected packets rr to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len);				errorf(tmp);			} else {				ies->rr_ooo = ntohl(get_unaligned_uint32(data + 2));			}			break;		default:			snprintf(tmp, (int)sizeof(tmp), "Ignoring unknown information element '%s' (%d) of length %d\n", iax_ie2str(ie), ie, len);			outputf(tmp);		}		/* Overwrite information element with 0, to null terminate previous portion */		data[0] = 0;		datalen -= (len + 2);		data += (len + 2);	}	/* Null-terminate last field */	*data = '\0';	if (datalen) {		errorf("Invalid information element contents, strange boundary\n");		return -1;	}	return 0;}void iax_frame_wrap(struct iax_frame *fr, struct ast_frame *f){	fr->af.frametype = f->frametype;	fr->af.subclass = f->subclass;	fr->af.mallocd = 0;				/* Our frame is static relative to the container */	fr->af.datalen = f->datalen;	fr->af.samples = f->samples;	fr->af.offset = AST_FRIENDLY_OFFSET;	fr->af.src = f->src;	fr->af.delivery.tv_sec = 0;	fr->af.delivery.tv_usec = 0;	fr->af.data = fr->afdata;	fr->af.len = f->len;	if (fr->af.datalen) {		size_t copy_len = fr->af.datalen;		if (copy_len > fr->afdatalen) {			ast_log(LOG_ERROR, "Losing frame data because destination buffer size '%d' bytes not big enough for '%d' bytes in the frame\n",				(int) fr->afdatalen, (int) fr->af.datalen);			copy_len = fr->afdatalen;		}#if __BYTE_ORDER == __LITTLE_ENDIAN		/* We need to byte-swap slinear samples from network byte order */		if ((fr->af.frametype == AST_FRAME_VOICE) && (fr->af.subclass == AST_FORMAT_SLINEAR)) {			/* 2 bytes / sample for SLINEAR */			ast_swapcopy_samples(fr->af.data, f->data, copy_len / 2);		} else#endif			memcpy(fr->af.data, f->data, copy_len);	}}struct iax_frame *iax_frame_new(int direction, int datalen, unsigned int cacheable){	struct iax_frame *fr = NULL;#if !defined(LOW_MEMORY)	struct iax_frames *iax_frames;	/* Attempt to get a frame from this thread's cache */	if ((iax_frames = ast_threadstorage_get(&frame_cache, sizeof(*iax_frames)))) {		AST_LIST_TRAVERSE_SAFE_BEGIN(&iax_frames->list, fr, list) {			if (fr->afdatalen >= datalen) {				size_t afdatalen = fr->afdatalen;				AST_LIST_REMOVE_CURRENT(&iax_frames->list, list);				iax_frames->size--;				memset(fr, 0, sizeof(*fr));				fr->afdatalen = afdatalen;				break;			}		}		AST_LIST_TRAVERSE_SAFE_END	}	if (!fr) {		if (!(fr = ast_calloc_cache(1, sizeof(*fr) + datalen)))			return NULL;		fr->afdatalen = datalen;	}#else	if (!(fr = ast_calloc(1, sizeof(*fr) + datalen)))		return NULL;	fr->afdatalen = datalen;#endif	fr->direction = direction;	fr->retrans = -1;	fr->cacheable = cacheable;		if (fr->direction == DIRECTION_INGRESS)		ast_atomic_fetchadd_int(&iframes, 1);	else		ast_atomic_fetchadd_int(&oframes, 1);		ast_atomic_fetchadd_int(&frames, 1);	return fr;}void iax_frame_free(struct iax_frame *fr){#if !defined(LOW_MEMORY)	struct iax_frames *iax_frames;#endif	/* Note: does not remove from scheduler! */	if (fr->direction == DIRECTION_INGRESS)		ast_atomic_fetchadd_int(&iframes, -1);	else if (fr->direction == DIRECTION_OUTGRESS)		ast_atomic_fetchadd_int(&oframes, -1);	else {		errorf("Attempt to double free frame detected\n");		return;	}	ast_atomic_fetchadd_int(&frames, -1);#if !defined(LOW_MEMORY)	if (!fr->cacheable || !(iax_frames = ast_threadstorage_get(&frame_cache, sizeof(*iax_frames)))) {		free(fr);		return;	}	if (iax_frames->size < FRAME_CACHE_MAX_SIZE) {		fr->direction = 0;		AST_LIST_INSERT_HEAD(&iax_frames->list, fr, list);		iax_frames->size++;		return;	}#endif	free(fr);}#if !defined(LOW_MEMORY)static void frame_cache_cleanup(void *data){	struct iax_frames *frames = data;	struct iax_frame *cur;	while ((cur = AST_LIST_REMOVE_HEAD(&frames->list, list)))		free(cur);	free(frames);}#endifint iax_get_frames(void) { return frames; }int iax_get_iframes(void) { return iframes; }int iax_get_oframes(void) { return oframes; }

⌨️ 快捷键说明

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