📄 iax2-parser.c
字号:
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 + -