57#if defined(__NetBSD__) || defined(__FreeBSD__) 
   60#include <sys/sysmacros.h> 
   76#error "Upgrade your libpri" 
   82#if !defined(LIBSS7_ABI_COMPATIBILITY) 
   83#error "Upgrade your libss7" 
   84#elif LIBSS7_ABI_COMPATIBILITY != 2 
   85#error "Your installed libss7 is not compatible" 
   89#if defined(HAVE_OPENR2) 
   91#define SIG_MFCR2_MAX_CHANNELS  672      
  733#define SMDI_MD_WAIT_TIMEOUT 1500  
  736"0 db (CSU)/0-133 feet (DSX-1)",
 
  737"133-266 feet (DSX-1)",
 
  738"266-399 feet (DSX-1)",
 
  739"399-533 feet (DSX-1)",
 
  740"533-655 feet (DSX-1)",
 
 
  752    .resync_threshold = 1000,
 
 
  770#define DEFAULT_CIDRINGS 1 
  772#define AST_LAW(p) (((p)->law == DAHDI_LAW_ALAW) ? ast_format_alaw : ast_format_ulaw) 
  776#define NEED_MFDETECT(p) (((p)->sig == SIG_FEATDMF) || ((p)->sig == SIG_FEATDMF_TA) || ((p)->sig == SIG_E911) || ((p)->sig == SIG_FGC_CAMA) || ((p)->sig == SIG_FGC_CAMAMF) || ((p)->sig == SIG_FEATB)) 
  778static const char tdesc[] = 
"DAHDI Telephony" 
  779#if defined(HAVE_PRI) || defined(HAVE_SS7) || defined(HAVE_OPENR2) 
  781    #if defined(HAVE_PRI) 
  784    #if defined(HAVE_SS7) 
  785        #if defined(HAVE_PRI) 
  790    #if defined(HAVE_OPENR2) 
  791        #if defined(HAVE_PRI) || defined(HAVE_SS7) 
  799static const char config[] = 
"chan_dahdi.conf";
 
  802#define NUM_SPANS   DAHDI_MAX_SPANS 
  807#define CHAN_PSEUDO -2 
  809#define CALLPROGRESS_PROGRESS       1 
  810#define CALLPROGRESS_FAX_OUTGOING   2 
  811#define CALLPROGRESS_FAX_INCOMING   4 
  812#define CALLPROGRESS_FAX        (CALLPROGRESS_FAX_INCOMING | CALLPROGRESS_FAX_OUTGOING) 
  814#define NUM_CADENCE_MAX 25 
  821    { { 125, 125, 2000, 4000 } },           
 
  822    { { 250, 250, 500, 1000, 250, 250, 500, 4000 } }, 
 
  823    { { 125, 125, 125, 125, 125, 4000 } },  
 
  824    { { 1000, 500, 2500, 5000 } },  
 
 
  841#define ISTRUNK(p) ((p->sig == SIG_FXSLS) || (p->sig == SIG_FXSKS) || \ 
  842            (p->sig == SIG_FXSGS) || (p->sig == SIG_PRI)) 
   841#define ISTRUNK(p) ((p->sig == SIG_FXSLS) || (p->sig == SIG_FXSKS) || \ …   844#define CANBUSYDETECT(p) (ISTRUNK(p) || (p->sig & (SIG_EM | SIG_EM_E1 | SIG_SF)) ) 
  845#define CANPROGRESSDETECT(p) (ISTRUNK(p) || (p->sig & (SIG_EM | SIG_EM_E1 | SIG_SF)) ) 
  852#ifndef HAVE_DAHDI_LINEREVERSE_VMWI 
  866#define REPORT_CHANNEL_ALARMS 1 
  867#define REPORT_SPAN_ALARMS    2 
  871static int pridebugfd = -1;
 
  872static char pridebugfilename[1024] = 
"";
 
  906    if (ioctl(fd, DAHDI_GETEVENT, &j) == -1)
 
 
  915    i = DAHDI_IOMUX_SIGEVENT;
 
  916    if (ioctl(fd, DAHDI_IOMUX, &i) == -1)
 
  918    if (ioctl(fd, DAHDI_GETEVENT, &j) == -1)
 
 
  926#define MASK_AVAIL      (1 << 0)     
  927#define MASK_INUSE      (1 << 1)     
  929#define CALLWAITING_SILENT_SAMPLES      ((300 * 8) / READ_SIZE)  
  930#define CALLWAITING_REPEAT_SAMPLES      ((10000 * 8) / READ_SIZE)  
  931#define CALLWAITING_SUPPRESS_SAMPLES    ((100 * 8) / READ_SIZE)  
  932#define CIDCW_EXPIRE_SAMPLES            ((500 * 8) / READ_SIZE)  
  933#define MIN_MS_SINCE_FLASH              ((2000) )    
  934#define DEFAULT_RINGT                   ((8000 * 8) / READ_SIZE)  
  935#define DEFAULT_DIALTONE_DETECT_TIMEOUT ((10000 * 8) / READ_SIZE)  
  949static struct dahdi_ss7 linksets[
NUM_SPANS];
 
  951static int cur_ss7type = -1;
 
  952static int cur_slc = -1;
 
  953static int cur_linkset = -1;
 
  954static int cur_pointcode = -1;
 
  955static int cur_cicbeginswith = -1;
 
  956static int cur_adjpointcode = -1;
 
  957static int cur_networkindicator = -1;
 
  958static int cur_defaultdpc = -1;
 
  962struct dahdi_mfcr2_conf {
 
  963    openr2_variant_t variant;
 
  965    int metering_pulse_timeout;
 
  968#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 2 
  972#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 3 
  973    int dtmf_end_timeout;
 
  975    signed int get_ani_first:2;
 
  976#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 1 
  977    signed int skip_category_request:2;
 
  979    unsigned int call_files:1;
 
  980    unsigned int allow_collect_calls:1;
 
  981    unsigned int charge_calls:1;
 
  982    unsigned int accept_on_offer:1;
 
  983    unsigned int forced_release:1;
 
  984    unsigned int double_answer:1;
 
  985    signed int immediate_accept:2;
 
  986#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 2 
  987    signed int dtmf_dialing:2;
 
  988    signed int dtmf_detection:2;
 
  990    char logdir[OR2_MAX_PATH];
 
  991    char r2proto_file[OR2_MAX_PATH];
 
  992    openr2_log_level_t loglevel;
 
  993    openr2_calling_party_category_t category;
 
 1000    openr2_context_t *protocol_context;    
 
 1005    struct dahdi_mfcr2_conf 
conf;          
 
 1008struct r2link_entry {
 
 1009    struct dahdi_mfcr2 mfcr2;
 
 1017static int r2links_count = 0;
 
 1025    int mastertrunkgroup;                   
 
 1032#if defined(HAVE_PRI_CCSS) 
 1034static const char dahdi_pri_cc_type[] = 
"DAHDI/PRI";
 
 1043#define POLARITY_IDLE   0 
 1044#define POLARITY_REV    1 
 1055#if defined(HAVE_PRI) 
 1064static struct dahdi_parms_pseudo {
 
 1069} dahdi_pseudo_parms;
 
 1085    struct dahdi_pri pri;
 
 1088#if defined(HAVE_SS7) 
 1089    struct dahdi_ss7 ss7;
 
 1093    struct dahdi_mfcr2_conf mfcr2;
 
 
 1128            .nsf = PRI_NSF_NONE,
 
 1129            .switchtype = PRI_SWITCH_NI2,
 
 1130            .dialplan = PRI_UNKNOWN + 1,
 
 1131            .localdialplan = PRI_NATIONAL_ISDN + 1,
 
 1132            .nodetype = PRI_CPE,
 
 1135#if defined(HAVE_PRI_CCSS) 
 1136            .cc_ptmp_recall_mode = 1,
 
 1137            .cc_qsig_signaling_link_req = 1,
 
 1138            .cc_qsig_signaling_link_rsp = 1,
 
 1144            .internationalprefix = 
"",
 
 1145            .nationalprefix = 
"",
 
 1147            .privateprefix = 
"",
 
 1148            .unknownprefix = 
"",
 
 1150            .resetinterval = -1,
 
 1153#if defined(HAVE_SS7) 
 1155            .called_nai = SS7_NAI_NATIONAL,
 
 1156            .calling_nai = SS7_NAI_NATIONAL,
 
 1157            .internationalprefix = 
"",
 
 1158            .nationalprefix = 
"",
 
 1159            .subscriberprefix = 
"",
 
 1160            .unknownprefix = 
"",
 
 1161            .networkroutedprefix = 
"" 
 1166            .variant = OR2_VAR_ITU,
 
 1167            .mfback_timeout = -1,
 
 1168            .metering_pulse_timeout = -1,
 
 1171            .get_ani_first = -1,
 
 1172#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 1 
 1173            .skip_category_request = -1,
 
 1176            .allow_collect_calls = 0,
 
 1178            .accept_on_offer = 1,
 
 1179            .forced_release = 0,
 
 1181            .immediate_accept = -1,
 
 1182#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 2 
 1184            .dtmf_detection = -1,
 
 1185            .dtmf_time_on = OR2_DEFAULT_DTMF_ON,
 
 1186            .dtmf_time_off = OR2_DEFAULT_DTMF_OFF,
 
 1188#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 3 
 1189            .dtmf_end_timeout = -1,
 
 1193            .loglevel = OR2_LOG_ERROR | OR2_LOG_WARNING,
 
 1194            .category = OR2_CALLING_PARTY_CATEGORY_NATIONAL_SUBSCRIBER
 
 1198            .context = 
"default",
 
 1203            .mohinterpret = 
"default",
 
 1206            .transfertobusy = 1,
 
 1209            .ani_info_digits = 2,
 
 1210            .ani_wink_time = 1000,
 
 1211            .ani_timeout = 10000,
 
 1215            .dahditrcallerid = 0,
 
 1224            .echocancel.head.tap_length = 1,
 
 1232#ifdef HAVE_DAHDI_LINEREVERSE_VMWI 
 1235            .polarityonanswerdelay = 600,
 
 1239            .buf_policy = DAHDI_POLICY_IMMEDIATE,
 
 1258        .ignore_failed_channels = 1,
 
 1259        .smdi_port = 
"/dev/ttyS0",
 
 
 1268    const char *
data, 
int *cause);
 
 1289    .description = 
tdesc,
 
 
 1310#define GET_CHANNEL(p) ((p)->channel) 
 1367        return DAHDI_TONE_RINGTONE;
 
 1369        return DAHDI_TONE_STUTTER;
 
 1371        return DAHDI_TONE_CONGESTION;
 
 1373        return DAHDI_TONE_DIALTONE;
 
 1375        return DAHDI_TONE_DIALRECALL;
 
 1377        return DAHDI_TONE_INFO;
 
 
 1387    switch (analogsub) {
 
 
 1416    struct doomed_pri *entry;
 
 1422        ast_debug(4, 
"Destroying span %d from doomed queue.\n",
 
 1424        pri_destroy_span(entry->pri);
 
 
 1443static void pri_queue_for_destruction(
struct sig_pri_span *pri)
 
 1445    struct doomed_pri *entry;
 
 1449        if (entry->pri == pri) {
 
 1454    entry = 
ast_calloc(
sizeof(
struct doomed_pri), 1);
 
 1462    ast_debug(4, 
"Queue span %d for destruction.\n", pri->
span);
 
 1485    struct dahdi_dialoperation zo = {
 
 1491    for (offset = 0; offset < 
sizeof(zo.dialstr) - 1; ++offset) {
 
 1498            if (offset >= 
sizeof(zo.dialstr) - 3) {
 
 1502            zo.dialstr[offset] = 
'w';
 
 1504            zo.dialstr[offset] = 
'w';
 
 1507        zo.dialstr[offset] = *pos++;
 
 1511    ast_debug(1, 
"Channel %d: Dial str '%s' expanded to '%s' sent to DAHDI_DIAL.\n",
 
 1512        pvt->
channel, dial_str, zo.dialstr);
 
 
 1563    struct pollfd poller;
 
 1567    unsigned char buf[256];
 
 1572    poller.events = POLLPRI | POLLIN;
 
 1575    res = poll(&poller, 1, timeout);
 
 1577    if (poller.revents & POLLPRI) {
 
 1582    if (poller.revents & POLLIN) {
 
 1594        if (analog_p->
ringt > 0) {
 
 1595            if (!(--analog_p->
ringt)) {
 
 
 1658    unsigned char buf[256];
 
 1666    int checkaftercid = 0;
 
 1667    const char *matched_context;
 
 1671    if (ringdata == 
NULL) {
 
 1672        ringdata = curRingData;
 
 1680        for (receivedRingT = 0; receivedRingT < 
RING_PATTERNS; receivedRingT++)
 
 1681            ringdata[receivedRingT] = 0;
 
 1685            ast_verb(3, 
"Detecting post-CID distinctive ring\n");
 
 1689            i = DAHDI_IOMUX_READ | DAHDI_IOMUX_SIGEVENT;
 
 1690            res = ioctl(p->
subs[idx].
dfd, DAHDI_IOMUX, &i);
 
 1696            if (i & DAHDI_IOMUX_SIGEVENT) {
 
 1699                if (res == DAHDI_EVENT_NOALARM) {
 
 1702                } 
else if (res == DAHDI_EVENT_RINGOFFHOOK) {
 
 1704                    ringdata[receivedRingT] = analog_p->
ringt;
 
 1715            } 
else if (i & DAHDI_IOMUX_READ) {
 
 1718                    if (
errno != ELAST) {
 
 1725                if (analog_p->
ringt > 0) {
 
 1726                    if (!(--analog_p->
ringt)) {
 
 1735    ast_verb(3, 
"Detected ring pattern: %d,%d,%d\n", ringdata[0], ringdata[1], ringdata[2]);
 
 1737    for (counter = 0; counter < 3; counter++) {
 
 1741        ast_verb(3, 
"Checking %d,%d,%d with +/- %d range\n",
 
 1746        for (counter1 = 0; counter1 < 3; counter1++) {
 
 1750                ast_verb(3, 
"Pattern ignore (-1) detected, so matching pattern %d regardless.\n",
 
 1751                    ringdata[counter1]);
 
 1753            } 
else if (ring - range <= ringdata[counter1] && ringdata[counter1] <= ring + range) {
 
 1754                ast_verb(3, 
"Ring pattern %d is in range: %d to %d\n",
 
 1755                    ringdata[counter1], ring - range, ring + range);
 
 1763        if (distMatches == 3) {
 
 1766            ast_verb(3, 
"Matched Distinctive Ring context %s\n", matched_context);
 
 1772    if (strcmp(p->
context, matched_context) != 0) {
 
 
 1860            ast_verb(3, 
"CPE supports Call Waiting Caller*ID.  Sending '%s/%s'\n",
 
 
 1936        ast_log(
LOG_ERROR, 
"We used a sub other than SUB_REAL (incorrect assumption sir)\n");
 
 
 1953    ast_debug(1, 
"%s DTMF digit: 0x%02X '%c' on %s\n",
 
 1963                    struct dahdi_bufferinfo bi = {
 
 1970                    if ((res = ioctl(p->
subs[idx].
dfd, DAHDI_SET_BUFINFO, &bi)) < 0) {
 
 2008                    ast_debug(1, 
"Already in a fax extension, not redirecting\n");
 
 2017        *dest = &p->
subs[idx].
f;
 
 
 2047    if (!channel_string) {
 
 2057        "DAHDIGroup: %llu\r\n" 
 2059        "DAHDIChannel: %s\r\n",
 
 
 2080        "channel", dahdi_channel);
 
 
 2104        snprintf(ch_name, 
sizeof(ch_name), 
"no-media (%d)", p->
channel);
 
 2107        strcpy(ch_name, 
"pseudo");
 
 2110        snprintf(ch_name, 
sizeof(ch_name), 
"%d", p->
channel);
 
 
 2124static void my_ami_channel_event(
void *pvt, 
struct ast_channel *chan)
 
 2184    return p->
subs[dahdi_sub].
dfd;
 
 
 2227#if defined(HAVE_PRI) || defined(HAVE_SS7) 
 2228static void my_set_digital(
void *pvt, 
int is_digital)
 
 2236#if defined(HAVE_SS7) 
 2237static void my_set_inservice(
void *pvt, 
int is_inservice)
 
 2245#if defined(HAVE_SS7) 
 2246static void my_set_locallyblocked(
void *pvt, 
int is_blocked)
 
 2254#if defined(HAVE_SS7) 
 2255static void my_set_remotelyblocked(
void *pvt, 
int is_blocked)
 
 2368    p->
owner = new_owner;
 
 
 2419    for (i = 0; i < 3; i++) {
 
 
 2456    int needconf = needconference;
 
 
 2563#if defined(HAVE_PRI) || defined(HAVE_SS7) 
 2564static int dahdi_setlaw(
int dfd, 
int law)
 
 2567    res = ioctl(dfd, DAHDI_SETLAW, &
law);
 
 2574#if defined(HAVE_PRI) 
 2613            newlaw = DAHDI_LAW_ALAW;
 
 2616            newlaw = DAHDI_LAW_MULAW;
 
 2626#if defined(HAVE_PRI) || defined(HAVE_SS7) 
 2634static void my_pri_ss7_open_media(
void *p)
 
 2645    res = ioctl(dfd, DAHDI_AUDIOMODE, &set_val);
 
 2652    res = dahdi_setlaw(dfd, pvt->
law);
 
 2674#if defined(HAVE_PRI) 
 2685static void my_pri_dial_digits(
void *p, 
const char *dial_string)
 
 2687    char dial_str[DAHDI_MAX_DTMF_BUF];
 
 2691    snprintf(dial_str, 
sizeof(dial_str), 
"T%s", dial_string);
 
 2741    case DAHDI_EVENT_ONHOOK:
 
 2744    case DAHDI_EVENT_RINGOFFHOOK:
 
 2747    case DAHDI_EVENT_WINKFLASH:
 
 2750    case DAHDI_EVENT_ALARM:
 
 2753    case DAHDI_EVENT_NOALARM:
 
 2756    case DAHDI_EVENT_DIALCOMPLETE:
 
 2759    case DAHDI_EVENT_RINGERON:
 
 2762    case DAHDI_EVENT_RINGEROFF:
 
 2765    case DAHDI_EVENT_HOOKCOMPLETE:
 
 2768    case DAHDI_EVENT_PULSE_START:
 
 2771    case DAHDI_EVENT_POLARITY:
 
 2774    case DAHDI_EVENT_RINGBEGIN:
 
 2777    case DAHDI_EVENT_EC_DISABLED:
 
 2780    case DAHDI_EVENT_REMOVED:
 
 2783    case DAHDI_EVENT_NEONMWI_ACTIVE:
 
 2786    case DAHDI_EVENT_NEONMWI_INACTIVE:
 
 2789#ifdef HAVE_DAHDI_ECHOCANCEL_FAX_MODE 
 2790    case DAHDI_EVENT_TX_CED_DETECTED:
 
 2793    case DAHDI_EVENT_RX_CED_DETECTED:
 
 2796    case DAHDI_EVENT_EC_NLP_DISABLED:
 
 2799    case DAHDI_EVENT_EC_NLP_ENABLED:
 
 2803    case DAHDI_EVENT_PULSEDIGIT:
 
 2806    case DAHDI_EVENT_DTMFDOWN:
 
 2809    case DAHDI_EVENT_DTMFUP:
 
 2813        switch(
event & 0xFFFF0000) {
 
 2814        case DAHDI_EVENT_PULSEDIGIT:
 
 2815        case DAHDI_EVENT_DTMFDOWN:
 
 2816        case DAHDI_EVENT_DTMFUP:
 
 
 2858    struct dahdi_params par;
 
 2860    memset(&par, 0, 
sizeof(par));
 
 2867        par.rxisoffhook = 0;
 
 2877        return (par.rxbits > -1) || par.rxisoffhook;
 
 2880    return par.rxisoffhook;
 
 
 2907    int func = DAHDI_FLASH;
 
 
 2974    int x = DAHDI_START;
 
 
 2989        ast_log(
LOG_ERROR, 
"Trying to dial_digits '%s' on channel %d subchannel %u\n",
 
 
 3016    if (ioctl(p->
subs[index].
dfd, DAHDI_DIALING, &x)) {
 
 3017        ast_debug(1, 
"DAHDI_DIALING ioctl failed!\n");
 
 
 3030#if defined(HAVE_PRI) 
 3031static void my_pri_fixup_chans(
void *chan_old, 
void *chan_new)
 
 3038    if (new_chan->
owner) {
 
 3045    new_chan->
dsp = old_chan->
dsp;
 
 3059    new_chan->
law = old_chan->
law;
 
 3064#if defined(HAVE_PRI) 
 3065static int sig_pri_tone_to_dahditone(
enum sig_pri_tone tone)
 
 3069        return DAHDI_TONE_RINGTONE;
 
 3071        return DAHDI_TONE_STUTTER;
 
 3073        return DAHDI_TONE_CONGESTION;
 
 3075        return DAHDI_TONE_DIALTONE;
 
 3077        return DAHDI_TONE_DIALRECALL;
 
 3079        return DAHDI_TONE_INFO;
 
 3081        return DAHDI_TONE_BUSY;
 
 3088#if defined(HAVE_PRI) 
 3089static void my_handle_dchan_exception(
struct sig_pri_span *pri, 
int index)
 
 3093    ioctl(pri->
fds[index], DAHDI_GETEVENT, &x);
 
 3095    case DAHDI_EVENT_NONE:
 
 3097    case DAHDI_EVENT_ALARM:
 
 3098    case DAHDI_EVENT_NOALARM:
 
 3110    case DAHDI_EVENT_ALARM:
 
 3113    case DAHDI_EVENT_NOALARM:
 
 3116    case DAHDI_EVENT_REMOVED:
 
 3117        pri_queue_for_destruction(pri);
 
 3125#if defined(HAVE_PRI) 
 3126static int my_pri_play_tone(
void *pvt, 
enum sig_pri_tone tone)
 
 3130    return tone_zone_play_tone(p->
subs[
SUB_REAL].
dfd, sig_pri_tone_to_dahditone(tone));
 
 3134#if defined(HAVE_PRI) || defined(HAVE_SS7) 
 3143static void my_set_callerid(
void *pvt, 
const struct ast_party_caller *caller)
 
 3158    if (caller->
id.
tag) {
 
 3163        sizeof(p->cid_ani));
 
 3168#if defined(HAVE_PRI) || defined(HAVE_SS7) 
 3177static void my_set_dnid(
void *pvt, 
const char *
dnid)
 
 3185#if defined(HAVE_PRI) 
 3194static void my_set_rdnis(
void *pvt, 
const char *
rdnis)
 
 3202#if defined(HAVE_PRI) 
 3229static void my_pri_make_cc_dialstring(
void *priv, 
char *
buf, 
size_t buf_size)
 
 3250        snprintf(
buf, buf_size, 
"%s/i%d-", 
args.tech, pvt->pri->span);
 
 3253    if (isdigit(
args.group[0]) || 
args.group[0] == 
'i' || strchr(
args.group, 
'!')) {
 
 3260    snprintf(
buf, buf_size, 
"%s/i%d-%s", 
args.tech, pvt->pri->span, 
args.group);
 
 3264#if defined(HAVE_PRI) 
 3274static void dahdi_pri_update_span_devstate(
struct sig_pri_span *pri)
 
 3277    unsigned num_b_chans;   
 
 3286    for (idx = pri->
numchans; idx--;) {
 
 3310#if defined(THRESHOLD_DEVSTATE_PLACEHOLDER) 
 3314    } 
else if (!in_use) {
 
 3316    } 
else if (!pri->user_busy_threshold) {
 
 3322    if (pri->threshold_devstate != new_state) {
 
 3323        pri->threshold_devstate = new_state;
 
 3330#if defined(HAVE_PRI) 
 3336static void my_module_ref(
void)
 
 3342#if defined(HAVE_PRI) 
 3348static void my_module_unref(
void)
 
 3354#if defined(HAVE_PRI) 
 3355#if defined(HAVE_PRI_CALL_WAITING) 
 3356static void my_pri_init_config(
void *priv, 
struct sig_pri_span *pri);
 
 3358static int dahdi_new_pri_nobch_channel(
struct sig_pri_span *pri);
 
 3363    .play_tone = my_pri_play_tone,
 
 3369    .new_ast_channel = my_new_pri_ast_channel,
 
 3370    .fixup_chans = my_pri_fixup_chans,
 
 3374    .set_digital = my_set_digital,
 
 3375    .set_callerid = my_set_callerid,
 
 3376    .set_dnid = my_set_dnid,
 
 3377    .set_rdnis = my_set_rdnis,
 
 3378    .new_nobch_intf = dahdi_new_pri_nobch_channel,
 
 3379#if defined(HAVE_PRI_CALL_WAITING) 
 3380    .init_config = my_pri_init_config,
 
 3383    .make_cc_dialstring = my_pri_make_cc_dialstring,
 
 3384    .update_span_devstate = dahdi_pri_update_span_devstate,
 
 3385    .module_ref = my_module_ref,
 
 3386    .module_unref = my_module_unref,
 
 3387    .dial_digits = my_pri_dial_digits,
 
 3388    .open_media = my_pri_ss7_open_media,
 
 3389    .ami_channel_event = my_ami_channel_event,
 
 3390    .destroy_later = pri_queue_for_destruction,
 
 3394#if defined(HAVE_SS7) 
 3403static void my_handle_link_exception(
struct sig_ss7_linkset *linkset, 
int which)
 
 3407    if (ioctl(linkset->
fds[which], DAHDI_GETEVENT, &
event)) {
 
 3409            linkset->
span, which);
 
 3413    case DAHDI_EVENT_NONE:
 
 3415    case DAHDI_EVENT_ALARM:
 
 3420    case DAHDI_EVENT_NOALARM:
 
 3433#if defined(HAVE_SS7) 
 3434static void my_ss7_set_loopback(
void *pvt, 
int enable)
 
 3445#if defined(HAVE_SS7) 
 3465        if (linksets[idx].
ss7.ss7 == 
ss7) {
 
 3466            return &linksets[idx].
ss7;
 
 3473#if defined(HAVE_SS7) 
 3516        newlaw = DAHDI_LAW_ALAW;
 
 3519        newlaw = DAHDI_LAW_MULAW;
 
 3526#if defined(HAVE_SS7) 
 3527static int sig_ss7_tone_to_dahditone(
enum sig_ss7_tone tone)
 
 3531        return DAHDI_TONE_RINGTONE;
 
 3533        return DAHDI_TONE_STUTTER;
 
 3535        return DAHDI_TONE_CONGESTION;
 
 3537        return DAHDI_TONE_DIALTONE;
 
 3539        return DAHDI_TONE_DIALRECALL;
 
 3541        return DAHDI_TONE_INFO;
 
 3543        return DAHDI_TONE_BUSY;
 
 3550#if defined(HAVE_SS7) 
 3551static int my_ss7_play_tone(
void *pvt, 
enum sig_ss7_tone tone)
 
 3555    return tone_zone_play_tone(p->
subs[
SUB_REAL].
dfd, sig_ss7_tone_to_dahditone(tone));
 
 3559#if defined(HAVE_SS7) 
 3567    .set_loopback = my_ss7_set_loopback,
 
 3569    .new_ast_channel = my_new_ss7_ast_channel,
 
 3570    .play_tone = my_ss7_play_tone,
 
 3572    .handle_link_exception = my_handle_link_exception,
 
 3576    .set_digital = my_set_digital,
 
 3577    .set_inservice = my_set_inservice,
 
 3578    .set_locallyblocked = my_set_locallyblocked,
 
 3579    .set_remotelyblocked = my_set_remotelyblocked,
 
 3580    .set_callerid = my_set_callerid,
 
 3581    .set_dnid = my_set_dnid,
 
 3582    .open_media = my_pri_ss7_open_media,
 
 3583    .find_linkset = my_ss7_find_linkset,
 
 3653#define gen_pvt_field_callback(type, field) \ 
 3654    static type my_get_##field(void *pvt) \ 
 3656        struct dahdi_pvt *p = pvt; \ 
  3653#define gen_pvt_field_callback(type, field) \ …  3664#undef gen_pvt_field_callback 
 3755                "Unable to get index for '%s' on channel %d (%s(), line %lu)\n",
 
 
 3848#if defined(HAVE_PRI) 
 
 3863static void mfcr2_queue_for_destruction(
const struct dahdi_pvt *p)
 
 3865    const struct dahdi_mfcr2 *r2link = p->mfcr2;
 
 3866    struct r2link_entry *cur;
 
 3869        if (r2link == &cur->mfcr2) {
 
 3879static int dahdi_r2_answer(
struct dahdi_pvt *p)
 
 3885#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 1 
 3887    int wants_double_answer = 
ast_true(double_answer) ? 1 : 0;
 
 3888    if (!double_answer) {
 
 3891        res = openr2_chan_answer_call(p->r2chan);
 
 3892    } 
else if (wants_double_answer) {
 
 3893        res = openr2_chan_answer_call_with_mode(p->r2chan, OR2_ANSWER_DOUBLE);
 
 3895        res = openr2_chan_answer_call_with_mode(p->r2chan, OR2_ANSWER_SIMPLE);
 
 3898    res = openr2_chan_answer_call(p->r2chan);
 
 3906static openr2_calling_party_category_t dahdi_r2_get_channel_category(
struct ast_channel *
c)
 
 3908    openr2_calling_party_category_t cat;
 
 3912        ast_debug(1, 
"No MFC/R2 category specified for chan %s, using default %s\n",
 
 3914        return p->mfcr2_category;
 
 3916    if ((cat = openr2_proto_get_category(catstr)) == OR2_CALLING_PARTY_CATEGORY_UNKNOWN) {
 
 3917        ast_log(
LOG_WARNING, 
"Invalid category specified '%s' for chan %s, using default %s\n",
 
 3918                catstr, 
ast_channel_name(
c), openr2_proto_get_category_string(p->mfcr2_category));
 
 3919        return p->mfcr2_category;
 
 3921    ast_debug(1, 
"Using category %s\n", catstr);
 
 3925static void dahdi_r2_on_call_init(openr2_chan_t *r2chan)
 
 3927    struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
 
 3936        ast_log(
LOG_ERROR, 
"Collision of calls on chan %d detected!.\n", openr2_chan_get_number(r2chan));
 
 3946    p->mfcr2_ani_index = 
'\0';
 
 3947    p->mfcr2_dnis_index = 
'\0';
 
 3948    p->mfcr2_dnis_matched = 0;
 
 3949    p->mfcr2_answer_pending = 0;
 
 3950    p->mfcr2_call_accepted = 0;
 
 3952    ast_verbose(
"New MFC/R2 call detected on chan %d.\n", openr2_chan_get_number(r2chan));
 
 3955static void dahdi_r2_on_hardware_alarm(openr2_chan_t *r2chan, 
int alarm)
 
 3958    struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
 
 3963        if (res == DAHDI_ALARM_NOTOPEN) {
 
 3964            mfcr2_queue_for_destruction(p);
 
 3973static void dahdi_r2_on_os_error(openr2_chan_t *r2chan, 
int errorcode)
 
 3975    struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
 
 3977    ast_log(
LOG_ERROR, 
"OS error on chan %d: %s\n", openr2_chan_get_number(r2chan), strerror(errorcode));
 
 3980    if (errorcode == ENODEV) {
 
 3981        struct dahdi_mfcr2 *r2link = p->mfcr2;
 
 3990static void dahdi_r2_on_protocol_error(openr2_chan_t *r2chan, openr2_protocol_error_t reason)
 
 3992    struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
 
 3993    ast_log(
LOG_ERROR, 
"MFC/R2 protocol error on chan %d: %s\n", openr2_chan_get_number(r2chan), openr2_proto_get_error(reason));
 
 4003static void dahdi_r2_disconnect_call(
struct dahdi_pvt *p, openr2_call_disconnect_cause_t cause)
 
 4005    if (openr2_chan_disconnect_call(p->r2chan, cause)) {
 
 4006        ast_log(
LOG_NOTICE, 
"Bad! failed to disconnect call on channel %d with reason %s, hope for the best!\n",
 
 4007           p->
channel, openr2_proto_get_disconnect_string(cause));
 
 4009        openr2_chan_set_idle(p->r2chan);
 
 4016static void dahdi_r2_on_call_offered(openr2_chan_t *r2chan, 
const char *ani, 
const char *dnis, openr2_calling_party_category_t category)
 
 4022    ast_verbose(
"MFC/R2 call offered on chan %d. ANI = %s, DNIS = %s, Category = %s\n",
 
 4023            openr2_chan_get_number(r2chan), ani ? ani : 
"(restricted)", dnis,
 
 4024            openr2_proto_get_category_string(category));
 
 4025    p = openr2_chan_get_client_data(r2chan);
 
 4027    if (!p->mfcr2_allow_collect_calls && category == OR2_CALLING_PARTY_CATEGORY_COLLECT_CALL) {
 
 4029        dahdi_r2_disconnect_call(p, OR2_CAUSE_COLLECT_CALL_REJECTED);
 
 4030        goto dahdi_r2_on_call_offered_cleanup;
 
 4033    p->mfcr2_recvd_category = category;
 
 4036        ast_debug(1, 
"No CID allowed in configuration, CID is being cleared!\n");
 
 4041    if (p->
immediate || !openr2_context_get_max_dnis(openr2_chan_get_context(r2chan))) {
 
 4042        ast_debug(1, 
"Setting exten => s because of immediate or 0 DNIS configured\n");
 
 4048        ast_log(
LOG_NOTICE, 
"MFC/R2 call on channel %d requested non-existent extension '%s' in context '%s'. Rejecting call.\n",
 
 4050        dahdi_r2_disconnect_call(p, OR2_CAUSE_UNALLOCATED_NUMBER);
 
 4051        goto dahdi_r2_on_call_offered_cleanup;
 
 4053    if (!p->mfcr2_accept_on_offer) {
 
 4060            goto dahdi_r2_on_call_offered_cleanup;
 
 4063        dahdi_r2_disconnect_call(p, OR2_CAUSE_OUT_OF_ORDER);
 
 4064    } 
else if (p->mfcr2_charge_calls) {
 
 4065        ast_debug(1, 
"Accepting MFC/R2 call with charge on chan %d\n", p->
channel);
 
 4066        openr2_chan_accept_call(r2chan, OR2_CALL_WITH_CHARGE);
 
 4068        ast_debug(1, 
"Accepting MFC/R2 call with no charge on chan %d\n", p->
channel);
 
 4069        openr2_chan_accept_call(r2chan, OR2_CALL_NO_CHARGE);
 
 4072dahdi_r2_on_call_offered_cleanup:
 
 4076static void dahdi_r2_on_call_end(openr2_chan_t *r2chan)
 
 4078    struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
 
 4085static void dahdi_r2_on_call_accepted(openr2_chan_t *r2chan, openr2_call_mode_t mode)
 
 4091    p = openr2_chan_get_client_data(r2chan);
 
 4093    p->mfcr2_call_accepted = 1;
 
 4095    if (OR2_DIR_BACKWARD == openr2_chan_get_direction(r2chan)) {
 
 4096        ast_verbose(
"MFC/R2 call has been accepted on backward channel %d\n", openr2_chan_get_number(r2chan));
 
 4101        if (!p->mfcr2_accept_on_offer) {
 
 4102            openr2_chan_disable_read(r2chan);
 
 4103            if (p->mfcr2_answer_pending) {
 
 4104                ast_debug(1, 
"Answering MFC/R2 call after accepting it on chan %d\n", openr2_chan_get_number(r2chan));
 
 4107            goto dahdi_r2_on_call_accepted_cleanup;
 
 4113            openr2_chan_disable_read(r2chan);
 
 4114            goto dahdi_r2_on_call_accepted_cleanup;
 
 4118        dahdi_r2_disconnect_call(p, OR2_CAUSE_OUT_OF_ORDER);
 
 4119        goto dahdi_r2_on_call_accepted_cleanup;
 
 4126    openr2_chan_disable_read(r2chan);
 
 4128dahdi_r2_on_call_accepted_cleanup:
 
 4132static void dahdi_r2_on_call_answered(openr2_chan_t *r2chan)
 
 4134    struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
 
 4135    ast_verbose(
"MFC/R2 call has been answered on channel %d\n", openr2_chan_get_number(r2chan));
 
 4139static void dahdi_r2_on_call_read(openr2_chan_t *r2chan, 
const unsigned char *
buf, 
int buflen)
 
 4144static int dahdi_r2_cause_to_ast_cause(openr2_call_disconnect_cause_t cause)
 
 4147    case OR2_CAUSE_BUSY_NUMBER:
 
 4149    case OR2_CAUSE_NETWORK_CONGESTION:
 
 4151    case OR2_CAUSE_OUT_OF_ORDER:
 
 4153    case OR2_CAUSE_UNALLOCATED_NUMBER:
 
 4155    case OR2_CAUSE_NO_ANSWER:
 
 4157    case OR2_CAUSE_NORMAL_CLEARING:
 
 4159    case OR2_CAUSE_UNSPECIFIED:
 
 4165static void dahdi_r2_on_call_disconnect(openr2_chan_t *r2chan, openr2_call_disconnect_cause_t cause)
 
 4167    struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
 
 4170    int datalen = 
sizeof(*cause_code);
 
 4172    ast_verbose(
"MFC/R2 call disconnected on channel %d\n", openr2_chan_get_number(r2chan));
 
 4177        dahdi_r2_disconnect_call(p, OR2_CAUSE_NORMAL_CLEARING);
 
 4181    snprintf(cause_str, 
sizeof(cause_str), 
"R2 DISCONNECT (%s)", openr2_proto_get_disconnect_string(cause));
 
 4182    datalen += strlen(cause_str);
 
 4184    memset(cause_code, 0, datalen);
 
 4185    cause_code->
ast_cause = dahdi_r2_cause_to_ast_cause(cause);
 
 4197    } 
else if (openr2_chan_get_direction(r2chan) == OR2_DIR_FORWARD) {
 
 4200        case OR2_CAUSE_BUSY_NUMBER:
 
 4203        case OR2_CAUSE_NETWORK_CONGESTION:
 
 4204        case OR2_CAUSE_OUT_OF_ORDER:
 
 4205        case OR2_CAUSE_UNALLOCATED_NUMBER:
 
 4206        case OR2_CAUSE_NO_ANSWER:
 
 4207        case OR2_CAUSE_UNSPECIFIED:
 
 4208        case OR2_CAUSE_NORMAL_CLEARING:
 
 4223static void dahdi_r2_write_log(openr2_log_level_t level, 
char *logmessage)
 
 4226    case OR2_LOG_NOTICE:
 
 4229    case OR2_LOG_WARNING:
 
 4235    case OR2_LOG_STACK_TRACE:
 
 4236    case OR2_LOG_MF_TRACE:
 
 4237    case OR2_LOG_CAS_TRACE:
 
 4239    case OR2_LOG_EX_DEBUG:
 
 4249static void dahdi_r2_on_line_blocked(openr2_chan_t *r2chan)
 
 4251    struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
 
 4255    ast_log(
LOG_NOTICE, 
"Far end blocked on chan %d\n", openr2_chan_get_number(r2chan));
 
 4258static void dahdi_r2_on_line_idle(openr2_chan_t *r2chan)
 
 4260    struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
 
 4264    ast_log(
LOG_NOTICE, 
"Far end unblocked on chan %d\n", openr2_chan_get_number(r2chan));
 
 4267static void dahdi_r2_on_context_log(openr2_context_t *r2context, openr2_log_level_t level, 
const char *fmt, va_list ap)
 
 4268    __attribute__((format (printf, 3, 0)));
 
 4269static void dahdi_r2_on_context_log(openr2_context_t *r2context, openr2_log_level_t level, 
const char *fmt, va_list ap)
 
 4271#define CONTEXT_TAG "Context - " 
 4273    char completemsg[
sizeof(
logmsg) * 2];
 
 4275    snprintf(completemsg, 
sizeof(completemsg), CONTEXT_TAG 
"%s", 
logmsg);
 
 4276    dahdi_r2_write_log(level, completemsg);
 
 4280static void dahdi_r2_on_chan_log(openr2_chan_t *r2chan, openr2_log_level_t level, 
const char *fmt, va_list ap)
 
 4281    __attribute__((format (printf, 3, 0)));
 
 4282static void dahdi_r2_on_chan_log(openr2_chan_t *r2chan, openr2_log_level_t level, 
const char *fmt, va_list ap)
 
 4284#define CHAN_TAG "Chan " 
 4286    char completemsg[
sizeof(
logmsg) * 2];
 
 4288    snprintf(completemsg, 
sizeof(completemsg), CHAN_TAG 
"%d - %s", openr2_chan_get_number(r2chan), 
logmsg);
 
 4289    dahdi_r2_write_log(level, completemsg);
 
 4293static int dahdi_r2_on_dnis_digit_received(openr2_chan_t *r2chan, 
char digit)
 
 4295    struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
 
 4302    p->mfcr2_dnis_index++;
 
 4303    p->
exten[p->mfcr2_dnis_index] = 0;
 
 4304    p->
rdnis[p->mfcr2_dnis_index] = 0;
 
 4306    if ((p->mfcr2_dnis_matched ||
 
 4315static void dahdi_r2_on_ani_digit_received(openr2_chan_t *r2chan, 
char digit)
 
 4317    struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
 
 4320    p->mfcr2_ani_index++;
 
 4321    p->
cid_num[p->mfcr2_ani_index] = 0;
 
 4322    p->
cid_name[p->mfcr2_ani_index] = 0;
 
 4325static void dahdi_r2_on_billing_pulse_received(openr2_chan_t *r2chan)
 
 4327    ast_verbose(
"MFC/R2 billing pulse received on channel %d\n", openr2_chan_get_number(r2chan));
 
 4330static openr2_event_interface_t dahdi_r2_event_iface = {
 
 4331    .on_call_init = dahdi_r2_on_call_init,
 
 4332    .on_call_offered = dahdi_r2_on_call_offered,
 
 4333    .on_call_accepted = dahdi_r2_on_call_accepted,
 
 4334    .on_call_answered = dahdi_r2_on_call_answered,
 
 4335    .on_call_disconnect = dahdi_r2_on_call_disconnect,
 
 4336    .on_call_end = dahdi_r2_on_call_end,
 
 4337    .on_call_read = dahdi_r2_on_call_read,
 
 4338    .on_hardware_alarm = dahdi_r2_on_hardware_alarm,
 
 4339    .on_os_error = dahdi_r2_on_os_error,
 
 4340    .on_protocol_error = dahdi_r2_on_protocol_error,
 
 4341    .on_line_blocked = dahdi_r2_on_line_blocked,
 
 4342    .on_line_idle = dahdi_r2_on_line_idle,
 
 4344    .on_context_log = (openr2_handle_context_logging_func)dahdi_r2_on_context_log,
 
 4345    .on_dnis_digit_received = dahdi_r2_on_dnis_digit_received,
 
 4346    .on_ani_digit_received = dahdi_r2_on_ani_digit_received,
 
 4348    .on_billing_pulse_received = dahdi_r2_on_billing_pulse_received
 
 4351static inline int16_t dahdi_r2_alaw_to_linear(uint8_t sample)
 
 4356static inline uint8_t dahdi_r2_linear_to_alaw(
int sample)
 
 4361static openr2_transcoder_interface_t dahdi_r2_transcode_iface = {
 
 4362    dahdi_r2_alaw_to_linear,
 
 4363    dahdi_r2_linear_to_alaw
 
 4404    for (
x = 0; 
x < strlen(fn); 
x++) {
 
 4405        if (!isdigit(fn[
x])) {
 
 4416        fn = 
"/dev/dahdi/channel";
 
 4418    fd = open(fn, O_RDWR | O_NONBLOCK);
 
 4424        if (ioctl(fd, DAHDI_SPECIFY, &chan)) {
 
 4433    if (ioctl(fd, DAHDI_SET_BLOCKSIZE, &
bs) == -1) {
 
 
 4452    chan_pvt->
subs[sub_num].
dfd = -1;
 
 
 4455#if defined(HAVE_PRI) 
 4456static void dahdi_close_pri_fd(
struct dahdi_pri *pri, 
int fd_num)
 
 4459    pri->pri.fds[fd_num] = -1;
 
 4463#if defined(HAVE_SS7) 
 4464static void dahdi_close_ss7_fd(
struct dahdi_ss7 *ss7, 
int fd_num)
 
 4467    ss7->ss7.fds[fd_num] = -1;
 
 4473    return ioctl(dfd, DAHDI_SETLINEAR, &linear);
 
 
 4479    struct dahdi_bufferinfo bi;
 
 4492    res = ioctl(p->
subs[x].
dfd, DAHDI_GET_BUFINFO, &bi);
 
 4497        res = ioctl(p->
subs[x].
dfd, DAHDI_SET_BUFINFO, &bi);
 
 
 4534        return DAHDI_TONE_DTMF_BASE + (
digit - 
'0');
 
 4536        return DAHDI_TONE_DTMF_A + (
digit - 
'A');
 
 4538        return DAHDI_TONE_DTMF_A + (
digit - 
'a');
 
 4539    else if (
digit == 
'*')
 
 4540        return DAHDI_TONE_DTMF_s;
 
 4541    else if (
digit == 
'#')
 
 4542        return DAHDI_TONE_DTMF_p;
 
 
 4581        char dial_str[] = { 
'T', 
digit, 
'\0' };
 
 4592        dtmf = DAHDI_FLUSH_WRITE;
 
 4595            ast_log(
LOG_WARNING, 
"Unable to flush the DAHDI write buffer to send DTMF on channel %d: %s\n",
 
 4599        ast_debug(1, 
"Channel %s started VLDTMF digit '%c'\n",
 
 
 4634        ast_debug(1, 
"Channel %s ending VLDTMF digit '%c'\n",
 
 
 4660    "Hook Transition Complete",
 
 4665    "Polarity Reversal",
 
 
 4673    { DAHDI_ALARM_RED, 
"Red Alarm" },
 
 4674    { DAHDI_ALARM_YELLOW, 
"Yellow Alarm" },
 
 4675    { DAHDI_ALARM_BLUE, 
"Blue Alarm" },
 
 4676    { DAHDI_ALARM_RECOVER, 
"Recovering" },
 
 4677    { DAHDI_ALARM_LOOPBACK, 
"Loopback" },
 
 4678    { DAHDI_ALARM_NOTOPEN, 
"Not Open" },
 
 4679    { DAHDI_ALARM_NONE, 
"None" },
 
 4689    return alm ? 
"Unknown Alarm" : 
"No Alarm";
 
 
 4694    static char buf[256];
 
 
 4703    static char buf[256];
 
 4706        return "E & M Immediate";
 
 4708        return "E & M Wink";
 
 4712        return "Feature Group D (DTMF)";
 
 4714        return "Feature Group D (MF)";
 
 4716        return "Feature Group D (MF) Tandem Access";
 
 4718        return "Feature Group B (MF)";
 
 4722        return "FGC/CAMA (Dialpulse)";
 
 4724        return "FGC/CAMA (MF)";
 
 4726        return "FXS Loopstart";
 
 4728        return "FXS Groundstart";
 
 4730        return "FXS Kewlstart";
 
 4732        return "FXO Loopstart";
 
 4734        return "FXO Groundstart";
 
 4736        return "FXO Kewlstart";
 
 4740        return "ISDN BRI Point to Point";
 
 4742        return "ISDN BRI Point to MultiPoint";
 
 4748        return "SF (Tone) Immediate";
 
 4750        return "SF (Tone) Wink";
 
 4752        return "SF (Tone) with Feature Group D (DTMF)";
 
 4754        return "SF (Tone) with Feature Group D (MF)";
 
 4756        return "SF (Tone) with Feature Group B (MF)";
 
 4760        snprintf(
buf, 
sizeof(
buf), 
"Unknown signalling %d", sig);
 
 
 4765#define sig2str dahdi_sig2str 
 4771    struct dahdi_confinfo zi;
 
 4773    memset(&zi, 0, 
sizeof(zi));
 
 4776    if (slavechannel > 0) {
 
 4778        zi.confmode = DAHDI_CONF_DIGITALMON;
 
 4779        zi.confno = slavechannel;
 
 4783            zi.confmode = DAHDI_CONF_REALANDPSEUDO | DAHDI_CONF_TALKER | DAHDI_CONF_LISTENER |
 
 4784                DAHDI_CONF_PSEUDO_TALKER | DAHDI_CONF_PSEUDO_LISTENER;
 
 4786            zi.confmode = DAHDI_CONF_CONF | DAHDI_CONF_TALKER | DAHDI_CONF_LISTENER;
 
 4789    if ((zi.confno == 
c->curconf.confno) && (zi.confmode == 
c->curconf.confmode))
 
 4793    if (ioctl(
c->dfd, DAHDI_SETCONF, &zi)) {
 
 4794        ast_log(
LOG_WARNING, 
"Failed to add %d to conference %d/%d: %s\n", 
c->dfd, zi.confmode, zi.confno, strerror(
errno));
 
 4797    if (slavechannel < 1) {
 
 4801    ast_debug(1, 
"Added %d to conference %d/%d\n", 
c->dfd, 
c->curconf.confmode, 
c->curconf.confno);
 
 
 4808    if ((p->
channel == 
c->curconf.confno) && (
c->curconf.confmode == DAHDI_CONF_DIGITALMON))
 
 4811    if ((p->
confno > 0) && (p->
confno == 
c->curconf.confno) && (
c->curconf.confmode & DAHDI_CONF_TALKER))
 
 
 4818    struct dahdi_confinfo zi;
 
 4825    memset(&zi, 0, 
sizeof(zi));
 
 4826    if (ioctl(
c->dfd, DAHDI_SETCONF, &zi)) {
 
 4827        ast_log(
LOG_WARNING, 
"Failed to drop %d from conference %d/%d: %s\n", 
c->dfd, 
c->curconf.confmode, 
c->curconf.confno, strerror(
errno));
 
 4830    ast_debug(1, 
"Removed %d from conference %d/%d\n", 
c->dfd, 
c->curconf.confmode, 
c->curconf.confno);
 
 4831    memcpy(&
c->curconf, &zi, 
sizeof(
c->curconf));
 
 
 4843    for (x = 0; x < 3; x++) {
 
 4851    if (useslavenative) {
 
 4870    else if (slave->
law != p->
law) {
 
 4876    return useslavenative;
 
 
 4884        struct dahdi_confinfo zi;
 
 4886        memset(&zi, 0, 
sizeof(zi));
 
 
 4902    for (x = 0; x < 3; x++) {
 
 4945    ast_debug(1, 
"Updated conferencing on %d, with %d conference users\n", p->
channel, needconf);
 
 
 4954        ast_debug(1, 
"Echo cancellation already on\n");
 
 4958        ast_debug(1, 
"Echo cancellation isn't required on digital connection\n");
 
 4962#if defined(HAVE_PRI) || defined(HAVE_SS7) 
 4964#if defined(HAVE_PRI) 
 4975#if defined(HAVE_SS7) 
 4984                        "Unable to enable audio mode on channel %d (%s)\n",
 
 5000        ast_debug(1, 
"No echo cancellation requested\n");
 
 
 5016        ast_debug(1, 
"No echo training requested\n");
 
 
 5025        struct dahdi_echocanparams ecp = { .tap_length = 0 };
 
 
 5040    struct dahdi_hwgain hwgain;
 
 5042    hwgain.newgain = gain * 10.0;
 
 5043    hwgain.tx = tx_direction;
 
 5044    return ioctl(fd, DAHDI_SET_HWGAIN, &hwgain) < 0;
 
 
 5051    float shallow, steep;
 
 5052    float max = SHRT_MAX;
 
 5054    neg = (sample < 0 ? -1 : 1);
 
 5056    shallow = neg*(
max-
max/drc)+(
float)sample/drc;
 
 5057    if (fabsf(steep) < fabsf(shallow)) {
 
 
 5068static void fill_txgain(
struct dahdi_gains *g, 
float gain, 
float drc, 
int law)
 
 5073    float linear_gain = pow(10.0, gain / 20.0);
 
 5076    case DAHDI_LAW_ALAW:
 
 5077        for (j = 0; j < 
ARRAY_LEN(g->txgain); j++) {
 
 5083                k = (float)k * linear_gain;
 
 5086                } 
else if (k < -32768) {
 
 5095    case DAHDI_LAW_MULAW:
 
 5096        for (j = 0; j < 
ARRAY_LEN(g->txgain); j++) {
 
 5102                k = (float)k * linear_gain;
 
 5105                } 
else if (k < -32768) {
 
  5068static void fill_txgain(
struct dahdi_gains *g, 
float gain, 
float drc, 
int law) {
…}
 
 5118static void fill_rxgain(
struct dahdi_gains *g, 
float gain, 
float drc, 
int law)
 
 5122    float linear_gain = pow(10.0, gain / 20.0);
 
 5125    case DAHDI_LAW_ALAW:
 
 5126        for (j = 0; j < 
ARRAY_LEN(g->rxgain); j++) {
 
 5132                k = (float)k * linear_gain;
 
 5135                } 
else if (k < -32768) {
 
 5144    case DAHDI_LAW_MULAW:
 
 5145        for (j = 0; j < 
ARRAY_LEN(g->rxgain); j++) {
 
 5151                k = (float)k * linear_gain;
 
 5154                } 
else if (k < -32768) {
 
  5118static void fill_rxgain(
struct dahdi_gains *g, 
float gain, 
float drc, 
int law) {
…}
 
 5168    struct dahdi_gains g;
 
 5171    memset(&g, 0, 
sizeof(g));
 
 5172    res = ioctl(fd, DAHDI_GETGAINS, &g);
 
 5180    return ioctl(fd, DAHDI_SETGAINS, &g);
 
 
 5185    struct dahdi_gains g;
 
 5188    memset(&g, 0, 
sizeof(g));
 
 5189    res = ioctl(fd, DAHDI_GETGAINS, &g);
 
 5197    return ioctl(fd, DAHDI_SETGAINS, &g);
 
 
 5200static int set_actual_gain(
int fd, 
float rxgain, 
float txgain, 
float rxdrc, 
float txdrc, 
int law)
 
  5200static int set_actual_gain(
int fd, 
float rxgain, 
float txgain, 
float rxdrc, 
float txdrc, 
int law) {
…}
 
 5237    res = ioctl(fd, DAHDI_HOOK, &x);
 
 5240        if (
errno == EINPROGRESS)
 
 
 5254#if defined(HAVE_PRI) || defined(HAVE_SS7) 
 5256#if defined(HAVE_PRI) 
 5264#if defined(HAVE_SS7) 
 
 5288    struct dahdi_confinfo 
c;
 
 5301    memset(&
c, 0, 
sizeof(
c));
 
 5302    c.confmode = DAHDI_CONF_NORMAL;
 
 5308    ast_debug(1, 
"Disabled conferencing\n");
 
 
 5322        ast_debug(1, 
"Restored conferencing\n");
 
 
 5355        ast_debug(6, 
"MWI manual override active on channel %d: pretending that it should be %s\n",
 
 
 5386            if (
errno == EAGAIN)
 
 
 5465#if defined(HAVE_PRI) 
 5472        subaddr = strchr(p->
exten, 
':');
 
 5501    x = DAHDI_FLUSH_READ | DAHDI_FLUSH_WRITE;
 
 5516            (p->
law == DAHDI_LAW_ALAW) ? PRI_LAYER_1_ALAW : PRI_LAYER_1_ULAW);
 
 5522#if defined(HAVE_SS7) 
 5554        openr2_calling_party_category_t chancat;
 
 5573        chancat = dahdi_r2_get_channel_category(ast);
 
 5574        callres = openr2_chan_make_call(p->r2chan, l, (
c + p->
stripmsd), chancat);
 
 5575        if (-1 == callres) {
 
 5580        p->mfcr2_call_accepted = 0;
 
 5581        p->mfcr2_progress_sent = 0;
 
 
 5655    } 
else if (
iflist == pvt) {
 
 5663    } 
else if (
ifend == pvt) {
 
 
 5674#if defined(HAVE_PRI) 
 5727#if defined(HAVE_PRI) 
 5765#if defined(HAVE_PRI) 
 5773static void dahdi_unlink_pri_pvt(
struct dahdi_pvt *pvt)
 
 5784    for (idx = 0; idx < 
pri->numchans; ++idx) {
 
 5795#if defined(HAVE_SS7) 
 5803static void dahdi_unlink_ss7_pvt(
struct dahdi_pvt *pvt)
 
 5814    for (idx = 0; idx < 
ss7->numchans; ++idx) {
 
 5825#if defined(HAVE_OPENR2) 
 5832static void dahdi_unlink_mfcr2_pvt(
struct dahdi_pvt *pvt)
 
 5835    struct dahdi_mfcr2 *mfcr2;
 
 5836    int should_destroy_link = 0;
 
 5841        openr2_chan_disable_read(pvt->r2chan);
 
 5845        for (idx = 0; idx < mfcr2->numchans; ++idx) {
 
 5846            if (mfcr2->pvts[idx] == pvt) {
 
 5847                ast_debug(1, 
"Removing MFC/R2 channel %d from the mfcr2 link\n", pvt->
channel);
 
 5848                mfcr2->pvts[idx] = 
NULL;
 
 5849                mfcr2->live_chans--;
 
 5853        if (!mfcr2->live_chans) {
 
 5854            ast_debug(1, 
"MFC/R2 link is now empty\n");
 
 5855            should_destroy_link = 1;
 
 5859    if (should_destroy_link) {
 
 5860        ast_debug(1, 
"MFC/R2 link is now empty\n");
 
 5861        mfcr2_queue_for_destruction(pvt);
 
 5889#if defined(HAVE_PRI) 
 5890    dahdi_unlink_pri_pvt(p);
 
 5892#if defined(HAVE_SS7) 
 5893    dahdi_unlink_ss7_pvt(p);
 
 5895#if defined(HAVE_OPENR2) 
 5896    dahdi_unlink_mfcr2_pvt(p);
 
 5904#if defined(HAVE_PRI) 
 5905    case DAHDI_IFLIST_NO_B_CHAN:
 
 5907            dahdi_nobch_extract(p->pri, p);
 
 5918#if defined(HAVE_PRI) 
 5923#if defined(HAVE_SS7) 
 
 5966        for (i = 0; i < 3; i++) {
 
 
 5978#if defined(HAVE_PRI) 
 5994#if defined(HAVE_PRI_SERVICE_MESSAGES) 
 5996            char db_chan_name[20];
 
 6001            snprintf(db_chan_name, 
sizeof(db_chan_name), 
"%s/%d:%d", dahdi_db, p->
span, chan);
 
 6002            if (!
ast_db_get(db_chan_name, SRVST_DBKEY, db_answer, 
sizeof(db_answer))) {
 
 6003                sscanf(db_answer, 
"%1c:%30d", &
state, &why);
 
 6013        ast_verb(3, 
"Unregistered channel %d\n", chan);
 
 6018#if defined(HAVE_PRI) 
 6021        if (!pris[
span].dchannels[0]) {
 
 
 6037#if defined(HAVE_PRI) 
 6038static char *dahdi_send_keypad_facility_app = 
"DAHDISendKeypadFacility";
 
 6040static int dahdi_send_keypad_facility_exec(
struct ast_channel *chan, 
const char *digits)
 
 6046        ast_debug(1, 
"No digit string sent to application!\n");
 
 6053        ast_debug(1, 
"Unable to find technology private\n");
 
 6063#if defined(HAVE_PRI) 
 6064#if defined(HAVE_PRI_PROG_W_CAUSE) 
 6065static char *dahdi_send_callrerouting_facility_app = 
"DAHDISendCallreroutingFacility";
 
 6067static int dahdi_send_callrerouting_facility_exec(
struct ast_channel *chan, 
const char *data)
 
 6080        ast_debug(1, 
"No data sent to application!\n");
 
 6084        ast_debug(1, 
"Only DAHDI technology accepted!\n");
 
 6089        ast_debug(1, 
"Unable to find technology private\n");
 
 6096        ast_debug(1, 
"callrerouting attempted on non-ISDN channel %s\n",
 
 6105        ast_log(
LOG_WARNING, 
"callrerouting facility requires at least destination number argument\n");
 
 6110        ast_log(
LOG_WARNING, 
"Callrerouting Facility without original called number argument\n");
 
 6115        ast_log(
LOG_NOTICE, 
"Callrerouting Facility without diversion reason argument, defaulting to unknown\n");
 
 6134#if defined(HAVE_OPENR2) 
 6135static const char * 
const dahdi_accept_r2_call_app = 
"DAHDIAcceptR2Call";
 
 6137static int dahdi_accept_r2_call_exec(
struct ast_channel *chan, 
const char *data)
 
 6140    openr2_call_mode_t accept_mode;
 
 6141    int res, timeout, maxloops;
 
 6150        ast_debug(1, 
"No data sent to application!\n");
 
 6155        ast_debug(1, 
"Only DAHDI technology accepted!\n");
 
 6161        ast_debug(1, 
"Unable to find technology private!\n");
 
 6169        ast_log(
LOG_WARNING, 
"DAHDIAcceptR2Call requires 'yes' or 'no' for the charge parameter\n");
 
 6174    if (!p->mfcr2 || !p->mfcr2call) {
 
 6180    if (p->mfcr2_call_accepted) {
 
 6185    accept_mode = 
ast_true(
args.charge) ? OR2_CALL_WITH_CHARGE : OR2_CALL_NO_CHARGE;
 
 6186    if (openr2_chan_accept_call(p->r2chan, accept_mode)) {
 
 6197    while (maxloops > 0) {
 
 6226        if (p->mfcr2_call_accepted) {
 
 6228            ast_debug(1, 
"Accepted MFC/R2 call!\n");
 
 6239static openr2_call_disconnect_cause_t dahdi_ast_cause_to_r2_cause(
int cause)
 
 6241    openr2_call_disconnect_cause_t r2cause = OR2_CAUSE_NORMAL_CLEARING;
 
 6246        r2cause = OR2_CAUSE_BUSY_NUMBER;
 
 6251        r2cause = OR2_CAUSE_NETWORK_CONGESTION;
 
 6255        r2cause = OR2_CAUSE_UNALLOCATED_NUMBER;
 
 6260        r2cause = OR2_CAUSE_OUT_OF_ORDER;
 
 6265        r2cause = OR2_CAUSE_NO_ANSWER;
 
 6269        r2cause = OR2_CAUSE_NORMAL_CLEARING;
 
 6272    ast_debug(1, 
"ast cause %d resulted in openr2 cause %d/%s\n",
 
 6273            cause, r2cause, openr2_proto_get_disconnect_string(r2cause));
 
 6282        struct dahdi_bufferinfo bi = {
 
 6290        if ((bpres = ioctl(p->
subs[
SUB_REAL].
dfd, DAHDI_SET_BUFINFO, &bi)) < 0) {
 
 
 6307    struct dahdi_params par;
 
 6335#if defined(HAVE_PRI) 
 6398#if defined(HAVE_SS7) 
 6477    ast_debug(1, 
"Hangup: channel: %d index = %d, normal = %d, callwait = %d, thirdcall = %d\n",
 
 6494                ast_debug(1, 
"Normal call hung up with both three way call and a call waiting call in place?\n");
 
 6497                    ast_debug(1, 
"We were flipped over to the callwait, moving back and not owning.\n");
 
 6504                    ast_debug(1, 
"We were in the threeway and have a callwait still.  Ditching the threeway.\n");
 
 6510                        ast_debug(1, 
"Call was complete, setting owner to former third call\n");
 
 6514                        ast_debug(1, 
"Call was incomplete, setting owner to NULL\n");
 
 6533                    ast_debug(1, 
"Call was complete, setting owner to former third call\n");
 
 6537                    ast_debug(1, 
"Call was incomplete, setting owner to NULL\n");
 
 6598        if (p->mfcr2 && p->mfcr2call && openr2_chan_get_direction(p->r2chan) != OR2_DIR_STOPPED) {
 
 6601            if (openr2_chan_get_direction(p->r2chan) == OR2_DIR_BACKWARD && p->mfcr2_forced_release) {
 
 6602                dahdi_r2_disconnect_call(p, OR2_CAUSE_FORCED_RELEASE);
 
 6605                int r2cause_user = r2causestr ? atoi(r2causestr) : 0;
 
 6606                openr2_call_disconnect_cause_t r2cause = r2cause_user ? dahdi_ast_cause_to_r2_cause(r2cause_user)
 
 6608                dahdi_r2_disconnect_call(p, r2cause);
 
 6610        } 
else if (p->mfcr2call) {
 
 6636            memset(&par, 0, 
sizeof(par));
 
 6641                ast_debug(1, 
"Hanging up channel %d, offhook = %d\n", p->
channel, par.rxisoffhook);
 
 6644                if ((par.rxisoffhook) && (!(p->
radio || (p->
oprmode < 0))))
 
 6737                ast_debug(1, 
"Channel %d is no longer eligible for reorigination (went back on hook or became in use)\n", p->
channel);
 
 
 6782#if defined(HAVE_PRI) 
 6787#if defined(HAVE_SS7) 
 6794        if (!p->mfcr2_call_accepted) {
 
 6797            p->mfcr2_answer_pending = 1;
 
 6798            if (p->mfcr2_charge_calls) {
 
 6799                ast_debug(1, 
"Accepting MFC/R2 call with charge before answering on chan %d\n", p->
channel);
 
 6800                openr2_chan_accept_call(p->r2chan, OR2_CALL_WITH_CHARGE);
 
 6802                ast_debug(1, 
"Accepting MFC/R2 call with no charge before answering on chan %d\n", p->
channel);
 
 6803                openr2_chan_accept_call(p->r2chan, OR2_CALL_NO_CHARGE);
 
 
 6839    int val = DAHDI_TONEDETECT_ON | DAHDI_TONEDETECT_MUTE;
 
 
 6860    if (!p || !data || (*datalen < 1)) {
 
 6871            *cp = p->
tdd ? 1 : 0;
 
 6885#if defined(HAVE_PRI) 
 6886#if defined(HAVE_PRI_CCSS) 
 
 6914    if (!p || !data || (datalen < 1)) {
 
 6921        scp = (
signed char *) data;
 
 6930        scp = (
signed char *) data;
 
 6968        ast_debug(1, 
"Set option TDD MODE, value: %s(%d) on %s\n",
 
 6973            unsigned char mybuf[41000];
 
 6975            int size, res, fd, 
len;
 
 6976            struct pollfd fds[1];
 
 6979            memset(
buf, 0x7f, 
sizeof(mybuf)); 
 
 6995                fds[0].events = POLLPRI | POLLOUT;
 
 6997                res = poll(fds, 1, -1);
 
 7003                if (fds[0].revents & POLLPRI)
 
 7005                if (!(fds[0].revents & POLLOUT)) {
 
 7009                res = write(fd, 
buf, size);
 
 7011                    if (res == -1) 
return -1;
 
 7035        ast_debug(1, 
"Set option RELAX DTMF, value: %s(%d) on %s\n",
 
 7040#if defined(HAVE_PRI) 
 7080        ast_debug(1, 
"Set Operator Services mode, value: %d on %s/%s\n",
 
 
 7133    if (!strcasecmp(data, 
"rxgain")) {
 
 7137    } 
else if (!strcasecmp(data, 
"txgain")) {
 
 7141    } 
else if (!strcasecmp(data, 
"dahdi_channel")) {
 
 7145    } 
else if (!strcasecmp(data, 
"dahdi_span")) {
 
 7149    } 
else if (!strcasecmp(data, 
"dahdi_group")) {
 
 7153    } 
else if (!strcasecmp(data, 
"dahdi_type")) {
 
 7156#if defined(HAVE_OPENR2) 
 7161#if defined(HAVE_PRI) 
 7169#if defined(HAVE_SS7) 
 7180#if defined(HAVE_PRI) 
 7181#if defined(HAVE_PRI_REVERSE_CHARGE) 
 7182    } 
else if (!strcasecmp(data, 
"reversecharge")) {
 
 7195#if defined(HAVE_PRI_SETUP_KEYPAD) 
 7196    } 
else if (!strcasecmp(data, 
"keypad_digits")) {
 
 7210    } 
else if (!strcasecmp(data, 
"no_media_path")) {
 
 7227    } 
else if (!strcasecmp(data, 
"dialmode")) {
 
 
 7265    char policy_str[21] = 
"";
 
 7267    if ((res = sscanf(parse, 
"%30d,%20s", num_buffers, policy_str)) != 2) {
 
 7271    if (*num_buffers < 0) {
 
 7275    if (!strcasecmp(policy_str, 
"full")) {
 
 7276        *policy = DAHDI_POLICY_WHEN_FULL;
 
 7277    } 
else if (!strcasecmp(policy_str, 
"immediate")) {
 
 7278        *policy = DAHDI_POLICY_IMMEDIATE;
 
 7279#if defined(HAVE_DAHDI_HALF_FULL) 
 7280    } 
else if (!strcasecmp(policy_str, 
"half")) {
 
 7281        *policy = DAHDI_POLICY_HALF_FULL;
 
 
 7301    if (!strcasecmp(data, 
"buffers")) {
 
 7302        int num_bufs, policy;
 
 7305            struct dahdi_bufferinfo bi = {
 
 7306                .txbufpolicy = policy,
 
 7307                .rxbufpolicy = policy,
 
 7309                .numbufs = num_bufs,
 
 7313            if ((bpres = ioctl(p->
subs[
SUB_REAL].
dfd, DAHDI_SET_BUFINFO, &bi)) < 0) {
 
 7321    } 
else if (!strcasecmp(data, 
"echocan_mode")) {
 
 7322        if (!strcasecmp(
value, 
"on")) {
 
 7326        } 
else if (!strcasecmp(
value, 
"off")) {
 
 7330#ifdef HAVE_DAHDI_ECHOCANCEL_FAX_MODE 
 7331        } 
else if (!strcasecmp(
value, 
"fax")) {
 
 7342        } 
else if (!strcasecmp(
value, 
"voice")) {
 
 7358    } 
else if (!strcasecmp(data, 
"dialmode")) {
 
 7369        if (!strcasecmp(
value, 
"pulse")) {
 
 7371        } 
else if (!strcasecmp(
value, 
"dtmf") || !strcasecmp(
value, 
"tone")) {
 
 7373        } 
else if (!strcasecmp(
value, 
"none")) {
 
 7375        } 
else if (!strcasecmp(
value, 
"both")) {
 
 7382    } 
else if (!strcasecmp(data, 
"waitfordialtone")) {
 
 
 7422            if (!slave || (master->
slaves[x] == slave)) {
 
 
 7463    if (!slave || !master) {
 
 7468        if (!master->
slaves[x]) {
 
 7469            master->
slaves[x] = slave;
 
 
 7492    if (p->
owner == oldchan) {
 
 7495    for (x = 0; x < 3; x++) {
 
 7505#if defined(HAVE_PRI) 
 7509#if defined(HAVE_SS7) 
 
 7578    ast_verb(3, 
"TRANSFERRING %s to %s\n",
 
 
 7603    struct dahdi_confinfo ci;
 
 7607    memset(&ci, 0, 
sizeof(ci));
 
 7616        ast_verb(3, 
"Avoiding 3-way call when in an external conference\n");
 
 
 7630    struct dahdi_spaninfo zi;
 
 7631    struct dahdi_params params;
 
 7633    memset(&zi, 0, 
sizeof(zi));
 
 7634    zi.spanno = p->
span;
 
 7637        if (zi.alarms != DAHDI_ALARM_NONE)
 
 7645    memset(¶ms, 0, 
sizeof(params));
 
 7646    if ((res = ioctl(p->
subs[
SUB_REAL].
dfd, DAHDI_GET_PARAMS, ¶ms)) >= 0)
 
 7647        return params.chan_alarms;
 
 7651    return DAHDI_ALARM_NONE;
 
 
 7659    ast_debug(1, 
"%s DTMF digit: 0x%02X '%c' on %s\n",
 
 7676        *dest = &p->
subs[idx].
f;
 
 7680                ast_debug(1, 
"Got some DTMF, but it's for the CAS\n");
 
 7689        *dest = &p->
subs[idx].
f;
 
 7696                    struct dahdi_bufferinfo bi = {
 
 7703                    if ((res = ioctl(p->
subs[idx].
dfd, DAHDI_SET_BUFINFO, &bi)) < 0) {
 
 7741                    ast_debug(1, 
"Already in a fax extension, not redirecting\n");
 
 7750        *dest = &p->
subs[idx].
f;
 
 
 7760        "Alarm", alarm_txt);
 
 
 7779        "Alarm", alarm_txt);
 
 
 7789    const char *alarm_str;
 
 7791#if defined(HAVE_PRI) 
 
 7832    p->
subs[idx].
f.
src = 
"dahdi_handle_event";
 
 7834    f = &p->
subs[idx].
f;
 
 7844    if (res & (DAHDI_EVENT_PULSEDIGIT | DAHDI_EVENT_DTMFUP)) {
 
 7845        p->
pulsedial = (res & DAHDI_EVENT_PULSEDIGIT) ? 1 : 0;
 
 7847#if defined(HAVE_PRI) 
 7865    if (res & DAHDI_EVENT_DTMFDOWN) {
 
 7866        ast_debug(1, 
"DTMF Down '%c'\n", res & 0xff);
 
 7867#if defined(HAVE_PRI) 
 7882        return &p->
subs[idx].
f;
 
 7886    case DAHDI_EVENT_EC_DISABLED:
 
 7890#ifdef HAVE_DAHDI_ECHOCANCEL_FAX_MODE 
 7891    case DAHDI_EVENT_TX_CED_DETECTED:
 
 7892        ast_verb(3, 
"Channel %d detected a CED tone towards the network.\n", p->
channel);
 
 7894    case DAHDI_EVENT_RX_CED_DETECTED:
 
 7895        ast_verb(3, 
"Channel %d detected a CED tone from the network.\n", p->
channel);
 
 7897    case DAHDI_EVENT_EC_NLP_DISABLED:
 
 7898        ast_verb(3, 
"Channel %d echo canceler disabled its NLP.\n", p->
channel);
 
 7900    case DAHDI_EVENT_EC_NLP_ENABLED:
 
 7901        ast_verb(3, 
"Channel %d echo canceler enabled its NLP.\n", p->
channel);
 
 7904    case DAHDI_EVENT_BITSCHANGED:
 
 7910            openr2_chan_handle_cas(p->r2chan);
 
 7916    case DAHDI_EVENT_PULSE_START:
 
 7919            tone_zone_play_tone(p->
subs[idx].
dfd, -1);
 
 7921    case DAHDI_EVENT_DIALCOMPLETE:
 
 7923#if defined(HAVE_PRI) 
 7928            if (ioctl(p->
subs[idx].
dfd, DAHDI_DIALING, &x) == -1) {
 
 7929                ast_debug(1, 
"DAHDI_DIALING ioctl failed on %s: %s\n",
 
 7954        if (ioctl(p->
subs[idx].
dfd,DAHDI_DIALING,&x) == -1) {
 
 7963                p->
dop.op = DAHDI_DIAL_OP_REPLACE;
 
 7982                        ast_debug(1, 
"Done dialing, but waiting for progress detection before doing more...\n");
 
 8007    case DAHDI_EVENT_ALARM:
 
 8009#if defined(HAVE_PRI) 
 8014#if defined(HAVE_SS7) 
 8026        if (!p->pri || !p->pri->pri || pri_get_timer(p->pri->pri, PRI_TIMER_T309) < 0) {
 
 8032#if defined(HAVE_SS7) 
 8040    case DAHDI_EVENT_ONHOOK:
 
 8074                    ast_verb(3, 
"Channel %d still has (callwait) call, ringing phone\n", p->
channel);
 
 8089                    unsigned int mssinceflash;
 
 8100                        if (p->
owner != ast) {
 
 8110                    ast_debug(1, 
"Last flash was %u ms ago\n", mssinceflash);
 
 8117                        ast_debug(1, 
"Looks like a bounced flash, hanging up both calls on %d\n", p->
channel);
 
 8163    case DAHDI_EVENT_RINGOFFHOOK:
 
 8193                int numchars = snprintf(p->
dop.dialstr, 
sizeof(p->
dop.dialstr), 
"M*0%s#", 
c);
 
 8194                if (numchars >= 
sizeof(p->
dop.dialstr)) {
 
 8201            if (strlen(p->
dop.dialstr) > 4) {
 
 8206                p->
dop.dialstr[strlen(p->
dop.dialstr)-2] = 
'\0';
 
 8215            return &p->
subs[idx].
f;
 
 8247                        p->
dop.dialstr[0] = 
'\0';
 
 8250                        ast_debug(1, 
"Sent FXO deferred digit string: %s\n", p->
dop.dialstr);
 
 8255                    p->
dop.dialstr[0] = 
'\0';
 
 8259                return &p->
subs[idx].
f;
 
 8266                return &p->
subs[idx].
f;
 
 8279                    res = tone_zone_play_tone(p->
subs[
SUB_REAL].
dfd, DAHDI_TONE_DIALTONE);
 
 8294            ast_debug(1, 
"Setting IDLE polarity due " 
 8295                "to ring. Old polarity was %d\n",
 
 8338    case DAHDI_EVENT_RINGBEGIN:
 
 8349    case DAHDI_EVENT_RINGERON:
 
 8351    case DAHDI_EVENT_NOALARM:
 
 8353#if defined(HAVE_PRI) 
 8358#if defined(HAVE_SS7) 
 8369    case DAHDI_EVENT_WINKFLASH:
 
 8371        if (p->
radio) 
break;
 
 8375            struct dahdi_params par;
 
 8377            memset(&par, 0, 
sizeof(par));
 
 8380                if (!par.rxisoffhook)
 
 8398            ast_debug(1, 
"Winkflash, index: %d, normal: %d, callwait: %d, thirdcall: %d\n",
 
 8462                        ast_debug(1, 
"Flash when call not up or ringing\n");
 
 8493                    res = tone_zone_play_tone(p->
subs[
SUB_REAL].
dfd, DAHDI_TONE_DIALRECALL);
 
 8501                        res = tone_zone_play_tone(p->
subs[
SUB_REAL].
dfd, DAHDI_TONE_CONGESTION);
 
 8517                    ast_debug(1, 
"Got flash with three way call up, dropping last call on %d\n", p->
channel);
 
 8535                        ast_verb(3, 
"Building conference call with %s and %s\n",
 
 8585                snprintf(p->
dop.dialstr, 
sizeof(p->
dop.dialstr), 
"M*%d%s#",
 
 8594                ast_log(
LOG_WARNING, 
"Received unexpected wink on channel of type SIG_FEATDMF_TA\n");
 
 8611                    p->
dop.dialstr[0] = 
'\0';
 
 8614                    ast_debug(1, 
"Sent deferred digit string: %s\n", p->
dop.dialstr);
 
 8616            p->
dop.dialstr[0] = 
'\0';
 
 8622    case DAHDI_EVENT_HOOKCOMPLETE:
 
 8640                    p->
dop.dialstr[0] = 
'\0';
 
 8643                    ast_debug(1, 
"Sent deferred digit string: %s\n", p->
dop.dialstr);
 
 8645            p->
dop.dialstr[0] = 
'\0';
 
 8646            p->
dop.op = DAHDI_DIAL_OP_REPLACE;
 
 8656            ast_debug(1, 
"Got hook complete in MF FGD, waiting for wink now on channel %d\n",p->
channel);
 
 8662    case DAHDI_EVENT_POLARITY:
 
 8674                ast_debug(1, 
"Answering on polarity switch!\n");
 
 8689            ast_debug(1, 
"Polarity Reversal event occurred - DEBUG 1: channel %d, state %u, pol= %d, aonp= %d, honp= %d, pdelay= %d, tv= %" PRIi64 
"\n", p->
channel, 
ast_channel_state(ast), p->
polarity, p->
answeronpolarityswitch, p->
hanguponpolarityswitch, p->
polarityonanswerdelay, 
ast_tvdiff_ms(
ast_tvnow(), p->
polaritydelaytv) );
 
 8692                ast_debug(1, 
"Polarity Reversal detected and now Hanging up on channel %d\n", p->
channel);
 
 8703        ast_debug(1, 
"Polarity Reversal event occurred - DEBUG 2: channel %d, state %u, pol= %d, aonp= %d, honp= %d, pdelay= %d, tv= %" PRIi64 
"\n", p->
channel, 
ast_channel_state(ast), p->
polarity, p->
answeronpolarityswitch, p->
hanguponpolarityswitch, p->
polarityonanswerdelay, 
ast_tvdiff_ms(
ast_tvnow(), p->
polaritydelaytv) );
 
 8706        ast_debug(1, 
"Dunno what to do with event %d on channel %d\n", res, p->
channel);
 
 8708    return &p->
subs[idx].
f;
 
 
 8730    p->
subs[idx].
f.
src = 
"dahdi_exception";
 
 8746        if ((res != DAHDI_EVENT_RINGEROFF) && (res != DAHDI_EVENT_RINGERON) &&
 
 8747            (res != DAHDI_EVENT_HOOKCOMPLETE)) {
 
 8748            ast_debug(1, 
"Restoring owner of channel %d on event %d\n", p->
channel, res);
 
 8756        case DAHDI_EVENT_ONHOOK:
 
 8768        case DAHDI_EVENT_RINGOFFHOOK:
 
 8776        case DAHDI_EVENT_HOOKCOMPLETE:
 
 8777        case DAHDI_EVENT_RINGERON:
 
 8778        case DAHDI_EVENT_RINGEROFF:
 
 8781        case DAHDI_EVENT_WINKFLASH:
 
 8788                    if (usedindex > -1) {
 
 8805        f = &p->
subs[idx].
f;
 
 8811    if (ast != p->
owner) {
 
 8815        f = &p->
subs[idx].
f;
 
 
 8909        struct dahdi_params ps;
 
 8911        memset(&ps, 0, 
sizeof(ps));
 
 8927        return &p->
subs[idx].
f;
 
 8930        if (!(--p->
ringt)) {
 
 8938        openr2_chan_process_event(p->r2chan);
 
 8939        if (OR2_DIR_FORWARD == openr2_chan_get_direction(p->r2chan)) {
 
 8943            if (p->mfcr2_call_accepted &&
 
 8944                !p->mfcr2_progress_sent &&
 
 8946                ast_debug(1, 
"Enqueuing progress frame after R2 accept in chan %d\n", p->
channel);
 
 8948                p->mfcr2_progress_sent = 1;
 
 8961        return &p->
subs[idx].
f;
 
 8970        return &p->
subs[idx].
f;
 
 8979        return &p->
subs[idx].
f;
 
 8988        return &p->
subs[idx].
f;
 
 8991    if (p->mfcr2 && openr2_chan_get_read_enabled(p->r2chan)) {
 
 9007        return &p->
subs[idx].
f;
 
 9017        return &p->
subs[idx].
f;
 
 9027        return &p->
subs[idx].
f;
 
 9069            if (
errno == EAGAIN) {
 
 9072                return &p->
subs[idx].
f;
 
 9073            } 
else if (
errno == ELAST) {
 
 9115            return &p->
subs[idx].
f;
 
 9123                ast_verb(3, 
"CPE does not support Call Waiting Caller*ID.\n");
 
 9180            ast_debug(1, 
"Channel driver fax CNG detection timeout on %s\n",
 
 9225                    ast_debug(1, 
"Absorbing inband %s DTMF digit: 0x%02X '%c' on %s\n",
 
 9248                        ast_debug(1, 
"Got 10 samples of dialtone!\n");
 
 9252                                p->
dop.dialstr[0] = 
'\0';
 
 9257                                ast_debug(1, 
"Sent deferred digit string: %s\n", p->
dop.dialstr);
 
 9259                                p->
dop.dialstr[0] = 
'\0';
 
 9260                                p->
dop.op = DAHDI_DIAL_OP_REPLACE;
 
 9269        f = &p->
subs[idx].
f;
 
 
 9321        res = write(fd, 
buf, size);
 
 
 9366            if (mssinceflash >= 1000) {
 
 9384        ast_debug(5, 
"Dropping frame since I'm still dialing on %s...\n",
 
 9390        ast_debug(5, 
"Dropping frame since there is no active owner on %s...\n",
 
 9396        ast_debug(5, 
"Dropping frame since I've still got a callerid spill on %s...\n",
 
 
 9438    int func = DAHDI_FLASH;
 
 9443#if defined(HAVE_PRI) 
 9449#if defined(HAVE_SS7) 
 9459    if (p->mfcr2 && !p->mfcr2_call_accepted) {
 
 9468        switch (condition) {
 
 9470            res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_BUSY);
 
 9473            res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_RINGTONE);
 
 9534                p->
dop.dialstr[0] = 
'\0';
 
 9547            res = tone_zone_play_tone(p->
subs[idx].
dfd, -1);
 
 
 9557#if defined(HAVE_PRI) 
 9572#if defined(HAVE_PRI) 
 9573    } 
else if (i->pri) {
 
 9575        y = ++i->pri->new_chan_seq;
 
 9593            for (x = 0; x < 3; ++x) {
 
 
 9631#if defined(HAVE_PRI) 
 9650    tmp = 
ast_channel_alloc(0, 
state, i->
cid_num, i->
cid_name, i->
accountcode, i->
exten, i->
context, assignedids, requestor, i->
amaflags, 
"DAHDI/%s", 
ast_str_buffer(chan_name));
 
 9664#if defined(HAVE_PRI) 
 9672        if (law == DAHDI_LAW_ALAW) {
 
 9682                ? DAHDI_LAW_ALAW : DAHDI_LAW_MULAW;
 
 9717        x = DAHDI_TONEDETECT_ON | DAHDI_TONEDETECT_MUTE;
 
 9718        if (ioctl(i->
subs[idx].
dfd, DAHDI_TONEDETECT, &x)) {
 
 9736#if defined(HAVE_PRI) || defined(HAVE_SS7) 
 9770        ast_channel_parkinglot_set(tmp, i->
parkinglot);
 
 9772        ast_channel_language_set(tmp, i->
language);
 
 9799#if defined(HAVE_PRI) || defined(HAVE_SS7) 
 9828    dashptr = strrchr(device_name, 
'-');
 
 9835    for (v = i->
vars ; v ; v = v->
next)
 
 
 9875        if (strchr(term, 
c))
 
 
 9887        j = DAHDI_IOMUX_SIGEVENT;
 
 9889        if (ioctl(p->
subs[idx].
dfd,DAHDI_IOMUX,&j) == -1) 
return(-1);
 
 9891        if (j & DAHDI_IOMUX_SIGEVENT) 
break;
 
 9894    if (ioctl(p->
subs[idx].
dfd,DAHDI_GETEVENT,&j) == -1) 
return(-1);
 
 
 9934        return dahdichan->
dnd;
 
 9939    ast_verb(3, 
"%s DND on channel %d\n",
 
 9940            flag? 
"Enabled" : 
"Disabled",
 
 
 9948    int extlen = strlen(exten);
 
 9954    if (extlen < strlen(pickupexten) && !strncmp(pickupexten, exten, extlen)) {
 
 9958    if (exten[0] == 
'*' && extlen < 3) {
 
 
 9979    unsigned char buf[256];
 
10000    const char *pickupexten;
 
10024        ast_log(
LOG_ERROR, 
"Unable to retrieve pickup configuration options. Unable to detect call pickup extension\n");
 
10027        pickupexten = 
ast_strdupa(pickup_cfg->pickupexten);
 
10052        res = tone_zone_play_tone(p->
subs[idx].
dfd, -1);
 
10062        memset(dtmfbuf, 0, 
sizeof(dtmfbuf));
 
10077                    res = 
my_getsigstr(chan, dtmfbuf + strlen(dtmfbuf), 
"*", 3000);
 
10087                if (res <= 0) 
break;
 
10096                if ((p->
sig == 
SIG_FEATDMF) && (dtmfbuf[1] != 
'0') && (strlen(dtmfbuf) != 14))
 
10102                    if (res <= 0) 
break;
 
10110                    res = 
my_getsigstr(chan, dtmfbuf + strlen(dtmfbuf), 
"#", 3000);
 
10127                        res = 
my_getsigstr(chan, dtmfbuf + strlen(dtmfbuf), 
"*", 3000);
 
10134                dtmfbuf[
len] = 
'\0';
 
10143                        ast_debug(1, 
"waitfordigit returned < 0...\n");
 
10147                        dtmfbuf[
len++] = res;
 
10148                        dtmfbuf[
len] = 
'\0';
 
10160        } 
else if (res < 0) {
 
10161            ast_debug(1, 
"Got hung up before digits finished\n");
 
10176            if ((res > 0) && (strlen(anibuf) > 2)) {
 
10177                if (anibuf[strlen(anibuf) - 1] == 
'#')
 
10178                    anibuf[strlen(anibuf) - 1] = 0;
 
10189            if (exten[0] == 
'*') {
 
10190                char *stringp=
NULL;
 
10194                s1 = 
strsep(&stringp, 
"*");
 
10195                s2 = 
strsep(&stringp, 
"*");
 
10208            if (exten[0] == 
'*') {
 
10209                char *stringp=
NULL;
 
10213                s1 = 
strsep(&stringp, 
"#");
 
10214                s2 = 
strsep(&stringp, 
"#");
 
10228            if (exten[0] == 
'*') {
 
10229                char *stringp=
NULL;
 
10233                s1 = 
strsep(&stringp, 
"#");
 
10234                s2 = 
strsep(&stringp, 
"#");
 
10235                if (s2 && (*(s2 + 1) == 
'0')) {
 
10245            if (exten[0] == 
'*') {
 
10246                char *stringp=
NULL;
 
10250                s1 = 
strsep(&stringp, 
"#");
 
10284                res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_CONGESTION);
 
10290            res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_INFO);
 
10298            res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_CONGESTION);
 
10313            int is_exten_parking = 0;
 
10323                ast_debug(1, 
"waitfordigit returned < 0...\n");
 
10324                res = tone_zone_play_tone(p->
subs[idx].
dfd, -1);
 
10328                ast_debug(1,
"waitfordigit returned '%c' (%d), timeout = %d\n", res, res, timeout);
 
10333                tone_zone_play_tone(p->
subs[idx].
dfd, -1);
 
10335                tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALTONE);
 
10346                        res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALRECALL);
 
10350                        res = tone_zone_play_tone(p->
subs[idx].
dfd, -1);
 
10352                        memset(exten, 0, 
sizeof(exten));
 
10353                        res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALTONE);
 
10357                        res = tone_zone_play_tone(p->
subs[idx].
dfd, -1);
 
10376                            res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_CONGESTION);
 
10385            } 
else if (res == 0) {
 
10386                ast_debug(1, 
"not enough digits (and no ambiguous match)...\n");
 
10387                res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_CONGESTION);
 
10391            } 
else if (p->
callwaiting && !strcmp(exten, 
"*70")) {
 
10395                res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALRECALL);
 
10401                ioctl(p->
subs[idx].
dfd,DAHDI_CONFDIAG,&
len);
 
10402                memset(exten, 0, 
sizeof(exten));
 
10405            } 
else if (!strcmp(exten, pickupexten)) {
 
10421                        ast_debug(1, 
"No call pickup possible...\n");
 
10422                        res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_CONGESTION);
 
10433            } 
else if (!p->
hidecallerid && !strcmp(exten, 
"*67")) {
 
10441                res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALRECALL);
 
10447                memset(exten, 0, 
sizeof(exten));
 
10449            } 
else if (p->
callreturn && !strcmp(exten, 
"*69")) {
 
10450                res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALRECALL);
 
10452            } 
else if (!strcmp(exten, 
"*78")) {
 
10455                res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALRECALL);
 
10457                memset(exten, 0, 
sizeof(exten));
 
10459            } 
else if (!strcmp(exten, 
"*79")) {
 
10462                res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALRECALL);
 
10464                memset(exten, 0, 
sizeof(exten));
 
10467                res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALRECALL);
 
10469                memset(exten, 0, 
sizeof(exten));
 
10472                ast_verb(3, 
"Cancelling call forwarding on channel %d\n", p->
channel);
 
10473                res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALRECALL);
 
10476                memset(exten, 0, 
sizeof(exten));
 
10489                if (bridge_channel) {
 
10508            } 
else if (p->
hidecallerid && !strcmp(exten, 
"*82")) {
 
10513                res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALRECALL);
 
10519                memset(exten, 0, 
sizeof(exten));
 
10521            } 
else if (!strcmp(exten, 
"*0")) {
 
10528                if (nbridge && bridged) {
 
10531                if (nbridge && pbridge &&
 
10535                    int func = DAHDI_FLASH;
 
10537                    p->
dop.dialstr[0] = 
'\0';
 
10550                    tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_CONGESTION);
 
10552                    tone_zone_play_tone(p->
subs[idx].
dfd, -1);
 
10570                tone_zone_play_tone(p->
subs[idx].
dfd, -1);
 
10580            if (smdi_msg != 
NULL) {
 
10583                if (smdi_msg->
type == 
'B')
 
10585                else if (smdi_msg->
type == 
'N')
 
10633                            "Exiting simple switch\n");
 
10658                ast_debug(1, 
"CID got string '%s'\n", dtmfbuf);
 
10671                    struct timeval start;
 
10682                        i = DAHDI_IOMUX_READ | DAHDI_IOMUX_SIGEVENT;
 
10683                        if ((res = ioctl(p->
subs[idx].
dfd, DAHDI_IOMUX, &i))) {
 
10689                        if (i & DAHDI_IOMUX_SIGEVENT) {
 
10692                            if (res == DAHDI_EVENT_NOALARM) {
 
10697                                if (res == DAHDI_EVENT_RINGBEGIN) {
 
10705                        } 
else if (i & DAHDI_IOMUX_READ) {
 
10708                                if (
errno != ELAST) {
 
10729                                    "Failed to decode CallerID on channel '%s'\n",
 
10734                            else if (samples > (8000 * 10))
 
10758                                "Exiting simple switch\n");
 
10779                        for (receivedRingT = 0; receivedRingT < 
ARRAY_LEN(curRingData); receivedRingT++)
 
10780                            curRingData[receivedRingT] = 0;
 
10791                            i = DAHDI_IOMUX_READ | DAHDI_IOMUX_SIGEVENT;
 
10792                            if ((res = ioctl(p->
subs[idx].
dfd, DAHDI_IOMUX, &i))) {
 
10798                            if (i & DAHDI_IOMUX_SIGEVENT) {
 
10801                                if (res == DAHDI_EVENT_NOALARM) {
 
10807                                curRingData[receivedRingT] = p->
ringt;
 
10813                                if (++receivedRingT == 
ARRAY_LEN(curRingData))
 
10815                            } 
else if (i & DAHDI_IOMUX_READ) {
 
10818                                    if (
errno != ELAST) {
 
10826                                if (p->
ringt > 0) {
 
10827                                    if (!(--p->
ringt)) {
 
10835                        ast_verb(3, 
"Detected ring pattern: %d,%d,%d\n",curRingData[0],curRingData[1],curRingData[2]);
 
10836                        for (counter = 0; counter < 3; counter++) {
 
10840                            for (counter1 = 0; counter1 < 3; counter1++) {
 
10843                                    ast_verb(3, 
"Pattern ignore (-1) detected, so matching pattern %d regardless.\n",
 
10844                                    curRingData[counter1]);
 
10848                                    ast_verb(3, 
"Ring pattern matched in range: %d to %d\n",
 
10855                            if (distMatches == 3) {
 
10873                    "state, but I have nothing to do. " 
10874                    "Terminating simple switch, should be " 
10875                    "restarted by the actual ring.\n",
 
10884                struct timeval start;
 
10897                            "Exiting simple switch\n");
 
10921                ast_debug(1, 
"CID is '%s', flags %d\n",
 
10940                    for (receivedRingT = 0; receivedRingT < 
ARRAY_LEN(curRingData); receivedRingT++)
 
10941                        curRingData[receivedRingT] = 0;
 
10954                        i = DAHDI_IOMUX_READ | DAHDI_IOMUX_SIGEVENT;
 
10955                        if ((res = ioctl(p->
subs[idx].
dfd, DAHDI_IOMUX, &i))) {
 
10961                        if (i & DAHDI_IOMUX_SIGEVENT) {
 
10964                            if (res == DAHDI_EVENT_NOALARM) {
 
10969                                ast_debug(1, 
"Hanging up due to polarity reversal on channel %d while detecting callerid\n", p->
channel);
 
10978                            curRingData[receivedRingT] = p->
ringt;
 
10984                            if (++receivedRingT == 
ARRAY_LEN(curRingData))
 
10986                        } 
else if (i & DAHDI_IOMUX_READ) {
 
10989                                if (
errno != ELAST) {
 
10997                            if (p->
ringt > 0) {
 
10998                                if (!(--p->
ringt)) {
 
11011                                    "Failed to decode CallerID on channel '%s'\n",
 
11016                            else if (
samples > (8000 * 10))
 
11026                        for (receivedRingT = 0; receivedRingT < 3; receivedRingT++) {
 
11027                            curRingData[receivedRingT] = 0;
 
11030                        ast_verb(3, 
"Detecting post-CID distinctive ring\n");
 
11032                            i = DAHDI_IOMUX_READ | DAHDI_IOMUX_SIGEVENT;
 
11033                            if ((res = ioctl(p->
subs[idx].
dfd, DAHDI_IOMUX, &i))) {
 
11039                            if (i & DAHDI_IOMUX_SIGEVENT) {
 
11042                                if (res == DAHDI_EVENT_NOALARM) {
 
11048                                curRingData[receivedRingT] = p->
ringt;
 
11054                                if (++receivedRingT == 
ARRAY_LEN(curRingData))
 
11056                            } 
else if (i & DAHDI_IOMUX_READ) {
 
11059                                    if (
errno != ELAST) {
 
11067                                if (p->
ringt > 0) {
 
11068                                    if (!(--p->
ringt)) {
 
11078                        ast_verb(3, 
"Detected ring pattern: %d,%d,%d\n",curRingData[0],curRingData[1],curRingData[2]);
 
11080                        for (counter = 0; counter < 3; counter++) {
 
11084                            ast_verb(3, 
"Checking %d,%d,%d\n",
 
11089                            for (counter1 = 0; counter1 < 3; counter1++) {
 
11092                                    ast_verb(3, 
"Pattern ignore (-1) detected, so matching pattern %d regardless.\n",
 
11093                                    curRingData[counter1]);
 
11098                                    ast_verb(3, 
"Ring pattern matched in range: %d to %d\n",
 
11104                            if (distMatches == 3) {
 
11151        res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_CONGESTION);
 
11155    res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_CONGESTION);
 
 
11181    for (x = 0; x < 
len; x++)
 
 
11191    pthread_t threadid;
 
11196    unsigned int spill_done = 0;
 
11197    int spill_result = -1;
 
11200        goto quit_no_clean;
 
11208        i = DAHDI_IOMUX_READ | DAHDI_IOMUX_SIGEVENT;
 
11214        if (i & DAHDI_IOMUX_SIGEVENT) {
 
11217            int callid_created;
 
11225            case DAHDI_EVENT_NEONMWI_ACTIVE:
 
11226            case DAHDI_EVENT_NEONMWI_INACTIVE:
 
11227            case DAHDI_EVENT_NONE:
 
11228            case DAHDI_EVENT_BITSCHANGED:
 
11230            case DAHDI_EVENT_NOALARM:
 
11239            case DAHDI_EVENT_ALARM:
 
11277                goto quit_no_clean;
 
11279        } 
else if (i & DAHDI_IOMUX_READ) {
 
11281                if (
errno != ELAST) {
 
11296                } 
else if (spill_result) {
 
11306            if (samples > (8000 * 4)) 
 
11311    if (spill_result == 1) {
 
 
11348#ifdef HAVE_DAHDI_LINEREVERSE_VMWI 
11350    if (pvt->mwisend_rpas) {
 
11353    } 
else if (pvt->mwisend_fsk) {
 
11381    x = DAHDI_FLUSH_BOTH;
 
11385#ifdef HAVE_DAHDI_LINEREVERSE_VMWI 
11386    if (pvt->mwisend_fsk) {
 
11391#ifdef HAVE_DAHDI_LINEREVERSE_VMWI 
 
11399    struct timeval  now;
 
11423#ifdef HAVE_DAHDI_LINEREVERSE_VMWI 
11424            if (pvt->mwisend_fsk) {
 
11426                gettimeofday(&now, 
NULL);
 
11430#ifdef HAVE_DAHDI_LINEREVERSE_VMWI 
11438            if (0 < num_read) {
 
 
11491        case DAHDI_EVENT_RINGEROFF:
 
11508        case DAHDI_EVENT_RINGOFFHOOK:
 
11518        case DAHDI_EVENT_RINGERON:
 
11519        case DAHDI_EVENT_HOOKCOMPLETE:
 
 
11533    int destroyed_first = 0;
 
11534    int destroyed_last = 0;
 
11541            int x = DAHDI_FLASH;
 
11543            if (cur->
channel > destroyed_last) {
 
11544                destroyed_last = cur->
channel;
 
11546            if (destroyed_first < 1 || cur->
channel < destroyed_first) {
 
11547                destroyed_first = cur->
channel;
 
11558    if (destroyed_first > start || destroyed_last < 
end) {
 
11559        ast_debug(1, 
"Asked to destroy %d-%d, destroyed %d-%d,\n",
 
11560            start, 
end, destroyed_first, destroyed_last);
 
 
11565static void dahdi_r2_destroy_nodev(
void)
 
11567    struct r2link_entry *cur;
 
11571        struct dahdi_mfcr2 *r2 = &cur->mfcr2;
 
11572        ast_debug(3, 
"About to destroy %d DAHDI channels of MFC/R2 link.\n", r2->numchans);
 
11573        for (i = 0; i < r2->numchans; i++) {
 
11586            pthread_cancel(r2->r2master);
 
11587            pthread_join(r2->r2master, 
NULL);
 
11589            openr2_context_delete(r2->protocol_context);
 
11619    ast_debug(1, 
"channel range caps: %d - %d\n", start, 
end);
 
11624                "channel range %d-%d is occupied\n",
 
11633            struct dahdi_pri *pri = pris + x;
 
11635            if (!pris[x].pri.pvts[0]) {
 
11639                int channo = pri->dchannels[i];
 
11644                if (!pri->pri.fds[i]) {
 
11647                if (channo >= start && channo <= 
end) {
 
11649                            "channel range %d-%d is occupied by span %d\n",
 
11650                            start, 
end, x + 1);
 
11658        !
conf.chan.cc_params) {
 
11663    conf.wanted_channels_start = start;
 
11666    conf.wanted_channels_end = 
end;
 
 
11682    pthread_t threadid;
 
11685    int callid_created;
 
11690    case DAHDI_EVENT_NONE:
 
11691    case DAHDI_EVENT_BITSCHANGED:
 
11693    case DAHDI_EVENT_WINKFLASH:
 
11694    case DAHDI_EVENT_RINGOFFHOOK:
 
11696        if (i->
radio) 
break;
 
11703            if (res && (
errno == EBUSY)) {
 
11717                res = tone_zone_play_tone(i->
subs[
SUB_REAL].
dfd, DAHDI_TONE_RINGTONE);
 
11721                    res = tone_zone_play_tone(i->
subs[
SUB_REAL].
dfd, DAHDI_TONE_CONGESTION);
 
11730                        res = tone_zone_play_tone(i->
subs[
SUB_REAL].
dfd, DAHDI_TONE_STUTTER);
 
11732                        res = tone_zone_play_tone(i->
subs[
SUB_REAL].
dfd, DAHDI_TONE_DIALTONE);
 
11734                        ast_log(
LOG_WARNING, 
"Unable to play dialtone on channel %d, do you have defaultzone and loadzone defined?\n", i->
channel);
 
11737                        res = tone_zone_play_tone(i->
subs[
SUB_REAL].
dfd, DAHDI_TONE_CONGESTION);
 
11780                res = tone_zone_play_tone(i->
subs[
SUB_REAL].
dfd, DAHDI_TONE_CONGESTION);
 
11791            res = tone_zone_play_tone(i->
subs[
SUB_REAL].
dfd, DAHDI_TONE_CONGESTION);
 
11797    case DAHDI_EVENT_NOALARM:
 
11799#if defined(HAVE_PRI) 
11806#if defined(HAVE_SS7) 
11817    case DAHDI_EVENT_ALARM:
 
11819#if defined(HAVE_PRI) 
11826#if defined(HAVE_SS7) 
11838    case DAHDI_EVENT_ONHOOK:
 
11884    case DAHDI_EVENT_POLARITY:
 
11898                ast_verb(2, 
"Starting post polarity " 
11899                    "CID detection on channel %d\n",
 
11913                "polarity reversal on non-FXO (SIG_FXS) " 
11914                "interface %d\n", i->
channel);
 
11917    case DAHDI_EVENT_REMOVED: 
 
11919                "Got DAHDI_EVENT_REMOVED. Destroying channel %d\n",
 
11922    case DAHDI_EVENT_NEONMWI_ACTIVE:
 
11928    case DAHDI_EVENT_NEONMWI_INACTIVE:
 
 
11939    struct pollfd **pfds = arg;
 
 
11945    int count, res, res2, spoint, pollres=0;
 
11949    time_t thispass = 0, lastpass = 0;
 
11952    struct pollfd *pfds=
NULL;
 
11953    int lastalloc = -1;
 
11958    if (pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 
NULL)) {
 
11964    pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, 
NULL);
 
11970        if (!pfds || (lastalloc != 
ifcount)) {
 
11997                        pfds[count].events = POLLPRI;
 
11998                        pfds[count].revents = 0;
 
12002                            pfds[count].events |= POLLIN;
 
12010                        pfds[count].events = POLLPRI;
 
12011                        pfds[count].revents = 0;
 
12016                            pfds[count].events |= POLLIN;
 
12027        pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, 
NULL);
 
12028        pthread_testcancel();
 
12030        res = poll(pfds, count, 1000);
 
12031        pthread_testcancel();
 
12032        pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, 
NULL);
 
12045        lastpass = thispass;
 
12046        thispass = time(
NULL);
 
12057            if (thispass != lastpass) {
 
12064                            && !
last->mwisendactive
 
12065                            && (
last->sig & __DAHDI_SIG_FXO)
 
12078                                res2 = ioctl(
last->subs[
SUB_REAL].dfd, DAHDI_VMWI, &res);
 
12081                                    ast_debug(3, 
"Unable to control message waiting led on channel %d: %s\n", 
last->channel, strerror(
errno));
 
12084                                ast_debug(5, 
"Initiating MWI FSK spill on channel %d\n", 
last->channel);
 
12114                if (pollres & POLLIN) {
 
12130                                pthread_attr_t attr;
 
12131                                pthread_t threadid;
 
12134                                pthread_attr_init(&attr);
 
12135                                pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
 
12140                                    memcpy(mtd->
buf, 
buf, res);
 
12153                            struct timeval now;
 
12161                                gettimeofday(&now, 
NULL);
 
12168                                    pthread_t threadid;
 
12203                if (pollres & POLLPRI) {
 
12230                            ast_debug(1, 
"Woah! Went back on hook before reoriginate could happen on channel %d\n", i->
channel);
 
12233                            res = DAHDI_EVENT_RINGOFFHOOK; 
 
12248        dahdi_r2_destroy_nodev();
 
12252    pthread_cleanup_pop(1);
 
 
12283#if defined(HAVE_PRI) 
12284static int pri_resolve_span(
int *
span, 
int channel, 
int offset, 
struct dahdi_spaninfo *si)
 
12289    trunkgroup = pris[*
span].mastertrunkgroup;
 
12304        } 
else if (pris[*
span].mastertrunkgroup) {
 
12305            ast_log(
LOG_WARNING, 
"Unable to use span %d implicitly since it is already part of trunk group %d\n", *
span, pris[*
span].mastertrunkgroup);
 
12308            if (si->totalchans == 31) {
 
12310                pris[*
span].dchannels[0] = 16 + offset;
 
12311            } 
else if (si->totalchans == 24) {
 
12313                pris[*
span].dchannels[0] = 24 + offset;
 
12314            } 
else if (si->totalchans == 3) {
 
12316                pris[*
span].dchannels[0] = 3 + offset;
 
12318                ast_log(
LOG_WARNING, 
"Unable to use span %d, since the D-channel cannot be located (unexpected span size of %d channels)\n", *
span, si->totalchans);
 
12329#if defined(HAVE_PRI) 
12330static int pri_create_trunkgroup(
int trunkgroup, 
int *
channels)
 
12332    struct dahdi_spaninfo si;
 
12333    struct dahdi_params p;
 
12340            ast_log(
LOG_WARNING, 
"Trunk group %d already exists on span %d, Primary d-channel %d\n", trunkgroup, x + 1, pris[x].dchannels[0]);
 
12347        memset(&si, 0, 
sizeof(si));
 
12348        memset(&p, 0, 
sizeof(p));
 
12349        fd = open(
"/dev/dahdi/channel", O_RDWR);
 
12355        if (ioctl(fd, DAHDI_SPECIFY, &x)) {
 
12360        if (ioctl(fd, DAHDI_GET_PARAMS, &p)) {
 
12365        if (ioctl(fd, DAHDI_SPANSTAT, &si)) {
 
12370        span = p.spanno - 1;
 
12376        if (pris[span].pri.
pvts[0]) {
 
12377            ast_log(
LOG_WARNING, 
"Span %d is already provisioned with channels (implicit PRI maybe?)\n", span + 1);
 
12382            pris[span].pri.trunkgroup = trunkgroup;
 
12385        pris[ospan].dchannels[y] = 
channels[y];
 
12386        pris[span].pri.span = span + 1;
 
12393#if defined(HAVE_PRI) 
12394static int pri_create_spanmap(
int span, 
int trunkgroup, 
int logicalspan)
 
12396    if (pris[span].mastertrunkgroup) {
 
12397        ast_log(
LOG_WARNING, 
"Span %d is already part of trunk group %d, cannot add to trunk group %d\n", span + 1, pris[span].mastertrunkgroup, trunkgroup);
 
12400    pris[span].mastertrunkgroup = trunkgroup;
 
12401    pris[span].prilogicalspan = logicalspan;
 
12406#if defined(HAVE_SS7) 
12407static unsigned int parse_pointcode(
const char *pcstring)
 
12409    unsigned int code1, code2, code3;
 
12412    numvals = sscanf(pcstring, 
"%30d-%30d-%30d", &code1, &code2, &code3);
 
12416        return (code1 << 16) | (code2 << 8) | code3;
 
12422#if defined(HAVE_SS7) 
12423static struct dahdi_ss7 * ss7_resolve_linkset(
int linkset)
 
12425    if ((linkset < 0) || (linkset >= 
NUM_SPANS))
 
12428        return &linksets[linkset - 1];
 
12433static void dahdi_r2_destroy_links(
void)
 
12435    struct r2link_entry *cur;
 
12440        ast_debug(3, 
"MFC/R2 link #%d queued for destruction\n", cur->mfcr2.index);
 
12446    dahdi_r2_destroy_nodev();
 
12450#define R2_LINK_CAPACITY 30 
12453    struct r2link_entry *cur = 
NULL;
 
12461        if (memcmp(&
conf->mfcr2, &cur->mfcr2.conf, 
sizeof(
conf->mfcr2))) {
 
12462            ast_debug(3, 
"Need new R2 link because of: Configuration change\n");
 
12464        } 
else if (cur->mfcr2.numchans == R2_LINK_CAPACITY) {
 
12465            ast_debug(3, 
"Need new R2 link because of: Capacity (%d)\n", R2_LINK_CAPACITY);
 
12470        struct r2link_entry *tmp = 
NULL;
 
12471        int new_idx = r2links_count + 1;
 
12473        for (i = 1; i <= r2links_count; i++) {
 
12476                if (i == tmp->mfcr2.index) {
 
12491        cur->mfcr2.index = new_idx;
 
12494        ast_debug(3, 
"Created new R2 link #%d (now have %d)\n", new_idx, r2links_count);
 
12501static int dahdi_r2_set_context(
struct dahdi_mfcr2 *r2_link, 
const struct dahdi_chan_conf *
conf)
 
12503    char tmplogdir[] = 
"/tmp";
 
12504    char logdir[OR2_MAX_PATH];
 
12507    r2_link->protocol_context = openr2_context_new(
NULL, &dahdi_r2_event_iface,
 
12508            &dahdi_r2_transcode_iface, 
conf->mfcr2.variant, 
conf->mfcr2.max_ani,
 
12509            conf->mfcr2.max_dnis);
 
12510    if (!r2_link->protocol_context) {
 
12513    openr2_context_set_log_level(r2_link->protocol_context, 
conf->mfcr2.loglevel);
 
12514    openr2_context_set_ani_first(r2_link->protocol_context, 
conf->mfcr2.get_ani_first);
 
12515#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 1 
12516    openr2_context_set_skip_category_request(r2_link->protocol_context, 
conf->mfcr2.skip_category_request);
 
12518    openr2_context_set_mf_threshold(r2_link->protocol_context, 
threshold);
 
12519    openr2_context_set_mf_back_timeout(r2_link->protocol_context, 
conf->mfcr2.mfback_timeout);
 
12520    openr2_context_set_metering_pulse_timeout(r2_link->protocol_context, 
conf->mfcr2.metering_pulse_timeout);
 
12521    openr2_context_set_double_answer(r2_link->protocol_context, 
conf->mfcr2.double_answer);
 
12522    openr2_context_set_immediate_accept(r2_link->protocol_context, 
conf->mfcr2.immediate_accept);
 
12523#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 2 
12524    openr2_context_set_dtmf_dialing(r2_link->protocol_context, 
conf->mfcr2.dtmf_dialing, 
conf->mfcr2.dtmf_time_on, 
conf->mfcr2.dtmf_time_off);
 
12525    openr2_context_set_dtmf_detection(r2_link->protocol_context, 
conf->mfcr2.dtmf_detection);
 
12527#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 3 
12528    openr2_context_set_dtmf_detection_end_timeout(r2_link->protocol_context, 
conf->mfcr2.dtmf_end_timeout);
 
12531        if (openr2_context_set_log_directory(r2_link->protocol_context, tmplogdir)) {
 
12532            ast_log(
LOG_ERROR, 
"Failed setting default MFC/R2 log directory %s\n", tmplogdir);
 
12536        if (snres >= 
sizeof(logdir)) {
 
12537            ast_log(
LOG_ERROR, 
"MFC/R2 logging directory truncated, using %s\n", tmplogdir);
 
12538            if (openr2_context_set_log_directory(r2_link->protocol_context, tmplogdir)) {
 
12539                ast_log(
LOG_ERROR, 
"Failed setting default MFC/R2 log directory %s\n", tmplogdir);
 
12542            if (openr2_context_set_log_directory(r2_link->protocol_context, logdir)) {
 
12548        if (openr2_context_configure_from_advanced_file(r2_link->protocol_context, 
conf->mfcr2.r2proto_file)) {
 
12549            ast_log(
LOG_ERROR, 
"Failed to configure r2context from advanced configuration file %s\n", 
conf->mfcr2.r2proto_file);
 
12553    memcpy(&r2_link->conf, &
conf->mfcr2, 
sizeof(r2_link->conf));
 
12587    struct dahdi_bufferinfo bi;
 
12590#if defined(HAVE_PRI) 
12596    struct dahdi_params p;
 
12597#if defined(HAVE_PRI) 
12598    struct dahdi_spaninfo si;
 
12601#if defined(HAVE_SS7) 
12621    if (!here && reloading != 1) {
 
12633        for (x = 0; x < 3; x++)
 
12640        int chan_sig = 
conf->chan.sig;
 
12643        if (reloading && tmp->
vars) {
 
12653                snprintf(fn, 
sizeof(fn), 
"%d", 
channel);
 
12668                memset(&p, 0, 
sizeof(p));
 
12675                if (
conf->is_sig_auto)
 
12677                if (p.sigtype != (chan_sig & 0x3ffff)) {
 
12683                tmp->
law = p.curlaw;
 
12684                tmp->
span = p.spanno;
 
12685#if defined(HAVE_PRI) 
12686                span = p.spanno - 1;
 
12691            tmp->
sig = chan_sig;
 
12702#if defined(HAVE_SS7) 
12704                struct dahdi_ss7 *ss7;
 
12708                    ast_log(
LOG_ERROR, 
"Unable to set clear mode on clear channel %d of span %d: %s\n", channel, p.spanno, strerror(
errno));
 
12713                ss7 = ss7_resolve_linkset(cur_linkset);
 
12719                ss7->ss7.span = cur_linkset;
 
12720                if (cur_cicbeginswith < 0) {
 
12731                tmp->ss7 = &ss7->ss7;
 
12734                ss7_chan->
cic = cur_cicbeginswith++;
 
12737                ss7_chan->
dpc = cur_defaultdpc;
 
12739                ss7->ss7.pvts[ss7->ss7.numchans++] = ss7_chan;
 
12741                ast_copy_string(ss7->ss7.internationalprefix, 
conf->ss7.ss7.internationalprefix, 
sizeof(ss7->ss7.internationalprefix));
 
12742                ast_copy_string(ss7->ss7.nationalprefix, 
conf->ss7.ss7.nationalprefix, 
sizeof(ss7->ss7.nationalprefix));
 
12743                ast_copy_string(ss7->ss7.subscriberprefix, 
conf->ss7.ss7.subscriberprefix, 
sizeof(ss7->ss7.subscriberprefix));
 
12744                ast_copy_string(ss7->ss7.unknownprefix, 
conf->ss7.ss7.unknownprefix, 
sizeof(ss7->ss7.unknownprefix));
 
12745                ast_copy_string(ss7->ss7.networkroutedprefix, 
conf->ss7.ss7.networkroutedprefix, 
sizeof(ss7->ss7.networkroutedprefix));
 
12747                ss7->ss7.called_nai = 
conf->ss7.ss7.called_nai;
 
12748                ss7->ss7.calling_nai = 
conf->ss7.ss7.calling_nai;
 
12753                struct dahdi_mfcr2 *r2_link;
 
12754                struct r2link_entry *r2_le = dahdi_r2_get_link(
conf);
 
12755                r2_link = &r2_le->mfcr2;
 
12761                if (!r2_link->protocol_context && dahdi_r2_set_context(r2_link, 
conf)) {
 
12766                if (r2_link->numchans == 
ARRAY_LEN(r2_link->pvts)) {
 
12771                r2_link->pvts[r2_link->numchans++] = tmp;
 
12772                tmp->r2chan = openr2_chan_new_from_fd(r2_link->protocol_context,
 
12775                if (!tmp->r2chan) {
 
12776                    openr2_liberr_t err = openr2_context_get_last_error(r2_link->protocol_context);
 
12777                    ast_log(
LOG_ERROR, 
"Cannot create OpenR2 channel: %s\n", openr2_context_error_string(err));
 
12781                r2_link->live_chans++;
 
12782                tmp->mfcr2 = r2_link;
 
12783                if (
conf->mfcr2.call_files) {
 
12784                    openr2_chan_enable_call_files(tmp->r2chan);
 
12786                openr2_chan_set_client_data(tmp->r2chan, tmp);
 
12788                openr2_chan_set_logging_func(tmp->r2chan, (openr2_logging_func_t)dahdi_r2_on_chan_log);
 
12789                openr2_chan_set_log_level(tmp->r2chan, 
conf->mfcr2.loglevel);
 
12790                tmp->mfcr2_category = 
conf->mfcr2.category;
 
12791                tmp->mfcr2_charge_calls = 
conf->mfcr2.charge_calls;
 
12792                tmp->mfcr2_allow_collect_calls = 
conf->mfcr2.allow_collect_calls;
 
12793                tmp->mfcr2_forced_release = 
conf->mfcr2.forced_release;
 
12794                tmp->mfcr2_accept_on_offer = 
conf->mfcr2.accept_on_offer;
 
12795                tmp->mfcr2call = 0;
 
12796                tmp->mfcr2_dnis_index = 0;
 
12797                tmp->mfcr2_ani_index = 0;
 
12805                int myswitchtype = 0;
 
12809                    ast_log(
LOG_ERROR, 
"Unable to set clear mode on clear channel %d of span %d: %s\n", channel, p.spanno, strerror(
errno));
 
12814                    ast_log(
LOG_ERROR, 
"Channel %d does not lie on a span I know of (%d)\n", channel, span);
 
12825                    tmp->logicalspan = pris[span].prilogicalspan;
 
12826                    pri_resolve_span(&span, channel, (channel - p.chanpos), &si);
 
12828                        ast_log(
LOG_WARNING, 
"Channel %d: Unable to find locate channel/trunk group!\n", channel);
 
12832                    myswitchtype = 
conf->pri.pri.switchtype;
 
12837                            if (pris[x].dchannels[y] == tmp->
channel) {
 
12843                    if (!matchesdchan) {
 
12844                        if (pris[span].pri.
nodetype && (pris[span].pri.nodetype != 
conf->pri.pri.nodetype)) {
 
12849                        if (pris[span].pri.
switchtype && (pris[span].pri.switchtype != myswitchtype)) {
 
12854                        if ((pris[span].pri.
dialplan) && (pris[span].pri.dialplan != 
conf->pri.pri.dialplan)) {
 
12855                            ast_log(
LOG_ERROR, 
"Span %d is already a %s dialing plan\n", span + 1, pris[span].pri.
dialplan == -1 ? 
"Dynamically set dialplan in ISDN" : pri_plan2str(pris[span].pri.
dialplan));
 
12869                        if (pris[span].pri.
minunused && (pris[span].pri.minunused != 
conf->pri.pri.minunused)) {
 
12870                            ast_log(
LOG_ERROR, 
"Span %d already has minunused of %d.\n", span + 1, 
conf->pri.pri.minunused);
 
12874                        if (pris[span].pri.
minidle && (pris[span].pri.minidle != 
conf->pri.pri.minidle)) {
 
12880                            ast_log(
LOG_ERROR, 
"Unable to add channel %d: Too many channels in trunk group %d!\n", channel,
 
12886                        pri_chan = 
sig_pri_chan_new(tmp, &pris[span].pri, tmp->logicalspan, p.chanpos, pris[span].mastertrunkgroup);
 
12892                        tmp->pri = &pris[span].pri;
 
12904                            conf->chan.cc_params);
 
12906                        pris[span].pri.sig = chan_sig;
 
12907                        pris[span].pri.nodetype = 
conf->pri.pri.nodetype;
 
12908                        pris[span].pri.switchtype = myswitchtype;
 
12909                        pris[span].pri.nsf = 
conf->pri.pri.nsf;
 
12910                        pris[span].pri.dialplan = 
conf->pri.pri.dialplan;
 
12911                        pris[span].pri.localdialplan = 
conf->pri.pri.localdialplan;
 
12912                        pris[span].pri.cpndialplan = 
conf->pri.pri.cpndialplan;
 
12913                        pris[span].pri.pvts[pris[span].pri.numchans++] = tmp->
sig_pvt;
 
12914                        pris[span].pri.minunused = 
conf->pri.pri.minunused;
 
12915                        pris[span].pri.minidle = 
conf->pri.pri.minidle;
 
12916                        pris[span].pri.overlapdial = 
conf->pri.pri.overlapdial;
 
12917                        pris[span].pri.qsigchannelmapping = 
conf->pri.pri.qsigchannelmapping;
 
12918                        pris[span].pri.discardremoteholdretrieval = 
conf->pri.pri.discardremoteholdretrieval;
 
12919#if defined(HAVE_PRI_SERVICE_MESSAGES) 
12920                        pris[span].pri.enable_service_message_support = 
conf->pri.pri.enable_service_message_support;
 
12922#ifdef HAVE_PRI_INBANDDISCONNECT 
12923                        pris[span].pri.inbanddisconnect = 
conf->pri.pri.inbanddisconnect;
 
12925#if defined(HAVE_PRI_CALL_HOLD) 
12926                        pris[span].pri.hold_disconnect_transfer =
 
12927                            conf->pri.pri.hold_disconnect_transfer;
 
12929#if defined(HAVE_PRI_CCSS) 
12930                        pris[span].pri.cc_ptmp_recall_mode =
 
12931                            conf->pri.pri.cc_ptmp_recall_mode;
 
12932                        pris[span].pri.cc_qsig_signaling_link_req =
 
12933                            conf->pri.pri.cc_qsig_signaling_link_req;
 
12934                        pris[span].pri.cc_qsig_signaling_link_rsp =
 
12935                            conf->pri.pri.cc_qsig_signaling_link_rsp;
 
12937#if defined(HAVE_PRI_CALL_WAITING) 
12938                        pris[span].pri.max_call_waiting_calls =
 
12939                            conf->pri.pri.max_call_waiting_calls;
 
12940                        pris[span].pri.allow_call_waiting_calls =
 
12941                            conf->pri.pri.allow_call_waiting_calls;
 
12943                        pris[span].pri.transfer = 
conf->chan.transfer;
 
12944                        pris[span].pri.facilityenable = 
conf->pri.pri.facilityenable;
 
12945#if defined(HAVE_PRI_L2_PERSISTENCE) 
12946                        pris[span].pri.l2_persistence = 
conf->pri.pri.l2_persistence;
 
12948                        pris[span].pri.colp_send = 
conf->pri.pri.colp_send;
 
12949#if defined(HAVE_PRI_AOC_EVENTS) 
12950                        pris[span].pri.aoc_passthrough_flag = 
conf->pri.pri.aoc_passthrough_flag;
 
12951                        pris[span].pri.aoce_delayhangup = 
conf->pri.pri.aoce_delayhangup;
 
12954                            pris[span].pri.layer1_ignored = 
conf->pri.pri.layer1_ignored;
 
12957                            pris[span].pri.layer1_ignored = 0;
 
12959                        pris[span].pri.append_msn_to_user_tag = 
conf->pri.pri.append_msn_to_user_tag;
 
12960                        pris[span].pri.inband_on_setup_ack = 
conf->pri.pri.inband_on_setup_ack;
 
12961                        pris[span].pri.inband_on_proceeding = 
conf->pri.pri.inband_on_proceeding;
 
12962                        ast_copy_string(pris[span].pri.initial_user_tag, 
conf->chan.cid_tag, 
sizeof(pris[span].pri.initial_user_tag));
 
12963                        ast_copy_string(pris[span].pri.msn_list, 
conf->pri.pri.msn_list, 
sizeof(pris[span].pri.msn_list));
 
12964#if defined(HAVE_PRI_MWI) 
12966                            conf->pri.pri.mwi_mailboxes,
 
12967                            sizeof(pris[span].pri.mwi_mailboxes));
 
12969                            conf->pri.pri.mwi_vm_boxes,
 
12970                            sizeof(pris[span].pri.mwi_vm_boxes));
 
12972                            conf->pri.pri.mwi_vm_numbers,
 
12973                            sizeof(pris[span].pri.mwi_vm_numbers));
 
12975                        ast_copy_string(pris[span].pri.idledial, 
conf->pri.pri.idledial, 
sizeof(pris[span].pri.idledial));
 
12976                        ast_copy_string(pris[span].pri.idleext, 
conf->pri.pri.idleext, 
sizeof(pris[span].pri.idleext));
 
12977                        ast_copy_string(pris[span].pri.internationalprefix, 
conf->pri.pri.internationalprefix, 
sizeof(pris[span].pri.internationalprefix));
 
12978                        ast_copy_string(pris[span].pri.nationalprefix, 
conf->pri.pri.nationalprefix, 
sizeof(pris[span].pri.nationalprefix));
 
12979                        ast_copy_string(pris[span].pri.localprefix, 
conf->pri.pri.localprefix, 
sizeof(pris[span].pri.localprefix));
 
12980                        ast_copy_string(pris[span].pri.privateprefix, 
conf->pri.pri.privateprefix, 
sizeof(pris[span].pri.privateprefix));
 
12981                        ast_copy_string(pris[span].pri.unknownprefix, 
conf->pri.pri.unknownprefix, 
sizeof(pris[span].pri.unknownprefix));
 
12982                        pris[span].pri.moh_signaling = 
conf->pri.pri.moh_signaling;
 
12983                        pris[span].pri.resetinterval = 
conf->pri.pri.resetinterval;
 
12984#if defined(HAVE_PRI_DISPLAY_TEXT) 
12985                        pris[span].pri.display_flags_send = 
conf->pri.pri.display_flags_send;
 
12986                        pris[span].pri.display_flags_receive = 
conf->pri.pri.display_flags_receive;
 
12988#if defined(HAVE_PRI_MCID) 
12989                        pris[span].pri.mcid_send = 
conf->pri.pri.mcid_send;
 
12991                        pris[span].pri.force_restart_unavailable_chans = 
conf->pri.pri.force_restart_unavailable_chans;
 
12992#if defined(HAVE_PRI_DATETIME_SEND) 
12993                        pris[span].pri.datetime_send = 
conf->pri.pri.datetime_send;
 
12996                        for (x = 0; x < PRI_MAX_TIMERS; x++) {
 
12997                            pris[span].pri.pritimers[x] = 
conf->pri.pri.pritimers[x];
 
13000#if defined(HAVE_PRI_CALL_WAITING) 
13002                        pris[span].pri.ch_cfg.stripmsd = 
conf->chan.stripmsd;
 
13003                        pris[span].pri.ch_cfg.hidecallerid = 
conf->chan.hidecallerid;
 
13004                        pris[span].pri.ch_cfg.hidecalleridname = 
conf->chan.hidecalleridname;
 
13005                        pris[span].pri.ch_cfg.immediate = 
conf->chan.immediate;
 
13006                        pris[span].pri.ch_cfg.priexclusive = 
conf->chan.priexclusive;
 
13007                        pris[span].pri.ch_cfg.priindication_oob = 
conf->chan.priindication_oob;
 
13008                        pris[span].pri.ch_cfg.use_callerid = 
conf->chan.use_callerid;
 
13009                        pris[span].pri.ch_cfg.use_callingpres = 
conf->chan.use_callingpres;
 
13010                        ast_copy_string(pris[span].pri.ch_cfg.context, 
conf->chan.context, 
sizeof(pris[span].pri.ch_cfg.context));
 
13011                        ast_copy_string(pris[span].pri.ch_cfg.mohinterpret, 
conf->chan.mohinterpret, 
sizeof(pris[span].pri.ch_cfg.mohinterpret));
 
13024            chan_sig = tmp->
sig;
 
13026                memset(&p, 0, 
sizeof(p));
 
13031        switch (chan_sig) {
 
13055            p.channo = channel;
 
13059            p.debouncetime = 5;
 
13061            p.channo = channel;
 
13063            if (
conf->timing.prewinktime >= 0)
 
13064                p.prewinktime = 
conf->timing.prewinktime;
 
13065            if (
conf->timing.preflashtime >= 0)
 
13066                p.preflashtime = 
conf->timing.preflashtime;
 
13067            if (
conf->timing.winktime >= 0)
 
13068                p.winktime = 
conf->timing.winktime;
 
13069            if (
conf->timing.flashtime >= 0)
 
13070                p.flashtime = 
conf->timing.flashtime;
 
13071            if (
conf->timing.starttime >= 0)
 
13072                p.starttime = 
conf->timing.starttime;
 
13073            if (
conf->timing.rxwinktime >= 0)
 
13074                p.rxwinktime = 
conf->timing.rxwinktime;
 
13075            if (
conf->timing.rxflashtime >= 0)
 
13076                p.rxflashtime = 
conf->timing.rxflashtime;
 
13077            if (
conf->timing.debouncetime >= 0)
 
13078                p.debouncetime = 
conf->timing.debouncetime;
 
13093            memset(&bi, 0, 
sizeof(bi));
 
13096                bi.txbufpolicy = 
conf->chan.buf_policy;
 
13097                bi.rxbufpolicy = 
conf->chan.buf_policy;
 
13098                bi.numbufs = 
conf->chan.buf_no;
 
13122        if (chan_sig & __DAHDI_SIG_FXS) {
 
13163            if (
conf->chan.echocanbridged)
 
13164                ast_log(
LOG_NOTICE, 
"echocancelwhenbridged requires echocancel to be enabled; ignoring\n");
 
13205                ast_log(
LOG_ERROR, 
"Invalid SMDI port specified, disabling SMDI support\n");
 
13233#if defined(HAVE_PRI) 
13250#ifdef HAVE_DAHDI_LINEREVERSE_VMWI 
13251        tmp->mwisend_setting = 
conf->chan.mwisend_setting;
 
13252        tmp->mwisend_fsk  = 
conf->chan.mwisend_fsk;
 
13253        tmp->mwisend_rpas = 
conf->chan.mwisend_rpas;
 
13263        if (
conf->chan.vars) {
 
13265            for (v = 
conf->chan.vars ; v ; v = v->
next) {
 
13269                        tmp->
vars = tmpvar;
 
13296                switch (chan_sig) {
 
13308            if ((res = 
get_alarms(tmp)) != DAHDI_ALARM_NONE) {
 
13310                switch (tmp->
sig) {
 
13316#if defined(HAVE_SS7) 
13347            switch (tmp->
sig) {
 
13348#if defined(HAVE_PRI) 
13351#if defined(HAVE_PRI_SERVICE_MESSAGES) 
13354                    char db_chan_name[20];
 
13361                    snprintf(db_chan_name, 
sizeof(db_chan_name), 
"%s/%d:%d", dahdi_db, tmp->
span, tmp->
channel);
 
13362                    if (!
ast_db_get(db_chan_name, SRVST_DBKEY, db_answer, 
sizeof(db_answer))) {
 
13366                        if (tmp->pri->enable_service_message_support) {
 
13369                            sscanf(db_answer, 
"%1c:%30u", &
state, why);
 
13372                            *why &= (SRVST_NEAREND | SRVST_FAREND);
 
13382#if defined(HAVE_SS7) 
13397        switch (tmp->
sig) {
 
13398#if defined(HAVE_PRI) 
13418#if defined(HAVE_SS7) 
13473                switch (
conf->chan.cid_start) {
 
13492                if (chan_sig & __DAHDI_SIG_FXO) {
 
13493                    memset(&p, 0, 
sizeof(p));
 
13498#ifdef HAVE_DAHDI_LINEREVERSE_VMWI 
13499                    res = ioctl(tmp->
subs[
SUB_REAL].
dfd, DAHDI_VMWI_CONFIG, &tmp->mwisend_setting);
 
13512#if defined(HAVE_PRI) 
13518            dahdi_pseudo_parms.buf_no = tmp->
buf_no;
 
13519            dahdi_pseudo_parms.buf_policy = tmp->
buf_policy;
 
13520            dahdi_pseudo_parms.faxbuf_no = tmp->
faxbuf_no;
 
13525    if (tmp && !here) {
 
 
13534#if defined(HAVE_PRI) 
13537        if (!p->pri || p->pri->
span != span) {
 
13540        if (!groupmatch && channelmatch == -1) {
 
13549        if ((p->
group & groupmatch) != groupmatch)
 
13555    if (channelmatch != -1) {
 
13556        if (p->
channel != channelmatch)
 
13559        *channelmatched = 1;
 
 
13576#if defined(HAVE_PRI) 
13588#if defined(HAVE_SS7) 
13605            if (p->mfcr2call) {
 
 
13618#if defined(HAVE_PRI) 
13619#if defined(HAVE_PRI_CALL_WAITING) 
13634    pvt->
stripmsd = pri->ch_cfg.stripmsd;
 
13637    pvt->
immediate = pri->ch_cfg.immediate;
 
13648#if defined(HAVE_PRI) 
13661static int dahdi_new_pri_nobch_channel(
struct sig_pri_span *pri)
 
13668    struct dahdi_bufferinfo bi;
 
13673    for (pvt_idx = 0; pvt_idx < pri->
numchans; ++pvt_idx) {
 
13674        if (!pri->
pvts[pvt_idx]) {
 
13702    pvt->
buf_no = dahdi_pseudo_parms.buf_no;
 
13703    pvt->
buf_policy = dahdi_pseudo_parms.buf_policy;
 
13704    pvt->
faxbuf_no = dahdi_pseudo_parms.faxbuf_no;
 
13725    pri->
pvts[pvt_idx] = chan;
 
13729        ast_log(
LOG_ERROR, 
"Unable to open no B channel interface pseudo channel: %s\n",
 
13734    memset(&bi, 0, 
sizeof(bi));
 
13740        bi.numbufs = pvt->
buf_no;
 
13744                "Unable to set buffer policy on no B channel interface: %s\n",
 
13749            "Unable to check buffer policy on no B channel interface: %s\n",
 
13756    pvt->
channel = nobch_channel;
 
13760    dahdi_nobch_insert(pri, pvt);
 
13774    struct dahdi_bufferinfo bi;
 
13805        bi.numbufs = src->
buf_no;
 
 
13842    char *subdir = 
NULL;
 
13886    memset(param, 0, 
sizeof(*param));
 
13889    if (strchr(
args.group, 
'!') != 
NULL) {
 
13891        while ((s = strchr(
prev, 
'!')) != 
NULL) {
 
13895        *(
prev - 1) = 
'\0';
 
13898    } 
else if (
args.group[0] == 
'i') {
 
13900        res = sscanf(
args.group + 1, 
"%30d", &x);
 
13908        s = strchr(
args.group, 
'-');
 
13916    if (toupper(
args.group[0]) == 
'G' || toupper(
args.group[0])==
'R') {
 
13918        s = 
args.group + 1;
 
13919        res = sscanf(s, 
"%30d%1c%30d", &x, ¶m->
opt, ¶m->
cadence);
 
13926        if (toupper(
args.group[0]) == 
'G') {
 
13927            if (
args.group[0] == 
'G') {
 
13938            if (
args.group[0] == 
'R') {
 
13953        if (!strcasecmp(s, 
"pseudo")) {
 
13958            res = sscanf(s, 
"%30d%1c%30d", &x, ¶m->
opt, ¶m->
cadence);
 
13970            snprintf(path, 
sizeof(path), 
"/dev/dahdi/%s/%d",
 
13972            if (stat(path, &stbuf) < 0) {
 
13974                        path, strerror(
errno));
 
13977            if (!S_ISCHR(stbuf.st_mode)) {
 
13988    if (param->
opt == 
'r' && res < 3) {
 
 
13998    const char *
data, 
int *cause)
 
14004    int channelmatched = 0;
 
14005    int foundowner = 0;
 
14006    int groupmatched = 0;
 
14007#if defined(HAVE_PRI) || defined(HAVE_SS7) 
14008    int transcapdigital = 0;
 
14025    while (p && !tmp) {
 
14041                if (p->mfcr2call) {
 
14043                    ast_debug(1, 
"Yay!, someone just beat us in the race for channel %d.\n", p->
channel);
 
14059            switch (start.
opt) {
 
14072#if defined(HAVE_PRI) || defined(HAVE_SS7) 
14099#if defined(HAVE_SS7) 
14108#if defined(HAVE_PRI) 
14111#if defined(HAVE_PRI_CALL_WAITING) 
14150    if (cause && !tmp) {
 
14151        if (callwait || (channelmatched && foundowner)) {
 
14153        } 
else if (groupmatched) {
 
 
14179#if defined(HAVE_PRI) 
14180    const char *device;
 
14186    if (*device != 
'I') {
 
14190    res = sscanf(device, 
"I%30u", &span);
 
14191    if (res != 1 || !span || 
NUM_SPANS < span) {
 
14195    device = strchr(device, 
'/');
 
14205#if defined(THRESHOLD_DEVSTATE_PLACEHOLDER) 
14207    if (!strcmp(device, 
"congestion"))
 
14210        return pris[span - 1].pri.congestion_devstate;
 
14212#if defined(THRESHOLD_DEVSTATE_PLACEHOLDER) 
14213    else if (!strcmp(device, 
"threshold")) {
 
14214        return pris[span - 1].pri.threshold_devstate;
 
 
14244    int groupmatched = 0;
 
14245    int channelmatched = 0;
 
14259            const char *monitor_type;
 
14269#if defined(HAVE_PRI) 
14275                    snprintf(full_device_name, 
sizeof(full_device_name),
 
14276                        "DAHDI/I%d/congestion", p->pri->
span);
 
14280#if defined(HAVE_PRI) 
14285                    snprintf(full_device_name, 
sizeof(full_device_name), 
"DAHDI/%s",
 
14293                    dash = strrchr(full_device_name, 
'-');
 
14298                snprintf(dialstring, 
sizeof(dialstring), 
"DAHDI/%s", dest);
 
14308#
if defined(HAVE_PRI)
 
14313                    monitor_type, full_device_name, dialstring, 
NULL);
 
14321        if (p == exitpvt) {
 
 
14329#if defined(HAVE_SS7) 
14330static void dahdi_ss7_message(
struct ss7 *ss7, 
char *s)
 
14336            if (linksets[i].ss7.ss7 == ss7) {
 
14346#if defined(HAVE_SS7) 
14347static void dahdi_ss7_error(
struct ss7 *ss7, 
char *s)
 
14353            if (linksets[i].ss7.ss7 == ss7) {
 
14363#if defined(HAVE_OPENR2) 
14364static void *mfcr2_monitor(
void *data)
 
14366    struct dahdi_mfcr2 *mfcr2 = data;
 
14384    for (i = 0; i < mfcr2->numchans; i++) {
 
14385        pvt = mfcr2->pvts[i];
 
14389        openr2_chan_set_idle(pvt->r2chan);
 
14390        openr2_chan_handle_cas(pvt->r2chan);
 
14396        for (i = 0; i < mfcr2->numchans; i++) {
 
14397            pollers[i].revents = 0;
 
14398            pollers[i].events = 0;
 
14399            pvt = mfcr2->pvts[i];
 
14406            if (mfcr2->nodev) {
 
14409            if (!pvt->r2chan) {
 
14414            openr2_chan_enable_read(pvt->r2chan);
 
14415            pollers[i].events = POLLIN | POLLPRI;
 
14422        if (pollsize == 0) {
 
14424                ast_debug(1, 
"Monitor thread going idle since everybody has an owner\n");
 
14427            poll(
NULL, 0, maxsleep);
 
14433        pthread_testcancel();
 
14434        res = poll(pollers, mfcr2->numchans, maxsleep);
 
14435        pthread_testcancel();
 
14436        if ((res < 0) && (
errno != EINTR)) {
 
14441        pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate);
 
14442        for (i = 0; i < mfcr2->numchans; i++) {
 
14443            pvt = mfcr2->pvts[i];
 
14447            if (pollers[i].revents & POLLPRI || pollers[i].revents & POLLIN) {
 
14448                openr2_chan_process_event(pvt->r2chan);
 
14451        pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &oldstate);
 
14458#if defined(HAVE_PRI) 
14459static void dahdi_pri_message(
struct pri *pri, 
char *s)
 
14465    int dchancount = 0;
 
14470                if (pris[x].pri.dchans[y]) {
 
14474                if (pris[x].pri.dchans[y] == pri) {
 
14485            if (1 < dchancount) {
 
14499    if (pridebugfd >= 0) {
 
14500        if (write(pridebugfd, s, strlen(s)) < 0) {
 
14509#if defined(HAVE_PRI) 
14510static void dahdi_pri_error(
struct pri *pri, 
char *s)
 
14516    int dchancount = 0;
 
14521                if (pris[x].pri.dchans[y]) {
 
14525                if (pris[x].pri.dchans[y] == pri) {
 
14536            if (1 < dchancount) {
 
14550    if (pridebugfd >= 0) {
 
14551        if (write(pridebugfd, s, strlen(s)) < 0) {
 
14560#if defined(HAVE_PRI) 
14561static int prepare_pri(
struct dahdi_pri *pri)
 
14564    struct dahdi_params p;
 
14565    struct dahdi_bufferinfo bi;
 
14566    struct dahdi_spaninfo si;
 
14569        if (!pri->dchannels[i])
 
14571        if (pri->pri.fds[i] >= 0) {
 
14575        pri->pri.fds[i] = open(
"/dev/dahdi/channel", O_RDWR);
 
14576        if ((pri->pri.fds[i] < 0)) {
 
14578                pri->pri.fds[i], strerror(
errno));
 
14581        x = pri->dchannels[i];
 
14582        res = ioctl(pri->pri.fds[i], DAHDI_SPECIFY, &x);
 
14584            dahdi_close_pri_fd(pri, i);
 
14588        memset(&p, 0, 
sizeof(p));
 
14589        res = ioctl(pri->pri.fds[i], DAHDI_GET_PARAMS, &p);
 
14591            dahdi_close_pri_fd(pri, i);
 
14595        if ((p.sigtype != DAHDI_SIG_HDLCFCS) && (p.sigtype != DAHDI_SIG_HARDHDLC)) {
 
14596            dahdi_close_pri_fd(pri, i);
 
14600        memset(&si, 0, 
sizeof(si));
 
14601        res = ioctl(pri->pri.fds[i], DAHDI_SPANSTAT, &si);
 
14603            dahdi_close_pri_fd(pri, i);
 
14611        memset(&bi, 0, 
sizeof(bi));
 
14612        bi.txbufpolicy = DAHDI_POLICY_IMMEDIATE;
 
14613        bi.rxbufpolicy = DAHDI_POLICY_IMMEDIATE;
 
14616        if (ioctl(pri->pri.fds[i], DAHDI_SET_BUFINFO, &bi)) {
 
14618            dahdi_close_pri_fd(pri, i);
 
14621        pri->pri.dchan_logical_span[i] = pris[p.spanno - 1].prilogicalspan;
 
14627#if defined(HAVE_PRI) 
14628static char *complete_span_helper(
const char *line, 
const char *
word, 
int pos, 
int state, 
int rpos)
 
14636    for (which = span = 0; span < 
NUM_SPANS; span++) {
 
14637        if (pris[span].pri.pri && ++which > 
state) {
 
14648#if defined(HAVE_PRI) 
14649static char *complete_span_4(
const char *line, 
const char *
word, 
int pos, 
int state)
 
14651    return complete_span_helper(line,
word,pos,
state,3);
 
14655#if defined(HAVE_PRI) 
14661        e->
command = 
"pri set debug file";
 
14662        e->
usage = 
"Usage: pri set debug file [output-file]\n" 
14663            "       Sends PRI debug output to the specified output file\n";
 
14676        ast_cli(
a->fd, 
"Unable to open '%s' for writing\n", 
a->argv[4]);
 
14682    if (pridebugfd >= 0)
 
14688    ast_cli(
a->fd, 
"PRI debug output will be sent to '%s'\n", 
a->argv[4]);
 
14693#if defined(HAVE_PRI) 
14694static int action_pri_debug_file_set(
struct mansession *s, 
const struct message *m)
 
14711    if (pridebugfd >= 0) {
 
14716    ast_copy_string(pridebugfilename, output_file, 
sizeof(pridebugfilename));
 
14718    astman_send_ack(s, m, 
"PRI debug output will now be sent to requested file.");
 
14724#if defined(HAVE_PRI) 
14725static int action_pri_debug_file_unset(
struct mansession *s, 
const struct message *m)
 
14729    if (pridebugfd >= 0) {
 
14742#if defined(HAVE_PRI) 
14751        e->
command = 
"pri set debug {on|off|hex|intense|0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15} span";
 
14753            "Usage: pri set debug {<level>|on|off|hex|intense} span <span>\n" 
14754            "       Enables debugging on a given PRI span\n" 
14755            "   Level is a bitmap of the following values:\n" 
14756            "   1 General debugging incl. state changes\n" 
14757            "   2 Decoded Q.931 messages\n" 
14758            "   4 Decoded Q.921 messages\n" 
14759            "   8 Raw hex dumps of Q.921 frames\n" 
14760            "       on - equivalent to 3\n" 
14761            "       hex - equivalent to 8\n" 
14762            "       intense - equivalent to 15\n";
 
14765        return complete_span_4(
a->line, 
a->word, 
a->pos, 
a->n);
 
14771    if (!strcasecmp(
a->argv[3], 
"on")) {
 
14773    } 
else if (!strcasecmp(
a->argv[3], 
"off")) {
 
14775    } 
else if (!strcasecmp(
a->argv[3], 
"intense")) {
 
14777    } 
else if (!strcasecmp(
a->argv[3], 
"hex")) {
 
14780        level = atoi(
a->argv[3]);
 
14782    span = atoi(
a->argv[5]);
 
14783    if ((span < 1) || (span > 
NUM_SPANS)) {
 
14784        ast_cli(
a->fd, 
"Invalid span %s.  Should be a number %d to %d\n", 
a->argv[5], 1, 
NUM_SPANS);
 
14787    if (!pris[span-1].pri.pri) {
 
14788        ast_cli(
a->fd, 
"No PRI running on span %d\n", span);
 
14793    if (level & 2) debugmask |= PRI_DEBUG_Q931_DUMP;
 
14794    if (level & 4) debugmask |= PRI_DEBUG_Q921_DUMP;
 
14795    if (level & 8) debugmask |= PRI_DEBUG_Q921_RAW;
 
14799        if (pris[span - 1].pri.dchans[x]) {
 
14800            pri_set_debug(pris[span - 1].pri.dchans[x], debugmask);
 
14806        if (0 <= pridebugfd) {
 
14809            ast_cli(
a->fd, 
"Disabled PRI debug output to file '%s'\n",
 
14814    pris[span - 1].pri.debug = (level) ? 1 : 0;
 
14815    ast_cli(
a->fd, 
"%s debugging on span %d\n", (level) ? 
"Enabled" : 
"Disabled", span);
 
14820#if defined(HAVE_PRI) 
14840    if (!strcasecmp(level, 
"on")) {
 
14842    } 
else if (!strcasecmp(level, 
"off")) {
 
14844    } 
else if (!strcasecmp(level, 
"intense")) {
 
14846    } 
else if (!strcasecmp(level, 
"hex")) {
 
14849        if (sscanf(level, 
"%30d", &level_val) != 1) {
 
14855    if (sscanf(span, 
"%30d", &span_val) != 1) {
 
14859    if ((span_val < 1) || (span_val > 
NUM_SPANS)) {
 
14861        char id_text[256] = 
"";
 
14864            snprintf(id_text, 
sizeof(id_text), 
"ActionID: %s\r\n", 
id);
 
14869            "Message: Invalid span '%s' - Should be a number from 1 to %d\r\n" 
14877    if (!pris[span_val-1].pri.pri) {
 
14882    if (level_val & 1) {
 
14885    if (level_val & 2) {
 
14886        debugmask |= PRI_DEBUG_Q931_DUMP;
 
14888    if (level_val & 4) {
 
14889        debugmask |= PRI_DEBUG_Q921_DUMP;
 
14891    if (level_val & 8) {
 
14892        debugmask |= PRI_DEBUG_Q921_RAW;
 
14897        if (pris[span_val - 1].pri.dchans[x]) {
 
14898            pri_set_debug(pris[span_val - 1].pri.dchans[x], debugmask);
 
14902    pris[span_val - 1].pri.debug = (level_val) ? 1 : 0;
 
14909#if defined(HAVE_PRI) 
14910#if defined(HAVE_PRI_SERVICE_MESSAGES) 
14916    int x, y, fd = 
a->fd;
 
14917    int interfaceid = 0;
 
14918    char db_chan_name[20], db_answer[15];
 
14920    struct dahdi_pri *pri;
 
14922    if (
a->argc < 5 || 
a->argc > 6)
 
14924    if (strchr(
a->argv[4], 
':')) {
 
14925        if (sscanf(
a->argv[4], 
"%30d:%30d", &trunkgroup, &channel) != 2)
 
14927        if ((trunkgroup < 1) || (channel < 1))
 
14931            if (pris[x].pri.trunkgroup == trunkgroup) {
 
14937            ast_cli(fd, 
"No such trunk group %d\n", trunkgroup);
 
14941        channel = atoi(
a->argv[4]);
 
14944        interfaceid = atoi(
a->argv[5]);
 
14949            if (pris[x].dchannels[y] == channel) {
 
14951                if (pri->pri.enable_service_message_support) {
 
14953                    pri_maintenance_service(pri->pri.pri, interfaceid, -1, changestatus);
 
14957                        "\n\tThis operation has not been enabled in chan_dahdi.conf, set 'service_message_support=yes' to use this operation.\n" 
14958                        "\tNote only 4ESS, 5ESS, and NI2 switch types are supported.\n\n");
 
14968        if (tmp->pri && tmp->
channel == channel) {
 
14971            if (!tmp->pri->enable_service_message_support) {
 
14974                    "\n\tThis operation has not been enabled in chan_dahdi.conf, set 'service_message_support=yes' to use this operation.\n" 
14975                    "\tNote only 4ESS, 5ESS, and NI2 switch types are supported.\n\n");
 
14978            snprintf(db_chan_name, 
sizeof(db_chan_name), 
"%s/%d:%d", dahdi_db, tmp->
span, channel);
 
14980            switch(changestatus) {
 
14984                *why &= ~SRVST_NEAREND;
 
14986                    snprintf(db_answer, 
sizeof(db_answer), 
"%s:%u", SRVST_TYPE_OOS, *why);
 
14987                    ast_db_put(db_chan_name, SRVST_DBKEY, db_answer);
 
14989                    dahdi_pri_update_span_devstate(tmp->pri);
 
14996                *why |= SRVST_NEAREND;
 
14997                snprintf(db_answer, 
sizeof(db_answer), 
"%s:%u", SRVST_TYPE_OOS, *why);
 
14998                ast_db_put(db_chan_name, SRVST_DBKEY, db_answer);
 
14999                dahdi_pri_update_span_devstate(tmp->pri);
 
15007            pri_maintenance_bservice(tmp->pri->pri, tmp->
sig_pvt, changestatus);
 
15014    ast_cli(fd, 
"Unable to find given channel %d, possibly not a PRI\n", 
channel);
 
15022        e->
command = 
"pri service enable channel";
 
15024            "Usage: pri service enable channel <channel> [<interface id>]\n" 
15025            "       Send an AT&T / NFAS / CCS ANSI T1.607 maintenance message\n" 
15026            "   to restore a channel to service, with optional interface id\n" 
15027            "   as agreed upon with remote switch operator\n";
 
15032    return handle_pri_service_generic(e, cmd, 
a, 0);
 
15039        e->
command = 
"pri service disable channel";
 
15041            "Usage: pri service disable channel <chan num> [<interface id>]\n" 
15042            "   Send an AT&T / NFAS / CCS ANSI T1.607 maintenance message\n" 
15043            "   to remove a channel from service, with optional interface id\n" 
15044            "   as agreed upon with remote switch operator\n";
 
15049    return handle_pri_service_generic(e, cmd, 
a, 2);
 
15054#if defined(HAVE_PRI) 
15061        e->
command = 
"pri show channels";
 
15063            "Usage: pri show channels\n" 
15064            "       Displays PRI channel information such as the current mapping\n" 
15065            "       of DAHDI B channels to Asterisk channel names and which calls\n" 
15066            "       are on hold or call-waiting.  Calls on hold or call-waiting\n" 
15067            "       are not associated with any B channel.\n";
 
15077    for (span = 0; span < 
NUM_SPANS; ++span) {
 
15078        if (pris[span].
pri.
pri) {
 
15086#if defined(HAVE_PRI) 
15093        e->
command = 
"pri show spans";
 
15095            "Usage: pri show spans\n" 
15096            "       Displays PRI span information\n";
 
15105    for (span = 0; span < 
NUM_SPANS; span++) {
 
15106        if (pris[span].
pri.
pri) {
 
15114#if defined(HAVE_PRI) 
15115#define container_of(ptr, type, member) \ 
15116    ((type *)((char *)(ptr) - offsetof(type, member))) 
15133    struct dahdi_pri* dahdi_pri;
 
15134    pthread_t master = pri->
master;
 
15139    ast_debug(2, 
"About to destroy DAHDI channels of span %d.\n", pri->
span);
 
15140    for (i = 0; i < pri->
numchans; i++) {
 
15152    cancel_code = pthread_cancel(master);
 
15153    pthread_kill(master, SIGURG);
 
15155        "Waiting to join thread of span %d " 
15156        "with pid=%p cancel_code=%d\n",
 
15157        pri->
span, (
void *)master, cancel_code);
 
15158    res = pthread_join(master, 
NULL);
 
15167        ast_debug(4, 
"closing pri_fd %d\n", i);
 
15168        dahdi_close_pri_fd(dahdi_pri, i);
 
15169        dahdi_pri->dchannels[i] = 0;
 
15175static char *handle_pri_destroy_span(
struct ast_cli_entry *e, 
int cmd,
 
15184        e->
command = 
"pri destroy span";
 
15186            "Usage: pri destroy span <span>\n" 
15187            "       Destroys D-channel of span and its B-channels.\n" 
15188            "   DON'T USE THIS UNLESS YOU KNOW WHAT YOU ARE DOING.\n";
 
15191        return complete_span_4(
a->line, 
a->word, 
a->pos, 
a->n);
 
15197    res = sscanf(
a->argv[3], 
"%30d", &
span);
 
15198    if ((res != 1) || span < 1 || span > 
NUM_SPANS) {
 
15200            "Invalid span '%s'.  Should be a number from %d to %d\n",
 
15210    pri_destroy_span(
pri);
 
15216#if defined(HAVE_PRI) 
15223        e->
command = 
"pri show span";
 
15225            "Usage: pri show span <span>\n" 
15226            "       Displays PRI Information on a given PRI span\n";
 
15229        return complete_span_4(
a->line, 
a->word, 
a->pos, 
a->n);
 
15234    span = atoi(
a->argv[3]);
 
15236        ast_cli(
a->fd, 
"Invalid span '%s'.  Should be a number from %d to %d\n", 
a->argv[3], 1, 
NUM_SPANS);
 
15250#if defined(HAVE_PRI) 
15260        e->
command = 
"pri show debug";
 
15262            "Usage: pri show debug\n" 
15263            "   Show the debug state of pri spans\n";
 
15272                if (pris[
span].
pri.dchans[x]) {
 
15274                    ast_cli(
a->fd, 
"Span %d: Debug: %s\tIntense: %s\n", 
span+1, (
debug&PRI_DEBUG_Q931_STATE)? 
"Yes" : 
"No" ,(
debug&PRI_DEBUG_Q921_RAW)? 
"Yes" : 
"No" );
 
15282    if (pridebugfd >= 0)
 
15283        ast_cli(
a->fd, 
"Logging PRI debug to file %s\n", pridebugfilename);
 
15287        ast_cli(
a->fd, 
"No PRI running\n");
 
15292#if defined(HAVE_PRI) 
15297        e->
command = 
"pri show version";
 
15299            "Usage: pri show version\n" 
15300            "Show libpri version information\n";
 
15306    ast_cli(
a->fd, 
"libpri version: %s\n", pri_get_version());
 
15312#if defined(HAVE_PRI) 
15314    AST_CLI_DEFINE(handle_pri_debug, 
"Enables PRI debugging on a span"),
 
15315#if defined(HAVE_PRI_SERVICE_MESSAGES) 
15316    AST_CLI_DEFINE(handle_pri_service_enable_channel, 
"Return a channel to service"),
 
15317    AST_CLI_DEFINE(handle_pri_service_disable_channel, 
"Remove a channel from service"),
 
15319    AST_CLI_DEFINE(handle_pri_show_channels, 
"Displays PRI channel information"),
 
15320    AST_CLI_DEFINE(handle_pri_show_spans, 
"Displays PRI span information"),
 
15321    AST_CLI_DEFINE(handle_pri_show_span, 
"Displays PRI span information"),
 
15323    AST_CLI_DEFINE(handle_pri_show_debug, 
"Displays current PRI debug settings"),
 
15324    AST_CLI_DEFINE(handle_pri_set_debug_file, 
"Sends PRI debug output to the specified file"),
 
15335        e->
command = 
"mfcr2 show version";
 
15337            "Usage: mfcr2 show version\n" 
15338            "       Shows the version of the OpenR2 library being used.\n";
 
15343    ast_cli(
a->fd, 
"OpenR2 version: %s, revision: %s\n", openr2_get_version(), openr2_get_revision());
 
15349#define FORMAT "%4s %40s\n" 
15351    int numvariants = 0;
 
15352    const openr2_variant_entry_t *variants;
 
15355        e->
command = 
"mfcr2 show variants";
 
15357            "Usage: mfcr2 show variants\n" 
15358            "       Shows the list of MFC/R2 variants supported.\n";
 
15363    if (!(variants = openr2_proto_get_variant_list(&numvariants))) {
 
15364        ast_cli(
a->fd, 
"Failed to get list of variants.\n");
 
15368    for (i = 0; i < numvariants; i++) {
 
15377#define FORMAT "%4s %4s %-7.7s %-7.7s %-8.8s %-9.9s %-16.16s %-8.8s %-8.8s\n" 
15378    int filtertype = 0;
 
15385    openr2_context_t *r2context;
 
15386    openr2_variant_t r2variant;
 
15389        e->
command = 
"mfcr2 show channels [group|context]";
 
15391            "Usage: mfcr2 show channels [group <group> | context <context>]\n" 
15392            "       Shows the DAHDI channels configured with MFC/R2 signaling.\n";
 
15397    if (!((
a->argc == 3) || (
a->argc == 5))) {
 
15400    if (
a->argc == 5) {
 
15401        if (!strcasecmp(
a->argv[3], 
"group")) {
 
15402            targetnum = atoi(
a->argv[4]);
 
15403            if ((targetnum < 0) || (targetnum > 63))
 
15405            targetnum = 1 << targetnum;
 
15407        } 
else if (!strcasecmp(
a->argv[3], 
"context")) {
 
15413    ast_cli(
a->fd, 
FORMAT, 
"Chan", 
"Link#", 
"Variant", 
"Max ANI", 
"Max DNIS", 
"ANI First", 
"Immediate Accept", 
"Tx CAS", 
"Rx CAS");
 
15420            switch(filtertype) {
 
15422                if (p->
group != targetnum) {
 
15427                if (strcasecmp(p->
context, 
a->argv[4])) {
 
15435        r2context = openr2_chan_get_context(p->r2chan);
 
15436        r2variant = openr2_context_get_variant(r2context);
 
15437        snprintf(channo, 
sizeof(channo), 
"%d", p->
channel);
 
15438        snprintf(linkno, 
sizeof(linkno), 
"%d", p->mfcr2->index);
 
15439        snprintf(anino, 
sizeof(anino), 
"%d", openr2_context_get_max_ani(r2context));
 
15440        snprintf(dnisno, 
sizeof(dnisno), 
"%d", openr2_context_get_max_dnis(r2context));
 
15441        ast_cli(
a->fd, 
FORMAT, channo, linkno, openr2_proto_get_variant_string(r2variant),
 
15442                anino, dnisno, openr2_context_get_ani_first(r2context) ? 
"Yes" : 
"No",
 
15443                openr2_context_get_immediate_accept(r2context) ? 
"Yes" : 
"No",
 
15444                openr2_chan_get_tx_cas_string(p->r2chan), openr2_chan_get_rx_cas_string(p->r2chan));
 
15455    char *toklevel = 
NULL;
 
15456    char *saveptr = 
NULL;
 
15457    char *logval = 
NULL;
 
15458    openr2_log_level_t loglevel = OR2_LOG_NOTHING;
 
15459    openr2_log_level_t tmplevel = OR2_LOG_NOTHING;
 
15462        e->
command = 
"mfcr2 set debug";
 
15464            "Usage: mfcr2 set debug <loglevel> <channel>\n" 
15465            "       Set a new logging level for the specified channel.\n" 
15466            "       If no channel is specified the logging level will be applied to all channels.\n";
 
15474    channo = (
a->argc == 5) ? atoi(
a->argv[4]) : -1;
 
15476    toklevel = strtok_r(logval, 
",", &saveptr);
 
15477    if (-1 == (tmplevel = openr2_log_get_level(toklevel))) {
 
15478        ast_cli(
a->fd, 
"Invalid MFC/R2 logging level '%s'.\n", 
a->argv[3]);
 
15480    } 
else if (OR2_LOG_NOTHING == tmplevel) {
 
15481        loglevel = tmplevel;
 
15483        loglevel |= tmplevel;
 
15484        while ((toklevel = strtok_r(
NULL, 
",", &saveptr))) {
 
15485            if (-1 == (tmplevel = openr2_log_get_level(toklevel))) {
 
15486                ast_cli(
a->fd, 
"Ignoring invalid logging level: '%s'.\n", toklevel);
 
15489            loglevel |= tmplevel;
 
15497        if ((channo != -1) && (p->
channel != channo )) {
 
15500        openr2_chan_set_log_level(p->r2chan, loglevel);
 
15501        if (channo != -1) {
 
15502            ast_cli(
a->fd, 
"MFC/R2 debugging set to '%s' for channel %d.\n", 
a->argv[3], p->
channel);
 
15506    if ((channo != -1) && !p) {
 
15507        ast_cli(
a->fd, 
"MFC/R2 channel %d not found.\n", channo);
 
15509    if (channo == -1) {
 
15510        ast_cli(
a->fd, 
"MFC/R2 debugging set to '%s' for all channels.\n", 
a->argv[3]);
 
15522        e->
command = 
"mfcr2 call files [on|off]";
 
15524            "Usage: mfcr2 call files [on|off] <channel>\n" 
15525            "       Enable call files creation on the specified channel.\n" 
15526            "       If no channel is specified call files creation policy will be applied to all channels.\n";
 
15534    channo = (
a->argc == 5) ? atoi(
a->argv[4]) : -1;
 
15540        if ((channo != -1) && (p->
channel != channo )) {
 
15544            openr2_chan_enable_call_files(p->r2chan);
 
15546            openr2_chan_disable_call_files(p->r2chan);
 
15548        if (channo != -1) {
 
15550                ast_cli(
a->fd, 
"MFC/R2 call files enabled for channel %d.\n", p->
channel);
 
15552                ast_cli(
a->fd, 
"MFC/R2 call files disabled for channel %d.\n", p->
channel);
 
15557    if ((channo != -1) && !p) {
 
15558        ast_cli(
a->fd, 
"MFC/R2 channel %d not found.\n", channo);
 
15560    if (channo == -1) {
 
15562            ast_cli(
a->fd, 
"MFC/R2 Call files enabled for all channels.\n");
 
15564            ast_cli(
a->fd, 
"MFC/R2 Call files disabled for all channels.\n");
 
15577        e->
command = 
"mfcr2 set idle";
 
15579            "Usage: mfcr2 set idle <channel>\n" 
15580            "       DON'T USE THIS UNLESS YOU KNOW WHAT YOU ARE DOING.\n" 
15581            "       Force the given channel into IDLE state.\n" 
15582            "       If no channel is specified, all channels will be set to IDLE.\n";
 
15587    channo = (
a->argc == 4) ? atoi(
a->argv[3]) : -1;
 
15593        if ((channo != -1) && (p->
channel != channo )) {
 
15596        openr2_chan_set_idle(p->r2chan);
 
15601        if (channo != -1) {
 
15605    if ((channo != -1) && !p) {
 
15606        ast_cli(
a->fd, 
"MFC/R2 channel %d not found.\n", channo);
 
15618        e->
command = 
"mfcr2 set blocked";
 
15620            "Usage: mfcr2 set blocked <channel>\n" 
15621            "       DON'T USE THIS UNLESS YOU KNOW WHAT YOU ARE DOING.\n" 
15622            "       Force the given channel into BLOCKED state.\n" 
15623            "       If no channel is specified, all channels will be set to BLOCKED.\n";
 
15628    channo = (
a->argc == 4) ? atoi(
a->argv[3]) : -1;
 
15634        if ((channo != -1) && (p->
channel != channo )) {
 
15637        openr2_chan_set_blocked(p->r2chan);
 
15641        if (channo != -1) {
 
15645    if ((channo != -1) && !p) {
 
15646        ast_cli(
a->fd, 
"MFC/R2 channel %d not found.\n", channo);
 
15652static void mfcr2_show_links_of(
struct ast_cli_args *
a, 
struct r2links *list_head, 
const char *title)
 
15654#define FORMAT "%-5s %-10s %-15s %-10s %s\n" 
15659        char live_chans_str[5];
 
15660        char channel_list[R2_LINK_CAPACITY * 4];
 
15661        struct r2link_entry *cur;
 
15663        ast_cli(
a->fd, 
FORMAT, 
"Index", 
"Thread", 
"Dahdi-Device", 
"Channels", 
"Channel-List");
 
15665            struct dahdi_mfcr2 *mfcr2 = &cur->mfcr2;
 
15666            const char *thread_status = 
NULL;
 
15673            if (mfcr2->r2master == 0L) {
 
15674                thread_status = 
"zero";
 
15676                thread_status = 
"none";
 
15678                thread_status = 
"created";
 
15680            snprintf(index, 
sizeof(index), 
"%d", mfcr2->index);
 
15681            snprintf(live_chans_str, 
sizeof(live_chans_str), 
"%d", mfcr2->live_chans);
 
15687            for (i = 0; i < mfcr2->numchans && 
len < 
sizeof(channel_list) - 1; i++) {
 
15694                if (prev_channo && prev_channo == channo - 1) {
 
15695                    prev_channo = channo;
 
15699                if (inside_range) {
 
15701                    len += snprintf(channel_list + 
len, 
sizeof(channel_list) - 
len - 1, 
"-%d,%d", prev_channo, channo);
 
15703                } 
else if (prev_channo) {
 
15705                    len += snprintf(channel_list + 
len, 
sizeof(channel_list) - 
len - 1, 
",%d", channo);
 
15708                    len += snprintf(channel_list + 
len, 
sizeof(channel_list) - 
len - 1, 
"%d", channo);
 
15710                prev_channo = channo;
 
15713            if (inside_range) {
 
15715                len += snprintf(channel_list + 
len, 
sizeof(channel_list) - 
len - 1, 
"-%d", channo);
 
15717            } 
else if (prev_channo) {
 
15719                len += snprintf(channel_list + 
len, 
sizeof(channel_list) - 
len - 1, 
",%d", channo);
 
15725                (mfcr2->nodev) ? 
"MISSING" : 
"OK",
 
15738        e->
command = 
"mfcr2 show links";
 
15740            "Usage: mfcr2 show links\n" 
15741            "       Shows the DAHDI MFC/R2 links.\n";
 
15746    if (
a->argc != 3) {
 
15749    mfcr2_show_links_of(
a, &r2links, 
"Live links\n");
 
15750    mfcr2_show_links_of(
a, &nodev_r2links, 
"Links to be removed (device missing)\n");
 
15757    int wanted_link_index;
 
15758    int found_link = 0;
 
15759    struct r2link_entry *cur = 
NULL;
 
15763        e->
command = 
"mfcr2 destroy link";
 
15765            "Usage: mfcr2 destroy link <index-number>\n" 
15766            "       Destroys D-channel of link and its B-channels.\n" 
15767            "   DON'T USE THIS UNLESS YOU KNOW WHAT YOU ARE DOING.\n";
 
15775    res = sscanf(
a->argv[3], 
"%30d", &wanted_link_index);
 
15776    if ((res != 1) || wanted_link_index < 1) {
 
15778            "Invalid link index '%s'.  Should be a positive number\n", 
a->argv[3]);
 
15783        struct dahdi_mfcr2 *mfcr2 = &cur->mfcr2;
 
15784        if (wanted_link_index == mfcr2->index) {
 
15792    if (! found_link) {
 
15793        ast_cli(
a->fd, 
"No link found with index %d.\n", wanted_link_index);
 
15800    AST_CLI_DEFINE(handle_mfcr2_version, 
"Show OpenR2 library version"),
 
15801    AST_CLI_DEFINE(handle_mfcr2_show_variants, 
"Show supported MFC/R2 variants"),
 
15802    AST_CLI_DEFINE(handle_mfcr2_show_channels, 
"Show MFC/R2 channels"),
 
15804    AST_CLI_DEFINE(handle_mfcr2_set_debug, 
"Set MFC/R2 channel logging level"),
 
15805    AST_CLI_DEFINE(handle_mfcr2_call_files, 
"Enable/Disable MFC/R2 call files"),
 
15806    AST_CLI_DEFINE(handle_mfcr2_set_idle, 
"Reset MFC/R2 channel forcing it to IDLE"),
 
15807    AST_CLI_DEFINE(handle_mfcr2_set_blocked, 
"Reset MFC/R2 channel forcing it to BLOCKED"),
 
15808    AST_CLI_DEFINE(handle_mfcr2_destroy_link, 
"Destroy given MFC/R2 link"),
 
15819        e->
command = 
"dahdi destroy channels";
 
15821            "Usage: dahdi destroy channels <from_channel> [<to_channel>]\n" 
15822            "   DON'T USE THIS UNLESS YOU KNOW WHAT YOU ARE DOING.  Immediately removes a given channel, whether it is in use or not\n";
 
15827    if ((
a->argc < 4) || 
a->argc > 5) {
 
15830    start = atoi(
a->argv[3]);
 
15832        ast_cli(
a->fd, 
"Invalid starting channel number %s.\n",
 
15836    if (
a->argc == 5) {
 
15837        end = atoi(
a->argv[4]);
 
15839            ast_cli(
a->fd, 
"Invalid ending channel number %s.\n",
 
15849            "range end (%d) is smaller than range start (%d)\n",
 
 
15865        e->
command = 
"dahdi create channels";
 
15866        e->
usage = 
"Usage: dahdi create channels <from> [<to>] - a range of channels\n" 
15867               "       dahdi create channels new           - add channels not yet created\n" 
15868               "For ISDN  and SS7 the range should include complete spans.\n";
 
15873    if ((
a->argc < 4) || 
a->argc > 5) {
 
15876    if (
a->argc == 4 && !strcmp(
a->argv[3], 
"new")) {
 
15880    start = atoi(
a->argv[3]);
 
15882        ast_cli(
a->fd, 
"Invalid starting channel number '%s'.\n",
 
15886    if (
a->argc == 5) {
 
15887        end = atoi(
a->argv[4]);
 
15889            ast_cli(
a->fd, 
"Invalid ending channel number '%s'.\n",
 
15898            "range end (%d) is smaller than range start (%d)\n",
 
 
15936#if defined(HAVE_PRI) || defined(HAVE_SS7) 
15943    ast_verb(1, 
"Destroying channels and reloading DAHDI configuration.\n");
 
15945    ast_verb(4, 
"Initial softhangup of all DAHDI channels complete.\n");
 
15947    dahdi_r2_destroy_links();
 
15950#if defined(HAVE_PRI) 
15953            cancel_code = pthread_cancel(pris[i].pri.
master);
 
15954            pthread_kill(pris[i].pri.
master, SIGURG);
 
15955            ast_debug(4, 
"Waiting to join thread of span %d with pid=%p, cancel_code=%d\n", i, (
void *) pris[i].pri.
master, cancel_code);
 
15957            ast_debug(4, 
"Joined thread of span %d\n", i);
 
15962#if defined(HAVE_SS7) 
15965            cancel_code = pthread_cancel(linksets[i].ss7.master);
 
15966            pthread_kill(linksets[i].ss7.master, SIGURG);
 
15967            ast_debug(4, 
"Waiting to join thread of span %d with pid=%p, cancel_code=%d\n", i, (
void *) linksets[i].ss7.master, cancel_code);
 
15968            pthread_join(linksets[i].ss7.master, 
NULL);
 
15969            ast_debug(4, 
"Joined thread of span %d\n", i);
 
15978        ast_debug(4, 
"Waiting to join monitor thread with pid=%p, cancel_code=%d\n", (
void *) 
monitor_thread, cancel_code);
 
15980        ast_debug(4, 
"Joined monitor thread\n");
 
15986        int x = DAHDI_FLASH;
 
16002    ast_verb(4, 
"Final softhangup of all DAHDI channels complete.\n");
 
16012            dahdi_close_pri_fd(&(pris[i]), j);
 
16015    memset(pris, 0, 
sizeof(pris));
 
16019    pri_set_error(dahdi_pri_error);
 
16020    pri_set_message(dahdi_pri_message);
 
16022#if defined(HAVE_SS7) 
16025            dahdi_close_ss7_fd(&(linksets[i]), j);
 
16028    memset(linksets, 0, 
sizeof(linksets));
 
16032    ss7_set_error(dahdi_ss7_error);
 
16033    ss7_set_message(dahdi_ss7_message);
 
 
16053        e->
command = 
"dahdi restart";
 
16055            "Usage: dahdi restart\n" 
16056            "   Restarts the DAHDI channels: destroys them all and then\n" 
16057            "   re-reads them from chan_dahdi.conf.\n" 
16058            "   Note that this will STOP any running CALL on DAHDI channels.\n" 
 
16084#define FORMAT "%7s %4d %-20.20s %-10.10s %-15.15s %-8.8s %-20.20s %-10.10s %-10.10s %-12.12s %-32.32s\n" 
16085#define FORMAT2 "%7s %4s %-20.20s %-10.10s %-15.15s %-8.8s %-20.20s %-10.10s %-10.10s %-12.12s %-32.32s\n" 
16087    int filtertype = 0;
 
16094        e->
command = 
"dahdi show channels [group|context]";
 
16096            "Usage: dahdi show channels [ group <group> | context <context> ]\n" 
16097            "   Shows a list of available channels with optional filtering\n" 
16098            "   <group> must be a number between 0 and 63\n";
 
16106    if (!((
a->argc == 3) || (
a->argc == 5))) {
 
16110    if (
a->argc == 5) {
 
16111        if (!strcasecmp(
a->argv[3], 
"group")) {
 
16112            targetnum = atoi(
a->argv[4]);
 
16113            if (63 < targetnum) {
 
16118        } 
else if (!strcasecmp(
a->argv[3], 
"context")) {
 
16123    ast_cli(
a->fd, 
FORMAT2, 
"Chan", 
"Span", 
"Signalling", 
"Extension", 
"Context", 
"Language", 
"MOH Interpret", 
"Blocked", 
"In Service", 
"Alarms", 
"Description");
 
16128            switch(filtertype) {
 
16130                if (!(tmp->
group & targetnum)) {
 
16135                if (strcasecmp(tmp->
context, 
a->argv[4])) {
 
16144            snprintf(tmps, 
sizeof(tmps), 
"%d", tmp->
channel);
 
16152        blockstr[2] = 
'\0';
 
16154        ast_cli(
a->fd, 
FORMAT, tmps, tmp->
span, 
sig2str(tmp->
sig), tmp->
exten, tmp->
context, tmp->
language, tmp->
mohinterpret, blockstr, tmp->
inservice ? 
"Yes" : 
"No",
 
 
16167    struct dahdi_confinfo ci;
 
16168    struct dahdi_params ps;
 
16175        e->
command = 
"dahdi show channel";
 
16177            "Usage: dahdi show channel <chan num>\n" 
16178            "   Detailed information about a given channel\n";
 
16187    channel = atoi(
a->argv[3]);
 
16191        if (tmp->
channel == channel) {
 
16201#if defined(HAVE_PRI) 
16202#if defined(HAVE_PRI_SUBADDR) 
16211                for (v = tmp->
vars ; v ; v = v->
next)
 
16225            ast_cli(
a->fd, 
"DSP: %s\n", tmp->
dsp ? 
"yes" : 
"no");
 
16228#if defined(BUSYDETECT_TONEONLY) 
16229                ast_cli(
a->fd, 
"    Busy Detector Helper: BUSYDETECT_TONEONLY\n");
 
16230#elif defined(BUSYDETECT_COMPARE_TONE_AND_SILENCE) 
16231                ast_cli(
a->fd, 
"    Busy Detector Helper: BUSYDETECT_COMPARE_TONE_AND_SILENCE\n");
 
16233#ifdef BUSYDETECT_DEBUG 
16234                ast_cli(
a->fd, 
"    Busy Detector Debug: Enabled\n");
 
16239            ast_cli(
a->fd, 
"TDD: %s\n", tmp->
tdd ? 
"yes" : 
"no");
 
16246                snprintf(hwrxgain, 
sizeof(hwrxgain), 
"%.1f", tmp->
hwrxgain);
 
16251                snprintf(hwtxgain, 
sizeof(hwtxgain), 
"%.1f", tmp->
hwtxgain);
 
16255            ast_cli(
a->fd, 
"HW Gains (RX/TX): %s/%s\n", hwrxgain, hwtxgain);
 
16257            ast_cli(
a->fd, 
"Dynamic Range Compression (RX/TX): %.2f/%.2f\n", tmp->
rxdrc, tmp->
txdrc);
 
16259            ast_cli(
a->fd, 
"Echo Cancellation:\n");
 
16279                char calldir[OR2_MAX_PATH];
 
16280                openr2_context_t *r2context = openr2_chan_get_context(tmp->r2chan);
 
16281                openr2_variant_t r2variant = openr2_context_get_variant(r2context);
 
16282                ast_cli(
a->fd, 
"MFC/R2 MF State: %s\n", openr2_chan_get_mf_state_string(tmp->r2chan));
 
16283                ast_cli(
a->fd, 
"MFC/R2 MF Group: %s\n", openr2_chan_get_mf_group_string(tmp->r2chan));
 
16284                ast_cli(
a->fd, 
"MFC/R2 State: %s\n", openr2_chan_get_r2_state_string(tmp->r2chan));
 
16285                ast_cli(
a->fd, 
"MFC/R2 Call State: %s\n", openr2_chan_get_call_state_string(tmp->r2chan));
 
16286                ast_cli(
a->fd, 
"MFC/R2 Call Files Enabled: %s\n", openr2_chan_get_call_files_enabled(tmp->r2chan) ? 
"Yes" : 
"No");
 
16287                ast_cli(
a->fd, 
"MFC/R2 Variant: %s\n", openr2_proto_get_variant_string(r2variant));
 
16288                ast_cli(
a->fd, 
"MFC/R2 Max ANI: %d\n", openr2_context_get_max_ani(r2context));
 
16289                ast_cli(
a->fd, 
"MFC/R2 Max DNIS: %d\n", openr2_context_get_max_dnis(r2context));
 
16290#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 2 
16291                ast_cli(
a->fd, 
"MFC/R2 DTMF Dialing: %s\n", openr2_context_get_dtmf_dialing(r2context, 
NULL, 
NULL) ? 
"Yes" : 
"No");
 
16292                ast_cli(
a->fd, 
"MFC/R2 DTMF Detection: %s\n", openr2_context_get_dtmf_detection(r2context) ? 
"Yes" : 
"No");
 
16294                ast_cli(
a->fd, 
"MFC/R2 Get ANI First: %s\n", openr2_context_get_ani_first(r2context) ? 
"Yes" : 
"No");
 
16295#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 1 
16296                ast_cli(
a->fd, 
"MFC/R2 Skip Category Request: %s\n", openr2_context_get_skip_category_request(r2context) ? 
"Yes" : 
"No");
 
16298                ast_cli(
a->fd, 
"MFC/R2 Immediate Accept: %s\n", openr2_context_get_immediate_accept(r2context) ? 
"Yes" : 
"No");
 
16299                ast_cli(
a->fd, 
"MFC/R2 Accept on Offer: %s\n", tmp->mfcr2_accept_on_offer ? 
"Yes" : 
"No");
 
16300                ast_cli(
a->fd, 
"MFC/R2 Charge Calls: %s\n", tmp->mfcr2_charge_calls ? 
"Yes" : 
"No");
 
16301                ast_cli(
a->fd, 
"MFC/R2 Allow Collect Calls: %s\n", tmp->mfcr2_allow_collect_calls ? 
"Yes" : 
"No");
 
16302                ast_cli(
a->fd, 
"MFC/R2 Forced Release: %s\n", tmp->mfcr2_forced_release ? 
"Yes" : 
"No");
 
16303                ast_cli(
a->fd, 
"MFC/R2 MF Back Timeout: %dms\n", openr2_context_get_mf_back_timeout(r2context));
 
16304                ast_cli(
a->fd, 
"MFC/R2 R2 Metering Pulse Timeout: %dms\n", openr2_context_get_metering_pulse_timeout(r2context));
 
16305                ast_cli(
a->fd, 
"MFC/R2 Rx CAS: %s\n", openr2_chan_get_rx_cas_string(tmp->r2chan));
 
16306                ast_cli(
a->fd, 
"MFC/R2 Tx CAS: %s\n", openr2_chan_get_tx_cas_string(tmp->r2chan));
 
16307                ast_cli(
a->fd, 
"MFC/R2 MF Tx Signal: %d\n", openr2_chan_get_tx_mf_signal(tmp->r2chan));
 
16308                ast_cli(
a->fd, 
"MFC/R2 MF Rx Signal: %d\n", openr2_chan_get_rx_mf_signal(tmp->r2chan));
 
16309                ast_cli(
a->fd, 
"MFC/R2 Call Files Directory: %s\n", openr2_context_get_log_directory(r2context, calldir, 
sizeof(calldir)));
 
16312#if defined(HAVE_SS7) 
16333                if (tmp->logicalspan)
 
16334                    ast_cli(
a->fd, 
"PRI Logical Span: %d\n", tmp->logicalspan);
 
16336                    ast_cli(
a->fd, 
"PRI Logical Span: Implicit\n");
 
16339            memset(&ci, 0, 
sizeof(ci));
 
16342                memset(&ci, 0, 
sizeof(ci));
 
16344                    ast_cli(
a->fd, 
"Actual Confinfo: Num/%d, Mode/0x%04x\n", ci.confno, (
unsigned)ci.confmode);
 
16347                    ast_cli(
a->fd, 
"Actual Confmute: %s\n", x ? 
"Yes" : 
"No");
 
16349                memset(&ps, 0, 
sizeof(ps));
 
16353                    ast_cli(
a->fd, 
"Hookstate (FXS only): %s\n", ps.rxisoffhook ? 
"Offhook" : 
"Onhook");
 
 
16371        e->
command = 
"dahdi show cadences";
 
16373            "Usage: dahdi show cadences\n" 
16374            "       Shows all cadences currently defined\n";
 
16381        char tmp[16], tmp2[64];
 
16382        snprintf(tmp, 
sizeof(tmp), 
"r%d: ", i + 1);
 
16385        for (j = 0; j < 16; j++) {
 
16386            if (
cadences[i].ringcadence[j] == 0)
 
16388            snprintf(tmp, 
sizeof(tmp), 
"%d", 
cadences[i].ringcadence[j]);
 
16394                strncat(output, 
",", 
sizeof(output) - strlen(output) - 1);
 
16395            strncat(output, tmp2, 
sizeof(output) - strlen(output) - 1);
 
 
16404    alarmstr[0] = 
'\0';
 
16405    if (spaninfo->alarms > 0) {
 
16406        if (spaninfo->alarms & DAHDI_ALARM_BLUE) {
 
16407            strcat(alarmstr, 
"BLU/");
 
16409        if (spaninfo->alarms & DAHDI_ALARM_YELLOW) {
 
16410            strcat(alarmstr, 
"YEL/");
 
16412        if (spaninfo->alarms & DAHDI_ALARM_RED) {
 
16413            strcat(alarmstr, 
"RED/");
 
16415        if (spaninfo->alarms & DAHDI_ALARM_LOOPBACK) {
 
16416            strcat(alarmstr, 
"LB/");
 
16418        if (spaninfo->alarms & DAHDI_ALARM_RECOVER) {
 
16419            strcat(alarmstr, 
"REC/");
 
16421        if (spaninfo->alarms & DAHDI_ALARM_NOTOPEN) {
 
16422            strcat(alarmstr, 
"NOP/");
 
16424        if (!strlen(alarmstr)) {
 
16425            strcat(alarmstr, 
"UUU/");
 
16427        if (strlen(alarmstr)) {
 
16429            alarmstr[strlen(alarmstr) - 1] = 
'\0';
 
16432        if (spaninfo->numchans) {
 
16433            strcpy(alarmstr, 
"OK");
 
16435            strcpy(alarmstr, 
"UNCONFIGURED");
 
 
16443    #define FORMAT "%4d %-40.40s %-7.7s %-6d %-6d %-6d %-3.3s %-4.4s %-8.8s %s\n" 
16444    #define FORMAT2 "%4s %-40.40s %-7.7s %-6.6s %-6.6s %-6.6s %-3.3s %-4.4s %-8.8s %s\n" 
16450    struct dahdi_spaninfo s;
 
16454        e->
command = 
"dahdi show status";
 
16456            "Usage: dahdi show status\n" 
16457            "       Shows a list of DAHDI cards with status\n";
 
16462    ctl = open(
"/dev/dahdi/ctl", O_RDWR);
 
16464        ast_cli(
a->fd, 
"No DAHDI found. Unable to open /dev/dahdi/ctl: %s\n", strerror(
errno));
 
16467    ast_cli(
a->fd, 
FORMAT2, 
"Span", 
"Description", 
"Alarms", 
"IRQ", 
"bpviol", 
"CRC", 
"Framing", 
"Coding", 
"Options", 
"LBO");
 
16469    for (span = 1; span < DAHDI_MAX_SPANS; ++span) {
 
16471        res = ioctl(ctl, DAHDI_SPANSTAT, &s);
 
16476        ast_cli(
a->fd, 
FORMAT, span, s.desc, alarmstr, s.irqmisses, s.bpvcount, s.crc4count,
 
16477            s.lineconfig & DAHDI_CONFIG_D4 ? 
"D4" :
 
16478            s.lineconfig & DAHDI_CONFIG_ESF ? 
"ESF" :
 
16479            s.lineconfig & DAHDI_CONFIG_CCS ? 
"CCS" :
 
16481            s.lineconfig & DAHDI_CONFIG_B8ZS ? 
"B8ZS" :
 
16482            s.lineconfig & DAHDI_CONFIG_HDB3 ? 
"HDB3" :
 
16483            s.lineconfig & DAHDI_CONFIG_AMI ? 
"AMI" :
 
16485            s.lineconfig & DAHDI_CONFIG_CRC4 ?
 
16486                s.lineconfig & DAHDI_CONFIG_NOTOPEN ? 
"CRC4/YEL" : 
"CRC4" :
 
16487                s.lineconfig & DAHDI_CONFIG_NOTOPEN ? 
"YEL" : 
"",
 
 
16500    int pseudo_fd = -1;
 
16501    struct dahdi_versioninfo vi;
 
16505        e->
command = 
"dahdi show version";
 
16507            "Usage: dahdi show version\n" 
16508            "       Shows the DAHDI version in use\n";
 
16513    if ((pseudo_fd = open(
"/dev/dahdi/ctl", O_RDONLY)) < 0) {
 
16514        ast_cli(
a->fd, 
"Failed to open control file to get version.\n");
 
16518    strcpy(vi.version, 
"Unknown");
 
16519    strcpy(vi.echo_canceller, 
"Unknown");
 
16521    if (ioctl(pseudo_fd, DAHDI_GETVERSION, &vi))
 
16522        ast_cli(
a->fd, 
"Failed to get DAHDI version: %s\n", strerror(
errno));
 
16524        ast_cli(
a->fd, 
"DAHDI Version: %s Echo Canceller: %s\n", vi.version, vi.echo_canceller);
 
 
16540        e->
command = 
"dahdi set hwgain {rx|tx}";
 
16542            "Usage: dahdi set hwgain <rx|tx> <chan#> <gain>\n" 
16543            "   Sets the hardware gain on a given channel and overrides the\n" 
16544            "   value provided at module loadtime.  Changes take effect\n" 
16545            "   immediately whether the channel is in use or not.\n" 
16547            "   <rx|tx> which direction do you want to change (relative to our module)\n" 
16548            "   <chan num> is the channel number relative to the device\n" 
16549            "   <gain> is the gain in dB (e.g. -3.5 for -3.5dB)\n" 
16552            "   * hwgain is only supportable by hardware with analog ports because\n" 
16553            "     hwgain works on the analog side of an analog-digital conversion.\n";
 
16562    if (!strcasecmp(
"rx", 
a->argv[3]))
 
16564    else if (!strcasecmp(
"tx", 
a->argv[3]))
 
16570    gain = atof(
a->argv[5]);
 
16583            ast_cli(
a->fd, 
"Unable to set the hardware gain for channel %d: %s\n", 
channel, strerror(
errno));
 
16587        ast_cli(
a->fd, 
"Hardware %s gain set to %.1f dB on channel %d.\n",
 
16588            tx ? 
"tx" : 
"rx", gain, 
channel);
 
 
16620        e->
command = 
"dahdi set swgain {rx|tx}";
 
16622            "Usage: dahdi set swgain <rx|tx> <chan#> <gain>\n" 
16623            "   Sets the software gain on a given channel and overrides the\n" 
16624            "   value provided at module loadtime.  Changes take effect\n" 
16625            "   immediately whether the channel is in use or not.\n" 
16627            "   <rx|tx> which direction do you want to change (relative to our module)\n" 
16628            "   <chan num> is the channel number relative to the device\n" 
16629            "   <gain> is the gain in dB (e.g. -3.5 for -3.5dB)\n";
 
16638    if (!strcasecmp(
"rx", 
a->argv[3]))
 
16640    else if (!strcasecmp(
"tx", 
a->argv[3]))
 
16646    gain = atof(
a->argv[5]);
 
16663            ast_cli(
a->fd, 
"Unable to set the software gain for channel %d\n", 
channel);
 
16668        ast_cli(
a->fd, 
"Software %s gain set to %.2f dB on channel %d.\n",
 
16669            tx ? 
"tx" : 
"rx", gain, 
channel);
 
 
16696        e->
command = 
"dahdi set dnd";
 
16698            "Usage: dahdi set dnd <chan#> <on|off>\n" 
16699            "   Sets/resets DND (Do Not Disturb) mode on a channel.\n" 
16700            "   Changes take effect immediately.\n" 
16701            "   <chan num> is the channel number\n" 
16702            "   <on|off> Enable or disable DND mode?\n" 
16712    if ((
channel = atoi(
a->argv[3])) <= 0) {
 
16713        ast_cli(
a->fd, 
"Expected channel number, got '%s'\n", 
a->argv[3]);
 
16722        ast_cli(
a->fd, 
"Expected 'on' or 'off', got '%s'\n", 
a->argv[4]);
 
16727    for (dahdi_chan = 
iflist; dahdi_chan; dahdi_chan = dahdi_chan->
next) {
 
 
16754        e->
command = 
"dahdi set mwi";
 
16756            "Usage: dahdi set mwi <chan#> <on|off|reset>\n" 
16757            "   Sets/unsets MWI (Message Waiting Indicator) manually on a channel.\n" 
16758            "   This may be used regardless of whether the channel is assigned any mailboxes.\n" 
16759            "   When active, this setting will override the voicemail status to set MWI.\n" 
16760            "   Once cleared, the voicemail status will resume control of MWI.\n" 
16761            "   Changes are queued for when the channel is idle and persist until cleared.\n" 
16762            "   <chan num> is the channel number\n" 
16763            "   <on|off|reset> Enable, disable, or reset Message Waiting Indicator override?\n" 
16773    if ((
channel = atoi(
a->argv[3])) <= 0) {
 
16774        ast_cli(
a->fd, 
"Expected channel number, got '%s'\n", 
a->argv[3]);
 
16782    } 
else if (!strcmp(
a->argv[4], 
"reset")) {
 
16785        ast_cli(
a->fd, 
"Expected 'on' or 'off' or 'reset', got '%s'\n", 
a->argv[4]);
 
16790    for (dahdi_chan = 
iflist; dahdi_chan; dahdi_chan = dahdi_chan->
next) {
 
16797            ast_cli(
a->fd, 
"MWI '%s' queued for channel %d\n", on ? 
"enable" : 
"disable", 
channel);
 
 
16875    if (sscanf(
channel, 
"%30d", &chan_num) != 1) {
 
 
16894#define REQUIRE_FXO_SIG() \ 
16895    if (!(dahdip->sigtype & __DAHDI_SIG_FXO)) { \ 
16896        ast_log(LOG_WARNING, "DAHDI channel %d is not FXO signalled\n", p->channel); \ 
 16894#define REQUIRE_FXO_SIG() \ … 
16905    if (!strcasecmp(property, 
"owner")) {
 
16907    } 
else if (!strcasecmp(property, 
"callwait")) {
 
16909    } 
else if (!strcasecmp(property, 
"threeway")) {
 
16912    } 
else if (!strcasecmp(property, 
"polarity")) {
 
16915    } 
else if (!strcasecmp(property, 
"dnd")) {
 
16917        snprintf(buffer, 
len, 
"%d", analog_p->
dnd);
 
16918    } 
else if (!strcasecmp(property, 
"callforward")) {
 
16921    } 
else if (!strcasecmp(property, 
"lastexten")) {
 
 
16939    if (!strcasecmp(property, 
"owner") || !strcasecmp(property, 
"callwait") || !strcasecmp(property, 
"threeway")) {
 
16943    } 
else if (!strcasecmp(property, 
"polarity")) {
 
16951    } 
else if (!strcasecmp(property, 
"dnd")) {
 
16955    } 
else if (!strcasecmp(property, 
"callforward")) {
 
16961    } 
else if (!strcasecmp(property, 
"lastexten")) {
 
 
16973#undef REQUIRE_FXO_SIG 
16979    struct dahdi_params dahdip;
 
16995        int channo = atoi(
args.dahdichan);
 
17010    memset(&dahdip, 0, 
sizeof(dahdip));
 
 
17038    .
name = 
"DAHDI_CHANNEL",
 
 
17047    struct dahdi_params dahdip;
 
17053    memset(&dahdip, 0, 
sizeof(dahdip));
 
 
17063    struct dahdi_params dahdip;
 
17069    memset(&dahdip, 0, 
sizeof(dahdip));
 
 
17078    .
name = 
"POLARITY",
 
 
17191    for (i = 0; i < strlen(
number); i++) {
 
 
17206    int dahdichanquery;
 
17208    if (!dahdichannel || sscanf(dahdichannel, 
"%30d", &dahdichanquery) != 1) {
 
17210        dahdichanquery = -1;
 
17215        snprintf(idText, 
sizeof(idText), 
"ActionID: %s\r\n", 
id);
 
17227            if (dahdichanquery > 0 && tmp->
channel != dahdichanquery)
 
17235                    "Event: DAHDIShowChannels\r\n" 
17236                    "DAHDIChannel: %d\r\n" 
17239                    "AccountCode: %s\r\n" 
17240                    "Signalling: %s\r\n" 
17241                    "SignallingCode: %d\r\n" 
17245                    "Description: %s\r\n" 
17255                    dahdi_dnd(tmp, -1) ? 
"Enabled" : 
"Disabled",
 
17260                    "Event: DAHDIShowChannels\r\n" 
17261                    "DAHDIChannel: %d\r\n" 
17262                    "Signalling: %s\r\n" 
17263                    "SignallingCode: %d\r\n" 
17267                    "Description: %s\r\n" 
17272                    dahdi_dnd(tmp, -1) ? 
"Enabled" : 
"Disabled",
 
 
17296    struct dahdi_spaninfo spaninfo;
 
17298    ctl = open(
"/dev/dahdi/ctl", O_RDWR);
 
17306        snprintf(idText, 
sizeof(idText), 
"ActionID: %s\r\n", 
id);
 
17310    for (span = 1; span < DAHDI_MAX_SPANS; ++span) {
 
17311        spaninfo.spanno = span;
 
17312        res = ioctl(ctl, DAHDI_SPANSTAT, &spaninfo);
 
17319            "Event: DAHDIShowStatus\r\n" 
17321            "Description: %s\r\n" 
17332            span, spaninfo.desc, alarmstr, spaninfo.irqmisses, spaninfo.bpvcount, spaninfo.crc4count,
 
17333            spaninfo.lineconfig & DAHDI_CONFIG_D4 ? 
"D4" :
 
17334            spaninfo.lineconfig & DAHDI_CONFIG_ESF ? 
"ESF" :
 
17335            spaninfo.lineconfig & DAHDI_CONFIG_CCS ? 
"CCS" :
 
17337            spaninfo.lineconfig & DAHDI_CONFIG_B8ZS ? 
"B8ZS" :
 
17338            spaninfo.lineconfig & DAHDI_CONFIG_HDB3 ? 
"HDB3" :
 
17339            spaninfo.lineconfig & DAHDI_CONFIG_AMI ? 
"AMI" :
 
17341            spaninfo.lineconfig & DAHDI_CONFIG_CRC4 ?
 
17342                spaninfo.lineconfig & DAHDI_CONFIG_NOTOPEN ? 
"CRC4/YEL" : 
"CRC4" :
 
17343                spaninfo.lineconfig & DAHDI_CONFIG_NOTOPEN ? 
"YEL" : 
"",
 
 
17355#if defined(HAVE_PRI) 
17361    struct dahdi_pri *dspan;
 
17364    char action_id[256];
 
17365    const char *show_cmd = 
"PRIShowSpans";
 
17369        span_query = atoi(span_str);
 
17375        snprintf(action_id, 
sizeof(action_id), 
"ActionID: %s\r\n", 
id);
 
17377        action_id[0] = 
'\0';
 
17383    for (idx = 0; idx < 
ARRAY_LEN(pris); ++idx) {
 
17384        dspan = &pris[idx];
 
17387        if (0 < span_query && dspan->pri.span != span_query) {
 
17391        if (dspan->pri.pri) {
 
17404#if defined(HAVE_SS7) 
17405static int linkset_addsigchan(
int sigchan)
 
17407    struct dahdi_ss7 *link;
 
17410    struct dahdi_params params;
 
17411    struct dahdi_bufferinfo bi;
 
17412    struct dahdi_spaninfo si;
 
17418    if (cur_ss7type < 0) {
 
17422    if (cur_pointcode < 0) {
 
17426    if (cur_adjpointcode < 0) {
 
17430    if (cur_defaultdpc < 0) {
 
17434    if (cur_networkindicator < 0) {
 
17438    link = ss7_resolve_linkset(cur_linkset);
 
17448    curfd = link->ss7.numsigchans;
 
17451    link->ss7.fds[curfd] = open(
"/dev/dahdi/channel", O_RDWR, 0600);
 
17452    if (link->ss7.fds[curfd] < 0) {
 
17457    if (ioctl(link->ss7.fds[curfd], DAHDI_SPECIFY, &sigchan) == -1) {
 
17458        dahdi_close_ss7_fd(link, curfd);
 
17465    memset(¶ms, 0, 
sizeof(params));
 
17466    res = ioctl(link->ss7.fds[curfd], DAHDI_GET_PARAMS, ¶ms);
 
17468        dahdi_close_ss7_fd(link, curfd);
 
17469        ast_log(
LOG_ERROR, 
"Unable to get parameters for sigchan %d (%s)\n", sigchan,
 
17473    if (params.sigtype != DAHDI_SIG_HDLCFCS
 
17474        && params.sigtype != DAHDI_SIG_HARDHDLC
 
17475        && params.sigtype != DAHDI_SIG_MTP2) {
 
17476        dahdi_close_ss7_fd(link, curfd);
 
17482    memset(&bi, 0, 
sizeof(bi));
 
17483    bi.txbufpolicy = DAHDI_POLICY_IMMEDIATE;
 
17484    bi.rxbufpolicy = DAHDI_POLICY_IMMEDIATE;
 
17487    if (ioctl(link->ss7.fds[curfd], DAHDI_SET_BUFINFO, &bi)) {
 
17488        ast_log(
LOG_ERROR, 
"Unable to set appropriate buffering on channel %d: %s\n",
 
17489            sigchan, strerror(
errno));
 
17490        dahdi_close_ss7_fd(link, curfd);
 
17495    memset(&si, 0, 
sizeof(si));
 
17496    res = ioctl(link->ss7.fds[curfd], DAHDI_SPANSTAT, &si);
 
17498        dahdi_close_ss7_fd(link, curfd);
 
17499        ast_log(
LOG_ERROR, 
"Unable to get span state for sigchan %d (%s)\n", sigchan,
 
17504        (params.sigtype == DAHDI_SIG_MTP2)
 
17505            ? SS7_TRANSPORT_DAHDIMTP2
 
17506            : SS7_TRANSPORT_DAHDIDCHAN,
 
17507        si.
alarms, cur_networkindicator, cur_pointcode, cur_adjpointcode, cur_slc);
 
17509        dahdi_close_ss7_fd(link, curfd);
 
17513    ++link->ss7.numsigchans;
 
17519#if defined(HAVE_SS7) 
17525        e->
command = 
"ss7 set debug {on|off} linkset";
 
17527            "Usage: ss7 set debug {on|off} linkset <linkset>\n" 
17528            "       Enables debugging on a given SS7 linkset\n";
 
17538    span = atoi(
a->argv[5]);
 
17539    if ((span < 1) || (span > 
NUM_SPANS)) {
 
17540        ast_cli(
a->fd, 
"Invalid linkset %s.  Should be a number from %d to %d\n", 
a->argv[5], 1, 
NUM_SPANS);
 
17543    if (!linksets[span-1].ss7.ss7) {
 
17544        ast_cli(
a->fd, 
"No SS7 running on linkset %d\n", span);
 
17546        if (!strcasecmp(
a->argv[3], 
"on")) {
 
17547            linksets[span - 1].ss7.debug = 1;
 
17549            ast_cli(
a->fd, 
"Enabled debugging on linkset %d\n", span);
 
17551            linksets[span - 1].ss7.debug = 0;
 
17552            ss7_set_debug(linksets[span-1].ss7.ss7, 0);
 
17553            ast_cli(
a->fd, 
"Disabled debugging on linkset %d\n", span);
 
17561#if defined(HAVE_SS7) 
17571        e->
command = 
"ss7 {block|unblock} cic";
 
17573            "Usage: ss7 {block|unblock} cic <linkset> <dpc> <CIC>\n" 
17574            "       Sends a remote {blocking|unblocking} request for the given CIC on the specified linkset\n";
 
17580    if (
a->argc == 6) {
 
17581        linkset = atoi(
a->argv[3]);
 
17586    if (!strcasecmp(
a->argv[1], 
"block")) {
 
17588    } 
else if (strcasecmp(
a->argv[1], 
"unblock")) {
 
17592    if ((linkset < 1) || (linkset > 
NUM_SPANS)) {
 
17593        ast_cli(
a->fd, 
"Invalid linkset %s.  Should be a number %d to %d\n", 
a->argv[3], 1, 
NUM_SPANS);
 
17597    if (!linksets[linkset-1].ss7.ss7) {
 
17598        ast_cli(
a->fd, 
"No SS7 running on linkset %d\n", linkset);
 
17602    cic = atoi(
a->argv[5]);
 
17604        ast_cli(
a->fd, 
"Invalid CIC specified!\n");
 
17608    dpc = atoi(
a->argv[4]);
 
17610        ast_cli(
a->fd, 
"Invalid DPC specified!\n");
 
17614    for (i = 0; i < linksets[linkset-1].ss7.numchans; i++) {
 
17615        if (linksets[linkset-1].ss7.pvts[i] && linksets[linkset-1].ss7.pvts[i]->cic == cic && linksets[linkset-1].ss7.pvts[i]->dpc == dpc) {
 
17616            blocked = linksets[linkset-1].ss7.pvts[i]->locallyblocked;
 
17619                    ast_cli(
a->fd, 
"Unable to allocate new ss7call\n");
 
17621                    ast_cli(
a->fd, 
"Sent %sblocking request for linkset %d on CIC %d DPC %d\n", (do_block) ? 
"" : 
"un", linkset, cic, dpc);
 
17623            } 
else if (!do_block && blocked) {
 
17624                ast_cli(
a->fd, 
"CIC %d is hardware locally blocked!\n", cic);
 
17626                ast_cli(
a->fd, 
"CIC %d %s locally blocked\n", cic, do_block ? 
"already" : 
"is not");
 
17632    ast_cli(
a->fd, 
"Invalid CIC specified!\n");
 
17637#if defined(HAVE_SS7) 
17649        e->
command = 
"ss7 {reset|block|unblock} linkset";
 
17651            "Usage: ss7 {reset|block|unblock} linkset <linkset number>\n" 
17652            "       Sends a remote {reset|blocking|unblocking} request for all CICs on the given linkset\n";
 
17658    if (
a->argc == 4) {
 
17659        linkset = atoi(
a->argv[3]);
 
17664    if (!strcasecmp(
a->argv[1], 
"block")) {
 
17665        do_what = DO_BLOCK;
 
17666    } 
else if (!strcasecmp(
a->argv[1], 
"unblock")) {
 
17667        do_what = DO_UNBLOCK;
 
17668    } 
else if (!strcasecmp(
a->argv[1], 
"reset")) {
 
17669        do_what = DO_RESET;
 
17674    if ((linkset < 1) || (linkset > 
NUM_SPANS)) {
 
17675        ast_cli(
a->fd, 
"Invalid linkset %s.  Should be a number %d to %d\n", 
a->argv[3], 1, 
NUM_SPANS);
 
17679    if (!linksets[linkset - 1].ss7.ss7) {
 
17680        ast_cli(
a->fd, 
"No SS7 running on linkset %d\n", linkset);
 
17684    for (i = 0; i < linksets[linkset - 1].ss7.numchans; i++) {
 
17686        if (linksets[linkset - 1].ss7.pvts[i]) {
 
17691                    ast_cli(
a->fd, 
"Sent remote %s request on CIC %d\n",
 
17692                        (do_what == DO_BLOCK) ? 
"blocking" : 
"unblocking",
 
17693                        linksets[linkset - 1].ss7.
pvts[i]->cic);
 
17698                    linksets[linkset - 1].ss7.pvts[i]->cic,
 
17699                    linksets[linkset - 1].ss7.pvts[i]->dpc)) {
 
17700                    ast_cli(
a->fd, 
"Sent reset request on CIC %d\n",
 
17701                        linksets[linkset - 1].ss7.pvts[i]->cic);
 
17712#if defined(HAVE_SS7) 
17715    int linkset, cic, range, chanpos;
 
17716    int i, dpc, orient = 0;
 
17718    unsigned char state[255];
 
17722        e->
command = 
"ss7 {block|unblock} group";
 
17724            "Usage: ss7 {block|unblock} group <linkset> <dpc> <1st. CIC> <range> [H]\n" 
17725            "       Sends a remote {blocking|unblocking} request for CIC range on the specified linkset\n";
 
17731    if (
a->argc == 7 || 
a->argc == 8) {
 
17732        linkset = atoi(
a->argv[3]);
 
17737    if (!strcasecmp(
a->argv[1], 
"block")) {
 
17739    } 
else if (strcasecmp(
a->argv[1], 
"unblock")) {
 
17743    if (
a->argc == 8) {
 
17744        if (!strcasecmp(
a->argv[7], 
"H")) {
 
17751    if ((linkset < 1) || (linkset > 
NUM_SPANS)) {
 
17752        ast_cli(
a->fd, 
"Invalid linkset %s.  Should be a number %d to %d\n", 
a->argv[4], 1, 
NUM_SPANS);
 
17756    if (!linksets[linkset-1].ss7.ss7) {
 
17757        ast_cli(
a->fd, 
"No SS7 running on linkset %d\n", linkset);
 
17761    cic = atoi(
a->argv[5]);
 
17763        ast_cli(
a->fd, 
"Invalid CIC specified!\n");
 
17767    range = atoi(
a->argv[6]);
 
17769    if (range < 1 || range > (linksets[linkset - 1].ss7.type == SS7_ANSI ? 24 : 31)) {
 
17770        ast_cli(
a->fd, 
"Invalid range specified!\n");
 
17774    dpc = atoi(
a->argv[4]);
 
17776        ast_cli(
a->fd, 
"Invalid DPC specified!\n");
 
17783        ast_cli(
a->fd, 
"Invalid CIC/RANGE\n");
 
17788    for (i = 0; i <= range; ++i) {
 
17795        ast_cli(
a->fd, 
"Unable allocate new ss7call\n");
 
17797        ast_cli(
a->fd, 
"Sending remote%s %sblocking request linkset %d on CIC %d range %d\n",
 
17798            orient ? 
" hardware" : 
"", do_block ? 
"" : 
"un", linkset, cic, range);
 
17805        pthread_kill(linksets[linkset-1].ss7.master, SIGURG);
 
17811#if defined(HAVE_SS7) 
17814    int linkset, cic, range;
 
17819        e->
command = 
"ss7 reset group";
 
17821            "Usage: ss7 reset group <linkset> <dpc> <1st CIC> <range>\n" 
17822            "       Send a GRS for the given CIC range on the specified linkset\n";
 
17828    if (
a->argc == 7) {
 
17829        linkset = atoi(
a->argv[3]);
 
17834    if ((linkset < 1) || (linkset > 
NUM_SPANS)) {
 
17835        ast_cli(
a->fd, 
"Invalid linkset %s.  Should be a number %d to %d\n", 
a->argv[4], 1, 
NUM_SPANS);
 
17839    if (!linksets[linkset-1].ss7.ss7) {
 
17840        ast_cli(
a->fd, 
"No SS7 running on linkset %d\n", linkset);
 
17844    cic = atoi(
a->argv[5]);
 
17847        ast_cli(
a->fd, 
"Invalid CIC specified!\n");
 
17851    range = atoi(
a->argv[6]);
 
17852    if (range < 1 || range > (linksets[linkset - 1].ss7.type == SS7_ANSI ? 24 : 31)) {
 
17853        ast_cli(
a->fd, 
"Invalid range specified!\n");
 
17857    dpc = atoi(
a->argv[4]);
 
17859        ast_cli(
a->fd, 
"Invalid DPC specified!\n");
 
17866        ast_cli(
a->fd, 
"Invalid CIC/RANGE\n");
 
17871        ast_cli(
a->fd, 
"Unable to allocate new ss7call\n");
 
17873        ast_cli(
a->fd, 
"GRS sent ... \n");
 
17880        pthread_kill(linksets[linkset-1].ss7.master, SIGURG);
 
17886#if defined(HAVE_SS7) 
17893        e->
command = 
"ss7 show calls";
 
17895            "Usage: ss7 show calls <linkset>\n" 
17896            "       Show SS7 calls on the specified linkset\n";
 
17902    if (
a->argc == 4) {
 
17903        linkset = atoi(
a->argv[3]);
 
17908    if ((linkset < 1) || (linkset > 
NUM_SPANS)) {
 
17909        ast_cli(
a->fd, 
"Invalid linkset %s.  Should be a number %d to %d\n", 
a->argv[3], 1, 
NUM_SPANS);
 
17913    if (!linksets[linkset-1].ss7.ss7) {
 
17914        ast_cli(
a->fd, 
"No SS7 running on linkset %d\n", linkset);
 
17919    isup_show_calls(linksets[linkset-1].ss7.ss7, &
ast_cli, 
a->fd);
 
17926#if defined(HAVE_SS7) 
17929    int linkset, cic, res;
 
17934        e->
command = 
"ss7 reset cic";
 
17936            "Usage: ss7 reset cic <linkset> <dpc> <CIC>\n" 
17937            "       Send a RSC for the given CIC on the specified linkset\n";
 
17943    if (
a->argc == 6) {
 
17944        linkset = atoi(
a->argv[3]);
 
17949    if ((linkset < 1) || (linkset > 
NUM_SPANS)) {
 
17950        ast_cli(
a->fd, 
"Invalid linkset %s.  Should be a number %d to %d\n", 
a->argv[3], 1, 
NUM_SPANS);
 
17954    if (!linksets[linkset-1].ss7.ss7) {
 
17955        ast_cli(
a->fd, 
"No SS7 running on linkset %d\n", linkset);
 
17959    cic = atoi(
a->argv[5]);
 
17962        ast_cli(
a->fd, 
"Invalid CIC specified!\n");
 
17966    dpc = atoi(
a->argv[4]);
 
17968        ast_cli(
a->fd, 
"Invalid DPC specified!\n");
 
17974    ast_cli(
a->fd, 
"%s RSC for linkset %d on CIC %d DPC %d\n", res ? 
"Sent" : 
"Failed", linkset, cic, dpc);
 
17980#if defined(HAVE_SS7) 
17985    unsigned int arg = 0;
 
17992            "Usage: ss7 mtp3 <linkset> <slc> coo|coa|cbd|cba|eco|eca|tfp|tfa|lin|lun|lia|lua|lid|lfu <arg>\n" 
17993            "       Send a NET MNG message\n" 
17994            "       WARNING!!! WARNING!!! We are not a STP, just for testing/development purposes\n";
 
18004    linkset = atoi(
a->argv[2]);
 
18005    if ((linkset < 1) || (linkset > 
NUM_SPANS)) {
 
18006        ast_cli(
a->fd, 
"Invalid linkset %s.  Should be a number %d to %d\n", 
a->argv[2], 1, 
NUM_SPANS);
 
18009    if (!linksets[linkset-1].ss7.ss7) {
 
18010        ast_cli(
a->fd, 
"No SS7 running on linkset %d\n", linkset);
 
18014    slc = atoi(
a->argv[3]);
 
18016    if (
a->argc == 6) {
 
18017        arg = atoi(
a->argv[5]);
 
18021    res = mtp3_net_mng(linksets[linkset-1].ss7.ss7, slc, 
a->argv[4], arg);
 
18026        pthread_kill(linksets[linkset-1].ss7.master, SIGURG);
 
18035#if defined(HAVE_SS7) 
18039    unsigned int slc = 0;
 
18043        e->
command = 
"ss7 restart mtp3";
 
18045            "Usage: ss7 restart mtp3 <linkset> <slc>\n" 
18056    linkset = atoi(
a->argv[3]);
 
18057    if ((linkset < 1) || (linkset > 
NUM_SPANS)) {
 
18058        ast_cli(
a->fd, 
"Invalid linkset %s.  Should be a number %d to %d\n", 
a->argv[2], 1, 
NUM_SPANS);
 
18061    if (!linksets[linkset-1].ss7.ss7) {
 
18062        ast_cli(
a->fd, 
"No SS7 running on linkset %d\n", linkset);
 
18066    slc = atoi(
a->argv[4]);
 
18069    mtp3_init_restart(linksets[linkset-1].ss7.ss7, slc);
 
18074        pthread_kill(linksets[linkset-1].ss7.master, SIGURG);
 
18081#if defined(HAVE_SS7) 
18088        e->
command = 
"ss7 show linkset";
 
18090            "Usage: ss7 show linkset <span>\n" 
18091            "       Shows the status of an SS7 linkset.\n";
 
18101    linkset = atoi(
a->argv[3]);
 
18102    if ((linkset < 1) || (linkset > 
NUM_SPANS)) {
 
18103        ast_cli(
a->fd, 
"Invalid linkset %s.  Should be a number %d to %d\n", 
a->argv[3], 1, 
NUM_SPANS);
 
18106    ss7 = &linksets[linkset - 1].ss7;
 
18108        ast_cli(
a->fd, 
"No SS7 running on linkset %d\n", linkset);
 
18114    ast_cli(
a->fd, 
"SS7 calling nai: %i\n", 
ss7->calling_nai);
 
18115    ast_cli(
a->fd, 
"SS7 called nai: %i\n", 
ss7->called_nai);
 
18116    ast_cli(
a->fd, 
"SS7 nationalprefix: %s\n", 
ss7->nationalprefix);
 
18117    ast_cli(
a->fd, 
"SS7 internationalprefix: %s\n", 
ss7->internationalprefix);
 
18118    ast_cli(
a->fd, 
"SS7 unknownprefix: %s\n", 
ss7->unknownprefix);
 
18119    ast_cli(
a->fd, 
"SS7 networkroutedprefix: %s\n", 
ss7->networkroutedprefix);
 
18120    ast_cli(
a->fd, 
"SS7 subscriberprefix: %s\n", 
ss7->subscriberprefix);
 
18127#if defined(HAVE_SS7) 
18134        e->
command = 
"ss7 show channels";
 
18136            "Usage: ss7 show channels\n" 
18137            "       Displays SS7 channel information at a glance.\n";
 
18143    if (
a->argc != 3) {
 
18148    for (linkset = 0; linkset < 
NUM_SPANS; ++linkset) {
 
18149        if (linksets[linkset].
ss7.ss7) {
 
18157#if defined(HAVE_SS7) 
18160#define FORMAT "%5s %5s %6s %12s   %-12s\n" 
18161#define FORMAT2 "%5i %5i %6i %12s   %-12s\n" 
18162    int i, linkset, dpc = 0;
 
18169        e->
command = 
"ss7 show cics";
 
18171            "Usage: ss7 show cics <linkset> [dpc]\n" 
18172            "       Shows the cics of an SS7 linkset.\n";
 
18178    if (
a->argc < 4 || 
a->argc > 5) {
 
18182    linkset = atoi(
a->argv[3]);
 
18184    if ((linkset < 1) || (linkset > 
NUM_SPANS)) {
 
18185        ast_cli(
a->fd, 
"Invalid linkset %s.  Should be a number %d to %d\n", 
a->argv[3], 1, 
NUM_SPANS);
 
18189    if (!linksets[linkset-1].
ss7.ss7) {
 
18190        ast_cli(
a->fd, 
"No SS7 running on linkset %d\n", linkset);
 
18193    ss7 = &linksets[linkset-1].ss7;
 
18195    if (
a->argc == 5) {
 
18196        dpc = atoi(
a->argv[4]);
 
18198            ast_cli(
a->fd, 
"Invalid DPC specified!\n");
 
18203    ast_cli(
a->fd, 
FORMAT, 
"CIC", 
"DPC", 
"DAHDI", 
"STATE", 
"BLOCKING");
 
18205    for (i = 0; i < 
ss7->numchans; i++) {
 
18206        if (!dpc || (
ss7->pvts[i] && 
ss7->pvts[i]->dpc == dpc)) {
 
18214                state = 
"NotInServ";
 
18220                strcpy(blocking, 
"L:");
 
18222                    strcat(blocking, 
"M");
 
18224                    strcat(blocking, 
" ");
 
18228                    strcat(blocking, 
"H");
 
18230                    strcat(blocking, 
" ");
 
18233                strcpy(blocking, 
"    ");
 
18237                strcat(blocking, 
" R:");
 
18239                    strcat(blocking, 
"M");
 
18241                    strcat(blocking, 
" ");
 
18245                    strcat(blocking, 
"H");
 
18247                    strcat(blocking, 
" ");
 
18261#if defined(HAVE_SS7) 
18266        e->
command = 
"ss7 show version";
 
18268            "Usage: ss7 show version\n" 
18269            "   Show the libss7 version\n";
 
18275    ast_cli(
a->fd, 
"libss7 version: %s\n", ss7_get_version());
 
18281#if defined(HAVE_SS7) 
18283    AST_CLI_DEFINE(handle_ss7_debug, 
"Enables SS7 debugging on a linkset"),
 
18284    AST_CLI_DEFINE(handle_ss7_cic_blocking, 
"Blocks/Unblocks the given CIC"),
 
18285    AST_CLI_DEFINE(handle_ss7_linkset_mng, 
"Resets/Blocks/Unblocks all CICs on a linkset"),
 
18286    AST_CLI_DEFINE(handle_ss7_group_blocking, 
"Blocks/Unblocks the given CIC range"),
 
18288    AST_CLI_DEFINE(handle_ss7_group_reset, 
"Resets the given CIC range"),
 
18291    AST_CLI_DEFINE(handle_ss7_show_linkset, 
"Shows the status of a linkset"),
 
18292    AST_CLI_DEFINE(handle_ss7_show_channels, 
"Displays SS7 channel information"),
 
18299#if defined(HAVE_PRI) 
18300#if defined(HAVE_PRI_CCSS) 
18347#if defined(HAVE_PRI) 
18348#if defined(HAVE_PRI_CCSS) 
18360static void dahdi_pri_cc_agent_destructor(
struct ast_cc_agent *agent)
 
18369#if defined(HAVE_PRI) 
18370#if defined(HAVE_PRI_CCSS) 
18372    .
type = dahdi_pri_cc_type,
 
18373    .init = dahdi_pri_cc_agent_init,
 
18382    .destructor = dahdi_pri_cc_agent_destructor,
 
18387#if defined(HAVE_PRI) 
18388#if defined(HAVE_PRI_CCSS) 
18390    .
type = dahdi_pri_cc_type,
 
18404#if defined(HAVE_PRI) || defined(HAVE_SS7) 
18411            pthread_cancel(pris[i].pri.
master);
 
18412            pthread_kill(pris[i].pri.
master, SIGURG);
 
18417#ifdef HAVE_PRI_PROG_W_CAUSE 
18421#if defined(HAVE_SS7) 
18424            pthread_cancel(linksets[i].ss7.
master);
 
18425            pthread_kill(linksets[i].ss7.
master, SIGURG);
 
18430#if defined(HAVE_OPENR2) 
18431    dahdi_r2_destroy_links();
 
18448#if defined(HAVE_PRI) 
18475#if defined(HAVE_PRI) 
18481            dahdi_close_pri_fd(&(pris[i]), j);
 
18485#if defined(HAVE_PRI_CCSS) 
18492#if defined(HAVE_SS7) 
18498            dahdi_close_ss7_fd(&(linksets[i]), j);
 
18500        if (linksets[i].ss7.
ss7) {
 
18501            ss7_destroy(linksets[i].ss7.
ss7);
 
18502            linksets[i].ss7.ss7 = 
NULL;
 
 
18518#if defined(HAVE_PRI) || defined(HAVE_SS7) 
18525#if defined(HAVE_SS7) 
 
18535    int x, start, finish;
 
18538    if ((
reload == 0) && (
conf->chan.sig < 0) && !
conf->is_sig_auto) {
 
18539        ast_log(
LOG_ERROR, 
"Signalling must be specified before any channels are.\n");
 
18545    while ((chan = 
strsep(&
c, 
","))) {
 
18546        if (sscanf(chan, 
"%30d-%30d", &start, &finish) == 2) {
 
18548        } 
else if (sscanf(chan, 
"%30d", &start)) {
 
18551        } 
else if (!strcasecmp(chan, 
"pseudo")) {
 
18557        if (finish < start) {
 
18564        for (x = start; x <= finish; x++) {
 
18565            if (
conf->wanted_channels_start &&
 
18566                (x < conf->wanted_channels_start ||
 
18567                 x > 
conf->wanted_channels_end)
 
18577                        (
reload == 1) ? 
"reconfigure" : 
"register", 
value);
 
 
18591#define MAX_CHANLIST_LEN 80 
18596    char *
params[DAHDI_MAX_ECHOCANPARAMS + 1];
 
18597    unsigned int param_count;
 
18609    if ((x == 32) || (x == 64) || (x == 128) || (x == 256) || (x == 512) || (x == 1024))
 
18616    for (x = 1; x < param_count; x++) {
 
18623            ast_log(
LOG_WARNING, 
"Invalid echocancel parameter supplied at line %u: '%s'\n", line, params[x]);
 
18628            ast_log(
LOG_WARNING, 
"Invalid echocancel parameter supplied at line %u: '%s'\n", line, param.name);
 
18636                ast_log(
LOG_WARNING, 
"Invalid echocancel parameter value supplied at line %u: '%s'\n", line, param.value);
 
 
18644#if defined(HAVE_PRI) 
18645#if defined(HAVE_PRI_DISPLAY_TEXT) 
18655static unsigned long dahdi_display_text_option(
const char *
value)
 
18665        opt_str = 
strsep(&val_str, 
",");
 
18674        if (!strcasecmp(opt_str, 
"block")) {
 
18675            options |= PRI_DISPLAY_OPTION_BLOCK;
 
18676        } 
else if (!strcasecmp(opt_str, 
"name_initial")) {
 
18677            options |= PRI_DISPLAY_OPTION_NAME_INITIAL;
 
18678        } 
else if (!strcasecmp(opt_str, 
"name_update")) {
 
18679            options |= PRI_DISPLAY_OPTION_NAME_UPDATE;
 
18680        } 
else if (!strcasecmp(opt_str, 
"name")) {
 
18681            options |= (PRI_DISPLAY_OPTION_NAME_INITIAL | PRI_DISPLAY_OPTION_NAME_UPDATE);
 
18682        } 
else if (!strcasecmp(opt_str, 
"text")) {
 
18683            options |= PRI_DISPLAY_OPTION_TEXT;
 
18691#if defined(HAVE_PRI) 
18692#if defined(HAVE_PRI_DATETIME_SEND) 
18702static int dahdi_datetime_send_option(
const char *
value)
 
18706    option = PRI_DATE_TIME_SEND_DEFAULT;
 
18709        option = PRI_DATE_TIME_SEND_NO;
 
18710    } 
else if (!strcasecmp(
value, 
"date")) {
 
18711        option = PRI_DATE_TIME_SEND_DATE;
 
18712    } 
else if (!strcasecmp(
value, 
"date_hh")) {
 
18713        option = PRI_DATE_TIME_SEND_DATE_HH;
 
18714    } 
else if (!strcasecmp(
value, 
"date_hhmm")) {
 
18715        option = PRI_DATE_TIME_SEND_DATE_HHMM;
 
18716    } 
else if (!strcasecmp(
value, 
"date_hhmmss")) {
 
18717        option = PRI_DATE_TIME_SEND_DATE_HHMMSS;
 
18726#define PROC_DAHDI_OPT_NOCHAN  (1 << 0) 
18728#define PROC_DAHDI_OPT_NOWARN  (1 << 1) 
18732    int count_pattern = 0;
 
18738        if (!sscanf(v->
value, 
"%30d", &norval) && count_pattern == 0) {
 
18739            ast_log(
LOG_ERROR, 
"busypattern= expects either busypattern=tonelength,quietlength or busypattern=t1length, q1length, t2length, q2length at line %d.\n", v->
lineno);
 
18743        busy_cadence->
pattern[count_pattern] = norval;
 
18746        if (count_pattern == 4) {
 
18750        temp = strchr(v->
value, 
',');
 
18751        if (temp == 
NULL) {
 
18754        v->
value = temp + 1;
 
18756    busy_cadence->
length = count_pattern;
 
18758    if (count_pattern % 2 != 0) {
 
18760        ast_log(
LOG_ERROR, 
"busypattern= expects either busypattern=tonelength,quietlength or busypattern=t1length, q1length, t2length, q2length at line %d.\n", v->
lineno);
 
 
18774    for (; v; v = v->
next) {
 
18779        if (!strcasecmp(v->
name, 
"channel") || !strcasecmp(v->
name, 
"channels")) {
 
18793        } 
else if (!strcasecmp(v->
name, 
"ignore_failed_channels")) {
 
18795        } 
else if (!strcasecmp(v->
name, 
"buffers")) {
 
18801        } 
else if (!strcasecmp(v->
name, 
"faxbuffers")) {
 
18805        } 
else if (!strcasecmp(v->
name, 
"dahdichan")) {
 
18808        } 
else if (!strcasecmp(v->
name, 
"usedistinctiveringdetection")) {
 
18810        } 
else if (!strcasecmp(v->
name, 
"distinctiveringaftercid")) {
 
18812        } 
else if (!strcasecmp(v->
name, 
"dring1context")) {
 
18814        } 
else if (!strcasecmp(v->
name, 
"dring2context")) {
 
18816        } 
else if (!strcasecmp(v->
name, 
"dring3context")) {
 
18818        } 
else if (!strcasecmp(v->
name, 
"dring1range")) {
 
18820        } 
else if (!strcasecmp(v->
name, 
"dring2range")) {
 
18822        } 
else if (!strcasecmp(v->
name, 
"dring3range")) {
 
18824        } 
else if (!strcasecmp(v->
name, 
"dring1")) {
 
18826        } 
else if (!strcasecmp(v->
name, 
"dring2")) {
 
18828        } 
else if (!strcasecmp(v->
name, 
"dring3")) {
 
18830        } 
else if (!strcasecmp(v->
name, 
"usecallerid")) {
 
18832        } 
else if (!strcasecmp(v->
name, 
"cidsignalling")) {
 
18833            if (!strcasecmp(v->
value, 
"bell"))
 
18835            else if (!strcasecmp(v->
value, 
"v23"))
 
18837            else if (!strcasecmp(v->
value, 
"dtmf"))
 
18839            else if (!strcasecmp(v->
value, 
"smdi"))
 
18841            else if (!strcasecmp(v->
value, 
"v23_jp"))
 
18845        } 
else if (!strcasecmp(v->
name, 
"cidstart")) {
 
18846            if (!strcasecmp(v->
value, 
"ring"))
 
18848            else if (!strcasecmp(v->
value, 
"polarity_in"))
 
18850            else if (!strcasecmp(v->
value, 
"polarity"))
 
18852            else if (!strcasecmp(v->
value, 
"dtmf"))
 
18856        } 
else if (!strcasecmp(v->
name, 
"threewaycalling")) {
 
18858        } 
else if (!strcasecmp(v->
name, 
"threewaysilenthold")) {
 
18860        } 
else if (!strcasecmp(v->
name, 
"cancallforward")) {
 
18862        } 
else if (!strcasecmp(v->
name, 
"relaxdtmf")) {
 
18867        } 
else if (!strcasecmp(v->
name, 
"mailbox")) {
 
18869        } 
else if (!strcasecmp(v->
name, 
"description")) {
 
18871        } 
else if (!strcasecmp(v->
name, 
"adsi")) {
 
18873        } 
else if (!strcasecmp(v->
name, 
"usesmdi")) {
 
18875        } 
else if (!strcasecmp(v->
name, 
"smdiport")) {
 
18877        } 
else if (!strcasecmp(v->
name, 
"transfer")) {
 
18879        } 
else if (!strcasecmp(v->
name, 
"canpark")) {
 
18881        } 
else if (!strcasecmp(v->
name, 
"echocancelwhenbridged")) {
 
18883        } 
else if (!strcasecmp(v->
name, 
"busydetect")) {
 
18885        } 
else if (!strcasecmp(v->
name, 
"busycount")) {
 
18887        } 
else if (!strcasecmp(v->
name, 
"busypattern")) {
 
18889        } 
else if (!strcasecmp(v->
name, 
"calledsubscriberheld")) {
 
18891        } 
else if (!strcasecmp(v->
name, 
"lastnumredial")) {
 
18893        } 
else if (!strcasecmp(v->
name, 
"callprogress")) {
 
18897        } 
else if (!strcasecmp(v->
name, 
"waitfordialtone")) {
 
18899        } 
else if (!strcasecmp(v->
name, 
"dialtone_detect")) {
 
18900            if (!strcasecmp(v->
value, 
"always")) {
 
18909        } 
else if (!strcasecmp(v->
name, 
"faxdetect")) {
 
18911            if (!strcasecmp(v->
value, 
"incoming")) {
 
18913            } 
else if (!strcasecmp(v->
value, 
"outgoing")) {
 
18917        } 
else if (!strcasecmp(v->
name, 
"faxdetect_timeout")) {
 
18921        } 
else if (!strcasecmp(v->
name, 
"firstdigit_timeout")) {
 
18926        } 
else if (!strcasecmp(v->
name, 
"interdigit_timeout")) {
 
18931        } 
else if (!strcasecmp(v->
name, 
"matchdigit_timeout")) {
 
18936        } 
else if (!strcasecmp(v->
name, 
"echocancel")) {
 
18938        } 
else if (!strcasecmp(v->
name, 
"echotraining")) {
 
18939            if (sscanf(v->
value, 
"%30d", &y) == 1) {
 
18940                if ((y < 10) || (y > 4000)) {
 
18949        } 
else if (!strcasecmp(v->
name, 
"hidecallerid")) {
 
18951        } 
else if (!strcasecmp(v->
name, 
"hidecalleridname")) {
 
18953        } 
else if (!strcasecmp(v->
name, 
"pulsedial")) {
 
18955        } 
else if (!strcasecmp(v->
name, 
"callreturn")) {
 
18957        } 
else if (!strcasecmp(v->
name, 
"callwaiting")) {
 
18959        } 
else if (!strcasecmp(v->
name, 
"callwaitingcallerid")) {
 
18961        } 
else if (!strcasecmp(v->
name, 
"callwaitingdeluxe")) {
 
18963        } 
else if (!strcasecmp(v->
name, 
"context")) {
 
18965        } 
else if (!strcasecmp(v->
name, 
"language")) {
 
18967        } 
else if (!strcasecmp(v->
name, 
"progzone")) {
 
18969        } 
else if (!strcasecmp(v->
name, 
"mohinterpret")
 
18970            ||!strcasecmp(v->
name, 
"musiconhold") || !strcasecmp(v->
name, 
"musicclass")) {
 
18972        } 
else if (!strcasecmp(v->
name, 
"mohsuggest")) {
 
18974        } 
else if (!strcasecmp(v->
name, 
"parkinglot")) {
 
18976        } 
else if (!strcasecmp(v->
name, 
"stripmsd")) {
 
18977            ast_log(
LOG_NOTICE, 
"Configuration option \"%s\" has been deprecated. Please use dialplan instead\n", v->
name);
 
18979        } 
else if (!strcasecmp(v->
name, 
"jitterbuffers")) {
 
18981        } 
else if (!strcasecmp(v->
name, 
"group")) {
 
18983        } 
else if (!strcasecmp(v->
name, 
"callgroup")) {
 
18987            if (!strcasecmp(v->
value, 
"none"))
 
18991        } 
else if (!strcasecmp(v->
name, 
"pickupgroup")) {
 
18995            if (!strcasecmp(v->
value, 
"none"))
 
18999        } 
else if (!strcasecmp(v->
name, 
"namedcallgroup")) {
 
19001                ast_log(
LOG_WARNING, 
"Only FXO signalled channels may belong to a named call group\n");
 
19004        } 
else if (!strcasecmp(v->
name, 
"namedpickupgroup")) {
 
19006                ast_log(
LOG_WARNING, 
"Only FXO signalled channels may belong to a named pickup group\n");
 
19009        } 
else if (!strcasecmp(v->
name, 
"setvar")) {
 
19011                char *varval = 
NULL;
 
19013                char varname[strlen(v->
value) + 1];
 
19014                strcpy(varname, v->
value); 
 
19015                if ((varval = strchr(varname, 
'='))) {
 
19025        } 
else if (!strcasecmp(v->
name, 
"immediate")) {
 
19027        } 
else if (!strcasecmp(v->
name, 
"immediatering")) {
 
19029        } 
else if (!strcasecmp(v->
name, 
"transfertobusy")) {
 
19031        } 
else if (!strcasecmp(v->
name, 
"dialmode")) {
 
19032            if (!strcasecmp(v->
value, 
"pulse")) {
 
19034            } 
else if (!strcasecmp(v->
value, 
"dtmf") || !strcasecmp(v->
value, 
"tone")) {
 
19036            } 
else if (!strcasecmp(v->
value, 
"none")) {
 
19041        } 
else if (!strcasecmp(v->
name, 
"mwimonitor")) {
 
19058        } 
else if (!strcasecmp(v->
name, 
"hwrxgain")) {
 
19060            if (strcasecmp(v->
value, 
"disabled")) {
 
19067        } 
else if (!strcasecmp(v->
name, 
"hwtxgain")) {
 
19069            if (strcasecmp(v->
value, 
"disabled")) {
 
19076        } 
else if (!strcasecmp(v->
name, 
"cid_rxgain")) {
 
19080        } 
else if (!strcasecmp(v->
name, 
"rxgain")) {
 
19084        } 
else if (!strcasecmp(v->
name, 
"txgain")) {
 
19088        } 
else if (!strcasecmp(v->
name, 
"txdrc")) {
 
19092        } 
else if (!strcasecmp(v->
name, 
"rxdrc")) {
 
19096        } 
else if (!strcasecmp(v->
name, 
"tonezone")) {
 
19100        } 
else if (!strcasecmp(v->
name, 
"callerid")) {
 
19101            if (!strcasecmp(v->
value, 
"asreceived")) {
 
19107        } 
else if (!strcasecmp(v->
name, 
"fullname")) {
 
19109        } 
else if (!strcasecmp(v->
name, 
"cid_number")) {
 
19111        } 
else if (!strcasecmp(v->
name, 
"cid_tag")) {
 
19113        } 
else if (!strcasecmp(v->
name, 
"useincomingcalleridondahditransfer")) {
 
19115        } 
else if (!strcasecmp(v->
name, 
"restrictcid")) {
 
19117        } 
else if (!strcasecmp(v->
name, 
"usecallingpres")) {
 
19119        } 
else if (!strcasecmp(v->
name, 
"accountcode")) {
 
19121        } 
else if (!strcasecmp(v->
name, 
"amaflags")) {
 
19127        } 
else if (!strcasecmp(v->
name, 
"polarityonanswerdelay")) {
 
19129        } 
else if (!strcasecmp(v->
name, 
"answeronpolarityswitch")) {
 
19131        } 
else if (!strcasecmp(v->
name, 
"ani_info_digits")) {
 
19133        } 
else if (!strcasecmp(v->
name, 
"ani_wink_time")) {
 
19135        } 
else if (!strcasecmp(v->
name, 
"ani_timeout")) {
 
19137        } 
else if (!strcasecmp(v->
name, 
"hanguponpolarityswitch")) {
 
19139        } 
else if (!strcasecmp(v->
name, 
"autoreoriginate")) {
 
19141        } 
else if (!strcasecmp(v->
name, 
"sendcalleridafter")) {
 
19143        } 
else if (!strcasecmp(v->
name, 
"mwimonitornotify")) {
 
19147        } 
else if (!strcasecmp(v->
name, 
"mwisendtype")) {
 
19148#ifndef HAVE_DAHDI_LINEREVERSE_VMWI   
19149            if (!strcasecmp(v->
value, 
"rpas")) { 
 
19156            memset(&confp->
chan.mwisend_setting, 0, 
sizeof(confp->
chan.mwisend_setting));
 
19158                confp->
chan.mwisend_fsk = 0;
 
19160                confp->
chan.mwisend_fsk = 1;
 
19163                confp->
chan.mwisend_rpas = 1;
 
19165                confp->
chan.mwisend_rpas = 0;
 
19168                confp->
chan.mwisend_setting.vmwi_type |= DAHDI_VMWI_LREV;
 
19171                confp->
chan.mwisend_setting.vmwi_type |= DAHDI_VMWI_HVDC;
 
19174                confp->
chan.mwisend_setting.vmwi_type |= DAHDI_VMWI_HVAC;
 
19177        } 
else if (
reload != 1) {
 
19178             if (!strcasecmp(v->
name, 
"signalling") || !strcasecmp(v->
name, 
"signaling")) {
 
19186                if (!strcasecmp(v->
value, 
"em")) {
 
19188                } 
else if (!strcasecmp(v->
value, 
"em_e1")) {
 
19190                } 
else if (!strcasecmp(v->
value, 
"em_w")) {
 
19192                } 
else if (!strcasecmp(v->
value, 
"fxs_ls")) {
 
19194                } 
else if (!strcasecmp(v->
value, 
"fxs_gs")) {
 
19196                } 
else if (!strcasecmp(v->
value, 
"fxs_ks")) {
 
19198                } 
else if (!strcasecmp(v->
value, 
"fxo_ls")) {
 
19200                } 
else if (!strcasecmp(v->
value, 
"fxo_gs")) {
 
19202                } 
else if (!strcasecmp(v->
value, 
"fxo_ks")) {
 
19204                } 
else if (!strcasecmp(v->
value, 
"fxs_rx")) {
 
19207                } 
else if (!strcasecmp(v->
value, 
"fxo_rx")) {
 
19210                } 
else if (!strcasecmp(v->
value, 
"fxs_tx")) {
 
19213                } 
else if (!strcasecmp(v->
value, 
"fxo_tx")) {
 
19216                } 
else if (!strcasecmp(v->
value, 
"em_rx")) {
 
19219                } 
else if (!strcasecmp(v->
value, 
"em_tx")) {
 
19222                } 
else if (!strcasecmp(v->
value, 
"em_rxtx")) {
 
19225                } 
else if (!strcasecmp(v->
value, 
"em_txrx")) {
 
19228                } 
else if (!strcasecmp(v->
value, 
"sf")) {
 
19230                } 
else if (!strcasecmp(v->
value, 
"sf_w")) {
 
19232                } 
else if (!strcasecmp(v->
value, 
"sf_featd")) {
 
19234                } 
else if (!strcasecmp(v->
value, 
"sf_featdmf")) {
 
19236                } 
else if (!strcasecmp(v->
value, 
"sf_featb")) {
 
19238                } 
else if (!strcasecmp(v->
value, 
"sf")) {
 
19240                } 
else if (!strcasecmp(v->
value, 
"sf_rx")) {
 
19243                } 
else if (!strcasecmp(v->
value, 
"sf_tx")) {
 
19246                } 
else if (!strcasecmp(v->
value, 
"sf_rxtx")) {
 
19249                } 
else if (!strcasecmp(v->
value, 
"sf_txrx")) {
 
19252                } 
else if (!strcasecmp(v->
value, 
"featd")) {
 
19254                } 
else if (!strcasecmp(v->
value, 
"featdmf")) {
 
19256                } 
else if (!strcasecmp(v->
value, 
"featdmf_ta")) {
 
19258                } 
else if (!strcasecmp(v->
value, 
"e911")) {
 
19260                } 
else if (!strcasecmp(v->
value, 
"fgccama")) {
 
19262                } 
else if (!strcasecmp(v->
value, 
"fgccamamf")) {
 
19264                } 
else if (!strcasecmp(v->
value, 
"featb")) {
 
19267                } 
else if (!strcasecmp(v->
value, 
"pri_net")) {
 
19269                    confp->pri.pri.nodetype = PRI_NETWORK;
 
19270                } 
else if (!strcasecmp(v->
value, 
"pri_cpe")) {
 
19272                    confp->pri.pri.nodetype = PRI_CPE;
 
19273                } 
else if (!strcasecmp(v->
value, 
"bri_cpe")) {
 
19275                    confp->pri.pri.nodetype = PRI_CPE;
 
19276                } 
else if (!strcasecmp(v->
value, 
"bri_net")) {
 
19278                    confp->pri.pri.nodetype = PRI_NETWORK;
 
19279                } 
else if (!strcasecmp(v->
value, 
"bri_cpe_ptmp")) {
 
19281                    confp->pri.pri.nodetype = PRI_CPE;
 
19282                } 
else if (!strcasecmp(v->
value, 
"bri_net_ptmp")) {
 
19283#if defined(HAVE_PRI_CALL_HOLD) 
19285                    confp->pri.pri.nodetype = PRI_NETWORK;
 
19287                    ast_log(
LOG_WARNING, 
"How cool would it be if someone implemented this mode!  For now, sucks for you. (line %d)\n", v->
lineno);
 
19290#if defined(HAVE_SS7) 
19291                } 
else if (!strcasecmp(v->
value, 
"ss7")) {
 
19295                } 
else if (!strcasecmp(v->
value, 
"mfcr2")) {
 
19298                } 
else if (!strcasecmp(v->
value, 
"auto")) {
 
19306             } 
else if (!strcasecmp(v->
name, 
"outsignalling") || !strcasecmp(v->
name, 
"outsignaling")) {
 
19307                if (!strcasecmp(v->
value, 
"em")) {
 
19309                } 
else if (!strcasecmp(v->
value, 
"em_e1")) {
 
19311                } 
else if (!strcasecmp(v->
value, 
"em_w")) {
 
19313                } 
else if (!strcasecmp(v->
value, 
"sf")) {
 
19315                } 
else if (!strcasecmp(v->
value, 
"sf_w")) {
 
19317                } 
else if (!strcasecmp(v->
value, 
"sf_featd")) {
 
19319                } 
else if (!strcasecmp(v->
value, 
"sf_featdmf")) {
 
19321                } 
else if (!strcasecmp(v->
value, 
"sf_featb")) {
 
19323                } 
else if (!strcasecmp(v->
value, 
"sf")) {
 
19325                } 
else if (!strcasecmp(v->
value, 
"featd")) {
 
19327                } 
else if (!strcasecmp(v->
value, 
"featdmf")) {
 
19329                } 
else if (!strcasecmp(v->
value, 
"featdmf_ta")) {
 
19331                } 
else if (!strcasecmp(v->
value, 
"e911")) {
 
19333                } 
else if (!strcasecmp(v->
value, 
"fgccama")) {
 
19335                } 
else if (!strcasecmp(v->
value, 
"fgccamamf")) {
 
19337                } 
else if (!strcasecmp(v->
value, 
"featb")) {
 
19343            } 
else if (!strcasecmp(v->
name, 
"pridialplan")) {
 
19344                if (!strcasecmp(v->
value, 
"national")) {
 
19345                    confp->pri.pri.dialplan = PRI_NATIONAL_ISDN + 1;
 
19346                } 
else if (!strcasecmp(v->
value, 
"unknown")) {
 
19347                    confp->pri.pri.dialplan = PRI_UNKNOWN + 1;
 
19348                } 
else if (!strcasecmp(v->
value, 
"private")) {
 
19349                    confp->pri.pri.dialplan = PRI_PRIVATE + 1;
 
19350                } 
else if (!strcasecmp(v->
value, 
"international")) {
 
19351                    confp->pri.pri.dialplan = PRI_INTERNATIONAL_ISDN + 1;
 
19352                } 
else if (!strcasecmp(v->
value, 
"local")) {
 
19353                    confp->pri.pri.dialplan = PRI_LOCAL_ISDN + 1;
 
19354                } 
else if (!strcasecmp(v->
value, 
"dynamic")) {
 
19355                    confp->pri.pri.dialplan = -1;
 
19356                } 
else if (!strcasecmp(v->
value, 
"redundant")) {
 
19357                    confp->pri.pri.dialplan = -2;
 
19361            } 
else if (!strcasecmp(v->
name, 
"prilocaldialplan")) {
 
19362                if (!strcasecmp(v->
value, 
"national")) {
 
19363                    confp->pri.pri.localdialplan = PRI_NATIONAL_ISDN + 1;
 
19364                } 
else if (!strcasecmp(v->
value, 
"unknown")) {
 
19365                    confp->pri.pri.localdialplan = PRI_UNKNOWN + 1;
 
19366                } 
else if (!strcasecmp(v->
value, 
"private")) {
 
19367                    confp->pri.pri.localdialplan = PRI_PRIVATE + 1;
 
19368                } 
else if (!strcasecmp(v->
value, 
"international")) {
 
19369                    confp->pri.pri.localdialplan = PRI_INTERNATIONAL_ISDN + 1;
 
19370                } 
else if (!strcasecmp(v->
value, 
"local")) {
 
19371                    confp->pri.pri.localdialplan = PRI_LOCAL_ISDN + 1;
 
19372                } 
else if (!strcasecmp(v->
value, 
"from_channel")) {
 
19373                    confp->pri.pri.localdialplan = 0;
 
19374                } 
else if (!strcasecmp(v->
value, 
"dynamic")) {
 
19375                    confp->pri.pri.localdialplan = -1;
 
19376                } 
else if (!strcasecmp(v->
value, 
"redundant")) {
 
19377                    confp->pri.pri.localdialplan = -2;
 
19381            } 
else if (!strcasecmp(v->
name, 
"pricpndialplan")) {
 
19382                if (!strcasecmp(v->
value, 
"national")) {
 
19383                    confp->pri.pri.cpndialplan = PRI_NATIONAL_ISDN + 1;
 
19384                } 
else if (!strcasecmp(v->
value, 
"unknown")) {
 
19385                    confp->pri.pri.cpndialplan = PRI_UNKNOWN + 1;
 
19386                } 
else if (!strcasecmp(v->
value, 
"private")) {
 
19387                    confp->pri.pri.cpndialplan = PRI_PRIVATE + 1;
 
19388                } 
else if (!strcasecmp(v->
value, 
"international")) {
 
19389                    confp->pri.pri.cpndialplan = PRI_INTERNATIONAL_ISDN + 1;
 
19390                } 
else if (!strcasecmp(v->
value, 
"local")) {
 
19391                    confp->pri.pri.cpndialplan = PRI_LOCAL_ISDN + 1;
 
19392                } 
else if (!strcasecmp(v->
value, 
"from_channel")) {
 
19393                    confp->pri.pri.cpndialplan = 0;
 
19394                } 
else if (!strcasecmp(v->
value, 
"dynamic")) {
 
19395                    confp->pri.pri.cpndialplan = -1;
 
19396                } 
else if (!strcasecmp(v->
value, 
"redundant")) {
 
19397                    confp->pri.pri.cpndialplan = -2;
 
19401            } 
else if (!strcasecmp(v->
name, 
"switchtype")) {
 
19402                if (!strcasecmp(v->
value, 
"national"))
 
19403                    confp->pri.pri.switchtype = PRI_SWITCH_NI2;
 
19404                else if (!strcasecmp(v->
value, 
"ni1"))
 
19405                    confp->pri.pri.switchtype = PRI_SWITCH_NI1;
 
19406                else if (!strcasecmp(v->
value, 
"dms100"))
 
19407                    confp->pri.pri.switchtype = PRI_SWITCH_DMS100;
 
19408                else if (!strcasecmp(v->
value, 
"4ess"))
 
19409                    confp->pri.pri.switchtype = PRI_SWITCH_ATT4ESS;
 
19410                else if (!strcasecmp(v->
value, 
"5ess"))
 
19411                    confp->pri.pri.switchtype = PRI_SWITCH_LUCENT5E;
 
19412                else if (!strcasecmp(v->
value, 
"euroisdn"))
 
19413                    confp->pri.pri.switchtype = PRI_SWITCH_EUROISDN_E1;
 
19414                else if (!strcasecmp(v->
value, 
"qsig"))
 
19415                    confp->pri.pri.switchtype = PRI_SWITCH_QSIG;
 
19420            } 
else if (!strcasecmp(v->
name, 
"msn")) {
 
19422                    sizeof(confp->pri.pri.msn_list));
 
19423            } 
else if (!strcasecmp(v->
name, 
"nsf")) {
 
19424                if (!strcasecmp(v->
value, 
"sdn"))
 
19425                    confp->pri.pri.nsf = PRI_NSF_SDN;
 
19426                else if (!strcasecmp(v->
value, 
"megacom"))
 
19427                    confp->pri.pri.nsf = PRI_NSF_MEGACOM;
 
19428                else if (!strcasecmp(v->
value, 
"tollfreemegacom"))
 
19429                    confp->pri.pri.nsf = PRI_NSF_TOLL_FREE_MEGACOM;
 
19430                else if (!strcasecmp(v->
value, 
"accunet"))
 
19431                    confp->pri.pri.nsf = PRI_NSF_ACCUNET;
 
19432                else if (!strcasecmp(v->
value, 
"none"))
 
19433                    confp->pri.pri.nsf = PRI_NSF_NONE;
 
19436                    confp->pri.pri.nsf = PRI_NSF_NONE;
 
19438            } 
else if (!strcasecmp(v->
name, 
"priindication")) {
 
19439                if (!strcasecmp(v->
value, 
"outofband"))
 
19441                else if (!strcasecmp(v->
value, 
"inband"))
 
19444                    ast_log(
LOG_WARNING, 
"'%s' is not a valid pri indication value, should be 'inband' or 'outofband' at line %d.\n",
 
19446            } 
else if (!strcasecmp(v->
name, 
"priexclusive")) {
 
19448            } 
else if (!strcasecmp(v->
name, 
"internationalprefix")) {
 
19449                ast_copy_string(confp->pri.pri.internationalprefix, v->
value, 
sizeof(confp->pri.pri.internationalprefix));
 
19450            } 
else if (!strcasecmp(v->
name, 
"nationalprefix")) {
 
19451                ast_copy_string(confp->pri.pri.nationalprefix, v->
value, 
sizeof(confp->pri.pri.nationalprefix));
 
19452            } 
else if (!strcasecmp(v->
name, 
"localprefix")) {
 
19454            } 
else if (!strcasecmp(v->
name, 
"privateprefix")) {
 
19455                ast_copy_string(confp->pri.pri.privateprefix, v->
value, 
sizeof(confp->pri.pri.privateprefix));
 
19456            } 
else if (!strcasecmp(v->
name, 
"unknownprefix")) {
 
19457                ast_copy_string(confp->pri.pri.unknownprefix, v->
value, 
sizeof(confp->pri.pri.unknownprefix));
 
19458            } 
else if (!strcasecmp(v->
name, 
"resetinterval")) {
 
19459                if (!strcasecmp(v->
value, 
"never"))
 
19460                    confp->pri.pri.resetinterval = -1;
 
19461                else if (atoi(v->
value) >= 60)
 
19462                    confp->pri.pri.resetinterval = atoi(v->
value);
 
19464                    ast_log(
LOG_WARNING, 
"'%s' is not a valid reset interval, should be >= 60 seconds or 'never' at line %d.\n",
 
19466            } 
else if (!strcasecmp(v->
name, 
"force_restart_unavailable_chans")) {
 
19467                confp->pri.pri.force_restart_unavailable_chans = 
ast_true(v->
value);
 
19468            } 
else if (!strcasecmp(v->
name, 
"minunused")) {
 
19469                confp->pri.pri.minunused = atoi(v->
value);
 
19470            } 
else if (!strcasecmp(v->
name, 
"minidle")) {
 
19471                confp->pri.pri.minidle = atoi(v->
value);
 
19472            } 
else if (!strcasecmp(v->
name, 
"idleext")) {
 
19474            } 
else if (!strcasecmp(v->
name, 
"idledial")) {
 
19476            } 
else if (!strcasecmp(v->
name, 
"overlapdial")) {
 
19479                } 
else if (!strcasecmp(v->
value, 
"incoming")) {
 
19481                } 
else if (!strcasecmp(v->
value, 
"outgoing")) {
 
19488#ifdef HAVE_PRI_PROG_W_CAUSE 
19489            } 
else if (!strcasecmp(v->
name, 
"qsigchannelmapping")) {
 
19490                if (!strcasecmp(v->
value, 
"logical")) {
 
19492                } 
else if (!strcasecmp(v->
value, 
"physical")) {
 
19498            } 
else if (!strcasecmp(v->
name, 
"discardremoteholdretrieval")) {
 
19499                confp->pri.pri.discardremoteholdretrieval = 
ast_true(v->
value);
 
19500#if defined(HAVE_PRI_SERVICE_MESSAGES) 
19501            } 
else if (!strcasecmp(v->
name, 
"service_message_support")) {
 
19503                if ((confp->pri.pri.switchtype == PRI_SWITCH_ATT4ESS
 
19504                    || confp->pri.pri.switchtype == PRI_SWITCH_LUCENT5E
 
19505                    || confp->pri.pri.switchtype == PRI_SWITCH_NI2) && 
ast_true(v->
value)) {
 
19506                    confp->pri.pri.enable_service_message_support = 1;
 
19508                    confp->pri.pri.enable_service_message_support = 0;
 
19511#ifdef HAVE_PRI_INBANDDISCONNECT 
19512            } 
else if (!strcasecmp(v->
name, 
"inbanddisconnect")) {
 
19515            } 
else if (!strcasecmp(v->
name, 
"pritimer")) {
 
19516#ifdef PRI_GETSET_TIMERS 
19527                    timeridx = pri_timer2idx(timerc);
 
19529                    if (timeridx < 0 || PRI_MAX_TIMERS <= timeridx) {
 
19531                            "'%s' is not a valid ISDN timer at line %d.\n", timerc,
 
19533                    } 
else if (!
timer) {
 
19535                            "'%s' is not a valid value for ISDN timer '%s' at line %d.\n",
 
19538                        confp->pri.pri.pritimers[timeridx] = 
timer;
 
19542                        "'%s' is not a valid ISDN timer configuration string at line %d.\n",
 
19546            } 
else if (!strcasecmp(v->
name, 
"facilityenable")) {
 
19548#if defined(HAVE_PRI_AOC_EVENTS) 
19549            } 
else if (!strcasecmp(v->
name, 
"aoc_enable")) {
 
19550                confp->pri.pri.aoc_passthrough_flag = 0;
 
19551                if (strchr(v->
value, 
's') || strchr(v->
value, 
'S')) {
 
19554                if (strchr(v->
value, 
'd') || strchr(v->
value, 
'D')) {
 
19557                if (strchr(v->
value, 
'e') || strchr(v->
value, 
'E')) {
 
19560            } 
else if (!strcasecmp(v->
name, 
"aoce_delayhangup")) {
 
19563#if defined(HAVE_PRI_CALL_HOLD) 
19564            } 
else if (!strcasecmp(v->
name, 
"hold_disconnect_transfer")) {
 
19565                confp->pri.pri.hold_disconnect_transfer = 
ast_true(v->
value);
 
19567            } 
else if (!strcasecmp(v->
name, 
"moh_signaling")
 
19568                || !strcasecmp(v->
name, 
"moh_signalling")) {
 
19569                if (!strcasecmp(v->
value, 
"moh")) {
 
19571                } 
else if (!strcasecmp(v->
value, 
"notify")) {
 
19573#if defined(HAVE_PRI_CALL_HOLD) 
19574                } 
else if (!strcasecmp(v->
value, 
"hold")) {
 
19575                    confp->pri.pri.moh_signaling = SIG_PRI_MOH_SIGNALING_HOLD;
 
19580#if defined(HAVE_PRI_CCSS) 
19581            } 
else if (!strcasecmp(v->
name, 
"cc_ptmp_recall_mode")) {
 
19582                if (!strcasecmp(v->
value, 
"global")) {
 
19583                    confp->pri.pri.cc_ptmp_recall_mode = 0;
 
19584                } 
else if (!strcasecmp(v->
value, 
"specific")) {
 
19585                    confp->pri.pri.cc_ptmp_recall_mode = 1;
 
19587                    confp->pri.pri.cc_ptmp_recall_mode = 1;
 
19589            } 
else if (!strcasecmp(v->
name, 
"cc_qsig_signaling_link_req")) {
 
19590                if (!strcasecmp(v->
value, 
"release")) {
 
19591                    confp->pri.pri.cc_qsig_signaling_link_req = 0;
 
19592                } 
else if (!strcasecmp(v->
value, 
"retain")) {
 
19593                    confp->pri.pri.cc_qsig_signaling_link_req = 1;
 
19594                } 
else if (!strcasecmp(v->
value, 
"do_not_care")) {
 
19595                    confp->pri.pri.cc_qsig_signaling_link_req = 2;
 
19597                    confp->pri.pri.cc_qsig_signaling_link_req = 1;
 
19599            } 
else if (!strcasecmp(v->
name, 
"cc_qsig_signaling_link_rsp")) {
 
19600                if (!strcasecmp(v->
value, 
"release")) {
 
19601                    confp->pri.pri.cc_qsig_signaling_link_rsp = 0;
 
19602                } 
else if (!strcasecmp(v->
value, 
"retain")) {
 
19603                    confp->pri.pri.cc_qsig_signaling_link_rsp = 1;
 
19605                    confp->pri.pri.cc_qsig_signaling_link_rsp = 1;
 
19608#if defined(HAVE_PRI_CALL_WAITING) 
19609            } 
else if (!strcasecmp(v->
name, 
"max_call_waiting_calls")) {
 
19610                confp->pri.pri.max_call_waiting_calls = atoi(v->
value);
 
19611                if (confp->pri.pri.max_call_waiting_calls < 0) {
 
19613                    confp->pri.pri.max_call_waiting_calls = 0;
 
19615            } 
else if (!strcasecmp(v->
name, 
"allow_call_waiting_calls")) {
 
19616                confp->pri.pri.allow_call_waiting_calls = 
ast_true(v->
value);
 
19618#if defined(HAVE_PRI_MWI) 
19619            } 
else if (!strcasecmp(v->
name, 
"mwi_mailboxes")) {
 
19621                    sizeof(confp->pri.pri.mwi_mailboxes));
 
19622            } 
else if (!strcasecmp(v->
name, 
"mwi_vm_boxes")) {
 
19624                    sizeof(confp->pri.pri.mwi_vm_boxes));
 
19625            } 
else if (!strcasecmp(v->
name, 
"mwi_vm_numbers")) {
 
19627                    sizeof(confp->pri.pri.mwi_vm_numbers));
 
19629            } 
else if (!strcasecmp(v->
name, 
"append_msn_to_cid_tag")) {
 
19630                confp->pri.pri.append_msn_to_user_tag = 
ast_true(v->
value);
 
19631            } 
else if (!strcasecmp(v->
name, 
"inband_on_setup_ack")) {
 
19633            } 
else if (!strcasecmp(v->
name, 
"inband_on_proceeding")) {
 
19635#if defined(HAVE_PRI_DISPLAY_TEXT) 
19636            } 
else if (!strcasecmp(v->
name, 
"display_send")) {
 
19637                confp->pri.pri.display_flags_send = dahdi_display_text_option(v->
value);
 
19638            } 
else if (!strcasecmp(v->
name, 
"display_receive")) {
 
19639                confp->pri.pri.display_flags_receive = dahdi_display_text_option(v->
value);
 
19641#if defined(HAVE_PRI_MCID) 
19642            } 
else if (!strcasecmp(v->
name, 
"mcid_send")) {
 
19645#if defined(HAVE_PRI_DATETIME_SEND) 
19646            } 
else if (!strcasecmp(v->
name, 
"datetime_send")) {
 
19647                confp->pri.pri.datetime_send = dahdi_datetime_send_option(v->
value);
 
19649            } 
else if (!strcasecmp(v->
name, 
"layer1_presence")) {
 
19650                if (!strcasecmp(v->
value, 
"required")) {
 
19651                    confp->pri.pri.layer1_ignored = 0;
 
19652                } 
else if (!strcasecmp(v->
value, 
"ignore")) {
 
19653                    confp->pri.pri.layer1_ignored = 1;
 
19656                    confp->pri.pri.layer1_ignored = 0;
 
19658#if defined(HAVE_PRI_L2_PERSISTENCE) 
19659            } 
else if (!strcasecmp(v->
name, 
"layer2_persistence")) {
 
19660                if (!strcasecmp(v->
value, 
"keep_up")) {
 
19661                    confp->pri.pri.l2_persistence = PRI_L2_PERSISTENCE_KEEP_UP;
 
19662                } 
else if (!strcasecmp(v->
value, 
"leave_down")) {
 
19663                    confp->pri.pri.l2_persistence = PRI_L2_PERSISTENCE_LEAVE_DOWN;
 
19665                    confp->pri.pri.l2_persistence = PRI_L2_PERSISTENCE_DEFAULT;
 
19668            } 
else if (!strcasecmp(v->
name, 
"colp_send")) {
 
19669                if (!strcasecmp(v->
value, 
"block")) {
 
19671                } 
else if (!strcasecmp(v->
value, 
"connect")) {
 
19673                } 
else if (!strcasecmp(v->
value, 
"update")) {
 
19679#if defined(HAVE_SS7) 
19680            } 
else if (!strcasecmp(v->
name, 
"ss7type")) {
 
19681                if (!strcasecmp(v->
value, 
"itu")) {
 
19682                    cur_ss7type = SS7_ITU;
 
19683                } 
else if (!strcasecmp(v->
value, 
"ansi")) {
 
19684                    cur_ss7type = SS7_ANSI;
 
19688            } 
else if (!strcasecmp(v->
name, 
"slc")) {
 
19689                cur_slc = atoi(v->
value);
 
19690            } 
else if (!strcasecmp(v->
name, 
"linkset")) {
 
19691                cur_linkset = atoi(v->
value);
 
19692            } 
else if (!strcasecmp(v->
name, 
"pointcode")) {
 
19693                cur_pointcode = parse_pointcode(v->
value);
 
19694            } 
else if (!strcasecmp(v->
name, 
"adjpointcode")) {
 
19695                cur_adjpointcode = parse_pointcode(v->
value);
 
19696            } 
else if (!strcasecmp(v->
name, 
"defaultdpc")) {
 
19697                cur_defaultdpc = parse_pointcode(v->
value);
 
19698            } 
else if (!strcasecmp(v->
name, 
"cicbeginswith")) {
 
19699                cur_cicbeginswith = atoi(v->
value);
 
19700            } 
else if (!strcasecmp(v->
name, 
"networkindicator")) {
 
19701                if (!strcasecmp(v->
value, 
"national")) {
 
19702                    cur_networkindicator = SS7_NI_NAT;
 
19703                } 
else if (!strcasecmp(v->
value, 
"national_spare")) {
 
19704                    cur_networkindicator = SS7_NI_NAT_SPARE;
 
19705                } 
else if (!strcasecmp(v->
value, 
"international")) {
 
19706                    cur_networkindicator = SS7_NI_INT;
 
19707                } 
else if (!strcasecmp(v->
value, 
"international_spare")) {
 
19708                    cur_networkindicator = SS7_NI_INT_SPARE;
 
19710                    cur_networkindicator = -1;
 
19712            } 
else if (!strcasecmp(v->
name, 
"ss7_internationalprefix")) {
 
19713                ast_copy_string(confp->ss7.ss7.internationalprefix, v->
value, 
sizeof(confp->ss7.ss7.internationalprefix));
 
19714            } 
else if (!strcasecmp(v->
name, 
"ss7_nationalprefix")) {
 
19715                ast_copy_string(confp->ss7.ss7.nationalprefix, v->
value, 
sizeof(confp->ss7.ss7.nationalprefix));
 
19716            } 
else if (!strcasecmp(v->
name, 
"ss7_subscriberprefix")) {
 
19717                ast_copy_string(confp->ss7.ss7.subscriberprefix, v->
value, 
sizeof(confp->ss7.ss7.subscriberprefix));
 
19718            } 
else if (!strcasecmp(v->
name, 
"ss7_unknownprefix")) {
 
19719                ast_copy_string(confp->ss7.ss7.unknownprefix, v->
value, 
sizeof(confp->ss7.ss7.unknownprefix));
 
19720            } 
else if (!strcasecmp(v->
name, 
"ss7_networkroutedprefix")) {
 
19721                ast_copy_string(confp->ss7.ss7.networkroutedprefix, v->
value, 
sizeof(confp->ss7.ss7.networkroutedprefix));
 
19722            } 
else if (!strcasecmp(v->
name, 
"ss7_called_nai")) {
 
19723                if (!strcasecmp(v->
value, 
"national")) {
 
19724                    confp->ss7.ss7.called_nai = SS7_NAI_NATIONAL;
 
19725                } 
else if (!strcasecmp(v->
value, 
"international")) {
 
19726                    confp->ss7.ss7.called_nai = SS7_NAI_INTERNATIONAL;
 
19727                } 
else if (!strcasecmp(v->
value, 
"subscriber")) {
 
19728                    confp->ss7.ss7.called_nai = SS7_NAI_SUBSCRIBER;
 
19729                } 
else if (!strcasecmp(v->
value, 
"unknown")) {
 
19730                    confp->ss7.ss7.called_nai = SS7_NAI_UNKNOWN;
 
19731                } 
else if (!strcasecmp(v->
value, 
"dynamic")) {
 
19736            } 
else if (!strcasecmp(v->
name, 
"ss7_calling_nai")) {
 
19737                if (!strcasecmp(v->
value, 
"national")) {
 
19738                    confp->ss7.ss7.calling_nai = SS7_NAI_NATIONAL;
 
19739                } 
else if (!strcasecmp(v->
value, 
"international")) {
 
19740                    confp->ss7.ss7.calling_nai = SS7_NAI_INTERNATIONAL;
 
19741                } 
else if (!strcasecmp(v->
value, 
"subscriber")) {
 
19742                    confp->ss7.ss7.calling_nai = SS7_NAI_SUBSCRIBER;
 
19743                } 
else if (!strcasecmp(v->
value, 
"unknown")) {
 
19744                    confp->ss7.ss7.calling_nai = SS7_NAI_UNKNOWN;
 
19745                } 
else if (!strcasecmp(v->
value, 
"dynamic")) {
 
19750            } 
else if (!strcasecmp(v->
name, 
"sigchan")) {
 
19752                sigchan = atoi(v->
value);
 
19753                res = linkset_addsigchan(sigchan);
 
19757            } 
else if (!strcasecmp(v->
name, 
"ss7_explicitacm")) {
 
19758                struct dahdi_ss7 *link;
 
19759                link = ss7_resolve_linkset(cur_linkset);
 
19767                    link->ss7.flags &= ~LINKSET_FLAG_EXPLICITACM;
 
19769            } 
else if (!strcasecmp(v->
name, 
"ss7_autoacm")) {
 
19770                struct dahdi_ss7 *link;
 
19771                link = ss7_resolve_linkset(cur_linkset);
 
19779                    link->ss7.flags &= ~LINKSET_FLAG_AUTOACM;
 
19781            } 
else if (!strcasecmp(v->
name, 
"ss7_initialhwblo")) {
 
19782                struct dahdi_ss7 *link;
 
19783                link = ss7_resolve_linkset(cur_linkset);
 
19791                    link->ss7.flags &= ~LINKSET_FLAG_INITIALHWBLO;
 
19793            } 
else if (!strcasecmp(v->
name, 
"ss7_use_echocontrol")) {
 
19794                struct dahdi_ss7 *link;
 
19795                link = ss7_resolve_linkset(cur_linkset);
 
19803                    link->ss7.flags &= ~LINKSET_FLAG_USEECHOCONTROL;
 
19805            } 
else if (!strcasecmp(v->
name, 
"ss7_default_echocontrol")) {
 
19806                struct dahdi_ss7 *link;
 
19807                link = ss7_resolve_linkset(cur_linkset);
 
19815                    link->ss7.flags &= ~LINKSET_FLAG_DEFAULTECHOCONTROL;
 
19817            } 
else if (!strncasecmp(v->
name, 
"isup_timer.", 11)) {
 
19818                struct dahdi_ss7 *link;
 
19819                link = ss7_resolve_linkset(cur_linkset);
 
19824                if (!link->ss7.ss7) {
 
19826                } 
else if (!ss7_set_isup_timer(link->ss7.ss7, strstr(v->
name, 
".") + 1, atoi(v->
value))) {
 
19829            } 
else if (!strncasecmp(v->
name, 
"mtp3_timer.", 11)) {
 
19830                struct dahdi_ss7 *link;
 
19831                link = ss7_resolve_linkset(cur_linkset);
 
19836                if (!link->ss7.ss7) {
 
19838                } 
else if (!ss7_set_mtp3_timer(link->ss7.ss7, strstr(v->
name, 
".") + 1, atoi(v->
value))) {
 
19841            } 
else if (!strcasecmp(v->
name, 
"inr_if_no_calling")) {
 
19842                struct dahdi_ss7 *link;
 
19843                link = ss7_resolve_linkset(cur_linkset);
 
19848                if (!link->ss7.ss7) {
 
19851                    ss7_set_flags(link->ss7.ss7, SS7_INR_IF_NO_CALLING);
 
19853                    ss7_clear_flags(link->ss7.ss7, SS7_INR_IF_NO_CALLING);
 
19855            } 
else if (!strcasecmp(v->
name, 
"non_isdn_access")) {
 
19856                struct dahdi_ss7 *link;
 
19857                link = ss7_resolve_linkset(cur_linkset);
 
19862                if (!link->ss7.ss7) {
 
19865                    ss7_clear_flags(link->ss7.ss7, SS7_ISDN_ACCESS_INDICATOR);
 
19867                    ss7_set_flags(link->ss7.ss7, SS7_ISDN_ACCESS_INDICATOR);
 
19869            } 
else if (!strcasecmp(v->
name, 
"sls_shift")) {
 
19870                struct dahdi_ss7 *link;
 
19871                int sls_shift = atoi(v->
value);
 
19873                if (sls_shift < 0 || sls_shift > 7) {
 
19878                link = ss7_resolve_linkset(cur_linkset);
 
19883                if (!link->ss7.ss7) {
 
19886                    ss7_set_sls_shift(link->ss7.ss7, sls_shift);
 
19888            } 
else if (!strcasecmp(v->
name, 
"cause_location")) {
 
19889                struct dahdi_ss7 *link;
 
19890                int cause_location = atoi(v->
value);
 
19892                if (cause_location < 0 || cause_location > 15) {
 
19893                    ast_log(
LOG_ERROR, 
"Invalid cause_location value.  Must be between 0 and 15\n");
 
19896                link = ss7_resolve_linkset(cur_linkset);
 
19901                if (!link->ss7.ss7) {
 
19904                    ss7_set_cause_location(link->ss7.ss7, cause_location);
 
19908            } 
else if (!strcasecmp(v->
name, 
"mfcr2_advanced_protocol_file")) {
 
19910                ast_log(
LOG_WARNING, 
"MFC/R2 Protocol file '%s' will be used, you only should use this if you *REALLY KNOW WHAT YOU ARE DOING*.\n", confp->mfcr2.r2proto_file);
 
19911            } 
else if (!strcasecmp(v->
name, 
"mfcr2_logdir")) {
 
19913            } 
else if (!strcasecmp(v->
name, 
"mfcr2_variant")) {
 
19914                confp->mfcr2.variant = openr2_proto_get_variant(v->
value);
 
19915                if (OR2_VAR_UNKNOWN == confp->mfcr2.variant) {
 
19917                    confp->mfcr2.variant = OR2_VAR_ITU;
 
19919            } 
else if (!strcasecmp(v->
name, 
"mfcr2_mfback_timeout")) {
 
19920                confp->mfcr2.mfback_timeout = atoi(v->
value);
 
19921                if (!confp->mfcr2.mfback_timeout) {
 
19922                    ast_log(
LOG_WARNING, 
"MF timeout of 0? hum, I will protect you from your ignorance. Setting default.\n");
 
19923                    confp->mfcr2.mfback_timeout = -1;
 
19924                } 
else if (confp->mfcr2.mfback_timeout > 0 && confp->mfcr2.mfback_timeout < 500) {
 
19925                    ast_log(
LOG_WARNING, 
"MF timeout less than 500ms is not recommended, you have been warned!\n");
 
19927            } 
else if (!strcasecmp(v->
name, 
"mfcr2_metering_pulse_timeout")) {
 
19928                confp->mfcr2.metering_pulse_timeout = atoi(v->
value);
 
19929                if (confp->mfcr2.metering_pulse_timeout > 500) {
 
19930                    ast_log(
LOG_WARNING, 
"Metering pulse timeout greater than 500ms is not recommended, you have been warned!\n");
 
19932#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 2 
19933            } 
else if (!strcasecmp(v->
name, 
"mfcr2_dtmf_detection")) {
 
19935            } 
else if (!strcasecmp(v->
name, 
"mfcr2_dtmf_dialing")) {
 
19937            } 
else if (!strcasecmp(v->
name, 
"mfcr2_dtmf_time_on")) {
 
19938                confp->mfcr2.dtmf_time_on = atoi(v->
value);
 
19939            } 
else if (!strcasecmp(v->
name, 
"mfcr2_dtmf_time_off")) {
 
19940                confp->mfcr2.dtmf_time_off = atoi(v->
value);
 
19942#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 3 
19943            } 
else if (!strcasecmp(v->
name, 
"mfcr2_dtmf_end_timeout")) {
 
19944                confp->mfcr2.dtmf_end_timeout = atoi(v->
value);
 
19946            } 
else if (!strcasecmp(v->
name, 
"mfcr2_get_ani_first")) {
 
19948            } 
else if (!strcasecmp(v->
name, 
"mfcr2_double_answer")) {
 
19950            } 
else if (!strcasecmp(v->
name, 
"mfcr2_charge_calls")) {
 
19952            } 
else if (!strcasecmp(v->
name, 
"mfcr2_accept_on_offer")) {
 
19954            } 
else if (!strcasecmp(v->
name, 
"mfcr2_allow_collect_calls")) {
 
19955                confp->mfcr2.allow_collect_calls = 
ast_true(v->
value) ? 1 : 0;
 
19956            } 
else if (!strcasecmp(v->
name, 
"mfcr2_forced_release")) {
 
19958            } 
else if (!strcasecmp(v->
name, 
"mfcr2_immediate_accept")) {
 
19959                confp->mfcr2.immediate_accept = 
ast_true(v->
value) ? 1 : 0;
 
19960#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 1 
19961            } 
else if (!strcasecmp(v->
name, 
"mfcr2_skip_category")) {
 
19962                confp->mfcr2.skip_category_request = 
ast_true(v->
value) ? 1 : 0;
 
19964            } 
else if (!strcasecmp(v->
name, 
"mfcr2_call_files")) {
 
19966            } 
else if (!strcasecmp(v->
name, 
"mfcr2_max_ani")) {
 
19967                confp->mfcr2.max_ani = atoi(v->
value);
 
19971            } 
else if (!strcasecmp(v->
name, 
"mfcr2_max_dnis")) {
 
19972                confp->mfcr2.max_dnis = atoi(v->
value);
 
19976            } 
else if (!strcasecmp(v->
name, 
"mfcr2_category")) {
 
19977                confp->mfcr2.category = openr2_proto_get_category(v->
value);
 
19978                if (OR2_CALLING_PARTY_CATEGORY_UNKNOWN == confp->mfcr2.category) {
 
19979                    confp->mfcr2.category = OR2_CALLING_PARTY_CATEGORY_NATIONAL_SUBSCRIBER;
 
19980                    ast_log(
LOG_WARNING, 
"Invalid MFC/R2 caller category '%s' at line %d. Using national subscriber as default.\n",
 
19983            } 
else if (!strcasecmp(v->
name, 
"mfcr2_logging")) {
 
19984                openr2_log_level_t tmplevel;
 
19991                    clevel = 
strsep(&logval,
",");
 
19992                    if (-1 == (tmplevel = openr2_log_get_level(clevel))) {
 
19996                    confp->mfcr2.loglevel |= tmplevel;
 
19999            } 
else if (!strcasecmp(v->
name, 
"cadence")) {
 
20001                int element_count, 
c[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
 
20003                struct dahdi_ring_cadence new_cadence;
 
20004                int cid_location = -1;
 
20005                int firstcadencepos = 0;
 
20006                char original_args[80];
 
20007                int cadence_is_ok = 1;
 
20011                element_count = sscanf(v->
value, 
"%30d,%30d,%30d,%30d,%30d,%30d,%30d,%30d,%30d,%30d,%30d,%30d,%30d,%30d,%30d,%30d", &
c[0], &
c[1], &
c[2], &
c[3], &
c[4], &
c[5], &
c[6], &
c[7], &
c[8], &
c[9], &
c[10], &
c[11], &
c[12], &
c[13], &
c[14], &
c[15]);
 
20014                if (element_count % 2 == 1) {
 
20015                    ast_log(
LOG_ERROR, 
"Must be a silence duration for each ring duration: %s at line %d.\n", original_args, v->
lineno);
 
20025                for (i = 0; i < element_count; i++) {
 
20027                        ast_log(
LOG_ERROR, 
"Ring or silence duration cannot be zero: %s at line %d.\n", original_args, v->
lineno);
 
20030                    } 
else if (
c[i] < 0) {
 
20033                            if (cid_location == -1) {
 
20042                            if (firstcadencepos == 0) {
 
20043                                firstcadencepos = i; 
 
20046                                 ast_log(
LOG_ERROR, 
"First cadence position specified twice: %s at line %d.\n", original_args, v->
lineno);
 
20055                for (i = 0; i < 16; i++) {
 
20056                    new_cadence.ringcadence[i] = 
c[i];
 
20059                if (cadence_is_ok) {
 
20061                    if (element_count < 2) {
 
20064                        if (cid_location == -1) {
 
20069                            cid_location = (cid_location + 1) / 2;
 
20084            } 
else if (!strcasecmp(v->
name, 
"ringtimeout")) {
 
20086            } 
else if (!strcasecmp(v->
name, 
"prewink")) {
 
20088            } 
else if (!strcasecmp(v->
name, 
"preflash")) {
 
20090            } 
else if (!strcasecmp(v->
name, 
"wink")) {
 
20092            } 
else if (!strcasecmp(v->
name, 
"flash")) {
 
20094            } 
else if (!strcasecmp(v->
name, 
"start")) {
 
20096            } 
else if (!strcasecmp(v->
name, 
"rxwink")) {
 
20098            } 
else if (!strcasecmp(v->
name, 
"rxflash")) {
 
20100            } 
else if (!strcasecmp(v->
name, 
"debounce")) {
 
20102            } 
else if (!strcasecmp(v->
name, 
"toneduration")) {
 
20106                struct dahdi_dialparams dps;
 
20108                ctlfd = open(
"/dev/dahdi/ctl", O_RDWR);
 
20114                toneduration = atoi(v->
value);
 
20115                if (toneduration > -1) {
 
20116                    memset(&dps, 0, 
sizeof(dps));
 
20118                    dps.dtmf_tonelen = dps.mfv1_tonelen = toneduration;
 
20119                    res = ioctl(ctlfd, DAHDI_SET_DIALPARAMS, &dps);
 
20127            } 
else if (!strcasecmp(v->
name, 
"defaultcic")) {
 
20129            } 
else if (!strcasecmp(v->
name, 
"defaultozz")) {
 
20131            } 
else if (!strcasecmp(v->
name, 
"mwilevel")) {
 
20133            } 
else if (!strcasecmp(v->
name, 
"dtmfcidlevel")) {
 
20135            } 
else if (!strcasecmp(v->
name, 
"reportalarms")) {
 
20136                if (!strcasecmp(v->
value, 
"all"))
 
20138                if (!strcasecmp(v->
value, 
"none"))
 
20140                else if (!strcasecmp(v->
value, 
"channels"))
 
20142               else if (!strcasecmp(v->
value, 
"spans"))
 
20154                    "Dahdichan '%s' failure ignored: ignore_failed_channels.\n",
 
20172    for (tmp = 
iflist, y=-1; tmp; tmp = tmp->
next) {
 
20190        if (
conf.chan.cc_params) {
 
20196            ast_verb(3, 
"Automatically generated pseudo channel\n");
 
 
20260    static int had_cfg_before = 1;
 
20263    have_cfg_now = !!cfg;
 
20266        if (had_cfg_before) {
 
20277        have_cfg_now = !!cfg;
 
20279            if (had_cfg_before) {
 
20298    had_cfg_before = have_cfg_now;
 
20307            if (!strcasecmp(v->
name, 
"trunkgroup")) {
 
20308                trunkgroup = atoi(v->
value);
 
20309                if (trunkgroup > 0) {
 
20310                    if ((
c = strchr(v->
value, 
','))) {
 
20312                        memset(dchannels, 0, 
sizeof(dchannels));
 
20314                            dchannels[i] = atoi(
c + 1);
 
20315                            if (dchannels[i] < 0) {
 
20316                                ast_log(
LOG_WARNING, 
"D-channel for trunk group %d must be a positive number at line %d of chan_dahdi.conf\n", trunkgroup, v->
lineno);
 
20319                            c = strchr(
c + 1, 
',');
 
20322                            if (pri_create_trunkgroup(trunkgroup, dchannels)) {
 
20323                                ast_log(
LOG_WARNING, 
"Unable to create trunk group %d with Primary D-channel %d at line %d of chan_dahdi.conf\n", trunkgroup, dchannels[0], v->
lineno);
 
20325                                ast_verb(2, 
"Created trunk group %d with Primary D-channel %d and %d backup%s\n", trunkgroup, dchannels[0], i - 1, (i == 1) ? 
"" : 
"s");
 
20327                            ast_log(
LOG_WARNING, 
"Trunk group %d lacks any valid D-channels at line %d of chan_dahdi.conf\n", trunkgroup, v->
lineno);
 
20329                        ast_log(
LOG_WARNING, 
"Trunk group %d lacks a primary D-channel at line %d of chan_dahdi.conf\n", trunkgroup, v->
lineno);
 
20331                    ast_log(
LOG_WARNING, 
"Trunk group identifier must be a positive integer at line %d of chan_dahdi.conf\n", v->
lineno);
 
20332            } 
else if (!strcasecmp(v->
name, 
"spanmap")) {
 
20333                spanno = atoi(v->
value);
 
20335                    if ((
c = strchr(v->
value, 
','))) {
 
20336                        trunkgroup = atoi(
c + 1);
 
20337                        if (trunkgroup > 0) {
 
20338                            if ((
c = strchr(
c + 1, 
',')))
 
20339                                logicalspan = atoi(
c + 1);
 
20342                            if (logicalspan >= 0) {
 
20343                                if (pri_create_spanmap(spanno - 1, trunkgroup, logicalspan)) {
 
20344                                    ast_log(
LOG_WARNING, 
"Failed to map span %d to trunk group %d (logical span %d)\n", spanno, trunkgroup, logicalspan);
 
20346                                    ast_verb(2, 
"Mapped span %d to trunk group %d (logical span %d)\n", spanno, trunkgroup, logicalspan);
 
20348                                ast_log(
LOG_WARNING, 
"Logical span must be a positive number, or '0' (for unspecified) at line %d of chan_dahdi.conf\n", v->
lineno);
 
20382        if (!strcasecmp(cat, 
"general") ||
 
20383            !strcasecmp(cat, 
"trunkgroups") ||
 
20384            !strcasecmp(cat, 
"globals") ||
 
20385            !strcasecmp(cat, 
"channels")) {
 
20412            if (pris[x].pri.
pvts[0] &&
 
20414                prepare_pri(pris + x);
 
20419                    ast_verb(2, 
"Starting D-Channel on span %d\n", x + 1);
 
20424#if defined(HAVE_SS7) 
20428            if (linksets[x].ss7.
ss7) {
 
20433                    ast_verb(2, 
"Starting SS7 linkset on span %d\n", x + 1);
 
20440        struct r2link_entry *cur;
 
20444            struct dahdi_mfcr2 *r2 = &cur->mfcr2;
 
20447                    ast_log(
LOG_ERROR, 
"Unable to start R2 monitor on channel group %d\n", x + 1);
 
20450                    ast_verb(2, 
"Starting R2 monitor on channel group %d\n", x + 1);
 
 
20504#if defined(HAVE_PRI) || defined(HAVE_SS7) 
20525    memset(pris, 0, 
sizeof(pris));
 
20529    pri_set_error(dahdi_pri_error);
 
20530    pri_set_message(dahdi_pri_message);
 
20532#ifdef HAVE_PRI_PROG_W_CAUSE 
20535#if defined(HAVE_PRI_CCSS) 
20543#
if defined(HAVE_PRI_CCSS)
 
20553#if defined(HAVE_SS7) 
20554    memset(linksets, 0, 
sizeof(linksets));
 
20558    ss7_set_error(dahdi_ss7_error);
 
20559    ss7_set_message(dahdi_ss7_message);
 
20578#if defined(HAVE_SS7) 
20599#if defined(HAVE_PRI) 
 
20613#define END_SILENCE_LEN 400 
20614#define HEADER_MS 50 
20615#define TRAILER_MS 5 
20616#define HEADER_LEN ((HEADER_MS + TRAILER_MS) * 8) 
20617#define ASCII_BYTES_PER_CHAR 80 
20619    unsigned char *
buf,*mybuf;
 
20621    struct pollfd fds[1];
 
20622    int size,res,fd,
len,x;
 
20644    if ((!p->
tdd) && (!p->
mate)) {
 
20645#if defined(HAVE_PRI) 
20646#if defined(HAVE_PRI_DISPLAY_TEXT) 
20671        for (x = 0; 
text[x]; x++) {
 
20699        fds[0].events = POLLOUT | POLLPRI;
 
20700        fds[0].revents = 0;
 
20701        res = poll(fds, 1, -1);
 
20707        if (fds[0].revents & POLLPRI) {
 
20711        if (!(fds[0].revents & POLLOUT)) {
 
20715        res = write(fd, 
buf, size);
 
 
20754    .
requires = 
"ccss",
 
20755    .optional_modules = 
"res_smdi",
 
Common implementation-independent jitterbuffer stuff.
void ast_jb_configure(struct ast_channel *chan, const struct ast_jb_conf *conf)
Configures a jitterbuffer on a channel.
int ast_jb_read_conf(struct ast_jb_conf *conf, const char *varname, const char *value)
Sets jitterbuffer configuration property.
ADSI Support (built upon Caller*ID)
void ast_cli_unregister_multiple(void)
A-Law to Signed linear conversion.
struct sla_ringing_trunk * last
static int copy(char *infile, char *outfile)
Utility function to copy a file.
Persistent data storage (akin to *doze registry)
int ast_db_put(const char *family, const char *key, const char *value)
Store value addressed by family/key.
int ast_db_get(const char *family, const char *key, char *value, int valuelen)
Get key value specified by family/key.
int ast_db_del(const char *family, const char *key)
Delete entry in astdb.
char * strsep(char **str, const char *delims)
char * strcasestr(const char *, const char *)
Asterisk main include file. File version handling, generic pbx functions.
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
#define ast_strdup(str)
A wrapper for strdup()
#define ast_strdupa(s)
duplicate a string in memory from the stack
#define ast_asprintf(ret, fmt,...)
A wrapper for asprintf()
#define ast_calloc(num, len)
A wrapper for calloc()
#define ast_malloc(len)
A wrapper for malloc()
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
@ AST_BRIDGE_TRANSFER_SUCCESS
enum ast_transfer_result ast_bridge_transfer_attended(struct ast_channel *to_transferee, struct ast_channel *to_transfer_target)
Attended transfer.
void dahdi_native_unload(void)
int dahdi_native_load(const struct ast_channel_tech *tech)
Native DAHDI bridging support.
CallerID (and other GR30) management and generation Includes code and algorithms from the Zapata libr...
int ast_callerid_callwaiting_full_generate(unsigned char *buf, const char *name, const char *number, const char *ddn, int redirecting, int pres, int qualifier, struct ast_format *codec)
Generate Caller-ID spill but in a format suitable for Call Waiting(tm)'s Caller*ID(tm)
#define CID_UNKNOWN_NUMBER
int ast_gen_cas(unsigned char *outbuf, int sas, int len, struct ast_format *codec)
Generate a CAS (CPE Alert Signal) tone for 'n' samples.
int ast_callerid_full_generate(unsigned char *buf, const char *name, const char *number, const char *ddn, int redirecting, int pres, int qualifier, int format, struct ast_format *codec)
Generate Caller-ID spill from the "callerid" field of asterisk (in e-mail address like format)
int callerid_feed_jp(struct callerid_state *cid, unsigned char *ubuf, int samples, struct ast_format *codec)
Read samples into the state machine.
#define AST_PRES_USER_NUMBER_UNSCREENED
#define AST_PRES_UNAVAILABLE
int ast_callerid_vmwi_generate(unsigned char *buf, int active, int type, struct ast_format *codec, const char *name, const char *number, int flags)
Generate message waiting indicator.
#define AST_PRES_RESTRICTED
void callerid_free(struct callerid_state *cid)
This function frees callerid_state cid.
void callerid_get_with_redirecting(struct callerid_state *cid, char **name, char **number, int *flags, int *redirecting)
Extract info out of callerID state machine. Flags are listed above.
#define MAX_CALLERID_SIZE
const char * ast_redirecting_reason_name(const struct ast_party_redirecting_reason *data)
Convert redirecting reason value to text code.
void ast_shrink_phone_number(char *n)
Shrink a phone number in place to just digits (more accurately it just removes ()'s,...
int ast_callerid_callwaiting_generate(unsigned char *buf, const char *name, const char *number, struct ast_format *codec)
Generate Caller-ID spill but in a format suitable for Call Waiting(tm)'s Caller*ID(tm)
#define CID_PRIVATE_NUMBER
struct callerid_state * callerid_new(int cid_signalling)
Create a callerID state machine.
int callerid_feed(struct callerid_state *cid, unsigned char *ubuf, int samples, struct ast_format *codec)
Read samples into the state machine.
#define CID_MWI_TYPE_MDMF_FULL
void callerid_get_dtmf(char *cidstring, char *number, int *flags)
Get and parse DTMF-based callerid.
#define CID_START_POLARITY
void callerid_get(struct callerid_state *cid, char **number, char **name, int *flags)
Extract info out of callerID state machine. Flags are listed above.
#define CID_START_POLARITY_IN
int ast_callerid_split(const char *src, char *name, int namelen, char *num, int numlen)
#define CID_START_DTMF_NOALERT
Internal Asterisk hangup causes.
#define AST_CAUSE_SWITCH_CONGESTION
#define AST_CAUSE_CONGESTION
#define AST_CAUSE_UNALLOCATED
#define AST_CAUSE_INTERWORKING
#define AST_CAUSE_PROTOCOL_ERROR
#define AST_CAUSE_DESTINATION_OUT_OF_ORDER
#define AST_CAUSE_NO_USER_RESPONSE
#define AST_CAUSE_NORMAL_CIRCUIT_CONGESTION
#define AST_CAUSE_NOTDEFINED
#define AST_CAUSE_CALL_REJECTED
#define AST_CAUSE_NETWORK_OUT_OF_ORDER
#define AST_CAUSE_UNREGISTERED
#define AST_CAUSE_NO_ANSWER
#define AST_CAUSE_NORMAL_CLEARING
#define AST_CAUSE_USER_BUSY
Call Completion Supplementary Services API.
#define ast_cc_config_params_init()
Allocate and initialize an ast_cc_config_params structure.
#define AST_CC_GENERIC_MONITOR_TYPE
int ast_cc_monitor_register(const struct ast_cc_monitor_callbacks *callbacks)
Register a set of monitor callbacks with the core.
void ast_cc_config_params_destroy(struct ast_cc_config_params *params)
Free memory from CCSS configuration params.
void(* ast_cc_callback_fn)(struct ast_channel *chan, struct ast_cc_config_params *cc_params, const char *monitor_type, const char *const device_name, const char *const dialstring, void *private_data)
Callback made from ast_cc_callback for certain channel types.
int ast_cc_agent_register(const struct ast_cc_agent_callbacks *callbacks)
Register a set of agent callbacks with the core.
void ast_cc_copy_config_params(struct ast_cc_config_params *dest, const struct ast_cc_config_params *src)
copy CCSS configuration parameters from one structure to another
void ast_cc_monitor_unregister(const struct ast_cc_monitor_callbacks *callbacks)
Unregister a set of monitor callbacks with the core.
enum ast_cc_monitor_policies ast_get_cc_monitor_policy(struct ast_cc_config_params *config)
Get the cc_monitor_policy.
void ast_cc_agent_unregister(const struct ast_cc_agent_callbacks *callbacks)
Unregister a set of agent callbacks with the core.
int ast_cc_is_config_param(const char *const name)
Is this a CCSS configuration parameter?
int ast_cc_set_param(struct ast_cc_config_params *params, const char *const name, const char *value)
set a CCSS configuration parameter, given its name
static struct ao2_container * pvts
#define CALLPROGRESS_FAX_INCOMING
static int dahdi_create_channel_range(int start, int end)
static int dahdi_confmute(struct dahdi_pvt *p, int muted)
static ast_mutex_t ss_thread_lock
static int calc_energy(const unsigned char *buf, int len, struct ast_format *law)
#define CALLWAITING_SUPPRESS_SAMPLES
static int isourconf(struct dahdi_pvt *p, struct dahdi_subchannel *c)
static void release_doomed_pris(void)
static struct dahdi_pvt * round_robin[64]
static void my_set_new_owner(void *pvt, struct ast_channel *new_owner)
static int restore_gains(struct dahdi_pvt *p)
static void publish_channel_alarm_clear(int channel)
static int conf_del(struct dahdi_pvt *p, struct dahdi_subchannel *c, int index)
static char * dahdi_show_channels(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static void my_set_confirmanswer(void *pvt, int flag)
#define CIDCW_EXPIRE_SAMPLES
static int my_dahdi_write(struct dahdi_pvt *p, unsigned char *buf, int len, int idx, int linear)
static int my_callwait(void *pvt)
static int restore_conference(struct dahdi_pvt *p)
static void publish_span_alarm_clear(int span)
static ast_mutex_t iflock
Protect the interface list (of dahdi_pvt's)
static int dahdi_indicate(struct ast_channel *chan, int condition, const void *data, size_t datalen)
static void notify_message(char *mailbox, int thereornot)
Send MWI state change.
static struct dahdi_pvt * mkintf(int channel, const struct dahdi_chan_conf *conf, int reloading)
static int conf_add(struct dahdi_pvt *p, struct dahdi_subchannel *c, int index, int slavechannel)
static int unalloc_sub(struct dahdi_pvt *p, int x)
static int my_check_confirmanswer(void *pvt)
static const char *const events[]
static int reset_conf(struct dahdi_pvt *p)
static int my_is_dialing(void *pvt, enum analog_sub sub)
static int my_dial_digits(void *pvt, enum analog_sub sub, struct analog_dialoperation *dop)
static struct ast_manager_event_blob * dahdichannel_to_ami(struct stasis_message *msg)
static void my_cancel_cidspill(void *pvt)
static int isslavenative(struct dahdi_pvt *p, struct dahdi_pvt **out)
static int my_set_echocanceller(void *pvt, int enable)
static int dahdi_wink(struct dahdi_pvt *p, int index)
static char mwimonitornotify[PATH_MAX]
static char * alarm2str(int alm)
static void my_hangup_polarityswitch(void *pvt)
static int is_group_or_channel_match(struct dahdi_pvt *p, int span, ast_group_t groupmatch, int *groupmatched, int channelmatch, int *channelmatched)
static int dahdi_ring_phone(struct dahdi_pvt *p)
static char * dahdi_show_status(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
#define CALLWAITING_REPEAT_SAMPLES
static void dahdi_lock_sub_owner(struct dahdi_pvt *pvt, int sub_idx)
#define CALLPROGRESS_FAX_OUTGOING
static int dahdi_call(struct ast_channel *ast, const char *rdest, int timeout)
static int my_stop_cid_detect(void *pvt)
static int my_get_sub_fd(void *pvt, enum analog_sub sub)
static void my_set_needringing(void *pvt, int value)
static char * dahdi_destroy_channels(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static struct ast_jb_conf default_jbconf
static int dahdi_cc_callback(struct ast_channel *inbound, const char *dest, ast_cc_callback_fn callback)
Callback made when dial failed to get a channel out of dahdi_request().
static struct dahdi_pvt * find_channel_from_str(const char *channel)
static int __unload_module(void)
static void dahdi_softhangup_all(void)
static void dahdi_train_ec(struct dahdi_pvt *p)
static struct @120 alarms[]
static int build_channels(struct dahdi_chan_conf *conf, const char *value, int reload, int lineno)
static int dahdi_write(struct ast_channel *ast, struct ast_frame *frame)
static enum analog_event dahdievent_to_analogevent(int event)
static int dahdi_digit_begin(struct ast_channel *ast, char digit)
static void my_unlock_private(void *pvt)
static int dahdichan_helper(struct ast_channel *chan, char *data, const char *value, char *buffer, size_t buflen)
static int dahdi_fixup(struct ast_channel *oldchan, struct ast_channel *newchan)
static void my_set_dialing(void *pvt, int is_dialing)
static void my_handle_dtmf(void *pvt, struct ast_channel *ast, enum analog_sub analog_index, struct ast_frame **dest)
static void publish_dnd_state(int channel, const char *status)
static int my_on_hook(void *pvt)
static int attempt_transfer(struct dahdi_pvt *p)
static int cidrings[NUM_CADENCE_MAX]
cidrings says in which pause to transmit the cid information, where the first pause is 1,...
static void my_set_pulsedial(void *pvt, int flag)
static int dahdi_digit_end(struct ast_channel *ast, char digit, unsigned int duration)
static char * dahdi_set_hwgain(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static int dahdi_wait_event(int fd)
Avoid the silly dahdi_waitevent which ignores a bunch of events.
static void publish_channel_alarm(int channel, const char *alarm_txt)
static int canmatch_featurecode(const char *pickupexten, const char *exten)
static void dahdi_queue_frame(struct dahdi_pvt *p, struct ast_frame *f)
static int set_actual_gain(int fd, float rxgain, float txgain, float rxdrc, float txdrc, int law)
struct analog_callback analog_callbacks
static void dahdi_destroy_channel_range(int start, int end)
static char * dahdi_show_channel(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static int my_unallocate_sub(void *pvt, enum analog_sub analogsub)
static void my_set_alarm(void *pvt, int in_alarm)
static int num_restart_pending
static int my_dsp_set_digitmode(void *pvt, enum analog_dsp_digitmode mode)
static int my_get_event(void *pvt)
static int available(struct dahdi_pvt **pvt, int is_specific_channel)
static int dahdi_devicestate(const char *data)
static int user_has_defined_cadences
static int dahdi_callwait(struct ast_channel *ast)
static void wakeup_sub(struct dahdi_pvt *p, int a)
static void my_set_callwaiting(void *pvt, int callwaiting_enable)
static int distinctiveringaftercid
static int my_is_off_hook(void *pvt)
static int mwi_send_init(struct dahdi_pvt *pvt)
static int dahdi_open(char *fn)
static void publish_dahdichannel(struct ast_channel *chan, ast_group_t group, int span, const char *dahdi_channel)
Sends a DAHDIChannel channel blob used to produce DAHDIChannel AMI messages.
static int my_check_waitingfordt(void *pvt)
static int setup_dahdi_int(int reload, struct dahdi_chan_conf *default_conf, struct dahdi_chan_conf *base_conf, struct dahdi_chan_conf *conf)
static void publish_span_alarm(int span, const char *alarm_txt)
static int dahdichan_write(struct ast_channel *chan, const char *cmd, char *data, const char *value)
static void my_set_outgoing(void *pvt, int is_outgoing)
static int dahdi_fake_event(struct dahdi_pvt *p, int mode)
static void my_set_inthreeway(void *pvt, enum analog_sub sub, int inthreeway)
static void destroy_dahdi_pvt(struct dahdi_pvt *pvt)
static int dahdi_hangup(struct ast_channel *ast)
static void * analog_ss_thread(void *data)
static int dahdi_sendtext(struct ast_channel *c, const char *text)
static void dahdi_ami_channel_event(struct dahdi_pvt *p, struct ast_channel *chan)
static int dahdichan_read_property(struct dahdi_pvt *p, struct dahdi_params *dahdip, const char *property, char *buffer, size_t len)
static void my_swap_subchannels(void *pvt, enum analog_sub a, struct ast_channel *ast_a, enum analog_sub b, struct ast_channel *ast_b)
#define PROC_DAHDI_OPT_NOCHAN
static void parse_busy_pattern(struct ast_variable *v, struct ast_dsp_busy_pattern *busy_cadence)
static int analogsub_to_dahdisub(enum analog_sub analogsub)
static void my_get_and_handle_alarms(void *pvt)
static void my_lock_private(void *pvt)
static int dahdi_answer(struct ast_channel *ast)
static const char tdesc[]
static void fill_txgain(struct dahdi_gains *g, float gain, float drc, int law)
static int dahdi_restart(void)
static int action_transfer(struct mansession *s, const struct message *m)
static int bump_gains(struct dahdi_pvt *p)
static void * do_monitor(void *data)
static int save_conference(struct dahdi_pvt *p)
static char * dahdi_set_dnd(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static void handle_clear_alarms(struct dahdi_pvt *p)
static int dahdi_queryoption(struct ast_channel *chan, int option, void *data, int *datalen)
static char * dahdi_sig2str(int sig)
static int dahdi_set_hook(int fd, int hs)
static int my_stop_callwait(void *pvt)
static struct ast_channel * dahdi_new_callid_clean(struct dahdi_pvt *i, int state, int startpbx, int idx, int law, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, ast_callid callid, int callid_created)
static int check_for_conference(struct dahdi_pvt *p)
static struct dahdi_ring_cadence AS_RP_cadence
static int dahdichan_read(struct ast_channel *chan, const char *cmd, char *data, char *buffer, size_t buflen)
static int my_distinctive_ring(struct ast_channel *chan, void *pvt, int idx, int *ringdata)
void dahdi_ec_enable(struct dahdi_pvt *p)
static int dahdi_setlinear(int dfd, int linear)
static int restart_monitor(void)
static void my_handle_notify_message(struct ast_channel *chan, void *pvt, int cid_flags, int neon_mwievent)
static int my_confmute(void *pvt, int mute)
static void * mwi_thread(void *data)
static int my_send_callerid(void *pvt, int cwcid, struct ast_party_caller *caller)
static int sigtype_to_signalling(int sigtype)
static void my_decrease_ss_count(void)
static char * handle_dahdi_show_cadences(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static int has_voicemail(struct dahdi_pvt *p)
static void dahdi_iflist_extract(struct dahdi_pvt *pvt)
void dahdi_conf_update(struct dahdi_pvt *p)
static int alloc_sub(struct dahdi_pvt *p, int x)
static void my_start_polarityswitch(void *pvt)
static int digit_to_dtmfindex(char digit)
static int setup_dahdi(int reload)
static char * dahdi_set_mwi(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static int action_dahdidndon(struct mansession *s, const struct message *m)
static struct dahdi_pvt * iflist
#define NEED_MFDETECT(p)
Signaling types that need to use MF detection should be placed in this macro.
static int dahdi_setoption(struct ast_channel *chan, int option, void *data, int datalen)
static int set_actual_txgain(int fd, float gain, float drc, int law)
static int dahdi_func_write(struct ast_channel *chan, const char *function, char *data, const char *value)
static int my_wait_event(void *pvt)
static int my_getsigstr(struct ast_channel *chan, char *str, const char *term, int ms)
static struct ast_channel * my_new_analog_ast_channel(void *pvt, int state, int startpbx, enum analog_sub sub, const struct ast_channel *requestor)
static int analog_tone_to_dahditone(enum analog_tone tone)
static struct ast_str * create_channel_name(struct dahdi_pvt *i)
static int my_get_callerid(void *pvt, char *namebuf, char *numbuf, enum analog_event *ev, size_t timeout)
static int set_actual_rxgain(int fd, float gain, float drc, int law)
static int my_start(void *pvt)
static ast_mutex_t restart_lock
static struct ast_frame * dahdi_handle_event(struct ast_channel *ast)
static char defaultcic[64]
static const char config[]
static int action_dahdishowchannels(struct mansession *s, const struct message *m)
void dahdi_dtmf_detect_enable(struct dahdi_pvt *p)
static struct dahdi_pvt * find_next_iface_in_span(struct dahdi_pvt *cur)
static ast_cond_t ss_thread_complete
static void process_echocancel(struct dahdi_chan_conf *confp, const char *data, unsigned int line)
static void dahdi_iflist_insert(struct dahdi_pvt *pvt)
static struct ast_frame * dahdi_exception(struct ast_channel *ast)
static void my_answer_polarityswitch(void *pvt)
static struct ast_channel * dahdi_request(const char *type, struct ast_format_cap *cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *data, int *cause)
#define SMDI_MD_WAIT_TIMEOUT
static int my_have_progressdetect(void *pvt)
static char * dahdi_set_swgain(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static int dahdi_func_read(struct ast_channel *chan, const char *function, char *data, char *buf, size_t len)
#define CANPROGRESSDETECT(p)
static char * dahdi_create_channels(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static void fill_rxgain(struct dahdi_gains *g, float gain, float drc, int law)
static int my_train_echocanceller(void *pvt)
static const char * event2str(int event)
#define CALLPROGRESS_PROGRESS
static void dahdi_close_sub(struct dahdi_pvt *chan_pvt, int sub_num)
static void my_set_polarity(void *pvt, int value)
void dahdi_ec_disable(struct dahdi_pvt *p)
static struct ast_frame * __dahdi_exception(struct ast_channel *ast)
static void handle_alarms(struct dahdi_pvt *p, int alms)
static void dahdi_handle_dtmf(struct ast_channel *ast, int idx, struct ast_frame **dest)
static struct dahdi_chan_conf dahdi_chan_conf_default(void)
static struct dahdi_pvt * duplicate_pseudo(struct dahdi_pvt *src)
static void swap_subs(struct dahdi_pvt *p, int a, int b)
static int my_set_linear_mode(void *pvt, enum analog_sub sub, int linear_mode)
static int dahdi_dnd(struct dahdi_pvt *dahdichan, int flag)
enable or disable the chan_dahdi Do-Not-Disturb mode for a DAHDI channel
static struct ast_channel * dahdi_new(struct dahdi_pvt *i, int state, int startpbx, int idx, int law, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, ast_callid callid)
static int drc_sample(int sample, float drc)
static int dahdi_get_event(int fd)
Avoid the silly dahdi_getevent which ignores a bunch of events.
static int ringt_base
Configured ring timeout base.
void dahdi_master_slave_unlink(struct dahdi_pvt *slave, struct dahdi_pvt *master, int needlock)
static ast_mutex_t monlock
Protect the monitoring thread, so only one process can kill or start it, and not when it's doing some...
#define ASCII_BYTES_PER_CHAR
static void my_all_subchannels_hungup(void *pvt)
static int my_ring(void *pvt)
static int my_start_cid_detect(void *pvt, int cid_signalling)
static int parse_buffers_policy(const char *parse, int *num_buffers, int *policy)
static struct dahdi_pvt * ifend
static char * dahdi_show_version(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static int my_complete_conference_update(void *pvt, int needconference)
#define DEFAULT_DIALTONE_DETECT_TIMEOUT
static int mwi_send_process_buffer(struct dahdi_pvt *pvt, int num_read)
static void my_set_cadence(void *pvt, int *cid_rings, struct ast_channel *ast)
static void my_increase_ss_count(void)
#define REPORT_CHANNEL_ALARMS
static int my_play_tone(void *pvt, enum analog_sub sub, enum analog_tone tone)
static int my_wink(void *pvt, enum analog_sub sub)
static struct ast_channel_tech dahdi_tech
static struct ast_jb_conf global_jbconf
#define REQUIRE_FXO_SIG()
static int my_conf_add(void *pvt, enum analog_sub sub)
static int my_dsp_reset_and_flush_digits(void *pvt)
void dahdi_dtmf_detect_disable(struct dahdi_pvt *p)
#define PROC_DAHDI_OPT_NOWARN
#define MIN_MS_SINCE_FLASH
static int my_has_voicemail(void *pvt)
static int load_module(void)
Load the module.
static struct ast_custom_function dahdichan_function
static struct ast_frame * dahdi_read(struct ast_channel *ast)
static const char * my_get_orig_dialstring(void *pvt)
static int action_dahdirestart(struct mansession *s, const struct message *m)
static struct ast_custom_function polarity_function
static int get_alarms(struct dahdi_pvt *p)
static struct dahdi_pvt * determine_starting_point(const char *data, struct dahdi_starting_point *param)
#define gen_pvt_field_callback(type, field)
static int polarity_read(struct ast_channel *chan, const char *cmd, char *data, char *buffer, size_t buflen)
static int send_cwcidspill(struct dahdi_pvt *p)
static int my_conf_del(void *pvt, enum analog_sub sub)
static struct dahdi_ring_cadence cadences[NUM_CADENCE_MAX]
static int action_dahdidndoff(struct mansession *s, const struct message *m)
static int unload_module(void)
static int process_dahdi(struct dahdi_chan_conf *confp, const char *cat, struct ast_variable *v, int reload, int options)
static struct ast_cli_entry dahdi_cli[]
#define DEFAULT_CIDRINGS
Typically, how many rings before we should send Caller*ID.
static int dahdichan_write_property(struct dahdi_pvt *p, struct dahdi_params *dahdip, const char *property, const char *value)
static enum analog_sigtype dahdisig_to_analogsig(int sig)
static void dahdi_close(int fd)
static char defaultozz[64]
void dahdi_master_slave_link(struct dahdi_pvt *slave, struct dahdi_pvt *master)
static int my_off_hook(void *pvt)
const char *const subnames[]
static int my_allocate_sub(void *pvt, enum analog_sub analogsub)
static int usedistinctiveringdetection
static int polarity_write(struct ast_channel *chan, const char *cmd, char *data, const char *value)
static int print_subchannel(struct dahdi_pvt *p, int subchan, char *buffer, size_t len)
static char * dahdi_restart_cmd(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static struct dahdi_pvt * find_channel(int channel)
static void * my_get_sigpvt_bridged_channel(struct ast_channel *chan)
static int send_callerid(struct dahdi_pvt *p)
static int set_hwgain(int fd, float gain, int tx_direction)
static void my_set_waitingfordt(void *pvt, struct ast_channel *ast)
static void build_alarm_info(char *restrict alarmstr, struct dahdi_spaninfo *spaninfo)
static int my_check_for_conference(void *pvt)
static int mwi_send_process_event(struct dahdi_pvt *pvt, int event)
static int my_flash(void *pvt)
static int ss_thread_count
static const char *const lbostr[]
int _dahdi_get_index(struct ast_channel *ast, struct dahdi_pvt *p, int nullok, const char *fname, unsigned long line)
#define REPORT_SPAN_ALARMS
static void deep_copy_dahdi_chan_conf(struct dahdi_chan_conf *dest, const struct dahdi_chan_conf *src)
static void my_deadlock_avoidance_private(void *pvt)
static struct dahdi_pvt * handle_init_event(struct dahdi_pvt *i, int event)
static void destroy_channel(struct dahdi_pvt *cur, int now)
static void my_set_ringtimeout(void *pvt, int ringt)
static void monitor_pfds_clean(void *arg)
static int action_dahdidialoffhook(struct mansession *s, const struct message *m)
static int dahdi_dial_str(struct dahdi_pvt *pvt, int operation, const char *dial_str)
static pthread_t monitor_thread
This is the thread for the monitor which checks for input on the channels which are not currently in ...
static int action_transferhangup(struct mansession *s, const struct message *m)
static int revert_fax_buffers(struct dahdi_pvt *p, struct ast_channel *ast)
static void destroy_all_channels(void)
static int action_dahdishowstatus(struct mansession *s, const struct message *m)
DAHDI internal API definitions.
static int dahdi_sig_pri_lib_handles(int signaling)
static int dahdi_analog_lib_handles(int signalling, int radio, int oprmode)
#define SIG_PRI_LIB_HANDLE_CASES
#define dahdi_get_index(ast, p, nullok)
static struct ast_timer * timer
General Asterisk PBX channel definitions.
void ast_channel_exten_set(struct ast_channel *chan, const char *value)
int ast_waitfordigit(struct ast_channel *c, int ms)
Waits for a digit.
const char * ast_channel_name(const struct ast_channel *chan)
static int ast_fdisset(struct pollfd *pfds, int fd, int maximum, int *start)
Helper function for migrating select to poll.
void ast_channel_rings_set(struct ast_channel *chan, int value)
void ast_channel_named_pickupgroups_set(struct ast_channel *chan, struct ast_namedgroups *value)
void ast_party_name_init(struct ast_party_name *init)
Initialize the given name structure.
void * ast_channel_tech_pvt(const struct ast_channel *chan)
struct ast_format * ast_channel_rawreadformat(struct ast_channel *chan)
void ast_party_number_init(struct ast_party_number *init)
Initialize the given number structure.
void ast_hangup(struct ast_channel *chan)
Hang up a channel.
#define ast_channel_alloc(needqueue, state, cid_num, cid_name, acctcode, exten, context, assignedids, requestor, amaflag,...)
Create a channel structure.
struct ast_channel * ast_channel_bridge_peer(struct ast_channel *chan)
Get the channel's bridge peer only if the bridge is two-party.
int ast_party_id_presentation(const struct ast_party_id *id)
Determine the overall presentation value for the given party.
#define CHECK_BLOCKING(c)
Set the blocking indication on the channel.
void ast_channel_nativeformats_set(struct ast_channel *chan, struct ast_format_cap *value)
#define ast_channel_lock(chan)
struct ast_party_redirecting * ast_channel_redirecting(struct ast_channel *chan)
void ast_channel_unregister(const struct ast_channel_tech *tech)
Unregister a channel technology.
unsigned short ast_channel_transfercapability(const struct ast_channel *chan)
struct ast_namedgroups * ast_ref_namedgroups(struct ast_namedgroups *groups)
int ast_waitfor(struct ast_channel *chan, int ms)
Wait for input on a channel.
int ast_channel_cc_params_init(struct ast_channel *chan, const struct ast_cc_config_params *base_params)
Set up datastore with CCSS parameters for a channel.
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
unsigned long long ast_group_t
#define ast_channel_ref(c)
Increase channel reference count.
struct ast_party_connected_line * ast_channel_connected(struct ast_channel *chan)
int ast_queue_frame(struct ast_channel *chan, struct ast_frame *f)
Queue one or more frames to a channel's frame queue.
const char * ast_channel_uniqueid(const struct ast_channel *chan)
const char * ast_channel_accountcode(const struct ast_channel *chan)
const char * ast_channel_context(const struct ast_channel *chan)
void ast_party_caller_set(struct ast_party_caller *dest, const struct ast_party_caller *src, const struct ast_set_party_caller *update)
Set the caller information based on another caller source.
struct ast_frame * ast_read(struct ast_channel *chan)
Reads a frame.
#define ast_channel_trylock(chan)
int ast_queue_control_data(struct ast_channel *chan, enum ast_control_frame_type control, const void *data, size_t datalen)
Queue a control frame with payload.
void ast_party_caller_set_init(struct ast_party_caller *init, const struct ast_party_caller *guide)
Initialize the given caller structure using the given guide for a set update operation.
void ast_party_name_free(struct ast_party_name *doomed)
Destroy the party name contents.
void ast_set_callerid(struct ast_channel *chan, const char *cid_num, const char *cid_name, const char *cid_ani)
Set caller ID number, name and ANI and generate AMI event.
int ast_channel_fd(const struct ast_channel *chan, int which)
void ast_channel_internal_fd_set(struct ast_channel *chan, int which, int value)
int ast_queue_hangup_with_cause(struct ast_channel *chan, int cause)
Queue a hangup frame with hangupcause set.
void ast_channel_set_rawreadformat(struct ast_channel *chan, struct ast_format *format)
void ast_channel_tech_pvt_set(struct ast_channel *chan, void *value)
void ast_party_caller_free(struct ast_party_caller *doomed)
Destroy the caller party contents.
int ast_active_channels(void)
returns number of active/allocated channels
struct ast_namedgroups * ast_get_namedgroups(const char *s)
Create an ast_namedgroups set with group names from comma separated string.
void ast_channel_callgroup_set(struct ast_channel *chan, ast_group_t value)
int ast_check_hangup(struct ast_channel *chan)
Check to see if a channel is needing hang up.
int ast_channel_hangupcause(const struct ast_channel *chan)
void ast_channel_set_rawwriteformat(struct ast_channel *chan, struct ast_format *format)
struct ast_party_dialed * ast_channel_dialed(struct ast_channel *chan)
void ast_set_hangupsource(struct ast_channel *chan, const char *source, int force)
Set the source of the hangup in this channel and it's bridge.
int ast_softhangup(struct ast_channel *chan, int cause)
Softly hangup up a channel.
void ast_channel_named_callgroups_set(struct ast_channel *chan, struct ast_namedgroups *value)
void ast_channel_hangupcause_hash_set(struct ast_channel *chan, const struct ast_control_pvt_cause_code *cause_code, int datalen)
Sets the HANGUPCAUSE hash and optionally the SIP_CAUSE hash on the given channel.
int ast_queue_unhold(struct ast_channel *chan)
Queue an unhold frame.
int ast_queue_hold(struct ast_channel *chan, const char *musicclass)
Queue a hold frame.
void ast_channel_set_readformat(struct ast_channel *chan, struct ast_format *format)
int ast_channel_register(const struct ast_channel_tech *tech)
Register a channel technology (a new channel driver) Called by a channel module to register the kind ...
void ast_channel_softhangup_internal_flag_add(struct ast_channel *chan, int value)
#define ast_channel_unref(c)
Decrease channel reference count.
void ast_party_number_free(struct ast_party_number *doomed)
Destroy the party number contents.
int ast_channel_get_up_time(struct ast_channel *chan)
Obtain how long it has been since the channel was answered.
void ast_channel_amaflags_set(struct ast_channel *chan, enum ama_flags value)
const char * ast_channel_language(const struct ast_channel *chan)
struct ast_bridge_channel * ast_channel_get_bridge_channel(struct ast_channel *chan)
Get a reference to the channel's bridge pointer.
void ast_channel_context_set(struct ast_channel *chan, const char *value)
void ast_channel_set_fd(struct ast_channel *chan, int which, int fd)
int ast_softhangup_nolock(struct ast_channel *chan, int cause)
Softly hangup up a channel (no channel lock)
enum ama_flags ast_channel_string2amaflag(const char *flag)
Convert a string to a detail record AMA flag.
struct ast_pbx * ast_channel_pbx(const struct ast_channel *chan)
struct ast_namedgroups * ast_unref_namedgroups(struct ast_namedgroups *groups)
int ast_channel_setoption(struct ast_channel *channel, int option, void *data, int datalen, int block)
Sets an option on a channel.
struct ast_party_caller * ast_channel_caller(struct ast_channel *chan)
@ AST_FLAG_DISABLE_DEVSTATE_CACHE
void ast_channel_callid_set(struct ast_channel *chan, ast_callid value)
void ast_channel_hangupcause_set(struct ast_channel *chan, int value)
#define ast_channel_cleanup(c)
Cleanup a channel reference.
void ast_channel_pickupgroup_set(struct ast_channel *chan, ast_group_t value)
void ast_channel_adsicpe_set(struct ast_channel *chan, enum ast_channel_adsicpe value)
ast_group_t ast_get_group(const char *s)
void ast_channel_tech_set(struct ast_channel *chan, const struct ast_channel_tech *value)
int ast_safe_sleep(struct ast_channel *chan, int ms)
Wait for a specified amount of time, looking for hangups.
const char * ast_channel_exten(const struct ast_channel *chan)
@ AST_SOFTHANGUP_EXPLICIT
@ AST_SOFTHANGUP_APPUNLOAD
#define ast_channel_unlock(chan)
#define AST_MAX_EXTENSION
void ast_channel_set_writeformat(struct ast_channel *chan, struct ast_format *format)
ast_channel_state
ast_channel states
@ AST_STATE_DIALING_OFFHOOK
int ast_setstate(struct ast_channel *chan, enum ast_channel_state)
Change the state of a channel.
static struct ast_channel * callback(struct ast_channelstorage_instance *driver, ao2_callback_data_fn *cb_fn, void *arg, void *data, int ao2_flags)
Standard Command Line Interface.
#define AST_CLI_DEFINE(fn, txt,...)
void ast_cli(int fd, const char *fmt,...)
#define ast_cli_register_multiple(e, len)
Register multiple commands.
static struct channel_usage channels
#define container_of(ptr, type, member)
@ AST_DEVSTATE_NOT_CACHABLE
int ast_devstate_changed(enum ast_device_state state, enum ast_devstate_cache cachable, const char *fmt,...)
Tells Asterisk the State for Device is changed.
int ast_devstate_changed_literal(enum ast_device_state state, enum ast_devstate_cache cachable, const char *device)
Tells Asterisk the State for Device is changed.
ast_device_state
Device States.
Convenient Signal Processing routines.
void ast_dsp_free(struct ast_dsp *dsp)
int ast_dsp_get_tcount(struct ast_dsp *dsp)
Get tcount (Threshold counter)
#define DSP_FEATURE_WAITDIALTONE
#define DSP_FEATURE_BUSY_DETECT
#define DSP_TONE_STATE_DIALTONE
void ast_dsp_digitreset(struct ast_dsp *dsp)
Reset DTMF detector.
#define DSP_DIGITMODE_MUTEMAX
void ast_dsp_set_busy_pattern(struct ast_dsp *dsp, const struct ast_dsp_busy_pattern *cadence)
Set expected lengths of the busy tone.
struct ast_frame * ast_dsp_process(struct ast_channel *chan, struct ast_dsp *dsp, struct ast_frame *inf)
Return AST_FRAME_NULL frames when there is silence, AST_FRAME_BUSY on busies, and call progress,...
#define DSP_FEATURE_DIGIT_DETECT
#define DSP_FEATURE_FAX_DETECT
#define DSP_FEATURE_CALL_PROGRESS
int ast_dsp_set_digitmode(struct ast_dsp *dsp, int digitmode)
Set digit mode.
#define DSP_DIGITMODE_MUTECONF
int ast_dsp_get_tstate(struct ast_dsp *dsp)
Get tstate (Tone State)
int ast_dsp_was_muted(struct ast_dsp *dsp)
Returns true if DSP code was muting any fragment of the last processed frame. Muting (squelching) hap...
#define DSP_TONE_STATE_RINGING
void ast_dsp_set_busy_count(struct ast_dsp *dsp, int cadences)
Set number of required cadences for busy.
void ast_dsp_set_features(struct ast_dsp *dsp, int features)
Select feature set.
#define DSP_DIGITMODE_DTMF
struct ast_dsp * ast_dsp_new(void)
Allocates a new dsp, assumes 8khz for internal sample rate.
#define DSP_DIGITMODE_RELAXDTMF
int ast_dsp_set_call_progress_zone(struct ast_dsp *dsp, char *zone)
Set zone for doing progress detection.
Call Parking and Pickup API Includes code and algorithms from the Zapata library.
Generic File Format Support. Should be included by clients of the file handling routines....
int ast_streamfile(struct ast_channel *c, const char *filename, const char *preflang)
Streams a file.
int ast_waitstream(struct ast_channel *c, const char *breakon)
Waits for a stream to stop or digit to be pressed.
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
void astman_send_listack(struct mansession *s, const struct message *m, char *msg, char *listflag)
Send ack in manager transaction to begin a list.
void astman_send_error(struct mansession *s, const struct message *m, char *error)
Send error in manager transaction.
void ast_manager_publish_event(const char *type, int class_type, struct ast_json *obj)
Publish an event to AMI.
void astman_send_list_complete_start(struct mansession *s, const struct message *m, const char *event_name, int count)
Start the list complete event.
void astman_send_ack(struct mansession *s, const struct message *m, char *msg)
Send ack in manager transaction.
const char * astman_get_header(const struct message *m, char *var)
Get header from manager transaction.
void astman_send_list_complete_end(struct mansession *s)
End the list complete event.
void astman_append(struct mansession *s, const char *fmt,...)
int ast_manager_unregister(const char *action)
Unregister a registered manager command.
void ast_channel_stage_snapshot_done(struct ast_channel *chan)
Clear flag to indicate channel snapshot is being staged, and publish snapshot.
void ast_channel_publish_blob(struct ast_channel *chan, struct stasis_message_type *type, struct ast_json *blob)
Publish a channel blob message.
void ast_channel_stage_snapshot(struct ast_channel *chan)
Set flag to indicate channel snapshot is being staged.
#define AST_APP_ARG(name)
Define an application argument.
#define ast_app_separate_args(a, b, c, d)
int ast_app_has_voicemail(const char *mailboxes, const char *folder)
Determine if a given mailbox has any voicemail If folder is NULL, defaults to "INBOX"....
#define AST_DECLARE_APP_ARGS(name, arglist)
Declare a structure to hold an application's arguments.
int ast_safe_system(const char *s)
Safely spawn an OS shell command while closing file descriptors.
#define AST_STANDARD_APP_ARGS(args, parse)
Performs the 'standard' argument separation process for an application.
#define AST_NONSTANDARD_APP_ARGS(args, parse, sep)
Performs the 'nonstandard' argument separation process for an application.
Configuration File Parser.
#define ast_config_load(filename, flags)
Load a config file.
char * ast_category_browse(struct ast_config *config, const char *prev_name)
Browse categories.
struct ast_config * ast_config_new(void)
Create a new base configuration structure.
#define ast_variable_new(name, value, filename)
#define CONFIG_STATUS_FILEUNCHANGED
#define CONFIG_STATUS_FILEINVALID
void ast_config_destroy(struct ast_config *cfg)
Destroys a config.
@ CONFIG_FLAG_FILEUNCHANGED
int ast_variable_list_replace(struct ast_variable **head, struct ast_variable *replacement)
Replace a variable in the given list with a new value.
const char * ast_variable_retrieve(struct ast_config *config, const char *category, const char *variable)
void ast_variables_destroy(struct ast_variable *var)
Free variable list.
struct ast_variable * ast_variable_browse(const struct ast_config *config, const char *category_name)
struct ast_features_pickup_config * ast_get_chan_features_pickup_config(struct ast_channel *chan)
Get the pickup configuration options for a channel.
#define AST_OPTION_RELAXDTMF
#define AST_OPTION_TONE_VERIFY
#define AST_OPTION_RXGAIN
#define AST_OPTION_DIGIT_DETECT
#define AST_OPTION_OPRMODE
#define AST_OPTION_CC_AGENT_TYPE
#define AST_OPTION_FAX_DETECT
#define AST_OPTION_TXGAIN
#define AST_OPTION_ECHOCAN
#define AST_FRIENDLY_OFFSET
Offset into a frame's data buffer.
@ AST_CONTROL_RADIO_UNKEY
@ AST_CONTROL_PVT_CAUSE_CODE
#define AST_OPTION_AUDIO_MODE
struct ast_frame ast_null_frame
void ast_callid_threadstorage_auto_clean(ast_callid callid, int callid_created)
Use in conjunction with ast_callid_threadstorage_auto. Cleans up the references and if the callid was...
#define DEBUG_ATLEAST(level)
#define ast_debug(level,...)
Log a DEBUG message.
int ast_callid_threadstorage_auto(ast_callid *callid)
Checks thread storage for a callid and stores a reference if it exists. If not, then a new one will b...
void ast_log_callid(int level, const char *file, int line, const char *function, ast_callid callid, const char *fmt,...)
Used for sending a log message with a known call_id This is a modified logger function which is funct...
#define ast_verb(level,...)
#define ast_verbose_callid(callid,...)
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
struct ast_json * ast_json_pack(char const *format,...)
Helper for creating complex JSON values.
const char * ast_json_string_get(const struct ast_json *string)
Get the value of a JSON string.
struct ast_json * ast_json_object_get(struct ast_json *object, const char *key)
Get a field from a JSON object.
intmax_t ast_json_integer_get(const struct ast_json *integer)
Get the value from a JSON integer.
AST_JSON_INT_T ast_json_int_t
Primarily used to cast when packing to an "I" type.
#define AST_LIST_HEAD_STATIC(name, type)
Defines a structure to be used to hold a list of specified type, statically initialized.
#define AST_LIST_LAST(head)
Returns the last entry contained in a list.
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
#define AST_LIST_HEAD_INIT_VALUE
Defines initial values for a declaration of AST_LIST_HEAD.
#define AST_LIST_EMPTY(head)
Checks whether the specified list contains any entries.
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
#define AST_LIST_ENTRY(type)
Declare a forward link structure inside a list entry.
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
#define AST_LIST_MOVE_CURRENT(newhead, field)
Move the current list entry to another list.
#define AST_LIST_LOCK(head)
Locks a list.
#define AST_LIST_REMOVE(head, elm, field)
Removes a specific entry from a list.
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
#define AST_LIST_UNLOCK(head)
Attempts to unlock a list.
Asterisk locking-related definitions:
#define ast_cond_destroy(cond)
#define ast_cond_wait(cond, mutex)
#define AST_PTHREADT_NULL
#define ast_cond_init(cond, attr)
#define ast_mutex_init(pmutex)
#define CHANNEL_DEADLOCK_AVOIDANCE(chan)
#define DEADLOCK_AVOIDANCE(lock)
#define AST_PTHREADT_STOP
#define ast_mutex_unlock(a)
int ast_atomic_fetchadd_int(volatile int *p, int v)
Atomically add v to *p and return the previous value of *p.
#define ast_mutex_trylock(a)
pthread_cond_t ast_cond_t
#define ast_mutex_destroy(a)
#define ast_mutex_lock(a)
#define AST_MUTEX_DEFINE_STATIC(mutex)
#define ast_cond_signal(cond)
The AMI - Asterisk Manager Interface - is a TCP protocol created to manage Asterisk with third-party ...
struct ast_str * ast_manager_build_channel_state_string(const struct ast_channel_snapshot *snapshot)
Generate the AMI message body from a channel snapshot.
#define EVENT_FLAG_SYSTEM
#define ast_manager_register_xml(action, authority, func)
Register a manager callback using XML documentation to describe the manager.
struct ast_manager_event_blob * ast_manager_event_blob_create(int event_flags, const char *manager_event, const char *extra_fields_fmt,...)
Construct a ast_manager_event_blob.
Asterisk module definitions.
#define ast_module_unref(mod)
Release a reference to the module.
#define ast_module_ref(mod)
Hold a reference to the module.
#define AST_MODULE_INFO(keystr, flags_to_set, desc, fields...)
@ AST_MODPRI_CHANNEL_DRIVER
@ AST_MODULE_SUPPORT_CORE
#define ASTERISK_GPL_KEY
The text the key() function should return.
int ast_unregister_application(const char *app)
Unregister an application.
@ AST_MODULE_LOAD_DECLINE
Module has failed to load, may be in an inconsistent state.
#define ast_register_application_xml(app, execute)
Register an application using XML documentation.
int ast_moh_start(struct ast_channel *chan, const char *mclass, const char *interpclass)
Turn on music on hold on a given channel.
void ast_moh_stop(struct ast_channel *chan)
Turn off music on hold on a given channel.
struct stasis_message_type * ast_mwi_state_type(void)
Get the Stasis Message Bus API message type for MWI messages.
void * ast_mwi_unsubscribe(struct ast_mwi_subscriber *sub)
Unsubscribe from the stasis topic and MWI.
struct stasis_cache * ast_mwi_state_cache(void)
Backend cache for ast_mwi_topic_cached().
struct ast_mwi_subscriber * ast_mwi_subscribe_pool(const char *mailbox, stasis_subscription_cb callback, void *data)
Add an MWI state subscriber, and stasis subscription to the mailbox.
#define ast_publish_mwi_state(mailbox, context, new_msgs, old_msgs)
Publish a MWI state update via stasis.
int ast_parking_blind_transfer_park(struct ast_bridge_channel *parker, const char *context, const char *exten, transfer_channel_cb parked_channel_cb, struct transfer_channel_data *parked_channel_data)
Perform a blind transfer to a parking extension.
int ast_parking_is_exten_park(const char *context, const char *exten)
Determine if the context/exten is a "parking" extension.
int ast_parking_provider_registered(void)
Check whether a parking provider is registered.
Asterisk file paths, configured in asterisk.conf.
const char * ast_config_AST_LOG_DIR
Core PBX routines and definitions.
enum ast_pbx_result ast_pbx_run(struct ast_channel *c)
Execute the PBX in the current thread.
const char * pbx_builtin_getvar_helper(struct ast_channel *chan, const char *name)
Return a pointer to the value of the corresponding channel variable.
int ast_exists_extension(struct ast_channel *c, const char *context, const char *exten, int priority, const char *callerid)
Determine whether an extension exists.
int pbx_builtin_setvar_helper(struct ast_channel *chan, const char *name, const char *value)
Add a variable to the channel variable stack, removing the most recently set value for the same name.
#define ast_custom_function_register(acf)
Register a custom function.
int ast_canmatch_extension(struct ast_channel *c, const char *context, const char *exten, int priority, const char *callerid)
Looks for a valid matching extension.
int ast_custom_function_unregister(struct ast_custom_function *acf)
Unregister a custom function.
enum ast_pbx_result ast_pbx_start(struct ast_channel *c)
Create a new thread and start the PBX.
int ast_ignore_pattern(const char *context, const char *pattern)
Checks to see if a number should be ignored.
int ast_matchmore_extension(struct ast_channel *c, const char *context, const char *exten, int priority, const char *callerid)
Looks to see if adding anything to this extension might match something. (exists ^ canmatch)
int ast_async_goto(struct ast_channel *chan, const char *context, const char *exten, int priority)
Set the channel to next execute the specified dialplan location.
int ast_pickup_call(struct ast_channel *chan)
Pickup a call.
static struct stasis_subscription * sub
Statsd channel stats. Exmaple of how to subscribe to Stasis events.
static void to_ami(struct ast_sip_subscription *sub, struct ast_str **buf)
static int debug
Global debug status.
Say numbers and dates (maybe words one day too)
int analog_hangup(struct analog_pvt *p, struct ast_channel *ast)
int analog_available(struct analog_pvt *p)
struct ast_frame * analog_exception(struct analog_pvt *p, struct ast_channel *ast)
int analog_dnd(struct analog_pvt *p, int flag)
int analog_callwaiting_deluxe(struct analog_pvt *p, int option)
int analog_config_complete(struct analog_pvt *p)
void analog_handle_dtmf(struct analog_pvt *p, struct ast_channel *ast, enum analog_sub idx, struct ast_frame **dest)
int analog_call(struct analog_pvt *p, struct ast_channel *ast, const char *rdest, int timeout)
void analog_delete(struct analog_pvt *doomed)
Delete the analog private structure.
struct analog_pvt * analog_new(enum analog_sigtype signallingtype, void *private_data)
int analog_fixup(struct ast_channel *oldchan, struct ast_channel *newchan, void *newp)
enum analog_sigtype sigtype
struct ast_channel * analog_request(struct analog_pvt *p, int *callwait, const struct ast_channel *requestor)
void * analog_handle_init_event(struct analog_pvt *i, int event)
int analog_answer(struct analog_pvt *p, struct ast_channel *ast)
int analog_ss_thread_start(struct analog_pvt *p, struct ast_channel *chan)
Interface header for analog signaling module.
#define ANALOG_INTER_DIGIT_TIMEOUT
Default time (ms) to detect following digits.
#define ANALOG_MATCH_DIGIT_TIMEOUT
Default time (ms) to wait, in case of ambiguous match.
@ ANALOG_EVENT_HOOKCOMPLETE
@ ANALOG_EVENT_PULSE_START
@ ANALOG_EVENT_TX_CED_DETECTED
@ ANALOG_EVENT_NEONMWI_ACTIVE
@ ANALOG_EVENT_EC_DISABLED
@ ANALOG_EVENT_PULSEDIGIT
@ ANALOG_EVENT_RX_CED_DETECTED
@ ANALOG_EVENT_DIALCOMPLETE
@ ANALOG_EVENT_EC_NLP_ENABLED
@ ANALOG_EVENT_NEONMWI_INACTIVE
@ ANALOG_EVENT_EC_NLP_DISABLED
@ ANALOG_EVENT_RINGOFFHOOK
#define ANALOG_FIRST_DIGIT_TIMEOUT
Default time (ms) to detect first digit.
@ ANALOG_CID_START_DTMF_NOALERT
@ ANALOG_CID_START_POLARITY
@ ANALOG_CID_START_POLARITY_IN
Interface header for PRI signaling module.
int sig_pri_is_chan_available(struct sig_pri_chan *pvt)
void sig_pri_unload(void)
#define SIG_PRI_DEBUG_NORMAL
int pri_send_callrerouting_facility_exec(struct sig_pri_chan *p, enum ast_channel_state chanstate, const char *destination, const char *original, const char *reason)
int sig_pri_ami_show_spans(struct mansession *s, const char *show_cmd, struct sig_pri_span *pri, const int *dchannels, const char *action_id)
int sig_pri_cc_agent_status_req(struct ast_cc_agent *agent)
struct sig_pri_callback sig_pri_callbacks
int sig_pri_indicate(struct sig_pri_chan *p, struct ast_channel *chan, int condition, const void *data, size_t datalen)
void sig_pri_extract_called_num_subaddr(struct sig_pri_chan *p, const char *rdest, char *called, size_t called_buff_size)
#define SIG_PRI_NUM_DCHANS
int sig_pri_cc_agent_start_offer_timer(struct ast_cc_agent *agent)
int sig_pri_hangup(struct sig_pri_chan *p, struct ast_channel *ast)
int sig_pri_cc_monitor_unsuspend(struct ast_cc_monitor *monitor)
int sig_pri_available(struct sig_pri_chan **pvt, int is_specific_channel)
int sig_pri_call(struct sig_pri_chan *p, struct ast_channel *ast, const char *rdest, int timeout, int layer1)
#define DAHDI_OVERLAPDIAL_OUTGOING
int sig_pri_is_alarm_ignored(struct sig_pri_span *pri)
int sig_pri_cc_monitor_req_cc(struct ast_cc_monitor *monitor, int *available_timer_id)
int sig_pri_start_pri(struct sig_pri_span *pri)
int sig_pri_cc_monitor_cancel_available_timer(struct ast_cc_monitor *monitor, int *sched_id)
void sig_pri_cli_show_channels(int fd, struct sig_pri_span *pri)
void sig_pri_cc_agent_req_rsp(struct ast_cc_agent *agent, enum ast_cc_agent_response_reason reason)
int sig_pri_cc_monitor_suspend(struct ast_cc_monitor *monitor)
@ SIG_PRI_RESET_IDLE
The channel is not being RESTARTed.
#define DAHDI_OVERLAPDIAL_BOTH
void sig_pri_stop_pri(struct sig_pri_span *pri)
void sig_pri_cc_agent_destructor(struct ast_cc_agent *agent)
void sig_pri_cli_show_spans(int fd, int span, struct sig_pri_span *pri)
void sig_pri_init_pri(struct sig_pri_span *pri)
#define SIG_PRI_AOC_GRANT_D
#define DAHDI_OVERLAPDIAL_NONE
int sig_pri_cc_agent_start_monitoring(struct ast_cc_agent *agent)
#define DAHDI_CHAN_MAPPING_LOGICAL
int sig_pri_cc_agent_init(struct ast_cc_agent *agent, struct sig_pri_chan *pvt_chan)
void sig_pri_chan_alarm_notify(struct sig_pri_chan *p, int noalarm)
int sig_pri_load(const char *cc_type_name)
@ SIG_PRI_CALL_LEVEL_PROCEEDING
@ SIG_PRI_MOH_SIGNALING_MOH
@ SIG_PRI_MOH_SIGNALING_NOTIFY
int sig_pri_cc_agent_callee_available(struct ast_cc_agent *agent)
#define DAHDI_OVERLAPDIAL_INCOMING
struct ast_channel * sig_pri_request(struct sig_pri_chan *p, enum sig_pri_law law, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, int transfercapability)
#define SIG_PRI_AOC_GRANT_E
void sig_pri_fixup(struct ast_channel *oldchan, struct ast_channel *newchan, struct sig_pri_chan *pchan)
void sig_pri_cc_monitor_destructor(void *monitor_pvt)
void sig_pri_dial_complete(struct sig_pri_chan *pvt, struct ast_channel *ast)
struct sig_pri_chan * sig_pri_chan_new(void *pvt_data, struct sig_pri_span *pri, int logicalspan, int channo, int trunkgroup)
void pri_event_noalarm(struct sig_pri_span *pri, int index, int before_start_pri)
void sig_pri_cli_show_span(int fd, int *dchannels, struct sig_pri_span *pri)
void sig_pri_chan_delete(struct sig_pri_chan *doomed)
int sig_pri_answer(struct sig_pri_chan *p, struct ast_channel *ast)
#define SIG_PRI_AOC_GRANT_S
@ SIG_PRI_TONE_CONGESTION
@ SIG_PRI_TONE_DIALRECALL
void pri_event_alarm(struct sig_pri_span *pri, int index, int before_start_pri)
int sig_pri_cc_agent_stop_offer_timer(struct ast_cc_agent *agent)
void sig_pri_cli_show_channels_header(int fd)
void sig_pri_set_alarm(struct sig_pri_chan *p, int in_alarm)
int sig_pri_cc_agent_party_b_free(struct ast_cc_agent *agent)
int sig_pri_cc_monitor_status_rsp(struct ast_cc_monitor *monitor, enum ast_device_state devstate)
#define DAHDI_CHAN_MAPPING_PHYSICAL
int sig_pri_cc_agent_stop_ringing(struct ast_cc_agent *agent)
int sig_pri_digit_begin(struct sig_pri_chan *pvt, struct ast_channel *ast, char digit)
int pri_send_keypad_facility_exec(struct sig_pri_chan *p, const char *digits)
Interface header for SS7 signaling module.
void sig_ss7_cb_call_null(struct ss7 *ss7, struct isup_call *c, int lock)
void sig_ss7_link_noalarm(struct sig_ss7_linkset *linkset, int which)
void sig_ss7_cli_show_channels_header(int fd)
struct ast_channel * sig_ss7_request(struct sig_ss7_chan *p, enum sig_ss7_law law, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, int transfercapability)
void sig_ss7_init_linkset(struct sig_ss7_linkset *ss7)
void sig_ss7_link_alarm(struct sig_ss7_linkset *linkset, int which)
#define LINKSET_FLAG_EXPLICITACM
#define LINKSET_FLAG_AUTOACM
int sig_ss7_reset_group(struct sig_ss7_linkset *linkset, int cic, unsigned int dpc, int range)
int sig_ss7_available(struct sig_ss7_chan *p)
void sig_ss7_cb_notinservice(struct ss7 *ss7, int cic, unsigned int dpc)
int sig_ss7_reset_cic(struct sig_ss7_linkset *linkset, int cic, unsigned int dpc)
int sig_ss7_call(struct sig_ss7_chan *p, struct ast_channel *ast, const char *rdest)
void * ss7_linkset(void *data)
int sig_ss7_indicate(struct sig_ss7_chan *p, struct ast_channel *chan, int condition, const void *data, size_t datalen)
#define SS7_BLOCKED_MAINTENANCE
int sig_ss7_group_blocking(struct sig_ss7_linkset *linkset, int do_block, int startcic, int endcic, unsigned char state[], int type)
int sig_ss7_find_cic(struct sig_ss7_linkset *linkset, int cic, unsigned int dpc)
struct sig_ss7_callback sig_ss7_callbacks
void sig_ss7_set_alarm(struct sig_ss7_chan *p, int in_alarm)
@ SIG_SS7_TONE_DIALRECALL
@ SIG_SS7_TONE_CONGESTION
struct sig_ss7_chan * sig_ss7_chan_new(void *pvt_data, struct sig_ss7_linkset *ss7)
void sig_ss7_cli_show_channels(int fd, struct sig_ss7_linkset *linkset)
int sig_ss7_cic_blocking(struct sig_ss7_linkset *linkset, int do_block, int cic)
#define LINKSET_FLAG_DEFAULTECHOCONTROL
#define LINKSET_FLAG_USEECHOCONTROL
void sig_ss7_chan_delete(struct sig_ss7_chan *doomed)
#define LINKSET_FLAG_INITIALHWBLO
int sig_ss7_cb_hangup(struct ss7 *ss7, int cic, unsigned int dpc, int cause, int do_hangup)
int sig_ss7_add_sigchan(struct sig_ss7_linkset *linkset, int which, int ss7type, int transport, int inalarm, int networkindicator, int pointcode, int adjpointcode, int cur_slc)
int sig_ss7_hangup(struct sig_ss7_chan *p, struct ast_channel *ast)
void sig_ss7_fixup(struct ast_channel *oldchan, struct ast_channel *newchan, struct sig_ss7_chan *pchan)
#define SS7_BLOCKED_HARDWARE
#define SIG_SS7_NUM_DCHANS
int sig_ss7_answer(struct sig_ss7_chan *p, struct ast_channel *ast)
int sig_ss7_find_cic_range(struct sig_ss7_linkset *linkset, int startcic, int endcic, unsigned int dpc)
SMDI support for Asterisk.
#define SMDI_MAX_FILENAME_LEN
struct ast_smdi_interface *AST_OPTIONAL_API_NAME() ast_smdi_interface_find(const char *iface_name)
Find an SMDI interface with the specified name.
struct ast_smdi_md_message *AST_OPTIONAL_API_NAME() ast_smdi_md_message_wait(struct ast_smdi_interface *iface, int timeout)
Get the next SMDI message from the queue.
#define STASIS_MESSAGE_TYPE_CLEANUP(name)
Boiler-plate messaging macro for cleaning up message types.
#define STASIS_MESSAGE_TYPE_DEFN_LOCAL(name,...)
Boiler-plate messaging macro for defining local message types.
void stasis_subscription_cb_noop(void *data, struct stasis_subscription *sub, struct stasis_message *message)
Stasis subscription callback function that does nothing.
#define STASIS_MESSAGE_TYPE_INIT(name)
Boiler-plate messaging macro for initializing message types.
void * stasis_message_data(const struct stasis_message *msg)
Get the data contained in a message.
struct stasis_message * stasis_cache_get(struct stasis_cache *cache, struct stasis_message_type *type, const char *id)
Retrieve an item from the cache for the ast_eid_default entity.
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one.
int attribute_pure ast_true(const char *val)
Make sure something is true. Determine if a string containing a boolean value is "true"....
#define S_COR(a, b, c)
returns the equivalent of logic or for strings, with an additional boolean check: second one if not e...
static force_inline int attribute_pure ast_strlen_zero(const char *s)
int attribute_pure ast_false(const char *val)
Make sure something is false. Determine if a string containing a boolean value is "false"....
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
char *attribute_pure ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
char * ast_strip(char *s)
Strip leading/trailing whitespace from a string.
int(*const play_tone)(void *pvt, enum analog_sub sub, enum analog_tone tone)
int(*const start)(void *pvt)
unsigned int immediatering
unsigned int permcallwaiting
unsigned int callwaitingdeluxepending
TRUE if a Call Waiting Deluxe action is currently pending.
unsigned int dahditrcallerid
char lastexten[AST_MAX_EXTENSION]
int polarityonanswerdelay
char cid_num[AST_MAX_EXTENSION]
unsigned int permhidecallerid
unsigned int callwaitingcallerid
unsigned int ani_wink_time
enum analog_sigtype outsigmod
unsigned int usedistinctiveringdetection
unsigned int answeronpolarityswitch
unsigned int threewaycalling
int msgstate
-1 = unknown, 0 = no messages, 1 = new messages available
unsigned int hanguponpolarityswitch
enum analog_dialmode permdialmode
unsigned int callwaitingdeluxe
char call_forward[AST_MAX_EXTENSION]
enum analog_cid_start cid_start
struct ast_channel * owner
unsigned int use_smdi
TRUE if SMDI (Simplified Message Desk Interface) is enabled.
unsigned int call_qualifier
unsigned int lastnumredial
unsigned int ani_info_digits
enum analog_dialmode dialmode
unsigned int cancallforward
struct analog_subchannel subs[3]
unsigned int transfertobusy
char cid_name[AST_MAX_EXTENSION]
unsigned int calledsubscriberheld
char mohsuggest[MAX_MUSICCLASS]
unsigned int use_callerid
struct ast_channel * ss_astchan
struct ast_smdi_interface * smdi_iface
The SMDI interface to get SMDI messages from.
struct ast_party_caller caller
struct ast_channel * owner
Structure to pass both assignedid values to channel drivers.
Structure that contains information regarding a channel in a bridge.
struct ast_channel * chan
const char * type
Type of agent the callbacks belong to.
Callbacks defined by CC monitors.
const char * type
Type of monitor the callbacks belong to.
Blob of data associated with a channel.
struct ast_channel_snapshot * snapshot
Structure to describe a channel "technology", ie a channel driver See for examples:
struct ast_format_cap * capabilities
Main Channel structure associated with a channel.
char exten[AST_MAX_EXTENSION]
struct ast_party_redirecting redirecting
Redirecting/Diversion information.
descriptor for a cli entry.
char chan_name[AST_CHANNEL_NAME]
Data structure associated with a custom dialplan function.
Configuration relating to call pickup.
Structure used to handle boolean flags.
struct ast_format * format
Data structure associated with a single frame of data.
struct ast_frame_subclass subclass
enum ast_frame_type frametype
union ast_frame::@239 data
General jitterbuffer configuration.
unsigned int flags
Combination of the AST_JB_ENABLED, AST_JB_FORCED and AST_JB_LOG flags.
Abstract JSON element (object, array, string, int, ...).
Struct containing info for an AMI event to send out.
The structure that contains MWI state.
Caller Party information.
struct ast_party_id id
Caller party ID.
int ani2
Automatic Number Identification 2 (Info Digits)
struct ast_party_id ani
Automatic Number Identification (ANI)
struct ast_party_id id
Connected party ID.
char * str
Subscriber phone number (Malloced)
struct ast_party_dialed::@221 number
Dialed/Called number.
struct ast_party_subaddress subaddress
Subscriber subaddress.
char * tag
User-set "tag".
struct ast_party_name name
Subscriber name.
struct ast_party_number number
Subscriber phone number.
int presentation
Q.931 encoded presentation-indicator encoded field.
unsigned char valid
TRUE if the name information is valid/present.
char * str
Subscriber name (Malloced)
int presentation
Q.931 presentation-indicator and screening-indicator encoded fields.
unsigned char valid
TRUE if the number information is valid/present.
char * str
Subscriber phone number (Malloced)
int plan
Q.931 Type-Of-Number and Numbering-Plan encoded fields.
int code
enum AST_REDIRECTING_REASON value for redirection
struct ast_party_redirecting_reason reason
Reason for the redirection.
struct ast_party_id from
Who is redirecting the call (Sent to the party the call is redirected toward)
unsigned char valid
TRUE if the subaddress information is valid/present.
char * str
Malloced subaddress string.
An SMDI message desk message.
char calling_st[SMDI_MAX_STATION_NUM_LEN+1]
char fwd_st[SMDI_MAX_STATION_NUM_LEN+1]
Support for dynamic strings.
Structure for variables, used for configurations and for channel variables.
struct ast_variable * next
All configuration options for http media cache.
Channel configuration from chan_dahdi.conf . This struct is used for parsing the [channels] section o...
char smdi_port[SMDI_MAX_FILENAME_LEN]
The serial port to listen for SMDI data on.
int ignore_failed_channels
struct dahdi_params timing
int wanted_channels_end
Don't create channels above this number (infinity by default)
int wanted_channels_start
Don't create channels below this number.
struct ringContextData ringContext[3]
struct distRingData ringnum[3]
unsigned int echocanon
TRUE if echo cancellation is turned on.
char dialdest[256]
Delayed dialing for E911. Overlap digits for ISDN.
unsigned int immediate
TRUE if the channel should be answered immediately without attempting to gather any digits.
unsigned int immediatering
TRUE if audible ringback should be provided when immediate = yes.
unsigned int threewaysilenthold
TRUE if a three way dial tone should time out to silence.
enum DAHDI_IFLIST which_iflist
unsigned int permcallwaiting
TRUE if busy extensions will hear the call-waiting tone and can use hook-flash to switch between call...
float cid_rxgain
Amount of gain to increase during caller id.
struct dahdi_distRings drings
Distinctive Ring data.
struct ast_variable * vars
Channel variable list with associated values to set when a channel is created.
char cid_subaddr[AST_MAX_EXTENSION]
Caller ID subaddress from an incoming call.
unsigned int canpark
TRUE if support for call parking is enabled.
unsigned int bufferoverrideinuse
int law
Active PCM encoding format: DAHDI_LAW_ALAW or DAHDI_LAW_MULAW.
unsigned int hwtxgain_enabled
TRUE if hardware Tx gain set by Asterisk.
unsigned int dnd
TRUE if Do-Not-Disturb is enabled, present only for non sig_analog.
unsigned int ignoredtmf
TRUE if DTMF detection is disabled.
struct dahdi_dialoperation dop
DAHDI dial operation command struct for ioctl() call.
struct timeval dtmfcid_delay
unsigned int dahditrcallerid
TRUE if we should use the callerid from incoming call on dahdi transfer.
unsigned int doreoriginate
Internal flag for if we should actually process a reorigination.
unsigned char * cidspill
Analog caller ID waveform sample buffer.
int waitfordialtonetemp
Transient variable. Same as waitfordialtone, but temporarily set for a specific call,...
int cidlen
Length of the cidspill buffer containing samples.
int polarityonanswerdelay
Minimal time period (ms) between the answer polarity switch and hangup polarity switch.
int busycount
Number of times to see "busy" tone before hanging up.
char cid_num[AST_MAX_EXTENSION]
Caller ID number from an incoming call.
struct dahdi_pvt::@121 echocancel
Echo cancel parameters.
int ringt
Ring timeout timer??
struct ast_mwi_subscriber * mwi_event_sub
Opaque event subscription parameters for message waiting indication support.
ast_group_t group
Bitmapped groups this belongs to.
int sendcalleridafter
Send caller ID on FXS after this many rings. Set to 1 for US.
struct dahdi_pvt * oprpeer
unsigned int permhidecallerid
TRUE if the outgoing caller ID is blocked/restricted/hidden.
unsigned int mwisendactive
TRUE if a MWI message sending thread is active.
struct mwisend_info mwisend_data
int interdigit_timeout
Time (ms) to detect following digits (in an analog phone)
unsigned int mwimonitor_rpas
TRUE if the FXO port monitors for rpas precursor to fsk MWI indications from the other end.
struct dahdi_pvt * master
unsigned int confirmanswer
TRUE if to wait for a DTMF digit to confirm answer.
unsigned int restartpending
unsigned int mwimonitoractive
TRUE if an MWI monitor thread is currently active.
unsigned int outgoing
TRUE if we originated the call leg.
unsigned int faxdetect_timeout
The number of seconds into call to disable fax detection. (0 = disabled)
unsigned int callwaitingcallerid
TRUE if send caller ID for Call Waiting.
unsigned int manages_span_alarms
TRUE if the channel alarms will be managed also as Span ones.
unsigned int ani_wink_time
INTEGER, length of time to wait before sending ANI wink in ms.
int waitfordialtone
Number of milliseconds to wait for dialtone.
unsigned int locallyblocked
Bitmask for the channel being locally blocked.
unsigned int adsi
TRUE if ADSI (Analog Display Services Interface) available.
unsigned int usedistinctiveringdetection
TRUE if distinctive rings are to be detected.
unsigned int answeronpolarityswitch
TRUE if we can use a polarity reversal to mark when an outgoing call is answered by the remote party.
unsigned int threewaycalling
TRUE if three way calling is enabled.
struct dahdi_subchannel subs[3]
struct dahdi_confinfo saveconf
unsigned int use_callingpres
TRUE if we will use the calling presentation setting from the Asterisk channel for outgoing calls.
unsigned int pulse
TRUE if we will pulse dial.
int dialtone_scanning_time_elapsed
unsigned int priexclusive
TRUE if PRI B channels are always exclusively selected.
char mailbox[AST_MAX_MAILBOX_UNIQUEID]
Voice mailbox location.
float hwrxgain
Hardware Rx gain set by chan_dahdi.conf.
int echotraining
Echo training time. 0 = disabled.
char callwait_num[AST_MAX_EXTENSION]
Call waiting number.
float hwtxgain
Hardware Tx gain set by chan_dahdi.conf.
int waitfordialtoneduration
Transient variable. Stored off waitfordialtone duration at runtime.
int dsp_features
DSP feature flags: DSP_FEATURE_xxx.
unsigned int callwaiting
TRUE if busy extensions will hear the call-waiting tone and can use hook-flash to switch between call...
char exten[AST_MAX_EXTENSION]
Extension to use in the dialplan.
int callprogress
Bitmapped call progress detection flags. CALLPROGRESS_xxx values.
int callwaitcas
TRUE if Call Waiting (CW) CPE Alert Signal (CAS) is being sent.
struct timeval polaritydelaytv
Start delay time if polarityonanswerdelay is nonzero.
unsigned int hanguponpolarityswitch
TRUE if the call will be considered "hung up" on a polarity reversal.
enum analog_dialmode permdialmode
char dnid[AST_MAX_EXTENSION]
Dialed Number Identifier.
char dialstring[AST_CHANNEL_NAME]
unsigned int callwaitingdeluxe
TRUE if Call Waiting Deluxe options should be available.
char call_forward[AST_MAX_EXTENSION]
Accumulated call forwarding number.
char description[32]
A description for the channel configuration.
unsigned int firstradio
TRUE if over a radio and dahdi_read() has been called.
unsigned int remotelyblocked
Bitmask for the channel being remotely blocked. 1 maintenance, 2 blocked in hardware.
unsigned int hidecallerid
TRUE if the outgoing caller ID is blocked/hidden.
unsigned int echobreak
XXX BOOLEAN Purpose???
struct dahdi_echocanparam params[DAHDI_MAX_ECHOCANPARAMS]
unsigned int callreturn
TRUE if call return is enabled. (*69, if your dialplan doesn't catch this first)
struct ast_namedgroups * named_pickupgroups
Named pickup groups this belongs to.
struct ast_channel * owner
char rdnis[AST_MAX_EXTENSION]
Redirecting Directory Number Information Service (RDNIS) number.
unsigned int faxhandled
TRUE if a fax tone has already been handled.
unsigned int use_smdi
TRUE if SMDI (Simplified Message Desk Interface) is enabled.
struct callerid_state * cs
int cid_ani2
Automatic Number Identification code from PRI.
struct ast_namedgroups * named_callgroups
Named call groups this belongs to.
int callwaitrings
Number of call waiting rings.
unsigned int mwimonitor_neon
TRUE if the FXO port monitors for neon type MWI indications from the other end.
unsigned int dialednone
TRUE if analog type line dialed no digits in Dial()
unsigned int hwrxgain_enabled
TRUE if hardware Rx gain set by Asterisk.
int law_default
Default call PCM encoding format: DAHDI_LAW_ALAW or DAHDI_LAW_MULAW.
int fake_event
Holding place for event injected from outside normal operation.
char echorest[20]
Filled with 'w'. XXX Purpose??
struct dahdi_pvt * slaves[MAX_SLAVES]
unsigned int ani_timeout
INTEGER, length of ANI failure timeout in ms.
int dtmfcid_holdoff_state
unsigned int lastnumredial
TRUE if last number redial enabled.
unsigned int mwioverride_active
TRUE if a manual MWI override is active for a channel.
unsigned int mwimonitor_fsk
TRUE if the FXO port monitors for fsk type MWI indications from the other end.
int ringt_base
Ring timeout base.
unsigned int destroy
TRUE if the channel is to be destroyed on hangup. (Used by pseudo channels.)
unsigned int restrictcid
TRUE if caller ID is restricted.
char defcontext[AST_MAX_CONTEXT]
Default distinctive ring context.
unsigned int priindication_oob
TRUE if PRI congestion/busy indications are sent out-of-band.
unsigned int ani_info_digits
INTEGER, number of ANI INFO digits on a CAMA trunk. older switches use 1 INFO digit,...
unsigned int busydetect
TRUE if busy detection is enabled. (Listens for the beep-beep busy pattern.)
unsigned int hidecalleridname
TRUE if hide just the name not the number for legacy PBX use.
struct timeval waitingfordt
struct ast_dsp * dsp
Opaque DSP configuration structure.
ast_group_t pickupgroup
Bitmapped pickup groups this belongs to.
unsigned int reoriginate
TRUE if FXS (FXO-signalled) channel should reoriginate for user to make a new call.
int cidpos
Position in the cidspill buffer to send out next.
char context[AST_MAX_CONTEXT]
The configured context for incoming calls.
unsigned int cancallforward
TRUE if support for call forwarding enabled. Dial *72 to enable call forwarding. Dial *73 to disable ...
int radio
Nonzero if the signaling type is sent over a radio.
char parkinglot[AST_MAX_EXTENSION]
unsigned int hardwaredtmf
TRUE if DTMF detection needs to be done by hardware.
char begindigit
DTMF digit in progress. 0 when no digit in progress.
struct ast_cc_config_params * cc_params
unsigned int mate
TRUE if TDD in MATE mode.
float txgain
Software Tx gain set by chan_dahdi.conf.
int firstdigit_timeout
Time (ms) to detect first digit (in an analog phone)
struct dahdi_echocanparams head
unsigned int echocanbridged
TRUE if echo cancellation enabled when bridged.
char finaldial[64]
Second part of SIG_FEATDMF_TA wink operation.
unsigned int transfer
TRUE if call transfer is enabled.
unsigned int transfertobusy
TRUE if allowed to flash-transfer to busy channels.
unsigned int inalarm
TRUE if in an alarm condition.
char cid_name[AST_MAX_EXTENSION]
Caller ID name from an incoming call.
unsigned int inservice
TRUE if channel is out of reset and ready.
char language[MAX_LANGUAGE]
Language configured for calls.
unsigned int digital
TRUE if the transfer capability of the call is digital.
char accountcode[AST_MAX_ACCOUNT_CODE]
unsigned int mwioverride_disposition
Manual MWI disposition (on/off)
struct ast_dsp_busy_pattern busy_cadence
Busy cadence pattern description.
int stripmsd
Number of most significant digits/characters to strip from the dialed number.
unsigned int pulsedial
TRUE if a pulsed digit was detected. (Pulse dial phone detected)
unsigned int calledsubscriberheld
TRUE if Called Subscriber held is enabled. This allows a single incoming call to hold a DAHDI channel...
int muting
TRUE if confrence is muted.
char cid_tag[AST_MAX_EXTENSION]
Caller ID tag from incoming call.
int matchdigit_timeout
Time (ms) to wait, in case of ambiguous match (in an analog phone)
char mohsuggest[MAX_MUSICCLASS]
Suggested music-on-hold class for peer channel to use for calls.
unsigned int use_callerid
TRUE if caller ID is used on this channel.
float rxgain
Software Rx gain set by chan_dahdi.conf.
int polarity
Current line interface polarity. POLARITY_IDLE, POLARITY_REV.
ast_group_t callgroup
Bitmapped call groups this belongs to.
unsigned int dialing
TRUE if in the process of dialing digits or sending something.
unsigned int usefaxbuffers
char callwait_name[AST_MAX_EXTENSION]
Call waiting name.
char mohinterpret[MAX_MUSICCLASS]
The configured music-on-hold class to use for calls.
int dialtone_detect
Number of frames to watch for dialtone in incoming calls.
struct ast_smdi_interface * smdi_iface
The SMDI interface to get SMDI messages from.
int cid_ton
Caller ID Q.931 TON/NPI field values. Set by PRI. Zero otherwise.
struct ast_channel * owner
struct dahdi_confinfo curconf
short buffer[AST_FRIENDLY_OFFSET/2+READ_SIZE]
unsigned int needcongestion
In case you didn't read that giant block of text above the mansession_session struct,...
unsigned char buf[READ_SIZE]
mwisend_states mwisend_current
struct ast_channel * peer
char contextData[AST_MAX_CONTEXT]
void(*const handle_dchan_exception)(struct sig_pri_span *pri, int index)
struct sig_pri_span * pri
enum sig_pri_reset_state resetting
Channel reset/restart state.
unsigned int allocated
TRUE when this channel is allocated.
unsigned int use_callingpres
unsigned int priexclusive
unsigned int hidecallerid
unsigned int priindication_oob
unsigned int hidecalleridname
char context[AST_MAX_CONTEXT]
unsigned int no_b_channel
TRUE if this interface has no B channel. (call hold and call waiting)
unsigned int use_callerid
char mohinterpret[MAX_MUSICCLASS]
struct sig_pri_chan * pvts[SIG_PRI_MAX_CHANNELS]
char idleext[AST_MAX_EXTENSION]
int fds[SIG_PRI_NUM_DCHANS]
int congestion_devstate
Congestion device state of the span.
char idledial[AST_MAX_EXTENSION]
void(*const lock_private)(void *pvt)
unsigned int locallyblocked
Bitmask for the channel being locally blocked.
unsigned int use_callingpres
TRUE if we will use the calling presentation setting from the Asterisk channel for outgoing calls.
struct isup_call * ss7call
Opaque libss7 call control structure.
unsigned int remotelyblocked
Bitmask for the channel being remotely blocked.
unsigned int hidecallerid
TRUE if the outgoing caller ID is blocked/hidden.
struct ast_channel * owner
char context[AST_MAX_CONTEXT]
unsigned int inalarm
TRUE if channel is associated with a link that is down.
unsigned int inservice
TRUE if channel is in service.
int stripmsd
Number of most significant digits/characters to strip from the dialed number.
unsigned int use_callerid
TRUE if caller ID is used on this channel.
char mohinterpret[MAX_MUSICCLASS]
int fds[SIG_SS7_NUM_DCHANS]
enum sig_ss7_linkset::@152 state
struct sig_ss7_chan * pvts[SIG_SS7_MAX_CHANNELS]
struct sla_ringing_trunk * next
TTY/TDD Generation support.
#define TDD_BYTES_PER_CHAR
int tdd_generate(struct tdd_state *tdd, unsigned char *buf, const char *string)
struct tdd_state * tdd_new(void)
void tdd_free(struct tdd_state *tdd)
int ast_tdd_gen_ecdisa(unsigned char *outbuf, int len)
int tdd_feed(struct tdd_state *tdd, unsigned char *ubuf, int samples)
Handy terminal functions for vt* terms.
char * term_color(char *outbuf, const char *inbuf, int fgcolor, int bgcolor, int maxout)
Colorize a specified string by adding terminal color codes.
int ast_remaining_ms(struct timeval start, int max_ms)
Calculate remaining milliseconds given a starting timestamp and upper bound.
int64_t ast_tvdiff_ms(struct timeval end, struct timeval start)
Computes the difference (in milliseconds) between two struct timeval instances.
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
struct timeval ast_tv(ast_time_t sec, ast_suseconds_t usec)
Returns a timeval from sec, usec.
General Asterisk channel transcoding definitions.
#define AST_TRANS_CAP_DIGITAL
u-Law to Signed linear conversion
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
#define ast_pthread_create(a, b, c, d)
#define ast_pthread_create_background(a, b, c, d)
#define ast_clear_flag(p, flag)
long int ast_random(void)
#define ast_pthread_create_detached(a, b, c, d)
#define ast_set_flag(p, flag)