Fri Aug 17 00:17:41 2018

Asterisk developer's documentation


ie.c File Reference

Interface to mISDN. More...

#include "asterisk.h"
#include <string.h>
#include <mISDNuser/mISDNlib.h>
#include <mISDNuser/isdn_net.h>
#include <mISDNuser/l3dss1.h>
#include <mISDNuser/net_l3.h>
#include "asterisk/localtime.h"

Go to the source code of this file.

Defines

#define MISDN_IE_DEBG   0

Functions

static void dec_ie_bearer (unsigned char *p, Q931_info_t *qi, int *coding, int *capability, int *mode, int *rate, int *multi, int *user, int *async, int *urate, int *stopbits, int *dbits, int *parity, int nt, struct misdn_bchannel *bc)
static void dec_ie_called_pn (unsigned char *p, Q931_info_t *qi, int *type, int *plan, char *number, size_t number_len, int nt, struct misdn_bchannel *bc)
static void dec_ie_calling_pn (unsigned char *p, Q931_info_t *qi, int *type, int *plan, int *present, int *screen, char *number, size_t number_len, int nt, struct misdn_bchannel *bc)
static void dec_ie_cause (unsigned char *p, Q931_info_t *qi, int *location, int *cause, int nt, struct misdn_bchannel *bc)
static void dec_ie_channel_id (unsigned char *p, Q931_info_t *qi, int *exclusive, int *channel, int nt, struct misdn_bchannel *bc)
static void dec_ie_complete (unsigned char *p, Q931_info_t *qi, int *complete, int nt, struct misdn_bchannel *bc)
static void dec_ie_connected_pn (unsigned char *p, Q931_info_t *qi, int *type, int *plan, int *present, int *screen, char *number, size_t number_len, int nt, struct misdn_bchannel *bc)
static void dec_ie_keypad (unsigned char *p, Q931_info_t *qi, char *keypad, size_t keypad_len, int nt, struct misdn_bchannel *bc)
static void dec_ie_notify (unsigned char *p, Q931_info_t *qi, int *notify, int nt, struct misdn_bchannel *bc)
static void dec_ie_progress (unsigned char *p, Q931_info_t *qi, int *coding, int *location, int *progress, int nt, struct misdn_bchannel *bc)
static void dec_ie_redir_dn (unsigned char *p, Q931_info_t *qi, int *type, int *plan, int *present, char *number, size_t number_len, int nt, struct misdn_bchannel *bc)
static void dec_ie_redir_nr (unsigned char *p, Q931_info_t *qi, int *type, int *plan, int *present, int *screen, int *reason, char *number, size_t number_len, int nt, struct misdn_bchannel *bc)
static void dec_ie_useruser (unsigned char *p, Q931_info_t *qi, int *protocol, char *user, int *user_len, int nt, struct misdn_bchannel *bc)
static void enc_ie_bearer (unsigned char **ntmode, msg_t *msg, int coding, int capability, int mode, int rate, int multi, int user, int nt, struct misdn_bchannel *bc)
static void enc_ie_called_pn (unsigned char **ntmode, msg_t *msg, int type, int plan, char *number, int nt, struct misdn_bchannel *bc)
static void enc_ie_calling_pn (unsigned char **ntmode, msg_t *msg, int type, int plan, int present, int screen, char *number, int nt, struct misdn_bchannel *bc)
static void enc_ie_cause (unsigned char **ntmode, msg_t *msg, int location, int cause, int nt, struct misdn_bchannel *bc)
static void enc_ie_channel_id (unsigned char **ntmode, msg_t *msg, int exclusive, int channel, int nt, struct misdn_bchannel *bc)
static void enc_ie_complete (unsigned char **ntmode, msg_t *msg, int complete, int nt, struct misdn_bchannel *bc)
static void enc_ie_connected_pn (unsigned char **ntmode, msg_t *msg, int type, int plan, int present, int screen, char *number, int nt, struct misdn_bchannel *bc)
static void enc_ie_date (unsigned char **ntmode, msg_t *msg, time_t ti, int nt, struct misdn_bchannel *bc)
static void enc_ie_display (unsigned char **ntmode, msg_t *msg, char *display, int nt, struct misdn_bchannel *bc)
static void enc_ie_keypad (unsigned char **ntmode, msg_t *msg, char *keypad, int nt, struct misdn_bchannel *bc)
static void enc_ie_notify (unsigned char **ntmode, msg_t *msg, int notify, int nt, struct misdn_bchannel *bc)
static void enc_ie_progress (unsigned char **ntmode, msg_t *msg, int coding, int location, int progress, int nt, struct misdn_bchannel *bc)
static void enc_ie_redir_dn (unsigned char **ntmode, msg_t *msg, int type, int plan, int present, char *number, int nt, struct misdn_bchannel *bc)
static void enc_ie_redir_nr (unsigned char **ntmode, msg_t *msg, int type, int plan, int present, int screen, int reason, char *number, int nt, struct misdn_bchannel *bc)
static void enc_ie_restart_ind (unsigned char **ntmode, msg_t *msg, unsigned char rind, int nt, struct misdn_bchannel *bc)
static void enc_ie_useruser (unsigned char **ntmode, msg_t *msg, int protocol, char *user, int user_len, int nt, struct misdn_bchannel *bc)
static void strnncpy (char *dest, const char *src, size_t len, size_t dst_len)

Detailed Description

Interface to mISDN.

Author:
Christian Richter <crich@beronet.com>

Definition in file ie.c.


Define Documentation

#define MISDN_IE_DEBG   0

Function Documentation

static void dec_ie_bearer ( unsigned char *  p,
Q931_info_t *  qi,
int *  coding,
int *  capability,
int *  mode,
int *  rate,
int *  multi,
int *  user,
int *  async,
int *  urate,
int *  stopbits,
int *  dbits,
int *  parity,
int  nt,
struct misdn_bchannel bc 
) [static]

Definition at line 160 of file ie.c.

References MISDN_IE_DEBG.

Referenced by parse_setup().

00162 {
00163    int octet;
00164    *coding = -1;
00165    *capability = -1;
00166    *mode = -1;
00167    *rate = -1;
00168    *multi = -1;
00169    *user = -1;
00170    *async = -1;
00171    *urate = -1;
00172    *stopbits = -1;
00173    *dbits = -1;
00174    *parity = -1;
00175 
00176    if (!nt)
00177    {
00178       p = NULL;
00179 #ifdef LLC_SUPPORT
00180       if (qi->QI_ELEMENT(llc)) {
00181 
00182          p = (unsigned char *)qi + sizeof(Q931_info_t) + qi->QI_ELEMENT(llc) + 1;
00183       }
00184 #endif
00185       if (qi->QI_ELEMENT(bearer_capability))
00186          p = (unsigned char *)qi + sizeof(Q931_info_t) + qi->QI_ELEMENT(bearer_capability) + 1;
00187    }
00188    if (!p)
00189       return;
00190 
00191    if (p[0] < 2)
00192    {
00193       printf("%s: ERROR: IE too short (%d).\n", __FUNCTION__, p[0]);
00194       return;
00195    }
00196 
00197    *coding = (p[1]&0x60) >> 5;
00198    *capability = p[1] & 0x1f;
00199    octet = 2;
00200    if (!(p[1] & 0x80))
00201       octet++;
00202 
00203    if (p[0] < octet)
00204       goto done;
00205 
00206    *mode = (p[octet]&0x60) >> 5;
00207    *rate = p[octet] & 0x1f;
00208 
00209    octet++;
00210 
00211    if (p[0] < octet)
00212       goto done;
00213 
00214    if (*rate == 0x18) {
00215       /* Rate multiplier only present if 64Kb/s base rate */
00216       *multi = p[octet++] & 0x7f;
00217    }
00218 
00219    if (p[0] < octet)
00220       goto done;
00221 
00222    /* Start L1 info */
00223    if ((p[octet] & 0x60) == 0x20) {
00224       *user = p[octet] & 0x1f;
00225 
00226       if (p[0] <= octet)
00227          goto done;
00228 
00229       if (p[octet++] & 0x80)
00230          goto l2;
00231 
00232       *async = !!(p[octet] & 0x40);
00233       /* 0x20 is inband negotiation */
00234       *urate = p[octet] & 0x1f;
00235 
00236       if (p[0] <= octet)
00237          goto done;
00238 
00239       if (p[octet++] & 0x80)
00240          goto l2;
00241 
00242       /* Ignore next byte for now: Intermediate rate, NIC, flow control */
00243 
00244       if (p[0] <= octet)
00245          goto done;
00246 
00247       if (p[octet++] & 0x80)
00248          goto l2;
00249 
00250       /* And the next one. Header, multiframe, mode, assignor/ee, negotiation */
00251 
00252       if (p[0] <= octet)
00253          goto done;
00254 
00255       if (~p[octet++] & 0x80)
00256          goto l2;
00257 
00258       /* Wheee. V.110 speed information */
00259 
00260       *stopbits = (p[octet] & 0x60) >> 5;
00261       *dbits = (p[octet] & 0x18) >> 3;
00262       *parity = p[octet] & 7;
00263 
00264       octet++;
00265    }
00266  l2: /* Nobody seems to want the rest so we don't bother (yet) */
00267  done:
00268    if (MISDN_IE_DEBG) printf("    coding=%d capability=%d mode=%d rate=%d multi=%d user=%d async=%d urate=%d stopbits=%d dbits=%d parity=%d\n", *coding, *capability, *mode, *rate, *multi, *user, *async, *urate, *stopbits, *dbits, *parity);
00269 }

static void dec_ie_called_pn ( unsigned char *  p,
Q931_info_t *  qi,
int *  type,
int *  plan,
char *  number,
size_t  number_len,
int  nt,
struct misdn_bchannel bc 
) [static]

Definition at line 387 of file ie.c.

References MISDN_IE_DEBG, and strnncpy().

Referenced by parse_information(), and parse_setup().

00388 {
00389    *type = -1;
00390    *plan = -1;
00391    *number = '\0';
00392 
00393    if (!nt)
00394    {
00395       p = NULL;
00396       if (qi->QI_ELEMENT(called_nr))
00397          p = (unsigned char *)qi + sizeof(Q931_info_t) + qi->QI_ELEMENT(called_nr) + 1;
00398    }
00399    if (!p)
00400       return;
00401    if (p[0] < 2)
00402    {
00403       printf("%s: ERROR: IE too short (%d).\n", __FUNCTION__, p[0]);
00404       return;
00405    }
00406 
00407    *type = (p[1]&0x70) >> 4;
00408    *plan = p[1] & 0xf;
00409    strnncpy(number, (char *)p+2, p[0]-1, number_len);
00410 
00411    if (MISDN_IE_DEBG) printf("    type=%d plan=%d number='%s'\n", *type, *plan, number);
00412 }

static void dec_ie_calling_pn ( unsigned char *  p,
Q931_info_t *  qi,
int *  type,
int *  plan,
int *  present,
int *  screen,
char *  number,
size_t  number_len,
int  nt,
struct misdn_bchannel bc 
) [static]

Definition at line 471 of file ie.c.

References MISDN_IE_DEBG, and strnncpy().

Referenced by parse_setup().

00472 {
00473    *type = -1;
00474    *plan = -1;
00475    *present = -1;
00476    *screen = -1;
00477    *number = '\0';
00478 
00479    if (!nt)
00480    {
00481       p = NULL;
00482       if (qi->QI_ELEMENT(calling_nr))
00483          p = (unsigned char *)qi + sizeof(Q931_info_t) + qi->QI_ELEMENT(calling_nr) + 1;
00484    }
00485    if (!p)
00486       return;
00487    if (p[0] < 1)
00488    {
00489       printf("%s: ERROR: IE too short (%d).\n", __FUNCTION__, p[0]);
00490       return;
00491    }
00492 
00493    *type = (p[1]&0x70) >> 4;
00494    *plan = p[1] & 0xf;
00495    if (!(p[1] & 0x80))
00496    {
00497       if (p[0] < 2)
00498       {
00499          printf("%s: ERROR: IE too short (%d).\n", __FUNCTION__, p[0]);
00500          return;
00501       }
00502       *present = (p[2]&0x60) >> 5;
00503       *screen = p[2] & 0x3;
00504       strnncpy(number, (char *)p+3, p[0]-2, number_len);
00505    } else
00506    {
00507       strnncpy(number, (char *)p+2, p[0]-1, number_len);
00508       /* SPECIAL workarround for IBT software bug */
00509       /* if (number[0]==0x80) */
00510       /*  strcpy((char *)number, (char *)number+1); */
00511    }
00512 
00513    if (MISDN_IE_DEBG) printf("    type=%d plan=%d present=%d screen=%d number='%s'\n", *type, *plan, *present, *screen, number);
00514 }

static void dec_ie_cause ( unsigned char *  p,
Q931_info_t *  qi,
int *  location,
int *  cause,
int  nt,
struct misdn_bchannel bc 
) [static]

Definition at line 664 of file ie.c.

References MISDN_IE_DEBG.

Referenced by parse_disconnect(), parse_release(), parse_release_complete(), and parse_status().

00665 {
00666    *location = -1;
00667    *cause = -1;
00668 
00669    if (!nt)
00670    {
00671       p = NULL;
00672       if (qi->QI_ELEMENT(cause))
00673          p = (unsigned char *)qi + sizeof(Q931_info_t) + qi->QI_ELEMENT(cause) + 1;
00674    }
00675    if (!p)
00676       return;
00677    if (p[0] < 2)
00678    {
00679       printf("%s: ERROR: IE too short (%d).\n", __FUNCTION__, p[0]);
00680       return;
00681    }
00682 
00683    *location = p[1] & 0x0f;
00684    *cause = p[2] & 0x7f;
00685 
00686    if (MISDN_IE_DEBG) printf("    location=%d cause=%d\n", *location, *cause);
00687 }

static void dec_ie_channel_id ( unsigned char *  p,
Q931_info_t *  qi,
int *  exclusive,
int *  channel,
int  nt,
struct misdn_bchannel bc 
) [static]

Definition at line 766 of file ie.c.

References get_stack_by_bc(), MISDN_IE_DEBG, and misdn_stack::pri.

Referenced by parse_proceeding(), parse_restart(), parse_setup(), and parse_setup_acknowledge().

00767 {
00768    struct misdn_stack *stack=get_stack_by_bc(bc);
00769    int pri =stack->pri;
00770 
00771    *exclusive = -1;
00772    *channel = -1;
00773 
00774    if (!nt)
00775    {
00776       p = NULL;
00777       if (qi->QI_ELEMENT(channel_id))
00778          p = (unsigned char *)qi + sizeof(Q931_info_t) + qi->QI_ELEMENT(channel_id) + 1;
00779    }
00780    if (!p)
00781       return;
00782    if (p[0] < 1)
00783    {
00784       printf("%s: ERROR: IE too short (%d).\n", __FUNCTION__, p[0]);
00785       return;
00786    }
00787 
00788    if (p[1] & 0x40)
00789    {
00790       printf("%s: ERROR: refering to channels of other interfaces is not supported.\n", __FUNCTION__);
00791       return;
00792    }
00793    if (p[1] & 0x04)
00794    {
00795       printf("%s: ERROR: using d-channel is not supported.\n", __FUNCTION__);
00796       return;
00797    }
00798 
00799    *exclusive = (p[1]&0x08) >> 3;
00800    if (!pri)
00801    {
00802       /* BRI */
00803       if (p[1] & 0x20)
00804       {
00805          printf("%s: ERROR: extended channel ID with non PRI interface.\n", __FUNCTION__);
00806          return;
00807       }
00808       *channel = p[1] & 0x03;
00809       if (*channel == 3)
00810          *channel = 0xff;
00811    } else
00812    {
00813       /* PRI */
00814       if (p[0] < 1)
00815       {
00816          printf("%s: ERROR: IE too short for PRI (%d).\n", __FUNCTION__, p[0]);
00817          return;
00818       }
00819       if (!(p[1] & 0x20))
00820       {
00821          printf("%s: ERROR: basic channel ID with PRI interface.\n", __FUNCTION__);
00822          return;
00823       }
00824       if ((p[1]&0x03) == 0x00)
00825       {
00826          /* no channel */
00827          *channel = 0;
00828          return;
00829       }
00830       if ((p[1]&0x03) == 0x03)
00831       {
00832          /* any channel */
00833          *channel = 0xff;
00834          return;
00835       }
00836       if (p[0] < 3)
00837       {
00838          printf("%s: ERROR: IE too short for PRI with channel(%d).\n", __FUNCTION__, p[0]);
00839          return;
00840       }
00841       if (p[2] & 0x10)
00842       {
00843          printf("%s: ERROR: channel map not supported.\n", __FUNCTION__);
00844          return;
00845       }
00846       *channel = p[3] & 0x7f;
00847       if ( (*channel<1) | (*channel==16) | (*channel>31))
00848       {
00849          printf("%s: ERROR: PRI interface channel out of range (%d).\n", __FUNCTION__, *channel);
00850          return;
00851       }
00852 /*       if (MISDN_IE_DEBG) printf("%02x %02x %02x\n", p[1], p[2], p[3]); */
00853    }
00854 
00855    if (MISDN_IE_DEBG) printf("    exclusive=%d channel=%d\n", *exclusive, *channel);
00856 }

static void dec_ie_complete ( unsigned char *  p,
Q931_info_t *  qi,
int *  complete,
int  nt,
struct misdn_bchannel bc 
) [static]

Definition at line 83 of file ie.c.

References MISDN_IE_DEBG.

Referenced by parse_setup().

00084 {
00085    *complete = 0;
00086    if (!nt)
00087    {
00088       if (qi->QI_ELEMENT(sending_complete))
00089          *complete = 1;
00090    } else
00091       if (p)
00092          *complete = 1;
00093 
00094    if (*complete)
00095       if (MISDN_IE_DEBG) printf("    complete=%d\n", *complete);
00096 }

static void dec_ie_connected_pn ( unsigned char *  p,
Q931_info_t *  qi,
int *  type,
int *  plan,
int *  present,
int *  screen,
char *  number,
size_t  number_len,
int  nt,
struct misdn_bchannel bc 
) [static]

Definition at line 573 of file ie.c.

References MISDN_IE_DEBG, and strnncpy().

Referenced by parse_connect().

00574 {
00575    *type = -1;
00576    *plan = -1;
00577    *present = -1;
00578    *screen = -1;
00579    *number = '\0';
00580 
00581    if (!nt)
00582    {
00583       p = NULL;
00584       if (qi->QI_ELEMENT(connected_nr))
00585          p = (unsigned char *)qi + sizeof(Q931_info_t) + qi->QI_ELEMENT(connected_nr) + 1;
00586    }
00587    if (!p)
00588       return;
00589    if (p[0] < 1)
00590    {
00591       printf("%s: ERROR: IE too short (%d).\n", __FUNCTION__, p[0]);
00592       return;
00593    }
00594 
00595    *type = (p[1]&0x70) >> 4;
00596    *plan = p[1] & 0xf;
00597    if (!(p[1] & 0x80))
00598    {
00599       if (p[0] < 2)
00600       {
00601          printf("%s: ERROR: IE too short (%d).\n", __FUNCTION__, p[0]);
00602          return;
00603       }
00604       *present = (p[2]&0x60) >> 5;
00605       *screen = p[2] & 0x3;
00606       strnncpy(number, (char *)p+3, p[0]-2, number_len);
00607    } else
00608    {
00609       strnncpy(number, (char *)p+2, p[0]-1, number_len);
00610    }
00611 
00612    if (MISDN_IE_DEBG) printf("    type=%d plan=%d present=%d screen=%d number='%s'\n", *type, *plan, *present, *screen, number);
00613 }

static void dec_ie_keypad ( unsigned char *  p,
Q931_info_t *  qi,
char *  keypad,
size_t  keypad_len,
int  nt,
struct misdn_bchannel bc 
) [static]

Definition at line 973 of file ie.c.

References MISDN_IE_DEBG, and strnncpy().

Referenced by parse_information(), and parse_setup().

00974 {
00975    *keypad = '\0';
00976 
00977    if (!nt)
00978    {
00979       p = NULL;
00980       if (qi->QI_ELEMENT(keypad))
00981          p = (unsigned char *)qi + sizeof(Q931_info_t) + qi->QI_ELEMENT(keypad) + 1;
00982    }
00983    if (!p)
00984       return;
00985    if (p[0] < 1)
00986    {
00987       printf("%s: ERROR: IE too short (%d).\n", __FUNCTION__, p[0]);
00988       return;
00989    }
00990 
00991    strnncpy(keypad, (char *)p+1, p[0], keypad_len);
00992 
00993    if (MISDN_IE_DEBG) printf("    keypad='%s'\n", keypad);
00994 }

static void dec_ie_notify ( unsigned char *  p,
Q931_info_t *  qi,
int *  notify,
int  nt,
struct misdn_bchannel bc 
) [static]

Definition at line 1023 of file ie.c.

References MISDN_IE_DEBG.

Referenced by parse_facility(), and parse_notify().

01024 {
01025    *notify = -1;
01026 
01027    if (!nt)
01028    {
01029       p = NULL;
01030       if (qi->QI_ELEMENT(notify))
01031          p = (unsigned char *)qi + sizeof(Q931_info_t) + qi->QI_ELEMENT(notify) + 1;
01032    }
01033    if (!p)
01034       return;
01035    if (p[0] < 1)
01036    {
01037       printf("%s: ERROR: IE too short (%d).\n", __FUNCTION__, p[0]);
01038       return;
01039    }
01040 
01041    *notify = p[1] & 0x7f;
01042 
01043    if (MISDN_IE_DEBG) printf("    notify=%d\n", *notify);
01044 }

static void dec_ie_progress ( unsigned char *  p,
Q931_info_t *  qi,
int *  coding,
int *  location,
int *  progress,
int  nt,
struct misdn_bchannel bc 
) [static]

Definition at line 1084 of file ie.c.

References MISDN_IE_DEBG.

Referenced by parse_alerting(), parse_connect(), parse_disconnect(), parse_proceeding(), parse_progress(), parse_setup(), and parse_setup_acknowledge().

01085 {
01086    *coding = -1;
01087    *location = -1;
01088    //*progress = -1;
01089    *progress = 0;
01090 
01091    if (!nt)
01092    {
01093       p = NULL;
01094       if (qi->QI_ELEMENT(progress))
01095          p = (unsigned char *)qi + sizeof(Q931_info_t) + qi->QI_ELEMENT(progress) + 1;
01096    }
01097    if (!p)
01098       return;
01099    if (p[0] < 1)
01100    {
01101       printf("%s: ERROR: IE too short (%d).\n", __FUNCTION__, p[0]);
01102       return;
01103    }
01104 
01105    *coding = (p[1]&0x60) >> 5;
01106    *location = p[1] & 0x0f;
01107    *progress = p[2] & 0x7f;
01108 
01109    if (MISDN_IE_DEBG) printf("    coding=%d location=%d progress=%d\n", *coding, *location, *progress);
01110 }

static void dec_ie_redir_dn ( unsigned char *  p,
Q931_info_t *  qi,
int *  type,
int *  plan,
int *  present,
char *  number,
size_t  number_len,
int  nt,
struct misdn_bchannel bc 
) [static]

Definition at line 1286 of file ie.c.

References MISDN_IE_DEBG, and strnncpy().

Referenced by parse_facility(), and parse_notify().

01287 {
01288    *type = -1;
01289    *plan = -1;
01290    *present = -1;
01291    *number = '\0';
01292 
01293    if (!nt)
01294    {
01295       p = NULL;
01296       if (qi->QI_ELEMENT(redirect_dn))
01297          p = (unsigned char *)qi + sizeof(Q931_info_t) + qi->QI_ELEMENT(redirect_dn) + 1;
01298    }
01299    if (!p)
01300       return;
01301    if (p[0] < 1)
01302    {
01303       printf("%s: ERROR: IE too short (%d).\n", __FUNCTION__, p[0]);
01304       return;
01305    }
01306 
01307    *type = (p[1]&0x70) >> 4;
01308    *plan = p[1] & 0xf;
01309    if (!(p[1] & 0x80))
01310    {
01311       *present = (p[2]&0x60) >> 5;
01312       strnncpy(number, (char *)p+3, p[0]-2, number_len);
01313    } else
01314    {
01315       strnncpy(number, (char *)p+2, p[0]-1, number_len);
01316    }
01317 
01318    if (MISDN_IE_DEBG) printf("    type=%d plan=%d present=%d number='%s'\n", *type, *plan, *present, number);
01319 }

static void dec_ie_redir_nr ( unsigned char *  p,
Q931_info_t *  qi,
int *  type,
int *  plan,
int *  present,
int *  screen,
int *  reason,
char *  number,
size_t  number_len,
int  nt,
struct misdn_bchannel bc 
) [static]

Definition at line 1188 of file ie.c.

References MISDN_IE_DEBG, and strnncpy().

Referenced by parse_setup().

01189 {
01190    *type = -1;
01191    *plan = -1;
01192    *present = -1;
01193    *screen = -1;
01194    *reason = -1;
01195    *number = '\0';
01196 
01197    if (!nt)
01198    {
01199       p = NULL;
01200       if (qi->QI_ELEMENT(redirect_nr))
01201          p = (unsigned char *)qi + sizeof(Q931_info_t) + qi->QI_ELEMENT(redirect_nr) + 1;
01202    }
01203    if (!p)
01204       return;
01205    if (p[0] < 1)
01206    {
01207       printf("%s: ERROR: IE too short (%d).\n", __FUNCTION__, p[0]);
01208       return;
01209    }
01210 
01211    *type = (p[1]&0x70) >> 4;
01212    *plan = p[1] & 0xf;
01213    if (!(p[1] & 0x80))
01214    {
01215       *present = (p[2]&0x60) >> 5;
01216       *screen = p[2] & 0x3;
01217       if (!(p[2] & 0x80))
01218       {
01219          *reason = p[3] & 0x0f;
01220          strnncpy(number, (char *)p+4, p[0]-3, number_len);
01221       } else
01222       {
01223          strnncpy(number, (char *)p+3, p[0]-2, number_len);
01224       }
01225    } else
01226    {
01227       strnncpy(number, (char *)p+2, p[0]-1, number_len);
01228    }
01229 
01230    if (MISDN_IE_DEBG) printf("    type=%d plan=%d present=%d screen=%d reason=%d number='%s'\n", *type, *plan, *present, *screen, *reason, number);
01231 }

static void dec_ie_useruser ( unsigned char *  p,
Q931_info_t *  qi,
int *  protocol,
char *  user,
int *  user_len,
int  nt,
struct misdn_bchannel bc 
) [static]

Definition at line 1365 of file ie.c.

References MISDN_IE_DEBG.

Referenced by parse_setup().

01366 {
01367    *user_len = 0;
01368    *protocol = -1;
01369 
01370    if (!nt)
01371    {
01372       p = NULL;
01373       if (qi->QI_ELEMENT(useruser))
01374          p = (unsigned char *)qi + sizeof(Q931_info_t) + qi->QI_ELEMENT(useruser) + 1;
01375    }
01376    if (!p)
01377       return;
01378 
01379    *user_len = p[0]-1;
01380    if (p[0] < 1)
01381       return;
01382    *protocol = p[1];
01383    memcpy(user, p+2, (*user_len<=128)?*(user_len):128); /* clip to 128 maximum */
01384 
01385    if (MISDN_IE_DEBG) {
01386       int i;
01387       char debug[768];
01388 
01389       for (i = 0; i < *user_len; ++i) {
01390          sprintf(debug + (i * 3), " %02x", user[i]);
01391       }
01392       debug[i * 3] = 0;
01393       printf("    protocol=%d user-user%s\n", *protocol, debug);
01394    }
01395 }

static void enc_ie_bearer ( unsigned char **  ntmode,
msg_t *  msg,
int  coding,
int  capability,
int  mode,
int  rate,
int  multi,
int  user,
int  nt,
struct misdn_bchannel bc 
) [static]

Definition at line 100 of file ie.c.

References MISDN_IE_DEBG.

Referenced by build_setup().

00101 {
00102    unsigned char *p;
00103    Q931_info_t *qi = (Q931_info_t *)(msg->data + mISDN_HEADER_LEN);
00104    int l;
00105 
00106    if (coding<0 || coding>3)
00107    {
00108       printf("%s: ERROR: coding(%d) is out of range.\n", __FUNCTION__, coding);
00109       return;
00110    }
00111    if (capability<0 || capability>31)
00112    {
00113       printf("%s: ERROR: capability(%d) is out of range.\n", __FUNCTION__, capability);
00114       return;
00115    }
00116    if (mode<0 || mode>3)
00117    {
00118       printf("%s: ERROR: mode(%d) is out of range.\n", __FUNCTION__, mode);
00119       return;
00120    }
00121    if (rate<0 || rate>31)
00122    {
00123       printf("%s: ERROR: rate(%d) is out of range.\n", __FUNCTION__, rate);
00124       return;
00125    }
00126    if (multi>127)
00127    {
00128       printf("%s: ERROR: multi(%d) is out of range.\n", __FUNCTION__, multi);
00129       return;
00130    }
00131    if (user>31)
00132    {
00133       printf("%s: ERROR: user L1(%d) is out of range.\n", __FUNCTION__, rate);
00134       return;
00135    }
00136    if (rate!=24 && multi>=0)
00137    {
00138       printf("%s: WARNING: multi(%d) is only possible if rate(%d) would be 24.\n", __FUNCTION__, multi, rate);
00139       multi = -1;
00140    }
00141 
00142    if (MISDN_IE_DEBG) printf("    coding=%d capability=%d mode=%d rate=%d multi=%d user=%d\n", coding, capability, mode, rate, multi, user);
00143 
00144    l = 2 + (multi>=0) + (user>=0);
00145    p = msg_put(msg, l+2);
00146    if (nt)
00147       *ntmode = p+1;
00148    else
00149       qi->QI_ELEMENT(bearer_capability) = p - (unsigned char *)qi - sizeof(Q931_info_t);
00150    p[0] = IE_BEARER;
00151    p[1] = l;
00152    p[2] = 0x80 + (coding<<5) + capability;
00153    p[3] = 0x80 + (mode<<5) + rate;
00154    if (multi >= 0)
00155       p[4] = 0x80 + multi;
00156    if (user >= 0)
00157       p[4+(multi>=0)] = 0xa0 + user;
00158 }

static void enc_ie_called_pn ( unsigned char **  ntmode,
msg_t *  msg,
int  type,
int  plan,
char *  number,
int  nt,
struct misdn_bchannel bc 
) [static]

Definition at line 351 of file ie.c.

References MISDN_IE_DEBG.

Referenced by build_information(), and build_setup().

00352 {
00353    unsigned char *p;
00354    Q931_info_t *qi = (Q931_info_t *)(msg->data + mISDN_HEADER_LEN);
00355    int l;
00356 
00357    if (type<0 || type>7)
00358    {
00359       printf("%s: ERROR: type(%d) is out of range.\n", __FUNCTION__, type);
00360       return;
00361    }
00362    if (plan<0 || plan>15)
00363    {
00364       printf("%s: ERROR: plan(%d) is out of range.\n", __FUNCTION__, plan);
00365       return;
00366    }
00367    if (!number[0])
00368    {
00369       printf("%s: ERROR: number is not given.\n", __FUNCTION__);
00370       return;
00371    }
00372 
00373    if (MISDN_IE_DEBG) printf("    type=%d plan=%d number='%s'\n", type, plan, number);
00374 
00375    l = 1+strlen((char *)number);
00376    p = msg_put(msg, l+2);
00377    if (nt)
00378       *ntmode = p+1;
00379    else
00380       qi->QI_ELEMENT(called_nr) = p - (unsigned char *)qi - sizeof(Q931_info_t);
00381    p[0] = IE_CALLED_PN;
00382    p[1] = l;
00383    p[2] = 0x80 + (type<<4) + plan;
00384    strncpy((char *)p+3, (char *)number, strlen((char *)number));
00385 }

static void enc_ie_calling_pn ( unsigned char **  ntmode,
msg_t *  msg,
int  type,
int  plan,
int  present,
int  screen,
char *  number,
int  nt,
struct misdn_bchannel bc 
) [static]

Definition at line 416 of file ie.c.

References MISDN_IE_DEBG.

Referenced by build_setup().

00417 {
00418    unsigned char *p;
00419    Q931_info_t *qi = (Q931_info_t *)(msg->data + mISDN_HEADER_LEN);
00420    int l;
00421 
00422    if (type<0 || type>7)
00423    {
00424       printf("%s: ERROR: type(%d) is out of range.\n", __FUNCTION__, type);
00425       return;
00426    }
00427    if (plan<0 || plan>15)
00428    {
00429       printf("%s: ERROR: plan(%d) is out of range.\n", __FUNCTION__, plan);
00430       return;
00431    }
00432    if (present>3)
00433    {
00434       printf("%s: ERROR: present(%d) is out of range.\n", __FUNCTION__, present);
00435       return;
00436    }
00437    if (present >= 0) if (screen<0 || screen>3)
00438    {
00439       printf("%s: ERROR: screen(%d) is out of range.\n", __FUNCTION__, screen);
00440       return;
00441    }
00442 
00443    if (MISDN_IE_DEBG) printf("    type=%d plan=%d present=%d screen=%d number='%s'\n", type, plan, present, screen, number);
00444 
00445    l = 1;
00446    if (number) if (number[0])
00447       l += strlen((char *)number);
00448    if (present >= 0)
00449       l += 1;
00450    p = msg_put(msg, l+2);
00451    if (nt)
00452       *ntmode = p+1;
00453    else
00454       qi->QI_ELEMENT(calling_nr) = p - (unsigned char *)qi - sizeof(Q931_info_t);
00455    p[0] = IE_CALLING_PN;
00456    p[1] = l;
00457    if (present >= 0)
00458    {
00459       p[2] = 0x00 + (type<<4) + plan;
00460       p[3] = 0x80 + (present<<5) + screen;
00461       if (number) if (number[0])
00462          strncpy((char *)p+4, (char *)number, strlen((char *)number));
00463    } else
00464    {
00465       p[2] = 0x80 + (type<<4) + plan;
00466       if (number) if (number[0])
00467          strncpy((char *)p+3, (char *)number, strlen((char *)number));
00468    }
00469 }

static void enc_ie_cause ( unsigned char **  ntmode,
msg_t *  msg,
int  location,
int  cause,
int  nt,
struct misdn_bchannel bc 
) [static]

Definition at line 617 of file ie.c.

References MISDN_IE_DEBG.

Referenced by build_disconnect(), build_release(), and build_release_complete().

00618 {
00619    unsigned char *p;
00620    Q931_info_t *qi = (Q931_info_t *)(msg->data + mISDN_HEADER_LEN);
00621    int l;
00622 
00623    if (location<0 || location>7)
00624    {
00625       printf("%s: ERROR: location(%d) is out of range.\n", __FUNCTION__, location);
00626       return;
00627    }
00628    if (cause<0 || cause>127)
00629    {
00630       printf("%s: ERROR: cause(%d) is out of range.\n", __FUNCTION__, cause);
00631       return;
00632    }
00633 
00634    if (MISDN_IE_DEBG) printf("    location=%d cause=%d\n", location, cause);
00635 
00636    l = 2;
00637    p = msg_put(msg, l+2);
00638    if (nt)
00639       *ntmode = p+1;
00640    else
00641       qi->QI_ELEMENT(cause) = p - (unsigned char *)qi - sizeof(Q931_info_t);
00642    p[0] = IE_CAUSE;
00643    p[1] = l;
00644    p[2] = 0x80 + location;
00645    p[3] = 0x80 + cause;
00646 }

static void enc_ie_channel_id ( unsigned char **  ntmode,
msg_t *  msg,
int  exclusive,
int  channel,
int  nt,
struct misdn_bchannel bc 
) [static]

Definition at line 691 of file ie.c.

References get_stack_by_bc(), and misdn_stack::pri.

Referenced by build_alerting(), build_connect_acknowledge(), build_proceeding(), build_restart(), build_retrieve_acknowledge(), build_setup(), and build_setup_acknowledge().

00692 {
00693    unsigned char *p;
00694    Q931_info_t *qi = (Q931_info_t *)(msg->data + mISDN_HEADER_LEN);
00695    int l;
00696    struct misdn_stack *stack=get_stack_by_bc(bc);
00697    int pri = stack->pri;
00698 
00699    if (exclusive<0 || exclusive>1)
00700    {
00701       printf("%s: ERROR: exclusive(%d) is out of range.\n", __FUNCTION__, exclusive);
00702       return;
00703    }
00704    if ((channel<0 || channel>0xff)
00705        || (!pri && (channel>2 && channel<0xff))
00706        || (pri && (channel>31 && channel<0xff))
00707        || (pri && channel==16))
00708    {
00709       printf("%s: ERROR: channel(%d) is out of range.\n", __FUNCTION__, channel);
00710       return;
00711    }
00712 
00713    /* if (MISDN_IE_DEBG) printf("    exclusive=%d channel=%d\n", exclusive, channel); */
00714 
00715 
00716    if (!pri)
00717    {
00718       /* BRI */
00719       l = 1;
00720       p = msg_put(msg, l+2);
00721       if (nt)
00722          *ntmode = p+1;
00723       else
00724          qi->QI_ELEMENT(channel_id) = p - (unsigned char *)qi - sizeof(Q931_info_t);
00725       p[0] = IE_CHANNEL_ID;
00726       p[1] = l;
00727       if (channel == 0xff)
00728          channel = 3;
00729       p[2] = 0x80 + (exclusive<<3) + channel;
00730       /* printf("    exclusive=%d channel=%d\n", exclusive, channel); */
00731    } else
00732    {
00733       /* PRI */
00734       if (channel == 0) /* no channel */
00735          return; /* IE not present */
00736 /*       if (MISDN_IE_DEBG) printf("channel = %d\n", channel); */
00737       if (channel == 0xff) /* any channel */
00738       {
00739          l = 1;
00740          p = msg_put(msg, l+2);
00741          if (nt)
00742             *ntmode = p+1;
00743          else
00744             qi->QI_ELEMENT(channel_id) = p - (unsigned char *)qi - sizeof(Q931_info_t);
00745          p[0] = IE_CHANNEL_ID;
00746          p[1] = l;
00747          p[2] = 0x80 + 0x20 + 0x03;
00748 /*          if (MISDN_IE_DEBG) printf("%02x\n", p[2]); */
00749          return; /* end */
00750       }
00751       l = 3;
00752       p = msg_put(msg, l+2);
00753       if (nt)
00754          *ntmode = p+1;
00755       else
00756          qi->QI_ELEMENT(channel_id) = p - (unsigned char *)qi - sizeof(Q931_info_t);
00757       p[0] = IE_CHANNEL_ID;
00758       p[1] = l;
00759       p[2] = 0x80 + 0x20 + (exclusive<<3) + 0x01;
00760       p[3] = 0x80 + 3; /* CCITT, Number, B-type */
00761       p[4] = 0x80 + channel;
00762 /*       if (MISDN_IE_DEBG) printf("%02x %02x %02x\n", p[2], p[3], p[4]); */
00763    }
00764 }

static void enc_ie_complete ( unsigned char **  ntmode,
msg_t *  msg,
int  complete,
int  nt,
struct misdn_bchannel bc 
) [static]

Definition at line 56 of file ie.c.

References MISDN_IE_DEBG.

Referenced by build_setup().

00057 {
00058    unsigned char *p;
00059    Q931_info_t *qi = (Q931_info_t *)(msg->data + mISDN_HEADER_LEN);
00060 
00061    if (complete<0 || complete>1)
00062    {
00063       printf("%s: ERROR: complete(%d) is out of range.\n", __FUNCTION__, complete);
00064       return;
00065    }
00066 
00067    if (complete)
00068       if (MISDN_IE_DEBG) printf("    complete=%d\n", complete);
00069 
00070    if (complete)
00071    {
00072       p = msg_put(msg, 1);
00073       if (nt)
00074       {
00075          *ntmode = p;
00076       } else
00077          qi->QI_ELEMENT(sending_complete) = p - (unsigned char *)qi - sizeof(Q931_info_t);
00078 
00079       p[0] = IE_COMPLETE;
00080    }
00081 }

static void enc_ie_connected_pn ( unsigned char **  ntmode,
msg_t *  msg,
int  type,
int  plan,
int  present,
int  screen,
char *  number,
int  nt,
struct misdn_bchannel bc 
) [static]

Definition at line 518 of file ie.c.

References MISDN_IE_DEBG.

Referenced by build_connect().

00519 {
00520    unsigned char *p;
00521    Q931_info_t *qi = (Q931_info_t *)(msg->data + mISDN_HEADER_LEN);
00522    int l;
00523 
00524    if (type<0 || type>7)
00525    {
00526       printf("%s: ERROR: type(%d) is out of range.\n", __FUNCTION__, type);
00527       return;
00528    }
00529    if (plan<0 || plan>15)
00530    {
00531       printf("%s: ERROR: plan(%d) is out of range.\n", __FUNCTION__, plan);
00532       return;
00533    }
00534    if (present>3)
00535    {
00536       printf("%s: ERROR: present(%d) is out of range.\n", __FUNCTION__, present);
00537       return;
00538    }
00539    if (present >= 0) if (screen<0 || screen>3)
00540    {
00541       printf("%s: ERROR: screen(%d) is out of range.\n", __FUNCTION__, screen);
00542       return;
00543    }
00544 
00545    if (MISDN_IE_DEBG) printf("    type=%d plan=%d present=%d screen=%d number='%s'\n", type, plan, present, screen, number);
00546 
00547    l = 1;
00548    if (number) if (number[0])
00549       l += strlen((char *)number);
00550    if (present >= 0)
00551       l += 1;
00552    p = msg_put(msg, l+2);
00553    if (nt)
00554       *ntmode = p+1;
00555    else
00556       qi->QI_ELEMENT(connected_nr) = p - (unsigned char *)qi - sizeof(Q931_info_t);
00557    p[0] = IE_CONNECT_PN;
00558    p[1] = l;
00559    if (present >= 0)
00560    {
00561       p[2] = 0x00 + (type<<4) + plan;
00562       p[3] = 0x80 + (present<<5) + screen;
00563       if (number) if (number[0])
00564          strncpy((char *)p+4, (char *)number, strlen((char *)number));
00565    } else
00566    {
00567       p[2] = 0x80 + (type<<4) + plan;
00568       if (number) if (number[0])
00569          strncpy((char *)p+3, (char *)number, strlen((char *)number));
00570    }
00571 }

static void enc_ie_date ( unsigned char **  ntmode,
msg_t *  msg,
time_t  ti,
int  nt,
struct misdn_bchannel bc 
) [static]

Definition at line 860 of file ie.c.

References ast_localtime(), MISDN_IE_DEBG, ast_tm::tm_hour, ast_tm::tm_mday, ast_tm::tm_min, ast_tm::tm_mon, and ast_tm::tm_year.

Referenced by build_connect().

00861 {
00862    unsigned char *p;
00863    Q931_info_t *qi = (Q931_info_t *)(msg->data + mISDN_HEADER_LEN);
00864    int l;
00865    struct timeval tv = { ti, 0 };
00866    struct ast_tm tm;
00867 
00868    ast_localtime(&tv, &tm, NULL);
00869    if (MISDN_IE_DEBG) printf("    year=%d month=%d day=%d hour=%d minute=%d\n", tm.tm_year%100, tm.tm_mon+1, tm.tm_mday, tm.tm_hour, tm.tm_min);
00870 
00871    l = 5;
00872    p = msg_put(msg, l+2);
00873    if (nt)
00874       *ntmode = p+1;
00875    else
00876       qi->QI_ELEMENT(date) = p - (unsigned char *)qi - sizeof(Q931_info_t);
00877    p[0] = IE_DATE;
00878    p[1] = l;
00879    p[2] = tm.tm_year % 100;
00880    p[3] = tm.tm_mon + 1;
00881    p[4] = tm.tm_mday;
00882    p[5] = tm.tm_hour;
00883    p[6] = tm.tm_min;
00884 }

static void enc_ie_display ( unsigned char **  ntmode,
msg_t *  msg,
char *  display,
int  nt,
struct misdn_bchannel bc 
) [static]

Definition at line 888 of file ie.c.

Referenced by build_connect(), build_facility(), build_information(), and build_setup().

00889 {
00890    unsigned char *p;
00891    Q931_info_t *qi = (Q931_info_t *) (msg->data + mISDN_HEADER_LEN);
00892    int l;
00893 
00894    if (!display[0])
00895    {
00896       printf("%s: ERROR: display text not given.\n", __FUNCTION__);
00897       return;
00898    }
00899 
00900    l = strlen(display);
00901    if (80 < l)
00902    {
00903       l = 80;
00904       printf("%s: WARNING: display text too long (max %d chars), cutting.\n", __FUNCTION__, l);
00905       display[l] = '\0';
00906    }
00907 
00908    /* if (MISDN_IE_DEBG) printf("    display='%s' (len=%d)\n", display, l); */
00909 
00910    p = msg_put(msg, l + 2);
00911    if (nt)
00912       *ntmode = p + 1;
00913    else
00914       qi->QI_ELEMENT(display) = p - (unsigned char *) qi - sizeof(Q931_info_t);
00915    p[0] = IE_DISPLAY;
00916    p[1] = l;
00917    strncpy((char *) p + 2, display, l);
00918 }

static void enc_ie_keypad ( unsigned char **  ntmode,
msg_t *  msg,
char *  keypad,
int  nt,
struct misdn_bchannel bc 
) [static]

Definition at line 947 of file ie.c.

References MISDN_IE_DEBG.

Referenced by build_setup().

00948 {
00949    unsigned char *p;
00950    Q931_info_t *qi = (Q931_info_t *)(msg->data + mISDN_HEADER_LEN);
00951    int l;
00952 
00953    if (!keypad[0])
00954    {
00955       printf("%s: ERROR: keypad info not given.\n", __FUNCTION__);
00956       return;
00957    }
00958 
00959    if (MISDN_IE_DEBG) printf("    keypad='%s'\n", keypad);
00960 
00961    l = strlen(keypad);
00962    p = msg_put(msg, l+2);
00963    if (nt)
00964       *ntmode = p+1;
00965    else
00966       qi->QI_ELEMENT(keypad) = p - (unsigned char *)qi - sizeof(Q931_info_t);
00967    p[0] = IE_KEYPAD;
00968    p[1] = l;
00969    strncpy((char *)p+2, keypad, strlen(keypad));
00970 }

static void enc_ie_notify ( unsigned char **  ntmode,
msg_t *  msg,
int  notify,
int  nt,
struct misdn_bchannel bc 
) [static]

Definition at line 998 of file ie.c.

References MISDN_IE_DEBG.

Referenced by build_facility(), and build_notify().

00999 {
01000    unsigned char *p;
01001    Q931_info_t *qi = (Q931_info_t *)(msg->data + mISDN_HEADER_LEN);
01002    int l;
01003 
01004    if (notify<0 || notify>0x7f)
01005    {
01006       printf("%s: ERROR: notify(%d) is out of range.\n", __FUNCTION__, notify);
01007       return;
01008    }
01009 
01010    if (MISDN_IE_DEBG) printf("    notify=%d\n", notify);
01011 
01012    l = 1;
01013    p = msg_put(msg, l+2);
01014    if (nt)
01015       *ntmode = p+1;
01016    else
01017       qi->QI_ELEMENT(notify) = p - (unsigned char *)qi - sizeof(Q931_info_t);
01018    p[0] = IE_NOTIFY;
01019    p[1] = l;
01020    p[2] = 0x80 + notify;
01021 }

static void enc_ie_progress ( unsigned char **  ntmode,
msg_t *  msg,
int  coding,
int  location,
int  progress,
int  nt,
struct misdn_bchannel bc 
) [static]

Definition at line 1048 of file ie.c.

References MISDN_IE_DEBG.

Referenced by build_alerting(), build_disconnect(), build_proceeding(), build_progress(), and build_setup_acknowledge().

01049 {
01050    unsigned char *p;
01051    Q931_info_t *qi = (Q931_info_t *)(msg->data + mISDN_HEADER_LEN);
01052    int l;
01053 
01054    if (coding<0 || coding>0x03)
01055    {
01056       printf("%s: ERROR: coding(%d) is out of range.\n", __FUNCTION__, coding);
01057       return;
01058    }
01059    if (location<0 || location>0x0f)
01060    {
01061       printf("%s: ERROR: location(%d) is out of range.\n", __FUNCTION__, location);
01062       return;
01063    }
01064    if (progress<0 || progress>0x7f)
01065    {
01066       printf("%s: ERROR: progress(%d) is out of range.\n", __FUNCTION__, progress);
01067       return;
01068    }
01069 
01070    if (MISDN_IE_DEBG) printf("    coding=%d location=%d progress=%d\n", coding, location, progress);
01071 
01072    l = 2;
01073    p = msg_put(msg, l+2);
01074    if (nt)
01075       *ntmode = p+1;
01076    else
01077       qi->QI_ELEMENT(progress) = p - (unsigned char *)qi - sizeof(Q931_info_t);
01078    p[0] = IE_PROGRESS;
01079    p[1] = l;
01080    p[2] = 0x80 + (coding<<5) + location;
01081    p[3] = 0x80 + progress;
01082 }

static void enc_ie_redir_dn ( unsigned char **  ntmode,
msg_t *  msg,
int  type,
int  plan,
int  present,
char *  number,
int  nt,
struct misdn_bchannel bc 
) [static]

Definition at line 1235 of file ie.c.

References MISDN_IE_DEBG.

Referenced by build_facility(), and build_notify().

01236 {
01237    unsigned char *p;
01238    Q931_info_t *qi = (Q931_info_t *)(msg->data + mISDN_HEADER_LEN);
01239    int l;
01240 
01241    if (type<0 || type>7)
01242    {
01243       printf("%s: ERROR: type(%d) is out of range.\n", __FUNCTION__, type);
01244       return;
01245    }
01246    if (plan<0 || plan>15)
01247    {
01248       printf("%s: ERROR: plan(%d) is out of range.\n", __FUNCTION__, plan);
01249       return;
01250    }
01251    if (present > 3)
01252    {
01253       printf("%s: ERROR: present(%d) is out of range.\n", __FUNCTION__, present);
01254       return;
01255    }
01256 
01257    if (MISDN_IE_DEBG) printf("    type=%d plan=%d present=%d number='%s'\n", type, plan, present, number);
01258 
01259    l = 1;
01260    if (number)
01261       l += strlen((char *)number);
01262    if (present >= 0)
01263       l += 1;
01264    p = msg_put(msg, l+2);
01265    if (nt)
01266       *ntmode = p+1;
01267    else {
01268       qi->QI_ELEMENT(redirect_dn) = p - (unsigned char *)qi - sizeof(Q931_info_t);
01269    }
01270    p[0] = IE_REDIR_DN;
01271    p[1] = l;
01272    if (present >= 0)
01273    {
01274       p[2] = 0x00 + (type<<4) + plan;
01275       p[3] = 0x80 + (present<<5);
01276       if (number)
01277          strncpy((char *)p+4, (char *)number, strlen((char *)number));
01278    } else
01279    {
01280       p[2] = 0x80 + (type<<4) + plan;
01281       if (number)
01282          strncpy((char *)p+3, (char *)number, strlen((char *)number));
01283    }
01284 }

static void enc_ie_redir_nr ( unsigned char **  ntmode,
msg_t *  msg,
int  type,
int  plan,
int  present,
int  screen,
int  reason,
char *  number,
int  nt,
struct misdn_bchannel bc 
) [static]

Definition at line 1114 of file ie.c.

References MISDN_IE_DEBG.

Referenced by build_setup().

01115 {
01116    unsigned char *p;
01117    Q931_info_t *qi = (Q931_info_t *)(msg->data + mISDN_HEADER_LEN);
01118    int l;
01119 
01120    if (type<0 || type>7)
01121    {
01122       printf("%s: ERROR: type(%d) is out of range.\n", __FUNCTION__, type);
01123       return;
01124    }
01125    if (plan<0 || plan>15)
01126    {
01127       printf("%s: ERROR: plan(%d) is out of range.\n", __FUNCTION__, plan);
01128       return;
01129    }
01130    if (present > 3)
01131    {
01132       printf("%s: ERROR: present(%d) is out of range.\n", __FUNCTION__, present);
01133       return;
01134    }
01135    if (present >= 0) if (screen<0 || screen>3)
01136    {
01137       printf("%s: ERROR: screen(%d) is out of range.\n", __FUNCTION__, screen);
01138       return;
01139    }
01140    if (reason > 0x0f)
01141    {
01142       printf("%s: ERROR: reason(%d) is out of range.\n", __FUNCTION__, reason);
01143       return;
01144    }
01145 
01146    if (MISDN_IE_DEBG) printf("    type=%d plan=%d present=%d screen=%d readon=%d number='%s'\n", type, plan, present, screen, reason, number);
01147 
01148    l = 1;
01149    if (number)
01150       l += strlen((char *)number);
01151    if (present >= 0)
01152    {
01153       l += 1;
01154       if (reason >= 0)
01155          l += 1;
01156    }
01157    p = msg_put(msg, l+2);
01158    if (nt)
01159       *ntmode = p+1;
01160    else
01161       qi->QI_ELEMENT(redirect_nr) = p - (unsigned char *)qi - sizeof(Q931_info_t);
01162    p[0] = IE_REDIR_NR;
01163    p[1] = l;
01164    if (present >= 0)
01165    {
01166       if (reason >= 0)
01167       {
01168          p[2] = 0x00 + (type<<4) + plan;
01169          p[3] = 0x00 + (present<<5) + screen;
01170          p[4] = 0x80 + reason;
01171          if (number)
01172             strncpy((char *)p+5, (char *)number, strlen((char *)number));
01173       } else
01174       {
01175          p[2] = 0x00 + (type<<4) + plan;
01176          p[3] = 0x80 + (present<<5) + screen;
01177          if (number)
01178             strncpy((char *)p+4, (char *)number, strlen((char *)number));
01179       }
01180    } else
01181    {
01182       p[2] = 0x80 + (type<<4) + plan;
01183       if (number) if (number[0])
01184          strncpy((char *)p+3, (char *)number, strlen((char *)number));
01185    }
01186 }

static void enc_ie_restart_ind ( unsigned char **  ntmode,
msg_t *  msg,
unsigned char  rind,
int  nt,
struct misdn_bchannel bc 
) [static]

Definition at line 1399 of file ie.c.

Referenced by build_restart().

01400 {
01401    unsigned char *p;
01402    Q931_info_t *qi = (Q931_info_t *)(msg->data + mISDN_HEADER_LEN);
01403    /* if (MISDN_IE_DEBG) printf("    display='%s' (len=%d)\n", display, strlen((char *)display)); */
01404 
01405    p = msg_put(msg, 3);
01406    if (nt)
01407       *ntmode = p+1;
01408    else
01409       qi->QI_ELEMENT(restart_ind) = p - (unsigned char *)qi - sizeof(Q931_info_t);
01410    p[0] = IE_RESTART_IND;
01411    p[1] = 1;
01412    p[2] = rind;
01413 
01414 }

static void enc_ie_useruser ( unsigned char **  ntmode,
msg_t *  msg,
int  protocol,
char *  user,
int  user_len,
int  nt,
struct misdn_bchannel bc 
) [static]

Definition at line 1324 of file ie.c.

References MISDN_IE_DEBG.

Referenced by build_disconnect(), build_release(), build_release_complete(), and build_setup().

01325 {
01326    unsigned char *p;
01327    Q931_info_t *qi = (Q931_info_t *)(msg->data + mISDN_HEADER_LEN);
01328    int l;
01329 
01330    if (protocol<0 || protocol>127)
01331    {
01332       printf("%s: ERROR: protocol(%d) is out of range.\n", __FUNCTION__, protocol);
01333       return;
01334    }
01335    if (!user || user_len<=0)
01336    {
01337       return;
01338    }
01339 
01340    if (MISDN_IE_DEBG) {
01341       size_t i;
01342       char debug[768];
01343 
01344       for (i = 0; i < user_len; ++i) {
01345          sprintf(debug + (i * 3), " %02x", user[i]);
01346       }
01347       debug[i * 3] = 0;
01348       printf("    protocol=%d user-user%s\n", protocol, debug);
01349    }
01350 
01351    l = user_len+1;
01352    p = msg_put(msg, l+3);
01353    if (nt)
01354       *ntmode = p+1;
01355    else
01356       qi->QI_ELEMENT(useruser) = p - (unsigned char *)qi - sizeof(Q931_info_t);
01357    p[0] = IE_USER_USER;
01358    p[1] = l;
01359    p[2] = protocol;
01360    memcpy(p+3, user, user_len);
01361 }

static void strnncpy ( char *  dest,
const char *  src,
size_t  len,
size_t  dst_len 
) [static]

Definition at line 46 of file ie.c.

Referenced by dec_ie_called_pn(), dec_ie_calling_pn(), dec_ie_connected_pn(), dec_ie_keypad(), dec_ie_redir_dn(), and dec_ie_redir_nr().

00047 {
00048    if (len > dst_len-1)
00049       len = dst_len-1;
00050    strncpy(dest, src, len);
00051    dest[len] = '\0';
00052 }


Generated on 17 Aug 2018 for Asterisk - The Open Source Telephony Project by  doxygen 1.6.1