Asterisk.org: Developer Documentation (28 Oct 2009)

Wed Oct 28 15:48:48 2009

## Asterisk developer's documentation

# dundi-parser.h File Reference

`#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)

## Define Documentation

#define DUNDI_MAX_ANSWERS 100

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

Referenced by dundi_parse_ies().

#define DUNDI_MAX_STACK 512

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

Referenced by append_transaction(), dundi_parse_ies(), and optimize_transactions().

## Function Documentation

int dundi_eid_cmp | ( | dundi_eid * | eid1,
|  | dundi_eid * | eid2 |
| ) |  |  |

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_prop_precache(), dundi_query_thread(), find_peer(), handle_command_response(), optimize_transactions(), and register_request().

    00123 {
    00124    return memcmp(eid1, eid2, sizeof(dundi_eid));
    00125 }

char* dundi_eid_to_str | ( | char * | s,
|  | int | maxlen,
|  | dundi_eid * | eid |
| ) |  |  |

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_prop_precache(), dundi_query_thread(), dundi_send(), dundi_show_entityid(), dundi_show_peer(), dundi_show_peers(), 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 }

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

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 }

int dundi_eid_zero | ( | dundi_eid * | eid | ) |

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

References _dundi_eid::eid.

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

    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 }

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

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 }

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

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 }

const char* dundi_ie2str | ( | int | ie | ) |

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

References ies, and iax2_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().

    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 }

int dundi_ie_append | ( | struct dundi_ie_data * | ied,
|  | unsigned char | ie |
| ) |  |  |

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 }

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

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 }

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 579 of file dundi-parser.c.

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

Referenced by dundi_lookup_thread(), and precache_trans().

    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 }

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

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

References dundi_ie_append_raw().

Referenced by handle_command_response().

    00636 {
    00637    return dundi_ie_append_raw(ied, ie, &dat, 1);
    00638 }

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

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(), dundi_answer_query(), dundi_lookup_thread(), dundi_prop_precache(), 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 }

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

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(), dundi_query(), handle_command_response(), and precache_trans().

    00631 {
    00632    return dundi_ie_append_raw(ied, ie, (unsigned char *)eid, sizeof(dundi_eid));
    00633 }

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

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(), and handle_command_response().

    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 }

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

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_lookup_thread(), dundi_query_thread(), and precache_trans().

    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 }

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

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 }

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

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(), dundi_ie_append_str(), and handle_command_response().

    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 }

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

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

References dundi_ie_append_raw().

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

    00619 {
    00620    unsigned short newval;
    00621    newval = htons(value);
    00622    return dundi_ie_append_raw(ied, ie, &newval, (int)sizeof(newval));
    00623 }

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

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

References dundi_ie_append_raw().

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

    00626 {
    00627    return dundi_ie_append_raw(ied, ie, str, strlen(str));
    00628 }

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

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

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_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, 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, dundi_ies::ttl, dundi_ies::unknowncmd, and dundi_ies::version.

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 }

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

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

void dundi_showframe | ( | struct dundi_hdr * | fhi,
|  | int | rx,
|  | struct sockaddr_in * | sin,
|  | int | datalen |
| ) |  |  |

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(), handle_command_response(), 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 }

int dundi_str_short_to_eid | ( | dundi_eid * | eid,
|  | char * | s |
| ) |  |  |

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 }

int dundi_str_to_eid | ( | dundi_eid * | eid,
|  | char * | s |
| ) |  |  |

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, "%2x:%2x:%2x:%2x:%2x:%2x", &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 }