#include "asterisk/dundi.h"
#include "asterisk/aes.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 |
Defines | |
#define | DUNDI_MAX_ANSWERS 100 |
#define | DUNDI_MAX_STACK 512 |
Functions | |
int | dundi_eid_cmp (dundi_eid *eid1, dundi_eid *eid2) |
char * | dundi_eid_to_str (char *s, int maxlen, dundi_eid *eid) |
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 sockaddr_in *sin, int datalen) |
int | dundi_str_short_to_eid (dundi_eid *eid, char *s) |
int | dundi_str_to_eid (dundi_eid *eid, char *s) |
|
Definition at line 19 of file dundi-parser.h. Referenced by dundi_parse_ies(). |
|
Definition at line 18 of file dundi-parser.h. Referenced by append_transaction(), dundi_parse_ies(), and optimize_transactions(). |
|
Definition at line 122 of file dundi-parser.c. Referenced by build_peer(), build_transactions(), destroy_trans(), dundi_answer_entity(), dundi_answer_query(), dundi_ie_append_eid_appropriately(), dundi_lookup_internal(), dundi_query_thread(), find_peer(), optimize_transactions(), and register_request(). 00123 { 00124 return memcmp(eid1, eid2, sizeof(dundi_eid)); 00125 }
|
|
Definition at line 57 of file dundi-parser.c. References _dundi_eid::eid. Referenced by append_transaction(), build_peer(), build_transactions(), cache_lookup(), cache_lookup_internal(), check_key(), complete_peer_helper(), destroy_trans(), do_autokill(), do_register(), do_register_expire(), dump_answer(), dump_eid(), dundi_answer_entity(), dundi_lookup_internal(), dundi_lookup_local(), dundi_lookup_thread(), dundi_precache_thread(), dundi_query_thread(), dundi_send(), dundi_show_entityid(), dundi_show_peer(), dundi_show_requests(), handle_command_response(), populate_addr(), register_request(), reset_global_eid(), and update_key(). 00058 { 00059 int x; 00060 char *os = s; 00061 if (maxlen < 18) { 00062 if (s && (maxlen > 0)) 00063 *s = '\0'; 00064 } else { 00065 for (x=0;x<5;x++) { 00066 sprintf(s, "%02x:", eid->eid[x]); 00067 s += 3; 00068 } 00069 sprintf(s, "%02x", eid->eid[5]); 00070 } 00071 return os; 00072 }
|
|
Definition at line 74 of file dundi-parser.c. References _dundi_eid::eid. Referenced by cache_lookup(), cache_save(), cache_save_hint(), and handle_command_response(). 00075 { 00076 int x; 00077 char *os = s; 00078 if (maxlen < 13) { 00079 if (s && (maxlen > 0)) 00080 *s = '\0'; 00081 } else { 00082 for (x=0;x<6;x++) { 00083 sprintf(s, "%02X", eid->eid[x]); 00084 s += 2; 00085 } 00086 } 00087 return os; 00088 }
|
|
Definition at line 114 of file dundi-parser.c. References _dundi_eid::eid. Referenced by build_transactions(), dundi_discover(), dundi_query(), and dundi_show_requests(). 00115 { 00116 int x; 00117 for (x=0;x<sizeof(eid->eid) / sizeof(eid->eid[0]);x++) 00118 if (eid->eid[x]) return 0; 00119 return 1; 00120 }
|
|
Definition at line 273 of file dundi-parser.c. References ast_strlen_zero(), 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(), and dundi_show_mappings(). 00274 { 00275 strcpy(buf, ""); 00276 buf[bufsiz-1] = '\0'; 00277 if (flags & DUNDI_FLAG_EXISTS) { 00278 strncat(buf, "EXISTS|", bufsiz - strlen(buf) - 1); 00279 } 00280 if (flags & DUNDI_FLAG_MATCHMORE) { 00281 strncat(buf, "MATCHMORE|", bufsiz - strlen(buf) - 1); 00282 } 00283 if (flags & DUNDI_FLAG_CANMATCH) { 00284 strncat(buf, "CANMATCH|", bufsiz - strlen(buf) - 1); 00285 } 00286 if (flags & DUNDI_FLAG_IGNOREPAT) { 00287 strncat(buf, "IGNOREPAT|", bufsiz - strlen(buf) - 1); 00288 } 00289 if (flags & DUNDI_FLAG_RESIDENTIAL) { 00290 strncat(buf, "RESIDENCE|", bufsiz - strlen(buf) - 1); 00291 } 00292 if (flags & DUNDI_FLAG_COMMERCIAL) { 00293 strncat(buf, "COMMERCIAL|", bufsiz - strlen(buf) - 1); 00294 } 00295 if (flags & DUNDI_FLAG_MOBILE) { 00296 strncat(buf, "MOBILE", bufsiz - strlen(buf) - 1); 00297 } 00298 if (flags & DUNDI_FLAG_NOUNSOLICITED) { 00299 strncat(buf, "NOUNSLCTD|", bufsiz - strlen(buf) - 1); 00300 } 00301 if (flags & DUNDI_FLAG_NOCOMUNSOLICIT) { 00302 strncat(buf, "NOCOMUNSLTD|", bufsiz - strlen(buf) - 1); 00303 } 00304 /* Get rid of trailing | */ 00305 if (ast_strlen_zero(buf)) 00306 strcpy(buf, "NONE|"); 00307 buf[strlen(buf)-1] = '\0'; 00308 return buf; 00309 }
|
|
Definition at line 151 of file dundi-parser.c. References ast_strlen_zero(), DUNDI_HINT_DONT_ASK, DUNDI_HINT_TTL_EXPIRED, and DUNDI_HINT_UNAFFECTED. Referenced by dump_hint(). 00152 { 00153 strcpy(buf, ""); 00154 buf[bufsiz-1] = '\0'; 00155 if (flags & DUNDI_HINT_TTL_EXPIRED) { 00156 strncat(buf, "TTLEXPIRED|", bufsiz - strlen(buf) - 1); 00157 } 00158 if (flags & DUNDI_HINT_DONT_ASK) { 00159 strncat(buf, "DONTASK|", bufsiz - strlen(buf) - 1); 00160 } 00161 if (flags & DUNDI_HINT_UNAFFECTED) { 00162 strncat(buf, "UNAFFECTED|", bufsiz - strlen(buf) - 1); 00163 } 00164 /* Get rid of trailing | */ 00165 if (ast_strlen_zero(buf)) 00166 strcpy(buf, "NONE|"); 00167 buf[strlen(buf)-1] = '\0'; 00168 return buf; 00169 }
|
|
Definition at line 389 of file dundi-parser.c. 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(). 00390 { 00391 int x; 00392 for (x=0;x<(int)sizeof(ies) / (int)sizeof(ies[0]); x++) { 00393 if (ies[x].ie == ie) 00394 return ies[x].name; 00395 } 00396 return "Unknown IE"; 00397 }
|
|
Definition at line 640 of file dundi-parser.c. References dundi_ie_append_raw(). Referenced by dundi_discover(). 00641 { 00642 return dundi_ie_append_raw(ied, ie, NULL, 0); 00643 }
|
|
Definition at line 606 of file dundi-parser.c. References dundi_ie_append_raw(). 00607 { 00608 return dundi_ie_append_raw(ied, ie, sin, (int)sizeof(struct sockaddr_in)); 00609 }
|
|
Definition at line 579 of file dundi-parser.c. References dundi_ie_data::buf, dundi_ie2str(), _dundi_eid::eid, errorf, and dundi_ie_data::pos. 00580 { 00581 char tmp[256]; 00582 int datalen = data ? strlen(data) + 11 : 11; 00583 int x; 00584 unsigned short myw; 00585 if (datalen > ((int)sizeof(ied->buf) - ied->pos)) { 00586 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); 00587 errorf(tmp); 00588 return -1; 00589 } 00590 ied->buf[ied->pos++] = ie; 00591 ied->buf[ied->pos++] = datalen; 00592 for (x=0;x<6;x++) 00593 ied->buf[ied->pos++] = eid->eid[x]; 00594 ied->buf[ied->pos++] = protocol; 00595 myw = htons(flags); 00596 memcpy(ied->buf + ied->pos, &myw, 2); 00597 ied->pos += 2; 00598 myw = htons(weight); 00599 memcpy(ied->buf + ied->pos, &myw, 2); 00600 ied->pos += 2; 00601 memcpy(ied->buf + ied->pos, data, datalen-11); 00602 ied->pos += datalen-11; 00603 return 0; 00604 }
|
|
Definition at line 635 of file dundi-parser.c. References dundi_ie_append_raw(). 00636 { 00637 return dundi_ie_append_raw(ied, ie, &dat, 1); 00638 }
|
|
Definition at line 523 of file dundi-parser.c. References dundi_ie_data::buf, dundi_ie2str(), errorf, and dundi_ie_data::pos. Referenced by dundi_answer_entity(), and handle_command_response(). 00524 { 00525 char tmp[256]; 00526 int datalen = data ? strlen(data) + 1 : 1; 00527 if (datalen > ((int)sizeof(ied->buf) - ied->pos)) { 00528 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); 00529 errorf(tmp); 00530 return -1; 00531 } 00532 ied->buf[ied->pos++] = ie; 00533 ied->buf[ied->pos++] = datalen; 00534 ied->buf[ied->pos++] = cause; 00535 memcpy(ied->buf + ied->pos, data, datalen-1); 00536 ied->pos += datalen-1; 00537 return 0; 00538 }
|
|
Definition at line 630 of file dundi-parser.c. References dundi_ie_append_raw(). Referenced by do_register(), dundi_discover(), dundi_encrypt(), dundi_ie_append_eid_appropriately(), and dundi_query(). 00631 { 00632 return dundi_ie_append_raw(ied, ie, (unsigned char *)eid, sizeof(dundi_eid)); 00633 }
|
|
Definition at line 559 of file dundi-parser.c. References dundi_ie_data::buf, dundi_ie2str(), errorf, and dundi_ie_data::pos. Referenced by dundi_encrypt(). 00560 { 00561 char tmp[256]; 00562 datalen += 16; 00563 if (datalen > ((int)sizeof(ied->buf) - ied->pos)) { 00564 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); 00565 errorf(tmp); 00566 return -1; 00567 } 00568 ied->buf[ied->pos++] = ie; 00569 ied->buf[ied->pos++] = datalen; 00570 memcpy(ied->buf + ied->pos, iv, 16); 00571 ied->pos += 16; 00572 if (data) { 00573 memcpy(ied->buf + ied->pos, data, datalen-16); 00574 ied->pos += datalen-16; 00575 } 00576 return 0; 00577 }
|
|
Definition at line 540 of file dundi-parser.c. References dundi_ie_data::buf, dundi_ie2str(), errorf, and dundi_ie_data::pos. Referenced by dundi_query_thread(). 00541 { 00542 char tmp[256]; 00543 int datalen = data ? strlen(data) + 2 : 2; 00544 if (datalen > ((int)sizeof(ied->buf) - ied->pos)) { 00545 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); 00546 errorf(tmp); 00547 return -1; 00548 } 00549 ied->buf[ied->pos++] = ie; 00550 ied->buf[ied->pos++] = datalen; 00551 flags = htons(flags); 00552 memcpy(ied->buf + ied->pos, &flags, sizeof(flags)); 00553 ied->pos += 2; 00554 memcpy(ied->buf + ied->pos, data, datalen-1); 00555 ied->pos += datalen-2; 00556 return 0; 00557 }
|
|
Definition at line 611 of file dundi-parser.c. References dundi_ie_append_raw(). Referenced by dundi_encrypt(). 00612 { 00613 unsigned int newval; 00614 newval = htonl(value); 00615 return dundi_ie_append_raw(ied, ie, &newval, (int)sizeof(newval)); 00616 }
|
|
Definition at line 508 of file dundi-parser.c. References dundi_ie_data::buf, dundi_ie2str(), errorf, and dundi_ie_data::pos. 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(), and dundi_ie_append_str(). 00509 { 00510 char tmp[256]; 00511 if (datalen > ((int)sizeof(ied->buf) - ied->pos)) { 00512 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); 00513 errorf(tmp); 00514 return -1; 00515 } 00516 ied->buf[ied->pos++] = ie; 00517 ied->buf[ied->pos++] = datalen; 00518 memcpy(ied->buf + ied->pos, data, datalen); 00519 ied->pos += datalen; 00520 return 0; 00521 }
|
|
Definition at line 618 of file dundi-parser.c. References dundi_ie_append_raw(). Referenced by do_register(), dundi_discover(), dundi_query(), and handle_command_response(). 00619 { 00620 unsigned short newval; 00621 newval = htons(value); 00622 return dundi_ie_append_raw(ied, ie, &newval, (int)sizeof(newval)); 00623 }
|
|
Definition at line 625 of file dundi-parser.c. References dundi_ie_append_raw(). Referenced by dundi_discover(), dundi_query(), and dundi_query_thread(). 00626 { 00627 return dundi_ie_append_raw(ied, ie, str, strlen(str)); 00628 }
|
|
Definition at line 655 of file dundi-parser.c. References 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, errorf, ies, and outputf. Referenced by handle_command_response(). 00656 { 00657 /* Parse data into information elements */ 00658 int len; 00659 int ie; 00660 char tmp[256]; 00661 memset(ies, 0, (int)sizeof(struct dundi_ies)); 00662 ies->ttl = -1; 00663 ies->expiration = -1; 00664 ies->unknowncmd = -1; 00665 ies->cause = -1; 00666 while(datalen >= 2) { 00667 ie = data[0]; 00668 len = data[1]; 00669 if (len > datalen - 2) { 00670 errorf("Information element length exceeds message size\n"); 00671 return -1; 00672 } 00673 switch(ie) { 00674 case DUNDI_IE_EID: 00675 case DUNDI_IE_EID_DIRECT: 00676 if (len != (int)sizeof(dundi_eid)) { 00677 errorf("Improper entity identifer, expecting 6 bytes!\n"); 00678 } else if (ies->eidcount < DUNDI_MAX_STACK) { 00679 ies->eids[ies->eidcount] = (dundi_eid *)(data + 2); 00680 ies->eid_direct[ies->eidcount] = (ie == DUNDI_IE_EID_DIRECT); 00681 ies->eidcount++; 00682 } else 00683 errorf("Too many entities in stack!\n"); 00684 break; 00685 case DUNDI_IE_REQEID: 00686 if (len != (int)sizeof(dundi_eid)) { 00687 errorf("Improper requested entity identifer, expecting 6 bytes!\n"); 00688 } else 00689 ies->reqeid = (dundi_eid *)(data + 2); 00690 break; 00691 case DUNDI_IE_CALLED_CONTEXT: 00692 ies->called_context = (char *)data + 2; 00693 break; 00694 case DUNDI_IE_CALLED_NUMBER: 00695 ies->called_number = (char *)data + 2; 00696 break; 00697 case DUNDI_IE_ANSWER: 00698 if (len < sizeof(struct dundi_answer)) { 00699 snprintf(tmp, (int)sizeof(tmp), "Answer expected to be >=%d bytes long but was %d\n", (int)sizeof(struct dundi_answer), len); 00700 errorf(tmp); 00701 } else { 00702 if (ies->anscount < DUNDI_MAX_ANSWERS) 00703 ies->answers[ies->anscount++]= (struct dundi_answer *)(data + 2); 00704 else 00705 errorf("Ignoring extra answers!\n"); 00706 } 00707 break; 00708 case DUNDI_IE_TTL: 00709 if (len != (int)sizeof(unsigned short)) { 00710 snprintf(tmp, (int)sizeof(tmp), "Expecting ttl to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len); 00711 errorf(tmp); 00712 } else 00713 ies->ttl = ntohs(*((unsigned short *)(data + 2))); 00714 break; 00715 case DUNDI_IE_VERSION: 00716 if (len != (int)sizeof(unsigned short)) { 00717 snprintf(tmp, (int)sizeof(tmp), "Expecting version to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len); 00718 errorf(tmp); 00719 } else 00720 ies->version = ntohs(*((unsigned short *)(data + 2))); 00721 break; 00722 case DUNDI_IE_EXPIRATION: 00723 if (len != (int)sizeof(unsigned short)) { 00724 snprintf(tmp, (int)sizeof(tmp), "Expecting expiration to be %d bytes long but was %d\n", (int)sizeof(unsigned short), len); 00725 errorf(tmp); 00726 } else 00727 ies->expiration = ntohs(*((unsigned short *)(data + 2))); 00728 break; 00729 case DUNDI_IE_KEYCRC32: 00730 if (len != (int)sizeof(unsigned int)) { 00731 snprintf(tmp, (int)sizeof(tmp), "Expecting expiration to be %d bytes long but was %d\n", (int)sizeof(unsigned int), len); 00732 errorf(tmp); 00733 } else 00734 ies->keycrc32 = ntohl(*((unsigned int *)(data + 2))); 00735 break; 00736 case DUNDI_IE_UNKNOWN: 00737 if (len == 1) 00738 ies->unknowncmd = data[2]; 00739 else { 00740 snprintf(tmp, (int)sizeof(tmp), "Expected single byte Unknown command, but was %d long\n", len); 00741 errorf(tmp); 00742 } 00743 break; 00744 case DUNDI_IE_CAUSE: 00745 if (len >= 1) { 00746 ies->cause = data[2]; 00747 ies->causestr = (char *)data + 3; 00748 } else { 00749 snprintf(tmp, (int)sizeof(tmp), "Expected at least one byte cause, but was %d long\n", len); 00750 errorf(tmp); 00751 } 00752 break; 00753 case DUNDI_IE_HINT: 00754 if (len >= 2) { 00755 ies->hint = (struct dundi_hint *)(data + 2); 00756 } else { 00757 snprintf(tmp, (int)sizeof(tmp), "Expected at least two byte hint, but was %d long\n", len); 00758 errorf(tmp); 00759 } 00760 break; 00761 case DUNDI_IE_DEPARTMENT: 00762 ies->q_dept = (char *)data + 2; 00763 break; 00764 case DUNDI_IE_ORGANIZATION: 00765 ies->q_org = (char *)data + 2; 00766 break; 00767 case DUNDI_IE_LOCALITY: 00768 ies->q_locality = (char *)data + 2; 00769 break; 00770 case DUNDI_IE_STATE_PROV: 00771 ies->q_stateprov = (char *)data + 2; 00772 break; 00773 case DUNDI_IE_COUNTRY: 00774 ies->q_country = (char *)data + 2; 00775 break; 00776 case DUNDI_IE_EMAIL: 00777 ies->q_email = (char *)data + 2; 00778 break; 00779 case DUNDI_IE_PHONE: 00780 ies->q_phone = (char *)data + 2; 00781 break; 00782 case DUNDI_IE_IPADDR: 00783 ies->q_ipaddr = (char *)data + 2; 00784 break; 00785 case DUNDI_IE_ENCDATA: 00786 /* Recalculate len as the remainder of the message, regardless of 00787 theoretical length */ 00788 len = datalen - 2; 00789 if ((len > 16) && !(len % 16)) { 00790 ies->encblock = (struct dundi_encblock *)(data + 2); 00791 ies->enclen = len - 16; 00792 } else { 00793 snprintf(tmp, (int)sizeof(tmp), "Invalid encrypted data length %d\n", len); 00794 errorf(tmp); 00795 } 00796 break; 00797 case DUNDI_IE_SHAREDKEY: 00798 if (len == 128) { 00799 ies->encsharedkey = (unsigned char *)(data + 2); 00800 } else { 00801 snprintf(tmp, (int)sizeof(tmp), "Invalid encrypted shared key length %d\n", len); 00802 errorf(tmp); 00803 } 00804 break; 00805 case DUNDI_IE_SIGNATURE: 00806 if (len == 128) { 00807 ies->encsig = (unsigned char *)(data + 2); 00808 } else { 00809 snprintf(tmp, (int)sizeof(tmp), "Invalid encrypted signature length %d\n", len); 00810 errorf(tmp); 00811 } 00812 break; 00813 case DUNDI_IE_CACHEBYPASS: 00814 ies->cbypass = 1; 00815 break; 00816 default: 00817 snprintf(tmp, (int)sizeof(tmp), "Ignoring unknown information element '%s' (%d) of length %d\n", dundi_ie2str(ie), ie, len); 00818 outputf(tmp); 00819 } 00820 /* Overwrite information element with 0, to null terminate previous portion */ 00821 data[0] = 0; 00822 datalen -= (len + 2); 00823 data += (len + 2); 00824 } 00825 /* Null-terminate last field */ 00826 *data = '\0'; 00827 if (datalen) { 00828 errorf("Invalid information element contents, strange boundary\n"); 00829 return -1; 00830 } 00831 return 0; 00832 }
|
|
|
|
|
|
Definition at line 448 of file dundi-parser.c. References ast_inet_ntoa(), 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, and dundi_hdr::strans. Referenced by dundi_send(), dundi_xmit(), and socket_read(). 00449 { 00450 char *pref[] = { 00451 "Tx", 00452 "Rx", 00453 " ETx", 00454 " Erx" }; 00455 char *commands[] = { 00456 "ACK ", 00457 "DPDISCOVER ", 00458 "DPRESPONSE ", 00459 "EIDQUERY ", 00460 "EIDRESPONSE ", 00461 "PRECACHERQ ", 00462 "PRECACHERP ", 00463 "INVALID ", 00464 "UNKNOWN CMD ", 00465 "NULL ", 00466 "REQREQ ", 00467 "REGRESPONSE ", 00468 "CANCEL ", 00469 "ENCRYPT ", 00470 "ENCREJ " }; 00471 char class2[20]; 00472 char *class; 00473 char subclass2[20]; 00474 char *subclass; 00475 char tmp[256]; 00476 char retries[20]; 00477 char iabuf[INET_ADDRSTRLEN]; 00478 if (ntohs(fhi->dtrans) & DUNDI_FLAG_RETRANS) 00479 strcpy(retries, "Yes"); 00480 else 00481 strcpy(retries, "No"); 00482 if ((ntohs(fhi->strans) & DUNDI_FLAG_RESERVED)) { 00483 /* Ignore frames with high bit set to 1 */ 00484 return; 00485 } 00486 if ((fhi->cmdresp & 0x3f) > (int)sizeof(commands)/(int)sizeof(char *)) { 00487 snprintf(class2, (int)sizeof(class2), "(%d?)", fhi->cmdresp); 00488 class = class2; 00489 } else { 00490 class = commands[(int)(fhi->cmdresp & 0x3f)]; 00491 } 00492 snprintf(subclass2, (int)sizeof(subclass2), "%02x", fhi->cmdflags); 00493 subclass = subclass2; 00494 snprintf(tmp, (int)sizeof(tmp), 00495 "%s-Frame Retry[%s] -- OSeqno: %3.3d ISeqno: %3.3d Type: %s (%s)\n", 00496 pref[rx], 00497 retries, fhi->oseqno, fhi->iseqno, class, fhi->cmdresp & 0x40 ? "Response" : "Command"); 00498 outputf(tmp); 00499 snprintf(tmp, (int)sizeof(tmp), 00500 "%s Flags: %s STrans: %5.5d DTrans: %5.5d [%s:%d]%s\n", (rx > 1) ? " " : "", 00501 subclass, ntohs(fhi->strans) & ~DUNDI_FLAG_RESERVED, ntohs(fhi->dtrans) & ~DUNDI_FLAG_RETRANS, 00502 ast_inet_ntoa(iabuf, sizeof(iabuf), sin->sin_addr), ntohs(sin->sin_port), 00503 fhi->cmdresp & 0x80 ? " (Final)" : ""); 00504 outputf(tmp); 00505 dump_ies(fhi->ies, rx > 1, datalen); 00506 }
|
|
Definition at line 102 of file dundi-parser.c. References _dundi_eid::eid. Referenced by cache_lookup_internal(). 00103 { 00104 unsigned int eid_int[6]; 00105 int x; 00106 if (sscanf(s, "%2x%2x%2x%2x%2x%2x", &eid_int[0], &eid_int[1], &eid_int[2], 00107 &eid_int[3], &eid_int[4], &eid_int[5]) != 6) 00108 return -1; 00109 for (x=0;x<6;x++) 00110 eid->eid[x] = eid_int[x]; 00111 return 0; 00112 }
|
|
Definition at line 90 of file dundi-parser.c. References _dundi_eid::eid. Referenced by build_peer(), dundi_do_query(), and set_config(). 00091 { 00092 unsigned int eid_int[6]; 00093 int x; 00094 if (sscanf(s, "%x:%x:%x:%x:%x:%x", &eid_int[0], &eid_int[1], &eid_int[2], 00095 &eid_int[3], &eid_int[4], &eid_int[5]) != 6) 00096 return -1; 00097 for (x=0;x<6;x++) 00098 eid->eid[x] = eid_int[x]; 00099 return 0; 00100 }
|