Asterisk - The Open Source Telephony Project GIT-master-f36a736
Data Structures | Macros | Functions
dundi-parser.h File Reference
#include "asterisk/dundi.h"
#include "asterisk/crypto.h"
Include dependency graph for dundi-parser.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  dundi_ie_data
 
struct  dundi_ies
 

Macros

#define DUNDI_MAX_ANSWERS   100
 
#define DUNDI_MAX_STACK   512
 

Functions

char * dundi_eid_to_str_short (char *s, int maxlen, dundi_eid *eid)
 
int dundi_eid_zero (dundi_eid *eid)
 
char * dundi_flags2str (char *s, int maxlen, int flags)
 
char * dundi_hint2str (char *s, int maxlen, int flags)
 
const char * dundi_ie2str (int ie)
 
int dundi_ie_append (struct dundi_ie_data *ied, unsigned char ie)
 
int dundi_ie_append_addr (struct dundi_ie_data *ied, unsigned char ie, struct sockaddr_in *sin)
 
int dundi_ie_append_answer (struct dundi_ie_data *ied, unsigned char ie, dundi_eid *eid, unsigned char protocol, unsigned short flags, unsigned short weight, char *desc)
 
int dundi_ie_append_byte (struct dundi_ie_data *ied, unsigned char ie, unsigned char dat)
 
int dundi_ie_append_cause (struct dundi_ie_data *ied, unsigned char ie, unsigned char cause, char *desc)
 
int dundi_ie_append_eid (struct dundi_ie_data *ied, unsigned char ie, dundi_eid *eid)
 
int dundi_ie_append_encdata (struct dundi_ie_data *ied, unsigned char ie, unsigned char *iv, void *data, int datalen)
 
int dundi_ie_append_hint (struct dundi_ie_data *ied, unsigned char ie, unsigned short flags, char *data)
 
int dundi_ie_append_int (struct dundi_ie_data *ied, unsigned char ie, unsigned int value)
 
int dundi_ie_append_raw (struct dundi_ie_data *ied, unsigned char ie, void *data, int datalen)
 
int dundi_ie_append_short (struct dundi_ie_data *ied, unsigned char ie, unsigned short value)
 
int dundi_ie_append_str (struct dundi_ie_data *ied, unsigned char ie, char *str)
 
int dundi_parse_ies (struct dundi_ies *ies, unsigned char *data, int datalen)
 
void dundi_set_error (void(*output)(const char *data))
 
void dundi_set_output (void(*output)(const char *data))
 
void dundi_showframe (struct dundi_hdr *fhi, int rx, struct ast_sockaddr *sin, int datalen)
 
int dundi_str_short_to_eid (dundi_eid *eid, const char *s)
 

Macro Definition Documentation

◆ DUNDI_MAX_ANSWERS

#define DUNDI_MAX_ANSWERS   100

Definition at line 19 of file dundi-parser.h.

◆ DUNDI_MAX_STACK

#define DUNDI_MAX_STACK   512

Definition at line 18 of file dundi-parser.h.

Function Documentation

◆ dundi_eid_to_str_short()

char * dundi_eid_to_str_short ( char *  s,
int  maxlen,
dundi_eid eid 
)

Definition at line 54 of file dundi-parser.c.

55{
56 int x;
57 char *os = s;
58 if (maxlen < 13) {
59 if (s && (maxlen > 0))
60 *s = '\0';
61 } else {
62 for (x=0;x<6;x++) {
63 sprintf(s, "%02hhX", (unsigned char)eid->eid[x]);
64 s += 2;
65 }
66 }
67 return os;
68}
unsigned char eid[6]
Definition: utils.h:814

References ast_eid::eid.

Referenced by cache_lookup(), cache_save(), cache_save_hint(), do_register_expire(), and handle_command_response().

◆ dundi_eid_zero()

int dundi_eid_zero ( dundi_eid eid)

Definition at line 82 of file dundi-parser.c.

83{
84 int x;
85 for (x = 0; x < ARRAY_LEN(eid->eid); x++)
86 if (eid->eid[x]) return 0;
87 return 1;
88}
#define ARRAY_LEN(a)
Definition: utils.h:666

References ARRAY_LEN, and ast_eid::eid.

Referenced by build_transactions(), dundi_discover(), dundi_query(), dundi_show_cache(), dundi_show_requests(), and precache_trans().

◆ dundi_flags2str()

char * dundi_flags2str ( char *  s,
int  maxlen,
int  flags 
)

Definition at line 248 of file dundi-parser.c.

249{
250 strcpy(buf, "");
251 buf[bufsiz-1] = '\0';
252 if (flags & DUNDI_FLAG_EXISTS) {
253 strncat(buf, "EXISTS|", bufsiz - strlen(buf) - 1);
254 }
255 if (flags & DUNDI_FLAG_MATCHMORE) {
256 strncat(buf, "MATCHMORE|", bufsiz - strlen(buf) - 1);
257 }
258 if (flags & DUNDI_FLAG_CANMATCH) {
259 strncat(buf, "CANMATCH|", bufsiz - strlen(buf) - 1);
260 }
261 if (flags & DUNDI_FLAG_IGNOREPAT) {
262 strncat(buf, "IGNOREPAT|", bufsiz - strlen(buf) - 1);
263 }
264 if (flags & DUNDI_FLAG_RESIDENTIAL) {
265 strncat(buf, "RESIDENCE|", bufsiz - strlen(buf) - 1);
266 }
267 if (flags & DUNDI_FLAG_COMMERCIAL) {
268 strncat(buf, "COMMERCIAL|", bufsiz - strlen(buf) - 1);
269 }
270 if (flags & DUNDI_FLAG_MOBILE) {
271 strncat(buf, "MOBILE", bufsiz - strlen(buf) - 1);
272 }
273 if (flags & DUNDI_FLAG_NOUNSOLICITED) {
274 strncat(buf, "NOUNSLCTD|", bufsiz - strlen(buf) - 1);
275 }
276 if (flags & DUNDI_FLAG_NOCOMUNSOLICIT) {
277 strncat(buf, "NOCOMUNSLTD|", bufsiz - strlen(buf) - 1);
278 }
279 /* Get rid of trailing | */
280 if (ast_strlen_zero(buf))
281 strcpy(buf, "NONE|");
282 buf[strlen(buf)-1] = '\0';
283 return buf;
284}
@ DUNDI_FLAG_MOBILE
Definition: dundi.h:82
@ DUNDI_FLAG_COMMERCIAL
Definition: dundi.h:80
@ DUNDI_FLAG_NOCOMUNSOLICIT
Definition: dundi.h:86
@ DUNDI_FLAG_CANMATCH
Definition: dundi.h:74
@ DUNDI_FLAG_MATCHMORE
Definition: dundi.h:72
@ DUNDI_FLAG_RESIDENTIAL
Definition: dundi.h:78
@ DUNDI_FLAG_EXISTS
Definition: dundi.h:70
@ DUNDI_FLAG_IGNOREPAT
Definition: dundi.h:76
@ DUNDI_FLAG_NOUNSOLICITED
Definition: dundi.h:84
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65

References ast_strlen_zero(), buf, DUNDI_FLAG_CANMATCH, DUNDI_FLAG_COMMERCIAL, DUNDI_FLAG_EXISTS, DUNDI_FLAG_IGNOREPAT, DUNDI_FLAG_MATCHMORE, DUNDI_FLAG_MOBILE, DUNDI_FLAG_NOCOMUNSOLICIT, DUNDI_FLAG_NOUNSOLICITED, and DUNDI_FLAG_RESIDENTIAL.

Referenced by cache_lookup_internal(), dump_answer(), dundi_do_lookup(), dundi_show_cache(), and dundi_show_mappings().

◆ dundi_hint2str()

char * dundi_hint2str ( char *  s,
int  maxlen,
int  flags 
)

Definition at line 111 of file dundi-parser.c.

112{
113 strcpy(buf, "");
114 buf[bufsiz-1] = '\0';
115 if (flags & DUNDI_HINT_TTL_EXPIRED) {
116 strncat(buf, "TTLEXPIRED|", bufsiz - strlen(buf) - 1);
117 }
118 if (flags & DUNDI_HINT_DONT_ASK) {
119 strncat(buf, "DONTASK|", bufsiz - strlen(buf) - 1);
120 }
121 if (flags & DUNDI_HINT_UNAFFECTED) {
122 strncat(buf, "UNAFFECTED|", bufsiz - strlen(buf) - 1);
123 }
124 /* Get rid of trailing | */
125 if (ast_strlen_zero(buf))
126 strcpy(buf, "NONE|");
127 buf[strlen(buf)-1] = '\0';
128 return buf;
129}
@ DUNDI_HINT_DONT_ASK
Definition: dundi.h:94
@ DUNDI_HINT_UNAFFECTED
Definition: dundi.h:96
@ DUNDI_HINT_TTL_EXPIRED
Definition: dundi.h:92

References ast_strlen_zero(), buf, DUNDI_HINT_DONT_ASK, DUNDI_HINT_TTL_EXPIRED, and DUNDI_HINT_UNAFFECTED.

Referenced by dump_hint().

◆ dundi_ie2str()

const char * dundi_ie2str ( int  ie)

Definition at line 375 of file dundi-parser.c.

376{
377 int x;
378 for (x = 0; x < ARRAY_LEN(infoelts); x++) {
379 if (infoelts[x].ie == ie)
380 return infoelts[x].name;
381 }
382 return "Unknown IE";
383}
static struct dundi_ie infoelts[]
char * name
Definition: dundi-parser.c:345

References ARRAY_LEN, infoelts, and dundi_ie::name.

Referenced by dundi_ie_append_answer(), dundi_ie_append_cause(), dundi_ie_append_encdata(), dundi_ie_append_hint(), dundi_ie_append_raw(), and dundi_parse_ies().

◆ dundi_ie_append()

int dundi_ie_append ( struct dundi_ie_data ied,
unsigned char  ie 
)

Definition at line 622 of file dundi-parser.c.

623{
624 return dundi_ie_append_raw(ied, ie, NULL, 0);
625}
int dundi_ie_append_raw(struct dundi_ie_data *ied, unsigned char ie, void *data, int datalen)
Definition: dundi-parser.c:486
#define NULL
Definition: resample.c:96

References dundi_ie_append_raw(), and NULL.

Referenced by dundi_discover().

◆ dundi_ie_append_addr()

int dundi_ie_append_addr ( struct dundi_ie_data ied,
unsigned char  ie,
struct sockaddr_in *  sin 
)

Definition at line 588 of file dundi-parser.c.

589{
590 return dundi_ie_append_raw(ied, ie, sin, (int)sizeof(struct sockaddr_in));
591}

References dundi_ie_append_raw().

◆ dundi_ie_append_answer()

int dundi_ie_append_answer ( struct dundi_ie_data ied,
unsigned char  ie,
dundi_eid eid,
unsigned char  protocol,
unsigned short  flags,
unsigned short  weight,
char *  desc 
)

Definition at line 561 of file dundi-parser.c.

562{
563 char tmp[256];
564 int datalen = data ? strlen(data) + 11 : 11;
565 int x;
566 unsigned short myw;
567 if (datalen > ((int)sizeof(ied->buf) - ied->pos)) {
568 snprintf(tmp, (int)sizeof(tmp), "Out of space for ie '%s' (%d), need %d have %d\n", dundi_ie2str(ie), ie, datalen, (int)sizeof(ied->buf) - ied->pos);
569 errorf(tmp);
570 return -1;
571 }
572 ied->buf[ied->pos++] = ie;
573 ied->buf[ied->pos++] = datalen;
574 for (x=0;x<6;x++)
575 ied->buf[ied->pos++] = eid->eid[x];
576 ied->buf[ied->pos++] = protocol;
577 myw = htons(flags);
578 memcpy(ied->buf + ied->pos, &myw, 2);
579 ied->pos += 2;
580 myw = htons(weight);
581 memcpy(ied->buf + ied->pos, &myw, 2);
582 ied->pos += 2;
583 memcpy(ied->buf + ied->pos, data, datalen-11);
584 ied->pos += datalen-11;
585 return 0;
586}
char weight
static int tmp()
Definition: bt_open.c:389
static void(* errorf)(const char *str)
Definition: dundi-parser.c:52
const char * dundi_ie2str(int ie)
Definition: dundi-parser.c:375
unsigned char buf[8192]
Definition: dundi-parser.h:56

References dundi_ie_data::buf, dundi_ie2str(), ast_eid::eid, errorf, dundi_ie_data::pos, tmp(), and weight.

Referenced by dundi_lookup_thread(), and precache_trans().

◆ dundi_ie_append_byte()

int dundi_ie_append_byte ( struct dundi_ie_data ied,
unsigned char  ie,
unsigned char  dat 
)

Definition at line 617 of file dundi-parser.c.

618{
619 return dundi_ie_append_raw(ied, ie, &dat, 1);
620}

References dundi_ie_append_raw().

Referenced by handle_command_response().

◆ dundi_ie_append_cause()

int dundi_ie_append_cause ( struct dundi_ie_data ied,
unsigned char  ie,
unsigned char  cause,
char *  desc 
)

Definition at line 501 of file dundi-parser.c.

502{
503 char tmp[256];
504 int datalen = data ? strlen(data) + 1 : 1;
505 if (datalen > ((int)sizeof(ied->buf) - ied->pos)) {
506 snprintf(tmp, (int)sizeof(tmp), "Out of space for ie '%s' (%d), need %d have %d\n", dundi_ie2str(ie), ie, datalen, (int)sizeof(ied->buf) - ied->pos);
507 errorf(tmp);
508 return -1;
509 }
510 ied->buf[ied->pos++] = ie;
511 ied->buf[ied->pos++] = datalen;
512 ied->buf[ied->pos++] = cause;
513 if (data) {
514 memcpy(ied->buf + ied->pos, data, datalen-1);
515 ied->pos += datalen-1;
516 }
517 return 0;
518}

References dundi_ie_data::buf, dundi_ie2str(), errorf, dundi_ie_data::pos, and tmp().

Referenced by dundi_answer_entity(), dundi_answer_query(), dundi_lookup_thread(), dundi_prop_precache(), and handle_command_response().

◆ dundi_ie_append_eid()

int dundi_ie_append_eid ( struct dundi_ie_data ied,
unsigned char  ie,
dundi_eid eid 
)

Definition at line 612 of file dundi-parser.c.

613{
614 return dundi_ie_append_raw(ied, ie, (unsigned char *)eid, sizeof(dundi_eid));
615}
An Entity ID is essentially a MAC address, brief and unique.
Definition: utils.h:813

References dundi_ie_append_raw().

Referenced by do_register(), dundi_discover(), dundi_encrypt(), dundi_ie_append_eid_appropriately(), dundi_query(), handle_command_response(), and precache_trans().

◆ dundi_ie_append_encdata()

int dundi_ie_append_encdata ( struct dundi_ie_data ied,
unsigned char  ie,
unsigned char *  iv,
void *  data,
int  datalen 
)

Definition at line 541 of file dundi-parser.c.

542{
543 char tmp[256];
544 datalen += 16;
545 if (datalen > ((int)sizeof(ied->buf) - ied->pos)) {
546 snprintf(tmp, (int)sizeof(tmp), "Out of space for ie '%s' (%d), need %d have %d\n", dundi_ie2str(ie), ie, datalen, (int)sizeof(ied->buf) - ied->pos);
547 errorf(tmp);
548 return -1;
549 }
550 ied->buf[ied->pos++] = ie;
551 ied->buf[ied->pos++] = datalen;
552 memcpy(ied->buf + ied->pos, iv, 16);
553 ied->pos += 16;
554 if (data) {
555 memcpy(ied->buf + ied->pos, data, datalen-16);
556 ied->pos += datalen-16;
557 }
558 return 0;
559}

References dundi_ie_data::buf, dundi_ie2str(), errorf, dundi_ie_data::pos, and tmp().

Referenced by dundi_encrypt(), and handle_command_response().

◆ dundi_ie_append_hint()

int dundi_ie_append_hint ( struct dundi_ie_data ied,
unsigned char  ie,
unsigned short  flags,
char *  data 
)

Definition at line 520 of file dundi-parser.c.

521{
522 char tmp[256];
523 int datalen = data ? strlen(data) + 2 : 2;
524 if (datalen > ((int)sizeof(ied->buf) - ied->pos)) {
525 snprintf(tmp, (int)sizeof(tmp), "Out of space for ie '%s' (%d), need %d have %d\n", dundi_ie2str(ie), ie, datalen, (int)sizeof(ied->buf) - ied->pos);
526 errorf(tmp);
527 return -1;
528 }
529 ied->buf[ied->pos++] = ie;
530 ied->buf[ied->pos++] = datalen;
531 flags = htons(flags);
532 memcpy(ied->buf + ied->pos, &flags, sizeof(flags));
533 ied->pos += 2;
534 if (data) {
535 memcpy(ied->buf + ied->pos, data, datalen-2);
536 ied->pos += datalen-2;
537 }
538 return 0;
539}

References dundi_ie_data::buf, dundi_ie2str(), errorf, dundi_ie_data::pos, and tmp().

Referenced by dundi_lookup_thread(), dundi_query_thread(), and precache_trans().

◆ dundi_ie_append_int()

int dundi_ie_append_int ( struct dundi_ie_data ied,
unsigned char  ie,
unsigned int  value 
)

Definition at line 593 of file dundi-parser.c.

594{
595 unsigned int newval;
596 newval = htonl(value);
597 return dundi_ie_append_raw(ied, ie, &newval, (int)sizeof(newval));
598}
int value
Definition: syslog.c:37

References dundi_ie_append_raw(), and value.

Referenced by dundi_encrypt().

◆ dundi_ie_append_raw()

int dundi_ie_append_raw ( struct dundi_ie_data ied,
unsigned char  ie,
void *  data,
int  datalen 
)

Definition at line 486 of file dundi-parser.c.

487{
488 char tmp[256];
489 if (datalen > ((int)sizeof(ied->buf) - ied->pos)) {
490 snprintf(tmp, (int)sizeof(tmp), "Out of space for ie '%s' (%d), need %d have %d\n", dundi_ie2str(ie), ie, datalen, (int)sizeof(ied->buf) - ied->pos);
491 errorf(tmp);
492 return -1;
493 }
494 ied->buf[ied->pos++] = ie;
495 ied->buf[ied->pos++] = datalen;
496 memcpy(ied->buf + ied->pos, data, datalen);
497 ied->pos += datalen;
498 return 0;
499}

References dundi_ie_data::buf, dundi_ie2str(), errorf, dundi_ie_data::pos, and tmp().

Referenced by dundi_encrypt(), dundi_ie_append(), dundi_ie_append_addr(), dundi_ie_append_byte(), dundi_ie_append_eid(), dundi_ie_append_int(), dundi_ie_append_short(), dundi_ie_append_str(), and handle_command_response().

◆ dundi_ie_append_short()

int dundi_ie_append_short ( struct dundi_ie_data ied,
unsigned char  ie,
unsigned short  value 
)

Definition at line 600 of file dundi-parser.c.

601{
602 unsigned short newval;
603 newval = htons(value);
604 return dundi_ie_append_raw(ied, ie, &newval, (int)sizeof(newval));
605}

References dundi_ie_append_raw(), and value.

Referenced by do_register(), dundi_discover(), dundi_lookup_thread(), dundi_query(), handle_command_response(), and precache_trans().

◆ dundi_ie_append_str()

int dundi_ie_append_str ( struct dundi_ie_data ied,
unsigned char  ie,
char *  str 
)

Definition at line 607 of file dundi-parser.c.

608{
609 return dundi_ie_append_raw(ied, ie, str, strlen(str));
610}
const char * str
Definition: app_jack.c:147

References dundi_ie_append_raw(), and str.

Referenced by dundi_discover(), dundi_query(), dundi_query_thread(), and precache_trans().

◆ dundi_parse_ies()

int dundi_parse_ies ( struct dundi_ies ies,
unsigned char *  data,
int  datalen 
)

Definition at line 637 of file dundi-parser.c.

638{
639 /* Parse data into information elements */
640 int len;
641 int ie;
642 char tmp[256];
643 memset(ies, 0, (int)sizeof(struct dundi_ies));
644 ies->ttl = -1;
645 ies->expiration = -1;
646 ies->unknowncmd = -1;
647 ies->cause = -1;
648 while(datalen >= 2) {
649 ie = data[0];
650 len = data[1];
651 if (len > datalen - 2) {
652 errorf("Information element length exceeds message size\n");
653 return -1;
654 }
655 switch(ie) {
656 case DUNDI_IE_EID:
658 if (len != (int)sizeof(dundi_eid)) {
659 errorf("Improper entity identifer, expecting 6 bytes!\n");
660 } else if (ies->eidcount < DUNDI_MAX_STACK) {
661 ies->eids[ies->eidcount] = (dundi_eid *)(data + 2);
662 ies->eid_direct[ies->eidcount] = (ie == DUNDI_IE_EID_DIRECT);
663 ies->eidcount++;
664 } else
665 errorf("Too many entities in stack!\n");
666 break;
667 case DUNDI_IE_REQEID:
668 if (len != (int)sizeof(dundi_eid)) {
669 errorf("Improper requested entity identifer, expecting 6 bytes!\n");
670 } else
671 ies->reqeid = (dundi_eid *)(data + 2);
672 break;
674 ies->called_context = (char *)data + 2;
675 break;
677 ies->called_number = (char *)data + 2;
678 break;
679 case DUNDI_IE_ANSWER:
680 if (len < sizeof(struct dundi_answer)) {
681 snprintf(tmp, (int)sizeof(tmp), "Answer expected to be >=%d bytes long but was %d\n", (int)sizeof(struct dundi_answer), len);
682 errorf(tmp);
683 } else {
684 if (ies->anscount < DUNDI_MAX_ANSWERS)
685 ies->answers[ies->anscount++]= (struct dundi_answer *)(data + 2);
686 else
687 errorf("Ignoring extra answers!\n");
688 }
689 break;
690 case DUNDI_IE_TTL:
691 if (len != (int)sizeof(unsigned short)) {
692 snprintf(tmp, (int)sizeof(tmp), "Expecting ttl to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
693 errorf(tmp);
694 } else
695 ies->ttl = ntohs(*((unsigned short *)(data + 2)));
696 break;
697 case DUNDI_IE_VERSION:
698 if (len != (int)sizeof(unsigned short)) {
699 snprintf(tmp, (int)sizeof(tmp), "Expecting version to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
700 errorf(tmp);
701 } else
702 ies->version = ntohs(*((unsigned short *)(data + 2)));
703 break;
705 if (len != (int)sizeof(unsigned short)) {
706 snprintf(tmp, (int)sizeof(tmp), "Expecting expiration to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len);
707 errorf(tmp);
708 } else
709 ies->expiration = ntohs(*((unsigned short *)(data + 2)));
710 break;
712 if (len != (int)sizeof(unsigned int)) {
713 snprintf(tmp, (int)sizeof(tmp), "Expecting expiration to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len);
714 errorf(tmp);
715 } else
716 ies->keycrc32 = ntohl(*((unsigned int *)(data + 2)));
717 break;
718 case DUNDI_IE_UNKNOWN:
719 if (len == 1)
720 ies->unknowncmd = data[2];
721 else {
722 snprintf(tmp, (int)sizeof(tmp), "Expected single byte Unknown command, but was %d long\n", len);
723 errorf(tmp);
724 }
725 break;
726 case DUNDI_IE_CAUSE:
727 if (len >= 1) {
728 ies->cause = data[2];
729 ies->causestr = (char *)data + 3;
730 } else {
731 snprintf(tmp, (int)sizeof(tmp), "Expected at least one byte cause, but was %d long\n", len);
732 errorf(tmp);
733 }
734 break;
735 case DUNDI_IE_HINT:
736 if (len >= 2) {
737 ies->hint = (struct dundi_hint *)(data + 2);
738 } else {
739 snprintf(tmp, (int)sizeof(tmp), "Expected at least two byte hint, but was %d long\n", len);
740 errorf(tmp);
741 }
742 break;
744 ies->q_dept = (char *)data + 2;
745 break;
747 ies->q_org = (char *)data + 2;
748 break;
750 ies->q_locality = (char *)data + 2;
751 break;
753 ies->q_stateprov = (char *)data + 2;
754 break;
755 case DUNDI_IE_COUNTRY:
756 ies->q_country = (char *)data + 2;
757 break;
758 case DUNDI_IE_EMAIL:
759 ies->q_email = (char *)data + 2;
760 break;
761 case DUNDI_IE_PHONE:
762 ies->q_phone = (char *)data + 2;
763 break;
764 case DUNDI_IE_IPADDR:
765 ies->q_ipaddr = (char *)data + 2;
766 break;
767 case DUNDI_IE_ENCDATA:
768 /* Recalculate len as the remainder of the message, regardless of
769 theoretical length */
770 len = datalen - 2;
771 if ((len > 16) && !(len % 16)) {
772 ies->encblock = (struct dundi_encblock *)(data + 2);
773 ies->enclen = len - 16;
774 } else {
775 snprintf(tmp, (int)sizeof(tmp), "Invalid encrypted data length %d\n", len);
776 errorf(tmp);
777 }
778 break;
780 if (len == 128) {
781 ies->encsharedkey = (unsigned char *)(data + 2);
782 } else {
783 snprintf(tmp, (int)sizeof(tmp), "Invalid encrypted shared key length %d\n", len);
784 errorf(tmp);
785 }
786 break;
788 if (len == 128) {
789 ies->encsig = (unsigned char *)(data + 2);
790 } else {
791 snprintf(tmp, (int)sizeof(tmp), "Invalid encrypted signature length %d\n", len);
792 errorf(tmp);
793 }
794 break;
796 ies->cbypass = 1;
797 break;
798 default:
799 snprintf(tmp, (int)sizeof(tmp), "Ignoring unknown information element '%s' (%d) of length %d\n", dundi_ie2str(ie), ie, len);
800 outputf(tmp);
801 }
802 /* Overwrite information element with 0, to null terminate previous portion */
803 data[0] = 0;
804 datalen -= (len + 2);
805 data += (len + 2);
806 }
807 /* Null-terminate last field */
808 *data = '\0';
809 if (datalen) {
810 errorf("Invalid information element contents, strange boundary\n");
811 return -1;
812 }
813 return 0;
814}
static void(* outputf)(const char *str)
Definition: dundi-parser.c:51
#define DUNDI_MAX_STACK
Definition: dundi-parser.h:18
#define DUNDI_MAX_ANSWERS
Definition: dundi-parser.h:19
#define DUNDI_IE_COUNTRY
Definition: dundi.h:205
#define DUNDI_IE_VERSION
Definition: dundi.h:190
#define DUNDI_IE_CACHEBYPASS
Definition: dundi.h:209
#define DUNDI_IE_ENCDATA
Definition: dundi.h:195
#define DUNDI_IE_IPADDR
Definition: dundi.h:208
#define DUNDI_IE_DEPARTMENT
Definition: dundi.h:201
#define DUNDI_IE_ORGANIZATION
Definition: dundi.h:202
#define DUNDI_IE_TTL
Definition: dundi.h:189
#define DUNDI_IE_LOCALITY
Definition: dundi.h:203
#define DUNDI_IE_SIGNATURE
Definition: dundi.h:197
#define DUNDI_IE_EXPIRATION
Definition: dundi.h:191
#define DUNDI_IE_HINT
Definition: dundi.h:199
#define DUNDI_IE_CALLED_CONTEXT
Definition: dundi.h:185
#define DUNDI_IE_CAUSE
Definition: dundi.h:193
#define DUNDI_IE_PHONE
Definition: dundi.h:207
#define DUNDI_IE_REQEID
Definition: dundi.h:194
#define DUNDI_IE_CALLED_NUMBER
Definition: dundi.h:186
#define DUNDI_IE_EID_DIRECT
Definition: dundi.h:187
#define DUNDI_IE_EID
Definition: dundi.h:184
#define DUNDI_IE_SHAREDKEY
Definition: dundi.h:196
#define DUNDI_IE_UNKNOWN
Definition: dundi.h:192
#define DUNDI_IE_KEYCRC32
Definition: dundi.h:198
#define DUNDI_IE_EMAIL
Definition: dundi.h:206
#define DUNDI_IE_STATE_PROV
Definition: dundi.h:204
#define DUNDI_IE_ANSWER
Definition: dundi.h:188
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
unsigned char data[0]
Definition: dundi.h:109
unsigned char data[0]
Definition: dundi.h:114
struct dundi_answer * answers[DUNDI_MAX_ANSWERS+1]
Definition: dundi-parser.h:28
char * causestr
Definition: dundi-parser.h:45
char * q_org
Definition: dundi-parser.h:38
dundi_eid * reqeid
Definition: dundi-parser.h:24
dundi_eid * eids[DUNDI_MAX_STACK+1]
Definition: dundi-parser.h:22
char * called_context
Definition: dundi-parser.h:26
int eid_direct[DUNDI_MAX_STACK+1]
Definition: dundi-parser.h:23
char * q_country
Definition: dundi-parser.h:41
int unknowncmd
Definition: dundi-parser.h:34
char * q_phone
Definition: dundi-parser.h:43
char * q_locality
Definition: dundi-parser.h:39
char * q_ipaddr
Definition: dundi-parser.h:44
char * called_number
Definition: dundi-parser.h:27
int eidcount
Definition: dundi-parser.h:25
unsigned long keycrc32
Definition: dundi-parser.h:48
unsigned char * encsharedkey
Definition: dundi-parser.h:46
struct dundi_hint * hint
Definition: dundi-parser.h:29
int anscount
Definition: dundi-parser.h:30
char * q_email
Definition: dundi-parser.h:42
unsigned char * encsig
Definition: dundi-parser.h:47
char * q_dept
Definition: dundi-parser.h:37
int expiration
Definition: dundi-parser.h:33
char * q_stateprov
Definition: dundi-parser.h:40
struct dundi_encblock * encblock
Definition: dundi-parser.h:49

References dundi_ies::anscount, dundi_ies::answers, dundi_ies::called_context, dundi_ies::called_number, dundi_ies::cause, dundi_ies::causestr, dundi_ies::cbypass, dundi_answer::data, dundi_hint::data, dundi_ie2str(), DUNDI_IE_ANSWER, DUNDI_IE_CACHEBYPASS, DUNDI_IE_CALLED_CONTEXT, DUNDI_IE_CALLED_NUMBER, DUNDI_IE_CAUSE, DUNDI_IE_COUNTRY, DUNDI_IE_DEPARTMENT, DUNDI_IE_EID, DUNDI_IE_EID_DIRECT, DUNDI_IE_EMAIL, DUNDI_IE_ENCDATA, DUNDI_IE_EXPIRATION, DUNDI_IE_HINT, DUNDI_IE_IPADDR, DUNDI_IE_KEYCRC32, DUNDI_IE_LOCALITY, DUNDI_IE_ORGANIZATION, DUNDI_IE_PHONE, DUNDI_IE_REQEID, DUNDI_IE_SHAREDKEY, DUNDI_IE_SIGNATURE, DUNDI_IE_STATE_PROV, DUNDI_IE_TTL, DUNDI_IE_UNKNOWN, DUNDI_IE_VERSION, DUNDI_MAX_ANSWERS, DUNDI_MAX_STACK, dundi_ies::eid_direct, dundi_ies::eidcount, dundi_ies::eids, dundi_ies::encblock, dundi_ies::enclen, dundi_ies::encsharedkey, dundi_ies::encsig, errorf, dundi_ies::expiration, dundi_ies::hint, dundi_ies::keycrc32, len(), outputf, dundi_ies::q_country, dundi_ies::q_dept, dundi_ies::q_email, dundi_ies::q_ipaddr, dundi_ies::q_locality, dundi_ies::q_org, dundi_ies::q_phone, dundi_ies::q_stateprov, dundi_ies::reqeid, tmp(), dundi_ies::ttl, dundi_ies::unknowncmd, and dundi_ies::version.

Referenced by handle_command_response().

◆ dundi_set_error()

void dundi_set_error ( void(*)(const char *data)  output)

◆ dundi_set_output()

void dundi_set_output ( void(*)(const char *data)  output)

◆ dundi_showframe()

void dundi_showframe ( struct dundi_hdr fhi,
int  rx,
struct ast_sockaddr sin,
int  datalen 
)

Definition at line 434 of file dundi-parser.c.

435{
436 char *pref[] = {
437 "Tx",
438 "Rx",
439 " ETx",
440 " Erx" };
441 char *commands[] = {
442 "ACK ",
443 "DPDISCOVER ",
444 "DPRESPONSE ",
445 "EIDQUERY ",
446 "EIDRESPONSE ",
447 "PRECACHERQ ",
448 "PRECACHERP ",
449 "INVALID ",
450 "UNKNOWN CMD ",
451 "NULL ",
452 "REGREQ ",
453 "REGRESPONSE ",
454 "CANCEL ",
455 "ENCRYPT ",
456 "ENCREJ " };
457 char class2[20];
458 char *class;
459 char subclass2[20];
460 char *subclass;
461 char tmp[256];
462 if ((fhi->cmdresp & 0x3f) >= ARRAY_LEN(commands)) {
463 snprintf(class2, sizeof(class2), "(%d?)", fhi->cmdresp & 0x3f);
464 class = class2;
465 } else {
466 class = commands[fhi->cmdresp & 0x3f];
467 }
468 snprintf(subclass2, sizeof(subclass2), "%02hhx", (unsigned char)fhi->cmdflags);
469 subclass = subclass2;
470 snprintf(tmp, sizeof(tmp),
471 "%s-Frame -- OSeqno: %3.3d ISeqno: %3.3d Type: %s (%s)\n",
472 pref[rx],
473 fhi->oseqno, fhi->iseqno, class, fhi->cmdresp & 0x40 ? "Response" : "Command");
474 outputf(tmp);
475
476 snprintf(tmp, (int)sizeof(tmp),
477 "%s Flags: %s STrans: %5.5d DTrans: %5.5d [%s]%s\n", (rx > 1) ? " " : "",
478 subclass, ntohs(fhi->strans) & ~DUNDI_FLAG_RESERVED, ntohs(fhi->dtrans) & ~DUNDI_FLAG_RETRANS,
480 fhi->cmdresp & 0x80 ? " (Final)" : "");
481
482 outputf(tmp);
483 dump_ies(fhi->ies, rx > 1, datalen);
484}
static void dump_ies(unsigned char *iedata, int spaces, int len)
Definition: dundi-parser.c:385
#define DUNDI_FLAG_RETRANS
Definition: dundi.h:50
#define DUNDI_FLAG_RESERVED
Definition: dundi.h:51
static char * ast_sockaddr_stringify(const struct ast_sockaddr *addr)
Wrapper around ast_sockaddr_stringify_fmt() with default format.
Definition: netsock2.h:256
static struct agi_command commands[]
AGI commands list.
Definition: res_agi.c:3746
unsigned short strans
Definition: dundi.h:35
unsigned char ies[0]
Definition: dundi.h:41
unsigned char cmdflags
Definition: dundi.h:40
unsigned char cmdresp
Definition: dundi.h:39
unsigned char iseqno
Definition: dundi.h:37
unsigned short dtrans
Definition: dundi.h:36
unsigned char oseqno
Definition: dundi.h:38

References ARRAY_LEN, ast_sockaddr_stringify(), dundi_hdr::cmdflags, dundi_hdr::cmdresp, commands, dundi_hdr::dtrans, dump_ies(), DUNDI_FLAG_RESERVED, DUNDI_FLAG_RETRANS, dundi_hdr::ies, dundi_hdr::iseqno, dundi_hdr::oseqno, outputf, dundi_hdr::strans, and tmp().

Referenced by dundi_send(), dundi_xmit(), handle_command_response(), and socket_read().

◆ dundi_str_short_to_eid()

int dundi_str_short_to_eid ( dundi_eid eid,
const char *  s 
)

Definition at line 70 of file dundi-parser.c.

71{
72 unsigned int eid_int[6];
73 int x;
74 if (sscanf(s, "%2x%2x%2x%2x%2x%2x", &eid_int[0], &eid_int[1], &eid_int[2],
75 &eid_int[3], &eid_int[4], &eid_int[5]) != 6)
76 return -1;
77 for (x = 0; x < 6; x++)
78 eid->eid[x] = eid_int[x];
79 return 0;
80}

References ast_eid::eid.

Referenced by cache_lookup_internal(), dundi_show_cache(), and dundi_show_hints().