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
678#define SMDI_MD_WAIT_TIMEOUT 1500
681"0 db (CSU)/0-133 feet (DSX-1)",
682"133-266 feet (DSX-1)",
683"266-399 feet (DSX-1)",
684"399-533 feet (DSX-1)",
685"533-655 feet (DSX-1)",
697 .resync_threshold = 1000,
715#define DEFAULT_CIDRINGS 1
717#define AST_LAW(p) (((p)->law == DAHDI_LAW_ALAW) ? ast_format_alaw : ast_format_ulaw)
721#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))
723static const char tdesc[] =
"DAHDI Telephony"
724#if defined(HAVE_PRI) || defined(HAVE_SS7) || defined(HAVE_OPENR2)
726 #if defined(HAVE_PRI)
729 #if defined(HAVE_SS7)
730 #if defined(HAVE_PRI)
735 #if defined(HAVE_OPENR2)
736 #if defined(HAVE_PRI) || defined(HAVE_SS7)
744static const char config[] =
"chan_dahdi.conf";
747#define NUM_SPANS DAHDI_MAX_SPANS
752#define CHAN_PSEUDO -2
754#define CALLPROGRESS_PROGRESS 1
755#define CALLPROGRESS_FAX_OUTGOING 2
756#define CALLPROGRESS_FAX_INCOMING 4
757#define CALLPROGRESS_FAX (CALLPROGRESS_FAX_INCOMING | CALLPROGRESS_FAX_OUTGOING)
759#define NUM_CADENCE_MAX 25
766 { { 125, 125, 2000, 4000 } },
767 { { 250, 250, 500, 1000, 250, 250, 500, 4000 } },
768 { { 125, 125, 125, 125, 125, 4000 } },
769 { { 1000, 500, 2500, 5000 } },
786#define ISTRUNK(p) ((p->sig == SIG_FXSLS) || (p->sig == SIG_FXSKS) || \
787 (p->sig == SIG_FXSGS) || (p->sig == SIG_PRI))
789#define CANBUSYDETECT(p) (ISTRUNK(p) || (p->sig & (SIG_EM | SIG_EM_E1 | SIG_SF)) )
790#define CANPROGRESSDETECT(p) (ISTRUNK(p) || (p->sig & (SIG_EM | SIG_EM_E1 | SIG_SF)) )
797#ifndef HAVE_DAHDI_LINEREVERSE_VMWI
811#define REPORT_CHANNEL_ALARMS 1
812#define REPORT_SPAN_ALARMS 2
816static int pridebugfd = -1;
817static char pridebugfilename[1024] =
"";
851 if (ioctl(fd, DAHDI_GETEVENT, &j) == -1)
860 i = DAHDI_IOMUX_SIGEVENT;
861 if (ioctl(fd, DAHDI_IOMUX, &i) == -1)
863 if (ioctl(fd, DAHDI_GETEVENT, &j) == -1)
871#define MASK_AVAIL (1 << 0)
872#define MASK_INUSE (1 << 1)
874#define CALLWAITING_SILENT_SAMPLES ((300 * 8) / READ_SIZE)
875#define CALLWAITING_REPEAT_SAMPLES ((10000 * 8) / READ_SIZE)
876#define CALLWAITING_SUPPRESS_SAMPLES ((100 * 8) / READ_SIZE)
877#define CIDCW_EXPIRE_SAMPLES ((500 * 8) / READ_SIZE)
878#define MIN_MS_SINCE_FLASH ((2000) )
879#define DEFAULT_RINGT ((8000 * 8) / READ_SIZE)
880#define DEFAULT_DIALTONE_DETECT_TIMEOUT ((10000 * 8) / READ_SIZE)
894static struct dahdi_ss7 linksets[
NUM_SPANS];
896static int cur_ss7type = -1;
897static int cur_slc = -1;
898static int cur_linkset = -1;
899static int cur_pointcode = -1;
900static int cur_cicbeginswith = -1;
901static int cur_adjpointcode = -1;
902static int cur_networkindicator = -1;
903static int cur_defaultdpc = -1;
907struct dahdi_mfcr2_conf {
908 openr2_variant_t variant;
910 int metering_pulse_timeout;
913#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 2
917#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 3
918 int dtmf_end_timeout;
920 signed int get_ani_first:2;
921#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 1
922 signed int skip_category_request:2;
924 unsigned int call_files:1;
925 unsigned int allow_collect_calls:1;
926 unsigned int charge_calls:1;
927 unsigned int accept_on_offer:1;
928 unsigned int forced_release:1;
929 unsigned int double_answer:1;
930 signed int immediate_accept:2;
931#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 2
932 signed int dtmf_dialing:2;
933 signed int dtmf_detection:2;
935 char logdir[OR2_MAX_PATH];
936 char r2proto_file[OR2_MAX_PATH];
937 openr2_log_level_t loglevel;
938 openr2_calling_party_category_t category;
945 openr2_context_t *protocol_context;
950 struct dahdi_mfcr2_conf
conf;
954 struct dahdi_mfcr2 mfcr2;
962static int r2links_count = 0;
970 int mastertrunkgroup;
977#if defined(HAVE_PRI_CCSS)
979static const char dahdi_pri_cc_type[] =
"DAHDI/PRI";
988#define POLARITY_IDLE 0
989#define POLARITY_REV 1
1000#if defined(HAVE_PRI)
1009static struct dahdi_parms_pseudo {
1014} dahdi_pseudo_parms;
1030 struct dahdi_pri pri;
1033#if defined(HAVE_SS7)
1034 struct dahdi_ss7 ss7;
1038 struct dahdi_mfcr2_conf mfcr2;
1073 .nsf = PRI_NSF_NONE,
1074 .switchtype = PRI_SWITCH_NI2,
1075 .dialplan = PRI_UNKNOWN + 1,
1076 .localdialplan = PRI_NATIONAL_ISDN + 1,
1077 .nodetype = PRI_CPE,
1080#if defined(HAVE_PRI_CCSS)
1081 .cc_ptmp_recall_mode = 1,
1082 .cc_qsig_signaling_link_req = 1,
1083 .cc_qsig_signaling_link_rsp = 1,
1089 .internationalprefix =
"",
1090 .nationalprefix =
"",
1092 .privateprefix =
"",
1093 .unknownprefix =
"",
1095 .resetinterval = -1,
1098#if defined(HAVE_SS7)
1100 .called_nai = SS7_NAI_NATIONAL,
1101 .calling_nai = SS7_NAI_NATIONAL,
1102 .internationalprefix =
"",
1103 .nationalprefix =
"",
1104 .subscriberprefix =
"",
1105 .unknownprefix =
"",
1106 .networkroutedprefix =
""
1111 .variant = OR2_VAR_ITU,
1112 .mfback_timeout = -1,
1113 .metering_pulse_timeout = -1,
1116 .get_ani_first = -1,
1117#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 1
1118 .skip_category_request = -1,
1121 .allow_collect_calls = 0,
1123 .accept_on_offer = 1,
1124 .forced_release = 0,
1126 .immediate_accept = -1,
1127#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 2
1129 .dtmf_detection = -1,
1130 .dtmf_time_on = OR2_DEFAULT_DTMF_ON,
1131 .dtmf_time_off = OR2_DEFAULT_DTMF_OFF,
1133#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 3
1134 .dtmf_end_timeout = -1,
1138 .loglevel = OR2_LOG_ERROR | OR2_LOG_WARNING,
1139 .category = OR2_CALLING_PARTY_CATEGORY_NATIONAL_SUBSCRIBER
1143 .context =
"default",
1148 .mohinterpret =
"default",
1151 .transfertobusy = 1,
1154 .ani_info_digits = 2,
1155 .ani_wink_time = 1000,
1156 .ani_timeout = 10000,
1160 .dahditrcallerid = 0,
1169 .echocancel.head.tap_length = 1,
1177#ifdef HAVE_DAHDI_LINEREVERSE_VMWI
1180 .polarityonanswerdelay = 600,
1184 .buf_policy = DAHDI_POLICY_IMMEDIATE,
1203 .ignore_failed_channels = 1,
1204 .smdi_port =
"/dev/ttyS0",
1213 const char *
data,
int *cause);
1234 .description =
tdesc,
1255#define GET_CHANNEL(p) ((p)->channel)
1312 return DAHDI_TONE_RINGTONE;
1314 return DAHDI_TONE_STUTTER;
1316 return DAHDI_TONE_CONGESTION;
1318 return DAHDI_TONE_DIALTONE;
1320 return DAHDI_TONE_DIALRECALL;
1322 return DAHDI_TONE_INFO;
1332 switch (analogsub) {
1361 struct doomed_pri *entry;
1367 ast_debug(4,
"Destroying span %d from doomed queue.\n",
1369 pri_destroy_span(entry->pri);
1388static void pri_queue_for_destruction(
struct sig_pri_span *pri)
1390 struct doomed_pri *entry;
1394 if (entry->pri == pri) {
1399 entry =
ast_calloc(
sizeof(
struct doomed_pri), 1);
1407 ast_debug(4,
"Queue span %d for destruction.\n", pri->
span);
1430 struct dahdi_dialoperation zo = {
1436 for (offset = 0; offset <
sizeof(zo.dialstr) - 1; ++offset) {
1443 if (offset >=
sizeof(zo.dialstr) - 3) {
1447 zo.dialstr[offset] =
'w';
1449 zo.dialstr[offset] =
'w';
1452 zo.dialstr[offset] = *pos++;
1456 ast_debug(1,
"Channel %d: Dial str '%s' expanded to '%s' sent to DAHDI_DIAL.\n",
1457 pvt->
channel, dial_str, zo.dialstr);
1508 struct pollfd poller;
1512 unsigned char buf[256];
1517 poller.events = POLLPRI | POLLIN;
1520 res = poll(&poller, 1, timeout);
1522 if (poller.revents & POLLPRI) {
1527 if (poller.revents & POLLIN) {
1539 if (analog_p->
ringt > 0) {
1540 if (!(--analog_p->
ringt)) {
1603 unsigned char buf[256];
1611 int checkaftercid = 0;
1612 const char *matched_context;
1616 if (ringdata ==
NULL) {
1617 ringdata = curRingData;
1625 for (receivedRingT = 0; receivedRingT <
RING_PATTERNS; receivedRingT++)
1626 ringdata[receivedRingT] = 0;
1630 ast_verb(3,
"Detecting post-CID distinctive ring\n");
1634 i = DAHDI_IOMUX_READ | DAHDI_IOMUX_SIGEVENT;
1635 res = ioctl(p->
subs[idx].
dfd, DAHDI_IOMUX, &i);
1641 if (i & DAHDI_IOMUX_SIGEVENT) {
1644 if (res == DAHDI_EVENT_NOALARM) {
1647 }
else if (res == DAHDI_EVENT_RINGOFFHOOK) {
1649 ringdata[receivedRingT] = analog_p->
ringt;
1660 }
else if (i & DAHDI_IOMUX_READ) {
1663 if (
errno != ELAST) {
1670 if (analog_p->
ringt > 0) {
1671 if (!(--analog_p->
ringt)) {
1680 ast_verb(3,
"Detected ring pattern: %d,%d,%d\n", ringdata[0], ringdata[1], ringdata[2]);
1682 for (counter = 0; counter < 3; counter++) {
1686 ast_verb(3,
"Checking %d,%d,%d with +/- %d range\n",
1691 for (counter1 = 0; counter1 < 3; counter1++) {
1695 ast_verb(3,
"Pattern ignore (-1) detected, so matching pattern %d regardless.\n",
1696 ringdata[counter1]);
1698 }
else if (ring - range <= ringdata[counter1] && ringdata[counter1] <= ring + range) {
1699 ast_verb(3,
"Ring pattern %d is in range: %d to %d\n",
1700 ringdata[counter1], ring - range, ring + range);
1708 if (distMatches == 3) {
1711 ast_verb(3,
"Matched Distinctive Ring context %s\n", matched_context);
1717 if (strcmp(p->
context, matched_context) != 0) {
1805 ast_verb(3,
"CPE supports Call Waiting Caller*ID. Sending '%s/%s'\n",
1881 ast_log(
LOG_ERROR,
"We used a sub other than SUB_REAL (incorrect assumption sir)\n");
1898 ast_debug(1,
"%s DTMF digit: 0x%02X '%c' on %s\n",
1908 struct dahdi_bufferinfo bi = {
1915 if ((res = ioctl(p->
subs[idx].
dfd, DAHDI_SET_BUFINFO, &bi)) < 0) {
1953 ast_debug(1,
"Already in a fax extension, not redirecting\n");
1962 *dest = &p->
subs[idx].
f;
1992 if (!channel_string) {
2002 "DAHDIGroup: %llu\r\n"
2004 "DAHDIChannel: %s\r\n",
2025 "channel", dahdi_channel);
2049 snprintf(ch_name,
sizeof(ch_name),
"no-media (%d)", p->
channel);
2052 strcpy(ch_name,
"pseudo");
2055 snprintf(ch_name,
sizeof(ch_name),
"%d", p->
channel);
2069static void my_ami_channel_event(
void *pvt,
struct ast_channel *chan)
2129 return p->
subs[dahdi_sub].
dfd;
2172#if defined(HAVE_PRI) || defined(HAVE_SS7)
2173static void my_set_digital(
void *pvt,
int is_digital)
2181#if defined(HAVE_SS7)
2182static void my_set_inservice(
void *pvt,
int is_inservice)
2190#if defined(HAVE_SS7)
2191static void my_set_locallyblocked(
void *pvt,
int is_blocked)
2199#if defined(HAVE_SS7)
2200static void my_set_remotelyblocked(
void *pvt,
int is_blocked)
2313 p->
owner = new_owner;
2364 for (i = 0; i < 3; i++) {
2401 int needconf = needconference;
2508#if defined(HAVE_PRI) || defined(HAVE_SS7)
2509static int dahdi_setlaw(
int dfd,
int law)
2512 res = ioctl(dfd, DAHDI_SETLAW, &
law);
2519#if defined(HAVE_PRI)
2558 newlaw = DAHDI_LAW_ALAW;
2561 newlaw = DAHDI_LAW_MULAW;
2571#if defined(HAVE_PRI) || defined(HAVE_SS7)
2579static void my_pri_ss7_open_media(
void *p)
2590 res = ioctl(dfd, DAHDI_AUDIOMODE, &set_val);
2597 res = dahdi_setlaw(dfd, pvt->
law);
2619#if defined(HAVE_PRI)
2630static void my_pri_dial_digits(
void *p,
const char *dial_string)
2632 char dial_str[DAHDI_MAX_DTMF_BUF];
2636 snprintf(dial_str,
sizeof(dial_str),
"T%s", dial_string);
2686 case DAHDI_EVENT_ONHOOK:
2689 case DAHDI_EVENT_RINGOFFHOOK:
2692 case DAHDI_EVENT_WINKFLASH:
2695 case DAHDI_EVENT_ALARM:
2698 case DAHDI_EVENT_NOALARM:
2701 case DAHDI_EVENT_DIALCOMPLETE:
2704 case DAHDI_EVENT_RINGERON:
2707 case DAHDI_EVENT_RINGEROFF:
2710 case DAHDI_EVENT_HOOKCOMPLETE:
2713 case DAHDI_EVENT_PULSE_START:
2716 case DAHDI_EVENT_POLARITY:
2719 case DAHDI_EVENT_RINGBEGIN:
2722 case DAHDI_EVENT_EC_DISABLED:
2725 case DAHDI_EVENT_REMOVED:
2728 case DAHDI_EVENT_NEONMWI_ACTIVE:
2731 case DAHDI_EVENT_NEONMWI_INACTIVE:
2734#ifdef HAVE_DAHDI_ECHOCANCEL_FAX_MODE
2735 case DAHDI_EVENT_TX_CED_DETECTED:
2738 case DAHDI_EVENT_RX_CED_DETECTED:
2741 case DAHDI_EVENT_EC_NLP_DISABLED:
2744 case DAHDI_EVENT_EC_NLP_ENABLED:
2748 case DAHDI_EVENT_PULSEDIGIT:
2751 case DAHDI_EVENT_DTMFDOWN:
2754 case DAHDI_EVENT_DTMFUP:
2758 switch(
event & 0xFFFF0000) {
2759 case DAHDI_EVENT_PULSEDIGIT:
2760 case DAHDI_EVENT_DTMFDOWN:
2761 case DAHDI_EVENT_DTMFUP:
2803 struct dahdi_params par;
2805 memset(&par, 0,
sizeof(par));
2812 par.rxisoffhook = 0;
2822 return (par.rxbits > -1) || par.rxisoffhook;
2825 return par.rxisoffhook;
2852 int func = DAHDI_FLASH;
2920 struct dahdi_params dahdip;
2928 memset(&dahdip, 0,
sizeof(dahdip));
2935 if (!(dahdip.sigtype & __DAHDI_SIG_FXO)) {
2958 snprintf(buffer, buflen,
"%d", pvt->
polarity);
2973 if (!strcasecmp(
value,
"idle")) {
2975 }
else if (!strcasecmp(
value,
"reverse")) {
2999 int x = DAHDI_START;
3014 ast_log(
LOG_ERROR,
"Trying to dial_digits '%s' on channel %d subchannel %u\n",
3041 if (ioctl(p->
subs[index].
dfd, DAHDI_DIALING, &x)) {
3042 ast_debug(1,
"DAHDI_DIALING ioctl failed!\n");
3055#if defined(HAVE_PRI)
3056static void my_pri_fixup_chans(
void *chan_old,
void *chan_new)
3063 if (new_chan->
owner) {
3070 new_chan->
dsp = old_chan->
dsp;
3084 new_chan->
law = old_chan->
law;
3089#if defined(HAVE_PRI)
3090static int sig_pri_tone_to_dahditone(
enum sig_pri_tone tone)
3094 return DAHDI_TONE_RINGTONE;
3096 return DAHDI_TONE_STUTTER;
3098 return DAHDI_TONE_CONGESTION;
3100 return DAHDI_TONE_DIALTONE;
3102 return DAHDI_TONE_DIALRECALL;
3104 return DAHDI_TONE_INFO;
3106 return DAHDI_TONE_BUSY;
3113#if defined(HAVE_PRI)
3114static void my_handle_dchan_exception(
struct sig_pri_span *pri,
int index)
3118 ioctl(pri->
fds[index], DAHDI_GETEVENT, &x);
3120 case DAHDI_EVENT_NONE:
3122 case DAHDI_EVENT_ALARM:
3123 case DAHDI_EVENT_NOALARM:
3135 case DAHDI_EVENT_ALARM:
3138 case DAHDI_EVENT_NOALARM:
3141 case DAHDI_EVENT_REMOVED:
3142 pri_queue_for_destruction(pri);
3150#if defined(HAVE_PRI)
3151static int my_pri_play_tone(
void *pvt,
enum sig_pri_tone tone)
3155 return tone_zone_play_tone(p->
subs[
SUB_REAL].
dfd, sig_pri_tone_to_dahditone(tone));
3159#if defined(HAVE_PRI) || defined(HAVE_SS7)
3168static void my_set_callerid(
void *pvt,
const struct ast_party_caller *caller)
3183 if (caller->
id.
tag) {
3188 sizeof(p->cid_ani));
3193#if defined(HAVE_PRI) || defined(HAVE_SS7)
3202static void my_set_dnid(
void *pvt,
const char *
dnid)
3210#if defined(HAVE_PRI)
3219static void my_set_rdnis(
void *pvt,
const char *
rdnis)
3227#if defined(HAVE_PRI)
3254static void my_pri_make_cc_dialstring(
void *priv,
char *
buf,
size_t buf_size)
3275 snprintf(
buf, buf_size,
"%s/i%d-",
args.tech, pvt->pri->span);
3278 if (isdigit(
args.group[0]) ||
args.group[0] ==
'i' || strchr(
args.group,
'!')) {
3285 snprintf(
buf, buf_size,
"%s/i%d-%s",
args.tech, pvt->pri->span,
args.group);
3289#if defined(HAVE_PRI)
3299static void dahdi_pri_update_span_devstate(
struct sig_pri_span *pri)
3302 unsigned num_b_chans;
3311 for (idx = pri->
numchans; idx--;) {
3335#if defined(THRESHOLD_DEVSTATE_PLACEHOLDER)
3339 }
else if (!in_use) {
3341 }
else if (!pri->user_busy_threshold) {
3347 if (pri->threshold_devstate != new_state) {
3348 pri->threshold_devstate = new_state;
3355#if defined(HAVE_PRI)
3361static void my_module_ref(
void)
3367#if defined(HAVE_PRI)
3373static void my_module_unref(
void)
3379#if defined(HAVE_PRI)
3380#if defined(HAVE_PRI_CALL_WAITING)
3381static void my_pri_init_config(
void *priv,
struct sig_pri_span *pri);
3383static int dahdi_new_pri_nobch_channel(
struct sig_pri_span *pri);
3388 .play_tone = my_pri_play_tone,
3394 .new_ast_channel = my_new_pri_ast_channel,
3395 .fixup_chans = my_pri_fixup_chans,
3399 .set_digital = my_set_digital,
3400 .set_callerid = my_set_callerid,
3401 .set_dnid = my_set_dnid,
3402 .set_rdnis = my_set_rdnis,
3403 .new_nobch_intf = dahdi_new_pri_nobch_channel,
3404#if defined(HAVE_PRI_CALL_WAITING)
3405 .init_config = my_pri_init_config,
3408 .make_cc_dialstring = my_pri_make_cc_dialstring,
3409 .update_span_devstate = dahdi_pri_update_span_devstate,
3410 .module_ref = my_module_ref,
3411 .module_unref = my_module_unref,
3412 .dial_digits = my_pri_dial_digits,
3413 .open_media = my_pri_ss7_open_media,
3414 .ami_channel_event = my_ami_channel_event,
3415 .destroy_later = pri_queue_for_destruction,
3419#if defined(HAVE_SS7)
3428static void my_handle_link_exception(
struct sig_ss7_linkset *linkset,
int which)
3432 if (ioctl(linkset->
fds[which], DAHDI_GETEVENT, &
event)) {
3434 linkset->
span, which);
3438 case DAHDI_EVENT_NONE:
3440 case DAHDI_EVENT_ALARM:
3445 case DAHDI_EVENT_NOALARM:
3458#if defined(HAVE_SS7)
3459static void my_ss7_set_loopback(
void *pvt,
int enable)
3470#if defined(HAVE_SS7)
3490 if (linksets[idx].
ss7.ss7 ==
ss7) {
3491 return &linksets[idx].ss7;
3498#if defined(HAVE_SS7)
3541 newlaw = DAHDI_LAW_ALAW;
3544 newlaw = DAHDI_LAW_MULAW;
3551#if defined(HAVE_SS7)
3552static int sig_ss7_tone_to_dahditone(
enum sig_ss7_tone tone)
3556 return DAHDI_TONE_RINGTONE;
3558 return DAHDI_TONE_STUTTER;
3560 return DAHDI_TONE_CONGESTION;
3562 return DAHDI_TONE_DIALTONE;
3564 return DAHDI_TONE_DIALRECALL;
3566 return DAHDI_TONE_INFO;
3568 return DAHDI_TONE_BUSY;
3575#if defined(HAVE_SS7)
3576static int my_ss7_play_tone(
void *pvt,
enum sig_ss7_tone tone)
3580 return tone_zone_play_tone(p->
subs[
SUB_REAL].
dfd, sig_ss7_tone_to_dahditone(tone));
3584#if defined(HAVE_SS7)
3592 .set_loopback = my_ss7_set_loopback,
3594 .new_ast_channel = my_new_ss7_ast_channel,
3595 .play_tone = my_ss7_play_tone,
3597 .handle_link_exception = my_handle_link_exception,
3601 .set_digital = my_set_digital,
3602 .set_inservice = my_set_inservice,
3603 .set_locallyblocked = my_set_locallyblocked,
3604 .set_remotelyblocked = my_set_remotelyblocked,
3605 .set_callerid = my_set_callerid,
3606 .set_dnid = my_set_dnid,
3607 .open_media = my_pri_ss7_open_media,
3608 .find_linkset = my_ss7_find_linkset,
3678#define gen_pvt_field_callback(type, field) \
3679 static type my_get_##field(void *pvt) \
3681 struct dahdi_pvt *p = pvt; \
3689#undef gen_pvt_field_callback
3759 .get_firstdigit_timeout = my_get_firstdigit_timeout,
3760 .get_matchdigit_timeout = my_get_matchdigit_timeout,
3761 .get_interdigit_timeout = my_get_interdigit_timeout,
3780 "Unable to get index for '%s' on channel %d (%s(), line %lu)\n",
3873#if defined(HAVE_PRI)
3888static void mfcr2_queue_for_destruction(
const struct dahdi_pvt *p)
3890 const struct dahdi_mfcr2 *r2link = p->mfcr2;
3891 struct r2link_entry *cur;
3894 if (r2link == &cur->mfcr2) {
3904static int dahdi_r2_answer(
struct dahdi_pvt *p)
3910#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 1
3912 int wants_double_answer =
ast_true(double_answer) ? 1 : 0;
3913 if (!double_answer) {
3916 res = openr2_chan_answer_call(p->r2chan);
3917 }
else if (wants_double_answer) {
3918 res = openr2_chan_answer_call_with_mode(p->r2chan, OR2_ANSWER_DOUBLE);
3920 res = openr2_chan_answer_call_with_mode(p->r2chan, OR2_ANSWER_SIMPLE);
3923 res = openr2_chan_answer_call(p->r2chan);
3931static openr2_calling_party_category_t dahdi_r2_get_channel_category(
struct ast_channel *
c)
3933 openr2_calling_party_category_t cat;
3937 ast_debug(1,
"No MFC/R2 category specified for chan %s, using default %s\n",
3939 return p->mfcr2_category;
3941 if ((cat = openr2_proto_get_category(catstr)) == OR2_CALLING_PARTY_CATEGORY_UNKNOWN) {
3942 ast_log(
LOG_WARNING,
"Invalid category specified '%s' for chan %s, using default %s\n",
3943 catstr,
ast_channel_name(
c), openr2_proto_get_category_string(p->mfcr2_category));
3944 return p->mfcr2_category;
3946 ast_debug(1,
"Using category %s\n", catstr);
3950static void dahdi_r2_on_call_init(openr2_chan_t *r2chan)
3952 struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
3961 ast_log(
LOG_ERROR,
"Collision of calls on chan %d detected!.\n", openr2_chan_get_number(r2chan));
3971 p->mfcr2_ani_index =
'\0';
3972 p->mfcr2_dnis_index =
'\0';
3973 p->mfcr2_dnis_matched = 0;
3974 p->mfcr2_answer_pending = 0;
3975 p->mfcr2_call_accepted = 0;
3977 ast_verbose(
"New MFC/R2 call detected on chan %d.\n", openr2_chan_get_number(r2chan));
3980static void dahdi_r2_on_hardware_alarm(openr2_chan_t *r2chan,
int alarm)
3983 struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
3988 if (res == DAHDI_ALARM_NOTOPEN) {
3989 mfcr2_queue_for_destruction(p);
3998static void dahdi_r2_on_os_error(openr2_chan_t *r2chan,
int errorcode)
4000 struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
4002 ast_log(
LOG_ERROR,
"OS error on chan %d: %s\n", openr2_chan_get_number(r2chan), strerror(errorcode));
4005 if (errorcode == ENODEV) {
4006 struct dahdi_mfcr2 *r2link = p->mfcr2;
4015static void dahdi_r2_on_protocol_error(openr2_chan_t *r2chan, openr2_protocol_error_t reason)
4017 struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
4018 ast_log(
LOG_ERROR,
"MFC/R2 protocol error on chan %d: %s\n", openr2_chan_get_number(r2chan), openr2_proto_get_error(reason));
4028static void dahdi_r2_disconnect_call(
struct dahdi_pvt *p, openr2_call_disconnect_cause_t cause)
4030 if (openr2_chan_disconnect_call(p->r2chan, cause)) {
4031 ast_log(
LOG_NOTICE,
"Bad! failed to disconnect call on channel %d with reason %s, hope for the best!\n",
4032 p->
channel, openr2_proto_get_disconnect_string(cause));
4034 openr2_chan_set_idle(p->r2chan);
4041static void dahdi_r2_on_call_offered(openr2_chan_t *r2chan,
const char *ani,
const char *dnis, openr2_calling_party_category_t category)
4047 ast_verbose(
"MFC/R2 call offered on chan %d. ANI = %s, DNIS = %s, Category = %s\n",
4048 openr2_chan_get_number(r2chan), ani ? ani :
"(restricted)", dnis,
4049 openr2_proto_get_category_string(category));
4050 p = openr2_chan_get_client_data(r2chan);
4052 if (!p->mfcr2_allow_collect_calls && category == OR2_CALLING_PARTY_CATEGORY_COLLECT_CALL) {
4054 dahdi_r2_disconnect_call(p, OR2_CAUSE_COLLECT_CALL_REJECTED);
4055 goto dahdi_r2_on_call_offered_cleanup;
4058 p->mfcr2_recvd_category = category;
4061 ast_debug(1,
"No CID allowed in configuration, CID is being cleared!\n");
4066 if (p->
immediate || !openr2_context_get_max_dnis(openr2_chan_get_context(r2chan))) {
4067 ast_debug(1,
"Setting exten => s because of immediate or 0 DNIS configured\n");
4073 ast_log(
LOG_NOTICE,
"MFC/R2 call on channel %d requested non-existent extension '%s' in context '%s'. Rejecting call.\n",
4075 dahdi_r2_disconnect_call(p, OR2_CAUSE_UNALLOCATED_NUMBER);
4076 goto dahdi_r2_on_call_offered_cleanup;
4078 if (!p->mfcr2_accept_on_offer) {
4085 goto dahdi_r2_on_call_offered_cleanup;
4088 dahdi_r2_disconnect_call(p, OR2_CAUSE_OUT_OF_ORDER);
4089 }
else if (p->mfcr2_charge_calls) {
4090 ast_debug(1,
"Accepting MFC/R2 call with charge on chan %d\n", p->
channel);
4091 openr2_chan_accept_call(r2chan, OR2_CALL_WITH_CHARGE);
4093 ast_debug(1,
"Accepting MFC/R2 call with no charge on chan %d\n", p->
channel);
4094 openr2_chan_accept_call(r2chan, OR2_CALL_NO_CHARGE);
4097dahdi_r2_on_call_offered_cleanup:
4101static void dahdi_r2_on_call_end(openr2_chan_t *r2chan)
4103 struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
4110static void dahdi_r2_on_call_accepted(openr2_chan_t *r2chan, openr2_call_mode_t mode)
4116 p = openr2_chan_get_client_data(r2chan);
4118 p->mfcr2_call_accepted = 1;
4120 if (OR2_DIR_BACKWARD == openr2_chan_get_direction(r2chan)) {
4121 ast_verbose(
"MFC/R2 call has been accepted on backward channel %d\n", openr2_chan_get_number(r2chan));
4126 if (!p->mfcr2_accept_on_offer) {
4127 openr2_chan_disable_read(r2chan);
4128 if (p->mfcr2_answer_pending) {
4129 ast_debug(1,
"Answering MFC/R2 call after accepting it on chan %d\n", openr2_chan_get_number(r2chan));
4132 goto dahdi_r2_on_call_accepted_cleanup;
4138 openr2_chan_disable_read(r2chan);
4139 goto dahdi_r2_on_call_accepted_cleanup;
4143 dahdi_r2_disconnect_call(p, OR2_CAUSE_OUT_OF_ORDER);
4144 goto dahdi_r2_on_call_accepted_cleanup;
4151 openr2_chan_disable_read(r2chan);
4153dahdi_r2_on_call_accepted_cleanup:
4157static void dahdi_r2_on_call_answered(openr2_chan_t *r2chan)
4159 struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
4160 ast_verbose(
"MFC/R2 call has been answered on channel %d\n", openr2_chan_get_number(r2chan));
4164static void dahdi_r2_on_call_read(openr2_chan_t *r2chan,
const unsigned char *
buf,
int buflen)
4169static int dahdi_r2_cause_to_ast_cause(openr2_call_disconnect_cause_t cause)
4172 case OR2_CAUSE_BUSY_NUMBER:
4174 case OR2_CAUSE_NETWORK_CONGESTION:
4176 case OR2_CAUSE_OUT_OF_ORDER:
4178 case OR2_CAUSE_UNALLOCATED_NUMBER:
4180 case OR2_CAUSE_NO_ANSWER:
4182 case OR2_CAUSE_NORMAL_CLEARING:
4184 case OR2_CAUSE_UNSPECIFIED:
4190static void dahdi_r2_on_call_disconnect(openr2_chan_t *r2chan, openr2_call_disconnect_cause_t cause)
4192 struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
4195 int datalen =
sizeof(*cause_code);
4197 ast_verbose(
"MFC/R2 call disconnected on channel %d\n", openr2_chan_get_number(r2chan));
4202 dahdi_r2_disconnect_call(p, OR2_CAUSE_NORMAL_CLEARING);
4206 snprintf(cause_str,
sizeof(cause_str),
"R2 DISCONNECT (%s)", openr2_proto_get_disconnect_string(cause));
4207 datalen += strlen(cause_str);
4209 memset(cause_code, 0, datalen);
4210 cause_code->
ast_cause = dahdi_r2_cause_to_ast_cause(cause);
4222 }
else if (openr2_chan_get_direction(r2chan) == OR2_DIR_FORWARD) {
4225 case OR2_CAUSE_BUSY_NUMBER:
4228 case OR2_CAUSE_NETWORK_CONGESTION:
4229 case OR2_CAUSE_OUT_OF_ORDER:
4230 case OR2_CAUSE_UNALLOCATED_NUMBER:
4231 case OR2_CAUSE_NO_ANSWER:
4232 case OR2_CAUSE_UNSPECIFIED:
4233 case OR2_CAUSE_NORMAL_CLEARING:
4248static void dahdi_r2_write_log(openr2_log_level_t level,
char *logmessage)
4251 case OR2_LOG_NOTICE:
4254 case OR2_LOG_WARNING:
4260 case OR2_LOG_STACK_TRACE:
4261 case OR2_LOG_MF_TRACE:
4262 case OR2_LOG_CAS_TRACE:
4264 case OR2_LOG_EX_DEBUG:
4274static void dahdi_r2_on_line_blocked(openr2_chan_t *r2chan)
4276 struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
4280 ast_log(
LOG_NOTICE,
"Far end blocked on chan %d\n", openr2_chan_get_number(r2chan));
4283static void dahdi_r2_on_line_idle(openr2_chan_t *r2chan)
4285 struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
4289 ast_log(
LOG_NOTICE,
"Far end unblocked on chan %d\n", openr2_chan_get_number(r2chan));
4292static void dahdi_r2_on_context_log(openr2_context_t *r2context, openr2_log_level_t level,
const char *fmt, va_list ap)
4293 __attribute__((format (printf, 3, 0)));
4294static void dahdi_r2_on_context_log(openr2_context_t *r2context, openr2_log_level_t level,
const char *fmt, va_list ap)
4296#define CONTEXT_TAG "Context - "
4298 char completemsg[
sizeof(
logmsg) * 2];
4300 snprintf(completemsg,
sizeof(completemsg), CONTEXT_TAG
"%s",
logmsg);
4301 dahdi_r2_write_log(level, completemsg);
4305static void dahdi_r2_on_chan_log(openr2_chan_t *r2chan, openr2_log_level_t level,
const char *fmt, va_list ap)
4306 __attribute__((format (printf, 3, 0)));
4307static void dahdi_r2_on_chan_log(openr2_chan_t *r2chan, openr2_log_level_t level,
const char *fmt, va_list ap)
4309#define CHAN_TAG "Chan "
4311 char completemsg[
sizeof(
logmsg) * 2];
4313 snprintf(completemsg,
sizeof(completemsg), CHAN_TAG
"%d - %s", openr2_chan_get_number(r2chan),
logmsg);
4314 dahdi_r2_write_log(level, completemsg);
4318static int dahdi_r2_on_dnis_digit_received(openr2_chan_t *r2chan,
char digit)
4320 struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
4327 p->mfcr2_dnis_index++;
4328 p->
exten[p->mfcr2_dnis_index] = 0;
4329 p->
rdnis[p->mfcr2_dnis_index] = 0;
4331 if ((p->mfcr2_dnis_matched ||
4340static void dahdi_r2_on_ani_digit_received(openr2_chan_t *r2chan,
char digit)
4342 struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
4345 p->mfcr2_ani_index++;
4346 p->
cid_num[p->mfcr2_ani_index] = 0;
4347 p->
cid_name[p->mfcr2_ani_index] = 0;
4350static void dahdi_r2_on_billing_pulse_received(openr2_chan_t *r2chan)
4352 ast_verbose(
"MFC/R2 billing pulse received on channel %d\n", openr2_chan_get_number(r2chan));
4355static openr2_event_interface_t dahdi_r2_event_iface = {
4356 .on_call_init = dahdi_r2_on_call_init,
4357 .on_call_offered = dahdi_r2_on_call_offered,
4358 .on_call_accepted = dahdi_r2_on_call_accepted,
4359 .on_call_answered = dahdi_r2_on_call_answered,
4360 .on_call_disconnect = dahdi_r2_on_call_disconnect,
4361 .on_call_end = dahdi_r2_on_call_end,
4362 .on_call_read = dahdi_r2_on_call_read,
4363 .on_hardware_alarm = dahdi_r2_on_hardware_alarm,
4364 .on_os_error = dahdi_r2_on_os_error,
4365 .on_protocol_error = dahdi_r2_on_protocol_error,
4366 .on_line_blocked = dahdi_r2_on_line_blocked,
4367 .on_line_idle = dahdi_r2_on_line_idle,
4369 .on_context_log = (openr2_handle_context_logging_func)dahdi_r2_on_context_log,
4370 .on_dnis_digit_received = dahdi_r2_on_dnis_digit_received,
4371 .on_ani_digit_received = dahdi_r2_on_ani_digit_received,
4373 .on_billing_pulse_received = dahdi_r2_on_billing_pulse_received
4376static inline int16_t dahdi_r2_alaw_to_linear(uint8_t sample)
4381static inline uint8_t dahdi_r2_linear_to_alaw(
int sample)
4386static openr2_transcoder_interface_t dahdi_r2_transcode_iface = {
4387 dahdi_r2_alaw_to_linear,
4388 dahdi_r2_linear_to_alaw
4429 for (
x = 0;
x < strlen(fn);
x++) {
4430 if (!isdigit(fn[
x])) {
4441 fn =
"/dev/dahdi/channel";
4443 fd = open(fn, O_RDWR | O_NONBLOCK);
4449 if (ioctl(fd, DAHDI_SPECIFY, &chan)) {
4458 if (ioctl(fd, DAHDI_SET_BLOCKSIZE, &
bs) == -1) {
4477 chan_pvt->
subs[sub_num].
dfd = -1;
4480#if defined(HAVE_PRI)
4481static void dahdi_close_pri_fd(
struct dahdi_pri *pri,
int fd_num)
4484 pri->pri.fds[fd_num] = -1;
4488#if defined(HAVE_SS7)
4489static void dahdi_close_ss7_fd(
struct dahdi_ss7 *ss7,
int fd_num)
4492 ss7->ss7.fds[fd_num] = -1;
4498 return ioctl(dfd, DAHDI_SETLINEAR, &linear);
4504 struct dahdi_bufferinfo bi;
4517 res = ioctl(p->
subs[x].
dfd, DAHDI_GET_BUFINFO, &bi);
4522 res = ioctl(p->
subs[x].
dfd, DAHDI_SET_BUFINFO, &bi);
4559 return DAHDI_TONE_DTMF_BASE + (
digit -
'0');
4561 return DAHDI_TONE_DTMF_A + (
digit -
'A');
4563 return DAHDI_TONE_DTMF_A + (
digit -
'a');
4564 else if (
digit ==
'*')
4565 return DAHDI_TONE_DTMF_s;
4566 else if (
digit ==
'#')
4567 return DAHDI_TONE_DTMF_p;
4606 char dial_str[] = {
'T',
digit,
'\0' };
4617 dtmf = DAHDI_FLUSH_WRITE;
4620 ast_log(
LOG_WARNING,
"Unable to flush the DAHDI write buffer to send DTMF on channel %d: %s\n",
4624 ast_debug(1,
"Channel %s started VLDTMF digit '%c'\n",
4659 ast_debug(1,
"Channel %s ending VLDTMF digit '%c'\n",
4685 "Hook Transition Complete",
4690 "Polarity Reversal",
4698 { DAHDI_ALARM_RED,
"Red Alarm" },
4699 { DAHDI_ALARM_YELLOW,
"Yellow Alarm" },
4700 { DAHDI_ALARM_BLUE,
"Blue Alarm" },
4701 { DAHDI_ALARM_RECOVER,
"Recovering" },
4702 { DAHDI_ALARM_LOOPBACK,
"Loopback" },
4703 { DAHDI_ALARM_NOTOPEN,
"Not Open" },
4704 { DAHDI_ALARM_NONE,
"None" },
4714 return alm ?
"Unknown Alarm" :
"No Alarm";
4719 static char buf[256];
4728 static char buf[256];
4731 return "E & M Immediate";
4733 return "E & M Wink";
4737 return "Feature Group D (DTMF)";
4739 return "Feature Group D (MF)";
4741 return "Feature Group D (MF) Tandem Access";
4743 return "Feature Group B (MF)";
4747 return "FGC/CAMA (Dialpulse)";
4749 return "FGC/CAMA (MF)";
4751 return "FXS Loopstart";
4753 return "FXS Groundstart";
4755 return "FXS Kewlstart";
4757 return "FXO Loopstart";
4759 return "FXO Groundstart";
4761 return "FXO Kewlstart";
4765 return "ISDN BRI Point to Point";
4767 return "ISDN BRI Point to MultiPoint";
4773 return "SF (Tone) Immediate";
4775 return "SF (Tone) Wink";
4777 return "SF (Tone) with Feature Group D (DTMF)";
4779 return "SF (Tone) with Feature Group D (MF)";
4781 return "SF (Tone) with Feature Group B (MF)";
4785 snprintf(
buf,
sizeof(
buf),
"Unknown signalling %d", sig);
4790#define sig2str dahdi_sig2str
4796 struct dahdi_confinfo zi;
4798 memset(&zi, 0,
sizeof(zi));
4801 if (slavechannel > 0) {
4803 zi.confmode = DAHDI_CONF_DIGITALMON;
4804 zi.confno = slavechannel;
4808 zi.confmode = DAHDI_CONF_REALANDPSEUDO | DAHDI_CONF_TALKER | DAHDI_CONF_LISTENER |
4809 DAHDI_CONF_PSEUDO_TALKER | DAHDI_CONF_PSEUDO_LISTENER;
4811 zi.confmode = DAHDI_CONF_CONF | DAHDI_CONF_TALKER | DAHDI_CONF_LISTENER;
4814 if ((zi.confno ==
c->curconf.confno) && (zi.confmode ==
c->curconf.confmode))
4818 if (ioctl(
c->dfd, DAHDI_SETCONF, &zi)) {
4819 ast_log(
LOG_WARNING,
"Failed to add %d to conference %d/%d: %s\n",
c->dfd, zi.confmode, zi.confno, strerror(
errno));
4822 if (slavechannel < 1) {
4826 ast_debug(1,
"Added %d to conference %d/%d\n",
c->dfd,
c->curconf.confmode,
c->curconf.confno);
4833 if ((p->
channel ==
c->curconf.confno) && (
c->curconf.confmode == DAHDI_CONF_DIGITALMON))
4836 if ((p->
confno > 0) && (p->
confno ==
c->curconf.confno) && (
c->curconf.confmode & DAHDI_CONF_TALKER))
4843 struct dahdi_confinfo zi;
4850 memset(&zi, 0,
sizeof(zi));
4851 if (ioctl(
c->dfd, DAHDI_SETCONF, &zi)) {
4852 ast_log(
LOG_WARNING,
"Failed to drop %d from conference %d/%d: %s\n",
c->dfd,
c->curconf.confmode,
c->curconf.confno, strerror(
errno));
4855 ast_debug(1,
"Removed %d from conference %d/%d\n",
c->dfd,
c->curconf.confmode,
c->curconf.confno);
4856 memcpy(&
c->curconf, &zi,
sizeof(
c->curconf));
4868 for (x = 0; x < 3; x++) {
4876 if (useslavenative) {
4895 else if (slave->
law != p->
law) {
4901 return useslavenative;
4909 struct dahdi_confinfo zi;
4911 memset(&zi, 0,
sizeof(zi));
4927 for (x = 0; x < 3; x++) {
4970 ast_debug(1,
"Updated conferencing on %d, with %d conference users\n", p->
channel, needconf);
4979 ast_debug(1,
"Echo cancellation already on\n");
4983 ast_debug(1,
"Echo cancellation isn't required on digital connection\n");
4987#if defined(HAVE_PRI) || defined(HAVE_SS7)
4989#if defined(HAVE_PRI)
5000#if defined(HAVE_SS7)
5009 "Unable to enable audio mode on channel %d (%s)\n",
5025 ast_debug(1,
"No echo cancellation requested\n");
5041 ast_debug(1,
"No echo training requested\n");
5050 struct dahdi_echocanparams ecp = { .tap_length = 0 };
5065 struct dahdi_hwgain hwgain;
5067 hwgain.newgain = gain * 10.0;
5068 hwgain.tx = tx_direction;
5069 return ioctl(fd, DAHDI_SET_HWGAIN, &hwgain) < 0;
5076 float shallow, steep;
5077 float max = SHRT_MAX;
5079 neg = (sample < 0 ? -1 : 1);
5081 shallow = neg*(
max-
max/drc)+(
float)sample/drc;
5082 if (fabsf(steep) < fabsf(shallow)) {
5093static void fill_txgain(
struct dahdi_gains *g,
float gain,
float drc,
int law)
5098 float linear_gain = pow(10.0, gain / 20.0);
5101 case DAHDI_LAW_ALAW:
5102 for (j = 0; j <
ARRAY_LEN(g->txgain); j++) {
5108 k = (float)k * linear_gain;
5111 }
else if (k < -32768) {
5120 case DAHDI_LAW_MULAW:
5121 for (j = 0; j <
ARRAY_LEN(g->txgain); j++) {
5127 k = (float)k * linear_gain;
5130 }
else if (k < -32768) {
5143static void fill_rxgain(
struct dahdi_gains *g,
float gain,
float drc,
int law)
5147 float linear_gain = pow(10.0, gain / 20.0);
5150 case DAHDI_LAW_ALAW:
5151 for (j = 0; j <
ARRAY_LEN(g->rxgain); j++) {
5157 k = (float)k * linear_gain;
5160 }
else if (k < -32768) {
5169 case DAHDI_LAW_MULAW:
5170 for (j = 0; j <
ARRAY_LEN(g->rxgain); j++) {
5176 k = (float)k * linear_gain;
5179 }
else if (k < -32768) {
5193 struct dahdi_gains g;
5196 memset(&g, 0,
sizeof(g));
5197 res = ioctl(fd, DAHDI_GETGAINS, &g);
5205 return ioctl(fd, DAHDI_SETGAINS, &g);
5210 struct dahdi_gains g;
5213 memset(&g, 0,
sizeof(g));
5214 res = ioctl(fd, DAHDI_GETGAINS, &g);
5222 return ioctl(fd, DAHDI_SETGAINS, &g);
5225static int set_actual_gain(
int fd,
float rxgain,
float txgain,
float rxdrc,
float txdrc,
int law)
5262 res = ioctl(fd, DAHDI_HOOK, &x);
5265 if (
errno == EINPROGRESS)
5279#if defined(HAVE_PRI) || defined(HAVE_SS7)
5281#if defined(HAVE_PRI)
5289#if defined(HAVE_SS7)
5313 struct dahdi_confinfo
c;
5326 memset(&
c, 0,
sizeof(
c));
5327 c.confmode = DAHDI_CONF_NORMAL;
5333 ast_debug(1,
"Disabled conferencing\n");
5347 ast_debug(1,
"Restored conferencing\n");
5380 ast_debug(6,
"MWI manual override active on channel %d: pretending that it should be %s\n",
5411 if (
errno == EAGAIN)
5490#if defined(HAVE_PRI)
5497 subaddr = strchr(p->
exten,
':');
5526 x = DAHDI_FLUSH_READ | DAHDI_FLUSH_WRITE;
5541 (p->
law == DAHDI_LAW_ALAW) ? PRI_LAYER_1_ALAW : PRI_LAYER_1_ULAW);
5547#if defined(HAVE_SS7)
5579 openr2_calling_party_category_t chancat;
5598 chancat = dahdi_r2_get_channel_category(ast);
5599 callres = openr2_chan_make_call(p->r2chan, l, (
c + p->
stripmsd), chancat);
5600 if (-1 == callres) {
5605 p->mfcr2_call_accepted = 0;
5606 p->mfcr2_progress_sent = 0;
5680 }
else if (
iflist == pvt) {
5688 }
else if (
ifend == pvt) {
5699#if defined(HAVE_PRI)
5752#if defined(HAVE_PRI)
5790#if defined(HAVE_PRI)
5798static void dahdi_unlink_pri_pvt(
struct dahdi_pvt *pvt)
5809 for (idx = 0; idx <
pri->numchans; ++idx) {
5820#if defined(HAVE_SS7)
5828static void dahdi_unlink_ss7_pvt(
struct dahdi_pvt *pvt)
5839 for (idx = 0; idx <
ss7->numchans; ++idx) {
5850#if defined(HAVE_OPENR2)
5857static void dahdi_unlink_mfcr2_pvt(
struct dahdi_pvt *pvt)
5860 struct dahdi_mfcr2 *mfcr2;
5861 int should_destroy_link = 0;
5866 openr2_chan_disable_read(pvt->r2chan);
5870 for (idx = 0; idx < mfcr2->numchans; ++idx) {
5871 if (mfcr2->pvts[idx] == pvt) {
5872 ast_debug(1,
"Removing MFC/R2 channel %d from the mfcr2 link\n", pvt->
channel);
5873 mfcr2->pvts[idx] =
NULL;
5874 mfcr2->live_chans--;
5878 if (!mfcr2->live_chans) {
5879 ast_debug(1,
"MFC/R2 link is now empty\n");
5880 should_destroy_link = 1;
5884 if (should_destroy_link) {
5885 ast_debug(1,
"MFC/R2 link is now empty\n");
5886 mfcr2_queue_for_destruction(pvt);
5914#if defined(HAVE_PRI)
5915 dahdi_unlink_pri_pvt(p);
5917#if defined(HAVE_SS7)
5918 dahdi_unlink_ss7_pvt(p);
5920#if defined(HAVE_OPENR2)
5921 dahdi_unlink_mfcr2_pvt(p);
5929#if defined(HAVE_PRI)
5930 case DAHDI_IFLIST_NO_B_CHAN:
5932 dahdi_nobch_extract(p->pri, p);
5943#if defined(HAVE_PRI)
5948#if defined(HAVE_SS7)
5991 for (i = 0; i < 3; i++) {
6003#if defined(HAVE_PRI)
6019#if defined(HAVE_PRI_SERVICE_MESSAGES)
6021 char db_chan_name[20];
6026 snprintf(db_chan_name,
sizeof(db_chan_name),
"%s/%d:%d", dahdi_db, p->
span, chan);
6027 if (!
ast_db_get(db_chan_name, SRVST_DBKEY, db_answer,
sizeof(db_answer))) {
6028 sscanf(db_answer,
"%1c:%30d", &
state, &why);
6038 ast_verb(3,
"Unregistered channel %d\n", chan);
6043#if defined(HAVE_PRI)
6046 if (!pris[
span].dchannels[0]) {
6062#if defined(HAVE_PRI)
6063static char *dahdi_send_keypad_facility_app =
"DAHDISendKeypadFacility";
6065static int dahdi_send_keypad_facility_exec(
struct ast_channel *chan,
const char *digits)
6071 ast_debug(1,
"No digit string sent to application!\n");
6078 ast_debug(1,
"Unable to find technology private\n");
6088#if defined(HAVE_PRI)
6089#if defined(HAVE_PRI_PROG_W_CAUSE)
6090static char *dahdi_send_callrerouting_facility_app =
"DAHDISendCallreroutingFacility";
6092static int dahdi_send_callrerouting_facility_exec(
struct ast_channel *chan,
const char *data)
6105 ast_debug(1,
"No data sent to application!\n");
6109 ast_debug(1,
"Only DAHDI technology accepted!\n");
6114 ast_debug(1,
"Unable to find technology private\n");
6121 ast_debug(1,
"callrerouting attempted on non-ISDN channel %s\n",
6130 ast_log(
LOG_WARNING,
"callrerouting facility requires at least destination number argument\n");
6135 ast_log(
LOG_WARNING,
"Callrerouting Facility without original called number argument\n");
6140 ast_log(
LOG_NOTICE,
"Callrerouting Facility without diversion reason argument, defaulting to unknown\n");
6159#if defined(HAVE_OPENR2)
6160static const char *
const dahdi_accept_r2_call_app =
"DAHDIAcceptR2Call";
6162static int dahdi_accept_r2_call_exec(
struct ast_channel *chan,
const char *data)
6165 openr2_call_mode_t accept_mode;
6166 int res, timeout, maxloops;
6175 ast_debug(1,
"No data sent to application!\n");
6180 ast_debug(1,
"Only DAHDI technology accepted!\n");
6186 ast_debug(1,
"Unable to find technology private!\n");
6194 ast_log(
LOG_WARNING,
"DAHDIAcceptR2Call requires 'yes' or 'no' for the charge parameter\n");
6199 if (!p->mfcr2 || !p->mfcr2call) {
6205 if (p->mfcr2_call_accepted) {
6210 accept_mode =
ast_true(
args.charge) ? OR2_CALL_WITH_CHARGE : OR2_CALL_NO_CHARGE;
6211 if (openr2_chan_accept_call(p->r2chan, accept_mode)) {
6222 while (maxloops > 0) {
6251 if (p->mfcr2_call_accepted) {
6253 ast_debug(1,
"Accepted MFC/R2 call!\n");
6264static openr2_call_disconnect_cause_t dahdi_ast_cause_to_r2_cause(
int cause)
6266 openr2_call_disconnect_cause_t r2cause = OR2_CAUSE_NORMAL_CLEARING;
6271 r2cause = OR2_CAUSE_BUSY_NUMBER;
6276 r2cause = OR2_CAUSE_NETWORK_CONGESTION;
6280 r2cause = OR2_CAUSE_UNALLOCATED_NUMBER;
6285 r2cause = OR2_CAUSE_OUT_OF_ORDER;
6290 r2cause = OR2_CAUSE_NO_ANSWER;
6294 r2cause = OR2_CAUSE_NORMAL_CLEARING;
6297 ast_debug(1,
"ast cause %d resulted in openr2 cause %d/%s\n",
6298 cause, r2cause, openr2_proto_get_disconnect_string(r2cause));
6307 struct dahdi_bufferinfo bi = {
6315 if ((bpres = ioctl(p->
subs[
SUB_REAL].
dfd, DAHDI_SET_BUFINFO, &bi)) < 0) {
6332 struct dahdi_params par;
6360#if defined(HAVE_PRI)
6423#if defined(HAVE_SS7)
6502 ast_debug(1,
"Hangup: channel: %d index = %d, normal = %d, callwait = %d, thirdcall = %d\n",
6519 ast_debug(1,
"Normal call hung up with both three way call and a call waiting call in place?\n");
6522 ast_debug(1,
"We were flipped over to the callwait, moving back and not owning.\n");
6529 ast_debug(1,
"We were in the threeway and have a callwait still. Ditching the threeway.\n");
6535 ast_debug(1,
"Call was complete, setting owner to former third call\n");
6539 ast_debug(1,
"Call was incomplete, setting owner to NULL\n");
6558 ast_debug(1,
"Call was complete, setting owner to former third call\n");
6562 ast_debug(1,
"Call was incomplete, setting owner to NULL\n");
6623 if (p->mfcr2 && p->mfcr2call && openr2_chan_get_direction(p->r2chan) != OR2_DIR_STOPPED) {
6626 if (openr2_chan_get_direction(p->r2chan) == OR2_DIR_BACKWARD && p->mfcr2_forced_release) {
6627 dahdi_r2_disconnect_call(p, OR2_CAUSE_FORCED_RELEASE);
6630 int r2cause_user = r2causestr ? atoi(r2causestr) : 0;
6631 openr2_call_disconnect_cause_t r2cause = r2cause_user ? dahdi_ast_cause_to_r2_cause(r2cause_user)
6633 dahdi_r2_disconnect_call(p, r2cause);
6635 }
else if (p->mfcr2call) {
6661 memset(&par, 0,
sizeof(par));
6666 ast_debug(1,
"Hanging up channel %d, offhook = %d\n", p->
channel, par.rxisoffhook);
6669 if ((par.rxisoffhook) && (!(p->
radio || (p->
oprmode < 0))))
6762 ast_debug(1,
"Channel %d is no longer eligible for reorigination (went back on hook or became in use)\n", p->
channel);
6807#if defined(HAVE_PRI)
6812#if defined(HAVE_SS7)
6819 if (!p->mfcr2_call_accepted) {
6822 p->mfcr2_answer_pending = 1;
6823 if (p->mfcr2_charge_calls) {
6824 ast_debug(1,
"Accepting MFC/R2 call with charge before answering on chan %d\n", p->
channel);
6825 openr2_chan_accept_call(p->r2chan, OR2_CALL_WITH_CHARGE);
6827 ast_debug(1,
"Accepting MFC/R2 call with no charge before answering on chan %d\n", p->
channel);
6828 openr2_chan_accept_call(p->r2chan, OR2_CALL_NO_CHARGE);
6864 int val = DAHDI_TONEDETECT_ON | DAHDI_TONEDETECT_MUTE;
6885 if (!p || !data || (*datalen < 1)) {
6896 *cp = p->
tdd ? 1 : 0;
6910#if defined(HAVE_PRI)
6911#if defined(HAVE_PRI_CCSS)
6939 if (!p || !data || (datalen < 1)) {
6946 scp = (
signed char *) data;
6955 scp = (
signed char *) data;
6993 ast_debug(1,
"Set option TDD MODE, value: %s(%d) on %s\n",
6998 unsigned char mybuf[41000];
7000 int size, res, fd,
len;
7001 struct pollfd fds[1];
7004 memset(
buf, 0x7f,
sizeof(mybuf));
7020 fds[0].events = POLLPRI | POLLOUT;
7022 res = poll(fds, 1, -1);
7028 if (fds[0].revents & POLLPRI)
7030 if (!(fds[0].revents & POLLOUT)) {
7034 res = write(fd,
buf, size);
7036 if (res == -1)
return -1;
7060 ast_debug(1,
"Set option RELAX DTMF, value: %s(%d) on %s\n",
7065#if defined(HAVE_PRI)
7105 ast_debug(1,
"Set Operator Services mode, value: %d on %s/%s\n",
7158 if (!strcasecmp(data,
"rxgain")) {
7162 }
else if (!strcasecmp(data,
"txgain")) {
7166 }
else if (!strcasecmp(data,
"dahdi_channel")) {
7170 }
else if (!strcasecmp(data,
"dahdi_span")) {
7174 }
else if (!strcasecmp(data,
"dahdi_group")) {
7178 }
else if (!strcasecmp(data,
"dahdi_type")) {
7181#if defined(HAVE_OPENR2)
7186#if defined(HAVE_PRI)
7194#if defined(HAVE_SS7)
7205#if defined(HAVE_PRI)
7206#if defined(HAVE_PRI_REVERSE_CHARGE)
7207 }
else if (!strcasecmp(data,
"reversecharge")) {
7220#if defined(HAVE_PRI_SETUP_KEYPAD)
7221 }
else if (!strcasecmp(data,
"keypad_digits")) {
7235 }
else if (!strcasecmp(data,
"no_media_path")) {
7252 }
else if (!strcasecmp(data,
"dialmode")) {
7290 char policy_str[21] =
"";
7292 if ((res = sscanf(parse,
"%30d,%20s", num_buffers, policy_str)) != 2) {
7296 if (*num_buffers < 0) {
7300 if (!strcasecmp(policy_str,
"full")) {
7301 *policy = DAHDI_POLICY_WHEN_FULL;
7302 }
else if (!strcasecmp(policy_str,
"immediate")) {
7303 *policy = DAHDI_POLICY_IMMEDIATE;
7304#if defined(HAVE_DAHDI_HALF_FULL)
7305 }
else if (!strcasecmp(policy_str,
"half")) {
7306 *policy = DAHDI_POLICY_HALF_FULL;
7326 if (!strcasecmp(data,
"buffers")) {
7327 int num_bufs, policy;
7330 struct dahdi_bufferinfo bi = {
7331 .txbufpolicy = policy,
7332 .rxbufpolicy = policy,
7334 .numbufs = num_bufs,
7338 if ((bpres = ioctl(p->
subs[
SUB_REAL].
dfd, DAHDI_SET_BUFINFO, &bi)) < 0) {
7346 }
else if (!strcasecmp(data,
"echocan_mode")) {
7347 if (!strcasecmp(
value,
"on")) {
7351 }
else if (!strcasecmp(
value,
"off")) {
7355#ifdef HAVE_DAHDI_ECHOCANCEL_FAX_MODE
7356 }
else if (!strcasecmp(
value,
"fax")) {
7367 }
else if (!strcasecmp(
value,
"voice")) {
7383 }
else if (!strcasecmp(data,
"dialmode")) {
7394 if (!strcasecmp(
value,
"pulse")) {
7396 }
else if (!strcasecmp(
value,
"dtmf") || !strcasecmp(
value,
"tone")) {
7398 }
else if (!strcasecmp(
value,
"none")) {
7400 }
else if (!strcasecmp(
value,
"both")) {
7407 }
else if (!strcasecmp(data,
"waitfordialtone")) {
7447 if (!slave || (master->
slaves[x] == slave)) {
7488 if (!slave || !master) {
7493 if (!master->
slaves[x]) {
7494 master->
slaves[x] = slave;
7517 if (p->
owner == oldchan) {
7520 for (x = 0; x < 3; x++) {
7530#if defined(HAVE_PRI)
7534#if defined(HAVE_SS7)
7603 ast_verb(3,
"TRANSFERRING %s to %s\n",
7628 struct dahdi_confinfo ci;
7632 memset(&ci, 0,
sizeof(ci));
7641 ast_verb(3,
"Avoiding 3-way call when in an external conference\n");
7655 struct dahdi_spaninfo zi;
7656 struct dahdi_params params;
7658 memset(&zi, 0,
sizeof(zi));
7659 zi.spanno = p->
span;
7662 if (zi.alarms != DAHDI_ALARM_NONE)
7670 memset(¶ms, 0,
sizeof(params));
7671 if ((res = ioctl(p->
subs[
SUB_REAL].
dfd, DAHDI_GET_PARAMS, ¶ms)) >= 0)
7672 return params.chan_alarms;
7676 return DAHDI_ALARM_NONE;
7684 ast_debug(1,
"%s DTMF digit: 0x%02X '%c' on %s\n",
7701 *dest = &p->
subs[idx].
f;
7705 ast_debug(1,
"Got some DTMF, but it's for the CAS\n");
7714 *dest = &p->
subs[idx].
f;
7721 struct dahdi_bufferinfo bi = {
7728 if ((res = ioctl(p->
subs[idx].
dfd, DAHDI_SET_BUFINFO, &bi)) < 0) {
7766 ast_debug(1,
"Already in a fax extension, not redirecting\n");
7775 *dest = &p->
subs[idx].
f;
7785 "Alarm", alarm_txt);
7804 "Alarm", alarm_txt);
7814 const char *alarm_str;
7816#if defined(HAVE_PRI)
7857 p->
subs[idx].
f.
src =
"dahdi_handle_event";
7859 f = &p->
subs[idx].
f;
7869 if (res & (DAHDI_EVENT_PULSEDIGIT | DAHDI_EVENT_DTMFUP)) {
7870 p->
pulsedial = (res & DAHDI_EVENT_PULSEDIGIT) ? 1 : 0;
7872#if defined(HAVE_PRI)
7890 if (res & DAHDI_EVENT_DTMFDOWN) {
7891 ast_debug(1,
"DTMF Down '%c'\n", res & 0xff);
7892#if defined(HAVE_PRI)
7907 return &p->
subs[idx].
f;
7911 case DAHDI_EVENT_EC_DISABLED:
7915#ifdef HAVE_DAHDI_ECHOCANCEL_FAX_MODE
7916 case DAHDI_EVENT_TX_CED_DETECTED:
7917 ast_verb(3,
"Channel %d detected a CED tone towards the network.\n", p->
channel);
7919 case DAHDI_EVENT_RX_CED_DETECTED:
7920 ast_verb(3,
"Channel %d detected a CED tone from the network.\n", p->
channel);
7922 case DAHDI_EVENT_EC_NLP_DISABLED:
7923 ast_verb(3,
"Channel %d echo canceler disabled its NLP.\n", p->
channel);
7925 case DAHDI_EVENT_EC_NLP_ENABLED:
7926 ast_verb(3,
"Channel %d echo canceler enabled its NLP.\n", p->
channel);
7929 case DAHDI_EVENT_BITSCHANGED:
7935 openr2_chan_handle_cas(p->r2chan);
7941 case DAHDI_EVENT_PULSE_START:
7944 tone_zone_play_tone(p->
subs[idx].
dfd, -1);
7946 case DAHDI_EVENT_DIALCOMPLETE:
7948#if defined(HAVE_PRI)
7953 if (ioctl(p->
subs[idx].
dfd, DAHDI_DIALING, &x) == -1) {
7954 ast_debug(1,
"DAHDI_DIALING ioctl failed on %s: %s\n",
7979 if (ioctl(p->
subs[idx].
dfd,DAHDI_DIALING,&x) == -1) {
7988 p->
dop.op = DAHDI_DIAL_OP_REPLACE;
8007 ast_debug(1,
"Done dialing, but waiting for progress detection before doing more...\n");
8032 case DAHDI_EVENT_ALARM:
8034#if defined(HAVE_PRI)
8039#if defined(HAVE_SS7)
8051 if (!p->pri || !p->pri->pri || pri_get_timer(p->pri->pri, PRI_TIMER_T309) < 0) {
8057#if defined(HAVE_SS7)
8065 case DAHDI_EVENT_ONHOOK:
8099 ast_verb(3,
"Channel %d still has (callwait) call, ringing phone\n", p->
channel);
8114 unsigned int mssinceflash;
8125 if (p->
owner != ast) {
8135 ast_debug(1,
"Last flash was %u ms ago\n", mssinceflash);
8142 ast_debug(1,
"Looks like a bounced flash, hanging up both calls on %d\n", p->
channel);
8188 case DAHDI_EVENT_RINGOFFHOOK:
8218 int numchars = snprintf(p->
dop.dialstr,
sizeof(p->
dop.dialstr),
"M*0%s#",
c);
8219 if (numchars >=
sizeof(p->
dop.dialstr)) {
8226 if (strlen(p->
dop.dialstr) > 4) {
8231 p->
dop.dialstr[strlen(p->
dop.dialstr)-2] =
'\0';
8240 return &p->
subs[idx].
f;
8272 p->
dop.dialstr[0] =
'\0';
8275 ast_debug(1,
"Sent FXO deferred digit string: %s\n", p->
dop.dialstr);
8280 p->
dop.dialstr[0] =
'\0';
8284 return &p->
subs[idx].
f;
8291 return &p->
subs[idx].
f;
8304 res = tone_zone_play_tone(p->
subs[
SUB_REAL].
dfd, DAHDI_TONE_DIALTONE);
8319 ast_debug(1,
"Setting IDLE polarity due "
8320 "to ring. Old polarity was %d\n",
8363 case DAHDI_EVENT_RINGBEGIN:
8374 case DAHDI_EVENT_RINGERON:
8376 case DAHDI_EVENT_NOALARM:
8378#if defined(HAVE_PRI)
8383#if defined(HAVE_SS7)
8394 case DAHDI_EVENT_WINKFLASH:
8396 if (p->
radio)
break;
8400 struct dahdi_params par;
8402 memset(&par, 0,
sizeof(par));
8405 if (!par.rxisoffhook)
8423 ast_debug(1,
"Winkflash, index: %d, normal: %d, callwait: %d, thirdcall: %d\n",
8487 ast_debug(1,
"Flash when call not up or ringing\n");
8518 res = tone_zone_play_tone(p->
subs[
SUB_REAL].
dfd, DAHDI_TONE_DIALRECALL);
8526 res = tone_zone_play_tone(p->
subs[
SUB_REAL].
dfd, DAHDI_TONE_CONGESTION);
8542 ast_debug(1,
"Got flash with three way call up, dropping last call on %d\n", p->
channel);
8560 ast_verb(3,
"Building conference call with %s and %s\n",
8610 snprintf(p->
dop.dialstr,
sizeof(p->
dop.dialstr),
"M*%d%s#",
8619 ast_log(
LOG_WARNING,
"Received unexpected wink on channel of type SIG_FEATDMF_TA\n");
8636 p->
dop.dialstr[0] =
'\0';
8639 ast_debug(1,
"Sent deferred digit string: %s\n", p->
dop.dialstr);
8641 p->
dop.dialstr[0] =
'\0';
8647 case DAHDI_EVENT_HOOKCOMPLETE:
8665 p->
dop.dialstr[0] =
'\0';
8668 ast_debug(1,
"Sent deferred digit string: %s\n", p->
dop.dialstr);
8670 p->
dop.dialstr[0] =
'\0';
8671 p->
dop.op = DAHDI_DIAL_OP_REPLACE;
8681 ast_debug(1,
"Got hook complete in MF FGD, waiting for wink now on channel %d\n",p->
channel);
8687 case DAHDI_EVENT_POLARITY:
8699 ast_debug(1,
"Answering on polarity switch!\n");
8714 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) );
8717 ast_debug(1,
"Polarity Reversal detected and now Hanging up on channel %d\n", p->
channel);
8728 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) );
8731 ast_debug(1,
"Dunno what to do with event %d on channel %d\n", res, p->
channel);
8733 return &p->
subs[idx].
f;
8755 p->
subs[idx].
f.
src =
"dahdi_exception";
8771 if ((res != DAHDI_EVENT_RINGEROFF) && (res != DAHDI_EVENT_RINGERON) &&
8772 (res != DAHDI_EVENT_HOOKCOMPLETE)) {
8773 ast_debug(1,
"Restoring owner of channel %d on event %d\n", p->
channel, res);
8781 case DAHDI_EVENT_ONHOOK:
8793 case DAHDI_EVENT_RINGOFFHOOK:
8801 case DAHDI_EVENT_HOOKCOMPLETE:
8802 case DAHDI_EVENT_RINGERON:
8803 case DAHDI_EVENT_RINGEROFF:
8806 case DAHDI_EVENT_WINKFLASH:
8813 if (usedindex > -1) {
8830 f = &p->
subs[idx].
f;
8836 if (ast != p->
owner) {
8840 f = &p->
subs[idx].
f;
8934 struct dahdi_params ps;
8936 memset(&ps, 0,
sizeof(ps));
8952 return &p->
subs[idx].
f;
8955 if (!(--p->
ringt)) {
8963 openr2_chan_process_event(p->r2chan);
8964 if (OR2_DIR_FORWARD == openr2_chan_get_direction(p->r2chan)) {
8968 if (p->mfcr2_call_accepted &&
8969 !p->mfcr2_progress_sent &&
8971 ast_debug(1,
"Enqueuing progress frame after R2 accept in chan %d\n", p->
channel);
8973 p->mfcr2_progress_sent = 1;
8986 return &p->
subs[idx].
f;
8995 return &p->
subs[idx].
f;
9004 return &p->
subs[idx].
f;
9013 return &p->
subs[idx].
f;
9016 if (p->mfcr2 && openr2_chan_get_read_enabled(p->r2chan)) {
9032 return &p->
subs[idx].
f;
9042 return &p->
subs[idx].
f;
9052 return &p->
subs[idx].
f;
9094 if (
errno == EAGAIN) {
9097 return &p->
subs[idx].
f;
9098 }
else if (
errno == ELAST) {
9140 return &p->
subs[idx].
f;
9148 ast_verb(3,
"CPE does not support Call Waiting Caller*ID.\n");
9205 ast_debug(1,
"Channel driver fax CNG detection timeout on %s\n",
9250 ast_debug(1,
"Absorbing inband %s DTMF digit: 0x%02X '%c' on %s\n",
9273 ast_debug(1,
"Got 10 samples of dialtone!\n");
9277 p->
dop.dialstr[0] =
'\0';
9282 ast_debug(1,
"Sent deferred digit string: %s\n", p->
dop.dialstr);
9284 p->
dop.dialstr[0] =
'\0';
9285 p->
dop.op = DAHDI_DIAL_OP_REPLACE;
9294 f = &p->
subs[idx].
f;
9346 res = write(fd,
buf, size);
9391 if (mssinceflash >= 1000) {
9409 ast_debug(5,
"Dropping frame since I'm still dialing on %s...\n",
9415 ast_debug(5,
"Dropping frame since there is no active owner on %s...\n",
9421 ast_debug(5,
"Dropping frame since I've still got a callerid spill on %s...\n",
9463 int func = DAHDI_FLASH;
9468#if defined(HAVE_PRI)
9474#if defined(HAVE_SS7)
9484 if (p->mfcr2 && !p->mfcr2_call_accepted) {
9493 switch (condition) {
9495 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_BUSY);
9498 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_RINGTONE);
9559 p->
dop.dialstr[0] =
'\0';
9572 res = tone_zone_play_tone(p->
subs[idx].
dfd, -1);
9582#if defined(HAVE_PRI)
9597#if defined(HAVE_PRI)
9598 }
else if (i->pri) {
9600 y = ++i->pri->new_chan_seq;
9618 for (x = 0; x < 3; ++x) {
9656#if defined(HAVE_PRI)
9675 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));
9689#if defined(HAVE_PRI)
9697 if (law == DAHDI_LAW_ALAW) {
9707 ? DAHDI_LAW_ALAW : DAHDI_LAW_MULAW;
9742 x = DAHDI_TONEDETECT_ON | DAHDI_TONEDETECT_MUTE;
9743 if (ioctl(i->
subs[idx].
dfd, DAHDI_TONEDETECT, &x)) {
9761#if defined(HAVE_PRI) || defined(HAVE_SS7)
9795 ast_channel_parkinglot_set(tmp, i->
parkinglot);
9797 ast_channel_language_set(tmp, i->
language);
9824#if defined(HAVE_PRI) || defined(HAVE_SS7)
9853 dashptr = strrchr(device_name,
'-');
9860 for (v = i->
vars ; v ; v = v->
next)
9900 if (strchr(term,
c))
9912 j = DAHDI_IOMUX_SIGEVENT;
9914 if (ioctl(p->
subs[idx].
dfd,DAHDI_IOMUX,&j) == -1)
return(-1);
9916 if (j & DAHDI_IOMUX_SIGEVENT)
break;
9919 if (ioctl(p->
subs[idx].
dfd,DAHDI_GETEVENT,&j) == -1)
return(-1);
9959 return dahdichan->
dnd;
9964 ast_verb(3,
"%s DND on channel %d\n",
9965 flag?
"Enabled" :
"Disabled",
9973 int extlen = strlen(exten);
9979 if (extlen < strlen(pickupexten) && !strncmp(pickupexten, exten, extlen)) {
9983 if (exten[0] ==
'*' && extlen < 3) {
10004 unsigned char buf[256];
10010 int curRingData[3];
10019 int getforward = 0;
10025 const char *pickupexten;
10049 ast_log(
LOG_ERROR,
"Unable to retrieve pickup configuration options. Unable to detect call pickup extension\n");
10052 pickupexten =
ast_strdupa(pickup_cfg->pickupexten);
10077 res = tone_zone_play_tone(p->
subs[idx].
dfd, -1);
10087 memset(dtmfbuf, 0,
sizeof(dtmfbuf));
10102 res =
my_getsigstr(chan, dtmfbuf + strlen(dtmfbuf),
"*", 3000);
10112 if (res <= 0)
break;
10121 if ((p->
sig ==
SIG_FEATDMF) && (dtmfbuf[1] !=
'0') && (strlen(dtmfbuf) != 14))
10127 if (res <= 0)
break;
10135 res =
my_getsigstr(chan, dtmfbuf + strlen(dtmfbuf),
"#", 3000);
10152 res =
my_getsigstr(chan, dtmfbuf + strlen(dtmfbuf),
"*", 3000);
10159 dtmfbuf[
len] =
'\0';
10168 ast_debug(1,
"waitfordigit returned < 0...\n");
10172 dtmfbuf[
len++] = res;
10173 dtmfbuf[
len] =
'\0';
10185 }
else if (res < 0) {
10186 ast_debug(1,
"Got hung up before digits finished\n");
10201 if ((res > 0) && (strlen(anibuf) > 2)) {
10202 if (anibuf[strlen(anibuf) - 1] ==
'#')
10203 anibuf[strlen(anibuf) - 1] = 0;
10214 if (exten[0] ==
'*') {
10215 char *stringp=
NULL;
10219 s1 =
strsep(&stringp,
"*");
10220 s2 =
strsep(&stringp,
"*");
10233 if (exten[0] ==
'*') {
10234 char *stringp=
NULL;
10238 s1 =
strsep(&stringp,
"#");
10239 s2 =
strsep(&stringp,
"#");
10253 if (exten[0] ==
'*') {
10254 char *stringp=
NULL;
10258 s1 =
strsep(&stringp,
"#");
10259 s2 =
strsep(&stringp,
"#");
10260 if (s2 && (*(s2 + 1) ==
'0')) {
10270 if (exten[0] ==
'*') {
10271 char *stringp=
NULL;
10275 s1 =
strsep(&stringp,
"#");
10309 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_CONGESTION);
10315 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_INFO);
10323 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_CONGESTION);
10338 int is_exten_parking = 0;
10348 ast_debug(1,
"waitfordigit returned < 0...\n");
10349 res = tone_zone_play_tone(p->
subs[idx].
dfd, -1);
10353 ast_debug(1,
"waitfordigit returned '%c' (%d), timeout = %d\n", res, res, timeout);
10358 tone_zone_play_tone(p->
subs[idx].
dfd, -1);
10360 tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALTONE);
10371 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALRECALL);
10375 res = tone_zone_play_tone(p->
subs[idx].
dfd, -1);
10377 memset(exten, 0,
sizeof(exten));
10378 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALTONE);
10382 res = tone_zone_play_tone(p->
subs[idx].
dfd, -1);
10401 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_CONGESTION);
10410 }
else if (res == 0) {
10411 ast_debug(1,
"not enough digits (and no ambiguous match)...\n");
10412 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_CONGESTION);
10416 }
else if (p->
callwaiting && !strcmp(exten,
"*70")) {
10420 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALRECALL);
10426 ioctl(p->
subs[idx].
dfd,DAHDI_CONFDIAG,&
len);
10427 memset(exten, 0,
sizeof(exten));
10430 }
else if (!strcmp(exten, pickupexten)) {
10446 ast_debug(1,
"No call pickup possible...\n");
10447 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_CONGESTION);
10458 }
else if (!p->
hidecallerid && !strcmp(exten,
"*67")) {
10466 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALRECALL);
10472 memset(exten, 0,
sizeof(exten));
10474 }
else if (p->
callreturn && !strcmp(exten,
"*69")) {
10475 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALRECALL);
10477 }
else if (!strcmp(exten,
"*78")) {
10480 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALRECALL);
10482 memset(exten, 0,
sizeof(exten));
10484 }
else if (!strcmp(exten,
"*79")) {
10487 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALRECALL);
10489 memset(exten, 0,
sizeof(exten));
10492 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALRECALL);
10494 memset(exten, 0,
sizeof(exten));
10497 ast_verb(3,
"Cancelling call forwarding on channel %d\n", p->
channel);
10498 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALRECALL);
10501 memset(exten, 0,
sizeof(exten));
10514 if (bridge_channel) {
10533 }
else if (p->
hidecallerid && !strcmp(exten,
"*82")) {
10538 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALRECALL);
10544 memset(exten, 0,
sizeof(exten));
10546 }
else if (!strcmp(exten,
"*0")) {
10553 if (nbridge && bridged) {
10556 if (nbridge && pbridge &&
10560 int func = DAHDI_FLASH;
10562 p->
dop.dialstr[0] =
'\0';
10575 tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_CONGESTION);
10577 tone_zone_play_tone(p->
subs[idx].
dfd, -1);
10595 tone_zone_play_tone(p->
subs[idx].
dfd, -1);
10605 if (smdi_msg !=
NULL) {
10608 if (smdi_msg->
type ==
'B')
10610 else if (smdi_msg->
type ==
'N')
10658 "Exiting simple switch\n");
10683 ast_debug(1,
"CID got string '%s'\n", dtmfbuf);
10696 struct timeval start;
10707 i = DAHDI_IOMUX_READ | DAHDI_IOMUX_SIGEVENT;
10708 if ((res = ioctl(p->
subs[idx].
dfd, DAHDI_IOMUX, &i))) {
10714 if (i & DAHDI_IOMUX_SIGEVENT) {
10717 if (res == DAHDI_EVENT_NOALARM) {
10722 if (res == DAHDI_EVENT_RINGBEGIN) {
10730 }
else if (i & DAHDI_IOMUX_READ) {
10733 if (
errno != ELAST) {
10754 "Failed to decode CallerID on channel '%s'\n",
10759 else if (samples > (8000 * 10))
10783 "Exiting simple switch\n");
10804 for (receivedRingT = 0; receivedRingT <
ARRAY_LEN(curRingData); receivedRingT++)
10805 curRingData[receivedRingT] = 0;
10816 i = DAHDI_IOMUX_READ | DAHDI_IOMUX_SIGEVENT;
10817 if ((res = ioctl(p->
subs[idx].
dfd, DAHDI_IOMUX, &i))) {
10823 if (i & DAHDI_IOMUX_SIGEVENT) {
10826 if (res == DAHDI_EVENT_NOALARM) {
10832 curRingData[receivedRingT] = p->
ringt;
10838 if (++receivedRingT ==
ARRAY_LEN(curRingData))
10840 }
else if (i & DAHDI_IOMUX_READ) {
10843 if (
errno != ELAST) {
10851 if (p->
ringt > 0) {
10852 if (!(--p->
ringt)) {
10860 ast_verb(3,
"Detected ring pattern: %d,%d,%d\n",curRingData[0],curRingData[1],curRingData[2]);
10861 for (counter = 0; counter < 3; counter++) {
10865 for (counter1 = 0; counter1 < 3; counter1++) {
10868 ast_verb(3,
"Pattern ignore (-1) detected, so matching pattern %d regardless.\n",
10869 curRingData[counter1]);
10873 ast_verb(3,
"Ring pattern matched in range: %d to %d\n",
10880 if (distMatches == 3) {
10898 "state, but I have nothing to do. "
10899 "Terminating simple switch, should be "
10900 "restarted by the actual ring.\n",
10909 struct timeval start;
10922 "Exiting simple switch\n");
10946 ast_debug(1,
"CID is '%s', flags %d\n",
10965 for (receivedRingT = 0; receivedRingT <
ARRAY_LEN(curRingData); receivedRingT++)
10966 curRingData[receivedRingT] = 0;
10979 i = DAHDI_IOMUX_READ | DAHDI_IOMUX_SIGEVENT;
10980 if ((res = ioctl(p->
subs[idx].
dfd, DAHDI_IOMUX, &i))) {
10986 if (i & DAHDI_IOMUX_SIGEVENT) {
10989 if (res == DAHDI_EVENT_NOALARM) {
10994 ast_debug(1,
"Hanging up due to polarity reversal on channel %d while detecting callerid\n", p->
channel);
11003 curRingData[receivedRingT] = p->
ringt;
11009 if (++receivedRingT ==
ARRAY_LEN(curRingData))
11011 }
else if (i & DAHDI_IOMUX_READ) {
11014 if (
errno != ELAST) {
11022 if (p->
ringt > 0) {
11023 if (!(--p->
ringt)) {
11036 "Failed to decode CallerID on channel '%s'\n",
11041 else if (
samples > (8000 * 10))
11051 for (receivedRingT = 0; receivedRingT < 3; receivedRingT++) {
11052 curRingData[receivedRingT] = 0;
11055 ast_verb(3,
"Detecting post-CID distinctive ring\n");
11057 i = DAHDI_IOMUX_READ | DAHDI_IOMUX_SIGEVENT;
11058 if ((res = ioctl(p->
subs[idx].
dfd, DAHDI_IOMUX, &i))) {
11064 if (i & DAHDI_IOMUX_SIGEVENT) {
11067 if (res == DAHDI_EVENT_NOALARM) {
11073 curRingData[receivedRingT] = p->
ringt;
11079 if (++receivedRingT ==
ARRAY_LEN(curRingData))
11081 }
else if (i & DAHDI_IOMUX_READ) {
11084 if (
errno != ELAST) {
11092 if (p->
ringt > 0) {
11093 if (!(--p->
ringt)) {
11103 ast_verb(3,
"Detected ring pattern: %d,%d,%d\n",curRingData[0],curRingData[1],curRingData[2]);
11105 for (counter = 0; counter < 3; counter++) {
11109 ast_verb(3,
"Checking %d,%d,%d\n",
11114 for (counter1 = 0; counter1 < 3; counter1++) {
11117 ast_verb(3,
"Pattern ignore (-1) detected, so matching pattern %d regardless.\n",
11118 curRingData[counter1]);
11123 ast_verb(3,
"Ring pattern matched in range: %d to %d\n",
11129 if (distMatches == 3) {
11176 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_CONGESTION);
11180 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_CONGESTION);
11206 for (x = 0; x <
len; x++)
11216 pthread_t threadid;
11221 unsigned int spill_done = 0;
11222 int spill_result = -1;
11225 goto quit_no_clean;
11233 i = DAHDI_IOMUX_READ | DAHDI_IOMUX_SIGEVENT;
11239 if (i & DAHDI_IOMUX_SIGEVENT) {
11242 int callid_created;
11250 case DAHDI_EVENT_NEONMWI_ACTIVE:
11251 case DAHDI_EVENT_NEONMWI_INACTIVE:
11252 case DAHDI_EVENT_NONE:
11253 case DAHDI_EVENT_BITSCHANGED:
11255 case DAHDI_EVENT_NOALARM:
11264 case DAHDI_EVENT_ALARM:
11302 goto quit_no_clean;
11304 }
else if (i & DAHDI_IOMUX_READ) {
11306 if (
errno != ELAST) {
11321 }
else if (spill_result) {
11331 if (samples > (8000 * 4))
11336 if (spill_result == 1) {
11373#ifdef HAVE_DAHDI_LINEREVERSE_VMWI
11375 if (pvt->mwisend_rpas) {
11378 }
else if (pvt->mwisend_fsk) {
11406 x = DAHDI_FLUSH_BOTH;
11410#ifdef HAVE_DAHDI_LINEREVERSE_VMWI
11411 if (pvt->mwisend_fsk) {
11416#ifdef HAVE_DAHDI_LINEREVERSE_VMWI
11424 struct timeval now;
11448#ifdef HAVE_DAHDI_LINEREVERSE_VMWI
11449 if (pvt->mwisend_fsk) {
11451 gettimeofday(&now,
NULL);
11455#ifdef HAVE_DAHDI_LINEREVERSE_VMWI
11463 if (0 < num_read) {
11516 case DAHDI_EVENT_RINGEROFF:
11533 case DAHDI_EVENT_RINGOFFHOOK:
11543 case DAHDI_EVENT_RINGERON:
11544 case DAHDI_EVENT_HOOKCOMPLETE:
11558 int destroyed_first = 0;
11559 int destroyed_last = 0;
11566 int x = DAHDI_FLASH;
11568 if (cur->
channel > destroyed_last) {
11569 destroyed_last = cur->
channel;
11571 if (destroyed_first < 1 || cur->
channel < destroyed_first) {
11572 destroyed_first = cur->
channel;
11583 if (destroyed_first > start || destroyed_last <
end) {
11584 ast_debug(1,
"Asked to destroy %d-%d, destroyed %d-%d,\n",
11585 start,
end, destroyed_first, destroyed_last);
11590static void dahdi_r2_destroy_nodev(
void)
11592 struct r2link_entry *cur;
11596 struct dahdi_mfcr2 *r2 = &cur->mfcr2;
11597 ast_debug(3,
"About to destroy %d DAHDI channels of MFC/R2 link.\n", r2->numchans);
11598 for (i = 0; i < r2->numchans; i++) {
11611 pthread_cancel(r2->r2master);
11612 pthread_join(r2->r2master,
NULL);
11614 openr2_context_delete(r2->protocol_context);
11644 ast_debug(1,
"channel range caps: %d - %d\n", start,
end);
11649 "channel range %d-%d is occupied\n",
11658 struct dahdi_pri *pri = pris + x;
11660 if (!pris[x].pri.pvts[0]) {
11664 int channo = pri->dchannels[i];
11669 if (!pri->pri.fds[i]) {
11672 if (channo >= start && channo <=
end) {
11674 "channel range %d-%d is occupied by span %d\n",
11675 start,
end, x + 1);
11683 !
conf.chan.cc_params) {
11688 conf.wanted_channels_start = start;
11691 conf.wanted_channels_end =
end;
11707 pthread_t threadid;
11710 int callid_created;
11715 case DAHDI_EVENT_NONE:
11716 case DAHDI_EVENT_BITSCHANGED:
11718 case DAHDI_EVENT_WINKFLASH:
11719 case DAHDI_EVENT_RINGOFFHOOK:
11721 if (i->
radio)
break;
11728 if (res && (
errno == EBUSY)) {
11742 res = tone_zone_play_tone(i->
subs[
SUB_REAL].
dfd, DAHDI_TONE_RINGTONE);
11746 res = tone_zone_play_tone(i->
subs[
SUB_REAL].
dfd, DAHDI_TONE_CONGESTION);
11755 res = tone_zone_play_tone(i->
subs[
SUB_REAL].
dfd, DAHDI_TONE_STUTTER);
11757 res = tone_zone_play_tone(i->
subs[
SUB_REAL].
dfd, DAHDI_TONE_DIALTONE);
11759 ast_log(
LOG_WARNING,
"Unable to play dialtone on channel %d, do you have defaultzone and loadzone defined?\n", i->
channel);
11762 res = tone_zone_play_tone(i->
subs[
SUB_REAL].
dfd, DAHDI_TONE_CONGESTION);
11805 res = tone_zone_play_tone(i->
subs[
SUB_REAL].
dfd, DAHDI_TONE_CONGESTION);
11816 res = tone_zone_play_tone(i->
subs[
SUB_REAL].
dfd, DAHDI_TONE_CONGESTION);
11822 case DAHDI_EVENT_NOALARM:
11824#if defined(HAVE_PRI)
11831#if defined(HAVE_SS7)
11842 case DAHDI_EVENT_ALARM:
11844#if defined(HAVE_PRI)
11851#if defined(HAVE_SS7)
11863 case DAHDI_EVENT_ONHOOK:
11909 case DAHDI_EVENT_POLARITY:
11923 ast_verb(2,
"Starting post polarity "
11924 "CID detection on channel %d\n",
11938 "polarity reversal on non-FXO (SIG_FXS) "
11939 "interface %d\n", i->
channel);
11942 case DAHDI_EVENT_REMOVED:
11944 "Got DAHDI_EVENT_REMOVED. Destroying channel %d\n",
11947 case DAHDI_EVENT_NEONMWI_ACTIVE:
11953 case DAHDI_EVENT_NEONMWI_INACTIVE:
11964 struct pollfd **pfds = arg;
11970 int count, res, res2, spoint, pollres=0;
11974 time_t thispass = 0, lastpass = 0;
11977 struct pollfd *pfds=
NULL;
11978 int lastalloc = -1;
11983 if (pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,
NULL)) {
11989 pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,
NULL);
11995 if (!pfds || (lastalloc !=
ifcount)) {
12022 pfds[count].events = POLLPRI;
12023 pfds[count].revents = 0;
12027 pfds[count].events |= POLLIN;
12035 pfds[count].events = POLLPRI;
12036 pfds[count].revents = 0;
12041 pfds[count].events |= POLLIN;
12052 pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,
NULL);
12053 pthread_testcancel();
12055 res = poll(pfds, count, 1000);
12056 pthread_testcancel();
12057 pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,
NULL);
12070 lastpass = thispass;
12071 thispass = time(
NULL);
12082 if (thispass != lastpass) {
12089 && !
last->mwisendactive
12090 && (
last->sig & __DAHDI_SIG_FXO)
12103 res2 = ioctl(
last->subs[
SUB_REAL].dfd, DAHDI_VMWI, &res);
12106 ast_debug(3,
"Unable to control message waiting led on channel %d: %s\n",
last->channel, strerror(
errno));
12109 ast_debug(5,
"Initiating MWI FSK spill on channel %d\n",
last->channel);
12139 if (pollres & POLLIN) {
12155 pthread_attr_t attr;
12156 pthread_t threadid;
12159 pthread_attr_init(&attr);
12160 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
12165 memcpy(mtd->
buf,
buf, res);
12178 struct timeval now;
12186 gettimeofday(&now,
NULL);
12193 pthread_t threadid;
12228 if (pollres & POLLPRI) {
12255 ast_debug(1,
"Woah! Went back on hook before reoriginate could happen on channel %d\n", i->
channel);
12258 res = DAHDI_EVENT_RINGOFFHOOK;
12273 dahdi_r2_destroy_nodev();
12277 pthread_cleanup_pop(1);
12308#if defined(HAVE_PRI)
12309static int pri_resolve_span(
int *
span,
int channel,
int offset,
struct dahdi_spaninfo *si)
12314 trunkgroup = pris[*
span].mastertrunkgroup;
12329 }
else if (pris[*
span].mastertrunkgroup) {
12330 ast_log(
LOG_WARNING,
"Unable to use span %d implicitly since it is already part of trunk group %d\n", *
span, pris[*
span].mastertrunkgroup);
12333 if (si->totalchans == 31) {
12335 pris[*
span].dchannels[0] = 16 + offset;
12336 }
else if (si->totalchans == 24) {
12338 pris[*
span].dchannels[0] = 24 + offset;
12339 }
else if (si->totalchans == 3) {
12341 pris[*
span].dchannels[0] = 3 + offset;
12343 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);
12354#if defined(HAVE_PRI)
12355static int pri_create_trunkgroup(
int trunkgroup,
int *
channels)
12357 struct dahdi_spaninfo si;
12358 struct dahdi_params p;
12365 ast_log(
LOG_WARNING,
"Trunk group %d already exists on span %d, Primary d-channel %d\n", trunkgroup, x + 1, pris[x].dchannels[0]);
12372 memset(&si, 0,
sizeof(si));
12373 memset(&p, 0,
sizeof(p));
12374 fd = open(
"/dev/dahdi/channel", O_RDWR);
12380 if (ioctl(fd, DAHDI_SPECIFY, &x)) {
12385 if (ioctl(fd, DAHDI_GET_PARAMS, &p)) {
12390 if (ioctl(fd, DAHDI_SPANSTAT, &si)) {
12395 span = p.spanno - 1;
12401 if (pris[span].pri.
pvts[0]) {
12402 ast_log(
LOG_WARNING,
"Span %d is already provisioned with channels (implicit PRI maybe?)\n", span + 1);
12407 pris[span].pri.trunkgroup = trunkgroup;
12410 pris[ospan].dchannels[y] =
channels[y];
12411 pris[span].pri.span = span + 1;
12418#if defined(HAVE_PRI)
12419static int pri_create_spanmap(
int span,
int trunkgroup,
int logicalspan)
12421 if (pris[span].mastertrunkgroup) {
12422 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);
12425 pris[span].mastertrunkgroup = trunkgroup;
12426 pris[span].prilogicalspan = logicalspan;
12431#if defined(HAVE_SS7)
12432static unsigned int parse_pointcode(
const char *pcstring)
12434 unsigned int code1, code2, code3;
12437 numvals = sscanf(pcstring,
"%30d-%30d-%30d", &code1, &code2, &code3);
12441 return (code1 << 16) | (code2 << 8) | code3;
12447#if defined(HAVE_SS7)
12448static struct dahdi_ss7 * ss7_resolve_linkset(
int linkset)
12450 if ((linkset < 0) || (linkset >=
NUM_SPANS))
12453 return &linksets[linkset - 1];
12458static void dahdi_r2_destroy_links(
void)
12460 struct r2link_entry *cur;
12465 ast_debug(3,
"MFC/R2 link #%d queued for destruction\n", cur->mfcr2.index);
12471 dahdi_r2_destroy_nodev();
12475#define R2_LINK_CAPACITY 30
12478 struct r2link_entry *cur =
NULL;
12486 if (memcmp(&
conf->mfcr2, &cur->mfcr2.conf,
sizeof(
conf->mfcr2))) {
12487 ast_debug(3,
"Need new R2 link because of: Configuration change\n");
12489 }
else if (cur->mfcr2.numchans == R2_LINK_CAPACITY) {
12490 ast_debug(3,
"Need new R2 link because of: Capacity (%d)\n", R2_LINK_CAPACITY);
12495 struct r2link_entry *tmp =
NULL;
12496 int new_idx = r2links_count + 1;
12498 for (i = 1; i <= r2links_count; i++) {
12501 if (i == tmp->mfcr2.index) {
12516 cur->mfcr2.index = new_idx;
12519 ast_debug(3,
"Created new R2 link #%d (now have %d)\n", new_idx, r2links_count);
12526static int dahdi_r2_set_context(
struct dahdi_mfcr2 *r2_link,
const struct dahdi_chan_conf *
conf)
12528 char tmplogdir[] =
"/tmp";
12529 char logdir[OR2_MAX_PATH];
12532 r2_link->protocol_context = openr2_context_new(
NULL, &dahdi_r2_event_iface,
12533 &dahdi_r2_transcode_iface,
conf->mfcr2.variant,
conf->mfcr2.max_ani,
12534 conf->mfcr2.max_dnis);
12535 if (!r2_link->protocol_context) {
12538 openr2_context_set_log_level(r2_link->protocol_context,
conf->mfcr2.loglevel);
12539 openr2_context_set_ani_first(r2_link->protocol_context,
conf->mfcr2.get_ani_first);
12540#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 1
12541 openr2_context_set_skip_category_request(r2_link->protocol_context,
conf->mfcr2.skip_category_request);
12543 openr2_context_set_mf_threshold(r2_link->protocol_context,
threshold);
12544 openr2_context_set_mf_back_timeout(r2_link->protocol_context,
conf->mfcr2.mfback_timeout);
12545 openr2_context_set_metering_pulse_timeout(r2_link->protocol_context,
conf->mfcr2.metering_pulse_timeout);
12546 openr2_context_set_double_answer(r2_link->protocol_context,
conf->mfcr2.double_answer);
12547 openr2_context_set_immediate_accept(r2_link->protocol_context,
conf->mfcr2.immediate_accept);
12548#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 2
12549 openr2_context_set_dtmf_dialing(r2_link->protocol_context,
conf->mfcr2.dtmf_dialing,
conf->mfcr2.dtmf_time_on,
conf->mfcr2.dtmf_time_off);
12550 openr2_context_set_dtmf_detection(r2_link->protocol_context,
conf->mfcr2.dtmf_detection);
12552#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 3
12553 openr2_context_set_dtmf_detection_end_timeout(r2_link->protocol_context,
conf->mfcr2.dtmf_end_timeout);
12556 if (openr2_context_set_log_directory(r2_link->protocol_context, tmplogdir)) {
12557 ast_log(
LOG_ERROR,
"Failed setting default MFC/R2 log directory %s\n", tmplogdir);
12561 if (snres >=
sizeof(logdir)) {
12562 ast_log(
LOG_ERROR,
"MFC/R2 logging directory truncated, using %s\n", tmplogdir);
12563 if (openr2_context_set_log_directory(r2_link->protocol_context, tmplogdir)) {
12564 ast_log(
LOG_ERROR,
"Failed setting default MFC/R2 log directory %s\n", tmplogdir);
12567 if (openr2_context_set_log_directory(r2_link->protocol_context, logdir)) {
12573 if (openr2_context_configure_from_advanced_file(r2_link->protocol_context,
conf->mfcr2.r2proto_file)) {
12574 ast_log(
LOG_ERROR,
"Failed to configure r2context from advanced configuration file %s\n",
conf->mfcr2.r2proto_file);
12578 memcpy(&r2_link->conf, &
conf->mfcr2,
sizeof(r2_link->conf));
12612 struct dahdi_bufferinfo bi;
12615#if defined(HAVE_PRI)
12621 struct dahdi_params p;
12622#if defined(HAVE_PRI)
12623 struct dahdi_spaninfo si;
12626#if defined(HAVE_SS7)
12646 if (!here && reloading != 1) {
12658 for (x = 0; x < 3; x++)
12665 int chan_sig =
conf->chan.sig;
12668 if (reloading && tmp->
vars) {
12678 snprintf(fn,
sizeof(fn),
"%d",
channel);
12693 memset(&p, 0,
sizeof(p));
12700 if (
conf->is_sig_auto)
12702 if (p.sigtype != (chan_sig & 0x3ffff)) {
12708 tmp->
law = p.curlaw;
12709 tmp->
span = p.spanno;
12710#if defined(HAVE_PRI)
12711 span = p.spanno - 1;
12716 tmp->
sig = chan_sig;
12727#if defined(HAVE_SS7)
12729 struct dahdi_ss7 *ss7;
12733 ast_log(
LOG_ERROR,
"Unable to set clear mode on clear channel %d of span %d: %s\n", channel, p.spanno, strerror(
errno));
12738 ss7 = ss7_resolve_linkset(cur_linkset);
12744 ss7->ss7.span = cur_linkset;
12745 if (cur_cicbeginswith < 0) {
12756 tmp->ss7 = &ss7->ss7;
12759 ss7_chan->
cic = cur_cicbeginswith++;
12762 ss7_chan->
dpc = cur_defaultdpc;
12764 ss7->ss7.pvts[ss7->ss7.numchans++] = ss7_chan;
12766 ast_copy_string(ss7->ss7.internationalprefix,
conf->ss7.ss7.internationalprefix,
sizeof(ss7->ss7.internationalprefix));
12767 ast_copy_string(ss7->ss7.nationalprefix,
conf->ss7.ss7.nationalprefix,
sizeof(ss7->ss7.nationalprefix));
12768 ast_copy_string(ss7->ss7.subscriberprefix,
conf->ss7.ss7.subscriberprefix,
sizeof(ss7->ss7.subscriberprefix));
12769 ast_copy_string(ss7->ss7.unknownprefix,
conf->ss7.ss7.unknownprefix,
sizeof(ss7->ss7.unknownprefix));
12770 ast_copy_string(ss7->ss7.networkroutedprefix,
conf->ss7.ss7.networkroutedprefix,
sizeof(ss7->ss7.networkroutedprefix));
12772 ss7->ss7.called_nai =
conf->ss7.ss7.called_nai;
12773 ss7->ss7.calling_nai =
conf->ss7.ss7.calling_nai;
12778 struct dahdi_mfcr2 *r2_link;
12779 struct r2link_entry *r2_le = dahdi_r2_get_link(
conf);
12780 r2_link = &r2_le->mfcr2;
12786 if (!r2_link->protocol_context && dahdi_r2_set_context(r2_link,
conf)) {
12791 if (r2_link->numchans ==
ARRAY_LEN(r2_link->pvts)) {
12796 r2_link->pvts[r2_link->numchans++] = tmp;
12797 tmp->r2chan = openr2_chan_new_from_fd(r2_link->protocol_context,
12800 if (!tmp->r2chan) {
12801 openr2_liberr_t err = openr2_context_get_last_error(r2_link->protocol_context);
12802 ast_log(
LOG_ERROR,
"Cannot create OpenR2 channel: %s\n", openr2_context_error_string(err));
12806 r2_link->live_chans++;
12807 tmp->mfcr2 = r2_link;
12808 if (
conf->mfcr2.call_files) {
12809 openr2_chan_enable_call_files(tmp->r2chan);
12811 openr2_chan_set_client_data(tmp->r2chan, tmp);
12813 openr2_chan_set_logging_func(tmp->r2chan, (openr2_logging_func_t)dahdi_r2_on_chan_log);
12814 openr2_chan_set_log_level(tmp->r2chan,
conf->mfcr2.loglevel);
12815 tmp->mfcr2_category =
conf->mfcr2.category;
12816 tmp->mfcr2_charge_calls =
conf->mfcr2.charge_calls;
12817 tmp->mfcr2_allow_collect_calls =
conf->mfcr2.allow_collect_calls;
12818 tmp->mfcr2_forced_release =
conf->mfcr2.forced_release;
12819 tmp->mfcr2_accept_on_offer =
conf->mfcr2.accept_on_offer;
12820 tmp->mfcr2call = 0;
12821 tmp->mfcr2_dnis_index = 0;
12822 tmp->mfcr2_ani_index = 0;
12830 int myswitchtype = 0;
12834 ast_log(
LOG_ERROR,
"Unable to set clear mode on clear channel %d of span %d: %s\n", channel, p.spanno, strerror(
errno));
12839 ast_log(
LOG_ERROR,
"Channel %d does not lie on a span I know of (%d)\n", channel, span);
12850 tmp->logicalspan = pris[span].prilogicalspan;
12851 pri_resolve_span(&span, channel, (channel - p.chanpos), &si);
12853 ast_log(
LOG_WARNING,
"Channel %d: Unable to find locate channel/trunk group!\n", channel);
12857 myswitchtype =
conf->pri.pri.switchtype;
12862 if (pris[x].dchannels[y] == tmp->
channel) {
12868 if (!matchesdchan) {
12869 if (pris[span].pri.
nodetype && (pris[span].pri.nodetype !=
conf->pri.pri.nodetype)) {
12874 if (pris[span].pri.
switchtype && (pris[span].pri.switchtype != myswitchtype)) {
12879 if ((pris[span].pri.
dialplan) && (pris[span].pri.dialplan !=
conf->pri.pri.dialplan)) {
12880 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));
12894 if (pris[span].pri.
minunused && (pris[span].pri.minunused !=
conf->pri.pri.minunused)) {
12895 ast_log(
LOG_ERROR,
"Span %d already has minunused of %d.\n", span + 1,
conf->pri.pri.minunused);
12899 if (pris[span].pri.
minidle && (pris[span].pri.minidle !=
conf->pri.pri.minidle)) {
12905 ast_log(
LOG_ERROR,
"Unable to add channel %d: Too many channels in trunk group %d!\n", channel,
12911 pri_chan =
sig_pri_chan_new(tmp, &pris[span].pri, tmp->logicalspan, p.chanpos, pris[span].mastertrunkgroup);
12917 tmp->pri = &pris[span].pri;
12929 conf->chan.cc_params);
12931 pris[span].pri.sig = chan_sig;
12932 pris[span].pri.nodetype =
conf->pri.pri.nodetype;
12933 pris[span].pri.switchtype = myswitchtype;
12934 pris[span].pri.nsf =
conf->pri.pri.nsf;
12935 pris[span].pri.dialplan =
conf->pri.pri.dialplan;
12936 pris[span].pri.localdialplan =
conf->pri.pri.localdialplan;
12937 pris[span].pri.cpndialplan =
conf->pri.pri.cpndialplan;
12938 pris[span].pri.pvts[pris[span].pri.numchans++] = tmp->
sig_pvt;
12939 pris[span].pri.minunused =
conf->pri.pri.minunused;
12940 pris[span].pri.minidle =
conf->pri.pri.minidle;
12941 pris[span].pri.overlapdial =
conf->pri.pri.overlapdial;
12942 pris[span].pri.qsigchannelmapping =
conf->pri.pri.qsigchannelmapping;
12943 pris[span].pri.discardremoteholdretrieval =
conf->pri.pri.discardremoteholdretrieval;
12944#if defined(HAVE_PRI_SERVICE_MESSAGES)
12945 pris[span].pri.enable_service_message_support =
conf->pri.pri.enable_service_message_support;
12947#ifdef HAVE_PRI_INBANDDISCONNECT
12948 pris[span].pri.inbanddisconnect =
conf->pri.pri.inbanddisconnect;
12950#if defined(HAVE_PRI_CALL_HOLD)
12951 pris[span].pri.hold_disconnect_transfer =
12952 conf->pri.pri.hold_disconnect_transfer;
12954#if defined(HAVE_PRI_CCSS)
12955 pris[span].pri.cc_ptmp_recall_mode =
12956 conf->pri.pri.cc_ptmp_recall_mode;
12957 pris[span].pri.cc_qsig_signaling_link_req =
12958 conf->pri.pri.cc_qsig_signaling_link_req;
12959 pris[span].pri.cc_qsig_signaling_link_rsp =
12960 conf->pri.pri.cc_qsig_signaling_link_rsp;
12962#if defined(HAVE_PRI_CALL_WAITING)
12963 pris[span].pri.max_call_waiting_calls =
12964 conf->pri.pri.max_call_waiting_calls;
12965 pris[span].pri.allow_call_waiting_calls =
12966 conf->pri.pri.allow_call_waiting_calls;
12968 pris[span].pri.transfer =
conf->chan.transfer;
12969 pris[span].pri.facilityenable =
conf->pri.pri.facilityenable;
12970#if defined(HAVE_PRI_L2_PERSISTENCE)
12971 pris[span].pri.l2_persistence =
conf->pri.pri.l2_persistence;
12973 pris[span].pri.colp_send =
conf->pri.pri.colp_send;
12974#if defined(HAVE_PRI_AOC_EVENTS)
12975 pris[span].pri.aoc_passthrough_flag =
conf->pri.pri.aoc_passthrough_flag;
12976 pris[span].pri.aoce_delayhangup =
conf->pri.pri.aoce_delayhangup;
12979 pris[span].pri.layer1_ignored =
conf->pri.pri.layer1_ignored;
12982 pris[span].pri.layer1_ignored = 0;
12984 pris[span].pri.append_msn_to_user_tag =
conf->pri.pri.append_msn_to_user_tag;
12985 pris[span].pri.inband_on_setup_ack =
conf->pri.pri.inband_on_setup_ack;
12986 pris[span].pri.inband_on_proceeding =
conf->pri.pri.inband_on_proceeding;
12987 ast_copy_string(pris[span].pri.initial_user_tag,
conf->chan.cid_tag,
sizeof(pris[span].pri.initial_user_tag));
12988 ast_copy_string(pris[span].pri.msn_list,
conf->pri.pri.msn_list,
sizeof(pris[span].pri.msn_list));
12989#if defined(HAVE_PRI_MWI)
12991 conf->pri.pri.mwi_mailboxes,
12992 sizeof(pris[span].pri.mwi_mailboxes));
12994 conf->pri.pri.mwi_vm_boxes,
12995 sizeof(pris[span].pri.mwi_vm_boxes));
12997 conf->pri.pri.mwi_vm_numbers,
12998 sizeof(pris[span].pri.mwi_vm_numbers));
13000 ast_copy_string(pris[span].pri.idledial,
conf->pri.pri.idledial,
sizeof(pris[span].pri.idledial));
13001 ast_copy_string(pris[span].pri.idleext,
conf->pri.pri.idleext,
sizeof(pris[span].pri.idleext));
13002 ast_copy_string(pris[span].pri.internationalprefix,
conf->pri.pri.internationalprefix,
sizeof(pris[span].pri.internationalprefix));
13003 ast_copy_string(pris[span].pri.nationalprefix,
conf->pri.pri.nationalprefix,
sizeof(pris[span].pri.nationalprefix));
13004 ast_copy_string(pris[span].pri.localprefix,
conf->pri.pri.localprefix,
sizeof(pris[span].pri.localprefix));
13005 ast_copy_string(pris[span].pri.privateprefix,
conf->pri.pri.privateprefix,
sizeof(pris[span].pri.privateprefix));
13006 ast_copy_string(pris[span].pri.unknownprefix,
conf->pri.pri.unknownprefix,
sizeof(pris[span].pri.unknownprefix));
13007 pris[span].pri.moh_signaling =
conf->pri.pri.moh_signaling;
13008 pris[span].pri.resetinterval =
conf->pri.pri.resetinterval;
13009#if defined(HAVE_PRI_DISPLAY_TEXT)
13010 pris[span].pri.display_flags_send =
conf->pri.pri.display_flags_send;
13011 pris[span].pri.display_flags_receive =
conf->pri.pri.display_flags_receive;
13013#if defined(HAVE_PRI_MCID)
13014 pris[span].pri.mcid_send =
conf->pri.pri.mcid_send;
13016 pris[span].pri.force_restart_unavailable_chans =
conf->pri.pri.force_restart_unavailable_chans;
13017#if defined(HAVE_PRI_DATETIME_SEND)
13018 pris[span].pri.datetime_send =
conf->pri.pri.datetime_send;
13021 for (x = 0; x < PRI_MAX_TIMERS; x++) {
13022 pris[span].pri.pritimers[x] =
conf->pri.pri.pritimers[x];
13025#if defined(HAVE_PRI_CALL_WAITING)
13027 pris[span].pri.ch_cfg.stripmsd =
conf->chan.stripmsd;
13028 pris[span].pri.ch_cfg.hidecallerid =
conf->chan.hidecallerid;
13029 pris[span].pri.ch_cfg.hidecalleridname =
conf->chan.hidecalleridname;
13030 pris[span].pri.ch_cfg.immediate =
conf->chan.immediate;
13031 pris[span].pri.ch_cfg.priexclusive =
conf->chan.priexclusive;
13032 pris[span].pri.ch_cfg.priindication_oob =
conf->chan.priindication_oob;
13033 pris[span].pri.ch_cfg.use_callerid =
conf->chan.use_callerid;
13034 pris[span].pri.ch_cfg.use_callingpres =
conf->chan.use_callingpres;
13035 ast_copy_string(pris[span].pri.ch_cfg.context,
conf->chan.context,
sizeof(pris[span].pri.ch_cfg.context));
13036 ast_copy_string(pris[span].pri.ch_cfg.mohinterpret,
conf->chan.mohinterpret,
sizeof(pris[span].pri.ch_cfg.mohinterpret));
13049 chan_sig = tmp->
sig;
13051 memset(&p, 0,
sizeof(p));
13056 switch (chan_sig) {
13080 p.channo = channel;
13084 p.debouncetime = 5;
13086 p.channo = channel;
13088 if (
conf->timing.prewinktime >= 0)
13089 p.prewinktime =
conf->timing.prewinktime;
13090 if (
conf->timing.preflashtime >= 0)
13091 p.preflashtime =
conf->timing.preflashtime;
13092 if (
conf->timing.winktime >= 0)
13093 p.winktime =
conf->timing.winktime;
13094 if (
conf->timing.flashtime >= 0)
13095 p.flashtime =
conf->timing.flashtime;
13096 if (
conf->timing.starttime >= 0)
13097 p.starttime =
conf->timing.starttime;
13098 if (
conf->timing.rxwinktime >= 0)
13099 p.rxwinktime =
conf->timing.rxwinktime;
13100 if (
conf->timing.rxflashtime >= 0)
13101 p.rxflashtime =
conf->timing.rxflashtime;
13102 if (
conf->timing.debouncetime >= 0)
13103 p.debouncetime =
conf->timing.debouncetime;
13118 memset(&bi, 0,
sizeof(bi));
13121 bi.txbufpolicy =
conf->chan.buf_policy;
13122 bi.rxbufpolicy =
conf->chan.buf_policy;
13123 bi.numbufs =
conf->chan.buf_no;
13147 if (chan_sig & __DAHDI_SIG_FXS) {
13188 if (
conf->chan.echocanbridged)
13189 ast_log(
LOG_NOTICE,
"echocancelwhenbridged requires echocancel to be enabled; ignoring\n");
13230 ast_log(
LOG_ERROR,
"Invalid SMDI port specified, disabling SMDI support\n");
13258#if defined(HAVE_PRI)
13275#ifdef HAVE_DAHDI_LINEREVERSE_VMWI
13276 tmp->mwisend_setting =
conf->chan.mwisend_setting;
13277 tmp->mwisend_fsk =
conf->chan.mwisend_fsk;
13278 tmp->mwisend_rpas =
conf->chan.mwisend_rpas;
13288 if (
conf->chan.vars) {
13290 for (v =
conf->chan.vars ; v ; v = v->
next) {
13294 tmp->
vars = tmpvar;
13321 switch (chan_sig) {
13333 if ((res =
get_alarms(tmp)) != DAHDI_ALARM_NONE) {
13335 switch (tmp->
sig) {
13341#if defined(HAVE_SS7)
13372 switch (tmp->
sig) {
13373#if defined(HAVE_PRI)
13376#if defined(HAVE_PRI_SERVICE_MESSAGES)
13379 char db_chan_name[20];
13386 snprintf(db_chan_name,
sizeof(db_chan_name),
"%s/%d:%d", dahdi_db, tmp->
span, tmp->
channel);
13387 if (!
ast_db_get(db_chan_name, SRVST_DBKEY, db_answer,
sizeof(db_answer))) {
13391 if (tmp->pri->enable_service_message_support) {
13394 sscanf(db_answer,
"%1c:%30u", &
state, why);
13397 *why &= (SRVST_NEAREND | SRVST_FAREND);
13407#if defined(HAVE_SS7)
13422 switch (tmp->
sig) {
13423#if defined(HAVE_PRI)
13443#if defined(HAVE_SS7)
13498 switch (
conf->chan.cid_start) {
13517 if (chan_sig & __DAHDI_SIG_FXO) {
13518 memset(&p, 0,
sizeof(p));
13523#ifdef HAVE_DAHDI_LINEREVERSE_VMWI
13524 res = ioctl(tmp->
subs[
SUB_REAL].
dfd, DAHDI_VMWI_CONFIG, &tmp->mwisend_setting);
13537#if defined(HAVE_PRI)
13543 dahdi_pseudo_parms.buf_no = tmp->
buf_no;
13544 dahdi_pseudo_parms.buf_policy = tmp->
buf_policy;
13545 dahdi_pseudo_parms.faxbuf_no = tmp->
faxbuf_no;
13550 if (tmp && !here) {
13559#if defined(HAVE_PRI)
13562 if (!p->pri || p->pri->
span != span) {
13565 if (!groupmatch && channelmatch == -1) {
13574 if ((p->
group & groupmatch) != groupmatch)
13580 if (channelmatch != -1) {
13581 if (p->
channel != channelmatch)
13584 *channelmatched = 1;
13601#if defined(HAVE_PRI)
13613#if defined(HAVE_SS7)
13630 if (p->mfcr2call) {
13643#if defined(HAVE_PRI)
13644#if defined(HAVE_PRI_CALL_WAITING)
13659 pvt->
stripmsd = pri->ch_cfg.stripmsd;
13662 pvt->
immediate = pri->ch_cfg.immediate;
13673#if defined(HAVE_PRI)
13686static int dahdi_new_pri_nobch_channel(
struct sig_pri_span *pri)
13693 struct dahdi_bufferinfo bi;
13698 for (pvt_idx = 0; pvt_idx < pri->
numchans; ++pvt_idx) {
13699 if (!pri->
pvts[pvt_idx]) {
13727 pvt->
buf_no = dahdi_pseudo_parms.buf_no;
13728 pvt->
buf_policy = dahdi_pseudo_parms.buf_policy;
13729 pvt->
faxbuf_no = dahdi_pseudo_parms.faxbuf_no;
13750 pri->
pvts[pvt_idx] = chan;
13754 ast_log(
LOG_ERROR,
"Unable to open no B channel interface pseudo channel: %s\n",
13759 memset(&bi, 0,
sizeof(bi));
13765 bi.numbufs = pvt->
buf_no;
13769 "Unable to set buffer policy on no B channel interface: %s\n",
13774 "Unable to check buffer policy on no B channel interface: %s\n",
13781 pvt->
channel = nobch_channel;
13785 dahdi_nobch_insert(pri, pvt);
13799 struct dahdi_bufferinfo bi;
13830 bi.numbufs = src->
buf_no;
13867 char *subdir =
NULL;
13911 memset(param, 0,
sizeof(*param));
13914 if (strchr(
args.group,
'!') !=
NULL) {
13916 while ((s = strchr(
prev,
'!')) !=
NULL) {
13920 *(
prev - 1) =
'\0';
13921 subdir =
args.group;
13923 }
else if (
args.group[0] ==
'i') {
13925 res = sscanf(
args.group + 1,
"%30d", &x);
13933 s = strchr(
args.group,
'-');
13938 args.group = s + 1;
13941 if (toupper(
args.group[0]) ==
'G' || toupper(
args.group[0])==
'R') {
13943 s =
args.group + 1;
13944 res = sscanf(s,
"%30d%1c%30d", &x, ¶m->
opt, ¶m->
cadence);
13951 if (toupper(
args.group[0]) ==
'G') {
13952 if (
args.group[0] ==
'G') {
13963 if (
args.group[0] ==
'R') {
13978 if (!strcasecmp(s,
"pseudo")) {
13983 res = sscanf(s,
"%30d%1c%30d", &x, ¶m->
opt, ¶m->
cadence);
13995 snprintf(path,
sizeof(path),
"/dev/dahdi/%s/%d",
13997 if (stat(path, &stbuf) < 0) {
13999 path, strerror(
errno));
14002 if (!S_ISCHR(stbuf.st_mode)) {
14013 if (param->
opt ==
'r' && res < 3) {
14023 const char *
data,
int *cause)
14029 int channelmatched = 0;
14030 int foundowner = 0;
14031 int groupmatched = 0;
14032#if defined(HAVE_PRI) || defined(HAVE_SS7)
14033 int transcapdigital = 0;
14050 while (p && !tmp) {
14066 if (p->mfcr2call) {
14068 ast_debug(1,
"Yay!, someone just beat us in the race for channel %d.\n", p->
channel);
14084 switch (start.
opt) {
14097#if defined(HAVE_PRI) || defined(HAVE_SS7)
14124#if defined(HAVE_SS7)
14133#if defined(HAVE_PRI)
14136#if defined(HAVE_PRI_CALL_WAITING)
14175 if (cause && !tmp) {
14176 if (callwait || (channelmatched && foundowner)) {
14178 }
else if (groupmatched) {
14204#if defined(HAVE_PRI)
14205 const char *device;
14211 if (*device !=
'I') {
14215 res = sscanf(device,
"I%30u", &span);
14216 if (res != 1 || !span ||
NUM_SPANS < span) {
14220 device = strchr(device,
'/');
14230#if defined(THRESHOLD_DEVSTATE_PLACEHOLDER)
14232 if (!strcmp(device,
"congestion"))
14235 return pris[span - 1].pri.congestion_devstate;
14237#if defined(THRESHOLD_DEVSTATE_PLACEHOLDER)
14238 else if (!strcmp(device,
"threshold")) {
14239 return pris[span - 1].pri.threshold_devstate;
14269 int groupmatched = 0;
14270 int channelmatched = 0;
14284 const char *monitor_type;
14294#if defined(HAVE_PRI)
14300 snprintf(full_device_name,
sizeof(full_device_name),
14301 "DAHDI/I%d/congestion", p->pri->
span);
14305#if defined(HAVE_PRI)
14310 snprintf(full_device_name,
sizeof(full_device_name),
"DAHDI/%s",
14318 dash = strrchr(full_device_name,
'-');
14323 snprintf(dialstring,
sizeof(dialstring),
"DAHDI/%s", dest);
14333#
if defined(HAVE_PRI)
14338 monitor_type, full_device_name, dialstring,
NULL);
14346 if (p == exitpvt) {
14354#if defined(HAVE_SS7)
14355static void dahdi_ss7_message(
struct ss7 *ss7,
char *s)
14361 if (linksets[i].ss7.ss7 == ss7) {
14371#if defined(HAVE_SS7)
14372static void dahdi_ss7_error(
struct ss7 *ss7,
char *s)
14378 if (linksets[i].ss7.ss7 == ss7) {
14388#if defined(HAVE_OPENR2)
14389static void *mfcr2_monitor(
void *data)
14391 struct dahdi_mfcr2 *mfcr2 = data;
14409 for (i = 0; i < mfcr2->numchans; i++) {
14410 pvt = mfcr2->pvts[i];
14414 openr2_chan_set_idle(pvt->r2chan);
14415 openr2_chan_handle_cas(pvt->r2chan);
14421 for (i = 0; i < mfcr2->numchans; i++) {
14422 pollers[i].revents = 0;
14423 pollers[i].events = 0;
14424 pvt = mfcr2->pvts[i];
14431 if (mfcr2->nodev) {
14434 if (!pvt->r2chan) {
14439 openr2_chan_enable_read(pvt->r2chan);
14440 pollers[i].events = POLLIN | POLLPRI;
14447 if (pollsize == 0) {
14449 ast_debug(1,
"Monitor thread going idle since everybody has an owner\n");
14452 poll(
NULL, 0, maxsleep);
14458 pthread_testcancel();
14459 res = poll(pollers, mfcr2->numchans, maxsleep);
14460 pthread_testcancel();
14461 if ((res < 0) && (
errno != EINTR)) {
14466 pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate);
14467 for (i = 0; i < mfcr2->numchans; i++) {
14468 pvt = mfcr2->pvts[i];
14472 if (pollers[i].revents & POLLPRI || pollers[i].revents & POLLIN) {
14473 openr2_chan_process_event(pvt->r2chan);
14476 pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &oldstate);
14483#if defined(HAVE_PRI)
14484static void dahdi_pri_message(
struct pri *pri,
char *s)
14490 int dchancount = 0;
14495 if (pris[x].pri.dchans[y]) {
14499 if (pris[x].pri.dchans[y] == pri) {
14510 if (1 < dchancount) {
14524 if (pridebugfd >= 0) {
14525 if (write(pridebugfd, s, strlen(s)) < 0) {
14534#if defined(HAVE_PRI)
14535static void dahdi_pri_error(
struct pri *pri,
char *s)
14541 int dchancount = 0;
14546 if (pris[x].pri.dchans[y]) {
14550 if (pris[x].pri.dchans[y] == pri) {
14561 if (1 < dchancount) {
14575 if (pridebugfd >= 0) {
14576 if (write(pridebugfd, s, strlen(s)) < 0) {
14585#if defined(HAVE_PRI)
14586static int prepare_pri(
struct dahdi_pri *pri)
14589 struct dahdi_params p;
14590 struct dahdi_bufferinfo bi;
14591 struct dahdi_spaninfo si;
14594 if (!pri->dchannels[i])
14596 if (pri->pri.fds[i] >= 0) {
14600 pri->pri.fds[i] = open(
"/dev/dahdi/channel", O_RDWR);
14601 if ((pri->pri.fds[i] < 0)) {
14603 pri->pri.fds[i], strerror(
errno));
14606 x = pri->dchannels[i];
14607 res = ioctl(pri->pri.fds[i], DAHDI_SPECIFY, &x);
14609 dahdi_close_pri_fd(pri, i);
14613 memset(&p, 0,
sizeof(p));
14614 res = ioctl(pri->pri.fds[i], DAHDI_GET_PARAMS, &p);
14616 dahdi_close_pri_fd(pri, i);
14620 if ((p.sigtype != DAHDI_SIG_HDLCFCS) && (p.sigtype != DAHDI_SIG_HARDHDLC)) {
14621 dahdi_close_pri_fd(pri, i);
14625 memset(&si, 0,
sizeof(si));
14626 res = ioctl(pri->pri.fds[i], DAHDI_SPANSTAT, &si);
14628 dahdi_close_pri_fd(pri, i);
14636 memset(&bi, 0,
sizeof(bi));
14637 bi.txbufpolicy = DAHDI_POLICY_IMMEDIATE;
14638 bi.rxbufpolicy = DAHDI_POLICY_IMMEDIATE;
14641 if (ioctl(pri->pri.fds[i], DAHDI_SET_BUFINFO, &bi)) {
14643 dahdi_close_pri_fd(pri, i);
14646 pri->pri.dchan_logical_span[i] = pris[p.spanno - 1].prilogicalspan;
14652#if defined(HAVE_PRI)
14653static char *complete_span_helper(
const char *line,
const char *
word,
int pos,
int state,
int rpos)
14661 for (which = span = 0; span <
NUM_SPANS; span++) {
14662 if (pris[span].pri.pri && ++which >
state) {
14673#if defined(HAVE_PRI)
14674static char *complete_span_4(
const char *line,
const char *
word,
int pos,
int state)
14676 return complete_span_helper(line,
word,pos,
state,3);
14680#if defined(HAVE_PRI)
14686 e->
command =
"pri set debug file";
14687 e->
usage =
"Usage: pri set debug file [output-file]\n"
14688 " Sends PRI debug output to the specified output file\n";
14701 ast_cli(
a->fd,
"Unable to open '%s' for writing\n",
a->argv[4]);
14707 if (pridebugfd >= 0)
14713 ast_cli(
a->fd,
"PRI debug output will be sent to '%s'\n",
a->argv[4]);
14718#if defined(HAVE_PRI)
14719static int action_pri_debug_file_set(
struct mansession *s,
const struct message *m)
14736 if (pridebugfd >= 0) {
14741 ast_copy_string(pridebugfilename, output_file,
sizeof(pridebugfilename));
14743 astman_send_ack(s, m,
"PRI debug output will now be sent to requested file.");
14749#if defined(HAVE_PRI)
14750static int action_pri_debug_file_unset(
struct mansession *s,
const struct message *m)
14754 if (pridebugfd >= 0) {
14767#if defined(HAVE_PRI)
14776 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";
14778 "Usage: pri set debug {<level>|on|off|hex|intense} span <span>\n"
14779 " Enables debugging on a given PRI span\n"
14780 " Level is a bitmap of the following values:\n"
14781 " 1 General debugging incl. state changes\n"
14782 " 2 Decoded Q.931 messages\n"
14783 " 4 Decoded Q.921 messages\n"
14784 " 8 Raw hex dumps of Q.921 frames\n"
14785 " on - equivalent to 3\n"
14786 " hex - equivalent to 8\n"
14787 " intense - equivalent to 15\n";
14790 return complete_span_4(
a->line,
a->word,
a->pos,
a->n);
14796 if (!strcasecmp(
a->argv[3],
"on")) {
14798 }
else if (!strcasecmp(
a->argv[3],
"off")) {
14800 }
else if (!strcasecmp(
a->argv[3],
"intense")) {
14802 }
else if (!strcasecmp(
a->argv[3],
"hex")) {
14805 level = atoi(
a->argv[3]);
14807 span = atoi(
a->argv[5]);
14808 if ((span < 1) || (span >
NUM_SPANS)) {
14809 ast_cli(
a->fd,
"Invalid span %s. Should be a number %d to %d\n",
a->argv[5], 1,
NUM_SPANS);
14812 if (!pris[span-1].pri.pri) {
14813 ast_cli(
a->fd,
"No PRI running on span %d\n", span);
14818 if (level & 2) debugmask |= PRI_DEBUG_Q931_DUMP;
14819 if (level & 4) debugmask |= PRI_DEBUG_Q921_DUMP;
14820 if (level & 8) debugmask |= PRI_DEBUG_Q921_RAW;
14824 if (pris[span - 1].pri.dchans[x]) {
14825 pri_set_debug(pris[span - 1].pri.dchans[x], debugmask);
14831 if (0 <= pridebugfd) {
14834 ast_cli(
a->fd,
"Disabled PRI debug output to file '%s'\n",
14839 pris[span - 1].pri.debug = (level) ? 1 : 0;
14840 ast_cli(
a->fd,
"%s debugging on span %d\n", (level) ?
"Enabled" :
"Disabled", span);
14845#if defined(HAVE_PRI)
14865 if (!strcasecmp(level,
"on")) {
14867 }
else if (!strcasecmp(level,
"off")) {
14869 }
else if (!strcasecmp(level,
"intense")) {
14871 }
else if (!strcasecmp(level,
"hex")) {
14874 if (sscanf(level,
"%30d", &level_val) != 1) {
14880 if (sscanf(span,
"%30d", &span_val) != 1) {
14884 if ((span_val < 1) || (span_val >
NUM_SPANS)) {
14886 char id_text[256] =
"";
14889 snprintf(id_text,
sizeof(id_text),
"ActionID: %s\r\n",
id);
14894 "Message: Invalid span '%s' - Should be a number from 1 to %d\r\n"
14902 if (!pris[span_val-1].pri.pri) {
14907 if (level_val & 1) {
14910 if (level_val & 2) {
14911 debugmask |= PRI_DEBUG_Q931_DUMP;
14913 if (level_val & 4) {
14914 debugmask |= PRI_DEBUG_Q921_DUMP;
14916 if (level_val & 8) {
14917 debugmask |= PRI_DEBUG_Q921_RAW;
14922 if (pris[span_val - 1].pri.dchans[x]) {
14923 pri_set_debug(pris[span_val - 1].pri.dchans[x], debugmask);
14927 pris[span_val - 1].pri.debug = (level_val) ? 1 : 0;
14934#if defined(HAVE_PRI)
14935#if defined(HAVE_PRI_SERVICE_MESSAGES)
14941 int x, y, fd =
a->fd;
14942 int interfaceid = 0;
14943 char db_chan_name[20], db_answer[15];
14945 struct dahdi_pri *pri;
14947 if (
a->argc < 5 ||
a->argc > 6)
14949 if (strchr(
a->argv[4],
':')) {
14950 if (sscanf(
a->argv[4],
"%30d:%30d", &trunkgroup, &channel) != 2)
14952 if ((trunkgroup < 1) || (channel < 1))
14956 if (pris[x].pri.trunkgroup == trunkgroup) {
14962 ast_cli(fd,
"No such trunk group %d\n", trunkgroup);
14966 channel = atoi(
a->argv[4]);
14969 interfaceid = atoi(
a->argv[5]);
14974 if (pris[x].dchannels[y] == channel) {
14976 if (pri->pri.enable_service_message_support) {
14978 pri_maintenance_service(pri->pri.pri, interfaceid, -1, changestatus);
14982 "\n\tThis operation has not been enabled in chan_dahdi.conf, set 'service_message_support=yes' to use this operation.\n"
14983 "\tNote only 4ESS, 5ESS, and NI2 switch types are supported.\n\n");
14993 if (tmp->pri && tmp->
channel == channel) {
14996 if (!tmp->pri->enable_service_message_support) {
14999 "\n\tThis operation has not been enabled in chan_dahdi.conf, set 'service_message_support=yes' to use this operation.\n"
15000 "\tNote only 4ESS, 5ESS, and NI2 switch types are supported.\n\n");
15003 snprintf(db_chan_name,
sizeof(db_chan_name),
"%s/%d:%d", dahdi_db, tmp->
span, channel);
15005 switch(changestatus) {
15009 *why &= ~SRVST_NEAREND;
15011 snprintf(db_answer,
sizeof(db_answer),
"%s:%u", SRVST_TYPE_OOS, *why);
15012 ast_db_put(db_chan_name, SRVST_DBKEY, db_answer);
15014 dahdi_pri_update_span_devstate(tmp->pri);
15021 *why |= SRVST_NEAREND;
15022 snprintf(db_answer,
sizeof(db_answer),
"%s:%u", SRVST_TYPE_OOS, *why);
15023 ast_db_put(db_chan_name, SRVST_DBKEY, db_answer);
15024 dahdi_pri_update_span_devstate(tmp->pri);
15032 pri_maintenance_bservice(tmp->pri->pri, tmp->
sig_pvt, changestatus);
15039 ast_cli(fd,
"Unable to find given channel %d, possibly not a PRI\n",
channel);
15047 e->
command =
"pri service enable channel";
15049 "Usage: pri service enable channel <channel> [<interface id>]\n"
15050 " Send an AT&T / NFAS / CCS ANSI T1.607 maintenance message\n"
15051 " to restore a channel to service, with optional interface id\n"
15052 " as agreed upon with remote switch operator\n";
15057 return handle_pri_service_generic(e, cmd,
a, 0);
15064 e->
command =
"pri service disable channel";
15066 "Usage: pri service disable channel <chan num> [<interface id>]\n"
15067 " Send an AT&T / NFAS / CCS ANSI T1.607 maintenance message\n"
15068 " to remove a channel from service, with optional interface id\n"
15069 " as agreed upon with remote switch operator\n";
15074 return handle_pri_service_generic(e, cmd,
a, 2);
15079#if defined(HAVE_PRI)
15086 e->
command =
"pri show channels";
15088 "Usage: pri show channels\n"
15089 " Displays PRI channel information such as the current mapping\n"
15090 " of DAHDI B channels to Asterisk channel names and which calls\n"
15091 " are on hold or call-waiting. Calls on hold or call-waiting\n"
15092 " are not associated with any B channel.\n";
15102 for (span = 0; span <
NUM_SPANS; ++span) {
15103 if (pris[span].
pri.
pri) {
15111#if defined(HAVE_PRI)
15118 e->
command =
"pri show spans";
15120 "Usage: pri show spans\n"
15121 " Displays PRI span information\n";
15130 for (span = 0; span <
NUM_SPANS; span++) {
15131 if (pris[span].
pri.
pri) {
15139#if defined(HAVE_PRI)
15140#define container_of(ptr, type, member) \
15141 ((type *)((char *)(ptr) - offsetof(type, member)))
15158 struct dahdi_pri* dahdi_pri;
15159 pthread_t master = pri->
master;
15164 ast_debug(2,
"About to destroy DAHDI channels of span %d.\n", pri->
span);
15165 for (i = 0; i < pri->
numchans; i++) {
15177 cancel_code = pthread_cancel(master);
15178 pthread_kill(master, SIGURG);
15180 "Waiting to join thread of span %d "
15181 "with pid=%p cancel_code=%d\n",
15182 pri->
span, (
void *)master, cancel_code);
15183 res = pthread_join(master,
NULL);
15192 ast_debug(4,
"closing pri_fd %d\n", i);
15193 dahdi_close_pri_fd(dahdi_pri, i);
15194 dahdi_pri->dchannels[i] = 0;
15200static char *handle_pri_destroy_span(
struct ast_cli_entry *e,
int cmd,
15209 e->
command =
"pri destroy span";
15211 "Usage: pri destroy span <span>\n"
15212 " Destroys D-channel of span and its B-channels.\n"
15213 " DON'T USE THIS UNLESS YOU KNOW WHAT YOU ARE DOING.\n";
15216 return complete_span_4(
a->line,
a->word,
a->pos,
a->n);
15222 res = sscanf(
a->argv[3],
"%30d", &
span);
15223 if ((res != 1) || span < 1 || span >
NUM_SPANS) {
15225 "Invalid span '%s'. Should be a number from %d to %d\n",
15235 pri_destroy_span(
pri);
15241#if defined(HAVE_PRI)
15248 e->
command =
"pri show span";
15250 "Usage: pri show span <span>\n"
15251 " Displays PRI Information on a given PRI span\n";
15254 return complete_span_4(
a->line,
a->word,
a->pos,
a->n);
15259 span = atoi(
a->argv[3]);
15261 ast_cli(
a->fd,
"Invalid span '%s'. Should be a number from %d to %d\n",
a->argv[3], 1,
NUM_SPANS);
15275#if defined(HAVE_PRI)
15285 e->
command =
"pri show debug";
15287 "Usage: pri show debug\n"
15288 " Show the debug state of pri spans\n";
15297 if (pris[
span].
pri.dchans[x]) {
15299 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" );
15307 if (pridebugfd >= 0)
15308 ast_cli(
a->fd,
"Logging PRI debug to file %s\n", pridebugfilename);
15312 ast_cli(
a->fd,
"No PRI running\n");
15317#if defined(HAVE_PRI)
15322 e->
command =
"pri show version";
15324 "Usage: pri show version\n"
15325 "Show libpri version information\n";
15331 ast_cli(
a->fd,
"libpri version: %s\n", pri_get_version());
15337#if defined(HAVE_PRI)
15339 AST_CLI_DEFINE(handle_pri_debug,
"Enables PRI debugging on a span"),
15340#if defined(HAVE_PRI_SERVICE_MESSAGES)
15341 AST_CLI_DEFINE(handle_pri_service_enable_channel,
"Return a channel to service"),
15342 AST_CLI_DEFINE(handle_pri_service_disable_channel,
"Remove a channel from service"),
15344 AST_CLI_DEFINE(handle_pri_show_channels,
"Displays PRI channel information"),
15345 AST_CLI_DEFINE(handle_pri_show_spans,
"Displays PRI span information"),
15346 AST_CLI_DEFINE(handle_pri_show_span,
"Displays PRI span information"),
15348 AST_CLI_DEFINE(handle_pri_show_debug,
"Displays current PRI debug settings"),
15349 AST_CLI_DEFINE(handle_pri_set_debug_file,
"Sends PRI debug output to the specified file"),
15360 e->
command =
"mfcr2 show version";
15362 "Usage: mfcr2 show version\n"
15363 " Shows the version of the OpenR2 library being used.\n";
15368 ast_cli(
a->fd,
"OpenR2 version: %s, revision: %s\n", openr2_get_version(), openr2_get_revision());
15374#define FORMAT "%4s %40s\n"
15376 int numvariants = 0;
15377 const openr2_variant_entry_t *variants;
15380 e->
command =
"mfcr2 show variants";
15382 "Usage: mfcr2 show variants\n"
15383 " Shows the list of MFC/R2 variants supported.\n";
15388 if (!(variants = openr2_proto_get_variant_list(&numvariants))) {
15389 ast_cli(
a->fd,
"Failed to get list of variants.\n");
15393 for (i = 0; i < numvariants; i++) {
15402#define FORMAT "%4s %4s %-7.7s %-7.7s %-8.8s %-9.9s %-16.16s %-8.8s %-8.8s\n"
15403 int filtertype = 0;
15410 openr2_context_t *r2context;
15411 openr2_variant_t r2variant;
15414 e->
command =
"mfcr2 show channels [group|context]";
15416 "Usage: mfcr2 show channels [group <group> | context <context>]\n"
15417 " Shows the DAHDI channels configured with MFC/R2 signaling.\n";
15422 if (!((
a->argc == 3) || (
a->argc == 5))) {
15425 if (
a->argc == 5) {
15426 if (!strcasecmp(
a->argv[3],
"group")) {
15427 targetnum = atoi(
a->argv[4]);
15428 if ((targetnum < 0) || (targetnum > 63))
15430 targetnum = 1 << targetnum;
15432 }
else if (!strcasecmp(
a->argv[3],
"context")) {
15438 ast_cli(
a->fd,
FORMAT,
"Chan",
"Link#",
"Variant",
"Max ANI",
"Max DNIS",
"ANI First",
"Immediate Accept",
"Tx CAS",
"Rx CAS");
15445 switch(filtertype) {
15447 if (p->
group != targetnum) {
15452 if (strcasecmp(p->
context,
a->argv[4])) {
15460 r2context = openr2_chan_get_context(p->r2chan);
15461 r2variant = openr2_context_get_variant(r2context);
15462 snprintf(channo,
sizeof(channo),
"%d", p->
channel);
15463 snprintf(linkno,
sizeof(linkno),
"%d", p->mfcr2->index);
15464 snprintf(anino,
sizeof(anino),
"%d", openr2_context_get_max_ani(r2context));
15465 snprintf(dnisno,
sizeof(dnisno),
"%d", openr2_context_get_max_dnis(r2context));
15466 ast_cli(
a->fd,
FORMAT, channo, linkno, openr2_proto_get_variant_string(r2variant),
15467 anino, dnisno, openr2_context_get_ani_first(r2context) ?
"Yes" :
"No",
15468 openr2_context_get_immediate_accept(r2context) ?
"Yes" :
"No",
15469 openr2_chan_get_tx_cas_string(p->r2chan), openr2_chan_get_rx_cas_string(p->r2chan));
15480 char *toklevel =
NULL;
15481 char *saveptr =
NULL;
15482 char *logval =
NULL;
15483 openr2_log_level_t loglevel = OR2_LOG_NOTHING;
15484 openr2_log_level_t tmplevel = OR2_LOG_NOTHING;
15487 e->
command =
"mfcr2 set debug";
15489 "Usage: mfcr2 set debug <loglevel> <channel>\n"
15490 " Set a new logging level for the specified channel.\n"
15491 " If no channel is specified the logging level will be applied to all channels.\n";
15499 channo = (
a->argc == 5) ? atoi(
a->argv[4]) : -1;
15501 toklevel = strtok_r(logval,
",", &saveptr);
15502 if (-1 == (tmplevel = openr2_log_get_level(toklevel))) {
15503 ast_cli(
a->fd,
"Invalid MFC/R2 logging level '%s'.\n",
a->argv[3]);
15505 }
else if (OR2_LOG_NOTHING == tmplevel) {
15506 loglevel = tmplevel;
15508 loglevel |= tmplevel;
15509 while ((toklevel = strtok_r(
NULL,
",", &saveptr))) {
15510 if (-1 == (tmplevel = openr2_log_get_level(toklevel))) {
15511 ast_cli(
a->fd,
"Ignoring invalid logging level: '%s'.\n", toklevel);
15514 loglevel |= tmplevel;
15522 if ((channo != -1) && (p->
channel != channo )) {
15525 openr2_chan_set_log_level(p->r2chan, loglevel);
15526 if (channo != -1) {
15527 ast_cli(
a->fd,
"MFC/R2 debugging set to '%s' for channel %d.\n",
a->argv[3], p->
channel);
15531 if ((channo != -1) && !p) {
15532 ast_cli(
a->fd,
"MFC/R2 channel %d not found.\n", channo);
15534 if (channo == -1) {
15535 ast_cli(
a->fd,
"MFC/R2 debugging set to '%s' for all channels.\n",
a->argv[3]);
15547 e->
command =
"mfcr2 call files [on|off]";
15549 "Usage: mfcr2 call files [on|off] <channel>\n"
15550 " Enable call files creation on the specified channel.\n"
15551 " If no channel is specified call files creation policy will be applied to all channels.\n";
15559 channo = (
a->argc == 5) ? atoi(
a->argv[4]) : -1;
15565 if ((channo != -1) && (p->
channel != channo )) {
15569 openr2_chan_enable_call_files(p->r2chan);
15571 openr2_chan_disable_call_files(p->r2chan);
15573 if (channo != -1) {
15575 ast_cli(
a->fd,
"MFC/R2 call files enabled for channel %d.\n", p->
channel);
15577 ast_cli(
a->fd,
"MFC/R2 call files disabled for channel %d.\n", p->
channel);
15582 if ((channo != -1) && !p) {
15583 ast_cli(
a->fd,
"MFC/R2 channel %d not found.\n", channo);
15585 if (channo == -1) {
15587 ast_cli(
a->fd,
"MFC/R2 Call files enabled for all channels.\n");
15589 ast_cli(
a->fd,
"MFC/R2 Call files disabled for all channels.\n");
15602 e->
command =
"mfcr2 set idle";
15604 "Usage: mfcr2 set idle <channel>\n"
15605 " DON'T USE THIS UNLESS YOU KNOW WHAT YOU ARE DOING.\n"
15606 " Force the given channel into IDLE state.\n"
15607 " If no channel is specified, all channels will be set to IDLE.\n";
15612 channo = (
a->argc == 4) ? atoi(
a->argv[3]) : -1;
15618 if ((channo != -1) && (p->
channel != channo )) {
15621 openr2_chan_set_idle(p->r2chan);
15626 if (channo != -1) {
15630 if ((channo != -1) && !p) {
15631 ast_cli(
a->fd,
"MFC/R2 channel %d not found.\n", channo);
15643 e->
command =
"mfcr2 set blocked";
15645 "Usage: mfcr2 set blocked <channel>\n"
15646 " DON'T USE THIS UNLESS YOU KNOW WHAT YOU ARE DOING.\n"
15647 " Force the given channel into BLOCKED state.\n"
15648 " If no channel is specified, all channels will be set to BLOCKED.\n";
15653 channo = (
a->argc == 4) ? atoi(
a->argv[3]) : -1;
15659 if ((channo != -1) && (p->
channel != channo )) {
15662 openr2_chan_set_blocked(p->r2chan);
15666 if (channo != -1) {
15670 if ((channo != -1) && !p) {
15671 ast_cli(
a->fd,
"MFC/R2 channel %d not found.\n", channo);
15677static void mfcr2_show_links_of(
struct ast_cli_args *
a,
struct r2links *list_head,
const char *title)
15679#define FORMAT "%-5s %-10s %-15s %-10s %s\n"
15684 char live_chans_str[5];
15685 char channel_list[R2_LINK_CAPACITY * 4];
15686 struct r2link_entry *cur;
15688 ast_cli(
a->fd,
FORMAT,
"Index",
"Thread",
"Dahdi-Device",
"Channels",
"Channel-List");
15690 struct dahdi_mfcr2 *mfcr2 = &cur->mfcr2;
15691 const char *thread_status =
NULL;
15698 if (mfcr2->r2master == 0L) {
15699 thread_status =
"zero";
15701 thread_status =
"none";
15703 thread_status =
"created";
15705 snprintf(index,
sizeof(index),
"%d", mfcr2->index);
15706 snprintf(live_chans_str,
sizeof(live_chans_str),
"%d", mfcr2->live_chans);
15712 for (i = 0; i < mfcr2->numchans &&
len <
sizeof(channel_list) - 1; i++) {
15719 if (prev_channo && prev_channo == channo - 1) {
15720 prev_channo = channo;
15724 if (inside_range) {
15726 len += snprintf(channel_list +
len,
sizeof(channel_list) -
len - 1,
"-%d,%d", prev_channo, channo);
15728 }
else if (prev_channo) {
15730 len += snprintf(channel_list +
len,
sizeof(channel_list) -
len - 1,
",%d", channo);
15733 len += snprintf(channel_list +
len,
sizeof(channel_list) -
len - 1,
"%d", channo);
15735 prev_channo = channo;
15738 if (inside_range) {
15740 len += snprintf(channel_list +
len,
sizeof(channel_list) -
len - 1,
"-%d", channo);
15742 }
else if (prev_channo) {
15744 len += snprintf(channel_list +
len,
sizeof(channel_list) -
len - 1,
",%d", channo);
15750 (mfcr2->nodev) ?
"MISSING" :
"OK",
15763 e->
command =
"mfcr2 show links";
15765 "Usage: mfcr2 show links\n"
15766 " Shows the DAHDI MFC/R2 links.\n";
15771 if (
a->argc != 3) {
15774 mfcr2_show_links_of(
a, &r2links,
"Live links\n");
15775 mfcr2_show_links_of(
a, &nodev_r2links,
"Links to be removed (device missing)\n");
15782 int wanted_link_index;
15783 int found_link = 0;
15784 struct r2link_entry *cur =
NULL;
15788 e->
command =
"mfcr2 destroy link";
15790 "Usage: mfcr2 destroy link <index-number>\n"
15791 " Destroys D-channel of link and its B-channels.\n"
15792 " DON'T USE THIS UNLESS YOU KNOW WHAT YOU ARE DOING.\n";
15800 res = sscanf(
a->argv[3],
"%30d", &wanted_link_index);
15801 if ((res != 1) || wanted_link_index < 1) {
15803 "Invalid link index '%s'. Should be a positive number\n",
a->argv[3]);
15808 struct dahdi_mfcr2 *mfcr2 = &cur->mfcr2;
15809 if (wanted_link_index == mfcr2->index) {
15817 if (! found_link) {
15818 ast_cli(
a->fd,
"No link found with index %d.\n", wanted_link_index);
15825 AST_CLI_DEFINE(handle_mfcr2_version,
"Show OpenR2 library version"),
15826 AST_CLI_DEFINE(handle_mfcr2_show_variants,
"Show supported MFC/R2 variants"),
15827 AST_CLI_DEFINE(handle_mfcr2_show_channels,
"Show MFC/R2 channels"),
15829 AST_CLI_DEFINE(handle_mfcr2_set_debug,
"Set MFC/R2 channel logging level"),
15830 AST_CLI_DEFINE(handle_mfcr2_call_files,
"Enable/Disable MFC/R2 call files"),
15831 AST_CLI_DEFINE(handle_mfcr2_set_idle,
"Reset MFC/R2 channel forcing it to IDLE"),
15832 AST_CLI_DEFINE(handle_mfcr2_set_blocked,
"Reset MFC/R2 channel forcing it to BLOCKED"),
15833 AST_CLI_DEFINE(handle_mfcr2_destroy_link,
"Destroy given MFC/R2 link"),
15844 e->
command =
"dahdi destroy channels";
15846 "Usage: dahdi destroy channels <from_channel> [<to_channel>]\n"
15847 " DON'T USE THIS UNLESS YOU KNOW WHAT YOU ARE DOING. Immediately removes a given channel, whether it is in use or not\n";
15852 if ((
a->argc < 4) ||
a->argc > 5) {
15855 start = atoi(
a->argv[3]);
15857 ast_cli(
a->fd,
"Invalid starting channel number %s.\n",
15861 if (
a->argc == 5) {
15862 end = atoi(
a->argv[4]);
15864 ast_cli(
a->fd,
"Invalid ending channel number %s.\n",
15874 "range end (%d) is smaller than range start (%d)\n",
15890 e->
command =
"dahdi create channels";
15891 e->
usage =
"Usage: dahdi create channels <from> [<to>] - a range of channels\n"
15892 " dahdi create channels new - add channels not yet created\n"
15893 "For ISDN and SS7 the range should include complete spans.\n";
15898 if ((
a->argc < 4) ||
a->argc > 5) {
15901 if (
a->argc == 4 && !strcmp(
a->argv[3],
"new")) {
15905 start = atoi(
a->argv[3]);
15907 ast_cli(
a->fd,
"Invalid starting channel number '%s'.\n",
15911 if (
a->argc == 5) {
15912 end = atoi(
a->argv[4]);
15914 ast_cli(
a->fd,
"Invalid ending channel number '%s'.\n",
15923 "range end (%d) is smaller than range start (%d)\n",
15961#if defined(HAVE_PRI) || defined(HAVE_SS7)
15968 ast_verb(1,
"Destroying channels and reloading DAHDI configuration.\n");
15970 ast_verb(4,
"Initial softhangup of all DAHDI channels complete.\n");
15972 dahdi_r2_destroy_links();
15975#if defined(HAVE_PRI)
15978 cancel_code = pthread_cancel(pris[i].pri.
master);
15979 pthread_kill(pris[i].pri.
master, SIGURG);
15980 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);
15982 ast_debug(4,
"Joined thread of span %d\n", i);
15987#if defined(HAVE_SS7)
15990 cancel_code = pthread_cancel(linksets[i].ss7.master);
15991 pthread_kill(linksets[i].ss7.master, SIGURG);
15992 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);
15993 pthread_join(linksets[i].ss7.master,
NULL);
15994 ast_debug(4,
"Joined thread of span %d\n", i);
16003 ast_debug(4,
"Waiting to join monitor thread with pid=%p, cancel_code=%d\n", (
void *)
monitor_thread, cancel_code);
16005 ast_debug(4,
"Joined monitor thread\n");
16011 int x = DAHDI_FLASH;
16027 ast_verb(4,
"Final softhangup of all DAHDI channels complete.\n");
16037 dahdi_close_pri_fd(&(pris[i]), j);
16040 memset(pris, 0,
sizeof(pris));
16044 pri_set_error(dahdi_pri_error);
16045 pri_set_message(dahdi_pri_message);
16047#if defined(HAVE_SS7)
16050 dahdi_close_ss7_fd(&(linksets[i]), j);
16053 memset(linksets, 0,
sizeof(linksets));
16057 ss7_set_error(dahdi_ss7_error);
16058 ss7_set_message(dahdi_ss7_message);
16078 e->
command =
"dahdi restart";
16080 "Usage: dahdi restart\n"
16081 " Restarts the DAHDI channels: destroys them all and then\n"
16082 " re-reads them from chan_dahdi.conf.\n"
16083 " Note that this will STOP any running CALL on DAHDI channels.\n"
16109#define FORMAT "%7s %4d %-20.20s %-10.10s %-15.15s %-8.8s %-20.20s %-10.10s %-10.10s %-12.12s %-32.32s\n"
16110#define FORMAT2 "%7s %4s %-20.20s %-10.10s %-15.15s %-8.8s %-20.20s %-10.10s %-10.10s %-12.12s %-32.32s\n"
16112 int filtertype = 0;
16119 e->
command =
"dahdi show channels [group|context]";
16121 "Usage: dahdi show channels [ group <group> | context <context> ]\n"
16122 " Shows a list of available channels with optional filtering\n"
16123 " <group> must be a number between 0 and 63\n";
16131 if (!((
a->argc == 3) || (
a->argc == 5))) {
16135 if (
a->argc == 5) {
16136 if (!strcasecmp(
a->argv[3],
"group")) {
16137 targetnum = atoi(
a->argv[4]);
16138 if (63 < targetnum) {
16143 }
else if (!strcasecmp(
a->argv[3],
"context")) {
16148 ast_cli(
a->fd,
FORMAT2,
"Chan",
"Span",
"Signalling",
"Extension",
"Context",
"Language",
"MOH Interpret",
"Blocked",
"In Service",
"Alarms",
"Description");
16153 switch(filtertype) {
16155 if (!(tmp->
group & targetnum)) {
16160 if (strcasecmp(tmp->
context,
a->argv[4])) {
16169 snprintf(tmps,
sizeof(tmps),
"%d", tmp->
channel);
16177 blockstr[2] =
'\0';
16179 ast_cli(
a->fd,
FORMAT, tmps, tmp->
span,
sig2str(tmp->
sig), tmp->
exten, tmp->
context, tmp->
language, tmp->
mohinterpret, blockstr, tmp->
inservice ?
"Yes" :
"No",
16192 struct dahdi_confinfo ci;
16193 struct dahdi_params ps;
16200 e->
command =
"dahdi show channel";
16202 "Usage: dahdi show channel <chan num>\n"
16203 " Detailed information about a given channel\n";
16212 channel = atoi(
a->argv[3]);
16216 if (tmp->
channel == channel) {
16226#if defined(HAVE_PRI)
16227#if defined(HAVE_PRI_SUBADDR)
16236 for (v = tmp->
vars ; v ; v = v->
next)
16250 ast_cli(
a->fd,
"DSP: %s\n", tmp->
dsp ?
"yes" :
"no");
16253#if defined(BUSYDETECT_TONEONLY)
16254 ast_cli(
a->fd,
" Busy Detector Helper: BUSYDETECT_TONEONLY\n");
16255#elif defined(BUSYDETECT_COMPARE_TONE_AND_SILENCE)
16256 ast_cli(
a->fd,
" Busy Detector Helper: BUSYDETECT_COMPARE_TONE_AND_SILENCE\n");
16258#ifdef BUSYDETECT_DEBUG
16259 ast_cli(
a->fd,
" Busy Detector Debug: Enabled\n");
16264 ast_cli(
a->fd,
"TDD: %s\n", tmp->
tdd ?
"yes" :
"no");
16271 snprintf(hwrxgain,
sizeof(hwrxgain),
"%.1f", tmp->
hwrxgain);
16276 snprintf(hwtxgain,
sizeof(hwtxgain),
"%.1f", tmp->
hwtxgain);
16280 ast_cli(
a->fd,
"HW Gains (RX/TX): %s/%s\n", hwrxgain, hwtxgain);
16282 ast_cli(
a->fd,
"Dynamic Range Compression (RX/TX): %.2f/%.2f\n", tmp->
rxdrc, tmp->
txdrc);
16284 ast_cli(
a->fd,
"Echo Cancellation:\n");
16304 char calldir[OR2_MAX_PATH];
16305 openr2_context_t *r2context = openr2_chan_get_context(tmp->r2chan);
16306 openr2_variant_t r2variant = openr2_context_get_variant(r2context);
16307 ast_cli(
a->fd,
"MFC/R2 MF State: %s\n", openr2_chan_get_mf_state_string(tmp->r2chan));
16308 ast_cli(
a->fd,
"MFC/R2 MF Group: %s\n", openr2_chan_get_mf_group_string(tmp->r2chan));
16309 ast_cli(
a->fd,
"MFC/R2 State: %s\n", openr2_chan_get_r2_state_string(tmp->r2chan));
16310 ast_cli(
a->fd,
"MFC/R2 Call State: %s\n", openr2_chan_get_call_state_string(tmp->r2chan));
16311 ast_cli(
a->fd,
"MFC/R2 Call Files Enabled: %s\n", openr2_chan_get_call_files_enabled(tmp->r2chan) ?
"Yes" :
"No");
16312 ast_cli(
a->fd,
"MFC/R2 Variant: %s\n", openr2_proto_get_variant_string(r2variant));
16313 ast_cli(
a->fd,
"MFC/R2 Max ANI: %d\n", openr2_context_get_max_ani(r2context));
16314 ast_cli(
a->fd,
"MFC/R2 Max DNIS: %d\n", openr2_context_get_max_dnis(r2context));
16315#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 2
16316 ast_cli(
a->fd,
"MFC/R2 DTMF Dialing: %s\n", openr2_context_get_dtmf_dialing(r2context,
NULL,
NULL) ?
"Yes" :
"No");
16317 ast_cli(
a->fd,
"MFC/R2 DTMF Detection: %s\n", openr2_context_get_dtmf_detection(r2context) ?
"Yes" :
"No");
16319 ast_cli(
a->fd,
"MFC/R2 Get ANI First: %s\n", openr2_context_get_ani_first(r2context) ?
"Yes" :
"No");
16320#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 1
16321 ast_cli(
a->fd,
"MFC/R2 Skip Category Request: %s\n", openr2_context_get_skip_category_request(r2context) ?
"Yes" :
"No");
16323 ast_cli(
a->fd,
"MFC/R2 Immediate Accept: %s\n", openr2_context_get_immediate_accept(r2context) ?
"Yes" :
"No");
16324 ast_cli(
a->fd,
"MFC/R2 Accept on Offer: %s\n", tmp->mfcr2_accept_on_offer ?
"Yes" :
"No");
16325 ast_cli(
a->fd,
"MFC/R2 Charge Calls: %s\n", tmp->mfcr2_charge_calls ?
"Yes" :
"No");
16326 ast_cli(
a->fd,
"MFC/R2 Allow Collect Calls: %s\n", tmp->mfcr2_allow_collect_calls ?
"Yes" :
"No");
16327 ast_cli(
a->fd,
"MFC/R2 Forced Release: %s\n", tmp->mfcr2_forced_release ?
"Yes" :
"No");
16328 ast_cli(
a->fd,
"MFC/R2 MF Back Timeout: %dms\n", openr2_context_get_mf_back_timeout(r2context));
16329 ast_cli(
a->fd,
"MFC/R2 R2 Metering Pulse Timeout: %dms\n", openr2_context_get_metering_pulse_timeout(r2context));
16330 ast_cli(
a->fd,
"MFC/R2 Rx CAS: %s\n", openr2_chan_get_rx_cas_string(tmp->r2chan));
16331 ast_cli(
a->fd,
"MFC/R2 Tx CAS: %s\n", openr2_chan_get_tx_cas_string(tmp->r2chan));
16332 ast_cli(
a->fd,
"MFC/R2 MF Tx Signal: %d\n", openr2_chan_get_tx_mf_signal(tmp->r2chan));
16333 ast_cli(
a->fd,
"MFC/R2 MF Rx Signal: %d\n", openr2_chan_get_rx_mf_signal(tmp->r2chan));
16334 ast_cli(
a->fd,
"MFC/R2 Call Files Directory: %s\n", openr2_context_get_log_directory(r2context, calldir,
sizeof(calldir)));
16337#if defined(HAVE_SS7)
16358 if (tmp->logicalspan)
16359 ast_cli(
a->fd,
"PRI Logical Span: %d\n", tmp->logicalspan);
16361 ast_cli(
a->fd,
"PRI Logical Span: Implicit\n");
16364 memset(&ci, 0,
sizeof(ci));
16367 memset(&ci, 0,
sizeof(ci));
16369 ast_cli(
a->fd,
"Actual Confinfo: Num/%d, Mode/0x%04x\n", ci.confno, (
unsigned)ci.confmode);
16372 ast_cli(
a->fd,
"Actual Confmute: %s\n", x ?
"Yes" :
"No");
16374 memset(&ps, 0,
sizeof(ps));
16378 ast_cli(
a->fd,
"Hookstate (FXS only): %s\n", ps.rxisoffhook ?
"Offhook" :
"Onhook");
16396 e->
command =
"dahdi show cadences";
16398 "Usage: dahdi show cadences\n"
16399 " Shows all cadences currently defined\n";
16406 char tmp[16], tmp2[64];
16407 snprintf(tmp,
sizeof(tmp),
"r%d: ", i + 1);
16410 for (j = 0; j < 16; j++) {
16411 if (
cadences[i].ringcadence[j] == 0)
16413 snprintf(tmp,
sizeof(tmp),
"%d",
cadences[i].ringcadence[j]);
16419 strncat(output,
",",
sizeof(output) - strlen(output) - 1);
16420 strncat(output, tmp2,
sizeof(output) - strlen(output) - 1);
16429 alarmstr[0] =
'\0';
16430 if (spaninfo->alarms > 0) {
16431 if (spaninfo->alarms & DAHDI_ALARM_BLUE) {
16432 strcat(alarmstr,
"BLU/");
16434 if (spaninfo->alarms & DAHDI_ALARM_YELLOW) {
16435 strcat(alarmstr,
"YEL/");
16437 if (spaninfo->alarms & DAHDI_ALARM_RED) {
16438 strcat(alarmstr,
"RED/");
16440 if (spaninfo->alarms & DAHDI_ALARM_LOOPBACK) {
16441 strcat(alarmstr,
"LB/");
16443 if (spaninfo->alarms & DAHDI_ALARM_RECOVER) {
16444 strcat(alarmstr,
"REC/");
16446 if (spaninfo->alarms & DAHDI_ALARM_NOTOPEN) {
16447 strcat(alarmstr,
"NOP/");
16449 if (!strlen(alarmstr)) {
16450 strcat(alarmstr,
"UUU/");
16452 if (strlen(alarmstr)) {
16454 alarmstr[strlen(alarmstr) - 1] =
'\0';
16457 if (spaninfo->numchans) {
16458 strcpy(alarmstr,
"OK");
16460 strcpy(alarmstr,
"UNCONFIGURED");
16468 #define FORMAT "%4d %-40.40s %-7.7s %-6d %-6d %-6d %-3.3s %-4.4s %-8.8s %s\n"
16469 #define FORMAT2 "%4s %-40.40s %-7.7s %-6.6s %-6.6s %-6.6s %-3.3s %-4.4s %-8.8s %s\n"
16475 struct dahdi_spaninfo s;
16479 e->
command =
"dahdi show status";
16481 "Usage: dahdi show status\n"
16482 " Shows a list of DAHDI cards with status\n";
16487 ctl = open(
"/dev/dahdi/ctl", O_RDWR);
16489 ast_cli(
a->fd,
"No DAHDI found. Unable to open /dev/dahdi/ctl: %s\n", strerror(
errno));
16492 ast_cli(
a->fd,
FORMAT2,
"Span",
"Description",
"Alarms",
"IRQ",
"bpviol",
"CRC",
"Framing",
"Coding",
"Options",
"LBO");
16494 for (span = 1; span < DAHDI_MAX_SPANS; ++span) {
16496 res = ioctl(ctl, DAHDI_SPANSTAT, &s);
16501 ast_cli(
a->fd,
FORMAT, span, s.desc, alarmstr, s.irqmisses, s.bpvcount, s.crc4count,
16502 s.lineconfig & DAHDI_CONFIG_D4 ?
"D4" :
16503 s.lineconfig & DAHDI_CONFIG_ESF ?
"ESF" :
16504 s.lineconfig & DAHDI_CONFIG_CCS ?
"CCS" :
16506 s.lineconfig & DAHDI_CONFIG_B8ZS ?
"B8ZS" :
16507 s.lineconfig & DAHDI_CONFIG_HDB3 ?
"HDB3" :
16508 s.lineconfig & DAHDI_CONFIG_AMI ?
"AMI" :
16510 s.lineconfig & DAHDI_CONFIG_CRC4 ?
16511 s.lineconfig & DAHDI_CONFIG_NOTOPEN ?
"CRC4/YEL" :
"CRC4" :
16512 s.lineconfig & DAHDI_CONFIG_NOTOPEN ?
"YEL" :
"",
16525 int pseudo_fd = -1;
16526 struct dahdi_versioninfo vi;
16530 e->
command =
"dahdi show version";
16532 "Usage: dahdi show version\n"
16533 " Shows the DAHDI version in use\n";
16538 if ((pseudo_fd = open(
"/dev/dahdi/ctl", O_RDONLY)) < 0) {
16539 ast_cli(
a->fd,
"Failed to open control file to get version.\n");
16543 strcpy(vi.version,
"Unknown");
16544 strcpy(vi.echo_canceller,
"Unknown");
16546 if (ioctl(pseudo_fd, DAHDI_GETVERSION, &vi))
16547 ast_cli(
a->fd,
"Failed to get DAHDI version: %s\n", strerror(
errno));
16549 ast_cli(
a->fd,
"DAHDI Version: %s Echo Canceller: %s\n", vi.version, vi.echo_canceller);
16565 e->
command =
"dahdi set hwgain {rx|tx}";
16567 "Usage: dahdi set hwgain <rx|tx> <chan#> <gain>\n"
16568 " Sets the hardware gain on a given channel and overrides the\n"
16569 " value provided at module loadtime. Changes take effect\n"
16570 " immediately whether the channel is in use or not.\n"
16572 " <rx|tx> which direction do you want to change (relative to our module)\n"
16573 " <chan num> is the channel number relative to the device\n"
16574 " <gain> is the gain in dB (e.g. -3.5 for -3.5dB)\n"
16577 " * hwgain is only supportable by hardware with analog ports because\n"
16578 " hwgain works on the analog side of an analog-digital conversion.\n";
16587 if (!strcasecmp(
"rx",
a->argv[3]))
16589 else if (!strcasecmp(
"tx",
a->argv[3]))
16595 gain = atof(
a->argv[5]);
16608 ast_cli(
a->fd,
"Unable to set the hardware gain for channel %d: %s\n",
channel, strerror(
errno));
16612 ast_cli(
a->fd,
"Hardware %s gain set to %.1f dB on channel %d.\n",
16613 tx ?
"tx" :
"rx", gain,
channel);
16645 e->
command =
"dahdi set swgain {rx|tx}";
16647 "Usage: dahdi set swgain <rx|tx> <chan#> <gain>\n"
16648 " Sets the software gain on a given channel and overrides the\n"
16649 " value provided at module loadtime. Changes take effect\n"
16650 " immediately whether the channel is in use or not.\n"
16652 " <rx|tx> which direction do you want to change (relative to our module)\n"
16653 " <chan num> is the channel number relative to the device\n"
16654 " <gain> is the gain in dB (e.g. -3.5 for -3.5dB)\n";
16663 if (!strcasecmp(
"rx",
a->argv[3]))
16665 else if (!strcasecmp(
"tx",
a->argv[3]))
16671 gain = atof(
a->argv[5]);
16688 ast_cli(
a->fd,
"Unable to set the software gain for channel %d\n",
channel);
16693 ast_cli(
a->fd,
"Software %s gain set to %.2f dB on channel %d.\n",
16694 tx ?
"tx" :
"rx", gain,
channel);
16721 e->
command =
"dahdi set dnd";
16723 "Usage: dahdi set dnd <chan#> <on|off>\n"
16724 " Sets/resets DND (Do Not Disturb) mode on a channel.\n"
16725 " Changes take effect immediately.\n"
16726 " <chan num> is the channel number\n"
16727 " <on|off> Enable or disable DND mode?\n"
16737 if ((
channel = atoi(
a->argv[3])) <= 0) {
16738 ast_cli(
a->fd,
"Expected channel number, got '%s'\n",
a->argv[3]);
16747 ast_cli(
a->fd,
"Expected 'on' or 'off', got '%s'\n",
a->argv[4]);
16752 for (dahdi_chan =
iflist; dahdi_chan; dahdi_chan = dahdi_chan->
next) {
16779 e->
command =
"dahdi set mwi";
16781 "Usage: dahdi set mwi <chan#> <on|off|reset>\n"
16782 " Sets/unsets MWI (Message Waiting Indicator) manually on a channel.\n"
16783 " This may be used regardless of whether the channel is assigned any mailboxes.\n"
16784 " When active, this setting will override the voicemail status to set MWI.\n"
16785 " Once cleared, the voicemail status will resume control of MWI.\n"
16786 " Changes are queued for when the channel is idle and persist until cleared.\n"
16787 " <chan num> is the channel number\n"
16788 " <on|off|reset> Enable, disable, or reset Message Waiting Indicator override?\n"
16798 if ((
channel = atoi(
a->argv[3])) <= 0) {
16799 ast_cli(
a->fd,
"Expected channel number, got '%s'\n",
a->argv[3]);
16807 }
else if (!strcmp(
a->argv[4],
"reset")) {
16810 ast_cli(
a->fd,
"Expected 'on' or 'off' or 'reset', got '%s'\n",
a->argv[4]);
16815 for (dahdi_chan =
iflist; dahdi_chan; dahdi_chan = dahdi_chan->
next) {
16822 ast_cli(
a->fd,
"MWI '%s' queued for channel %d\n", on ?
"enable" :
"disable",
channel);
16900 if (sscanf(
channel,
"%30d", &chan_num) != 1) {
17016 for (i = 0; i < strlen(
number); i++) {
17031 int dahdichanquery;
17033 if (!dahdichannel || sscanf(dahdichannel,
"%30d", &dahdichanquery) != 1) {
17035 dahdichanquery = -1;
17040 snprintf(idText,
sizeof(idText),
"ActionID: %s\r\n",
id);
17052 if (dahdichanquery > 0 && tmp->
channel != dahdichanquery)
17060 "Event: DAHDIShowChannels\r\n"
17061 "DAHDIChannel: %d\r\n"
17064 "AccountCode: %s\r\n"
17065 "Signalling: %s\r\n"
17066 "SignallingCode: %d\r\n"
17070 "Description: %s\r\n"
17080 dahdi_dnd(tmp, -1) ?
"Enabled" :
"Disabled",
17085 "Event: DAHDIShowChannels\r\n"
17086 "DAHDIChannel: %d\r\n"
17087 "Signalling: %s\r\n"
17088 "SignallingCode: %d\r\n"
17092 "Description: %s\r\n"
17097 dahdi_dnd(tmp, -1) ?
"Enabled" :
"Disabled",
17121 struct dahdi_spaninfo spaninfo;
17123 ctl = open(
"/dev/dahdi/ctl", O_RDWR);
17131 snprintf(idText,
sizeof(idText),
"ActionID: %s\r\n",
id);
17135 for (span = 1; span < DAHDI_MAX_SPANS; ++span) {
17136 spaninfo.spanno = span;
17137 res = ioctl(ctl, DAHDI_SPANSTAT, &spaninfo);
17144 "Event: DAHDIShowStatus\r\n"
17146 "Description: %s\r\n"
17157 span, spaninfo.desc, alarmstr, spaninfo.irqmisses, spaninfo.bpvcount, spaninfo.crc4count,
17158 spaninfo.lineconfig & DAHDI_CONFIG_D4 ?
"D4" :
17159 spaninfo.lineconfig & DAHDI_CONFIG_ESF ?
"ESF" :
17160 spaninfo.lineconfig & DAHDI_CONFIG_CCS ?
"CCS" :
17162 spaninfo.lineconfig & DAHDI_CONFIG_B8ZS ?
"B8ZS" :
17163 spaninfo.lineconfig & DAHDI_CONFIG_HDB3 ?
"HDB3" :
17164 spaninfo.lineconfig & DAHDI_CONFIG_AMI ?
"AMI" :
17166 spaninfo.lineconfig & DAHDI_CONFIG_CRC4 ?
17167 spaninfo.lineconfig & DAHDI_CONFIG_NOTOPEN ?
"CRC4/YEL" :
"CRC4" :
17168 spaninfo.lineconfig & DAHDI_CONFIG_NOTOPEN ?
"YEL" :
"",
17180#if defined(HAVE_PRI)
17186 struct dahdi_pri *dspan;
17189 char action_id[256];
17190 const char *show_cmd =
"PRIShowSpans";
17194 span_query = atoi(span_str);
17200 snprintf(action_id,
sizeof(action_id),
"ActionID: %s\r\n",
id);
17202 action_id[0] =
'\0';
17208 for (idx = 0; idx <
ARRAY_LEN(pris); ++idx) {
17209 dspan = &pris[idx];
17212 if (0 < span_query && dspan->pri.span != span_query) {
17216 if (dspan->pri.pri) {
17229#if defined(HAVE_SS7)
17230static int linkset_addsigchan(
int sigchan)
17232 struct dahdi_ss7 *link;
17235 struct dahdi_params params;
17236 struct dahdi_bufferinfo bi;
17237 struct dahdi_spaninfo si;
17243 if (cur_ss7type < 0) {
17247 if (cur_pointcode < 0) {
17251 if (cur_adjpointcode < 0) {
17255 if (cur_defaultdpc < 0) {
17259 if (cur_networkindicator < 0) {
17263 link = ss7_resolve_linkset(cur_linkset);
17273 curfd = link->ss7.numsigchans;
17276 link->ss7.fds[curfd] = open(
"/dev/dahdi/channel", O_RDWR, 0600);
17277 if (link->ss7.fds[curfd] < 0) {
17282 if (ioctl(link->ss7.fds[curfd], DAHDI_SPECIFY, &sigchan) == -1) {
17283 dahdi_close_ss7_fd(link, curfd);
17290 memset(¶ms, 0,
sizeof(params));
17291 res = ioctl(link->ss7.fds[curfd], DAHDI_GET_PARAMS, ¶ms);
17293 dahdi_close_ss7_fd(link, curfd);
17294 ast_log(
LOG_ERROR,
"Unable to get parameters for sigchan %d (%s)\n", sigchan,
17298 if (params.sigtype != DAHDI_SIG_HDLCFCS
17299 && params.sigtype != DAHDI_SIG_HARDHDLC
17300 && params.sigtype != DAHDI_SIG_MTP2) {
17301 dahdi_close_ss7_fd(link, curfd);
17307 memset(&bi, 0,
sizeof(bi));
17308 bi.txbufpolicy = DAHDI_POLICY_IMMEDIATE;
17309 bi.rxbufpolicy = DAHDI_POLICY_IMMEDIATE;
17312 if (ioctl(link->ss7.fds[curfd], DAHDI_SET_BUFINFO, &bi)) {
17313 ast_log(
LOG_ERROR,
"Unable to set appropriate buffering on channel %d: %s\n",
17314 sigchan, strerror(
errno));
17315 dahdi_close_ss7_fd(link, curfd);
17320 memset(&si, 0,
sizeof(si));
17321 res = ioctl(link->ss7.fds[curfd], DAHDI_SPANSTAT, &si);
17323 dahdi_close_ss7_fd(link, curfd);
17324 ast_log(
LOG_ERROR,
"Unable to get span state for sigchan %d (%s)\n", sigchan,
17329 (params.sigtype == DAHDI_SIG_MTP2)
17330 ? SS7_TRANSPORT_DAHDIMTP2
17331 : SS7_TRANSPORT_DAHDIDCHAN,
17332 si.alarms, cur_networkindicator, cur_pointcode, cur_adjpointcode, cur_slc);
17334 dahdi_close_ss7_fd(link, curfd);
17338 ++link->ss7.numsigchans;
17344#if defined(HAVE_SS7)
17350 e->
command =
"ss7 set debug {on|off} linkset";
17352 "Usage: ss7 set debug {on|off} linkset <linkset>\n"
17353 " Enables debugging on a given SS7 linkset\n";
17363 span = atoi(
a->argv[5]);
17364 if ((span < 1) || (span >
NUM_SPANS)) {
17365 ast_cli(
a->fd,
"Invalid linkset %s. Should be a number from %d to %d\n",
a->argv[5], 1,
NUM_SPANS);
17368 if (!linksets[span-1].ss7.ss7) {
17369 ast_cli(
a->fd,
"No SS7 running on linkset %d\n", span);
17371 if (!strcasecmp(
a->argv[3],
"on")) {
17372 linksets[span - 1].ss7.debug = 1;
17374 ast_cli(
a->fd,
"Enabled debugging on linkset %d\n", span);
17376 linksets[span - 1].ss7.debug = 0;
17377 ss7_set_debug(linksets[span-1].ss7.ss7, 0);
17378 ast_cli(
a->fd,
"Disabled debugging on linkset %d\n", span);
17386#if defined(HAVE_SS7)
17396 e->
command =
"ss7 {block|unblock} cic";
17398 "Usage: ss7 {block|unblock} cic <linkset> <dpc> <CIC>\n"
17399 " Sends a remote {blocking|unblocking} request for the given CIC on the specified linkset\n";
17405 if (
a->argc == 6) {
17406 linkset = atoi(
a->argv[3]);
17411 if (!strcasecmp(
a->argv[1],
"block")) {
17413 }
else if (strcasecmp(
a->argv[1],
"unblock")) {
17417 if ((linkset < 1) || (linkset >
NUM_SPANS)) {
17418 ast_cli(
a->fd,
"Invalid linkset %s. Should be a number %d to %d\n",
a->argv[3], 1,
NUM_SPANS);
17422 if (!linksets[linkset-1].ss7.ss7) {
17423 ast_cli(
a->fd,
"No SS7 running on linkset %d\n", linkset);
17427 cic = atoi(
a->argv[5]);
17429 ast_cli(
a->fd,
"Invalid CIC specified!\n");
17433 dpc = atoi(
a->argv[4]);
17435 ast_cli(
a->fd,
"Invalid DPC specified!\n");
17439 for (i = 0; i < linksets[linkset-1].ss7.numchans; i++) {
17440 if (linksets[linkset-1].ss7.pvts[i] && linksets[linkset-1].ss7.pvts[i]->cic == cic && linksets[linkset-1].ss7.pvts[i]->dpc == dpc) {
17441 blocked = linksets[linkset-1].ss7.pvts[i]->locallyblocked;
17444 ast_cli(
a->fd,
"Unable to allocate new ss7call\n");
17446 ast_cli(
a->fd,
"Sent %sblocking request for linkset %d on CIC %d DPC %d\n", (do_block) ?
"" :
"un", linkset, cic, dpc);
17448 }
else if (!do_block && blocked) {
17449 ast_cli(
a->fd,
"CIC %d is hardware locally blocked!\n", cic);
17451 ast_cli(
a->fd,
"CIC %d %s locally blocked\n", cic, do_block ?
"already" :
"is not");
17457 ast_cli(
a->fd,
"Invalid CIC specified!\n");
17462#if defined(HAVE_SS7)
17474 e->
command =
"ss7 {reset|block|unblock} linkset";
17476 "Usage: ss7 {reset|block|unblock} linkset <linkset number>\n"
17477 " Sends a remote {reset|blocking|unblocking} request for all CICs on the given linkset\n";
17483 if (
a->argc == 4) {
17484 linkset = atoi(
a->argv[3]);
17489 if (!strcasecmp(
a->argv[1],
"block")) {
17490 do_what = DO_BLOCK;
17491 }
else if (!strcasecmp(
a->argv[1],
"unblock")) {
17492 do_what = DO_UNBLOCK;
17493 }
else if (!strcasecmp(
a->argv[1],
"reset")) {
17494 do_what = DO_RESET;
17499 if ((linkset < 1) || (linkset >
NUM_SPANS)) {
17500 ast_cli(
a->fd,
"Invalid linkset %s. Should be a number %d to %d\n",
a->argv[3], 1,
NUM_SPANS);
17504 if (!linksets[linkset - 1].ss7.ss7) {
17505 ast_cli(
a->fd,
"No SS7 running on linkset %d\n", linkset);
17509 for (i = 0; i < linksets[linkset - 1].ss7.numchans; i++) {
17511 if (linksets[linkset - 1].ss7.pvts[i]) {
17516 ast_cli(
a->fd,
"Sent remote %s request on CIC %d\n",
17517 (do_what == DO_BLOCK) ?
"blocking" :
"unblocking",
17518 linksets[linkset - 1].ss7.pvts[i]->cic);
17523 linksets[linkset - 1].ss7.pvts[i]->cic,
17524 linksets[linkset - 1].ss7.pvts[i]->dpc)) {
17525 ast_cli(
a->fd,
"Sent reset request on CIC %d\n",
17526 linksets[linkset - 1].ss7.pvts[i]->cic);
17537#if defined(HAVE_SS7)
17540 int linkset, cic, range, chanpos;
17541 int i, dpc, orient = 0;
17543 unsigned char state[255];
17547 e->
command =
"ss7 {block|unblock} group";
17549 "Usage: ss7 {block|unblock} group <linkset> <dpc> <1st. CIC> <range> [H]\n"
17550 " Sends a remote {blocking|unblocking} request for CIC range on the specified linkset\n";
17556 if (
a->argc == 7 ||
a->argc == 8) {
17557 linkset = atoi(
a->argv[3]);
17562 if (!strcasecmp(
a->argv[1],
"block")) {
17564 }
else if (strcasecmp(
a->argv[1],
"unblock")) {
17568 if (
a->argc == 8) {
17569 if (!strcasecmp(
a->argv[7],
"H")) {
17576 if ((linkset < 1) || (linkset >
NUM_SPANS)) {
17577 ast_cli(
a->fd,
"Invalid linkset %s. Should be a number %d to %d\n",
a->argv[4], 1,
NUM_SPANS);
17581 if (!linksets[linkset-1].ss7.ss7) {
17582 ast_cli(
a->fd,
"No SS7 running on linkset %d\n", linkset);
17586 cic = atoi(
a->argv[5]);
17588 ast_cli(
a->fd,
"Invalid CIC specified!\n");
17592 range = atoi(
a->argv[6]);
17594 if (range < 1 || range > (linksets[linkset - 1].ss7.type == SS7_ANSI ? 24 : 31)) {
17595 ast_cli(
a->fd,
"Invalid range specified!\n");
17599 dpc = atoi(
a->argv[4]);
17601 ast_cli(
a->fd,
"Invalid DPC specified!\n");
17608 ast_cli(
a->fd,
"Invalid CIC/RANGE\n");
17613 for (i = 0; i <= range; ++i) {
17620 ast_cli(
a->fd,
"Unable allocate new ss7call\n");
17622 ast_cli(
a->fd,
"Sending remote%s %sblocking request linkset %d on CIC %d range %d\n",
17623 orient ?
" hardware" :
"", do_block ?
"" :
"un", linkset, cic, range);
17630 pthread_kill(linksets[linkset-1].ss7.master, SIGURG);
17636#if defined(HAVE_SS7)
17639 int linkset, cic, range;
17644 e->
command =
"ss7 reset group";
17646 "Usage: ss7 reset group <linkset> <dpc> <1st CIC> <range>\n"
17647 " Send a GRS for the given CIC range on the specified linkset\n";
17653 if (
a->argc == 7) {
17654 linkset = atoi(
a->argv[3]);
17659 if ((linkset < 1) || (linkset >
NUM_SPANS)) {
17660 ast_cli(
a->fd,
"Invalid linkset %s. Should be a number %d to %d\n",
a->argv[4], 1,
NUM_SPANS);
17664 if (!linksets[linkset-1].ss7.ss7) {
17665 ast_cli(
a->fd,
"No SS7 running on linkset %d\n", linkset);
17669 cic = atoi(
a->argv[5]);
17672 ast_cli(
a->fd,
"Invalid CIC specified!\n");
17676 range = atoi(
a->argv[6]);
17677 if (range < 1 || range > (linksets[linkset - 1].ss7.type == SS7_ANSI ? 24 : 31)) {
17678 ast_cli(
a->fd,
"Invalid range specified!\n");
17682 dpc = atoi(
a->argv[4]);
17684 ast_cli(
a->fd,
"Invalid DPC specified!\n");
17691 ast_cli(
a->fd,
"Invalid CIC/RANGE\n");
17696 ast_cli(
a->fd,
"Unable to allocate new ss7call\n");
17698 ast_cli(
a->fd,
"GRS sent ... \n");
17705 pthread_kill(linksets[linkset-1].ss7.master, SIGURG);
17711#if defined(HAVE_SS7)
17718 e->
command =
"ss7 show calls";
17720 "Usage: ss7 show calls <linkset>\n"
17721 " Show SS7 calls on the specified linkset\n";
17727 if (
a->argc == 4) {
17728 linkset = atoi(
a->argv[3]);
17733 if ((linkset < 1) || (linkset >
NUM_SPANS)) {
17734 ast_cli(
a->fd,
"Invalid linkset %s. Should be a number %d to %d\n",
a->argv[3], 1,
NUM_SPANS);
17738 if (!linksets[linkset-1].ss7.ss7) {
17739 ast_cli(
a->fd,
"No SS7 running on linkset %d\n", linkset);
17744 isup_show_calls(linksets[linkset-1].ss7.ss7, &
ast_cli,
a->fd);
17751#if defined(HAVE_SS7)
17754 int linkset, cic, res;
17759 e->
command =
"ss7 reset cic";
17761 "Usage: ss7 reset cic <linkset> <dpc> <CIC>\n"
17762 " Send a RSC for the given CIC on the specified linkset\n";
17768 if (
a->argc == 6) {
17769 linkset = atoi(
a->argv[3]);
17774 if ((linkset < 1) || (linkset >
NUM_SPANS)) {
17775 ast_cli(
a->fd,
"Invalid linkset %s. Should be a number %d to %d\n",
a->argv[3], 1,
NUM_SPANS);
17779 if (!linksets[linkset-1].ss7.ss7) {
17780 ast_cli(
a->fd,
"No SS7 running on linkset %d\n", linkset);
17784 cic = atoi(
a->argv[5]);
17787 ast_cli(
a->fd,
"Invalid CIC specified!\n");
17791 dpc = atoi(
a->argv[4]);
17793 ast_cli(
a->fd,
"Invalid DPC specified!\n");
17799 ast_cli(
a->fd,
"%s RSC for linkset %d on CIC %d DPC %d\n", res ?
"Sent" :
"Failed", linkset, cic, dpc);
17805#if defined(HAVE_SS7)
17810 unsigned int arg = 0;
17817 "Usage: ss7 mtp3 <linkset> <slc> coo|coa|cbd|cba|eco|eca|tfp|tfa|lin|lun|lia|lua|lid|lfu <arg>\n"
17818 " Send a NET MNG message\n"
17819 " WARNING!!! WARNING!!! We are not a STP, just for testing/development purposes\n";
17829 linkset = atoi(
a->argv[2]);
17830 if ((linkset < 1) || (linkset >
NUM_SPANS)) {
17831 ast_cli(
a->fd,
"Invalid linkset %s. Should be a number %d to %d\n",
a->argv[2], 1,
NUM_SPANS);
17834 if (!linksets[linkset-1].ss7.ss7) {
17835 ast_cli(
a->fd,
"No SS7 running on linkset %d\n", linkset);
17839 slc = atoi(
a->argv[3]);
17841 if (
a->argc == 6) {
17842 arg = atoi(
a->argv[5]);
17846 res = mtp3_net_mng(linksets[linkset-1].ss7.ss7, slc,
a->argv[4], arg);
17851 pthread_kill(linksets[linkset-1].ss7.master, SIGURG);
17860#if defined(HAVE_SS7)
17864 unsigned int slc = 0;
17868 e->
command =
"ss7 restart mtp3";
17870 "Usage: ss7 restart mtp3 <linkset> <slc>\n"
17881 linkset = atoi(
a->argv[3]);
17882 if ((linkset < 1) || (linkset >
NUM_SPANS)) {
17883 ast_cli(
a->fd,
"Invalid linkset %s. Should be a number %d to %d\n",
a->argv[2], 1,
NUM_SPANS);
17886 if (!linksets[linkset-1].ss7.ss7) {
17887 ast_cli(
a->fd,
"No SS7 running on linkset %d\n", linkset);
17891 slc = atoi(
a->argv[4]);
17894 mtp3_init_restart(linksets[linkset-1].ss7.ss7, slc);
17899 pthread_kill(linksets[linkset-1].ss7.master, SIGURG);
17906#if defined(HAVE_SS7)
17913 e->
command =
"ss7 show linkset";
17915 "Usage: ss7 show linkset <span>\n"
17916 " Shows the status of an SS7 linkset.\n";
17926 linkset = atoi(
a->argv[3]);
17927 if ((linkset < 1) || (linkset >
NUM_SPANS)) {
17928 ast_cli(
a->fd,
"Invalid linkset %s. Should be a number %d to %d\n",
a->argv[3], 1,
NUM_SPANS);
17931 ss7 = &linksets[linkset - 1].ss7;
17933 ast_cli(
a->fd,
"No SS7 running on linkset %d\n", linkset);
17939 ast_cli(
a->fd,
"SS7 calling nai: %i\n",
ss7->calling_nai);
17940 ast_cli(
a->fd,
"SS7 called nai: %i\n",
ss7->called_nai);
17941 ast_cli(
a->fd,
"SS7 nationalprefix: %s\n",
ss7->nationalprefix);
17942 ast_cli(
a->fd,
"SS7 internationalprefix: %s\n",
ss7->internationalprefix);
17943 ast_cli(
a->fd,
"SS7 unknownprefix: %s\n",
ss7->unknownprefix);
17944 ast_cli(
a->fd,
"SS7 networkroutedprefix: %s\n",
ss7->networkroutedprefix);
17945 ast_cli(
a->fd,
"SS7 subscriberprefix: %s\n",
ss7->subscriberprefix);
17952#if defined(HAVE_SS7)
17959 e->
command =
"ss7 show channels";
17961 "Usage: ss7 show channels\n"
17962 " Displays SS7 channel information at a glance.\n";
17968 if (
a->argc != 3) {
17973 for (linkset = 0; linkset <
NUM_SPANS; ++linkset) {
17974 if (linksets[linkset].
ss7.ss7) {
17982#if defined(HAVE_SS7)
17985#define FORMAT "%5s %5s %6s %12s %-12s\n"
17986#define FORMAT2 "%5i %5i %6i %12s %-12s\n"
17987 int i, linkset, dpc = 0;
17994 e->
command =
"ss7 show cics";
17996 "Usage: ss7 show cics <linkset> [dpc]\n"
17997 " Shows the cics of an SS7 linkset.\n";
18003 if (
a->argc < 4 ||
a->argc > 5) {
18007 linkset = atoi(
a->argv[3]);
18009 if ((linkset < 1) || (linkset >
NUM_SPANS)) {
18010 ast_cli(
a->fd,
"Invalid linkset %s. Should be a number %d to %d\n",
a->argv[3], 1,
NUM_SPANS);
18014 if (!linksets[linkset-1].
ss7.ss7) {
18015 ast_cli(
a->fd,
"No SS7 running on linkset %d\n", linkset);
18018 ss7 = &linksets[linkset-1].ss7;
18020 if (
a->argc == 5) {
18021 dpc = atoi(
a->argv[4]);
18023 ast_cli(
a->fd,
"Invalid DPC specified!\n");
18028 ast_cli(
a->fd,
FORMAT,
"CIC",
"DPC",
"DAHDI",
"STATE",
"BLOCKING");
18030 for (i = 0; i <
ss7->numchans; i++) {
18031 if (!dpc || (
ss7->pvts[i] &&
ss7->pvts[i]->dpc == dpc)) {
18039 state =
"NotInServ";
18045 strcpy(blocking,
"L:");
18047 strcat(blocking,
"M");
18049 strcat(blocking,
" ");
18053 strcat(blocking,
"H");
18055 strcat(blocking,
" ");
18058 strcpy(blocking,
" ");
18062 strcat(blocking,
" R:");
18064 strcat(blocking,
"M");
18066 strcat(blocking,
" ");
18070 strcat(blocking,
"H");
18072 strcat(blocking,
" ");
18086#if defined(HAVE_SS7)
18091 e->
command =
"ss7 show version";
18093 "Usage: ss7 show version\n"
18094 " Show the libss7 version\n";
18100 ast_cli(
a->fd,
"libss7 version: %s\n", ss7_get_version());
18106#if defined(HAVE_SS7)
18108 AST_CLI_DEFINE(handle_ss7_debug,
"Enables SS7 debugging on a linkset"),
18109 AST_CLI_DEFINE(handle_ss7_cic_blocking,
"Blocks/Unblocks the given CIC"),
18110 AST_CLI_DEFINE(handle_ss7_linkset_mng,
"Resets/Blocks/Unblocks all CICs on a linkset"),
18111 AST_CLI_DEFINE(handle_ss7_group_blocking,
"Blocks/Unblocks the given CIC range"),
18113 AST_CLI_DEFINE(handle_ss7_group_reset,
"Resets the given CIC range"),
18116 AST_CLI_DEFINE(handle_ss7_show_linkset,
"Shows the status of a linkset"),
18117 AST_CLI_DEFINE(handle_ss7_show_channels,
"Displays SS7 channel information"),
18124#if defined(HAVE_PRI)
18125#if defined(HAVE_PRI_CCSS)
18172#if defined(HAVE_PRI)
18173#if defined(HAVE_PRI_CCSS)
18185static void dahdi_pri_cc_agent_destructor(
struct ast_cc_agent *agent)
18194#if defined(HAVE_PRI)
18195#if defined(HAVE_PRI_CCSS)
18197 .
type = dahdi_pri_cc_type,
18198 .init = dahdi_pri_cc_agent_init,
18207 .destructor = dahdi_pri_cc_agent_destructor,
18212#if defined(HAVE_PRI)
18213#if defined(HAVE_PRI_CCSS)
18215 .
type = dahdi_pri_cc_type,
18229#if defined(HAVE_PRI) || defined(HAVE_SS7)
18236 pthread_cancel(pris[i].pri.
master);
18237 pthread_kill(pris[i].pri.
master, SIGURG);
18242#ifdef HAVE_PRI_PROG_W_CAUSE
18246#if defined(HAVE_SS7)
18249 pthread_cancel(linksets[i].ss7.
master);
18250 pthread_kill(linksets[i].ss7.
master, SIGURG);
18255#if defined(HAVE_OPENR2)
18256 dahdi_r2_destroy_links();
18272#if defined(HAVE_PRI)
18299#if defined(HAVE_PRI)
18305 dahdi_close_pri_fd(&(pris[i]), j);
18309#if defined(HAVE_PRI_CCSS)
18316#if defined(HAVE_SS7)
18322 dahdi_close_ss7_fd(&(linksets[i]), j);
18324 if (linksets[i].ss7.
ss7) {
18325 ss7_destroy(linksets[i].ss7.
ss7);
18326 linksets[i].ss7.ss7 =
NULL;
18342#if defined(HAVE_PRI) || defined(HAVE_SS7)
18349#if defined(HAVE_SS7)
18359 int x, start, finish;
18362 if ((
reload == 0) && (
conf->chan.sig < 0) && !
conf->is_sig_auto) {
18363 ast_log(
LOG_ERROR,
"Signalling must be specified before any channels are.\n");
18369 while ((chan =
strsep(&
c,
","))) {
18370 if (sscanf(chan,
"%30d-%30d", &start, &finish) == 2) {
18372 }
else if (sscanf(chan,
"%30d", &start)) {
18375 }
else if (!strcasecmp(chan,
"pseudo")) {
18381 if (finish < start) {
18388 for (x = start; x <= finish; x++) {
18389 if (
conf->wanted_channels_start &&
18390 (x < conf->wanted_channels_start ||
18391 x >
conf->wanted_channels_end)
18401 (
reload == 1) ?
"reconfigure" :
"register",
value);
18415#define MAX_CHANLIST_LEN 80
18420 char *
params[DAHDI_MAX_ECHOCANPARAMS + 1];
18421 unsigned int param_count;
18433 if ((x == 32) || (x == 64) || (x == 128) || (x == 256) || (x == 512) || (x == 1024))
18440 for (x = 1; x < param_count; x++) {
18447 ast_log(
LOG_WARNING,
"Invalid echocancel parameter supplied at line %u: '%s'\n", line, params[x]);
18452 ast_log(
LOG_WARNING,
"Invalid echocancel parameter supplied at line %u: '%s'\n", line, param.name);
18460 ast_log(
LOG_WARNING,
"Invalid echocancel parameter value supplied at line %u: '%s'\n", line, param.value);
18468#if defined(HAVE_PRI)
18469#if defined(HAVE_PRI_DISPLAY_TEXT)
18479static unsigned long dahdi_display_text_option(
const char *
value)
18489 opt_str =
strsep(&val_str,
",");
18498 if (!strcasecmp(opt_str,
"block")) {
18499 options |= PRI_DISPLAY_OPTION_BLOCK;
18500 }
else if (!strcasecmp(opt_str,
"name_initial")) {
18501 options |= PRI_DISPLAY_OPTION_NAME_INITIAL;
18502 }
else if (!strcasecmp(opt_str,
"name_update")) {
18503 options |= PRI_DISPLAY_OPTION_NAME_UPDATE;
18504 }
else if (!strcasecmp(opt_str,
"name")) {
18505 options |= (PRI_DISPLAY_OPTION_NAME_INITIAL | PRI_DISPLAY_OPTION_NAME_UPDATE);
18506 }
else if (!strcasecmp(opt_str,
"text")) {
18507 options |= PRI_DISPLAY_OPTION_TEXT;
18515#if defined(HAVE_PRI)
18516#if defined(HAVE_PRI_DATETIME_SEND)
18526static int dahdi_datetime_send_option(
const char *
value)
18530 option = PRI_DATE_TIME_SEND_DEFAULT;
18533 option = PRI_DATE_TIME_SEND_NO;
18534 }
else if (!strcasecmp(
value,
"date")) {
18535 option = PRI_DATE_TIME_SEND_DATE;
18536 }
else if (!strcasecmp(
value,
"date_hh")) {
18537 option = PRI_DATE_TIME_SEND_DATE_HH;
18538 }
else if (!strcasecmp(
value,
"date_hhmm")) {
18539 option = PRI_DATE_TIME_SEND_DATE_HHMM;
18540 }
else if (!strcasecmp(
value,
"date_hhmmss")) {
18541 option = PRI_DATE_TIME_SEND_DATE_HHMMSS;
18550#define PROC_DAHDI_OPT_NOCHAN (1 << 0)
18552#define PROC_DAHDI_OPT_NOWARN (1 << 1)
18556 int count_pattern = 0;
18562 if (!sscanf(v->
value,
"%30d", &norval) && count_pattern == 0) {
18563 ast_log(
LOG_ERROR,
"busypattern= expects either busypattern=tonelength,quietlength or busypattern=t1length, q1length, t2length, q2length at line %d.\n", v->
lineno);
18567 busy_cadence->
pattern[count_pattern] = norval;
18570 if (count_pattern == 4) {
18574 temp = strchr(v->
value,
',');
18575 if (temp ==
NULL) {
18578 v->
value = temp + 1;
18580 busy_cadence->
length = count_pattern;
18582 if (count_pattern % 2 != 0) {
18584 ast_log(
LOG_ERROR,
"busypattern= expects either busypattern=tonelength,quietlength or busypattern=t1length, q1length, t2length, q2length at line %d.\n", v->
lineno);
18598 for (; v; v = v->
next) {
18603 if (!strcasecmp(v->
name,
"channel") || !strcasecmp(v->
name,
"channels")) {
18617 }
else if (!strcasecmp(v->
name,
"ignore_failed_channels")) {
18619 }
else if (!strcasecmp(v->
name,
"buffers")) {
18625 }
else if (!strcasecmp(v->
name,
"faxbuffers")) {
18629 }
else if (!strcasecmp(v->
name,
"dahdichan")) {
18632 }
else if (!strcasecmp(v->
name,
"usedistinctiveringdetection")) {
18634 }
else if (!strcasecmp(v->
name,
"distinctiveringaftercid")) {
18636 }
else if (!strcasecmp(v->
name,
"dring1context")) {
18638 }
else if (!strcasecmp(v->
name,
"dring2context")) {
18640 }
else if (!strcasecmp(v->
name,
"dring3context")) {
18642 }
else if (!strcasecmp(v->
name,
"dring1range")) {
18644 }
else if (!strcasecmp(v->
name,
"dring2range")) {
18646 }
else if (!strcasecmp(v->
name,
"dring3range")) {
18648 }
else if (!strcasecmp(v->
name,
"dring1")) {
18650 }
else if (!strcasecmp(v->
name,
"dring2")) {
18652 }
else if (!strcasecmp(v->
name,
"dring3")) {
18654 }
else if (!strcasecmp(v->
name,
"usecallerid")) {
18656 }
else if (!strcasecmp(v->
name,
"cidsignalling")) {
18657 if (!strcasecmp(v->
value,
"bell"))
18659 else if (!strcasecmp(v->
value,
"v23"))
18661 else if (!strcasecmp(v->
value,
"dtmf"))
18663 else if (!strcasecmp(v->
value,
"smdi"))
18665 else if (!strcasecmp(v->
value,
"v23_jp"))
18669 }
else if (!strcasecmp(v->
name,
"cidstart")) {
18670 if (!strcasecmp(v->
value,
"ring"))
18672 else if (!strcasecmp(v->
value,
"polarity_in"))
18674 else if (!strcasecmp(v->
value,
"polarity"))
18676 else if (!strcasecmp(v->
value,
"dtmf"))
18680 }
else if (!strcasecmp(v->
name,
"threewaycalling")) {
18682 }
else if (!strcasecmp(v->
name,
"threewaysilenthold")) {
18684 }
else if (!strcasecmp(v->
name,
"cancallforward")) {
18686 }
else if (!strcasecmp(v->
name,
"relaxdtmf")) {
18691 }
else if (!strcasecmp(v->
name,
"mailbox")) {
18693 }
else if (!strcasecmp(v->
name,
"description")) {
18695 }
else if (!strcasecmp(v->
name,
"adsi")) {
18697 }
else if (!strcasecmp(v->
name,
"usesmdi")) {
18699 }
else if (!strcasecmp(v->
name,
"smdiport")) {
18701 }
else if (!strcasecmp(v->
name,
"transfer")) {
18703 }
else if (!strcasecmp(v->
name,
"canpark")) {
18705 }
else if (!strcasecmp(v->
name,
"echocancelwhenbridged")) {
18707 }
else if (!strcasecmp(v->
name,
"busydetect")) {
18709 }
else if (!strcasecmp(v->
name,
"busycount")) {
18711 }
else if (!strcasecmp(v->
name,
"busypattern")) {
18713 }
else if (!strcasecmp(v->
name,
"calledsubscriberheld")) {
18715 }
else if (!strcasecmp(v->
name,
"lastnumredial")) {
18717 }
else if (!strcasecmp(v->
name,
"callprogress")) {
18721 }
else if (!strcasecmp(v->
name,
"waitfordialtone")) {
18723 }
else if (!strcasecmp(v->
name,
"dialtone_detect")) {
18724 if (!strcasecmp(v->
value,
"always")) {
18733 }
else if (!strcasecmp(v->
name,
"faxdetect")) {
18735 if (!strcasecmp(v->
value,
"incoming")) {
18737 }
else if (!strcasecmp(v->
value,
"outgoing")) {
18741 }
else if (!strcasecmp(v->
name,
"faxdetect_timeout")) {
18745 }
else if (!strcasecmp(v->
name,
"firstdigit_timeout")) {
18750 }
else if (!strcasecmp(v->
name,
"interdigit_timeout")) {
18755 }
else if (!strcasecmp(v->
name,
"matchdigit_timeout")) {
18760 }
else if (!strcasecmp(v->
name,
"echocancel")) {
18762 }
else if (!strcasecmp(v->
name,
"echotraining")) {
18763 if (sscanf(v->
value,
"%30d", &y) == 1) {
18764 if ((y < 10) || (y > 4000)) {
18773 }
else if (!strcasecmp(v->
name,
"hidecallerid")) {
18775 }
else if (!strcasecmp(v->
name,
"hidecalleridname")) {
18777 }
else if (!strcasecmp(v->
name,
"pulsedial")) {
18779 }
else if (!strcasecmp(v->
name,
"callreturn")) {
18781 }
else if (!strcasecmp(v->
name,
"callwaiting")) {
18783 }
else if (!strcasecmp(v->
name,
"callwaitingcallerid")) {
18785 }
else if (!strcasecmp(v->
name,
"callwaitingdeluxe")) {
18787 }
else if (!strcasecmp(v->
name,
"context")) {
18789 }
else if (!strcasecmp(v->
name,
"language")) {
18791 }
else if (!strcasecmp(v->
name,
"progzone")) {
18793 }
else if (!strcasecmp(v->
name,
"mohinterpret")
18794 ||!strcasecmp(v->
name,
"musiconhold") || !strcasecmp(v->
name,
"musicclass")) {
18796 }
else if (!strcasecmp(v->
name,
"mohsuggest")) {
18798 }
else if (!strcasecmp(v->
name,
"parkinglot")) {
18800 }
else if (!strcasecmp(v->
name,
"stripmsd")) {
18801 ast_log(
LOG_NOTICE,
"Configuration option \"%s\" has been deprecated. Please use dialplan instead\n", v->
name);
18803 }
else if (!strcasecmp(v->
name,
"jitterbuffers")) {
18805 }
else if (!strcasecmp(v->
name,
"group")) {
18807 }
else if (!strcasecmp(v->
name,
"callgroup")) {
18811 if (!strcasecmp(v->
value,
"none"))
18815 }
else if (!strcasecmp(v->
name,
"pickupgroup")) {
18819 if (!strcasecmp(v->
value,
"none"))
18823 }
else if (!strcasecmp(v->
name,
"namedcallgroup")) {
18825 ast_log(
LOG_WARNING,
"Only FXO signalled channels may belong to a named call group\n");
18828 }
else if (!strcasecmp(v->
name,
"namedpickupgroup")) {
18830 ast_log(
LOG_WARNING,
"Only FXO signalled channels may belong to a named pickup group\n");
18833 }
else if (!strcasecmp(v->
name,
"setvar")) {
18835 char *varval =
NULL;
18837 char varname[strlen(v->
value) + 1];
18838 strcpy(varname, v->
value);
18839 if ((varval = strchr(varname,
'='))) {
18849 }
else if (!strcasecmp(v->
name,
"immediate")) {
18851 }
else if (!strcasecmp(v->
name,
"immediatering")) {
18853 }
else if (!strcasecmp(v->
name,
"transfertobusy")) {
18855 }
else if (!strcasecmp(v->
name,
"dialmode")) {
18856 if (!strcasecmp(v->
value,
"pulse")) {
18858 }
else if (!strcasecmp(v->
value,
"dtmf") || !strcasecmp(v->
value,
"tone")) {
18860 }
else if (!strcasecmp(v->
value,
"none")) {
18865 }
else if (!strcasecmp(v->
name,
"mwimonitor")) {
18882 }
else if (!strcasecmp(v->
name,
"hwrxgain")) {
18884 if (strcasecmp(v->
value,
"disabled")) {
18891 }
else if (!strcasecmp(v->
name,
"hwtxgain")) {
18893 if (strcasecmp(v->
value,
"disabled")) {
18900 }
else if (!strcasecmp(v->
name,
"cid_rxgain")) {
18904 }
else if (!strcasecmp(v->
name,
"rxgain")) {
18908 }
else if (!strcasecmp(v->
name,
"txgain")) {
18912 }
else if (!strcasecmp(v->
name,
"txdrc")) {
18916 }
else if (!strcasecmp(v->
name,
"rxdrc")) {
18920 }
else if (!strcasecmp(v->
name,
"tonezone")) {
18924 }
else if (!strcasecmp(v->
name,
"callerid")) {
18925 if (!strcasecmp(v->
value,
"asreceived")) {
18931 }
else if (!strcasecmp(v->
name,
"fullname")) {
18933 }
else if (!strcasecmp(v->
name,
"cid_number")) {
18935 }
else if (!strcasecmp(v->
name,
"cid_tag")) {
18937 }
else if (!strcasecmp(v->
name,
"useincomingcalleridondahditransfer")) {
18939 }
else if (!strcasecmp(v->
name,
"restrictcid")) {
18941 }
else if (!strcasecmp(v->
name,
"usecallingpres")) {
18943 }
else if (!strcasecmp(v->
name,
"accountcode")) {
18945 }
else if (!strcasecmp(v->
name,
"amaflags")) {
18951 }
else if (!strcasecmp(v->
name,
"polarityonanswerdelay")) {
18953 }
else if (!strcasecmp(v->
name,
"answeronpolarityswitch")) {
18955 }
else if (!strcasecmp(v->
name,
"ani_info_digits")) {
18957 }
else if (!strcasecmp(v->
name,
"ani_wink_time")) {
18959 }
else if (!strcasecmp(v->
name,
"ani_timeout")) {
18961 }
else if (!strcasecmp(v->
name,
"hanguponpolarityswitch")) {
18963 }
else if (!strcasecmp(v->
name,
"autoreoriginate")) {
18965 }
else if (!strcasecmp(v->
name,
"sendcalleridafter")) {
18967 }
else if (!strcasecmp(v->
name,
"mwimonitornotify")) {
18971 }
else if (!strcasecmp(v->
name,
"mwisendtype")) {
18972#ifndef HAVE_DAHDI_LINEREVERSE_VMWI
18973 if (!strcasecmp(v->
value,
"rpas")) {
18980 memset(&confp->
chan.mwisend_setting, 0,
sizeof(confp->
chan.mwisend_setting));
18982 confp->
chan.mwisend_fsk = 0;
18984 confp->
chan.mwisend_fsk = 1;
18987 confp->
chan.mwisend_rpas = 1;
18989 confp->
chan.mwisend_rpas = 0;
18992 confp->
chan.mwisend_setting.vmwi_type |= DAHDI_VMWI_LREV;
18995 confp->
chan.mwisend_setting.vmwi_type |= DAHDI_VMWI_HVDC;
18998 confp->
chan.mwisend_setting.vmwi_type |= DAHDI_VMWI_HVAC;
19001 }
else if (
reload != 1) {
19002 if (!strcasecmp(v->
name,
"signalling") || !strcasecmp(v->
name,
"signaling")) {
19010 if (!strcasecmp(v->
value,
"em")) {
19012 }
else if (!strcasecmp(v->
value,
"em_e1")) {
19014 }
else if (!strcasecmp(v->
value,
"em_w")) {
19016 }
else if (!strcasecmp(v->
value,
"fxs_ls")) {
19018 }
else if (!strcasecmp(v->
value,
"fxs_gs")) {
19020 }
else if (!strcasecmp(v->
value,
"fxs_ks")) {
19022 }
else if (!strcasecmp(v->
value,
"fxo_ls")) {
19024 }
else if (!strcasecmp(v->
value,
"fxo_gs")) {
19026 }
else if (!strcasecmp(v->
value,
"fxo_ks")) {
19028 }
else if (!strcasecmp(v->
value,
"fxs_rx")) {
19031 }
else if (!strcasecmp(v->
value,
"fxo_rx")) {
19034 }
else if (!strcasecmp(v->
value,
"fxs_tx")) {
19037 }
else if (!strcasecmp(v->
value,
"fxo_tx")) {
19040 }
else if (!strcasecmp(v->
value,
"em_rx")) {
19043 }
else if (!strcasecmp(v->
value,
"em_tx")) {
19046 }
else if (!strcasecmp(v->
value,
"em_rxtx")) {
19049 }
else if (!strcasecmp(v->
value,
"em_txrx")) {
19052 }
else if (!strcasecmp(v->
value,
"sf")) {
19054 }
else if (!strcasecmp(v->
value,
"sf_w")) {
19056 }
else if (!strcasecmp(v->
value,
"sf_featd")) {
19058 }
else if (!strcasecmp(v->
value,
"sf_featdmf")) {
19060 }
else if (!strcasecmp(v->
value,
"sf_featb")) {
19062 }
else if (!strcasecmp(v->
value,
"sf")) {
19064 }
else if (!strcasecmp(v->
value,
"sf_rx")) {
19067 }
else if (!strcasecmp(v->
value,
"sf_tx")) {
19070 }
else if (!strcasecmp(v->
value,
"sf_rxtx")) {
19073 }
else if (!strcasecmp(v->
value,
"sf_txrx")) {
19076 }
else if (!strcasecmp(v->
value,
"featd")) {
19078 }
else if (!strcasecmp(v->
value,
"featdmf")) {
19080 }
else if (!strcasecmp(v->
value,
"featdmf_ta")) {
19082 }
else if (!strcasecmp(v->
value,
"e911")) {
19084 }
else if (!strcasecmp(v->
value,
"fgccama")) {
19086 }
else if (!strcasecmp(v->
value,
"fgccamamf")) {
19088 }
else if (!strcasecmp(v->
value,
"featb")) {
19091 }
else if (!strcasecmp(v->
value,
"pri_net")) {
19093 confp->pri.pri.nodetype = PRI_NETWORK;
19094 }
else if (!strcasecmp(v->
value,
"pri_cpe")) {
19096 confp->pri.pri.nodetype = PRI_CPE;
19097 }
else if (!strcasecmp(v->
value,
"bri_cpe")) {
19099 confp->pri.pri.nodetype = PRI_CPE;
19100 }
else if (!strcasecmp(v->
value,
"bri_net")) {
19102 confp->pri.pri.nodetype = PRI_NETWORK;
19103 }
else if (!strcasecmp(v->
value,
"bri_cpe_ptmp")) {
19105 confp->pri.pri.nodetype = PRI_CPE;
19106 }
else if (!strcasecmp(v->
value,
"bri_net_ptmp")) {
19107#if defined(HAVE_PRI_CALL_HOLD)
19109 confp->pri.pri.nodetype = PRI_NETWORK;
19111 ast_log(
LOG_WARNING,
"How cool would it be if someone implemented this mode! For now, sucks for you. (line %d)\n", v->
lineno);
19114#if defined(HAVE_SS7)
19115 }
else if (!strcasecmp(v->
value,
"ss7")) {
19119 }
else if (!strcasecmp(v->
value,
"mfcr2")) {
19122 }
else if (!strcasecmp(v->
value,
"auto")) {
19130 }
else if (!strcasecmp(v->
name,
"outsignalling") || !strcasecmp(v->
name,
"outsignaling")) {
19131 if (!strcasecmp(v->
value,
"em")) {
19133 }
else if (!strcasecmp(v->
value,
"em_e1")) {
19135 }
else if (!strcasecmp(v->
value,
"em_w")) {
19137 }
else if (!strcasecmp(v->
value,
"sf")) {
19139 }
else if (!strcasecmp(v->
value,
"sf_w")) {
19141 }
else if (!strcasecmp(v->
value,
"sf_featd")) {
19143 }
else if (!strcasecmp(v->
value,
"sf_featdmf")) {
19145 }
else if (!strcasecmp(v->
value,
"sf_featb")) {
19147 }
else if (!strcasecmp(v->
value,
"sf")) {
19149 }
else if (!strcasecmp(v->
value,
"featd")) {
19151 }
else if (!strcasecmp(v->
value,
"featdmf")) {
19153 }
else if (!strcasecmp(v->
value,
"featdmf_ta")) {
19155 }
else if (!strcasecmp(v->
value,
"e911")) {
19157 }
else if (!strcasecmp(v->
value,
"fgccama")) {
19159 }
else if (!strcasecmp(v->
value,
"fgccamamf")) {
19161 }
else if (!strcasecmp(v->
value,
"featb")) {
19167 }
else if (!strcasecmp(v->
name,
"pridialplan")) {
19168 if (!strcasecmp(v->
value,
"national")) {
19169 confp->pri.pri.dialplan = PRI_NATIONAL_ISDN + 1;
19170 }
else if (!strcasecmp(v->
value,
"unknown")) {
19171 confp->pri.pri.dialplan = PRI_UNKNOWN + 1;
19172 }
else if (!strcasecmp(v->
value,
"private")) {
19173 confp->pri.pri.dialplan = PRI_PRIVATE + 1;
19174 }
else if (!strcasecmp(v->
value,
"international")) {
19175 confp->pri.pri.dialplan = PRI_INTERNATIONAL_ISDN + 1;
19176 }
else if (!strcasecmp(v->
value,
"local")) {
19177 confp->pri.pri.dialplan = PRI_LOCAL_ISDN + 1;
19178 }
else if (!strcasecmp(v->
value,
"dynamic")) {
19179 confp->pri.pri.dialplan = -1;
19180 }
else if (!strcasecmp(v->
value,
"redundant")) {
19181 confp->pri.pri.dialplan = -2;
19185 }
else if (!strcasecmp(v->
name,
"prilocaldialplan")) {
19186 if (!strcasecmp(v->
value,
"national")) {
19187 confp->pri.pri.localdialplan = PRI_NATIONAL_ISDN + 1;
19188 }
else if (!strcasecmp(v->
value,
"unknown")) {
19189 confp->pri.pri.localdialplan = PRI_UNKNOWN + 1;
19190 }
else if (!strcasecmp(v->
value,
"private")) {
19191 confp->pri.pri.localdialplan = PRI_PRIVATE + 1;
19192 }
else if (!strcasecmp(v->
value,
"international")) {
19193 confp->pri.pri.localdialplan = PRI_INTERNATIONAL_ISDN + 1;
19194 }
else if (!strcasecmp(v->
value,
"local")) {
19195 confp->pri.pri.localdialplan = PRI_LOCAL_ISDN + 1;
19196 }
else if (!strcasecmp(v->
value,
"from_channel")) {
19197 confp->pri.pri.localdialplan = 0;
19198 }
else if (!strcasecmp(v->
value,
"dynamic")) {
19199 confp->pri.pri.localdialplan = -1;
19200 }
else if (!strcasecmp(v->
value,
"redundant")) {
19201 confp->pri.pri.localdialplan = -2;
19205 }
else if (!strcasecmp(v->
name,
"pricpndialplan")) {
19206 if (!strcasecmp(v->
value,
"national")) {
19207 confp->pri.pri.cpndialplan = PRI_NATIONAL_ISDN + 1;
19208 }
else if (!strcasecmp(v->
value,
"unknown")) {
19209 confp->pri.pri.cpndialplan = PRI_UNKNOWN + 1;
19210 }
else if (!strcasecmp(v->
value,
"private")) {
19211 confp->pri.pri.cpndialplan = PRI_PRIVATE + 1;
19212 }
else if (!strcasecmp(v->
value,
"international")) {
19213 confp->pri.pri.cpndialplan = PRI_INTERNATIONAL_ISDN + 1;
19214 }
else if (!strcasecmp(v->
value,
"local")) {
19215 confp->pri.pri.cpndialplan = PRI_LOCAL_ISDN + 1;
19216 }
else if (!strcasecmp(v->
value,
"from_channel")) {
19217 confp->pri.pri.cpndialplan = 0;
19218 }
else if (!strcasecmp(v->
value,
"dynamic")) {
19219 confp->pri.pri.cpndialplan = -1;
19220 }
else if (!strcasecmp(v->
value,
"redundant")) {
19221 confp->pri.pri.cpndialplan = -2;
19225 }
else if (!strcasecmp(v->
name,
"switchtype")) {
19226 if (!strcasecmp(v->
value,
"national"))
19227 confp->pri.pri.switchtype = PRI_SWITCH_NI2;
19228 else if (!strcasecmp(v->
value,
"ni1"))
19229 confp->pri.pri.switchtype = PRI_SWITCH_NI1;
19230 else if (!strcasecmp(v->
value,
"dms100"))
19231 confp->pri.pri.switchtype = PRI_SWITCH_DMS100;
19232 else if (!strcasecmp(v->
value,
"4ess"))
19233 confp->pri.pri.switchtype = PRI_SWITCH_ATT4ESS;
19234 else if (!strcasecmp(v->
value,
"5ess"))
19235 confp->pri.pri.switchtype = PRI_SWITCH_LUCENT5E;
19236 else if (!strcasecmp(v->
value,
"euroisdn"))
19237 confp->pri.pri.switchtype = PRI_SWITCH_EUROISDN_E1;
19238 else if (!strcasecmp(v->
value,
"qsig"))
19239 confp->pri.pri.switchtype = PRI_SWITCH_QSIG;
19244 }
else if (!strcasecmp(v->
name,
"msn")) {
19246 sizeof(confp->pri.pri.msn_list));
19247 }
else if (!strcasecmp(v->
name,
"nsf")) {
19248 if (!strcasecmp(v->
value,
"sdn"))
19249 confp->pri.pri.nsf = PRI_NSF_SDN;
19250 else if (!strcasecmp(v->
value,
"megacom"))
19251 confp->pri.pri.nsf = PRI_NSF_MEGACOM;
19252 else if (!strcasecmp(v->
value,
"tollfreemegacom"))
19253 confp->pri.pri.nsf = PRI_NSF_TOLL_FREE_MEGACOM;
19254 else if (!strcasecmp(v->
value,
"accunet"))
19255 confp->pri.pri.nsf = PRI_NSF_ACCUNET;
19256 else if (!strcasecmp(v->
value,
"none"))
19257 confp->pri.pri.nsf = PRI_NSF_NONE;
19260 confp->pri.pri.nsf = PRI_NSF_NONE;
19262 }
else if (!strcasecmp(v->
name,
"priindication")) {
19263 if (!strcasecmp(v->
value,
"outofband"))
19265 else if (!strcasecmp(v->
value,
"inband"))
19268 ast_log(
LOG_WARNING,
"'%s' is not a valid pri indication value, should be 'inband' or 'outofband' at line %d.\n",
19270 }
else if (!strcasecmp(v->
name,
"priexclusive")) {
19272 }
else if (!strcasecmp(v->
name,
"internationalprefix")) {
19273 ast_copy_string(confp->pri.pri.internationalprefix, v->
value,
sizeof(confp->pri.pri.internationalprefix));
19274 }
else if (!strcasecmp(v->
name,
"nationalprefix")) {
19275 ast_copy_string(confp->pri.pri.nationalprefix, v->
value,
sizeof(confp->pri.pri.nationalprefix));
19276 }
else if (!strcasecmp(v->
name,
"localprefix")) {
19278 }
else if (!strcasecmp(v->
name,
"privateprefix")) {
19279 ast_copy_string(confp->pri.pri.privateprefix, v->
value,
sizeof(confp->pri.pri.privateprefix));
19280 }
else if (!strcasecmp(v->
name,
"unknownprefix")) {
19281 ast_copy_string(confp->pri.pri.unknownprefix, v->
value,
sizeof(confp->pri.pri.unknownprefix));
19282 }
else if (!strcasecmp(v->
name,
"resetinterval")) {
19283 if (!strcasecmp(v->
value,
"never"))
19284 confp->pri.pri.resetinterval = -1;
19285 else if (atoi(v->
value) >= 60)
19286 confp->pri.pri.resetinterval = atoi(v->
value);
19288 ast_log(
LOG_WARNING,
"'%s' is not a valid reset interval, should be >= 60 seconds or 'never' at line %d.\n",
19290 }
else if (!strcasecmp(v->
name,
"force_restart_unavailable_chans")) {
19291 confp->pri.pri.force_restart_unavailable_chans =
ast_true(v->
value);
19292 }
else if (!strcasecmp(v->
name,
"minunused")) {
19293 confp->pri.pri.minunused = atoi(v->
value);
19294 }
else if (!strcasecmp(v->
name,
"minidle")) {
19295 confp->pri.pri.minidle = atoi(v->
value);
19296 }
else if (!strcasecmp(v->
name,
"idleext")) {
19298 }
else if (!strcasecmp(v->
name,
"idledial")) {
19300 }
else if (!strcasecmp(v->
name,
"overlapdial")) {
19303 }
else if (!strcasecmp(v->
value,
"incoming")) {
19305 }
else if (!strcasecmp(v->
value,
"outgoing")) {
19312#ifdef HAVE_PRI_PROG_W_CAUSE
19313 }
else if (!strcasecmp(v->
name,
"qsigchannelmapping")) {
19314 if (!strcasecmp(v->
value,
"logical")) {
19316 }
else if (!strcasecmp(v->
value,
"physical")) {
19322 }
else if (!strcasecmp(v->
name,
"discardremoteholdretrieval")) {
19323 confp->pri.pri.discardremoteholdretrieval =
ast_true(v->
value);
19324#if defined(HAVE_PRI_SERVICE_MESSAGES)
19325 }
else if (!strcasecmp(v->
name,
"service_message_support")) {
19327 if ((confp->pri.pri.switchtype == PRI_SWITCH_ATT4ESS
19328 || confp->pri.pri.switchtype == PRI_SWITCH_LUCENT5E
19329 || confp->pri.pri.switchtype == PRI_SWITCH_NI2) &&
ast_true(v->
value)) {
19330 confp->pri.pri.enable_service_message_support = 1;
19332 confp->pri.pri.enable_service_message_support = 0;
19335#ifdef HAVE_PRI_INBANDDISCONNECT
19336 }
else if (!strcasecmp(v->
name,
"inbanddisconnect")) {
19339 }
else if (!strcasecmp(v->
name,
"pritimer")) {
19340#ifdef PRI_GETSET_TIMERS
19351 timeridx = pri_timer2idx(timerc);
19353 if (timeridx < 0 || PRI_MAX_TIMERS <= timeridx) {
19355 "'%s' is not a valid ISDN timer at line %d.\n", timerc,
19357 }
else if (!
timer) {
19359 "'%s' is not a valid value for ISDN timer '%s' at line %d.\n",
19362 confp->pri.pri.pritimers[timeridx] =
timer;
19366 "'%s' is not a valid ISDN timer configuration string at line %d.\n",
19370 }
else if (!strcasecmp(v->
name,
"facilityenable")) {
19372#if defined(HAVE_PRI_AOC_EVENTS)
19373 }
else if (!strcasecmp(v->
name,
"aoc_enable")) {
19374 confp->pri.pri.aoc_passthrough_flag = 0;
19375 if (strchr(v->
value,
's') || strchr(v->
value,
'S')) {
19378 if (strchr(v->
value,
'd') || strchr(v->
value,
'D')) {
19381 if (strchr(v->
value,
'e') || strchr(v->
value,
'E')) {
19384 }
else if (!strcasecmp(v->
name,
"aoce_delayhangup")) {
19387#if defined(HAVE_PRI_CALL_HOLD)
19388 }
else if (!strcasecmp(v->
name,
"hold_disconnect_transfer")) {
19389 confp->pri.pri.hold_disconnect_transfer =
ast_true(v->
value);
19391 }
else if (!strcasecmp(v->
name,
"moh_signaling")
19392 || !strcasecmp(v->
name,
"moh_signalling")) {
19393 if (!strcasecmp(v->
value,
"moh")) {
19395 }
else if (!strcasecmp(v->
value,
"notify")) {
19397#if defined(HAVE_PRI_CALL_HOLD)
19398 }
else if (!strcasecmp(v->
value,
"hold")) {
19399 confp->pri.pri.moh_signaling = SIG_PRI_MOH_SIGNALING_HOLD;
19404#if defined(HAVE_PRI_CCSS)
19405 }
else if (!strcasecmp(v->
name,
"cc_ptmp_recall_mode")) {
19406 if (!strcasecmp(v->
value,
"global")) {
19407 confp->pri.pri.cc_ptmp_recall_mode = 0;
19408 }
else if (!strcasecmp(v->
value,
"specific")) {
19409 confp->pri.pri.cc_ptmp_recall_mode = 1;
19411 confp->pri.pri.cc_ptmp_recall_mode = 1;
19413 }
else if (!strcasecmp(v->
name,
"cc_qsig_signaling_link_req")) {
19414 if (!strcasecmp(v->
value,
"release")) {
19415 confp->pri.pri.cc_qsig_signaling_link_req = 0;
19416 }
else if (!strcasecmp(v->
value,
"retain")) {
19417 confp->pri.pri.cc_qsig_signaling_link_req = 1;
19418 }
else if (!strcasecmp(v->
value,
"do_not_care")) {
19419 confp->pri.pri.cc_qsig_signaling_link_req = 2;
19421 confp->pri.pri.cc_qsig_signaling_link_req = 1;
19423 }
else if (!strcasecmp(v->
name,
"cc_qsig_signaling_link_rsp")) {
19424 if (!strcasecmp(v->
value,
"release")) {
19425 confp->pri.pri.cc_qsig_signaling_link_rsp = 0;
19426 }
else if (!strcasecmp(v->
value,
"retain")) {
19427 confp->pri.pri.cc_qsig_signaling_link_rsp = 1;
19429 confp->pri.pri.cc_qsig_signaling_link_rsp = 1;
19432#if defined(HAVE_PRI_CALL_WAITING)
19433 }
else if (!strcasecmp(v->
name,
"max_call_waiting_calls")) {
19434 confp->pri.pri.max_call_waiting_calls = atoi(v->
value);
19435 if (confp->pri.pri.max_call_waiting_calls < 0) {
19437 confp->pri.pri.max_call_waiting_calls = 0;
19439 }
else if (!strcasecmp(v->
name,
"allow_call_waiting_calls")) {
19440 confp->pri.pri.allow_call_waiting_calls =
ast_true(v->
value);
19442#if defined(HAVE_PRI_MWI)
19443 }
else if (!strcasecmp(v->
name,
"mwi_mailboxes")) {
19445 sizeof(confp->pri.pri.mwi_mailboxes));
19446 }
else if (!strcasecmp(v->
name,
"mwi_vm_boxes")) {
19448 sizeof(confp->pri.pri.mwi_vm_boxes));
19449 }
else if (!strcasecmp(v->
name,
"mwi_vm_numbers")) {
19451 sizeof(confp->pri.pri.mwi_vm_numbers));
19453 }
else if (!strcasecmp(v->
name,
"append_msn_to_cid_tag")) {
19454 confp->pri.pri.append_msn_to_user_tag =
ast_true(v->
value);
19455 }
else if (!strcasecmp(v->
name,
"inband_on_setup_ack")) {
19457 }
else if (!strcasecmp(v->
name,
"inband_on_proceeding")) {
19459#if defined(HAVE_PRI_DISPLAY_TEXT)
19460 }
else if (!strcasecmp(v->
name,
"display_send")) {
19461 confp->pri.pri.display_flags_send = dahdi_display_text_option(v->
value);
19462 }
else if (!strcasecmp(v->
name,
"display_receive")) {
19463 confp->pri.pri.display_flags_receive = dahdi_display_text_option(v->
value);
19465#if defined(HAVE_PRI_MCID)
19466 }
else if (!strcasecmp(v->
name,
"mcid_send")) {
19469#if defined(HAVE_PRI_DATETIME_SEND)
19470 }
else if (!strcasecmp(v->
name,
"datetime_send")) {
19471 confp->pri.pri.datetime_send = dahdi_datetime_send_option(v->
value);
19473 }
else if (!strcasecmp(v->
name,
"layer1_presence")) {
19474 if (!strcasecmp(v->
value,
"required")) {
19475 confp->pri.pri.layer1_ignored = 0;
19476 }
else if (!strcasecmp(v->
value,
"ignore")) {
19477 confp->pri.pri.layer1_ignored = 1;
19480 confp->pri.pri.layer1_ignored = 0;
19482#if defined(HAVE_PRI_L2_PERSISTENCE)
19483 }
else if (!strcasecmp(v->
name,
"layer2_persistence")) {
19484 if (!strcasecmp(v->
value,
"keep_up")) {
19485 confp->pri.pri.l2_persistence = PRI_L2_PERSISTENCE_KEEP_UP;
19486 }
else if (!strcasecmp(v->
value,
"leave_down")) {
19487 confp->pri.pri.l2_persistence = PRI_L2_PERSISTENCE_LEAVE_DOWN;
19489 confp->pri.pri.l2_persistence = PRI_L2_PERSISTENCE_DEFAULT;
19492 }
else if (!strcasecmp(v->
name,
"colp_send")) {
19493 if (!strcasecmp(v->
value,
"block")) {
19495 }
else if (!strcasecmp(v->
value,
"connect")) {
19497 }
else if (!strcasecmp(v->
value,
"update")) {
19503#if defined(HAVE_SS7)
19504 }
else if (!strcasecmp(v->
name,
"ss7type")) {
19505 if (!strcasecmp(v->
value,
"itu")) {
19506 cur_ss7type = SS7_ITU;
19507 }
else if (!strcasecmp(v->
value,
"ansi")) {
19508 cur_ss7type = SS7_ANSI;
19512 }
else if (!strcasecmp(v->
name,
"slc")) {
19513 cur_slc = atoi(v->
value);
19514 }
else if (!strcasecmp(v->
name,
"linkset")) {
19515 cur_linkset = atoi(v->
value);
19516 }
else if (!strcasecmp(v->
name,
"pointcode")) {
19517 cur_pointcode = parse_pointcode(v->
value);
19518 }
else if (!strcasecmp(v->
name,
"adjpointcode")) {
19519 cur_adjpointcode = parse_pointcode(v->
value);
19520 }
else if (!strcasecmp(v->
name,
"defaultdpc")) {
19521 cur_defaultdpc = parse_pointcode(v->
value);
19522 }
else if (!strcasecmp(v->
name,
"cicbeginswith")) {
19523 cur_cicbeginswith = atoi(v->
value);
19524 }
else if (!strcasecmp(v->
name,
"networkindicator")) {
19525 if (!strcasecmp(v->
value,
"national")) {
19526 cur_networkindicator = SS7_NI_NAT;
19527 }
else if (!strcasecmp(v->
value,
"national_spare")) {
19528 cur_networkindicator = SS7_NI_NAT_SPARE;
19529 }
else if (!strcasecmp(v->
value,
"international")) {
19530 cur_networkindicator = SS7_NI_INT;
19531 }
else if (!strcasecmp(v->
value,
"international_spare")) {
19532 cur_networkindicator = SS7_NI_INT_SPARE;
19534 cur_networkindicator = -1;
19536 }
else if (!strcasecmp(v->
name,
"ss7_internationalprefix")) {
19537 ast_copy_string(confp->ss7.ss7.internationalprefix, v->
value,
sizeof(confp->ss7.ss7.internationalprefix));
19538 }
else if (!strcasecmp(v->
name,
"ss7_nationalprefix")) {
19539 ast_copy_string(confp->ss7.ss7.nationalprefix, v->
value,
sizeof(confp->ss7.ss7.nationalprefix));
19540 }
else if (!strcasecmp(v->
name,
"ss7_subscriberprefix")) {
19541 ast_copy_string(confp->ss7.ss7.subscriberprefix, v->
value,
sizeof(confp->ss7.ss7.subscriberprefix));
19542 }
else if (!strcasecmp(v->
name,
"ss7_unknownprefix")) {
19543 ast_copy_string(confp->ss7.ss7.unknownprefix, v->
value,
sizeof(confp->ss7.ss7.unknownprefix));
19544 }
else if (!strcasecmp(v->
name,
"ss7_networkroutedprefix")) {
19545 ast_copy_string(confp->ss7.ss7.networkroutedprefix, v->
value,
sizeof(confp->ss7.ss7.networkroutedprefix));
19546 }
else if (!strcasecmp(v->
name,
"ss7_called_nai")) {
19547 if (!strcasecmp(v->
value,
"national")) {
19548 confp->ss7.ss7.called_nai = SS7_NAI_NATIONAL;
19549 }
else if (!strcasecmp(v->
value,
"international")) {
19550 confp->ss7.ss7.called_nai = SS7_NAI_INTERNATIONAL;
19551 }
else if (!strcasecmp(v->
value,
"subscriber")) {
19552 confp->ss7.ss7.called_nai = SS7_NAI_SUBSCRIBER;
19553 }
else if (!strcasecmp(v->
value,
"unknown")) {
19554 confp->ss7.ss7.called_nai = SS7_NAI_UNKNOWN;
19555 }
else if (!strcasecmp(v->
value,
"dynamic")) {
19560 }
else if (!strcasecmp(v->
name,
"ss7_calling_nai")) {
19561 if (!strcasecmp(v->
value,
"national")) {
19562 confp->ss7.ss7.calling_nai = SS7_NAI_NATIONAL;
19563 }
else if (!strcasecmp(v->
value,
"international")) {
19564 confp->ss7.ss7.calling_nai = SS7_NAI_INTERNATIONAL;
19565 }
else if (!strcasecmp(v->
value,
"subscriber")) {
19566 confp->ss7.ss7.calling_nai = SS7_NAI_SUBSCRIBER;
19567 }
else if (!strcasecmp(v->
value,
"unknown")) {
19568 confp->ss7.ss7.calling_nai = SS7_NAI_UNKNOWN;
19569 }
else if (!strcasecmp(v->
value,
"dynamic")) {
19574 }
else if (!strcasecmp(v->
name,
"sigchan")) {
19576 sigchan = atoi(v->
value);
19577 res = linkset_addsigchan(sigchan);
19581 }
else if (!strcasecmp(v->
name,
"ss7_explicitacm")) {
19582 struct dahdi_ss7 *link;
19583 link = ss7_resolve_linkset(cur_linkset);
19591 link->ss7.flags &= ~LINKSET_FLAG_EXPLICITACM;
19593 }
else if (!strcasecmp(v->
name,
"ss7_autoacm")) {
19594 struct dahdi_ss7 *link;
19595 link = ss7_resolve_linkset(cur_linkset);
19603 link->ss7.flags &= ~LINKSET_FLAG_AUTOACM;
19605 }
else if (!strcasecmp(v->
name,
"ss7_initialhwblo")) {
19606 struct dahdi_ss7 *link;
19607 link = ss7_resolve_linkset(cur_linkset);
19615 link->ss7.flags &= ~LINKSET_FLAG_INITIALHWBLO;
19617 }
else if (!strcasecmp(v->
name,
"ss7_use_echocontrol")) {
19618 struct dahdi_ss7 *link;
19619 link = ss7_resolve_linkset(cur_linkset);
19627 link->ss7.flags &= ~LINKSET_FLAG_USEECHOCONTROL;
19629 }
else if (!strcasecmp(v->
name,
"ss7_default_echocontrol")) {
19630 struct dahdi_ss7 *link;
19631 link = ss7_resolve_linkset(cur_linkset);
19639 link->ss7.flags &= ~LINKSET_FLAG_DEFAULTECHOCONTROL;
19641 }
else if (!strncasecmp(v->
name,
"isup_timer.", 11)) {
19642 struct dahdi_ss7 *link;
19643 link = ss7_resolve_linkset(cur_linkset);
19648 if (!link->ss7.ss7) {
19650 }
else if (!ss7_set_isup_timer(link->ss7.ss7, strstr(v->
name,
".") + 1, atoi(v->
value))) {
19653 }
else if (!strncasecmp(v->
name,
"mtp3_timer.", 11)) {
19654 struct dahdi_ss7 *link;
19655 link = ss7_resolve_linkset(cur_linkset);
19660 if (!link->ss7.ss7) {
19662 }
else if (!ss7_set_mtp3_timer(link->ss7.ss7, strstr(v->
name,
".") + 1, atoi(v->
value))) {
19665 }
else if (!strcasecmp(v->
name,
"inr_if_no_calling")) {
19666 struct dahdi_ss7 *link;
19667 link = ss7_resolve_linkset(cur_linkset);
19672 if (!link->ss7.ss7) {
19675 ss7_set_flags(link->ss7.ss7, SS7_INR_IF_NO_CALLING);
19677 ss7_clear_flags(link->ss7.ss7, SS7_INR_IF_NO_CALLING);
19679 }
else if (!strcasecmp(v->
name,
"non_isdn_access")) {
19680 struct dahdi_ss7 *link;
19681 link = ss7_resolve_linkset(cur_linkset);
19686 if (!link->ss7.ss7) {
19689 ss7_clear_flags(link->ss7.ss7, SS7_ISDN_ACCESS_INDICATOR);
19691 ss7_set_flags(link->ss7.ss7, SS7_ISDN_ACCESS_INDICATOR);
19693 }
else if (!strcasecmp(v->
name,
"sls_shift")) {
19694 struct dahdi_ss7 *link;
19695 int sls_shift = atoi(v->
value);
19697 if (sls_shift < 0 || sls_shift > 7) {
19702 link = ss7_resolve_linkset(cur_linkset);
19707 if (!link->ss7.ss7) {
19710 ss7_set_sls_shift(link->ss7.ss7, sls_shift);
19712 }
else if (!strcasecmp(v->
name,
"cause_location")) {
19713 struct dahdi_ss7 *link;
19714 int cause_location = atoi(v->
value);
19716 if (cause_location < 0 || cause_location > 15) {
19717 ast_log(
LOG_ERROR,
"Invalid cause_location value. Must be between 0 and 15\n");
19720 link = ss7_resolve_linkset(cur_linkset);
19725 if (!link->ss7.ss7) {
19728 ss7_set_cause_location(link->ss7.ss7, cause_location);
19732 }
else if (!strcasecmp(v->
name,
"mfcr2_advanced_protocol_file")) {
19734 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);
19735 }
else if (!strcasecmp(v->
name,
"mfcr2_logdir")) {
19737 }
else if (!strcasecmp(v->
name,
"mfcr2_variant")) {
19738 confp->mfcr2.variant = openr2_proto_get_variant(v->
value);
19739 if (OR2_VAR_UNKNOWN == confp->mfcr2.variant) {
19741 confp->mfcr2.variant = OR2_VAR_ITU;
19743 }
else if (!strcasecmp(v->
name,
"mfcr2_mfback_timeout")) {
19744 confp->mfcr2.mfback_timeout = atoi(v->
value);
19745 if (!confp->mfcr2.mfback_timeout) {
19746 ast_log(
LOG_WARNING,
"MF timeout of 0? hum, I will protect you from your ignorance. Setting default.\n");
19747 confp->mfcr2.mfback_timeout = -1;
19748 }
else if (confp->mfcr2.mfback_timeout > 0 && confp->mfcr2.mfback_timeout < 500) {
19749 ast_log(
LOG_WARNING,
"MF timeout less than 500ms is not recommended, you have been warned!\n");
19751 }
else if (!strcasecmp(v->
name,
"mfcr2_metering_pulse_timeout")) {
19752 confp->mfcr2.metering_pulse_timeout = atoi(v->
value);
19753 if (confp->mfcr2.metering_pulse_timeout > 500) {
19754 ast_log(
LOG_WARNING,
"Metering pulse timeout greater than 500ms is not recommended, you have been warned!\n");
19756#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 2
19757 }
else if (!strcasecmp(v->
name,
"mfcr2_dtmf_detection")) {
19759 }
else if (!strcasecmp(v->
name,
"mfcr2_dtmf_dialing")) {
19761 }
else if (!strcasecmp(v->
name,
"mfcr2_dtmf_time_on")) {
19762 confp->mfcr2.dtmf_time_on = atoi(v->
value);
19763 }
else if (!strcasecmp(v->
name,
"mfcr2_dtmf_time_off")) {
19764 confp->mfcr2.dtmf_time_off = atoi(v->
value);
19766#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 3
19767 }
else if (!strcasecmp(v->
name,
"mfcr2_dtmf_end_timeout")) {
19768 confp->mfcr2.dtmf_end_timeout = atoi(v->
value);
19770 }
else if (!strcasecmp(v->
name,
"mfcr2_get_ani_first")) {
19772 }
else if (!strcasecmp(v->
name,
"mfcr2_double_answer")) {
19774 }
else if (!strcasecmp(v->
name,
"mfcr2_charge_calls")) {
19776 }
else if (!strcasecmp(v->
name,
"mfcr2_accept_on_offer")) {
19778 }
else if (!strcasecmp(v->
name,
"mfcr2_allow_collect_calls")) {
19779 confp->mfcr2.allow_collect_calls =
ast_true(v->
value) ? 1 : 0;
19780 }
else if (!strcasecmp(v->
name,
"mfcr2_forced_release")) {
19782 }
else if (!strcasecmp(v->
name,
"mfcr2_immediate_accept")) {
19783 confp->mfcr2.immediate_accept =
ast_true(v->
value) ? 1 : 0;
19784#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 1
19785 }
else if (!strcasecmp(v->
name,
"mfcr2_skip_category")) {
19786 confp->mfcr2.skip_category_request =
ast_true(v->
value) ? 1 : 0;
19788 }
else if (!strcasecmp(v->
name,
"mfcr2_call_files")) {
19790 }
else if (!strcasecmp(v->
name,
"mfcr2_max_ani")) {
19791 confp->mfcr2.max_ani = atoi(v->
value);
19795 }
else if (!strcasecmp(v->
name,
"mfcr2_max_dnis")) {
19796 confp->mfcr2.max_dnis = atoi(v->
value);
19800 }
else if (!strcasecmp(v->
name,
"mfcr2_category")) {
19801 confp->mfcr2.category = openr2_proto_get_category(v->
value);
19802 if (OR2_CALLING_PARTY_CATEGORY_UNKNOWN == confp->mfcr2.category) {
19803 confp->mfcr2.category = OR2_CALLING_PARTY_CATEGORY_NATIONAL_SUBSCRIBER;
19804 ast_log(
LOG_WARNING,
"Invalid MFC/R2 caller category '%s' at line %d. Using national subscriber as default.\n",
19807 }
else if (!strcasecmp(v->
name,
"mfcr2_logging")) {
19808 openr2_log_level_t tmplevel;
19815 clevel =
strsep(&logval,
",");
19816 if (-1 == (tmplevel = openr2_log_get_level(clevel))) {
19820 confp->mfcr2.loglevel |= tmplevel;
19823 }
else if (!strcasecmp(v->
name,
"cadence")) {
19825 int element_count,
c[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
19827 struct dahdi_ring_cadence new_cadence;
19828 int cid_location = -1;
19829 int firstcadencepos = 0;
19830 char original_args[80];
19831 int cadence_is_ok = 1;
19835 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]);
19838 if (element_count % 2 == 1) {
19839 ast_log(
LOG_ERROR,
"Must be a silence duration for each ring duration: %s at line %d.\n", original_args, v->
lineno);
19849 for (i = 0; i < element_count; i++) {
19851 ast_log(
LOG_ERROR,
"Ring or silence duration cannot be zero: %s at line %d.\n", original_args, v->
lineno);
19854 }
else if (
c[i] < 0) {
19857 if (cid_location == -1) {
19866 if (firstcadencepos == 0) {
19867 firstcadencepos = i;
19870 ast_log(
LOG_ERROR,
"First cadence position specified twice: %s at line %d.\n", original_args, v->
lineno);
19879 for (i = 0; i < 16; i++) {
19880 new_cadence.ringcadence[i] =
c[i];
19883 if (cadence_is_ok) {
19885 if (element_count < 2) {
19888 if (cid_location == -1) {
19893 cid_location = (cid_location + 1) / 2;
19908 }
else if (!strcasecmp(v->
name,
"ringtimeout")) {
19910 }
else if (!strcasecmp(v->
name,
"prewink")) {
19912 }
else if (!strcasecmp(v->
name,
"preflash")) {
19914 }
else if (!strcasecmp(v->
name,
"wink")) {
19916 }
else if (!strcasecmp(v->
name,
"flash")) {
19918 }
else if (!strcasecmp(v->
name,
"start")) {
19920 }
else if (!strcasecmp(v->
name,
"rxwink")) {
19922 }
else if (!strcasecmp(v->
name,
"rxflash")) {
19924 }
else if (!strcasecmp(v->
name,
"debounce")) {
19926 }
else if (!strcasecmp(v->
name,
"toneduration")) {
19930 struct dahdi_dialparams dps;
19932 ctlfd = open(
"/dev/dahdi/ctl", O_RDWR);
19938 toneduration = atoi(v->
value);
19939 if (toneduration > -1) {
19940 memset(&dps, 0,
sizeof(dps));
19942 dps.dtmf_tonelen = dps.mfv1_tonelen = toneduration;
19943 res = ioctl(ctlfd, DAHDI_SET_DIALPARAMS, &dps);
19951 }
else if (!strcasecmp(v->
name,
"defaultcic")) {
19953 }
else if (!strcasecmp(v->
name,
"defaultozz")) {
19955 }
else if (!strcasecmp(v->
name,
"mwilevel")) {
19957 }
else if (!strcasecmp(v->
name,
"dtmfcidlevel")) {
19959 }
else if (!strcasecmp(v->
name,
"reportalarms")) {
19960 if (!strcasecmp(v->
value,
"all"))
19962 if (!strcasecmp(v->
value,
"none"))
19964 else if (!strcasecmp(v->
value,
"channels"))
19966 else if (!strcasecmp(v->
value,
"spans"))
19978 "Dahdichan '%s' failure ignored: ignore_failed_channels.\n",
19996 for (tmp =
iflist, y=-1; tmp; tmp = tmp->
next) {
20014 if (
conf.chan.cc_params) {
20020 ast_verb(3,
"Automatically generated pseudo channel\n");
20084 static int had_cfg_before = 1;
20087 have_cfg_now = !!cfg;
20090 if (had_cfg_before) {
20101 have_cfg_now = !!cfg;
20103 if (had_cfg_before) {
20122 had_cfg_before = have_cfg_now;
20131 if (!strcasecmp(v->
name,
"trunkgroup")) {
20132 trunkgroup = atoi(v->
value);
20133 if (trunkgroup > 0) {
20134 if ((
c = strchr(v->
value,
','))) {
20136 memset(dchannels, 0,
sizeof(dchannels));
20138 dchannels[i] = atoi(
c + 1);
20139 if (dchannels[i] < 0) {
20140 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);
20143 c = strchr(
c + 1,
',');
20146 if (pri_create_trunkgroup(trunkgroup, dchannels)) {
20147 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);
20149 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");
20151 ast_log(
LOG_WARNING,
"Trunk group %d lacks any valid D-channels at line %d of chan_dahdi.conf\n", trunkgroup, v->
lineno);
20153 ast_log(
LOG_WARNING,
"Trunk group %d lacks a primary D-channel at line %d of chan_dahdi.conf\n", trunkgroup, v->
lineno);
20155 ast_log(
LOG_WARNING,
"Trunk group identifier must be a positive integer at line %d of chan_dahdi.conf\n", v->
lineno);
20156 }
else if (!strcasecmp(v->
name,
"spanmap")) {
20157 spanno = atoi(v->
value);
20159 if ((
c = strchr(v->
value,
','))) {
20160 trunkgroup = atoi(
c + 1);
20161 if (trunkgroup > 0) {
20162 if ((
c = strchr(
c + 1,
',')))
20163 logicalspan = atoi(
c + 1);
20166 if (logicalspan >= 0) {
20167 if (pri_create_spanmap(spanno - 1, trunkgroup, logicalspan)) {
20168 ast_log(
LOG_WARNING,
"Failed to map span %d to trunk group %d (logical span %d)\n", spanno, trunkgroup, logicalspan);
20170 ast_verb(2,
"Mapped span %d to trunk group %d (logical span %d)\n", spanno, trunkgroup, logicalspan);
20172 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);
20206 if (!strcasecmp(cat,
"general") ||
20207 !strcasecmp(cat,
"trunkgroups") ||
20208 !strcasecmp(cat,
"globals") ||
20209 !strcasecmp(cat,
"channels")) {
20236 if (pris[x].pri.
pvts[0] &&
20238 prepare_pri(pris + x);
20243 ast_verb(2,
"Starting D-Channel on span %d\n", x + 1);
20248#if defined(HAVE_SS7)
20252 if (linksets[x].ss7.
ss7) {
20257 ast_verb(2,
"Starting SS7 linkset on span %d\n", x + 1);
20264 struct r2link_entry *cur;
20268 struct dahdi_mfcr2 *r2 = &cur->mfcr2;
20271 ast_log(
LOG_ERROR,
"Unable to start R2 monitor on channel group %d\n", x + 1);
20274 ast_verb(2,
"Starting R2 monitor on channel group %d\n", x + 1);
20328#if defined(HAVE_PRI) || defined(HAVE_SS7)
20349 memset(pris, 0,
sizeof(pris));
20353 pri_set_error(dahdi_pri_error);
20354 pri_set_message(dahdi_pri_message);
20356#ifdef HAVE_PRI_PROG_W_CAUSE
20359#if defined(HAVE_PRI_CCSS)
20367#
if defined(HAVE_PRI_CCSS)
20377#if defined(HAVE_SS7)
20378 memset(linksets, 0,
sizeof(linksets));
20382 ss7_set_error(dahdi_ss7_error);
20383 ss7_set_message(dahdi_ss7_message);
20402#if defined(HAVE_SS7)
20422#if defined(HAVE_PRI)
20436#define END_SILENCE_LEN 400
20437#define HEADER_MS 50
20438#define TRAILER_MS 5
20439#define HEADER_LEN ((HEADER_MS + TRAILER_MS) * 8)
20440#define ASCII_BYTES_PER_CHAR 80
20442 unsigned char *
buf,*mybuf;
20444 struct pollfd fds[1];
20445 int size,res,fd,
len,x;
20467 if ((!p->
tdd) && (!p->
mate)) {
20468#if defined(HAVE_PRI)
20469#if defined(HAVE_PRI_DISPLAY_TEXT)
20494 for (x = 0;
text[x]; x++) {
20522 fds[0].events = POLLOUT | POLLPRI;
20523 fds[0].revents = 0;
20524 res = poll(fds, 1, -1);
20530 if (fds[0].revents & POLLPRI) {
20534 if (!(fds[0].revents & POLLOUT)) {
20538 res = write(fd,
buf, size);
20577 .
requires =
"ccss",
20578 .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)
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.
static struct chans chans
#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 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 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 struct dahdi_pvt * fxo_pvt(struct ast_channel *chan)
Return DAHDI pivot if channel is FXO signalled.
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 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 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 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)
STASIS_MESSAGE_TYPE_DEFN_LOCAL(dahdichannel_type,.to_ami=dahdichannel_to_ami,)
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)
static struct @114 alarms[]
#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
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_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 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 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)
@ AST_FLAG_DISABLE_DEVSTATE_CACHE
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)
@ AST_SOFTHANGUP_EXPLICIT
@ AST_SOFTHANGUP_APPUNLOAD
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)
const struct ast_channel_tech * ast_channel_tech(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)
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)
#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.
int ast_cli_unregister_multiple(struct ast_cli_entry *e, int len)
Unregister multiple commands.
#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.
void ast_verbose(const char *fmt,...)
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.
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.
@ CONFIG_FLAG_FILEUNCHANGED
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.
struct stasis_forward * sub
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.
struct ast_smdi_interface * ast_smdi_interface_find(const char *iface_name)
Find an SMDI interface with the specified name.
struct ast_smdi_md_message * ast_smdi_md_message_wait(struct ast_smdi_interface *iface, int timeout)
Get the next SMDI message from the queue.
#define SMDI_MAX_FILENAME_LEN
#define STASIS_MESSAGE_TYPE_CLEANUP(name)
Boiler-plate messaging macro for cleaning up 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.
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
#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.
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)
unsigned int immediatering
unsigned int permcallwaiting
unsigned int callwaitingdeluxepending
TRUE if a Call Waiting Deluxe action is currently pending.
unsigned int dahditrcallerid
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
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::@231 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::@213 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.
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.
struct dahdi_pvt::@115 echocancel
Echo cancel parameters.
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]
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)