32 #include <sys/socket.h>
33 #include <netinet/in.h>
34 #include <arpa/inet.h>
51 static int frames = 0;
52 static int iframes = 0;
53 static int oframes = 0;
55 #if (defined(LOW_MEMORY) || defined(MALLOC_DEBUG)) && !defined(NO_FRAME_CACHE)
56 #define NO_FRAME_CACHE
59 #if !defined(NO_FRAME_CACHE)
60 static void frame_cache_cleanup(
void *data);
74 #define FRAME_CACHE_MAX_SIZE 20
77 static void internaloutput(
const char *str)
82 static void internalerror(
const char *str)
84 fprintf(stderr,
"WARNING: %s", str);
87 static void (*outputf)(
const char *str) = internaloutput;
88 static void (*errorf)(
const char *str) = internalerror;
90 static void dump_addr(
char *output,
int maxlen,
void *value,
int len)
94 if (len == (
int)
sizeof(
struct sockaddr_in)) {
95 addr.ss.ss_family = AF_INET;
96 }
else if (len == (
int)
sizeof(
struct sockaddr_in6)) {
97 addr.ss.ss_family = AF_INET6;
103 memcpy(&addr, value, len);
106 snprintf(output, maxlen,
"%s %s",
111 static void dump_string_hex(
char *output,
int maxlen,
void *value,
int len)
115 while (len-- && (i + 1) * 4 < maxlen) {
116 sprintf(output + (4 * i),
"\\x%02hhx", *((
unsigned char *)value + i));
121 static void dump_string(
char *output,
int maxlen,
void *value,
int len)
126 strncpy(output, value, maxlen);
127 output[maxlen] =
'\0';
130 static void dump_prefs(
char *output,
int maxlen,
void *value,
int len)
141 strncpy(output, value, maxlen);
142 output[maxlen] =
'\0';
145 memset(output,0,total_len);
149 static void dump_int(
char *output,
int maxlen,
void *value,
int len)
151 if (len == (
int)
sizeof(
unsigned int))
152 snprintf(output, maxlen,
"%lu", (
unsigned long)ntohl(get_unaligned_uint32(value)));
157 static void dump_short(
char *output,
int maxlen,
void *value,
int len)
159 if (len == (
int)
sizeof(
unsigned short))
160 snprintf(output, maxlen,
"%d", ntohs(get_unaligned_uint16(value)));
165 static void dump_byte(
char *output,
int maxlen,
void *value,
int len)
167 if (len == (
int)
sizeof(
unsigned char))
168 snprintf(output, maxlen,
"%d", *((
unsigned char *)value));
173 static void dump_datetime(
char *output,
int maxlen,
void *value,
int len)
176 unsigned long val = (
unsigned long) ntohl(get_unaligned_uint32(value));
177 if (len == (
int)
sizeof(
unsigned int)) {
178 tm.tm_sec = (val & 0x1f) << 1;
179 tm.tm_min = (val >> 5) & 0x3f;
180 tm.tm_hour = (val >> 11) & 0x1f;
181 tm.tm_mday = (val >> 16) & 0x1f;
182 tm.tm_mon = ((val >> 21) & 0x0f) - 1;
183 tm.tm_year = ((val >> 25) & 0x7f) + 100;
189 static void dump_ipaddr(
char *output,
int maxlen,
void *value,
int len)
194 if (len == (
int)
sizeof(
struct sockaddr_in)) {
195 addr.ss.ss_family = AF_INET;
196 }
else if (len == (
int)
sizeof(
struct sockaddr_in6)) {
197 addr.ss.ss_family = AF_INET6;
203 memcpy(&addr, value, len);
211 static void dump_prov_flags(
char *output,
int maxlen,
void *value,
int len)
214 if (len == (
int)
sizeof(
unsigned int))
215 snprintf(output, maxlen,
"%lu (%s)", (
unsigned long)ntohl(get_unaligned_uint32(value)),
216 iax_provflags2str(buf,
sizeof(buf), ntohl(get_unaligned_uint32(value))));
221 static void dump_samprate(
char *output,
int maxlen,
void *value,
int len)
225 if (len == (
int)
sizeof(
unsigned short)) {
226 sr = ntohs(*((
unsigned short *)value));
228 strcat(tmp,
",8khz");
230 strcat(tmp,
",11.025khz");
232 strcat(tmp,
",16khz");
234 strcat(tmp,
",22.05khz");
236 strcat(tmp,
",44.1khz");
238 strcat(tmp,
",48khz");
248 static void dump_versioned_codec(
char *output,
int maxlen,
void *value,
int len)
250 char *version = (
char *) value;
251 if (version[0] == 0) {
252 if (len == (
int) (
sizeof(
iax2_format) +
sizeof(
char))) {
253 iax2_format codec = ntohll(get_unaligned_uint64(value + 1));
263 static void dump_prov_ies(
char *output,
int maxlen,
unsigned char *iedata,
int len);
264 static void dump_prov(
char *output,
int maxlen,
void *value,
int len)
266 dump_prov_ies(output, maxlen, value, len);
272 void (*dump)(
char *output,
int maxlen,
void *value,
int len);
274 static struct iax2_ie infoelts[] = {
333 static const struct iax2_ie prov_ies[] = {
334 { PROV_IE_USEDHCP,
"USEDHCP" },
335 { PROV_IE_IPADDR,
"IPADDR", dump_ipaddr },
336 { PROV_IE_SUBNET,
"SUBNET", dump_ipaddr },
337 { PROV_IE_GATEWAY,
"GATEWAY", dump_ipaddr },
338 { PROV_IE_PORTNO,
"BINDPORT", dump_short },
339 { PROV_IE_USER,
"USERNAME", dump_string },
340 { PROV_IE_PASS,
"PASSWORD", dump_string },
341 { PROV_IE_LANG,
"LANGUAGE", dump_string },
342 { PROV_IE_TOS,
"TYPEOFSERVICE", dump_byte },
343 { PROV_IE_FLAGS,
"FLAGS", dump_prov_flags },
344 { PROV_IE_FORMAT,
"FORMAT", dump_int },
345 { PROV_IE_AESKEY,
"AESKEY" },
346 { PROV_IE_SERVERIP,
"SERVERIP", dump_ipaddr },
347 { PROV_IE_SERVERPORT,
"SERVERPORT", dump_short },
348 { PROV_IE_NEWAESKEY,
"NEWAESKEY" },
349 { PROV_IE_PROVVER,
"PROV VERSION", dump_int },
350 { PROV_IE_ALTSERVER,
"ALTSERVERIP", dump_ipaddr },
353 const char *iax_ie2str(
int ie)
356 for (x = 0; x < ARRAY_LEN(infoelts); x++) {
357 if (infoelts[x].ie == ie)
358 return infoelts[x].name;
364 static void dump_prov_ies(
char *output,
int maxlen,
unsigned char *iedata,
int len)
374 strcpy(output,
"\n");
375 maxlen -= strlen(output); output += strlen(output);
379 if (ielen + 2> len) {
380 snprintf(tmp, (
int)
sizeof(tmp),
"Total Prov IE length of %d bytes exceeds remaining prov frame length of %d bytes\n", ielen + 2, len);
382 maxlen -= strlen(output);
383 output += strlen(output);
387 for (x=0;x<(int)
sizeof(prov_ies) / (int)
sizeof(prov_ies[0]); x++) {
388 if (prov_ies[x].ie == ie) {
389 if (prov_ies[x].dump) {
390 prov_ies[x].dump(interp, (
int)
sizeof(interp), iedata + 2, ielen);
391 snprintf(tmp, (
int)
sizeof(tmp),
" %-15.15s : %s\n", prov_ies[x].name, interp);
393 maxlen -= strlen(output); output += strlen(output);
396 snprintf(interp, (
int)
sizeof(interp),
"%d bytes", ielen);
398 strcpy(interp,
"Present");
399 snprintf(tmp, (
int)
sizeof(tmp),
" %-15.15s : %s\n", prov_ies[x].name, interp);
401 maxlen -= strlen(output); output += strlen(output);
407 snprintf(tmp, (
int)
sizeof(tmp),
" Unknown Prov IE %03d : Present\n", ie);
409 maxlen -= strlen(output); output += strlen(output);
411 iedata += (2 + ielen);
416 static void dump_ies(
unsigned char *iedata,
int len)
430 if (ielen + 2> len) {
431 snprintf(tmp, (
int)
sizeof(tmp),
"Total IE length of %d bytes exceeds remaining frame length of %d bytes\n", ielen + 2, len);
436 for (x = 0; x < ARRAY_LEN(infoelts); x++) {
437 if (infoelts[x].ie == ie) {
438 if (infoelts[x].dump) {
439 infoelts[x].dump(interp, (
int)
sizeof(interp), iedata + 2, ielen);
440 snprintf(tmp, (
int)
sizeof(tmp),
" %-15.15s : %s\n", infoelts[x].name, interp);
444 snprintf(interp, (
int)
sizeof(interp),
"%d bytes", ielen);
446 strcpy(interp,
"Present");
447 snprintf(tmp, (
int)
sizeof(tmp),
" %-15.15s : %s\n", infoelts[x].name, interp);
454 snprintf(tmp, (
int)
sizeof(tmp),
" Unknown IE %03d : Present\n", ie);
457 iedata += (2 + ielen);
465 const char *cmd =
"Unknown";
471 case IAX_COMMAND_NEW:
474 case IAX_COMMAND_PING:
477 case IAX_COMMAND_PONG:
480 case IAX_COMMAND_ACK:
483 case IAX_COMMAND_HANGUP:
486 case IAX_COMMAND_REJECT:
489 case IAX_COMMAND_ACCEPT:
492 case IAX_COMMAND_AUTHREQ:
495 case IAX_COMMAND_AUTHREP:
498 case IAX_COMMAND_INVAL:
501 case IAX_COMMAND_LAGRQ:
504 case IAX_COMMAND_LAGRP:
597 const char *framelist[] = {
612 const char *cmds[] = {
653 const char *subclass;
673 snprintf(retries,
sizeof(retries),
"%03d", f->
retries);
676 if (ntohs(fh->
dcallno) & IAX_FLAG_RETRANS)
677 strcpy(retries,
"Yes");
679 strcpy(retries,
" No");
681 if (!(ntohs(fh->
scallno) & IAX_FLAG_FULL)) {
685 if (fh->
type >= ARRAY_LEN(framelist)) {
686 snprintf(class2,
sizeof(class2),
"(%d?)", fh->
type);
689 class = framelist[(int)fh->type];
692 sprintf(subclass2,
"%c", fh->
csub);
693 subclass = subclass2;
695 iax_frame_subclass2str((
int)fh->
csub, subclass2,
sizeof(subclass2));
696 subclass = subclass2;
698 if (fh->
csub >= ARRAY_LEN(cmds)) {
699 snprintf(subclass2,
sizeof(subclass2),
"(%d?)", fh->
csub);
700 subclass = subclass2;
702 subclass = cmds[(int)fh->
csub];
705 snprintf(subclass2,
sizeof(subclass2),
"%d", fh->
csub);
706 subclass = subclass2;
709 snprintf(tmp,
sizeof(tmp),
710 "%s-Frame Retry[%s] -- OSeqno: %3.3d ISeqno: %3.3d Type: %s Subclass: %s\n",
714 snprintf(tmp,
sizeof(tmp),
" Timestamp: %05lums SCall: %5.5d DCall: %5.5d %s\n",
715 (
unsigned long)ntohl(fh->
ts),
716 ntohs(fh->
scallno) & ~IAX_FLAG_FULL,
717 ntohs(fh->
dcallno) & ~IAX_FLAG_RETRANS,
722 dump_ies(fh->iedata, datalen);
726 int iax_ie_append_raw(
struct iax_ie_data *ied,
unsigned char ie,
const void *data,
int datalen)
729 if (datalen > ((
int)
sizeof(ied->buf) - ied->pos)) {
730 snprintf(tmp, (
int)
sizeof(tmp),
"Out of space for ie '%s' (%d), need %d have %d\n", iax_ie2str(ie), ie, datalen, (
int)
sizeof(ied->buf) - ied->pos);
734 ied->buf[ied->pos++] = ie;
735 ied->buf[ied->pos++] = datalen;
736 memcpy(ied->buf + ied->pos, data, datalen);
743 return iax_ie_append_raw(ied, ie, addr, addr->len);
746 int iax_ie_append_versioned_uint64(
struct iax_ie_data *ied,
unsigned char ie,
unsigned char version, uint64_t value)
749 unsigned char version;
751 } __attribute__((packed)) newval = { version, };
752 put_unaligned_uint64(&newval.value, htonll(value));
753 return iax_ie_append_raw(ied, ie, &newval, (
int)
sizeof(newval));
756 int iax_ie_append_int(
struct iax_ie_data *ied,
unsigned char ie,
unsigned int value)
759 newval = htonl(value);
760 return iax_ie_append_raw(ied, ie, &newval, (
int)
sizeof(newval));
763 int iax_ie_append_short(
struct iax_ie_data *ied,
unsigned char ie,
unsigned short value)
765 unsigned short newval;
766 newval = htons(value);
767 return iax_ie_append_raw(ied, ie, &newval, (
int)
sizeof(newval));
770 int iax_ie_append_str(
struct iax_ie_data *ied,
unsigned char ie,
const char *str)
772 return iax_ie_append_raw(ied, ie, str, strlen(str));
775 int iax_ie_append_byte(
struct iax_ie_data *ied,
unsigned char ie,
unsigned char dat)
777 return iax_ie_append_raw(ied, ie, &dat, 1);
780 int iax_ie_append(
struct iax_ie_data *ied,
unsigned char ie)
782 return iax_ie_append_raw(ied, ie, NULL, 0);
785 void iax_set_output(
void (*func)(
const char *))
790 void iax_set_error(
void (*func)(
const char *))
795 int iax_parse_ies(
struct iax_ies *ies,
unsigned char *data,
int datalen)
800 char tmp[256], *tmp2;
803 memset(ies, 0, (
int)
sizeof(
struct iax_ies));
805 ies->firmwarever = -1;
806 ies->calling_ton = -1;
807 ies->calling_tns = -1;
808 ies->calling_pres = -1;
809 ies->calling_ani2 = -1;
811 while(datalen >= 2) {
814 if (len > datalen - 2) {
815 errorf(
"Information element length exceeds message size\n");
820 ies->called_number = (
char *)data + 2;
823 ies->calling_number = (
char *)data + 2;
826 ies->calling_ani = (
char *)data + 2;
829 ies->calling_name = (
char *)data + 2;
832 ies->called_context = (
char *)data + 2;
835 ies->username = (
char *)data + 2;
838 ies->password = (
char *)data + 2;
841 ies->codec_prefs = (
char *)data + 2;
844 if (len != (
int)
sizeof(
unsigned int)) {
845 snprintf(tmp, (
int)
sizeof(tmp),
"Expecting capability to be %d bytes long but was %d\n", (
int)
sizeof(
unsigned int), len);
847 }
else if (ies->capability == 0) {
848 ies->capability = ntohl(get_unaligned_uint32(data + 2));
853 int version = data[2];
855 if (len != (
int)
sizeof(
char) +
sizeof(
iax2_format)) {
856 snprintf(tmp, (
int)
sizeof(tmp),
"Expecting capability to be %d bytes long but was %d\n", (
int) (
sizeof(
iax2_format) +
sizeof(
char)), len);
859 ies->capability = (
iax2_format) ntohll(get_unaligned_uint64(data + 3));
865 if (len != (
int)
sizeof(
unsigned int)) {
866 snprintf(tmp, (
int)
sizeof(tmp),
"Expecting format to be %d bytes long but was %d\n", (
int)
sizeof(
unsigned int), len);
868 }
else if (ies->format == 0) {
869 ies->format = ntohl(get_unaligned_uint32(data + 2));
874 int version = data[2];
876 if (len != (
int)
sizeof(
char) +
sizeof(
iax2_format)) {
877 snprintf(tmp, (
int)
sizeof(tmp),
"Expecting format to be %d bytes long but was %d\n", (
int) (
sizeof(
iax2_format) +
sizeof(
char)), len);
880 ies->format = (
iax2_format) ntohll(get_unaligned_uint64(data + 3));
886 ies->language = (
char *)data + 2;
889 if (len != (
int)
sizeof(
unsigned short)) {
890 snprintf(tmp, (
int)
sizeof(tmp),
"Expecting version to be %d bytes long but was %d\n", (
int)
sizeof(
unsigned short), len);
893 ies->version = ntohs(get_unaligned_uint16(data + 2));
896 if (len != (
int)
sizeof(
unsigned short)) {
897 snprintf(tmp, (
int)
sizeof(tmp),
"Expecting adsicpe to be %d bytes long but was %d\n", (
int)
sizeof(
unsigned short), len);
900 ies->adsicpe = ntohs(get_unaligned_uint16(data + 2));
903 if (len != (
int)
sizeof(
unsigned short)) {
904 snprintf(tmp, (
int)
sizeof(tmp),
"Expecting samplingrate to be %d bytes long but was %d\n", (
int)
sizeof(
unsigned short), len);
907 ies->samprate = ntohs(get_unaligned_uint16(data + 2));
910 ies->dnid = (
char *)data + 2;
913 ies->rdnis = (
char *)data + 2;
916 if (len != (
int)
sizeof(
unsigned short)) {
917 snprintf(tmp, (
int)
sizeof(tmp),
"Expecting authmethods to be %d bytes long but was %d\n", (
int)
sizeof(
unsigned short), len);
920 ies->authmethods = ntohs(get_unaligned_uint16(data + 2));
923 if (len != (
int)
sizeof(
unsigned short)) {
924 snprintf(tmp, (
int)
sizeof(tmp),
"Expecting encryption to be %d bytes long but was %d\n", (
int)
sizeof(
unsigned short), len);
927 ies->encmethods = ntohs(get_unaligned_uint16(data + 2));
930 ies->challenge = (
char *)data + 2;
933 ies->md5_result = (
char *)data + 2;
936 ies->rsa_result = (
char *)data + 2;
939 memcpy(&ies->apparent_addr , (
struct ast_sockaddr *) (data + 2), len);
940 ies->apparent_addr.len = len;
943 if (len != (
int)
sizeof(
unsigned short)) {
944 snprintf(tmp, (
int)
sizeof(tmp),
"Expecting refresh to be %d bytes long but was %d\n", (
int)
sizeof(
unsigned short), len);
947 ies->refresh = ntohs(get_unaligned_uint16(data + 2));
950 if (len != (
int)
sizeof(
unsigned short)) {
951 snprintf(tmp, (
int)
sizeof(tmp),
"Expecting dpstatus to be %d bytes long but was %d\n", (
int)
sizeof(
unsigned short), len);
954 ies->dpstatus = ntohs(get_unaligned_uint16(data + 2));
957 if (len != (
int)
sizeof(
unsigned short)) {
958 snprintf(tmp, (
int)
sizeof(tmp),
"Expecting callno to be %d bytes long but was %d\n", (
int)
sizeof(
unsigned short), len);
961 ies->callno = ntohs(get_unaligned_uint16(data + 2));
964 ies->cause = (
char *)data + 2;
968 snprintf(tmp, (
int)
sizeof(tmp),
"Expecting causecode to be single byte but was %d\n", len);
971 ies->causecode = data[2];
976 ies->iax_unknown = data[2];
978 snprintf(tmp, (
int)
sizeof(tmp),
"Expected single byte Unknown command, but was %d long\n", len);
983 if (len != (
int)
sizeof(
unsigned short)) {
984 snprintf(tmp, (
int)
sizeof(tmp),
"Expecting msgcount to be %d bytes long but was %d\n", (
int)
sizeof(
unsigned short), len);
987 ies->msgcount = ntohs(get_unaligned_uint16(data + 2));
993 ies->musiconhold = 1;
996 if (len != (
int)
sizeof(
unsigned int)) {
997 snprintf(tmp, (
int)
sizeof(tmp),
"Expecting transferid to be %d bytes long but was %d\n", (
int)
sizeof(
unsigned int), len);
1000 ies->transferid = ntohl(get_unaligned_uint32(data + 2));
1003 if (len != (
int)
sizeof(
unsigned int)) {
1004 snprintf(tmp, (
int)
sizeof(tmp),
"Expecting date/time to be %d bytes long but was %d\n", (
int)
sizeof(
unsigned int), len);
1007 ies->datetime = ntohl(get_unaligned_uint32(data + 2));
1010 if (len != (
int)
sizeof(
unsigned short)) {
1011 snprintf(tmp, (
int)
sizeof(tmp),
"Expecting firmwarever to be %d bytes long but was %d\n", (
int)
sizeof(
unsigned short), len);
1014 ies->firmwarever = ntohs(get_unaligned_uint16(data + 2));
1017 ies->devicetype = (
char *)data + 2;
1020 ies->serviceident = (
char *)data + 2;
1023 if (len != (
int)
sizeof(
unsigned int)) {
1024 snprintf(tmp, (
int)
sizeof(tmp),
"Expected block desc to be %d bytes long but was %d\n", (
int)
sizeof(
unsigned int), len);
1027 ies->fwdesc = ntohl(get_unaligned_uint32(data + 2));
1030 ies->fwdata = data + 2;
1031 ies->fwdatalen = len;
1034 ies->enckey = data + 2;
1035 ies->enckeylen = len;
1038 if (len != (
int)
sizeof(
unsigned int)) {
1039 snprintf(tmp, (
int)
sizeof(tmp),
"Expected provisioning version to be %d bytes long but was %d\n", (
int)
sizeof(
unsigned int), len);
1042 ies->provverpres = 1;
1043 ies->provver = ntohl(get_unaligned_uint32(data + 2));
1048 ies->calling_pres = data[2];
1050 snprintf(tmp, (
int)
sizeof(tmp),
"Expected single byte callingpres, but was %d long\n", len);
1056 ies->calling_ton = data[2];
1058 snprintf(tmp, (
int)
sizeof(tmp),
"Expected single byte callington, but was %d long\n", len);
1063 if (len == (
int)
sizeof(
unsigned int)) {
1064 ies->calling_ani2 = ntohl(get_unaligned_uint32(data + 2));
1066 snprintf(tmp,
sizeof(tmp),
"Expected callingani2 to be %zu bytes but was %d\n",
sizeof(
unsigned int), len);
1071 if (len != (
int)
sizeof(
unsigned short)) {
1072 snprintf(tmp, (
int)
sizeof(tmp),
"Expecting callingtns to be %d bytes long but was %d\n", (
int)
sizeof(
unsigned short), len);
1075 ies->calling_tns = ntohs(get_unaligned_uint16(data + 2));
1078 if (len != (
int)
sizeof(
unsigned int)) {
1079 snprintf(tmp, (
int)
sizeof(tmp),
"Expected jitter rr to be %d bytes long but was %d\n", (
int)
sizeof(
unsigned int), len);
1082 ies->rr_jitter = ntohl(get_unaligned_uint32(data + 2));
1086 if (len != (
int)
sizeof(
unsigned int)) {
1087 snprintf(tmp, (
int)
sizeof(tmp),
"Expected loss rr to be %d bytes long but was %d\n", (
int)
sizeof(
unsigned int), len);
1090 ies->rr_loss = ntohl(get_unaligned_uint32(data + 2));
1094 if (len != (
int)
sizeof(
unsigned int)) {
1095 snprintf(tmp, (
int)
sizeof(tmp),
"Expected packets rr to be %d bytes long but was %d\n", (
int)
sizeof(
unsigned int), len);
1098 ies->rr_pkts = ntohl(get_unaligned_uint32(data + 2));
1102 if (len != (
int)
sizeof(
unsigned short)) {
1103 snprintf(tmp, (
int)
sizeof(tmp),
"Expected loss rr to be %d bytes long but was %d\n", (
int)
sizeof(
unsigned short), len);
1106 ies->rr_delay = ntohs(get_unaligned_uint16(data + 2));
1110 if (len != (
int)
sizeof(
unsigned int)) {
1111 snprintf(tmp, (
int)
sizeof(tmp),
"Expected packets rr to be %d bytes long but was %d\n", (
int)
sizeof(
unsigned int), len);
1114 ies->rr_dropped = ntohl(get_unaligned_uint32(data + 2));
1118 if (len != (
int)
sizeof(
unsigned int)) {
1119 snprintf(tmp, (
int)
sizeof(tmp),
"Expected packets rr to be %d bytes long but was %d\n", (
int)
sizeof(
unsigned int), len);
1122 ies->rr_ooo = ntohl(get_unaligned_uint32(data + 2));
1127 tmp2 = strchr(tmp,
'=');
1135 for (var2 = ies->vars, prev = NULL; var2; prev = var2, var2 = var2->
next) {
1136 if (strcmp(tmp, var2->
name) == 0) {
1145 snprintf(tmp,
sizeof(tmp),
"Assigned (%p)%s to (%p)%s\n", var->
name, var->
name, var->
value, var->
value);
1155 var = ast_variable_new(tmp, tmp2,
"");
1156 snprintf(tmp,
sizeof(tmp),
"Assigned (%p)%s to (%p)%s\n", var->
name, var->
name, var->
value, var->
value);
1158 var->
next = ies->vars;
1163 if ((count = data[2]) < IAX_MAX_OSPBLOCK_NUM) {
1164 ies->osptokenblock[count] = (
char *)data + 2 + 1;
1165 ies->ospblocklength[count] = len - 1;
1167 snprintf(tmp, (
int)
sizeof(tmp),
"Expected OSP token block index to be 0~%d but was %u\n", IAX_MAX_OSPBLOCK_NUM - 1, count);
1173 ies->calltokendata = (
unsigned char *) data + 2;
1178 snprintf(tmp, (
int)
sizeof(tmp),
"Ignoring unknown information element '%s' (%d) of length %d\n", iax_ie2str(ie), ie, len);
1183 datalen -= (len + 2);
1189 errorf(
"Invalid information element contents, strange boundary\n");
1207 fr->
af.
data.ptr = fr->afdata;
1212 ast_log(LOG_ERROR,
"Losing frame data because destination buffer size '%d' bytes not big enough for '%d' bytes in the frame\n",
1216 #if __BYTE_ORDER == __LITTLE_ENDIAN
1221 ast_swapcopy_samples(fr->
af.
data.ptr, f->
data.ptr, copy_len / 2);
1224 memcpy(fr->
af.
data.ptr, f->
data.ptr, copy_len);
1232 #if !defined(NO_FRAME_CACHE)
1245 memset(fr, 0,
sizeof(*fr));
1260 if (!(fr =
ast_calloc(1,
sizeof(*fr) + datalen))) {
1266 if (!(fr =
ast_calloc(1,
sizeof(*fr) + datalen))) {
1275 if (!(fr =
ast_calloc(1,
sizeof(*fr) + datalen))) {
1295 void iax_frame_free(
struct iax_frame *fr)
1297 #if !defined(NO_FRAME_CACHE)
1298 struct iax_frames *iax_frames = NULL;
1304 else if (fr->
direction == DIRECTION_OUTGRESS)
1307 errorf(
"Attempt to double free frame detected\n");
1312 #if !defined(NO_FRAME_CACHE)
1314 || !ast_opt_cache_media_frames
1336 #if !defined(NO_FRAME_CACHE)
1337 static void frame_cache_cleanup(
void *data)
1339 struct iax_frames *framelist = data;
1345 ast_free(framelist);
1349 int iax_get_frames(
void) {
return frames; }
1350 int iax_get_iframes(
void) {
return iframes; }
1351 int iax_get_oframes(
void) {
return oframes; }
struct ast_variable * next
#define IAX_IE_IAX_UNKNOWN
#define IAX_IE_CAPABILITY2
Asterisk locking-related definitions:
#define IAX_IE_CALLINGTNS
Asterisk main include file. File version handling, generic pbx functions.
#define AST_LIST_FIRST(head)
Returns the first entry contained in a list.
void * ast_threadstorage_get(struct ast_threadstorage *ts, size_t init_size)
Retrieve thread storage.
This is just so iax_frames, a list head struct for holding a list of iax_frame structures, is defined.
const char * iax2_getformatname(iax2_format format)
iax2 wrapper function for ast_getformatname
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Structure for variables, used for configurations and for channel variables.
#define IAX_IE_MD5_RESULT
#define IAX_IE_FIRMWAREVER
#define IAX_IE_AUTOANSWER
#define IAX_IE_SAMPLINGRATE
Definitions to aid in the use of thread local storage.
#define AST_LIST_REMOVE(head, elm, field)
Removes a specific entry from a list.
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
struct iax_frame::@136 list
Socket address structure.
int ast_atomic_fetchadd_int(volatile int *p, int v)
Atomically add v to *p and return the previous value of *p.
#define IAX_IE_CALLING_NUMBER
Implementation of the IAX2 protocol.
struct ast_frame_subclass subclass
#define IAX_IE_CALLING_ANI
#define IAX_IE_DEVICETYPE
#define IAX_IE_ENCRYPTION
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
Configuration File Parser.
Handle unaligned data access.
#define IAX_IE_CALLINGANI2
#define AST_FRIENDLY_OFFSET
Offset into a frame's data buffer.
#define FRAME_CACHE_MAX_SIZE
Maximum ast_frame cache size.
#define IAX_IE_SERVICEIDENT
#define AST_LIST_REMOVE_CURRENT(field)
Removes the current entry from a list during a traversal.
Asterisk internal frame definitions.
#define IAX_IE_CALLING_NAME
#define IAX_IE_PROVISIONING
#define IAX_IE_AESPROVISIONING
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
#define AST_LIST_HEAD_NOLOCK(name, type)
Defines a structure to be used to hold a list of specified type (with no lock).
#define IAX_IE_CALLED_NUMBER
IAX2 Provisioning protocol.
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
Implementation of Inter-Asterisk eXchange, version 2 parser.c parser.h chan_iax2.c.
Support for dynamic strings.
int iax2_codec_pref_string(struct iax2_codec_pref *pref, char *buf, size_t size)
Dump audio codec preference list into a string.
#define IAX_IE_AUTHMETHODS
static char * ast_sockaddr_stringify(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() with default format.
#define AST_LIST_INSERT_HEAD(head, elm, field)
Inserts a list entry at the head of a list.
#define IAX_IE_FWBLOCKDESC
union ast_frame::@224 data
#define ast_calloc(num, len)
A wrapper for calloc()
#define IAX_IE_CODEC_PREFS
int ast_sockaddr_is_ipv4_mapped(const struct ast_sockaddr *addr)
Determine if this is an IPv4-mapped IPv6 address.
int ast_strftime(char *buf, size_t len, const char *format, const struct ast_tm *tm)
Special version of strftime(3) that handles fractions of a second. Takes the same arguments as strfti...
#define AST_THREADSTORAGE_CUSTOM(a, b, c)
Define a thread storage variable, with custom initialization and cleanup.
#define IAX_IE_CALLINGTON
#define IAX_IE_CALLINGPRES
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
#define IAX_IE_RR_DROPPED
#define IAX_IE_MUSICONHOLD
int ast_sockaddr_is_ipv4(const struct ast_sockaddr *addr)
Determine if the address is an IPv4 address.
Data structure associated with a single frame of data.
#define IAX_IE_RSA_RESULT
#define IAX_IE_FWBLOCKDATA
#define IAX_IE_CALLED_CONTEXT
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
enum ast_frame_type frametype
#define IAX_IE_APPARENT_ADDR
Media Format Bitfield Compatibility API.
struct ast_format * format
#define IAX_IE_TRANSFERID
void iax2_codec_pref_convert(struct iax2_codec_pref *pref, char *buf, size_t size, int right)
Shift an audio codec preference list up or down 65 bytes so that it becomes an ASCII string...
#define IAX_IE_CAPABILITY
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.