57#if defined(__NetBSD__) || defined(__FreeBSD__)
60#include <sys/sysmacros.h>
76#error "Upgrade your libpri"
82#if !defined(LIBSS7_ABI_COMPATIBILITY)
83#error "Upgrade your libss7"
84#elif LIBSS7_ABI_COMPATIBILITY != 2
85#error "Your installed libss7 is not compatible"
89#if defined(HAVE_OPENR2)
91#define SIG_MFCR2_MAX_CHANNELS 672
733#define SMDI_MD_WAIT_TIMEOUT 1500
736"0 db (CSU)/0-133 feet (DSX-1)",
737"133-266 feet (DSX-1)",
738"266-399 feet (DSX-1)",
739"399-533 feet (DSX-1)",
740"533-655 feet (DSX-1)",
752 .resync_threshold = 1000,
770#define DEFAULT_CIDRINGS 1
772#define AST_LAW(p) (((p)->law == DAHDI_LAW_ALAW) ? ast_format_alaw : ast_format_ulaw)
776#define NEED_MFDETECT(p) (((p)->sig == SIG_FEATDMF) || ((p)->sig == SIG_FEATDMF_TA) || ((p)->sig == SIG_E911) || ((p)->sig == SIG_FGC_CAMA) || ((p)->sig == SIG_FGC_CAMAMF) || ((p)->sig == SIG_FEATB))
778static const char tdesc[] =
"DAHDI Telephony"
779#if defined(HAVE_PRI) || defined(HAVE_SS7) || defined(HAVE_OPENR2)
781 #if defined(HAVE_PRI)
784 #if defined(HAVE_SS7)
785 #if defined(HAVE_PRI)
790 #if defined(HAVE_OPENR2)
791 #if defined(HAVE_PRI) || defined(HAVE_SS7)
799static const char config[] =
"chan_dahdi.conf";
802#define NUM_SPANS DAHDI_MAX_SPANS
807#define CHAN_PSEUDO -2
809#define CALLPROGRESS_PROGRESS 1
810#define CALLPROGRESS_FAX_OUTGOING 2
811#define CALLPROGRESS_FAX_INCOMING 4
812#define CALLPROGRESS_FAX (CALLPROGRESS_FAX_INCOMING | CALLPROGRESS_FAX_OUTGOING)
814#define NUM_CADENCE_MAX 25
821 { { 125, 125, 2000, 4000 } },
822 { { 250, 250, 500, 1000, 250, 250, 500, 4000 } },
823 { { 125, 125, 125, 125, 125, 4000 } },
824 { { 1000, 500, 2500, 5000 } },
841#define ISTRUNK(p) ((p->sig == SIG_FXSLS) || (p->sig == SIG_FXSKS) || \
842 (p->sig == SIG_FXSGS) || (p->sig == SIG_PRI))
844#define CANBUSYDETECT(p) (ISTRUNK(p) || (p->sig & (SIG_EM | SIG_EM_E1 | SIG_SF)) )
845#define CANPROGRESSDETECT(p) (ISTRUNK(p) || (p->sig & (SIG_EM | SIG_EM_E1 | SIG_SF)) )
852#ifndef HAVE_DAHDI_LINEREVERSE_VMWI
866#define REPORT_CHANNEL_ALARMS 1
867#define REPORT_SPAN_ALARMS 2
871static int pridebugfd = -1;
872static char pridebugfilename[1024] =
"";
906 if (ioctl(fd, DAHDI_GETEVENT, &j) == -1)
915 i = DAHDI_IOMUX_SIGEVENT;
916 if (ioctl(fd, DAHDI_IOMUX, &i) == -1)
918 if (ioctl(fd, DAHDI_GETEVENT, &j) == -1)
926#define MASK_AVAIL (1 << 0)
927#define MASK_INUSE (1 << 1)
929#define CALLWAITING_SILENT_SAMPLES ((300 * 8) / READ_SIZE)
930#define CALLWAITING_REPEAT_SAMPLES ((10000 * 8) / READ_SIZE)
931#define CALLWAITING_SUPPRESS_SAMPLES ((100 * 8) / READ_SIZE)
932#define CIDCW_EXPIRE_SAMPLES ((500 * 8) / READ_SIZE)
933#define MIN_MS_SINCE_FLASH ((2000) )
934#define DEFAULT_RINGT ((8000 * 8) / READ_SIZE)
935#define DEFAULT_DIALTONE_DETECT_TIMEOUT ((10000 * 8) / READ_SIZE)
949static struct dahdi_ss7 linksets[
NUM_SPANS];
951static int cur_ss7type = -1;
952static int cur_slc = -1;
953static int cur_linkset = -1;
954static int cur_pointcode = -1;
955static int cur_cicbeginswith = -1;
956static int cur_adjpointcode = -1;
957static int cur_networkindicator = -1;
958static int cur_defaultdpc = -1;
962struct dahdi_mfcr2_conf {
963 openr2_variant_t variant;
965 int metering_pulse_timeout;
968#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 2
972#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 3
973 int dtmf_end_timeout;
975 signed int get_ani_first:2;
976#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 1
977 signed int skip_category_request:2;
979 unsigned int call_files:1;
980 unsigned int allow_collect_calls:1;
981 unsigned int charge_calls:1;
982 unsigned int accept_on_offer:1;
983 unsigned int forced_release:1;
984 unsigned int double_answer:1;
985 signed int immediate_accept:2;
986#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 2
987 signed int dtmf_dialing:2;
988 signed int dtmf_detection:2;
990 char logdir[OR2_MAX_PATH];
991 char r2proto_file[OR2_MAX_PATH];
992 openr2_log_level_t loglevel;
993 openr2_calling_party_category_t category;
1000 openr2_context_t *protocol_context;
1005 struct dahdi_mfcr2_conf
conf;
1008struct r2link_entry {
1009 struct dahdi_mfcr2 mfcr2;
1017static int r2links_count = 0;
1025 int mastertrunkgroup;
1032#if defined(HAVE_PRI_CCSS)
1034static const char dahdi_pri_cc_type[] =
"DAHDI/PRI";
1043#define POLARITY_IDLE 0
1044#define POLARITY_REV 1
1055#if defined(HAVE_PRI)
1064static struct dahdi_parms_pseudo {
1069} dahdi_pseudo_parms;
1085 struct dahdi_pri pri;
1088#if defined(HAVE_SS7)
1089 struct dahdi_ss7 ss7;
1093 struct dahdi_mfcr2_conf mfcr2;
1128 .nsf = PRI_NSF_NONE,
1129 .switchtype = PRI_SWITCH_NI2,
1130 .dialplan = PRI_UNKNOWN + 1,
1131 .localdialplan = PRI_NATIONAL_ISDN + 1,
1132 .nodetype = PRI_CPE,
1135#if defined(HAVE_PRI_CCSS)
1136 .cc_ptmp_recall_mode = 1,
1137 .cc_qsig_signaling_link_req = 1,
1138 .cc_qsig_signaling_link_rsp = 1,
1144 .internationalprefix =
"",
1145 .nationalprefix =
"",
1147 .privateprefix =
"",
1148 .unknownprefix =
"",
1150 .resetinterval = -1,
1153#if defined(HAVE_SS7)
1155 .called_nai = SS7_NAI_NATIONAL,
1156 .calling_nai = SS7_NAI_NATIONAL,
1157 .internationalprefix =
"",
1158 .nationalprefix =
"",
1159 .subscriberprefix =
"",
1160 .unknownprefix =
"",
1161 .networkroutedprefix =
""
1166 .variant = OR2_VAR_ITU,
1167 .mfback_timeout = -1,
1168 .metering_pulse_timeout = -1,
1171 .get_ani_first = -1,
1172#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 1
1173 .skip_category_request = -1,
1176 .allow_collect_calls = 0,
1178 .accept_on_offer = 1,
1179 .forced_release = 0,
1181 .immediate_accept = -1,
1182#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 2
1184 .dtmf_detection = -1,
1185 .dtmf_time_on = OR2_DEFAULT_DTMF_ON,
1186 .dtmf_time_off = OR2_DEFAULT_DTMF_OFF,
1188#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 3
1189 .dtmf_end_timeout = -1,
1193 .loglevel = OR2_LOG_ERROR | OR2_LOG_WARNING,
1194 .category = OR2_CALLING_PARTY_CATEGORY_NATIONAL_SUBSCRIBER
1198 .context =
"default",
1203 .mohinterpret =
"default",
1206 .transfertobusy = 1,
1209 .ani_info_digits = 2,
1210 .ani_wink_time = 1000,
1211 .ani_timeout = 10000,
1215 .dahditrcallerid = 0,
1224 .echocancel.head.tap_length = 1,
1232#ifdef HAVE_DAHDI_LINEREVERSE_VMWI
1235 .polarityonanswerdelay = 600,
1239 .buf_policy = DAHDI_POLICY_IMMEDIATE,
1258 .ignore_failed_channels = 1,
1259 .smdi_port =
"/dev/ttyS0",
1268 const char *
data,
int *cause);
1289 .description =
tdesc,
1310#define GET_CHANNEL(p) ((p)->channel)
1367 return DAHDI_TONE_RINGTONE;
1369 return DAHDI_TONE_STUTTER;
1371 return DAHDI_TONE_CONGESTION;
1373 return DAHDI_TONE_DIALTONE;
1375 return DAHDI_TONE_DIALRECALL;
1377 return DAHDI_TONE_INFO;
1387 switch (analogsub) {
1416 struct doomed_pri *entry;
1422 ast_debug(4,
"Destroying span %d from doomed queue.\n",
1424 pri_destroy_span(entry->pri);
1443static void pri_queue_for_destruction(
struct sig_pri_span *pri)
1445 struct doomed_pri *entry;
1449 if (entry->pri == pri) {
1454 entry =
ast_calloc(
sizeof(
struct doomed_pri), 1);
1462 ast_debug(4,
"Queue span %d for destruction.\n", pri->
span);
1485 struct dahdi_dialoperation zo = {
1491 for (offset = 0; offset <
sizeof(zo.dialstr) - 1; ++offset) {
1498 if (offset >=
sizeof(zo.dialstr) - 3) {
1502 zo.dialstr[offset] =
'w';
1504 zo.dialstr[offset] =
'w';
1507 zo.dialstr[offset] = *pos++;
1511 ast_debug(1,
"Channel %d: Dial str '%s' expanded to '%s' sent to DAHDI_DIAL.\n",
1512 pvt->
channel, dial_str, zo.dialstr);
1563 struct pollfd poller;
1567 unsigned char buf[256];
1572 poller.events = POLLPRI | POLLIN;
1575 res = poll(&poller, 1, timeout);
1577 if (poller.revents & POLLPRI) {
1582 if (poller.revents & POLLIN) {
1594 if (analog_p->
ringt > 0) {
1595 if (!(--analog_p->
ringt)) {
1658 unsigned char buf[256];
1666 int checkaftercid = 0;
1667 const char *matched_context;
1671 if (ringdata ==
NULL) {
1672 ringdata = curRingData;
1680 for (receivedRingT = 0; receivedRingT <
RING_PATTERNS; receivedRingT++)
1681 ringdata[receivedRingT] = 0;
1685 ast_verb(3,
"Detecting post-CID distinctive ring\n");
1689 i = DAHDI_IOMUX_READ | DAHDI_IOMUX_SIGEVENT;
1690 res = ioctl(p->
subs[idx].
dfd, DAHDI_IOMUX, &i);
1696 if (i & DAHDI_IOMUX_SIGEVENT) {
1699 if (res == DAHDI_EVENT_NOALARM) {
1702 }
else if (res == DAHDI_EVENT_RINGOFFHOOK) {
1704 ringdata[receivedRingT] = analog_p->
ringt;
1715 }
else if (i & DAHDI_IOMUX_READ) {
1718 if (
errno != ELAST) {
1725 if (analog_p->
ringt > 0) {
1726 if (!(--analog_p->
ringt)) {
1735 ast_verb(3,
"Detected ring pattern: %d,%d,%d\n", ringdata[0], ringdata[1], ringdata[2]);
1737 for (counter = 0; counter < 3; counter++) {
1741 ast_verb(3,
"Checking %d,%d,%d with +/- %d range\n",
1746 for (counter1 = 0; counter1 < 3; counter1++) {
1750 ast_verb(3,
"Pattern ignore (-1) detected, so matching pattern %d regardless.\n",
1751 ringdata[counter1]);
1753 }
else if (ring - range <= ringdata[counter1] && ringdata[counter1] <= ring + range) {
1754 ast_verb(3,
"Ring pattern %d is in range: %d to %d\n",
1755 ringdata[counter1], ring - range, ring + range);
1763 if (distMatches == 3) {
1766 ast_verb(3,
"Matched Distinctive Ring context %s\n", matched_context);
1772 if (strcmp(p->
context, matched_context) != 0) {
1860 ast_verb(3,
"CPE supports Call Waiting Caller*ID. Sending '%s/%s'\n",
1936 ast_log(
LOG_ERROR,
"We used a sub other than SUB_REAL (incorrect assumption sir)\n");
1953 ast_debug(1,
"%s DTMF digit: 0x%02X '%c' on %s\n",
1963 struct dahdi_bufferinfo bi = {
1970 if ((res = ioctl(p->
subs[idx].
dfd, DAHDI_SET_BUFINFO, &bi)) < 0) {
2008 ast_debug(1,
"Already in a fax extension, not redirecting\n");
2017 *dest = &p->
subs[idx].
f;
2047 if (!channel_string) {
2057 "DAHDIGroup: %llu\r\n"
2059 "DAHDIChannel: %s\r\n",
2080 "channel", dahdi_channel);
2104 snprintf(ch_name,
sizeof(ch_name),
"no-media (%d)", p->
channel);
2107 strcpy(ch_name,
"pseudo");
2110 snprintf(ch_name,
sizeof(ch_name),
"%d", p->
channel);
2124static void my_ami_channel_event(
void *pvt,
struct ast_channel *chan)
2184 return p->
subs[dahdi_sub].
dfd;
2227#if defined(HAVE_PRI) || defined(HAVE_SS7)
2228static void my_set_digital(
void *pvt,
int is_digital)
2236#if defined(HAVE_SS7)
2237static void my_set_inservice(
void *pvt,
int is_inservice)
2245#if defined(HAVE_SS7)
2246static void my_set_locallyblocked(
void *pvt,
int is_blocked)
2254#if defined(HAVE_SS7)
2255static void my_set_remotelyblocked(
void *pvt,
int is_blocked)
2368 p->
owner = new_owner;
2419 for (i = 0; i < 3; i++) {
2456 int needconf = needconference;
2563#if defined(HAVE_PRI) || defined(HAVE_SS7)
2564static int dahdi_setlaw(
int dfd,
int law)
2567 res = ioctl(dfd, DAHDI_SETLAW, &
law);
2574#if defined(HAVE_PRI)
2613 newlaw = DAHDI_LAW_ALAW;
2616 newlaw = DAHDI_LAW_MULAW;
2626#if defined(HAVE_PRI) || defined(HAVE_SS7)
2634static void my_pri_ss7_open_media(
void *p)
2645 res = ioctl(dfd, DAHDI_AUDIOMODE, &set_val);
2652 res = dahdi_setlaw(dfd, pvt->
law);
2674#if defined(HAVE_PRI)
2685static void my_pri_dial_digits(
void *p,
const char *dial_string)
2687 char dial_str[DAHDI_MAX_DTMF_BUF];
2691 snprintf(dial_str,
sizeof(dial_str),
"T%s", dial_string);
2741 case DAHDI_EVENT_ONHOOK:
2744 case DAHDI_EVENT_RINGOFFHOOK:
2747 case DAHDI_EVENT_WINKFLASH:
2750 case DAHDI_EVENT_ALARM:
2753 case DAHDI_EVENT_NOALARM:
2756 case DAHDI_EVENT_DIALCOMPLETE:
2759 case DAHDI_EVENT_RINGERON:
2762 case DAHDI_EVENT_RINGEROFF:
2765 case DAHDI_EVENT_HOOKCOMPLETE:
2768 case DAHDI_EVENT_PULSE_START:
2771 case DAHDI_EVENT_POLARITY:
2774 case DAHDI_EVENT_RINGBEGIN:
2777 case DAHDI_EVENT_EC_DISABLED:
2780 case DAHDI_EVENT_REMOVED:
2783 case DAHDI_EVENT_NEONMWI_ACTIVE:
2786 case DAHDI_EVENT_NEONMWI_INACTIVE:
2789#ifdef HAVE_DAHDI_ECHOCANCEL_FAX_MODE
2790 case DAHDI_EVENT_TX_CED_DETECTED:
2793 case DAHDI_EVENT_RX_CED_DETECTED:
2796 case DAHDI_EVENT_EC_NLP_DISABLED:
2799 case DAHDI_EVENT_EC_NLP_ENABLED:
2803 case DAHDI_EVENT_PULSEDIGIT:
2806 case DAHDI_EVENT_DTMFDOWN:
2809 case DAHDI_EVENT_DTMFUP:
2813 switch(
event & 0xFFFF0000) {
2814 case DAHDI_EVENT_PULSEDIGIT:
2815 case DAHDI_EVENT_DTMFDOWN:
2816 case DAHDI_EVENT_DTMFUP:
2858 struct dahdi_params par;
2860 memset(&par, 0,
sizeof(par));
2867 par.rxisoffhook = 0;
2877 return (par.rxbits > -1) || par.rxisoffhook;
2880 return par.rxisoffhook;
2907 int func = DAHDI_FLASH;
2974 int x = DAHDI_START;
2989 ast_log(
LOG_ERROR,
"Trying to dial_digits '%s' on channel %d subchannel %u\n",
3016 if (ioctl(p->
subs[index].
dfd, DAHDI_DIALING, &x)) {
3017 ast_debug(1,
"DAHDI_DIALING ioctl failed!\n");
3030#if defined(HAVE_PRI)
3031static void my_pri_fixup_chans(
void *chan_old,
void *chan_new)
3038 if (new_chan->
owner) {
3045 new_chan->
dsp = old_chan->
dsp;
3059 new_chan->
law = old_chan->
law;
3064#if defined(HAVE_PRI)
3065static int sig_pri_tone_to_dahditone(
enum sig_pri_tone tone)
3069 return DAHDI_TONE_RINGTONE;
3071 return DAHDI_TONE_STUTTER;
3073 return DAHDI_TONE_CONGESTION;
3075 return DAHDI_TONE_DIALTONE;
3077 return DAHDI_TONE_DIALRECALL;
3079 return DAHDI_TONE_INFO;
3081 return DAHDI_TONE_BUSY;
3088#if defined(HAVE_PRI)
3089static void my_handle_dchan_exception(
struct sig_pri_span *pri,
int index)
3093 ioctl(pri->
fds[index], DAHDI_GETEVENT, &x);
3095 case DAHDI_EVENT_NONE:
3097 case DAHDI_EVENT_ALARM:
3098 case DAHDI_EVENT_NOALARM:
3110 case DAHDI_EVENT_ALARM:
3113 case DAHDI_EVENT_NOALARM:
3116 case DAHDI_EVENT_REMOVED:
3117 pri_queue_for_destruction(pri);
3125#if defined(HAVE_PRI)
3126static int my_pri_play_tone(
void *pvt,
enum sig_pri_tone tone)
3130 return tone_zone_play_tone(p->
subs[
SUB_REAL].
dfd, sig_pri_tone_to_dahditone(tone));
3134#if defined(HAVE_PRI) || defined(HAVE_SS7)
3143static void my_set_callerid(
void *pvt,
const struct ast_party_caller *caller)
3158 if (caller->
id.
tag) {
3163 sizeof(p->cid_ani));
3168#if defined(HAVE_PRI) || defined(HAVE_SS7)
3177static void my_set_dnid(
void *pvt,
const char *
dnid)
3185#if defined(HAVE_PRI)
3194static void my_set_rdnis(
void *pvt,
const char *
rdnis)
3202#if defined(HAVE_PRI)
3229static void my_pri_make_cc_dialstring(
void *priv,
char *
buf,
size_t buf_size)
3250 snprintf(
buf, buf_size,
"%s/i%d-",
args.tech, pvt->pri->span);
3253 if (isdigit(
args.group[0]) ||
args.group[0] ==
'i' || strchr(
args.group,
'!')) {
3260 snprintf(
buf, buf_size,
"%s/i%d-%s",
args.tech, pvt->pri->span,
args.group);
3264#if defined(HAVE_PRI)
3274static void dahdi_pri_update_span_devstate(
struct sig_pri_span *pri)
3277 unsigned num_b_chans;
3286 for (idx = pri->
numchans; idx--;) {
3310#if defined(THRESHOLD_DEVSTATE_PLACEHOLDER)
3314 }
else if (!in_use) {
3316 }
else if (!pri->user_busy_threshold) {
3322 if (pri->threshold_devstate != new_state) {
3323 pri->threshold_devstate = new_state;
3330#if defined(HAVE_PRI)
3336static void my_module_ref(
void)
3342#if defined(HAVE_PRI)
3348static void my_module_unref(
void)
3354#if defined(HAVE_PRI)
3355#if defined(HAVE_PRI_CALL_WAITING)
3356static void my_pri_init_config(
void *priv,
struct sig_pri_span *pri);
3358static int dahdi_new_pri_nobch_channel(
struct sig_pri_span *pri);
3363 .play_tone = my_pri_play_tone,
3369 .new_ast_channel = my_new_pri_ast_channel,
3370 .fixup_chans = my_pri_fixup_chans,
3374 .set_digital = my_set_digital,
3375 .set_callerid = my_set_callerid,
3376 .set_dnid = my_set_dnid,
3377 .set_rdnis = my_set_rdnis,
3378 .new_nobch_intf = dahdi_new_pri_nobch_channel,
3379#if defined(HAVE_PRI_CALL_WAITING)
3380 .init_config = my_pri_init_config,
3383 .make_cc_dialstring = my_pri_make_cc_dialstring,
3384 .update_span_devstate = dahdi_pri_update_span_devstate,
3385 .module_ref = my_module_ref,
3386 .module_unref = my_module_unref,
3387 .dial_digits = my_pri_dial_digits,
3388 .open_media = my_pri_ss7_open_media,
3389 .ami_channel_event = my_ami_channel_event,
3390 .destroy_later = pri_queue_for_destruction,
3394#if defined(HAVE_SS7)
3403static void my_handle_link_exception(
struct sig_ss7_linkset *linkset,
int which)
3407 if (ioctl(linkset->
fds[which], DAHDI_GETEVENT, &
event)) {
3409 linkset->
span, which);
3413 case DAHDI_EVENT_NONE:
3415 case DAHDI_EVENT_ALARM:
3420 case DAHDI_EVENT_NOALARM:
3433#if defined(HAVE_SS7)
3434static void my_ss7_set_loopback(
void *pvt,
int enable)
3445#if defined(HAVE_SS7)
3465 if (linksets[idx].
ss7.ss7 ==
ss7) {
3466 return &linksets[idx].
ss7;
3473#if defined(HAVE_SS7)
3516 newlaw = DAHDI_LAW_ALAW;
3519 newlaw = DAHDI_LAW_MULAW;
3526#if defined(HAVE_SS7)
3527static int sig_ss7_tone_to_dahditone(
enum sig_ss7_tone tone)
3531 return DAHDI_TONE_RINGTONE;
3533 return DAHDI_TONE_STUTTER;
3535 return DAHDI_TONE_CONGESTION;
3537 return DAHDI_TONE_DIALTONE;
3539 return DAHDI_TONE_DIALRECALL;
3541 return DAHDI_TONE_INFO;
3543 return DAHDI_TONE_BUSY;
3550#if defined(HAVE_SS7)
3551static int my_ss7_play_tone(
void *pvt,
enum sig_ss7_tone tone)
3555 return tone_zone_play_tone(p->
subs[
SUB_REAL].
dfd, sig_ss7_tone_to_dahditone(tone));
3559#if defined(HAVE_SS7)
3567 .set_loopback = my_ss7_set_loopback,
3569 .new_ast_channel = my_new_ss7_ast_channel,
3570 .play_tone = my_ss7_play_tone,
3572 .handle_link_exception = my_handle_link_exception,
3576 .set_digital = my_set_digital,
3577 .set_inservice = my_set_inservice,
3578 .set_locallyblocked = my_set_locallyblocked,
3579 .set_remotelyblocked = my_set_remotelyblocked,
3580 .set_callerid = my_set_callerid,
3581 .set_dnid = my_set_dnid,
3582 .open_media = my_pri_ss7_open_media,
3583 .find_linkset = my_ss7_find_linkset,
3653#define gen_pvt_field_callback(type, field) \
3654 static type my_get_##field(void *pvt) \
3656 struct dahdi_pvt *p = pvt; \
3664#undef gen_pvt_field_callback
3755 "Unable to get index for '%s' on channel %d (%s(), line %lu)\n",
3848#if defined(HAVE_PRI)
3863static void mfcr2_queue_for_destruction(
const struct dahdi_pvt *p)
3865 const struct dahdi_mfcr2 *r2link = p->mfcr2;
3866 struct r2link_entry *cur;
3869 if (r2link == &cur->mfcr2) {
3879static int dahdi_r2_answer(
struct dahdi_pvt *p)
3885#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 1
3887 int wants_double_answer =
ast_true(double_answer) ? 1 : 0;
3888 if (!double_answer) {
3891 res = openr2_chan_answer_call(p->r2chan);
3892 }
else if (wants_double_answer) {
3893 res = openr2_chan_answer_call_with_mode(p->r2chan, OR2_ANSWER_DOUBLE);
3895 res = openr2_chan_answer_call_with_mode(p->r2chan, OR2_ANSWER_SIMPLE);
3898 res = openr2_chan_answer_call(p->r2chan);
3906static openr2_calling_party_category_t dahdi_r2_get_channel_category(
struct ast_channel *
c)
3908 openr2_calling_party_category_t cat;
3912 ast_debug(1,
"No MFC/R2 category specified for chan %s, using default %s\n",
3914 return p->mfcr2_category;
3916 if ((cat = openr2_proto_get_category(catstr)) == OR2_CALLING_PARTY_CATEGORY_UNKNOWN) {
3917 ast_log(
LOG_WARNING,
"Invalid category specified '%s' for chan %s, using default %s\n",
3918 catstr,
ast_channel_name(
c), openr2_proto_get_category_string(p->mfcr2_category));
3919 return p->mfcr2_category;
3921 ast_debug(1,
"Using category %s\n", catstr);
3925static void dahdi_r2_on_call_init(openr2_chan_t *r2chan)
3927 struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
3936 ast_log(
LOG_ERROR,
"Collision of calls on chan %d detected!.\n", openr2_chan_get_number(r2chan));
3946 p->mfcr2_ani_index =
'\0';
3947 p->mfcr2_dnis_index =
'\0';
3948 p->mfcr2_dnis_matched = 0;
3949 p->mfcr2_answer_pending = 0;
3950 p->mfcr2_call_accepted = 0;
3952 ast_verbose(
"New MFC/R2 call detected on chan %d.\n", openr2_chan_get_number(r2chan));
3955static void dahdi_r2_on_hardware_alarm(openr2_chan_t *r2chan,
int alarm)
3958 struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
3963 if (res == DAHDI_ALARM_NOTOPEN) {
3964 mfcr2_queue_for_destruction(p);
3973static void dahdi_r2_on_os_error(openr2_chan_t *r2chan,
int errorcode)
3975 struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
3977 ast_log(
LOG_ERROR,
"OS error on chan %d: %s\n", openr2_chan_get_number(r2chan), strerror(errorcode));
3980 if (errorcode == ENODEV) {
3981 struct dahdi_mfcr2 *r2link = p->mfcr2;
3990static void dahdi_r2_on_protocol_error(openr2_chan_t *r2chan, openr2_protocol_error_t reason)
3992 struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
3993 ast_log(
LOG_ERROR,
"MFC/R2 protocol error on chan %d: %s\n", openr2_chan_get_number(r2chan), openr2_proto_get_error(reason));
4003static void dahdi_r2_disconnect_call(
struct dahdi_pvt *p, openr2_call_disconnect_cause_t cause)
4005 if (openr2_chan_disconnect_call(p->r2chan, cause)) {
4006 ast_log(
LOG_NOTICE,
"Bad! failed to disconnect call on channel %d with reason %s, hope for the best!\n",
4007 p->
channel, openr2_proto_get_disconnect_string(cause));
4009 openr2_chan_set_idle(p->r2chan);
4016static void dahdi_r2_on_call_offered(openr2_chan_t *r2chan,
const char *ani,
const char *dnis, openr2_calling_party_category_t category)
4022 ast_verbose(
"MFC/R2 call offered on chan %d. ANI = %s, DNIS = %s, Category = %s\n",
4023 openr2_chan_get_number(r2chan), ani ? ani :
"(restricted)", dnis,
4024 openr2_proto_get_category_string(category));
4025 p = openr2_chan_get_client_data(r2chan);
4027 if (!p->mfcr2_allow_collect_calls && category == OR2_CALLING_PARTY_CATEGORY_COLLECT_CALL) {
4029 dahdi_r2_disconnect_call(p, OR2_CAUSE_COLLECT_CALL_REJECTED);
4030 goto dahdi_r2_on_call_offered_cleanup;
4033 p->mfcr2_recvd_category = category;
4036 ast_debug(1,
"No CID allowed in configuration, CID is being cleared!\n");
4041 if (p->
immediate || !openr2_context_get_max_dnis(openr2_chan_get_context(r2chan))) {
4042 ast_debug(1,
"Setting exten => s because of immediate or 0 DNIS configured\n");
4048 ast_log(
LOG_NOTICE,
"MFC/R2 call on channel %d requested non-existent extension '%s' in context '%s'. Rejecting call.\n",
4050 dahdi_r2_disconnect_call(p, OR2_CAUSE_UNALLOCATED_NUMBER);
4051 goto dahdi_r2_on_call_offered_cleanup;
4053 if (!p->mfcr2_accept_on_offer) {
4060 goto dahdi_r2_on_call_offered_cleanup;
4063 dahdi_r2_disconnect_call(p, OR2_CAUSE_OUT_OF_ORDER);
4064 }
else if (p->mfcr2_charge_calls) {
4065 ast_debug(1,
"Accepting MFC/R2 call with charge on chan %d\n", p->
channel);
4066 openr2_chan_accept_call(r2chan, OR2_CALL_WITH_CHARGE);
4068 ast_debug(1,
"Accepting MFC/R2 call with no charge on chan %d\n", p->
channel);
4069 openr2_chan_accept_call(r2chan, OR2_CALL_NO_CHARGE);
4072dahdi_r2_on_call_offered_cleanup:
4076static void dahdi_r2_on_call_end(openr2_chan_t *r2chan)
4078 struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
4085static void dahdi_r2_on_call_accepted(openr2_chan_t *r2chan, openr2_call_mode_t mode)
4091 p = openr2_chan_get_client_data(r2chan);
4093 p->mfcr2_call_accepted = 1;
4095 if (OR2_DIR_BACKWARD == openr2_chan_get_direction(r2chan)) {
4096 ast_verbose(
"MFC/R2 call has been accepted on backward channel %d\n", openr2_chan_get_number(r2chan));
4101 if (!p->mfcr2_accept_on_offer) {
4102 openr2_chan_disable_read(r2chan);
4103 if (p->mfcr2_answer_pending) {
4104 ast_debug(1,
"Answering MFC/R2 call after accepting it on chan %d\n", openr2_chan_get_number(r2chan));
4107 goto dahdi_r2_on_call_accepted_cleanup;
4113 openr2_chan_disable_read(r2chan);
4114 goto dahdi_r2_on_call_accepted_cleanup;
4118 dahdi_r2_disconnect_call(p, OR2_CAUSE_OUT_OF_ORDER);
4119 goto dahdi_r2_on_call_accepted_cleanup;
4126 openr2_chan_disable_read(r2chan);
4128dahdi_r2_on_call_accepted_cleanup:
4132static void dahdi_r2_on_call_answered(openr2_chan_t *r2chan)
4134 struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
4135 ast_verbose(
"MFC/R2 call has been answered on channel %d\n", openr2_chan_get_number(r2chan));
4139static void dahdi_r2_on_call_read(openr2_chan_t *r2chan,
const unsigned char *
buf,
int buflen)
4144static int dahdi_r2_cause_to_ast_cause(openr2_call_disconnect_cause_t cause)
4147 case OR2_CAUSE_BUSY_NUMBER:
4149 case OR2_CAUSE_NETWORK_CONGESTION:
4151 case OR2_CAUSE_OUT_OF_ORDER:
4153 case OR2_CAUSE_UNALLOCATED_NUMBER:
4155 case OR2_CAUSE_NO_ANSWER:
4157 case OR2_CAUSE_NORMAL_CLEARING:
4159 case OR2_CAUSE_UNSPECIFIED:
4165static void dahdi_r2_on_call_disconnect(openr2_chan_t *r2chan, openr2_call_disconnect_cause_t cause)
4167 struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
4170 int datalen =
sizeof(*cause_code);
4172 ast_verbose(
"MFC/R2 call disconnected on channel %d\n", openr2_chan_get_number(r2chan));
4177 dahdi_r2_disconnect_call(p, OR2_CAUSE_NORMAL_CLEARING);
4181 snprintf(cause_str,
sizeof(cause_str),
"R2 DISCONNECT (%s)", openr2_proto_get_disconnect_string(cause));
4182 datalen += strlen(cause_str);
4184 memset(cause_code, 0, datalen);
4185 cause_code->
ast_cause = dahdi_r2_cause_to_ast_cause(cause);
4197 }
else if (openr2_chan_get_direction(r2chan) == OR2_DIR_FORWARD) {
4200 case OR2_CAUSE_BUSY_NUMBER:
4203 case OR2_CAUSE_NETWORK_CONGESTION:
4204 case OR2_CAUSE_OUT_OF_ORDER:
4205 case OR2_CAUSE_UNALLOCATED_NUMBER:
4206 case OR2_CAUSE_NO_ANSWER:
4207 case OR2_CAUSE_UNSPECIFIED:
4208 case OR2_CAUSE_NORMAL_CLEARING:
4223static void dahdi_r2_write_log(openr2_log_level_t level,
char *logmessage)
4226 case OR2_LOG_NOTICE:
4229 case OR2_LOG_WARNING:
4235 case OR2_LOG_STACK_TRACE:
4236 case OR2_LOG_MF_TRACE:
4237 case OR2_LOG_CAS_TRACE:
4239 case OR2_LOG_EX_DEBUG:
4249static void dahdi_r2_on_line_blocked(openr2_chan_t *r2chan)
4251 struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
4255 ast_log(
LOG_NOTICE,
"Far end blocked on chan %d\n", openr2_chan_get_number(r2chan));
4258static void dahdi_r2_on_line_idle(openr2_chan_t *r2chan)
4260 struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
4264 ast_log(
LOG_NOTICE,
"Far end unblocked on chan %d\n", openr2_chan_get_number(r2chan));
4267static void dahdi_r2_on_context_log(openr2_context_t *r2context, openr2_log_level_t level,
const char *fmt, va_list ap)
4268 __attribute__((format (printf, 3, 0)));
4269static void dahdi_r2_on_context_log(openr2_context_t *r2context, openr2_log_level_t level,
const char *fmt, va_list ap)
4271#define CONTEXT_TAG "Context - "
4273 char completemsg[
sizeof(
logmsg) * 2];
4275 snprintf(completemsg,
sizeof(completemsg), CONTEXT_TAG
"%s",
logmsg);
4276 dahdi_r2_write_log(level, completemsg);
4280static void dahdi_r2_on_chan_log(openr2_chan_t *r2chan, openr2_log_level_t level,
const char *fmt, va_list ap)
4281 __attribute__((format (printf, 3, 0)));
4282static void dahdi_r2_on_chan_log(openr2_chan_t *r2chan, openr2_log_level_t level,
const char *fmt, va_list ap)
4284#define CHAN_TAG "Chan "
4286 char completemsg[
sizeof(
logmsg) * 2];
4288 snprintf(completemsg,
sizeof(completemsg), CHAN_TAG
"%d - %s", openr2_chan_get_number(r2chan),
logmsg);
4289 dahdi_r2_write_log(level, completemsg);
4293static int dahdi_r2_on_dnis_digit_received(openr2_chan_t *r2chan,
char digit)
4295 struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
4302 p->mfcr2_dnis_index++;
4303 p->
exten[p->mfcr2_dnis_index] = 0;
4304 p->
rdnis[p->mfcr2_dnis_index] = 0;
4306 if ((p->mfcr2_dnis_matched ||
4315static void dahdi_r2_on_ani_digit_received(openr2_chan_t *r2chan,
char digit)
4317 struct dahdi_pvt *p = openr2_chan_get_client_data(r2chan);
4320 p->mfcr2_ani_index++;
4321 p->
cid_num[p->mfcr2_ani_index] = 0;
4322 p->
cid_name[p->mfcr2_ani_index] = 0;
4325static void dahdi_r2_on_billing_pulse_received(openr2_chan_t *r2chan)
4327 ast_verbose(
"MFC/R2 billing pulse received on channel %d\n", openr2_chan_get_number(r2chan));
4330static openr2_event_interface_t dahdi_r2_event_iface = {
4331 .on_call_init = dahdi_r2_on_call_init,
4332 .on_call_offered = dahdi_r2_on_call_offered,
4333 .on_call_accepted = dahdi_r2_on_call_accepted,
4334 .on_call_answered = dahdi_r2_on_call_answered,
4335 .on_call_disconnect = dahdi_r2_on_call_disconnect,
4336 .on_call_end = dahdi_r2_on_call_end,
4337 .on_call_read = dahdi_r2_on_call_read,
4338 .on_hardware_alarm = dahdi_r2_on_hardware_alarm,
4339 .on_os_error = dahdi_r2_on_os_error,
4340 .on_protocol_error = dahdi_r2_on_protocol_error,
4341 .on_line_blocked = dahdi_r2_on_line_blocked,
4342 .on_line_idle = dahdi_r2_on_line_idle,
4344 .on_context_log = (openr2_handle_context_logging_func)dahdi_r2_on_context_log,
4345 .on_dnis_digit_received = dahdi_r2_on_dnis_digit_received,
4346 .on_ani_digit_received = dahdi_r2_on_ani_digit_received,
4348 .on_billing_pulse_received = dahdi_r2_on_billing_pulse_received
4351static inline int16_t dahdi_r2_alaw_to_linear(uint8_t sample)
4356static inline uint8_t dahdi_r2_linear_to_alaw(
int sample)
4361static openr2_transcoder_interface_t dahdi_r2_transcode_iface = {
4362 dahdi_r2_alaw_to_linear,
4363 dahdi_r2_linear_to_alaw
4404 for (
x = 0;
x < strlen(fn);
x++) {
4405 if (!isdigit(fn[
x])) {
4416 fn =
"/dev/dahdi/channel";
4418 fd = open(fn, O_RDWR | O_NONBLOCK);
4424 if (ioctl(fd, DAHDI_SPECIFY, &chan)) {
4433 if (ioctl(fd, DAHDI_SET_BLOCKSIZE, &
bs) == -1) {
4452 chan_pvt->
subs[sub_num].
dfd = -1;
4455#if defined(HAVE_PRI)
4456static void dahdi_close_pri_fd(
struct dahdi_pri *pri,
int fd_num)
4459 pri->pri.fds[fd_num] = -1;
4463#if defined(HAVE_SS7)
4464static void dahdi_close_ss7_fd(
struct dahdi_ss7 *ss7,
int fd_num)
4467 ss7->ss7.fds[fd_num] = -1;
4473 return ioctl(dfd, DAHDI_SETLINEAR, &linear);
4479 struct dahdi_bufferinfo bi;
4492 res = ioctl(p->
subs[x].
dfd, DAHDI_GET_BUFINFO, &bi);
4497 res = ioctl(p->
subs[x].
dfd, DAHDI_SET_BUFINFO, &bi);
4534 return DAHDI_TONE_DTMF_BASE + (
digit -
'0');
4536 return DAHDI_TONE_DTMF_A + (
digit -
'A');
4538 return DAHDI_TONE_DTMF_A + (
digit -
'a');
4539 else if (
digit ==
'*')
4540 return DAHDI_TONE_DTMF_s;
4541 else if (
digit ==
'#')
4542 return DAHDI_TONE_DTMF_p;
4581 char dial_str[] = {
'T',
digit,
'\0' };
4592 dtmf = DAHDI_FLUSH_WRITE;
4595 ast_log(
LOG_WARNING,
"Unable to flush the DAHDI write buffer to send DTMF on channel %d: %s\n",
4599 ast_debug(1,
"Channel %s started VLDTMF digit '%c'\n",
4634 ast_debug(1,
"Channel %s ending VLDTMF digit '%c'\n",
4660 "Hook Transition Complete",
4665 "Polarity Reversal",
4673 { DAHDI_ALARM_RED,
"Red Alarm" },
4674 { DAHDI_ALARM_YELLOW,
"Yellow Alarm" },
4675 { DAHDI_ALARM_BLUE,
"Blue Alarm" },
4676 { DAHDI_ALARM_RECOVER,
"Recovering" },
4677 { DAHDI_ALARM_LOOPBACK,
"Loopback" },
4678 { DAHDI_ALARM_NOTOPEN,
"Not Open" },
4679 { DAHDI_ALARM_NONE,
"None" },
4689 return alm ?
"Unknown Alarm" :
"No Alarm";
4694 static char buf[256];
4703 static char buf[256];
4706 return "E & M Immediate";
4708 return "E & M Wink";
4712 return "Feature Group D (DTMF)";
4714 return "Feature Group D (MF)";
4716 return "Feature Group D (MF) Tandem Access";
4718 return "Feature Group B (MF)";
4722 return "FGC/CAMA (Dialpulse)";
4724 return "FGC/CAMA (MF)";
4726 return "FXS Loopstart";
4728 return "FXS Groundstart";
4730 return "FXS Kewlstart";
4732 return "FXO Loopstart";
4734 return "FXO Groundstart";
4736 return "FXO Kewlstart";
4740 return "ISDN BRI Point to Point";
4742 return "ISDN BRI Point to MultiPoint";
4748 return "SF (Tone) Immediate";
4750 return "SF (Tone) Wink";
4752 return "SF (Tone) with Feature Group D (DTMF)";
4754 return "SF (Tone) with Feature Group D (MF)";
4756 return "SF (Tone) with Feature Group B (MF)";
4760 snprintf(
buf,
sizeof(
buf),
"Unknown signalling %d", sig);
4765#define sig2str dahdi_sig2str
4771 struct dahdi_confinfo zi;
4773 memset(&zi, 0,
sizeof(zi));
4776 if (slavechannel > 0) {
4778 zi.confmode = DAHDI_CONF_DIGITALMON;
4779 zi.confno = slavechannel;
4783 zi.confmode = DAHDI_CONF_REALANDPSEUDO | DAHDI_CONF_TALKER | DAHDI_CONF_LISTENER |
4784 DAHDI_CONF_PSEUDO_TALKER | DAHDI_CONF_PSEUDO_LISTENER;
4786 zi.confmode = DAHDI_CONF_CONF | DAHDI_CONF_TALKER | DAHDI_CONF_LISTENER;
4789 if ((zi.confno ==
c->curconf.confno) && (zi.confmode ==
c->curconf.confmode))
4793 if (ioctl(
c->dfd, DAHDI_SETCONF, &zi)) {
4794 ast_log(
LOG_WARNING,
"Failed to add %d to conference %d/%d: %s\n",
c->dfd, zi.confmode, zi.confno, strerror(
errno));
4797 if (slavechannel < 1) {
4801 ast_debug(1,
"Added %d to conference %d/%d\n",
c->dfd,
c->curconf.confmode,
c->curconf.confno);
4808 if ((p->
channel ==
c->curconf.confno) && (
c->curconf.confmode == DAHDI_CONF_DIGITALMON))
4811 if ((p->
confno > 0) && (p->
confno ==
c->curconf.confno) && (
c->curconf.confmode & DAHDI_CONF_TALKER))
4818 struct dahdi_confinfo zi;
4825 memset(&zi, 0,
sizeof(zi));
4826 if (ioctl(
c->dfd, DAHDI_SETCONF, &zi)) {
4827 ast_log(
LOG_WARNING,
"Failed to drop %d from conference %d/%d: %s\n",
c->dfd,
c->curconf.confmode,
c->curconf.confno, strerror(
errno));
4830 ast_debug(1,
"Removed %d from conference %d/%d\n",
c->dfd,
c->curconf.confmode,
c->curconf.confno);
4831 memcpy(&
c->curconf, &zi,
sizeof(
c->curconf));
4843 for (x = 0; x < 3; x++) {
4851 if (useslavenative) {
4870 else if (slave->
law != p->
law) {
4876 return useslavenative;
4884 struct dahdi_confinfo zi;
4886 memset(&zi, 0,
sizeof(zi));
4902 for (x = 0; x < 3; x++) {
4945 ast_debug(1,
"Updated conferencing on %d, with %d conference users\n", p->
channel, needconf);
4954 ast_debug(1,
"Echo cancellation already on\n");
4958 ast_debug(1,
"Echo cancellation isn't required on digital connection\n");
4962#if defined(HAVE_PRI) || defined(HAVE_SS7)
4964#if defined(HAVE_PRI)
4975#if defined(HAVE_SS7)
4984 "Unable to enable audio mode on channel %d (%s)\n",
5000 ast_debug(1,
"No echo cancellation requested\n");
5016 ast_debug(1,
"No echo training requested\n");
5025 struct dahdi_echocanparams ecp = { .tap_length = 0 };
5040 struct dahdi_hwgain hwgain;
5042 hwgain.newgain = gain * 10.0;
5043 hwgain.tx = tx_direction;
5044 return ioctl(fd, DAHDI_SET_HWGAIN, &hwgain) < 0;
5051 float shallow, steep;
5052 float max = SHRT_MAX;
5054 neg = (sample < 0 ? -1 : 1);
5056 shallow = neg*(
max-
max/drc)+(
float)sample/drc;
5057 if (fabsf(steep) < fabsf(shallow)) {
5068static void fill_txgain(
struct dahdi_gains *g,
float gain,
float drc,
int law)
5073 float linear_gain = pow(10.0, gain / 20.0);
5076 case DAHDI_LAW_ALAW:
5077 for (j = 0; j <
ARRAY_LEN(g->txgain); j++) {
5083 k = (float)k * linear_gain;
5086 }
else if (k < -32768) {
5095 case DAHDI_LAW_MULAW:
5096 for (j = 0; j <
ARRAY_LEN(g->txgain); j++) {
5102 k = (float)k * linear_gain;
5105 }
else if (k < -32768) {
5118static void fill_rxgain(
struct dahdi_gains *g,
float gain,
float drc,
int law)
5122 float linear_gain = pow(10.0, gain / 20.0);
5125 case DAHDI_LAW_ALAW:
5126 for (j = 0; j <
ARRAY_LEN(g->rxgain); j++) {
5132 k = (float)k * linear_gain;
5135 }
else if (k < -32768) {
5144 case DAHDI_LAW_MULAW:
5145 for (j = 0; j <
ARRAY_LEN(g->rxgain); j++) {
5151 k = (float)k * linear_gain;
5154 }
else if (k < -32768) {
5168 struct dahdi_gains g;
5171 memset(&g, 0,
sizeof(g));
5172 res = ioctl(fd, DAHDI_GETGAINS, &g);
5180 return ioctl(fd, DAHDI_SETGAINS, &g);
5185 struct dahdi_gains g;
5188 memset(&g, 0,
sizeof(g));
5189 res = ioctl(fd, DAHDI_GETGAINS, &g);
5197 return ioctl(fd, DAHDI_SETGAINS, &g);
5200static int set_actual_gain(
int fd,
float rxgain,
float txgain,
float rxdrc,
float txdrc,
int law)
5237 res = ioctl(fd, DAHDI_HOOK, &x);
5240 if (
errno == EINPROGRESS)
5254#if defined(HAVE_PRI) || defined(HAVE_SS7)
5256#if defined(HAVE_PRI)
5264#if defined(HAVE_SS7)
5288 struct dahdi_confinfo
c;
5301 memset(&
c, 0,
sizeof(
c));
5302 c.confmode = DAHDI_CONF_NORMAL;
5308 ast_debug(1,
"Disabled conferencing\n");
5322 ast_debug(1,
"Restored conferencing\n");
5355 ast_debug(6,
"MWI manual override active on channel %d: pretending that it should be %s\n",
5386 if (
errno == EAGAIN)
5465#if defined(HAVE_PRI)
5472 subaddr = strchr(p->
exten,
':');
5501 x = DAHDI_FLUSH_READ | DAHDI_FLUSH_WRITE;
5516 (p->
law == DAHDI_LAW_ALAW) ? PRI_LAYER_1_ALAW : PRI_LAYER_1_ULAW);
5522#if defined(HAVE_SS7)
5554 openr2_calling_party_category_t chancat;
5573 chancat = dahdi_r2_get_channel_category(ast);
5574 callres = openr2_chan_make_call(p->r2chan, l, (
c + p->
stripmsd), chancat);
5575 if (-1 == callres) {
5580 p->mfcr2_call_accepted = 0;
5581 p->mfcr2_progress_sent = 0;
5655 }
else if (
iflist == pvt) {
5663 }
else if (
ifend == pvt) {
5674#if defined(HAVE_PRI)
5727#if defined(HAVE_PRI)
5765#if defined(HAVE_PRI)
5773static void dahdi_unlink_pri_pvt(
struct dahdi_pvt *pvt)
5784 for (idx = 0; idx <
pri->numchans; ++idx) {
5795#if defined(HAVE_SS7)
5803static void dahdi_unlink_ss7_pvt(
struct dahdi_pvt *pvt)
5814 for (idx = 0; idx <
ss7->numchans; ++idx) {
5825#if defined(HAVE_OPENR2)
5832static void dahdi_unlink_mfcr2_pvt(
struct dahdi_pvt *pvt)
5835 struct dahdi_mfcr2 *mfcr2;
5836 int should_destroy_link = 0;
5841 openr2_chan_disable_read(pvt->r2chan);
5845 for (idx = 0; idx < mfcr2->numchans; ++idx) {
5846 if (mfcr2->pvts[idx] == pvt) {
5847 ast_debug(1,
"Removing MFC/R2 channel %d from the mfcr2 link\n", pvt->
channel);
5848 mfcr2->pvts[idx] =
NULL;
5849 mfcr2->live_chans--;
5853 if (!mfcr2->live_chans) {
5854 ast_debug(1,
"MFC/R2 link is now empty\n");
5855 should_destroy_link = 1;
5859 if (should_destroy_link) {
5860 ast_debug(1,
"MFC/R2 link is now empty\n");
5861 mfcr2_queue_for_destruction(pvt);
5889#if defined(HAVE_PRI)
5890 dahdi_unlink_pri_pvt(p);
5892#if defined(HAVE_SS7)
5893 dahdi_unlink_ss7_pvt(p);
5895#if defined(HAVE_OPENR2)
5896 dahdi_unlink_mfcr2_pvt(p);
5904#if defined(HAVE_PRI)
5905 case DAHDI_IFLIST_NO_B_CHAN:
5907 dahdi_nobch_extract(p->pri, p);
5918#if defined(HAVE_PRI)
5923#if defined(HAVE_SS7)
5966 for (i = 0; i < 3; i++) {
5978#if defined(HAVE_PRI)
5994#if defined(HAVE_PRI_SERVICE_MESSAGES)
5996 char db_chan_name[20];
6001 snprintf(db_chan_name,
sizeof(db_chan_name),
"%s/%d:%d", dahdi_db, p->
span, chan);
6002 if (!
ast_db_get(db_chan_name, SRVST_DBKEY, db_answer,
sizeof(db_answer))) {
6003 sscanf(db_answer,
"%1c:%30d", &
state, &why);
6013 ast_verb(3,
"Unregistered channel %d\n", chan);
6018#if defined(HAVE_PRI)
6021 if (!pris[
span].dchannels[0]) {
6037#if defined(HAVE_PRI)
6038static char *dahdi_send_keypad_facility_app =
"DAHDISendKeypadFacility";
6040static int dahdi_send_keypad_facility_exec(
struct ast_channel *chan,
const char *digits)
6046 ast_debug(1,
"No digit string sent to application!\n");
6053 ast_debug(1,
"Unable to find technology private\n");
6063#if defined(HAVE_PRI)
6064#if defined(HAVE_PRI_PROG_W_CAUSE)
6065static char *dahdi_send_callrerouting_facility_app =
"DAHDISendCallreroutingFacility";
6067static int dahdi_send_callrerouting_facility_exec(
struct ast_channel *chan,
const char *data)
6080 ast_debug(1,
"No data sent to application!\n");
6084 ast_debug(1,
"Only DAHDI technology accepted!\n");
6089 ast_debug(1,
"Unable to find technology private\n");
6096 ast_debug(1,
"callrerouting attempted on non-ISDN channel %s\n",
6105 ast_log(
LOG_WARNING,
"callrerouting facility requires at least destination number argument\n");
6110 ast_log(
LOG_WARNING,
"Callrerouting Facility without original called number argument\n");
6115 ast_log(
LOG_NOTICE,
"Callrerouting Facility without diversion reason argument, defaulting to unknown\n");
6134#if defined(HAVE_OPENR2)
6135static const char *
const dahdi_accept_r2_call_app =
"DAHDIAcceptR2Call";
6137static int dahdi_accept_r2_call_exec(
struct ast_channel *chan,
const char *data)
6140 openr2_call_mode_t accept_mode;
6141 int res, timeout, maxloops;
6150 ast_debug(1,
"No data sent to application!\n");
6155 ast_debug(1,
"Only DAHDI technology accepted!\n");
6161 ast_debug(1,
"Unable to find technology private!\n");
6169 ast_log(
LOG_WARNING,
"DAHDIAcceptR2Call requires 'yes' or 'no' for the charge parameter\n");
6174 if (!p->mfcr2 || !p->mfcr2call) {
6180 if (p->mfcr2_call_accepted) {
6185 accept_mode =
ast_true(
args.charge) ? OR2_CALL_WITH_CHARGE : OR2_CALL_NO_CHARGE;
6186 if (openr2_chan_accept_call(p->r2chan, accept_mode)) {
6197 while (maxloops > 0) {
6226 if (p->mfcr2_call_accepted) {
6228 ast_debug(1,
"Accepted MFC/R2 call!\n");
6239static openr2_call_disconnect_cause_t dahdi_ast_cause_to_r2_cause(
int cause)
6241 openr2_call_disconnect_cause_t r2cause = OR2_CAUSE_NORMAL_CLEARING;
6246 r2cause = OR2_CAUSE_BUSY_NUMBER;
6251 r2cause = OR2_CAUSE_NETWORK_CONGESTION;
6255 r2cause = OR2_CAUSE_UNALLOCATED_NUMBER;
6260 r2cause = OR2_CAUSE_OUT_OF_ORDER;
6265 r2cause = OR2_CAUSE_NO_ANSWER;
6269 r2cause = OR2_CAUSE_NORMAL_CLEARING;
6272 ast_debug(1,
"ast cause %d resulted in openr2 cause %d/%s\n",
6273 cause, r2cause, openr2_proto_get_disconnect_string(r2cause));
6282 struct dahdi_bufferinfo bi = {
6290 if ((bpres = ioctl(p->
subs[
SUB_REAL].
dfd, DAHDI_SET_BUFINFO, &bi)) < 0) {
6307 struct dahdi_params par;
6335#if defined(HAVE_PRI)
6398#if defined(HAVE_SS7)
6477 ast_debug(1,
"Hangup: channel: %d index = %d, normal = %d, callwait = %d, thirdcall = %d\n",
6494 ast_debug(1,
"Normal call hung up with both three way call and a call waiting call in place?\n");
6497 ast_debug(1,
"We were flipped over to the callwait, moving back and not owning.\n");
6504 ast_debug(1,
"We were in the threeway and have a callwait still. Ditching the threeway.\n");
6510 ast_debug(1,
"Call was complete, setting owner to former third call\n");
6514 ast_debug(1,
"Call was incomplete, setting owner to NULL\n");
6533 ast_debug(1,
"Call was complete, setting owner to former third call\n");
6537 ast_debug(1,
"Call was incomplete, setting owner to NULL\n");
6598 if (p->mfcr2 && p->mfcr2call && openr2_chan_get_direction(p->r2chan) != OR2_DIR_STOPPED) {
6601 if (openr2_chan_get_direction(p->r2chan) == OR2_DIR_BACKWARD && p->mfcr2_forced_release) {
6602 dahdi_r2_disconnect_call(p, OR2_CAUSE_FORCED_RELEASE);
6605 int r2cause_user = r2causestr ? atoi(r2causestr) : 0;
6606 openr2_call_disconnect_cause_t r2cause = r2cause_user ? dahdi_ast_cause_to_r2_cause(r2cause_user)
6608 dahdi_r2_disconnect_call(p, r2cause);
6610 }
else if (p->mfcr2call) {
6636 memset(&par, 0,
sizeof(par));
6641 ast_debug(1,
"Hanging up channel %d, offhook = %d\n", p->
channel, par.rxisoffhook);
6644 if ((par.rxisoffhook) && (!(p->
radio || (p->
oprmode < 0))))
6737 ast_debug(1,
"Channel %d is no longer eligible for reorigination (went back on hook or became in use)\n", p->
channel);
6782#if defined(HAVE_PRI)
6787#if defined(HAVE_SS7)
6794 if (!p->mfcr2_call_accepted) {
6797 p->mfcr2_answer_pending = 1;
6798 if (p->mfcr2_charge_calls) {
6799 ast_debug(1,
"Accepting MFC/R2 call with charge before answering on chan %d\n", p->
channel);
6800 openr2_chan_accept_call(p->r2chan, OR2_CALL_WITH_CHARGE);
6802 ast_debug(1,
"Accepting MFC/R2 call with no charge before answering on chan %d\n", p->
channel);
6803 openr2_chan_accept_call(p->r2chan, OR2_CALL_NO_CHARGE);
6839 int val = DAHDI_TONEDETECT_ON | DAHDI_TONEDETECT_MUTE;
6860 if (!p || !data || (*datalen < 1)) {
6871 *cp = p->
tdd ? 1 : 0;
6885#if defined(HAVE_PRI)
6886#if defined(HAVE_PRI_CCSS)
6914 if (!p || !data || (datalen < 1)) {
6921 scp = (
signed char *) data;
6930 scp = (
signed char *) data;
6968 ast_debug(1,
"Set option TDD MODE, value: %s(%d) on %s\n",
6973 unsigned char mybuf[41000];
6975 int size, res, fd,
len;
6976 struct pollfd fds[1];
6979 memset(
buf, 0x7f,
sizeof(mybuf));
6995 fds[0].events = POLLPRI | POLLOUT;
6997 res = poll(fds, 1, -1);
7003 if (fds[0].revents & POLLPRI)
7005 if (!(fds[0].revents & POLLOUT)) {
7009 res = write(fd,
buf, size);
7011 if (res == -1)
return -1;
7035 ast_debug(1,
"Set option RELAX DTMF, value: %s(%d) on %s\n",
7040#if defined(HAVE_PRI)
7080 ast_debug(1,
"Set Operator Services mode, value: %d on %s/%s\n",
7133 if (!strcasecmp(data,
"rxgain")) {
7137 }
else if (!strcasecmp(data,
"txgain")) {
7141 }
else if (!strcasecmp(data,
"dahdi_channel")) {
7145 }
else if (!strcasecmp(data,
"dahdi_span")) {
7149 }
else if (!strcasecmp(data,
"dahdi_group")) {
7153 }
else if (!strcasecmp(data,
"dahdi_type")) {
7156#if defined(HAVE_OPENR2)
7161#if defined(HAVE_PRI)
7169#if defined(HAVE_SS7)
7180#if defined(HAVE_PRI)
7181#if defined(HAVE_PRI_REVERSE_CHARGE)
7182 }
else if (!strcasecmp(data,
"reversecharge")) {
7195#if defined(HAVE_PRI_SETUP_KEYPAD)
7196 }
else if (!strcasecmp(data,
"keypad_digits")) {
7210 }
else if (!strcasecmp(data,
"no_media_path")) {
7227 }
else if (!strcasecmp(data,
"dialmode")) {
7265 char policy_str[21] =
"";
7267 if ((res = sscanf(parse,
"%30d,%20s", num_buffers, policy_str)) != 2) {
7271 if (*num_buffers < 0) {
7275 if (!strcasecmp(policy_str,
"full")) {
7276 *policy = DAHDI_POLICY_WHEN_FULL;
7277 }
else if (!strcasecmp(policy_str,
"immediate")) {
7278 *policy = DAHDI_POLICY_IMMEDIATE;
7279#if defined(HAVE_DAHDI_HALF_FULL)
7280 }
else if (!strcasecmp(policy_str,
"half")) {
7281 *policy = DAHDI_POLICY_HALF_FULL;
7301 if (!strcasecmp(data,
"buffers")) {
7302 int num_bufs, policy;
7305 struct dahdi_bufferinfo bi = {
7306 .txbufpolicy = policy,
7307 .rxbufpolicy = policy,
7309 .numbufs = num_bufs,
7313 if ((bpres = ioctl(p->
subs[
SUB_REAL].
dfd, DAHDI_SET_BUFINFO, &bi)) < 0) {
7321 }
else if (!strcasecmp(data,
"echocan_mode")) {
7322 if (!strcasecmp(
value,
"on")) {
7326 }
else if (!strcasecmp(
value,
"off")) {
7330#ifdef HAVE_DAHDI_ECHOCANCEL_FAX_MODE
7331 }
else if (!strcasecmp(
value,
"fax")) {
7342 }
else if (!strcasecmp(
value,
"voice")) {
7358 }
else if (!strcasecmp(data,
"dialmode")) {
7369 if (!strcasecmp(
value,
"pulse")) {
7371 }
else if (!strcasecmp(
value,
"dtmf") || !strcasecmp(
value,
"tone")) {
7373 }
else if (!strcasecmp(
value,
"none")) {
7375 }
else if (!strcasecmp(
value,
"both")) {
7382 }
else if (!strcasecmp(data,
"waitfordialtone")) {
7422 if (!slave || (master->
slaves[x] == slave)) {
7463 if (!slave || !master) {
7468 if (!master->
slaves[x]) {
7469 master->
slaves[x] = slave;
7492 if (p->
owner == oldchan) {
7495 for (x = 0; x < 3; x++) {
7505#if defined(HAVE_PRI)
7509#if defined(HAVE_SS7)
7578 ast_verb(3,
"TRANSFERRING %s to %s\n",
7603 struct dahdi_confinfo ci;
7607 memset(&ci, 0,
sizeof(ci));
7616 ast_verb(3,
"Avoiding 3-way call when in an external conference\n");
7630 struct dahdi_spaninfo zi;
7631 struct dahdi_params params;
7633 memset(&zi, 0,
sizeof(zi));
7634 zi.spanno = p->
span;
7637 if (zi.alarms != DAHDI_ALARM_NONE)
7645 memset(¶ms, 0,
sizeof(params));
7646 if ((res = ioctl(p->
subs[
SUB_REAL].
dfd, DAHDI_GET_PARAMS, ¶ms)) >= 0)
7647 return params.chan_alarms;
7651 return DAHDI_ALARM_NONE;
7659 ast_debug(1,
"%s DTMF digit: 0x%02X '%c' on %s\n",
7676 *dest = &p->
subs[idx].
f;
7680 ast_debug(1,
"Got some DTMF, but it's for the CAS\n");
7689 *dest = &p->
subs[idx].
f;
7696 struct dahdi_bufferinfo bi = {
7703 if ((res = ioctl(p->
subs[idx].
dfd, DAHDI_SET_BUFINFO, &bi)) < 0) {
7741 ast_debug(1,
"Already in a fax extension, not redirecting\n");
7750 *dest = &p->
subs[idx].
f;
7760 "Alarm", alarm_txt);
7779 "Alarm", alarm_txt);
7789 const char *alarm_str;
7791#if defined(HAVE_PRI)
7832 p->
subs[idx].
f.
src =
"dahdi_handle_event";
7834 f = &p->
subs[idx].
f;
7844 if (res & (DAHDI_EVENT_PULSEDIGIT | DAHDI_EVENT_DTMFUP)) {
7845 p->
pulsedial = (res & DAHDI_EVENT_PULSEDIGIT) ? 1 : 0;
7847#if defined(HAVE_PRI)
7865 if (res & DAHDI_EVENT_DTMFDOWN) {
7866 ast_debug(1,
"DTMF Down '%c'\n", res & 0xff);
7867#if defined(HAVE_PRI)
7882 return &p->
subs[idx].
f;
7886 case DAHDI_EVENT_EC_DISABLED:
7890#ifdef HAVE_DAHDI_ECHOCANCEL_FAX_MODE
7891 case DAHDI_EVENT_TX_CED_DETECTED:
7892 ast_verb(3,
"Channel %d detected a CED tone towards the network.\n", p->
channel);
7894 case DAHDI_EVENT_RX_CED_DETECTED:
7895 ast_verb(3,
"Channel %d detected a CED tone from the network.\n", p->
channel);
7897 case DAHDI_EVENT_EC_NLP_DISABLED:
7898 ast_verb(3,
"Channel %d echo canceler disabled its NLP.\n", p->
channel);
7900 case DAHDI_EVENT_EC_NLP_ENABLED:
7901 ast_verb(3,
"Channel %d echo canceler enabled its NLP.\n", p->
channel);
7904 case DAHDI_EVENT_BITSCHANGED:
7910 openr2_chan_handle_cas(p->r2chan);
7916 case DAHDI_EVENT_PULSE_START:
7919 tone_zone_play_tone(p->
subs[idx].
dfd, -1);
7921 case DAHDI_EVENT_DIALCOMPLETE:
7923#if defined(HAVE_PRI)
7928 if (ioctl(p->
subs[idx].
dfd, DAHDI_DIALING, &x) == -1) {
7929 ast_debug(1,
"DAHDI_DIALING ioctl failed on %s: %s\n",
7954 if (ioctl(p->
subs[idx].
dfd,DAHDI_DIALING,&x) == -1) {
7963 p->
dop.op = DAHDI_DIAL_OP_REPLACE;
7982 ast_debug(1,
"Done dialing, but waiting for progress detection before doing more...\n");
8007 case DAHDI_EVENT_ALARM:
8009#if defined(HAVE_PRI)
8014#if defined(HAVE_SS7)
8026 if (!p->pri || !p->pri->pri || pri_get_timer(p->pri->pri, PRI_TIMER_T309) < 0) {
8032#if defined(HAVE_SS7)
8040 case DAHDI_EVENT_ONHOOK:
8074 ast_verb(3,
"Channel %d still has (callwait) call, ringing phone\n", p->
channel);
8089 unsigned int mssinceflash;
8100 if (p->
owner != ast) {
8110 ast_debug(1,
"Last flash was %u ms ago\n", mssinceflash);
8117 ast_debug(1,
"Looks like a bounced flash, hanging up both calls on %d\n", p->
channel);
8163 case DAHDI_EVENT_RINGOFFHOOK:
8193 int numchars = snprintf(p->
dop.dialstr,
sizeof(p->
dop.dialstr),
"M*0%s#",
c);
8194 if (numchars >=
sizeof(p->
dop.dialstr)) {
8201 if (strlen(p->
dop.dialstr) > 4) {
8206 p->
dop.dialstr[strlen(p->
dop.dialstr)-2] =
'\0';
8215 return &p->
subs[idx].
f;
8247 p->
dop.dialstr[0] =
'\0';
8250 ast_debug(1,
"Sent FXO deferred digit string: %s\n", p->
dop.dialstr);
8255 p->
dop.dialstr[0] =
'\0';
8259 return &p->
subs[idx].
f;
8266 return &p->
subs[idx].
f;
8279 res = tone_zone_play_tone(p->
subs[
SUB_REAL].
dfd, DAHDI_TONE_DIALTONE);
8294 ast_debug(1,
"Setting IDLE polarity due "
8295 "to ring. Old polarity was %d\n",
8338 case DAHDI_EVENT_RINGBEGIN:
8349 case DAHDI_EVENT_RINGERON:
8351 case DAHDI_EVENT_NOALARM:
8353#if defined(HAVE_PRI)
8358#if defined(HAVE_SS7)
8369 case DAHDI_EVENT_WINKFLASH:
8371 if (p->
radio)
break;
8375 struct dahdi_params par;
8377 memset(&par, 0,
sizeof(par));
8380 if (!par.rxisoffhook)
8398 ast_debug(1,
"Winkflash, index: %d, normal: %d, callwait: %d, thirdcall: %d\n",
8462 ast_debug(1,
"Flash when call not up or ringing\n");
8493 res = tone_zone_play_tone(p->
subs[
SUB_REAL].
dfd, DAHDI_TONE_DIALRECALL);
8501 res = tone_zone_play_tone(p->
subs[
SUB_REAL].
dfd, DAHDI_TONE_CONGESTION);
8517 ast_debug(1,
"Got flash with three way call up, dropping last call on %d\n", p->
channel);
8535 ast_verb(3,
"Building conference call with %s and %s\n",
8585 snprintf(p->
dop.dialstr,
sizeof(p->
dop.dialstr),
"M*%d%s#",
8594 ast_log(
LOG_WARNING,
"Received unexpected wink on channel of type SIG_FEATDMF_TA\n");
8611 p->
dop.dialstr[0] =
'\0';
8614 ast_debug(1,
"Sent deferred digit string: %s\n", p->
dop.dialstr);
8616 p->
dop.dialstr[0] =
'\0';
8622 case DAHDI_EVENT_HOOKCOMPLETE:
8640 p->
dop.dialstr[0] =
'\0';
8643 ast_debug(1,
"Sent deferred digit string: %s\n", p->
dop.dialstr);
8645 p->
dop.dialstr[0] =
'\0';
8646 p->
dop.op = DAHDI_DIAL_OP_REPLACE;
8656 ast_debug(1,
"Got hook complete in MF FGD, waiting for wink now on channel %d\n",p->
channel);
8662 case DAHDI_EVENT_POLARITY:
8674 ast_debug(1,
"Answering on polarity switch!\n");
8689 ast_debug(1,
"Polarity Reversal event occurred - DEBUG 1: channel %d, state %u, pol= %d, aonp= %d, honp= %d, pdelay= %d, tv= %" PRIi64
"\n", p->
channel,
ast_channel_state(ast), p->
polarity, p->
answeronpolarityswitch, p->
hanguponpolarityswitch, p->
polarityonanswerdelay,
ast_tvdiff_ms(
ast_tvnow(), p->
polaritydelaytv) );
8692 ast_debug(1,
"Polarity Reversal detected and now Hanging up on channel %d\n", p->
channel);
8703 ast_debug(1,
"Polarity Reversal event occurred - DEBUG 2: channel %d, state %u, pol= %d, aonp= %d, honp= %d, pdelay= %d, tv= %" PRIi64
"\n", p->
channel,
ast_channel_state(ast), p->
polarity, p->
answeronpolarityswitch, p->
hanguponpolarityswitch, p->
polarityonanswerdelay,
ast_tvdiff_ms(
ast_tvnow(), p->
polaritydelaytv) );
8706 ast_debug(1,
"Dunno what to do with event %d on channel %d\n", res, p->
channel);
8708 return &p->
subs[idx].
f;
8730 p->
subs[idx].
f.
src =
"dahdi_exception";
8746 if ((res != DAHDI_EVENT_RINGEROFF) && (res != DAHDI_EVENT_RINGERON) &&
8747 (res != DAHDI_EVENT_HOOKCOMPLETE)) {
8748 ast_debug(1,
"Restoring owner of channel %d on event %d\n", p->
channel, res);
8756 case DAHDI_EVENT_ONHOOK:
8768 case DAHDI_EVENT_RINGOFFHOOK:
8776 case DAHDI_EVENT_HOOKCOMPLETE:
8777 case DAHDI_EVENT_RINGERON:
8778 case DAHDI_EVENT_RINGEROFF:
8781 case DAHDI_EVENT_WINKFLASH:
8788 if (usedindex > -1) {
8805 f = &p->
subs[idx].
f;
8811 if (ast != p->
owner) {
8815 f = &p->
subs[idx].
f;
8909 struct dahdi_params ps;
8911 memset(&ps, 0,
sizeof(ps));
8927 return &p->
subs[idx].
f;
8930 if (!(--p->
ringt)) {
8938 openr2_chan_process_event(p->r2chan);
8939 if (OR2_DIR_FORWARD == openr2_chan_get_direction(p->r2chan)) {
8943 if (p->mfcr2_call_accepted &&
8944 !p->mfcr2_progress_sent &&
8946 ast_debug(1,
"Enqueuing progress frame after R2 accept in chan %d\n", p->
channel);
8948 p->mfcr2_progress_sent = 1;
8961 return &p->
subs[idx].
f;
8970 return &p->
subs[idx].
f;
8979 return &p->
subs[idx].
f;
8988 return &p->
subs[idx].
f;
8991 if (p->mfcr2 && openr2_chan_get_read_enabled(p->r2chan)) {
9007 return &p->
subs[idx].
f;
9017 return &p->
subs[idx].
f;
9027 return &p->
subs[idx].
f;
9069 if (
errno == EAGAIN) {
9072 return &p->
subs[idx].
f;
9073 }
else if (
errno == ELAST) {
9115 return &p->
subs[idx].
f;
9123 ast_verb(3,
"CPE does not support Call Waiting Caller*ID.\n");
9180 ast_debug(1,
"Channel driver fax CNG detection timeout on %s\n",
9225 ast_debug(1,
"Absorbing inband %s DTMF digit: 0x%02X '%c' on %s\n",
9248 ast_debug(1,
"Got 10 samples of dialtone!\n");
9252 p->
dop.dialstr[0] =
'\0';
9257 ast_debug(1,
"Sent deferred digit string: %s\n", p->
dop.dialstr);
9259 p->
dop.dialstr[0] =
'\0';
9260 p->
dop.op = DAHDI_DIAL_OP_REPLACE;
9269 f = &p->
subs[idx].
f;
9321 res = write(fd,
buf, size);
9366 if (mssinceflash >= 1000) {
9384 ast_debug(5,
"Dropping frame since I'm still dialing on %s...\n",
9390 ast_debug(5,
"Dropping frame since there is no active owner on %s...\n",
9396 ast_debug(5,
"Dropping frame since I've still got a callerid spill on %s...\n",
9438 int func = DAHDI_FLASH;
9443#if defined(HAVE_PRI)
9449#if defined(HAVE_SS7)
9459 if (p->mfcr2 && !p->mfcr2_call_accepted) {
9468 switch (condition) {
9470 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_BUSY);
9473 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_RINGTONE);
9534 p->
dop.dialstr[0] =
'\0';
9547 res = tone_zone_play_tone(p->
subs[idx].
dfd, -1);
9557#if defined(HAVE_PRI)
9572#if defined(HAVE_PRI)
9573 }
else if (i->pri) {
9575 y = ++i->pri->new_chan_seq;
9593 for (x = 0; x < 3; ++x) {
9631#if defined(HAVE_PRI)
9650 tmp =
ast_channel_alloc(0,
state, i->
cid_num, i->
cid_name, i->
accountcode, i->
exten, i->
context, assignedids, requestor, i->
amaflags,
"DAHDI/%s",
ast_str_buffer(chan_name));
9664#if defined(HAVE_PRI)
9672 if (law == DAHDI_LAW_ALAW) {
9682 ? DAHDI_LAW_ALAW : DAHDI_LAW_MULAW;
9717 x = DAHDI_TONEDETECT_ON | DAHDI_TONEDETECT_MUTE;
9718 if (ioctl(i->
subs[idx].
dfd, DAHDI_TONEDETECT, &x)) {
9736#if defined(HAVE_PRI) || defined(HAVE_SS7)
9770 ast_channel_parkinglot_set(tmp, i->
parkinglot);
9772 ast_channel_language_set(tmp, i->
language);
9799#if defined(HAVE_PRI) || defined(HAVE_SS7)
9828 dashptr = strrchr(device_name,
'-');
9835 for (v = i->
vars ; v ; v = v->
next)
9875 if (strchr(term,
c))
9887 j = DAHDI_IOMUX_SIGEVENT;
9889 if (ioctl(p->
subs[idx].
dfd,DAHDI_IOMUX,&j) == -1)
return(-1);
9891 if (j & DAHDI_IOMUX_SIGEVENT)
break;
9894 if (ioctl(p->
subs[idx].
dfd,DAHDI_GETEVENT,&j) == -1)
return(-1);
9934 return dahdichan->
dnd;
9939 ast_verb(3,
"%s DND on channel %d\n",
9940 flag?
"Enabled" :
"Disabled",
9948 int extlen = strlen(exten);
9954 if (extlen < strlen(pickupexten) && !strncmp(pickupexten, exten, extlen)) {
9958 if (exten[0] ==
'*' && extlen < 3) {
9979 unsigned char buf[256];
10000 const char *pickupexten;
10024 ast_log(
LOG_ERROR,
"Unable to retrieve pickup configuration options. Unable to detect call pickup extension\n");
10027 pickupexten =
ast_strdupa(pickup_cfg->pickupexten);
10052 res = tone_zone_play_tone(p->
subs[idx].
dfd, -1);
10062 memset(dtmfbuf, 0,
sizeof(dtmfbuf));
10077 res =
my_getsigstr(chan, dtmfbuf + strlen(dtmfbuf),
"*", 3000);
10087 if (res <= 0)
break;
10096 if ((p->
sig ==
SIG_FEATDMF) && (dtmfbuf[1] !=
'0') && (strlen(dtmfbuf) != 14))
10102 if (res <= 0)
break;
10110 res =
my_getsigstr(chan, dtmfbuf + strlen(dtmfbuf),
"#", 3000);
10127 res =
my_getsigstr(chan, dtmfbuf + strlen(dtmfbuf),
"*", 3000);
10134 dtmfbuf[
len] =
'\0';
10143 ast_debug(1,
"waitfordigit returned < 0...\n");
10147 dtmfbuf[
len++] = res;
10148 dtmfbuf[
len] =
'\0';
10160 }
else if (res < 0) {
10161 ast_debug(1,
"Got hung up before digits finished\n");
10176 if ((res > 0) && (strlen(anibuf) > 2)) {
10177 if (anibuf[strlen(anibuf) - 1] ==
'#')
10178 anibuf[strlen(anibuf) - 1] = 0;
10189 if (exten[0] ==
'*') {
10190 char *stringp=
NULL;
10194 s1 =
strsep(&stringp,
"*");
10195 s2 =
strsep(&stringp,
"*");
10208 if (exten[0] ==
'*') {
10209 char *stringp=
NULL;
10213 s1 =
strsep(&stringp,
"#");
10214 s2 =
strsep(&stringp,
"#");
10228 if (exten[0] ==
'*') {
10229 char *stringp=
NULL;
10233 s1 =
strsep(&stringp,
"#");
10234 s2 =
strsep(&stringp,
"#");
10235 if (s2 && (*(s2 + 1) ==
'0')) {
10245 if (exten[0] ==
'*') {
10246 char *stringp=
NULL;
10250 s1 =
strsep(&stringp,
"#");
10284 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_CONGESTION);
10290 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_INFO);
10298 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_CONGESTION);
10313 int is_exten_parking = 0;
10323 ast_debug(1,
"waitfordigit returned < 0...\n");
10324 res = tone_zone_play_tone(p->
subs[idx].
dfd, -1);
10328 ast_debug(1,
"waitfordigit returned '%c' (%d), timeout = %d\n", res, res, timeout);
10333 tone_zone_play_tone(p->
subs[idx].
dfd, -1);
10335 tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALTONE);
10346 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALRECALL);
10350 res = tone_zone_play_tone(p->
subs[idx].
dfd, -1);
10352 memset(exten, 0,
sizeof(exten));
10353 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALTONE);
10357 res = tone_zone_play_tone(p->
subs[idx].
dfd, -1);
10376 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_CONGESTION);
10385 }
else if (res == 0) {
10386 ast_debug(1,
"not enough digits (and no ambiguous match)...\n");
10387 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_CONGESTION);
10391 }
else if (p->
callwaiting && !strcmp(exten,
"*70")) {
10395 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALRECALL);
10401 ioctl(p->
subs[idx].
dfd,DAHDI_CONFDIAG,&
len);
10402 memset(exten, 0,
sizeof(exten));
10405 }
else if (!strcmp(exten, pickupexten)) {
10421 ast_debug(1,
"No call pickup possible...\n");
10422 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_CONGESTION);
10433 }
else if (!p->
hidecallerid && !strcmp(exten,
"*67")) {
10441 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALRECALL);
10447 memset(exten, 0,
sizeof(exten));
10449 }
else if (p->
callreturn && !strcmp(exten,
"*69")) {
10450 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALRECALL);
10452 }
else if (!strcmp(exten,
"*78")) {
10455 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALRECALL);
10457 memset(exten, 0,
sizeof(exten));
10459 }
else if (!strcmp(exten,
"*79")) {
10462 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALRECALL);
10464 memset(exten, 0,
sizeof(exten));
10467 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALRECALL);
10469 memset(exten, 0,
sizeof(exten));
10472 ast_verb(3,
"Cancelling call forwarding on channel %d\n", p->
channel);
10473 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALRECALL);
10476 memset(exten, 0,
sizeof(exten));
10489 if (bridge_channel) {
10508 }
else if (p->
hidecallerid && !strcmp(exten,
"*82")) {
10513 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_DIALRECALL);
10519 memset(exten, 0,
sizeof(exten));
10521 }
else if (!strcmp(exten,
"*0")) {
10528 if (nbridge && bridged) {
10531 if (nbridge && pbridge &&
10535 int func = DAHDI_FLASH;
10537 p->
dop.dialstr[0] =
'\0';
10550 tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_CONGESTION);
10552 tone_zone_play_tone(p->
subs[idx].
dfd, -1);
10570 tone_zone_play_tone(p->
subs[idx].
dfd, -1);
10580 if (smdi_msg !=
NULL) {
10583 if (smdi_msg->
type ==
'B')
10585 else if (smdi_msg->
type ==
'N')
10633 "Exiting simple switch\n");
10658 ast_debug(1,
"CID got string '%s'\n", dtmfbuf);
10671 struct timeval start;
10682 i = DAHDI_IOMUX_READ | DAHDI_IOMUX_SIGEVENT;
10683 if ((res = ioctl(p->
subs[idx].
dfd, DAHDI_IOMUX, &i))) {
10689 if (i & DAHDI_IOMUX_SIGEVENT) {
10692 if (res == DAHDI_EVENT_NOALARM) {
10697 if (res == DAHDI_EVENT_RINGBEGIN) {
10705 }
else if (i & DAHDI_IOMUX_READ) {
10708 if (
errno != ELAST) {
10729 "Failed to decode CallerID on channel '%s'\n",
10734 else if (samples > (8000 * 10))
10758 "Exiting simple switch\n");
10779 for (receivedRingT = 0; receivedRingT <
ARRAY_LEN(curRingData); receivedRingT++)
10780 curRingData[receivedRingT] = 0;
10791 i = DAHDI_IOMUX_READ | DAHDI_IOMUX_SIGEVENT;
10792 if ((res = ioctl(p->
subs[idx].
dfd, DAHDI_IOMUX, &i))) {
10798 if (i & DAHDI_IOMUX_SIGEVENT) {
10801 if (res == DAHDI_EVENT_NOALARM) {
10807 curRingData[receivedRingT] = p->
ringt;
10813 if (++receivedRingT ==
ARRAY_LEN(curRingData))
10815 }
else if (i & DAHDI_IOMUX_READ) {
10818 if (
errno != ELAST) {
10826 if (p->
ringt > 0) {
10827 if (!(--p->
ringt)) {
10835 ast_verb(3,
"Detected ring pattern: %d,%d,%d\n",curRingData[0],curRingData[1],curRingData[2]);
10836 for (counter = 0; counter < 3; counter++) {
10840 for (counter1 = 0; counter1 < 3; counter1++) {
10843 ast_verb(3,
"Pattern ignore (-1) detected, so matching pattern %d regardless.\n",
10844 curRingData[counter1]);
10848 ast_verb(3,
"Ring pattern matched in range: %d to %d\n",
10855 if (distMatches == 3) {
10873 "state, but I have nothing to do. "
10874 "Terminating simple switch, should be "
10875 "restarted by the actual ring.\n",
10884 struct timeval start;
10897 "Exiting simple switch\n");
10921 ast_debug(1,
"CID is '%s', flags %d\n",
10940 for (receivedRingT = 0; receivedRingT <
ARRAY_LEN(curRingData); receivedRingT++)
10941 curRingData[receivedRingT] = 0;
10954 i = DAHDI_IOMUX_READ | DAHDI_IOMUX_SIGEVENT;
10955 if ((res = ioctl(p->
subs[idx].
dfd, DAHDI_IOMUX, &i))) {
10961 if (i & DAHDI_IOMUX_SIGEVENT) {
10964 if (res == DAHDI_EVENT_NOALARM) {
10969 ast_debug(1,
"Hanging up due to polarity reversal on channel %d while detecting callerid\n", p->
channel);
10978 curRingData[receivedRingT] = p->
ringt;
10984 if (++receivedRingT ==
ARRAY_LEN(curRingData))
10986 }
else if (i & DAHDI_IOMUX_READ) {
10989 if (
errno != ELAST) {
10997 if (p->
ringt > 0) {
10998 if (!(--p->
ringt)) {
11011 "Failed to decode CallerID on channel '%s'\n",
11016 else if (
samples > (8000 * 10))
11026 for (receivedRingT = 0; receivedRingT < 3; receivedRingT++) {
11027 curRingData[receivedRingT] = 0;
11030 ast_verb(3,
"Detecting post-CID distinctive ring\n");
11032 i = DAHDI_IOMUX_READ | DAHDI_IOMUX_SIGEVENT;
11033 if ((res = ioctl(p->
subs[idx].
dfd, DAHDI_IOMUX, &i))) {
11039 if (i & DAHDI_IOMUX_SIGEVENT) {
11042 if (res == DAHDI_EVENT_NOALARM) {
11048 curRingData[receivedRingT] = p->
ringt;
11054 if (++receivedRingT ==
ARRAY_LEN(curRingData))
11056 }
else if (i & DAHDI_IOMUX_READ) {
11059 if (
errno != ELAST) {
11067 if (p->
ringt > 0) {
11068 if (!(--p->
ringt)) {
11078 ast_verb(3,
"Detected ring pattern: %d,%d,%d\n",curRingData[0],curRingData[1],curRingData[2]);
11080 for (counter = 0; counter < 3; counter++) {
11084 ast_verb(3,
"Checking %d,%d,%d\n",
11089 for (counter1 = 0; counter1 < 3; counter1++) {
11092 ast_verb(3,
"Pattern ignore (-1) detected, so matching pattern %d regardless.\n",
11093 curRingData[counter1]);
11098 ast_verb(3,
"Ring pattern matched in range: %d to %d\n",
11104 if (distMatches == 3) {
11151 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_CONGESTION);
11155 res = tone_zone_play_tone(p->
subs[idx].
dfd, DAHDI_TONE_CONGESTION);
11181 for (x = 0; x <
len; x++)
11191 pthread_t threadid;
11196 unsigned int spill_done = 0;
11197 int spill_result = -1;
11200 goto quit_no_clean;
11208 i = DAHDI_IOMUX_READ | DAHDI_IOMUX_SIGEVENT;
11214 if (i & DAHDI_IOMUX_SIGEVENT) {
11217 int callid_created;
11225 case DAHDI_EVENT_NEONMWI_ACTIVE:
11226 case DAHDI_EVENT_NEONMWI_INACTIVE:
11227 case DAHDI_EVENT_NONE:
11228 case DAHDI_EVENT_BITSCHANGED:
11230 case DAHDI_EVENT_NOALARM:
11239 case DAHDI_EVENT_ALARM:
11277 goto quit_no_clean;
11279 }
else if (i & DAHDI_IOMUX_READ) {
11281 if (
errno != ELAST) {
11296 }
else if (spill_result) {
11306 if (samples > (8000 * 4))
11311 if (spill_result == 1) {
11348#ifdef HAVE_DAHDI_LINEREVERSE_VMWI
11350 if (pvt->mwisend_rpas) {
11353 }
else if (pvt->mwisend_fsk) {
11381 x = DAHDI_FLUSH_BOTH;
11385#ifdef HAVE_DAHDI_LINEREVERSE_VMWI
11386 if (pvt->mwisend_fsk) {
11391#ifdef HAVE_DAHDI_LINEREVERSE_VMWI
11399 struct timeval now;
11423#ifdef HAVE_DAHDI_LINEREVERSE_VMWI
11424 if (pvt->mwisend_fsk) {
11426 gettimeofday(&now,
NULL);
11430#ifdef HAVE_DAHDI_LINEREVERSE_VMWI
11438 if (0 < num_read) {
11491 case DAHDI_EVENT_RINGEROFF:
11508 case DAHDI_EVENT_RINGOFFHOOK:
11518 case DAHDI_EVENT_RINGERON:
11519 case DAHDI_EVENT_HOOKCOMPLETE:
11533 int destroyed_first = 0;
11534 int destroyed_last = 0;
11541 int x = DAHDI_FLASH;
11543 if (cur->
channel > destroyed_last) {
11544 destroyed_last = cur->
channel;
11546 if (destroyed_first < 1 || cur->
channel < destroyed_first) {
11547 destroyed_first = cur->
channel;
11558 if (destroyed_first > start || destroyed_last <
end) {
11559 ast_debug(1,
"Asked to destroy %d-%d, destroyed %d-%d,\n",
11560 start,
end, destroyed_first, destroyed_last);
11565static void dahdi_r2_destroy_nodev(
void)
11567 struct r2link_entry *cur;
11571 struct dahdi_mfcr2 *r2 = &cur->mfcr2;
11572 ast_debug(3,
"About to destroy %d DAHDI channels of MFC/R2 link.\n", r2->numchans);
11573 for (i = 0; i < r2->numchans; i++) {
11586 pthread_cancel(r2->r2master);
11587 pthread_join(r2->r2master,
NULL);
11589 openr2_context_delete(r2->protocol_context);
11619 ast_debug(1,
"channel range caps: %d - %d\n", start,
end);
11624 "channel range %d-%d is occupied\n",
11633 struct dahdi_pri *pri = pris + x;
11635 if (!pris[x].pri.pvts[0]) {
11639 int channo = pri->dchannels[i];
11644 if (!pri->pri.fds[i]) {
11647 if (channo >= start && channo <=
end) {
11649 "channel range %d-%d is occupied by span %d\n",
11650 start,
end, x + 1);
11658 !
conf.chan.cc_params) {
11663 conf.wanted_channels_start = start;
11666 conf.wanted_channels_end =
end;
11682 pthread_t threadid;
11685 int callid_created;
11690 case DAHDI_EVENT_NONE:
11691 case DAHDI_EVENT_BITSCHANGED:
11693 case DAHDI_EVENT_WINKFLASH:
11694 case DAHDI_EVENT_RINGOFFHOOK:
11696 if (i->
radio)
break;
11703 if (res && (
errno == EBUSY)) {
11717 res = tone_zone_play_tone(i->
subs[
SUB_REAL].
dfd, DAHDI_TONE_RINGTONE);
11721 res = tone_zone_play_tone(i->
subs[
SUB_REAL].
dfd, DAHDI_TONE_CONGESTION);
11730 res = tone_zone_play_tone(i->
subs[
SUB_REAL].
dfd, DAHDI_TONE_STUTTER);
11732 res = tone_zone_play_tone(i->
subs[
SUB_REAL].
dfd, DAHDI_TONE_DIALTONE);
11734 ast_log(
LOG_WARNING,
"Unable to play dialtone on channel %d, do you have defaultzone and loadzone defined?\n", i->
channel);
11737 res = tone_zone_play_tone(i->
subs[
SUB_REAL].
dfd, DAHDI_TONE_CONGESTION);
11780 res = tone_zone_play_tone(i->
subs[
SUB_REAL].
dfd, DAHDI_TONE_CONGESTION);
11791 res = tone_zone_play_tone(i->
subs[
SUB_REAL].
dfd, DAHDI_TONE_CONGESTION);
11797 case DAHDI_EVENT_NOALARM:
11799#if defined(HAVE_PRI)
11806#if defined(HAVE_SS7)
11817 case DAHDI_EVENT_ALARM:
11819#if defined(HAVE_PRI)
11826#if defined(HAVE_SS7)
11838 case DAHDI_EVENT_ONHOOK:
11884 case DAHDI_EVENT_POLARITY:
11898 ast_verb(2,
"Starting post polarity "
11899 "CID detection on channel %d\n",
11913 "polarity reversal on non-FXO (SIG_FXS) "
11914 "interface %d\n", i->
channel);
11917 case DAHDI_EVENT_REMOVED:
11919 "Got DAHDI_EVENT_REMOVED. Destroying channel %d\n",
11922 case DAHDI_EVENT_NEONMWI_ACTIVE:
11928 case DAHDI_EVENT_NEONMWI_INACTIVE:
11939 struct pollfd **pfds = arg;
11945 int count, res, res2, spoint, pollres=0;
11949 time_t thispass = 0, lastpass = 0;
11952 struct pollfd *pfds=
NULL;
11953 int lastalloc = -1;
11958 if (pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,
NULL)) {
11964 pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,
NULL);
11970 if (!pfds || (lastalloc !=
ifcount)) {
11997 pfds[count].events = POLLPRI;
11998 pfds[count].revents = 0;
12002 pfds[count].events |= POLLIN;
12010 pfds[count].events = POLLPRI;
12011 pfds[count].revents = 0;
12016 pfds[count].events |= POLLIN;
12027 pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,
NULL);
12028 pthread_testcancel();
12030 res = poll(pfds, count, 1000);
12031 pthread_testcancel();
12032 pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,
NULL);
12045 lastpass = thispass;
12046 thispass = time(
NULL);
12057 if (thispass != lastpass) {
12064 && !
last->mwisendactive
12065 && (
last->sig & __DAHDI_SIG_FXO)
12078 res2 = ioctl(
last->subs[
SUB_REAL].dfd, DAHDI_VMWI, &res);
12081 ast_debug(3,
"Unable to control message waiting led on channel %d: %s\n",
last->channel, strerror(
errno));
12084 ast_debug(5,
"Initiating MWI FSK spill on channel %d\n",
last->channel);
12114 if (pollres & POLLIN) {
12130 pthread_attr_t attr;
12131 pthread_t threadid;
12134 pthread_attr_init(&attr);
12135 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
12140 memcpy(mtd->
buf,
buf, res);
12153 struct timeval now;
12161 gettimeofday(&now,
NULL);
12168 pthread_t threadid;
12203 if (pollres & POLLPRI) {
12230 ast_debug(1,
"Woah! Went back on hook before reoriginate could happen on channel %d\n", i->
channel);
12233 res = DAHDI_EVENT_RINGOFFHOOK;
12248 dahdi_r2_destroy_nodev();
12252 pthread_cleanup_pop(1);
12283#if defined(HAVE_PRI)
12284static int pri_resolve_span(
int *
span,
int channel,
int offset,
struct dahdi_spaninfo *si)
12289 trunkgroup = pris[*
span].mastertrunkgroup;
12304 }
else if (pris[*
span].mastertrunkgroup) {
12305 ast_log(
LOG_WARNING,
"Unable to use span %d implicitly since it is already part of trunk group %d\n", *
span, pris[*
span].mastertrunkgroup);
12308 if (si->totalchans == 31) {
12310 pris[*
span].dchannels[0] = 16 + offset;
12311 }
else if (si->totalchans == 24) {
12313 pris[*
span].dchannels[0] = 24 + offset;
12314 }
else if (si->totalchans == 3) {
12316 pris[*
span].dchannels[0] = 3 + offset;
12318 ast_log(
LOG_WARNING,
"Unable to use span %d, since the D-channel cannot be located (unexpected span size of %d channels)\n", *
span, si->totalchans);
12329#if defined(HAVE_PRI)
12330static int pri_create_trunkgroup(
int trunkgroup,
int *
channels)
12332 struct dahdi_spaninfo si;
12333 struct dahdi_params p;
12340 ast_log(
LOG_WARNING,
"Trunk group %d already exists on span %d, Primary d-channel %d\n", trunkgroup, x + 1, pris[x].dchannels[0]);
12347 memset(&si, 0,
sizeof(si));
12348 memset(&p, 0,
sizeof(p));
12349 fd = open(
"/dev/dahdi/channel", O_RDWR);
12355 if (ioctl(fd, DAHDI_SPECIFY, &x)) {
12360 if (ioctl(fd, DAHDI_GET_PARAMS, &p)) {
12365 if (ioctl(fd, DAHDI_SPANSTAT, &si)) {
12370 span = p.spanno - 1;
12376 if (pris[span].pri.
pvts[0]) {
12377 ast_log(
LOG_WARNING,
"Span %d is already provisioned with channels (implicit PRI maybe?)\n", span + 1);
12382 pris[span].pri.trunkgroup = trunkgroup;
12385 pris[ospan].dchannels[y] =
channels[y];
12386 pris[span].pri.span = span + 1;
12393#if defined(HAVE_PRI)
12394static int pri_create_spanmap(
int span,
int trunkgroup,
int logicalspan)
12396 if (pris[span].mastertrunkgroup) {
12397 ast_log(
LOG_WARNING,
"Span %d is already part of trunk group %d, cannot add to trunk group %d\n", span + 1, pris[span].mastertrunkgroup, trunkgroup);
12400 pris[span].mastertrunkgroup = trunkgroup;
12401 pris[span].prilogicalspan = logicalspan;
12406#if defined(HAVE_SS7)
12407static unsigned int parse_pointcode(
const char *pcstring)
12409 unsigned int code1, code2, code3;
12412 numvals = sscanf(pcstring,
"%30d-%30d-%30d", &code1, &code2, &code3);
12416 return (code1 << 16) | (code2 << 8) | code3;
12422#if defined(HAVE_SS7)
12423static struct dahdi_ss7 * ss7_resolve_linkset(
int linkset)
12425 if ((linkset < 0) || (linkset >=
NUM_SPANS))
12428 return &linksets[linkset - 1];
12433static void dahdi_r2_destroy_links(
void)
12435 struct r2link_entry *cur;
12440 ast_debug(3,
"MFC/R2 link #%d queued for destruction\n", cur->mfcr2.index);
12446 dahdi_r2_destroy_nodev();
12450#define R2_LINK_CAPACITY 30
12453 struct r2link_entry *cur =
NULL;
12461 if (memcmp(&
conf->mfcr2, &cur->mfcr2.conf,
sizeof(
conf->mfcr2))) {
12462 ast_debug(3,
"Need new R2 link because of: Configuration change\n");
12464 }
else if (cur->mfcr2.numchans == R2_LINK_CAPACITY) {
12465 ast_debug(3,
"Need new R2 link because of: Capacity (%d)\n", R2_LINK_CAPACITY);
12470 struct r2link_entry *tmp =
NULL;
12471 int new_idx = r2links_count + 1;
12473 for (i = 1; i <= r2links_count; i++) {
12476 if (i == tmp->mfcr2.index) {
12491 cur->mfcr2.index = new_idx;
12494 ast_debug(3,
"Created new R2 link #%d (now have %d)\n", new_idx, r2links_count);
12501static int dahdi_r2_set_context(
struct dahdi_mfcr2 *r2_link,
const struct dahdi_chan_conf *
conf)
12503 char tmplogdir[] =
"/tmp";
12504 char logdir[OR2_MAX_PATH];
12507 r2_link->protocol_context = openr2_context_new(
NULL, &dahdi_r2_event_iface,
12508 &dahdi_r2_transcode_iface,
conf->mfcr2.variant,
conf->mfcr2.max_ani,
12509 conf->mfcr2.max_dnis);
12510 if (!r2_link->protocol_context) {
12513 openr2_context_set_log_level(r2_link->protocol_context,
conf->mfcr2.loglevel);
12514 openr2_context_set_ani_first(r2_link->protocol_context,
conf->mfcr2.get_ani_first);
12515#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 1
12516 openr2_context_set_skip_category_request(r2_link->protocol_context,
conf->mfcr2.skip_category_request);
12518 openr2_context_set_mf_threshold(r2_link->protocol_context,
threshold);
12519 openr2_context_set_mf_back_timeout(r2_link->protocol_context,
conf->mfcr2.mfback_timeout);
12520 openr2_context_set_metering_pulse_timeout(r2_link->protocol_context,
conf->mfcr2.metering_pulse_timeout);
12521 openr2_context_set_double_answer(r2_link->protocol_context,
conf->mfcr2.double_answer);
12522 openr2_context_set_immediate_accept(r2_link->protocol_context,
conf->mfcr2.immediate_accept);
12523#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 2
12524 openr2_context_set_dtmf_dialing(r2_link->protocol_context,
conf->mfcr2.dtmf_dialing,
conf->mfcr2.dtmf_time_on,
conf->mfcr2.dtmf_time_off);
12525 openr2_context_set_dtmf_detection(r2_link->protocol_context,
conf->mfcr2.dtmf_detection);
12527#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 3
12528 openr2_context_set_dtmf_detection_end_timeout(r2_link->protocol_context,
conf->mfcr2.dtmf_end_timeout);
12531 if (openr2_context_set_log_directory(r2_link->protocol_context, tmplogdir)) {
12532 ast_log(
LOG_ERROR,
"Failed setting default MFC/R2 log directory %s\n", tmplogdir);
12536 if (snres >=
sizeof(logdir)) {
12537 ast_log(
LOG_ERROR,
"MFC/R2 logging directory truncated, using %s\n", tmplogdir);
12538 if (openr2_context_set_log_directory(r2_link->protocol_context, tmplogdir)) {
12539 ast_log(
LOG_ERROR,
"Failed setting default MFC/R2 log directory %s\n", tmplogdir);
12542 if (openr2_context_set_log_directory(r2_link->protocol_context, logdir)) {
12548 if (openr2_context_configure_from_advanced_file(r2_link->protocol_context,
conf->mfcr2.r2proto_file)) {
12549 ast_log(
LOG_ERROR,
"Failed to configure r2context from advanced configuration file %s\n",
conf->mfcr2.r2proto_file);
12553 memcpy(&r2_link->conf, &
conf->mfcr2,
sizeof(r2_link->conf));
12587 struct dahdi_bufferinfo bi;
12590#if defined(HAVE_PRI)
12596 struct dahdi_params p;
12597#if defined(HAVE_PRI)
12598 struct dahdi_spaninfo si;
12601#if defined(HAVE_SS7)
12621 if (!here && reloading != 1) {
12633 for (x = 0; x < 3; x++)
12640 int chan_sig =
conf->chan.sig;
12643 if (reloading && tmp->
vars) {
12653 snprintf(fn,
sizeof(fn),
"%d",
channel);
12668 memset(&p, 0,
sizeof(p));
12675 if (
conf->is_sig_auto)
12677 if (p.sigtype != (chan_sig & 0x3ffff)) {
12683 tmp->
law = p.curlaw;
12684 tmp->
span = p.spanno;
12685#if defined(HAVE_PRI)
12686 span = p.spanno - 1;
12691 tmp->
sig = chan_sig;
12702#if defined(HAVE_SS7)
12704 struct dahdi_ss7 *ss7;
12708 ast_log(
LOG_ERROR,
"Unable to set clear mode on clear channel %d of span %d: %s\n", channel, p.spanno, strerror(
errno));
12713 ss7 = ss7_resolve_linkset(cur_linkset);
12719 ss7->ss7.span = cur_linkset;
12720 if (cur_cicbeginswith < 0) {
12731 tmp->ss7 = &ss7->ss7;
12734 ss7_chan->
cic = cur_cicbeginswith++;
12737 ss7_chan->
dpc = cur_defaultdpc;
12739 ss7->ss7.pvts[ss7->ss7.numchans++] = ss7_chan;
12741 ast_copy_string(ss7->ss7.internationalprefix,
conf->ss7.ss7.internationalprefix,
sizeof(ss7->ss7.internationalprefix));
12742 ast_copy_string(ss7->ss7.nationalprefix,
conf->ss7.ss7.nationalprefix,
sizeof(ss7->ss7.nationalprefix));
12743 ast_copy_string(ss7->ss7.subscriberprefix,
conf->ss7.ss7.subscriberprefix,
sizeof(ss7->ss7.subscriberprefix));
12744 ast_copy_string(ss7->ss7.unknownprefix,
conf->ss7.ss7.unknownprefix,
sizeof(ss7->ss7.unknownprefix));
12745 ast_copy_string(ss7->ss7.networkroutedprefix,
conf->ss7.ss7.networkroutedprefix,
sizeof(ss7->ss7.networkroutedprefix));
12747 ss7->ss7.called_nai =
conf->ss7.ss7.called_nai;
12748 ss7->ss7.calling_nai =
conf->ss7.ss7.calling_nai;
12753 struct dahdi_mfcr2 *r2_link;
12754 struct r2link_entry *r2_le = dahdi_r2_get_link(
conf);
12755 r2_link = &r2_le->mfcr2;
12761 if (!r2_link->protocol_context && dahdi_r2_set_context(r2_link,
conf)) {
12766 if (r2_link->numchans ==
ARRAY_LEN(r2_link->pvts)) {
12771 r2_link->pvts[r2_link->numchans++] = tmp;
12772 tmp->r2chan = openr2_chan_new_from_fd(r2_link->protocol_context,
12775 if (!tmp->r2chan) {
12776 openr2_liberr_t err = openr2_context_get_last_error(r2_link->protocol_context);
12777 ast_log(
LOG_ERROR,
"Cannot create OpenR2 channel: %s\n", openr2_context_error_string(err));
12781 r2_link->live_chans++;
12782 tmp->mfcr2 = r2_link;
12783 if (
conf->mfcr2.call_files) {
12784 openr2_chan_enable_call_files(tmp->r2chan);
12786 openr2_chan_set_client_data(tmp->r2chan, tmp);
12788 openr2_chan_set_logging_func(tmp->r2chan, (openr2_logging_func_t)dahdi_r2_on_chan_log);
12789 openr2_chan_set_log_level(tmp->r2chan,
conf->mfcr2.loglevel);
12790 tmp->mfcr2_category =
conf->mfcr2.category;
12791 tmp->mfcr2_charge_calls =
conf->mfcr2.charge_calls;
12792 tmp->mfcr2_allow_collect_calls =
conf->mfcr2.allow_collect_calls;
12793 tmp->mfcr2_forced_release =
conf->mfcr2.forced_release;
12794 tmp->mfcr2_accept_on_offer =
conf->mfcr2.accept_on_offer;
12795 tmp->mfcr2call = 0;
12796 tmp->mfcr2_dnis_index = 0;
12797 tmp->mfcr2_ani_index = 0;
12805 int myswitchtype = 0;
12809 ast_log(
LOG_ERROR,
"Unable to set clear mode on clear channel %d of span %d: %s\n", channel, p.spanno, strerror(
errno));
12814 ast_log(
LOG_ERROR,
"Channel %d does not lie on a span I know of (%d)\n", channel, span);
12825 tmp->logicalspan = pris[span].prilogicalspan;
12826 pri_resolve_span(&span, channel, (channel - p.chanpos), &si);
12828 ast_log(
LOG_WARNING,
"Channel %d: Unable to find locate channel/trunk group!\n", channel);
12832 myswitchtype =
conf->pri.pri.switchtype;
12837 if (pris[x].dchannels[y] == tmp->
channel) {
12843 if (!matchesdchan) {
12844 if (pris[span].pri.
nodetype && (pris[span].pri.nodetype !=
conf->pri.pri.nodetype)) {
12849 if (pris[span].pri.
switchtype && (pris[span].pri.switchtype != myswitchtype)) {
12854 if ((pris[span].pri.
dialplan) && (pris[span].pri.dialplan !=
conf->pri.pri.dialplan)) {
12855 ast_log(
LOG_ERROR,
"Span %d is already a %s dialing plan\n", span + 1, pris[span].pri.
dialplan == -1 ?
"Dynamically set dialplan in ISDN" : pri_plan2str(pris[span].pri.
dialplan));
12869 if (pris[span].pri.
minunused && (pris[span].pri.minunused !=
conf->pri.pri.minunused)) {
12870 ast_log(
LOG_ERROR,
"Span %d already has minunused of %d.\n", span + 1,
conf->pri.pri.minunused);
12874 if (pris[span].pri.
minidle && (pris[span].pri.minidle !=
conf->pri.pri.minidle)) {
12880 ast_log(
LOG_ERROR,
"Unable to add channel %d: Too many channels in trunk group %d!\n", channel,
12886 pri_chan =
sig_pri_chan_new(tmp, &pris[span].pri, tmp->logicalspan, p.chanpos, pris[span].mastertrunkgroup);
12892 tmp->pri = &pris[span].pri;
12904 conf->chan.cc_params);
12906 pris[span].pri.sig = chan_sig;
12907 pris[span].pri.nodetype =
conf->pri.pri.nodetype;
12908 pris[span].pri.switchtype = myswitchtype;
12909 pris[span].pri.nsf =
conf->pri.pri.nsf;
12910 pris[span].pri.dialplan =
conf->pri.pri.dialplan;
12911 pris[span].pri.localdialplan =
conf->pri.pri.localdialplan;
12912 pris[span].pri.cpndialplan =
conf->pri.pri.cpndialplan;
12913 pris[span].pri.pvts[pris[span].pri.numchans++] = tmp->
sig_pvt;
12914 pris[span].pri.minunused =
conf->pri.pri.minunused;
12915 pris[span].pri.minidle =
conf->pri.pri.minidle;
12916 pris[span].pri.overlapdial =
conf->pri.pri.overlapdial;
12917 pris[span].pri.qsigchannelmapping =
conf->pri.pri.qsigchannelmapping;
12918 pris[span].pri.discardremoteholdretrieval =
conf->pri.pri.discardremoteholdretrieval;
12919#if defined(HAVE_PRI_SERVICE_MESSAGES)
12920 pris[span].pri.enable_service_message_support =
conf->pri.pri.enable_service_message_support;
12922#ifdef HAVE_PRI_INBANDDISCONNECT
12923 pris[span].pri.inbanddisconnect =
conf->pri.pri.inbanddisconnect;
12925#if defined(HAVE_PRI_CALL_HOLD)
12926 pris[span].pri.hold_disconnect_transfer =
12927 conf->pri.pri.hold_disconnect_transfer;
12929#if defined(HAVE_PRI_CCSS)
12930 pris[span].pri.cc_ptmp_recall_mode =
12931 conf->pri.pri.cc_ptmp_recall_mode;
12932 pris[span].pri.cc_qsig_signaling_link_req =
12933 conf->pri.pri.cc_qsig_signaling_link_req;
12934 pris[span].pri.cc_qsig_signaling_link_rsp =
12935 conf->pri.pri.cc_qsig_signaling_link_rsp;
12937#if defined(HAVE_PRI_CALL_WAITING)
12938 pris[span].pri.max_call_waiting_calls =
12939 conf->pri.pri.max_call_waiting_calls;
12940 pris[span].pri.allow_call_waiting_calls =
12941 conf->pri.pri.allow_call_waiting_calls;
12943 pris[span].pri.transfer =
conf->chan.transfer;
12944 pris[span].pri.facilityenable =
conf->pri.pri.facilityenable;
12945#if defined(HAVE_PRI_L2_PERSISTENCE)
12946 pris[span].pri.l2_persistence =
conf->pri.pri.l2_persistence;
12948 pris[span].pri.colp_send =
conf->pri.pri.colp_send;
12949#if defined(HAVE_PRI_AOC_EVENTS)
12950 pris[span].pri.aoc_passthrough_flag =
conf->pri.pri.aoc_passthrough_flag;
12951 pris[span].pri.aoce_delayhangup =
conf->pri.pri.aoce_delayhangup;
12954 pris[span].pri.layer1_ignored =
conf->pri.pri.layer1_ignored;
12957 pris[span].pri.layer1_ignored = 0;
12959 pris[span].pri.append_msn_to_user_tag =
conf->pri.pri.append_msn_to_user_tag;
12960 pris[span].pri.inband_on_setup_ack =
conf->pri.pri.inband_on_setup_ack;
12961 pris[span].pri.inband_on_proceeding =
conf->pri.pri.inband_on_proceeding;
12962 ast_copy_string(pris[span].pri.initial_user_tag,
conf->chan.cid_tag,
sizeof(pris[span].pri.initial_user_tag));
12963 ast_copy_string(pris[span].pri.msn_list,
conf->pri.pri.msn_list,
sizeof(pris[span].pri.msn_list));
12964#if defined(HAVE_PRI_MWI)
12966 conf->pri.pri.mwi_mailboxes,
12967 sizeof(pris[span].pri.mwi_mailboxes));
12969 conf->pri.pri.mwi_vm_boxes,
12970 sizeof(pris[span].pri.mwi_vm_boxes));
12972 conf->pri.pri.mwi_vm_numbers,
12973 sizeof(pris[span].pri.mwi_vm_numbers));
12975 ast_copy_string(pris[span].pri.idledial,
conf->pri.pri.idledial,
sizeof(pris[span].pri.idledial));
12976 ast_copy_string(pris[span].pri.idleext,
conf->pri.pri.idleext,
sizeof(pris[span].pri.idleext));
12977 ast_copy_string(pris[span].pri.internationalprefix,
conf->pri.pri.internationalprefix,
sizeof(pris[span].pri.internationalprefix));
12978 ast_copy_string(pris[span].pri.nationalprefix,
conf->pri.pri.nationalprefix,
sizeof(pris[span].pri.nationalprefix));
12979 ast_copy_string(pris[span].pri.localprefix,
conf->pri.pri.localprefix,
sizeof(pris[span].pri.localprefix));
12980 ast_copy_string(pris[span].pri.privateprefix,
conf->pri.pri.privateprefix,
sizeof(pris[span].pri.privateprefix));
12981 ast_copy_string(pris[span].pri.unknownprefix,
conf->pri.pri.unknownprefix,
sizeof(pris[span].pri.unknownprefix));
12982 pris[span].pri.moh_signaling =
conf->pri.pri.moh_signaling;
12983 pris[span].pri.resetinterval =
conf->pri.pri.resetinterval;
12984#if defined(HAVE_PRI_DISPLAY_TEXT)
12985 pris[span].pri.display_flags_send =
conf->pri.pri.display_flags_send;
12986 pris[span].pri.display_flags_receive =
conf->pri.pri.display_flags_receive;
12988#if defined(HAVE_PRI_MCID)
12989 pris[span].pri.mcid_send =
conf->pri.pri.mcid_send;
12991 pris[span].pri.force_restart_unavailable_chans =
conf->pri.pri.force_restart_unavailable_chans;
12992#if defined(HAVE_PRI_DATETIME_SEND)
12993 pris[span].pri.datetime_send =
conf->pri.pri.datetime_send;
12996 for (x = 0; x < PRI_MAX_TIMERS; x++) {
12997 pris[span].pri.pritimers[x] =
conf->pri.pri.pritimers[x];
13000#if defined(HAVE_PRI_CALL_WAITING)
13002 pris[span].pri.ch_cfg.stripmsd =
conf->chan.stripmsd;
13003 pris[span].pri.ch_cfg.hidecallerid =
conf->chan.hidecallerid;
13004 pris[span].pri.ch_cfg.hidecalleridname =
conf->chan.hidecalleridname;
13005 pris[span].pri.ch_cfg.immediate =
conf->chan.immediate;
13006 pris[span].pri.ch_cfg.priexclusive =
conf->chan.priexclusive;
13007 pris[span].pri.ch_cfg.priindication_oob =
conf->chan.priindication_oob;
13008 pris[span].pri.ch_cfg.use_callerid =
conf->chan.use_callerid;
13009 pris[span].pri.ch_cfg.use_callingpres =
conf->chan.use_callingpres;
13010 ast_copy_string(pris[span].pri.ch_cfg.context,
conf->chan.context,
sizeof(pris[span].pri.ch_cfg.context));
13011 ast_copy_string(pris[span].pri.ch_cfg.mohinterpret,
conf->chan.mohinterpret,
sizeof(pris[span].pri.ch_cfg.mohinterpret));
13024 chan_sig = tmp->
sig;
13026 memset(&p, 0,
sizeof(p));
13031 switch (chan_sig) {
13055 p.channo = channel;
13059 p.debouncetime = 5;
13061 p.channo = channel;
13063 if (
conf->timing.prewinktime >= 0)
13064 p.prewinktime =
conf->timing.prewinktime;
13065 if (
conf->timing.preflashtime >= 0)
13066 p.preflashtime =
conf->timing.preflashtime;
13067 if (
conf->timing.winktime >= 0)
13068 p.winktime =
conf->timing.winktime;
13069 if (
conf->timing.flashtime >= 0)
13070 p.flashtime =
conf->timing.flashtime;
13071 if (
conf->timing.starttime >= 0)
13072 p.starttime =
conf->timing.starttime;
13073 if (
conf->timing.rxwinktime >= 0)
13074 p.rxwinktime =
conf->timing.rxwinktime;
13075 if (
conf->timing.rxflashtime >= 0)
13076 p.rxflashtime =
conf->timing.rxflashtime;
13077 if (
conf->timing.debouncetime >= 0)
13078 p.debouncetime =
conf->timing.debouncetime;
13093 memset(&bi, 0,
sizeof(bi));
13096 bi.txbufpolicy =
conf->chan.buf_policy;
13097 bi.rxbufpolicy =
conf->chan.buf_policy;
13098 bi.numbufs =
conf->chan.buf_no;
13122 if (chan_sig & __DAHDI_SIG_FXS) {
13163 if (
conf->chan.echocanbridged)
13164 ast_log(
LOG_NOTICE,
"echocancelwhenbridged requires echocancel to be enabled; ignoring\n");
13205 ast_log(
LOG_ERROR,
"Invalid SMDI port specified, disabling SMDI support\n");
13233#if defined(HAVE_PRI)
13250#ifdef HAVE_DAHDI_LINEREVERSE_VMWI
13251 tmp->mwisend_setting =
conf->chan.mwisend_setting;
13252 tmp->mwisend_fsk =
conf->chan.mwisend_fsk;
13253 tmp->mwisend_rpas =
conf->chan.mwisend_rpas;
13263 if (
conf->chan.vars) {
13265 for (v =
conf->chan.vars ; v ; v = v->
next) {
13269 tmp->
vars = tmpvar;
13296 switch (chan_sig) {
13308 if ((res =
get_alarms(tmp)) != DAHDI_ALARM_NONE) {
13310 switch (tmp->
sig) {
13316#if defined(HAVE_SS7)
13347 switch (tmp->
sig) {
13348#if defined(HAVE_PRI)
13351#if defined(HAVE_PRI_SERVICE_MESSAGES)
13354 char db_chan_name[20];
13361 snprintf(db_chan_name,
sizeof(db_chan_name),
"%s/%d:%d", dahdi_db, tmp->
span, tmp->
channel);
13362 if (!
ast_db_get(db_chan_name, SRVST_DBKEY, db_answer,
sizeof(db_answer))) {
13366 if (tmp->pri->enable_service_message_support) {
13369 sscanf(db_answer,
"%1c:%30u", &
state, why);
13372 *why &= (SRVST_NEAREND | SRVST_FAREND);
13382#if defined(HAVE_SS7)
13397 switch (tmp->
sig) {
13398#if defined(HAVE_PRI)
13418#if defined(HAVE_SS7)
13473 switch (
conf->chan.cid_start) {
13492 if (chan_sig & __DAHDI_SIG_FXO) {
13493 memset(&p, 0,
sizeof(p));
13498#ifdef HAVE_DAHDI_LINEREVERSE_VMWI
13499 res = ioctl(tmp->
subs[
SUB_REAL].
dfd, DAHDI_VMWI_CONFIG, &tmp->mwisend_setting);
13512#if defined(HAVE_PRI)
13518 dahdi_pseudo_parms.buf_no = tmp->
buf_no;
13519 dahdi_pseudo_parms.buf_policy = tmp->
buf_policy;
13520 dahdi_pseudo_parms.faxbuf_no = tmp->
faxbuf_no;
13525 if (tmp && !here) {
13534#if defined(HAVE_PRI)
13537 if (!p->pri || p->pri->
span != span) {
13540 if (!groupmatch && channelmatch == -1) {
13549 if ((p->
group & groupmatch) != groupmatch)
13555 if (channelmatch != -1) {
13556 if (p->
channel != channelmatch)
13559 *channelmatched = 1;
13576#if defined(HAVE_PRI)
13588#if defined(HAVE_SS7)
13605 if (p->mfcr2call) {
13618#if defined(HAVE_PRI)
13619#if defined(HAVE_PRI_CALL_WAITING)
13634 pvt->
stripmsd = pri->ch_cfg.stripmsd;
13637 pvt->
immediate = pri->ch_cfg.immediate;
13648#if defined(HAVE_PRI)
13661static int dahdi_new_pri_nobch_channel(
struct sig_pri_span *pri)
13668 struct dahdi_bufferinfo bi;
13673 for (pvt_idx = 0; pvt_idx < pri->
numchans; ++pvt_idx) {
13674 if (!pri->
pvts[pvt_idx]) {
13702 pvt->
buf_no = dahdi_pseudo_parms.buf_no;
13703 pvt->
buf_policy = dahdi_pseudo_parms.buf_policy;
13704 pvt->
faxbuf_no = dahdi_pseudo_parms.faxbuf_no;
13725 pri->
pvts[pvt_idx] = chan;
13729 ast_log(
LOG_ERROR,
"Unable to open no B channel interface pseudo channel: %s\n",
13734 memset(&bi, 0,
sizeof(bi));
13740 bi.numbufs = pvt->
buf_no;
13744 "Unable to set buffer policy on no B channel interface: %s\n",
13749 "Unable to check buffer policy on no B channel interface: %s\n",
13756 pvt->
channel = nobch_channel;
13760 dahdi_nobch_insert(pri, pvt);
13774 struct dahdi_bufferinfo bi;
13805 bi.numbufs = src->
buf_no;
13842 char *subdir =
NULL;
13886 memset(param, 0,
sizeof(*param));
13889 if (strchr(
args.group,
'!') !=
NULL) {
13891 while ((s = strchr(
prev,
'!')) !=
NULL) {
13895 *(
prev - 1) =
'\0';
13898 }
else if (
args.group[0] ==
'i') {
13900 res = sscanf(
args.group + 1,
"%30d", &x);
13908 s = strchr(
args.group,
'-');
13916 if (toupper(
args.group[0]) ==
'G' || toupper(
args.group[0])==
'R') {
13918 s =
args.group + 1;
13919 res = sscanf(s,
"%30d%1c%30d", &x, ¶m->
opt, ¶m->
cadence);
13926 if (toupper(
args.group[0]) ==
'G') {
13927 if (
args.group[0] ==
'G') {
13938 if (
args.group[0] ==
'R') {
13953 if (!strcasecmp(s,
"pseudo")) {
13958 res = sscanf(s,
"%30d%1c%30d", &x, ¶m->
opt, ¶m->
cadence);
13970 snprintf(path,
sizeof(path),
"/dev/dahdi/%s/%d",
13972 if (stat(path, &stbuf) < 0) {
13974 path, strerror(
errno));
13977 if (!S_ISCHR(stbuf.st_mode)) {
13988 if (param->
opt ==
'r' && res < 3) {
13998 const char *
data,
int *cause)
14004 int channelmatched = 0;
14005 int foundowner = 0;
14006 int groupmatched = 0;
14007#if defined(HAVE_PRI) || defined(HAVE_SS7)
14008 int transcapdigital = 0;
14025 while (p && !tmp) {
14041 if (p->mfcr2call) {
14043 ast_debug(1,
"Yay!, someone just beat us in the race for channel %d.\n", p->
channel);
14059 switch (start.
opt) {
14072#if defined(HAVE_PRI) || defined(HAVE_SS7)
14099#if defined(HAVE_SS7)
14108#if defined(HAVE_PRI)
14111#if defined(HAVE_PRI_CALL_WAITING)
14150 if (cause && !tmp) {
14151 if (callwait || (channelmatched && foundowner)) {
14153 }
else if (groupmatched) {
14179#if defined(HAVE_PRI)
14180 const char *device;
14186 if (*device !=
'I') {
14190 res = sscanf(device,
"I%30u", &span);
14191 if (res != 1 || !span ||
NUM_SPANS < span) {
14195 device = strchr(device,
'/');
14205#if defined(THRESHOLD_DEVSTATE_PLACEHOLDER)
14207 if (!strcmp(device,
"congestion"))
14210 return pris[span - 1].pri.congestion_devstate;
14212#if defined(THRESHOLD_DEVSTATE_PLACEHOLDER)
14213 else if (!strcmp(device,
"threshold")) {
14214 return pris[span - 1].pri.threshold_devstate;
14244 int groupmatched = 0;
14245 int channelmatched = 0;
14259 const char *monitor_type;
14269#if defined(HAVE_PRI)
14275 snprintf(full_device_name,
sizeof(full_device_name),
14276 "DAHDI/I%d/congestion", p->pri->
span);
14280#if defined(HAVE_PRI)
14285 snprintf(full_device_name,
sizeof(full_device_name),
"DAHDI/%s",
14293 dash = strrchr(full_device_name,
'-');
14298 snprintf(dialstring,
sizeof(dialstring),
"DAHDI/%s", dest);
14308#
if defined(HAVE_PRI)
14313 monitor_type, full_device_name, dialstring,
NULL);
14321 if (p == exitpvt) {
14329#if defined(HAVE_SS7)
14330static void dahdi_ss7_message(
struct ss7 *ss7,
char *s)
14336 if (linksets[i].ss7.ss7 == ss7) {
14346#if defined(HAVE_SS7)
14347static void dahdi_ss7_error(
struct ss7 *ss7,
char *s)
14353 if (linksets[i].ss7.ss7 == ss7) {
14363#if defined(HAVE_OPENR2)
14364static void *mfcr2_monitor(
void *data)
14366 struct dahdi_mfcr2 *mfcr2 = data;
14384 for (i = 0; i < mfcr2->numchans; i++) {
14385 pvt = mfcr2->pvts[i];
14389 openr2_chan_set_idle(pvt->r2chan);
14390 openr2_chan_handle_cas(pvt->r2chan);
14396 for (i = 0; i < mfcr2->numchans; i++) {
14397 pollers[i].revents = 0;
14398 pollers[i].events = 0;
14399 pvt = mfcr2->pvts[i];
14406 if (mfcr2->nodev) {
14409 if (!pvt->r2chan) {
14414 openr2_chan_enable_read(pvt->r2chan);
14415 pollers[i].events = POLLIN | POLLPRI;
14422 if (pollsize == 0) {
14424 ast_debug(1,
"Monitor thread going idle since everybody has an owner\n");
14427 poll(
NULL, 0, maxsleep);
14433 pthread_testcancel();
14434 res = poll(pollers, mfcr2->numchans, maxsleep);
14435 pthread_testcancel();
14436 if ((res < 0) && (
errno != EINTR)) {
14441 pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldstate);
14442 for (i = 0; i < mfcr2->numchans; i++) {
14443 pvt = mfcr2->pvts[i];
14447 if (pollers[i].revents & POLLPRI || pollers[i].revents & POLLIN) {
14448 openr2_chan_process_event(pvt->r2chan);
14451 pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &oldstate);
14458#if defined(HAVE_PRI)
14459static void dahdi_pri_message(
struct pri *pri,
char *s)
14465 int dchancount = 0;
14470 if (pris[x].pri.dchans[y]) {
14474 if (pris[x].pri.dchans[y] == pri) {
14485 if (1 < dchancount) {
14499 if (pridebugfd >= 0) {
14500 if (write(pridebugfd, s, strlen(s)) < 0) {
14509#if defined(HAVE_PRI)
14510static void dahdi_pri_error(
struct pri *pri,
char *s)
14516 int dchancount = 0;
14521 if (pris[x].pri.dchans[y]) {
14525 if (pris[x].pri.dchans[y] == pri) {
14536 if (1 < dchancount) {
14550 if (pridebugfd >= 0) {
14551 if (write(pridebugfd, s, strlen(s)) < 0) {
14560#if defined(HAVE_PRI)
14561static int prepare_pri(
struct dahdi_pri *pri)
14564 struct dahdi_params p;
14565 struct dahdi_bufferinfo bi;
14566 struct dahdi_spaninfo si;
14569 if (!pri->dchannels[i])
14571 if (pri->pri.fds[i] >= 0) {
14575 pri->pri.fds[i] = open(
"/dev/dahdi/channel", O_RDWR);
14576 if ((pri->pri.fds[i] < 0)) {
14578 pri->pri.fds[i], strerror(
errno));
14581 x = pri->dchannels[i];
14582 res = ioctl(pri->pri.fds[i], DAHDI_SPECIFY, &x);
14584 dahdi_close_pri_fd(pri, i);
14588 memset(&p, 0,
sizeof(p));
14589 res = ioctl(pri->pri.fds[i], DAHDI_GET_PARAMS, &p);
14591 dahdi_close_pri_fd(pri, i);
14595 if ((p.sigtype != DAHDI_SIG_HDLCFCS) && (p.sigtype != DAHDI_SIG_HARDHDLC)) {
14596 dahdi_close_pri_fd(pri, i);
14600 memset(&si, 0,
sizeof(si));
14601 res = ioctl(pri->pri.fds[i], DAHDI_SPANSTAT, &si);
14603 dahdi_close_pri_fd(pri, i);
14611 memset(&bi, 0,
sizeof(bi));
14612 bi.txbufpolicy = DAHDI_POLICY_IMMEDIATE;
14613 bi.rxbufpolicy = DAHDI_POLICY_IMMEDIATE;
14616 if (ioctl(pri->pri.fds[i], DAHDI_SET_BUFINFO, &bi)) {
14618 dahdi_close_pri_fd(pri, i);
14621 pri->pri.dchan_logical_span[i] = pris[p.spanno - 1].prilogicalspan;
14627#if defined(HAVE_PRI)
14628static char *complete_span_helper(
const char *line,
const char *
word,
int pos,
int state,
int rpos)
14636 for (which = span = 0; span <
NUM_SPANS; span++) {
14637 if (pris[span].pri.pri && ++which >
state) {
14648#if defined(HAVE_PRI)
14649static char *complete_span_4(
const char *line,
const char *
word,
int pos,
int state)
14651 return complete_span_helper(line,
word,pos,
state,3);
14655#if defined(HAVE_PRI)
14661 e->
command =
"pri set debug file";
14662 e->
usage =
"Usage: pri set debug file [output-file]\n"
14663 " Sends PRI debug output to the specified output file\n";
14676 ast_cli(
a->fd,
"Unable to open '%s' for writing\n",
a->argv[4]);
14682 if (pridebugfd >= 0)
14688 ast_cli(
a->fd,
"PRI debug output will be sent to '%s'\n",
a->argv[4]);
14693#if defined(HAVE_PRI)
14694static int action_pri_debug_file_set(
struct mansession *s,
const struct message *m)
14711 if (pridebugfd >= 0) {
14716 ast_copy_string(pridebugfilename, output_file,
sizeof(pridebugfilename));
14718 astman_send_ack(s, m,
"PRI debug output will now be sent to requested file.");
14724#if defined(HAVE_PRI)
14725static int action_pri_debug_file_unset(
struct mansession *s,
const struct message *m)
14729 if (pridebugfd >= 0) {
14742#if defined(HAVE_PRI)
14751 e->
command =
"pri set debug {on|off|hex|intense|0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15} span";
14753 "Usage: pri set debug {<level>|on|off|hex|intense} span <span>\n"
14754 " Enables debugging on a given PRI span\n"
14755 " Level is a bitmap of the following values:\n"
14756 " 1 General debugging incl. state changes\n"
14757 " 2 Decoded Q.931 messages\n"
14758 " 4 Decoded Q.921 messages\n"
14759 " 8 Raw hex dumps of Q.921 frames\n"
14760 " on - equivalent to 3\n"
14761 " hex - equivalent to 8\n"
14762 " intense - equivalent to 15\n";
14765 return complete_span_4(
a->line,
a->word,
a->pos,
a->n);
14771 if (!strcasecmp(
a->argv[3],
"on")) {
14773 }
else if (!strcasecmp(
a->argv[3],
"off")) {
14775 }
else if (!strcasecmp(
a->argv[3],
"intense")) {
14777 }
else if (!strcasecmp(
a->argv[3],
"hex")) {
14780 level = atoi(
a->argv[3]);
14782 span = atoi(
a->argv[5]);
14783 if ((span < 1) || (span >
NUM_SPANS)) {
14784 ast_cli(
a->fd,
"Invalid span %s. Should be a number %d to %d\n",
a->argv[5], 1,
NUM_SPANS);
14787 if (!pris[span-1].pri.pri) {
14788 ast_cli(
a->fd,
"No PRI running on span %d\n", span);
14793 if (level & 2) debugmask |= PRI_DEBUG_Q931_DUMP;
14794 if (level & 4) debugmask |= PRI_DEBUG_Q921_DUMP;
14795 if (level & 8) debugmask |= PRI_DEBUG_Q921_RAW;
14799 if (pris[span - 1].pri.dchans[x]) {
14800 pri_set_debug(pris[span - 1].pri.dchans[x], debugmask);
14806 if (0 <= pridebugfd) {
14809 ast_cli(
a->fd,
"Disabled PRI debug output to file '%s'\n",
14814 pris[span - 1].pri.debug = (level) ? 1 : 0;
14815 ast_cli(
a->fd,
"%s debugging on span %d\n", (level) ?
"Enabled" :
"Disabled", span);
14820#if defined(HAVE_PRI)
14840 if (!strcasecmp(level,
"on")) {
14842 }
else if (!strcasecmp(level,
"off")) {
14844 }
else if (!strcasecmp(level,
"intense")) {
14846 }
else if (!strcasecmp(level,
"hex")) {
14849 if (sscanf(level,
"%30d", &level_val) != 1) {
14855 if (sscanf(span,
"%30d", &span_val) != 1) {
14859 if ((span_val < 1) || (span_val >
NUM_SPANS)) {
14861 char id_text[256] =
"";
14864 snprintf(id_text,
sizeof(id_text),
"ActionID: %s\r\n",
id);
14869 "Message: Invalid span '%s' - Should be a number from 1 to %d\r\n"
14877 if (!pris[span_val-1].pri.pri) {
14882 if (level_val & 1) {
14885 if (level_val & 2) {
14886 debugmask |= PRI_DEBUG_Q931_DUMP;
14888 if (level_val & 4) {
14889 debugmask |= PRI_DEBUG_Q921_DUMP;
14891 if (level_val & 8) {
14892 debugmask |= PRI_DEBUG_Q921_RAW;
14897 if (pris[span_val - 1].pri.dchans[x]) {
14898 pri_set_debug(pris[span_val - 1].pri.dchans[x], debugmask);
14902 pris[span_val - 1].pri.debug = (level_val) ? 1 : 0;
14909#if defined(HAVE_PRI)
14910#if defined(HAVE_PRI_SERVICE_MESSAGES)
14916 int x, y, fd =
a->fd;
14917 int interfaceid = 0;
14918 char db_chan_name[20], db_answer[15];
14920 struct dahdi_pri *pri;
14922 if (
a->argc < 5 ||
a->argc > 6)
14924 if (strchr(
a->argv[4],
':')) {
14925 if (sscanf(
a->argv[4],
"%30d:%30d", &trunkgroup, &channel) != 2)
14927 if ((trunkgroup < 1) || (channel < 1))
14931 if (pris[x].pri.trunkgroup == trunkgroup) {
14937 ast_cli(fd,
"No such trunk group %d\n", trunkgroup);
14941 channel = atoi(
a->argv[4]);
14944 interfaceid = atoi(
a->argv[5]);
14949 if (pris[x].dchannels[y] == channel) {
14951 if (pri->pri.enable_service_message_support) {
14953 pri_maintenance_service(pri->pri.pri, interfaceid, -1, changestatus);
14957 "\n\tThis operation has not been enabled in chan_dahdi.conf, set 'service_message_support=yes' to use this operation.\n"
14958 "\tNote only 4ESS, 5ESS, and NI2 switch types are supported.\n\n");
14968 if (tmp->pri && tmp->
channel == channel) {
14971 if (!tmp->pri->enable_service_message_support) {
14974 "\n\tThis operation has not been enabled in chan_dahdi.conf, set 'service_message_support=yes' to use this operation.\n"
14975 "\tNote only 4ESS, 5ESS, and NI2 switch types are supported.\n\n");
14978 snprintf(db_chan_name,
sizeof(db_chan_name),
"%s/%d:%d", dahdi_db, tmp->
span, channel);
14980 switch(changestatus) {
14984 *why &= ~SRVST_NEAREND;
14986 snprintf(db_answer,
sizeof(db_answer),
"%s:%u", SRVST_TYPE_OOS, *why);
14987 ast_db_put(db_chan_name, SRVST_DBKEY, db_answer);
14989 dahdi_pri_update_span_devstate(tmp->pri);
14996 *why |= SRVST_NEAREND;
14997 snprintf(db_answer,
sizeof(db_answer),
"%s:%u", SRVST_TYPE_OOS, *why);
14998 ast_db_put(db_chan_name, SRVST_DBKEY, db_answer);
14999 dahdi_pri_update_span_devstate(tmp->pri);
15007 pri_maintenance_bservice(tmp->pri->pri, tmp->
sig_pvt, changestatus);
15014 ast_cli(fd,
"Unable to find given channel %d, possibly not a PRI\n",
channel);
15022 e->
command =
"pri service enable channel";
15024 "Usage: pri service enable channel <channel> [<interface id>]\n"
15025 " Send an AT&T / NFAS / CCS ANSI T1.607 maintenance message\n"
15026 " to restore a channel to service, with optional interface id\n"
15027 " as agreed upon with remote switch operator\n";
15032 return handle_pri_service_generic(e, cmd,
a, 0);
15039 e->
command =
"pri service disable channel";
15041 "Usage: pri service disable channel <chan num> [<interface id>]\n"
15042 " Send an AT&T / NFAS / CCS ANSI T1.607 maintenance message\n"
15043 " to remove a channel from service, with optional interface id\n"
15044 " as agreed upon with remote switch operator\n";
15049 return handle_pri_service_generic(e, cmd,
a, 2);
15054#if defined(HAVE_PRI)
15061 e->
command =
"pri show channels";
15063 "Usage: pri show channels\n"
15064 " Displays PRI channel information such as the current mapping\n"
15065 " of DAHDI B channels to Asterisk channel names and which calls\n"
15066 " are on hold or call-waiting. Calls on hold or call-waiting\n"
15067 " are not associated with any B channel.\n";
15077 for (span = 0; span <
NUM_SPANS; ++span) {
15078 if (pris[span].
pri.
pri) {
15086#if defined(HAVE_PRI)
15093 e->
command =
"pri show spans";
15095 "Usage: pri show spans\n"
15096 " Displays PRI span information\n";
15105 for (span = 0; span <
NUM_SPANS; span++) {
15106 if (pris[span].
pri.
pri) {
15114#if defined(HAVE_PRI)
15115#define container_of(ptr, type, member) \
15116 ((type *)((char *)(ptr) - offsetof(type, member)))
15133 struct dahdi_pri* dahdi_pri;
15134 pthread_t master = pri->
master;
15139 ast_debug(2,
"About to destroy DAHDI channels of span %d.\n", pri->
span);
15140 for (i = 0; i < pri->
numchans; i++) {
15152 cancel_code = pthread_cancel(master);
15153 pthread_kill(master, SIGURG);
15155 "Waiting to join thread of span %d "
15156 "with pid=%p cancel_code=%d\n",
15157 pri->
span, (
void *)master, cancel_code);
15158 res = pthread_join(master,
NULL);
15167 ast_debug(4,
"closing pri_fd %d\n", i);
15168 dahdi_close_pri_fd(dahdi_pri, i);
15169 dahdi_pri->dchannels[i] = 0;
15175static char *handle_pri_destroy_span(
struct ast_cli_entry *e,
int cmd,
15184 e->
command =
"pri destroy span";
15186 "Usage: pri destroy span <span>\n"
15187 " Destroys D-channel of span and its B-channels.\n"
15188 " DON'T USE THIS UNLESS YOU KNOW WHAT YOU ARE DOING.\n";
15191 return complete_span_4(
a->line,
a->word,
a->pos,
a->n);
15197 res = sscanf(
a->argv[3],
"%30d", &
span);
15198 if ((res != 1) || span < 1 || span >
NUM_SPANS) {
15200 "Invalid span '%s'. Should be a number from %d to %d\n",
15210 pri_destroy_span(
pri);
15216#if defined(HAVE_PRI)
15223 e->
command =
"pri show span";
15225 "Usage: pri show span <span>\n"
15226 " Displays PRI Information on a given PRI span\n";
15229 return complete_span_4(
a->line,
a->word,
a->pos,
a->n);
15234 span = atoi(
a->argv[3]);
15236 ast_cli(
a->fd,
"Invalid span '%s'. Should be a number from %d to %d\n",
a->argv[3], 1,
NUM_SPANS);
15250#if defined(HAVE_PRI)
15260 e->
command =
"pri show debug";
15262 "Usage: pri show debug\n"
15263 " Show the debug state of pri spans\n";
15272 if (pris[
span].
pri.dchans[x]) {
15274 ast_cli(
a->fd,
"Span %d: Debug: %s\tIntense: %s\n",
span+1, (
debug&PRI_DEBUG_Q931_STATE)?
"Yes" :
"No" ,(
debug&PRI_DEBUG_Q921_RAW)?
"Yes" :
"No" );
15282 if (pridebugfd >= 0)
15283 ast_cli(
a->fd,
"Logging PRI debug to file %s\n", pridebugfilename);
15287 ast_cli(
a->fd,
"No PRI running\n");
15292#if defined(HAVE_PRI)
15297 e->
command =
"pri show version";
15299 "Usage: pri show version\n"
15300 "Show libpri version information\n";
15306 ast_cli(
a->fd,
"libpri version: %s\n", pri_get_version());
15312#if defined(HAVE_PRI)
15314 AST_CLI_DEFINE(handle_pri_debug,
"Enables PRI debugging on a span"),
15315#if defined(HAVE_PRI_SERVICE_MESSAGES)
15316 AST_CLI_DEFINE(handle_pri_service_enable_channel,
"Return a channel to service"),
15317 AST_CLI_DEFINE(handle_pri_service_disable_channel,
"Remove a channel from service"),
15319 AST_CLI_DEFINE(handle_pri_show_channels,
"Displays PRI channel information"),
15320 AST_CLI_DEFINE(handle_pri_show_spans,
"Displays PRI span information"),
15321 AST_CLI_DEFINE(handle_pri_show_span,
"Displays PRI span information"),
15323 AST_CLI_DEFINE(handle_pri_show_debug,
"Displays current PRI debug settings"),
15324 AST_CLI_DEFINE(handle_pri_set_debug_file,
"Sends PRI debug output to the specified file"),
15335 e->
command =
"mfcr2 show version";
15337 "Usage: mfcr2 show version\n"
15338 " Shows the version of the OpenR2 library being used.\n";
15343 ast_cli(
a->fd,
"OpenR2 version: %s, revision: %s\n", openr2_get_version(), openr2_get_revision());
15349#define FORMAT "%4s %40s\n"
15351 int numvariants = 0;
15352 const openr2_variant_entry_t *variants;
15355 e->
command =
"mfcr2 show variants";
15357 "Usage: mfcr2 show variants\n"
15358 " Shows the list of MFC/R2 variants supported.\n";
15363 if (!(variants = openr2_proto_get_variant_list(&numvariants))) {
15364 ast_cli(
a->fd,
"Failed to get list of variants.\n");
15368 for (i = 0; i < numvariants; i++) {
15377#define FORMAT "%4s %4s %-7.7s %-7.7s %-8.8s %-9.9s %-16.16s %-8.8s %-8.8s\n"
15378 int filtertype = 0;
15385 openr2_context_t *r2context;
15386 openr2_variant_t r2variant;
15389 e->
command =
"mfcr2 show channels [group|context]";
15391 "Usage: mfcr2 show channels [group <group> | context <context>]\n"
15392 " Shows the DAHDI channels configured with MFC/R2 signaling.\n";
15397 if (!((
a->argc == 3) || (
a->argc == 5))) {
15400 if (
a->argc == 5) {
15401 if (!strcasecmp(
a->argv[3],
"group")) {
15402 targetnum = atoi(
a->argv[4]);
15403 if ((targetnum < 0) || (targetnum > 63))
15405 targetnum = 1 << targetnum;
15407 }
else if (!strcasecmp(
a->argv[3],
"context")) {
15413 ast_cli(
a->fd,
FORMAT,
"Chan",
"Link#",
"Variant",
"Max ANI",
"Max DNIS",
"ANI First",
"Immediate Accept",
"Tx CAS",
"Rx CAS");
15420 switch(filtertype) {
15422 if (p->
group != targetnum) {
15427 if (strcasecmp(p->
context,
a->argv[4])) {
15435 r2context = openr2_chan_get_context(p->r2chan);
15436 r2variant = openr2_context_get_variant(r2context);
15437 snprintf(channo,
sizeof(channo),
"%d", p->
channel);
15438 snprintf(linkno,
sizeof(linkno),
"%d", p->mfcr2->index);
15439 snprintf(anino,
sizeof(anino),
"%d", openr2_context_get_max_ani(r2context));
15440 snprintf(dnisno,
sizeof(dnisno),
"%d", openr2_context_get_max_dnis(r2context));
15441 ast_cli(
a->fd,
FORMAT, channo, linkno, openr2_proto_get_variant_string(r2variant),
15442 anino, dnisno, openr2_context_get_ani_first(r2context) ?
"Yes" :
"No",
15443 openr2_context_get_immediate_accept(r2context) ?
"Yes" :
"No",
15444 openr2_chan_get_tx_cas_string(p->r2chan), openr2_chan_get_rx_cas_string(p->r2chan));
15455 char *toklevel =
NULL;
15456 char *saveptr =
NULL;
15457 char *logval =
NULL;
15458 openr2_log_level_t loglevel = OR2_LOG_NOTHING;
15459 openr2_log_level_t tmplevel = OR2_LOG_NOTHING;
15462 e->
command =
"mfcr2 set debug";
15464 "Usage: mfcr2 set debug <loglevel> <channel>\n"
15465 " Set a new logging level for the specified channel.\n"
15466 " If no channel is specified the logging level will be applied to all channels.\n";
15474 channo = (
a->argc == 5) ? atoi(
a->argv[4]) : -1;
15476 toklevel = strtok_r(logval,
",", &saveptr);
15477 if (-1 == (tmplevel = openr2_log_get_level(toklevel))) {
15478 ast_cli(
a->fd,
"Invalid MFC/R2 logging level '%s'.\n",
a->argv[3]);
15480 }
else if (OR2_LOG_NOTHING == tmplevel) {
15481 loglevel = tmplevel;
15483 loglevel |= tmplevel;
15484 while ((toklevel = strtok_r(
NULL,
",", &saveptr))) {
15485 if (-1 == (tmplevel = openr2_log_get_level(toklevel))) {
15486 ast_cli(
a->fd,
"Ignoring invalid logging level: '%s'.\n", toklevel);
15489 loglevel |= tmplevel;
15497 if ((channo != -1) && (p->
channel != channo )) {
15500 openr2_chan_set_log_level(p->r2chan, loglevel);
15501 if (channo != -1) {
15502 ast_cli(
a->fd,
"MFC/R2 debugging set to '%s' for channel %d.\n",
a->argv[3], p->
channel);
15506 if ((channo != -1) && !p) {
15507 ast_cli(
a->fd,
"MFC/R2 channel %d not found.\n", channo);
15509 if (channo == -1) {
15510 ast_cli(
a->fd,
"MFC/R2 debugging set to '%s' for all channels.\n",
a->argv[3]);
15522 e->
command =
"mfcr2 call files [on|off]";
15524 "Usage: mfcr2 call files [on|off] <channel>\n"
15525 " Enable call files creation on the specified channel.\n"
15526 " If no channel is specified call files creation policy will be applied to all channels.\n";
15534 channo = (
a->argc == 5) ? atoi(
a->argv[4]) : -1;
15540 if ((channo != -1) && (p->
channel != channo )) {
15544 openr2_chan_enable_call_files(p->r2chan);
15546 openr2_chan_disable_call_files(p->r2chan);
15548 if (channo != -1) {
15550 ast_cli(
a->fd,
"MFC/R2 call files enabled for channel %d.\n", p->
channel);
15552 ast_cli(
a->fd,
"MFC/R2 call files disabled for channel %d.\n", p->
channel);
15557 if ((channo != -1) && !p) {
15558 ast_cli(
a->fd,
"MFC/R2 channel %d not found.\n", channo);
15560 if (channo == -1) {
15562 ast_cli(
a->fd,
"MFC/R2 Call files enabled for all channels.\n");
15564 ast_cli(
a->fd,
"MFC/R2 Call files disabled for all channels.\n");
15577 e->
command =
"mfcr2 set idle";
15579 "Usage: mfcr2 set idle <channel>\n"
15580 " DON'T USE THIS UNLESS YOU KNOW WHAT YOU ARE DOING.\n"
15581 " Force the given channel into IDLE state.\n"
15582 " If no channel is specified, all channels will be set to IDLE.\n";
15587 channo = (
a->argc == 4) ? atoi(
a->argv[3]) : -1;
15593 if ((channo != -1) && (p->
channel != channo )) {
15596 openr2_chan_set_idle(p->r2chan);
15601 if (channo != -1) {
15605 if ((channo != -1) && !p) {
15606 ast_cli(
a->fd,
"MFC/R2 channel %d not found.\n", channo);
15618 e->
command =
"mfcr2 set blocked";
15620 "Usage: mfcr2 set blocked <channel>\n"
15621 " DON'T USE THIS UNLESS YOU KNOW WHAT YOU ARE DOING.\n"
15622 " Force the given channel into BLOCKED state.\n"
15623 " If no channel is specified, all channels will be set to BLOCKED.\n";
15628 channo = (
a->argc == 4) ? atoi(
a->argv[3]) : -1;
15634 if ((channo != -1) && (p->
channel != channo )) {
15637 openr2_chan_set_blocked(p->r2chan);
15641 if (channo != -1) {
15645 if ((channo != -1) && !p) {
15646 ast_cli(
a->fd,
"MFC/R2 channel %d not found.\n", channo);
15652static void mfcr2_show_links_of(
struct ast_cli_args *
a,
struct r2links *list_head,
const char *title)
15654#define FORMAT "%-5s %-10s %-15s %-10s %s\n"
15658 char live_chans_str[5];
15659 char channel_list[R2_LINK_CAPACITY * 4];
15660 struct r2link_entry *cur;
15662 ast_cli(
a->fd,
FORMAT,
"Index",
"Thread",
"Dahdi-Device",
"Channels",
"Channel-List");
15664 struct dahdi_mfcr2 *mfcr2 = &cur->mfcr2;
15665 const char *thread_status =
NULL;
15672 if (mfcr2->r2master == 0L) {
15673 thread_status =
"zero";
15675 thread_status =
"none";
15677 thread_status =
"created";
15679 snprintf(index,
sizeof(index),
"%d", mfcr2->index);
15680 snprintf(live_chans_str,
sizeof(live_chans_str),
"%d", mfcr2->live_chans);
15686 for (i = 0; i < mfcr2->numchans &&
len <
sizeof(channel_list) - 1; i++) {
15693 if (prev_channo && prev_channo == channo - 1) {
15694 prev_channo = channo;
15698 if (inside_range) {
15700 len += snprintf(channel_list +
len,
sizeof(channel_list) -
len - 1,
"-%d,%d", prev_channo, channo);
15702 }
else if (prev_channo) {
15704 len += snprintf(channel_list +
len,
sizeof(channel_list) -
len - 1,
",%d", channo);
15707 len += snprintf(channel_list +
len,
sizeof(channel_list) -
len - 1,
"%d", channo);
15709 prev_channo = channo;
15712 if (inside_range) {
15714 len += snprintf(channel_list +
len,
sizeof(channel_list) -
len - 1,
"-%d", channo);
15716 }
else if (prev_channo) {
15718 len += snprintf(channel_list +
len,
sizeof(channel_list) -
len - 1,
",%d", channo);
15724 (mfcr2->nodev) ?
"MISSING" :
"OK",
15737 e->
command =
"mfcr2 show links";
15739 "Usage: mfcr2 show links\n"
15740 " Shows the DAHDI MFC/R2 links.\n";
15745 if (
a->argc != 3) {
15748 mfcr2_show_links_of(
a, &r2links,
"Live links\n");
15749 mfcr2_show_links_of(
a, &nodev_r2links,
"Links to be removed (device missing)\n");
15756 int wanted_link_index;
15757 int found_link = 0;
15758 struct r2link_entry *cur =
NULL;
15762 e->
command =
"mfcr2 destroy link";
15764 "Usage: mfcr2 destroy link <index-number>\n"
15765 " Destroys D-channel of link and its B-channels.\n"
15766 " DON'T USE THIS UNLESS YOU KNOW WHAT YOU ARE DOING.\n";
15774 res = sscanf(
a->argv[3],
"%30d", &wanted_link_index);
15775 if ((res != 1) || wanted_link_index < 1) {
15777 "Invalid link index '%s'. Should be a positive number\n",
a->argv[3]);
15782 struct dahdi_mfcr2 *mfcr2 = &cur->mfcr2;
15783 if (wanted_link_index == mfcr2->index) {
15791 if (! found_link) {
15792 ast_cli(
a->fd,
"No link found with index %d.\n", wanted_link_index);
15799 AST_CLI_DEFINE(handle_mfcr2_version,
"Show OpenR2 library version"),
15800 AST_CLI_DEFINE(handle_mfcr2_show_variants,
"Show supported MFC/R2 variants"),
15801 AST_CLI_DEFINE(handle_mfcr2_show_channels,
"Show MFC/R2 channels"),
15803 AST_CLI_DEFINE(handle_mfcr2_set_debug,
"Set MFC/R2 channel logging level"),
15804 AST_CLI_DEFINE(handle_mfcr2_call_files,
"Enable/Disable MFC/R2 call files"),
15805 AST_CLI_DEFINE(handle_mfcr2_set_idle,
"Reset MFC/R2 channel forcing it to IDLE"),
15806 AST_CLI_DEFINE(handle_mfcr2_set_blocked,
"Reset MFC/R2 channel forcing it to BLOCKED"),
15807 AST_CLI_DEFINE(handle_mfcr2_destroy_link,
"Destroy given MFC/R2 link"),
15818 e->
command =
"dahdi destroy channels";
15820 "Usage: dahdi destroy channels <from_channel> [<to_channel>]\n"
15821 " DON'T USE THIS UNLESS YOU KNOW WHAT YOU ARE DOING. Immediately removes a given channel, whether it is in use or not\n";
15826 if ((
a->argc < 4) ||
a->argc > 5) {
15829 start = atoi(
a->argv[3]);
15831 ast_cli(
a->fd,
"Invalid starting channel number %s.\n",
15835 if (
a->argc == 5) {
15836 end = atoi(
a->argv[4]);
15838 ast_cli(
a->fd,
"Invalid ending channel number %s.\n",
15848 "range end (%d) is smaller than range start (%d)\n",
15864 e->
command =
"dahdi create channels";
15865 e->
usage =
"Usage: dahdi create channels <from> [<to>] - a range of channels\n"
15866 " dahdi create channels new - add channels not yet created\n"
15867 "For ISDN and SS7 the range should include complete spans.\n";
15872 if ((
a->argc < 4) ||
a->argc > 5) {
15875 if (
a->argc == 4 && !strcmp(
a->argv[3],
"new")) {
15879 start = atoi(
a->argv[3]);
15881 ast_cli(
a->fd,
"Invalid starting channel number '%s'.\n",
15885 if (
a->argc == 5) {
15886 end = atoi(
a->argv[4]);
15888 ast_cli(
a->fd,
"Invalid ending channel number '%s'.\n",
15897 "range end (%d) is smaller than range start (%d)\n",
15935#if defined(HAVE_PRI) || defined(HAVE_SS7)
15942 ast_verb(1,
"Destroying channels and reloading DAHDI configuration.\n");
15944 ast_verb(4,
"Initial softhangup of all DAHDI channels complete.\n");
15946 dahdi_r2_destroy_links();
15949#if defined(HAVE_PRI)
15952 cancel_code = pthread_cancel(pris[i].pri.
master);
15953 pthread_kill(pris[i].pri.
master, SIGURG);
15954 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);
15956 ast_debug(4,
"Joined thread of span %d\n", i);
15961#if defined(HAVE_SS7)
15964 cancel_code = pthread_cancel(linksets[i].ss7.master);
15965 pthread_kill(linksets[i].ss7.master, SIGURG);
15966 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);
15967 pthread_join(linksets[i].ss7.master,
NULL);
15968 ast_debug(4,
"Joined thread of span %d\n", i);
15977 ast_debug(4,
"Waiting to join monitor thread with pid=%p, cancel_code=%d\n", (
void *)
monitor_thread, cancel_code);
15979 ast_debug(4,
"Joined monitor thread\n");
15985 int x = DAHDI_FLASH;
16001 ast_verb(4,
"Final softhangup of all DAHDI channels complete.\n");
16011 dahdi_close_pri_fd(&(pris[i]), j);
16014 memset(pris, 0,
sizeof(pris));
16018 pri_set_error(dahdi_pri_error);
16019 pri_set_message(dahdi_pri_message);
16021#if defined(HAVE_SS7)
16024 dahdi_close_ss7_fd(&(linksets[i]), j);
16027 memset(linksets, 0,
sizeof(linksets));
16031 ss7_set_error(dahdi_ss7_error);
16032 ss7_set_message(dahdi_ss7_message);
16052 e->
command =
"dahdi restart";
16054 "Usage: dahdi restart\n"
16055 " Restarts the DAHDI channels: destroys them all and then\n"
16056 " re-reads them from chan_dahdi.conf.\n"
16057 " Note that this will STOP any running CALL on DAHDI channels.\n"
16083#define FORMAT "%7s %4d %-20.20s %-10.10s %-15.15s %-8.8s %-20.20s %-10.10s %-10.10s %-12.12s %-32.32s\n"
16084#define FORMAT2 "%7s %4s %-20.20s %-10.10s %-15.15s %-8.8s %-20.20s %-10.10s %-10.10s %-12.12s %-32.32s\n"
16086 int filtertype = 0;
16093 e->
command =
"dahdi show channels [group|context]";
16095 "Usage: dahdi show channels [ group <group> | context <context> ]\n"
16096 " Shows a list of available channels with optional filtering\n"
16097 " <group> must be a number between 0 and 63\n";
16105 if (!((
a->argc == 3) || (
a->argc == 5))) {
16109 if (
a->argc == 5) {
16110 if (!strcasecmp(
a->argv[3],
"group")) {
16111 targetnum = atoi(
a->argv[4]);
16112 if (63 < targetnum) {
16117 }
else if (!strcasecmp(
a->argv[3],
"context")) {
16122 ast_cli(
a->fd,
FORMAT2,
"Chan",
"Span",
"Signalling",
"Extension",
"Context",
"Language",
"MOH Interpret",
"Blocked",
"In Service",
"Alarms",
"Description");
16127 switch(filtertype) {
16129 if (!(tmp->
group & targetnum)) {
16134 if (strcasecmp(tmp->
context,
a->argv[4])) {
16143 snprintf(tmps,
sizeof(tmps),
"%d", tmp->
channel);
16151 blockstr[2] =
'\0';
16153 ast_cli(
a->fd,
FORMAT, tmps, tmp->
span,
sig2str(tmp->
sig), tmp->
exten, tmp->
context, tmp->
language, tmp->
mohinterpret, blockstr, tmp->
inservice ?
"Yes" :
"No",
16166 struct dahdi_confinfo ci;
16167 struct dahdi_params ps;
16174 e->
command =
"dahdi show channel";
16176 "Usage: dahdi show channel <chan num>\n"
16177 " Detailed information about a given channel\n";
16186 channel = atoi(
a->argv[3]);
16190 if (tmp->
channel == channel) {
16200#if defined(HAVE_PRI)
16201#if defined(HAVE_PRI_SUBADDR)
16210 for (v = tmp->
vars ; v ; v = v->
next)
16224 ast_cli(
a->fd,
"DSP: %s\n", tmp->
dsp ?
"yes" :
"no");
16227#if defined(BUSYDETECT_TONEONLY)
16228 ast_cli(
a->fd,
" Busy Detector Helper: BUSYDETECT_TONEONLY\n");
16229#elif defined(BUSYDETECT_COMPARE_TONE_AND_SILENCE)
16230 ast_cli(
a->fd,
" Busy Detector Helper: BUSYDETECT_COMPARE_TONE_AND_SILENCE\n");
16232#ifdef BUSYDETECT_DEBUG
16233 ast_cli(
a->fd,
" Busy Detector Debug: Enabled\n");
16238 ast_cli(
a->fd,
"TDD: %s\n", tmp->
tdd ?
"yes" :
"no");
16245 snprintf(hwrxgain,
sizeof(hwrxgain),
"%.1f", tmp->
hwrxgain);
16250 snprintf(hwtxgain,
sizeof(hwtxgain),
"%.1f", tmp->
hwtxgain);
16254 ast_cli(
a->fd,
"HW Gains (RX/TX): %s/%s\n", hwrxgain, hwtxgain);
16256 ast_cli(
a->fd,
"Dynamic Range Compression (RX/TX): %.2f/%.2f\n", tmp->
rxdrc, tmp->
txdrc);
16258 ast_cli(
a->fd,
"Echo Cancellation:\n");
16278 char calldir[OR2_MAX_PATH];
16279 openr2_context_t *r2context = openr2_chan_get_context(tmp->r2chan);
16280 openr2_variant_t r2variant = openr2_context_get_variant(r2context);
16281 ast_cli(
a->fd,
"MFC/R2 MF State: %s\n", openr2_chan_get_mf_state_string(tmp->r2chan));
16282 ast_cli(
a->fd,
"MFC/R2 MF Group: %s\n", openr2_chan_get_mf_group_string(tmp->r2chan));
16283 ast_cli(
a->fd,
"MFC/R2 State: %s\n", openr2_chan_get_r2_state_string(tmp->r2chan));
16284 ast_cli(
a->fd,
"MFC/R2 Call State: %s\n", openr2_chan_get_call_state_string(tmp->r2chan));
16285 ast_cli(
a->fd,
"MFC/R2 Call Files Enabled: %s\n", openr2_chan_get_call_files_enabled(tmp->r2chan) ?
"Yes" :
"No");
16286 ast_cli(
a->fd,
"MFC/R2 Variant: %s\n", openr2_proto_get_variant_string(r2variant));
16287 ast_cli(
a->fd,
"MFC/R2 Max ANI: %d\n", openr2_context_get_max_ani(r2context));
16288 ast_cli(
a->fd,
"MFC/R2 Max DNIS: %d\n", openr2_context_get_max_dnis(r2context));
16289#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 2
16290 ast_cli(
a->fd,
"MFC/R2 DTMF Dialing: %s\n", openr2_context_get_dtmf_dialing(r2context,
NULL,
NULL) ?
"Yes" :
"No");
16291 ast_cli(
a->fd,
"MFC/R2 DTMF Detection: %s\n", openr2_context_get_dtmf_detection(r2context) ?
"Yes" :
"No");
16293 ast_cli(
a->fd,
"MFC/R2 Get ANI First: %s\n", openr2_context_get_ani_first(r2context) ?
"Yes" :
"No");
16294#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 1
16295 ast_cli(
a->fd,
"MFC/R2 Skip Category Request: %s\n", openr2_context_get_skip_category_request(r2context) ?
"Yes" :
"No");
16297 ast_cli(
a->fd,
"MFC/R2 Immediate Accept: %s\n", openr2_context_get_immediate_accept(r2context) ?
"Yes" :
"No");
16298 ast_cli(
a->fd,
"MFC/R2 Accept on Offer: %s\n", tmp->mfcr2_accept_on_offer ?
"Yes" :
"No");
16299 ast_cli(
a->fd,
"MFC/R2 Charge Calls: %s\n", tmp->mfcr2_charge_calls ?
"Yes" :
"No");
16300 ast_cli(
a->fd,
"MFC/R2 Allow Collect Calls: %s\n", tmp->mfcr2_allow_collect_calls ?
"Yes" :
"No");
16301 ast_cli(
a->fd,
"MFC/R2 Forced Release: %s\n", tmp->mfcr2_forced_release ?
"Yes" :
"No");
16302 ast_cli(
a->fd,
"MFC/R2 MF Back Timeout: %dms\n", openr2_context_get_mf_back_timeout(r2context));
16303 ast_cli(
a->fd,
"MFC/R2 R2 Metering Pulse Timeout: %dms\n", openr2_context_get_metering_pulse_timeout(r2context));
16304 ast_cli(
a->fd,
"MFC/R2 Rx CAS: %s\n", openr2_chan_get_rx_cas_string(tmp->r2chan));
16305 ast_cli(
a->fd,
"MFC/R2 Tx CAS: %s\n", openr2_chan_get_tx_cas_string(tmp->r2chan));
16306 ast_cli(
a->fd,
"MFC/R2 MF Tx Signal: %d\n", openr2_chan_get_tx_mf_signal(tmp->r2chan));
16307 ast_cli(
a->fd,
"MFC/R2 MF Rx Signal: %d\n", openr2_chan_get_rx_mf_signal(tmp->r2chan));
16308 ast_cli(
a->fd,
"MFC/R2 Call Files Directory: %s\n", openr2_context_get_log_directory(r2context, calldir,
sizeof(calldir)));
16311#if defined(HAVE_SS7)
16332 if (tmp->logicalspan)
16333 ast_cli(
a->fd,
"PRI Logical Span: %d\n", tmp->logicalspan);
16335 ast_cli(
a->fd,
"PRI Logical Span: Implicit\n");
16338 memset(&ci, 0,
sizeof(ci));
16341 memset(&ci, 0,
sizeof(ci));
16343 ast_cli(
a->fd,
"Actual Confinfo: Num/%d, Mode/0x%04x\n", ci.confno, (
unsigned)ci.confmode);
16346 ast_cli(
a->fd,
"Actual Confmute: %s\n", x ?
"Yes" :
"No");
16348 memset(&ps, 0,
sizeof(ps));
16352 ast_cli(
a->fd,
"Hookstate (FXS only): %s\n", ps.rxisoffhook ?
"Offhook" :
"Onhook");
16370 e->
command =
"dahdi show cadences";
16372 "Usage: dahdi show cadences\n"
16373 " Shows all cadences currently defined\n";
16380 char tmp[16], tmp2[64];
16381 snprintf(tmp,
sizeof(tmp),
"r%d: ", i + 1);
16384 for (j = 0; j < 16; j++) {
16385 if (
cadences[i].ringcadence[j] == 0)
16387 snprintf(tmp,
sizeof(tmp),
"%d",
cadences[i].ringcadence[j]);
16393 strncat(output,
",",
sizeof(output) - strlen(output) - 1);
16394 strncat(output, tmp2,
sizeof(output) - strlen(output) - 1);
16403 alarmstr[0] =
'\0';
16404 if (spaninfo->alarms > 0) {
16405 if (spaninfo->alarms & DAHDI_ALARM_BLUE) {
16406 strcat(alarmstr,
"BLU/");
16408 if (spaninfo->alarms & DAHDI_ALARM_YELLOW) {
16409 strcat(alarmstr,
"YEL/");
16411 if (spaninfo->alarms & DAHDI_ALARM_RED) {
16412 strcat(alarmstr,
"RED/");
16414 if (spaninfo->alarms & DAHDI_ALARM_LOOPBACK) {
16415 strcat(alarmstr,
"LB/");
16417 if (spaninfo->alarms & DAHDI_ALARM_RECOVER) {
16418 strcat(alarmstr,
"REC/");
16420 if (spaninfo->alarms & DAHDI_ALARM_NOTOPEN) {
16421 strcat(alarmstr,
"NOP/");
16423 if (!strlen(alarmstr)) {
16424 strcat(alarmstr,
"UUU/");
16426 if (strlen(alarmstr)) {
16428 alarmstr[strlen(alarmstr) - 1] =
'\0';
16431 if (spaninfo->numchans) {
16432 strcpy(alarmstr,
"OK");
16434 strcpy(alarmstr,
"UNCONFIGURED");
16442 #define FORMAT "%4d %-40.40s %-7.7s %-6d %-6d %-6d %-3.3s %-4.4s %-8.8s %s\n"
16443 #define FORMAT2 "%4s %-40.40s %-7.7s %-6.6s %-6.6s %-6.6s %-3.3s %-4.4s %-8.8s %s\n"
16449 struct dahdi_spaninfo s;
16453 e->
command =
"dahdi show status";
16455 "Usage: dahdi show status\n"
16456 " Shows a list of DAHDI cards with status\n";
16461 ctl = open(
"/dev/dahdi/ctl", O_RDWR);
16463 ast_cli(
a->fd,
"No DAHDI found. Unable to open /dev/dahdi/ctl: %s\n", strerror(
errno));
16466 ast_cli(
a->fd,
FORMAT2,
"Span",
"Description",
"Alarms",
"IRQ",
"bpviol",
"CRC",
"Framing",
"Coding",
"Options",
"LBO");
16468 for (span = 1; span < DAHDI_MAX_SPANS; ++span) {
16470 res = ioctl(ctl, DAHDI_SPANSTAT, &s);
16475 ast_cli(
a->fd,
FORMAT, span, s.desc, alarmstr, s.irqmisses, s.bpvcount, s.crc4count,
16476 s.lineconfig & DAHDI_CONFIG_D4 ?
"D4" :
16477 s.lineconfig & DAHDI_CONFIG_ESF ?
"ESF" :
16478 s.lineconfig & DAHDI_CONFIG_CCS ?
"CCS" :
16480 s.lineconfig & DAHDI_CONFIG_B8ZS ?
"B8ZS" :
16481 s.lineconfig & DAHDI_CONFIG_HDB3 ?
"HDB3" :
16482 s.lineconfig & DAHDI_CONFIG_AMI ?
"AMI" :
16484 s.lineconfig & DAHDI_CONFIG_CRC4 ?
16485 s.lineconfig & DAHDI_CONFIG_NOTOPEN ?
"CRC4/YEL" :
"CRC4" :
16486 s.lineconfig & DAHDI_CONFIG_NOTOPEN ?
"YEL" :
"",
16499 int pseudo_fd = -1;
16500 struct dahdi_versioninfo vi;
16504 e->
command =
"dahdi show version";
16506 "Usage: dahdi show version\n"
16507 " Shows the DAHDI version in use\n";
16512 if ((pseudo_fd = open(
"/dev/dahdi/ctl", O_RDONLY)) < 0) {
16513 ast_cli(
a->fd,
"Failed to open control file to get version.\n");
16517 strcpy(vi.version,
"Unknown");
16518 strcpy(vi.echo_canceller,
"Unknown");
16520 if (ioctl(pseudo_fd, DAHDI_GETVERSION, &vi))
16521 ast_cli(
a->fd,
"Failed to get DAHDI version: %s\n", strerror(
errno));
16523 ast_cli(
a->fd,
"DAHDI Version: %s Echo Canceller: %s\n", vi.version, vi.echo_canceller);
16539 e->
command =
"dahdi set hwgain {rx|tx}";
16541 "Usage: dahdi set hwgain <rx|tx> <chan#> <gain>\n"
16542 " Sets the hardware gain on a given channel and overrides the\n"
16543 " value provided at module loadtime. Changes take effect\n"
16544 " immediately whether the channel is in use or not.\n"
16546 " <rx|tx> which direction do you want to change (relative to our module)\n"
16547 " <chan num> is the channel number relative to the device\n"
16548 " <gain> is the gain in dB (e.g. -3.5 for -3.5dB)\n"
16551 " * hwgain is only supportable by hardware with analog ports because\n"
16552 " hwgain works on the analog side of an analog-digital conversion.\n";
16561 if (!strcasecmp(
"rx",
a->argv[3]))
16563 else if (!strcasecmp(
"tx",
a->argv[3]))
16569 gain = atof(
a->argv[5]);
16582 ast_cli(
a->fd,
"Unable to set the hardware gain for channel %d: %s\n",
channel, strerror(
errno));
16586 ast_cli(
a->fd,
"Hardware %s gain set to %.1f dB on channel %d.\n",
16587 tx ?
"tx" :
"rx", gain,
channel);
16619 e->
command =
"dahdi set swgain {rx|tx}";
16621 "Usage: dahdi set swgain <rx|tx> <chan#> <gain>\n"
16622 " Sets the software gain on a given channel and overrides the\n"
16623 " value provided at module loadtime. Changes take effect\n"
16624 " immediately whether the channel is in use or not.\n"
16626 " <rx|tx> which direction do you want to change (relative to our module)\n"
16627 " <chan num> is the channel number relative to the device\n"
16628 " <gain> is the gain in dB (e.g. -3.5 for -3.5dB)\n";
16637 if (!strcasecmp(
"rx",
a->argv[3]))
16639 else if (!strcasecmp(
"tx",
a->argv[3]))
16645 gain = atof(
a->argv[5]);
16662 ast_cli(
a->fd,
"Unable to set the software gain for channel %d\n",
channel);
16667 ast_cli(
a->fd,
"Software %s gain set to %.2f dB on channel %d.\n",
16668 tx ?
"tx" :
"rx", gain,
channel);
16695 e->
command =
"dahdi set dnd";
16697 "Usage: dahdi set dnd <chan#> <on|off>\n"
16698 " Sets/resets DND (Do Not Disturb) mode on a channel.\n"
16699 " Changes take effect immediately.\n"
16700 " <chan num> is the channel number\n"
16701 " <on|off> Enable or disable DND mode?\n"
16711 if ((
channel = atoi(
a->argv[3])) <= 0) {
16712 ast_cli(
a->fd,
"Expected channel number, got '%s'\n",
a->argv[3]);
16721 ast_cli(
a->fd,
"Expected 'on' or 'off', got '%s'\n",
a->argv[4]);
16726 for (dahdi_chan =
iflist; dahdi_chan; dahdi_chan = dahdi_chan->
next) {
16753 e->
command =
"dahdi set mwi";
16755 "Usage: dahdi set mwi <chan#> <on|off|reset>\n"
16756 " Sets/unsets MWI (Message Waiting Indicator) manually on a channel.\n"
16757 " This may be used regardless of whether the channel is assigned any mailboxes.\n"
16758 " When active, this setting will override the voicemail status to set MWI.\n"
16759 " Once cleared, the voicemail status will resume control of MWI.\n"
16760 " Changes are queued for when the channel is idle and persist until cleared.\n"
16761 " <chan num> is the channel number\n"
16762 " <on|off|reset> Enable, disable, or reset Message Waiting Indicator override?\n"
16772 if ((
channel = atoi(
a->argv[3])) <= 0) {
16773 ast_cli(
a->fd,
"Expected channel number, got '%s'\n",
a->argv[3]);
16781 }
else if (!strcmp(
a->argv[4],
"reset")) {
16784 ast_cli(
a->fd,
"Expected 'on' or 'off' or 'reset', got '%s'\n",
a->argv[4]);
16789 for (dahdi_chan =
iflist; dahdi_chan; dahdi_chan = dahdi_chan->
next) {
16796 ast_cli(
a->fd,
"MWI '%s' queued for channel %d\n", on ?
"enable" :
"disable",
channel);
16874 if (sscanf(
channel,
"%30d", &chan_num) != 1) {
16893#define REQUIRE_FXO_SIG() \
16894 if (!(dahdip->sigtype & __DAHDI_SIG_FXO)) { \
16895 ast_log(LOG_WARNING, "DAHDI channel %d is not FXO signalled\n", p->channel); \
16904 if (!strcasecmp(property,
"owner")) {
16906 }
else if (!strcasecmp(property,
"callwait")) {
16908 }
else if (!strcasecmp(property,
"threeway")) {
16911 }
else if (!strcasecmp(property,
"polarity")) {
16914 }
else if (!strcasecmp(property,
"dnd")) {
16916 snprintf(buffer,
len,
"%d", analog_p->
dnd);
16917 }
else if (!strcasecmp(property,
"callforward")) {
16920 }
else if (!strcasecmp(property,
"lastexten")) {
16938 if (!strcasecmp(property,
"owner") || !strcasecmp(property,
"callwait") || !strcasecmp(property,
"threeway")) {
16942 }
else if (!strcasecmp(property,
"polarity")) {
16950 }
else if (!strcasecmp(property,
"dnd")) {
16954 }
else if (!strcasecmp(property,
"callforward")) {
16960 }
else if (!strcasecmp(property,
"lastexten")) {
16972#undef REQUIRE_FXO_SIG
16978 struct dahdi_params dahdip;
16994 int channo = atoi(
args.dahdichan);
17009 memset(&dahdip, 0,
sizeof(dahdip));
17037 .
name =
"DAHDI_CHANNEL",
17046 struct dahdi_params dahdip;
17052 memset(&dahdip, 0,
sizeof(dahdip));
17062 struct dahdi_params dahdip;
17068 memset(&dahdip, 0,
sizeof(dahdip));
17077 .
name =
"POLARITY",
17190 for (i = 0; i < strlen(
number); i++) {
17205 int dahdichanquery;
17207 if (!dahdichannel || sscanf(dahdichannel,
"%30d", &dahdichanquery) != 1) {
17209 dahdichanquery = -1;
17214 snprintf(idText,
sizeof(idText),
"ActionID: %s\r\n",
id);
17226 if (dahdichanquery > 0 && tmp->
channel != dahdichanquery)
17234 "Event: DAHDIShowChannels\r\n"
17235 "DAHDIChannel: %d\r\n"
17238 "AccountCode: %s\r\n"
17239 "Signalling: %s\r\n"
17240 "SignallingCode: %d\r\n"
17244 "Description: %s\r\n"
17254 dahdi_dnd(tmp, -1) ?
"Enabled" :
"Disabled",
17259 "Event: DAHDIShowChannels\r\n"
17260 "DAHDIChannel: %d\r\n"
17261 "Signalling: %s\r\n"
17262 "SignallingCode: %d\r\n"
17266 "Description: %s\r\n"
17271 dahdi_dnd(tmp, -1) ?
"Enabled" :
"Disabled",
17295 struct dahdi_spaninfo spaninfo;
17297 ctl = open(
"/dev/dahdi/ctl", O_RDWR);
17305 snprintf(idText,
sizeof(idText),
"ActionID: %s\r\n",
id);
17309 for (span = 1; span < DAHDI_MAX_SPANS; ++span) {
17310 spaninfo.spanno = span;
17311 res = ioctl(ctl, DAHDI_SPANSTAT, &spaninfo);
17318 "Event: DAHDIShowStatus\r\n"
17320 "Description: %s\r\n"
17331 span, spaninfo.desc, alarmstr, spaninfo.irqmisses, spaninfo.bpvcount, spaninfo.crc4count,
17332 spaninfo.lineconfig & DAHDI_CONFIG_D4 ?
"D4" :
17333 spaninfo.lineconfig & DAHDI_CONFIG_ESF ?
"ESF" :
17334 spaninfo.lineconfig & DAHDI_CONFIG_CCS ?
"CCS" :
17336 spaninfo.lineconfig & DAHDI_CONFIG_B8ZS ?
"B8ZS" :
17337 spaninfo.lineconfig & DAHDI_CONFIG_HDB3 ?
"HDB3" :
17338 spaninfo.lineconfig & DAHDI_CONFIG_AMI ?
"AMI" :
17340 spaninfo.lineconfig & DAHDI_CONFIG_CRC4 ?
17341 spaninfo.lineconfig & DAHDI_CONFIG_NOTOPEN ?
"CRC4/YEL" :
"CRC4" :
17342 spaninfo.lineconfig & DAHDI_CONFIG_NOTOPEN ?
"YEL" :
"",
17354#if defined(HAVE_PRI)
17360 struct dahdi_pri *dspan;
17363 char action_id[256];
17364 const char *show_cmd =
"PRIShowSpans";
17368 span_query = atoi(span_str);
17374 snprintf(action_id,
sizeof(action_id),
"ActionID: %s\r\n",
id);
17376 action_id[0] =
'\0';
17382 for (idx = 0; idx <
ARRAY_LEN(pris); ++idx) {
17383 dspan = &pris[idx];
17386 if (0 < span_query && dspan->pri.span != span_query) {
17390 if (dspan->pri.pri) {
17403#if defined(HAVE_SS7)
17404static int linkset_addsigchan(
int sigchan)
17406 struct dahdi_ss7 *link;
17409 struct dahdi_params params;
17410 struct dahdi_bufferinfo bi;
17411 struct dahdi_spaninfo si;
17417 if (cur_ss7type < 0) {
17421 if (cur_pointcode < 0) {
17425 if (cur_adjpointcode < 0) {
17429 if (cur_defaultdpc < 0) {
17433 if (cur_networkindicator < 0) {
17437 link = ss7_resolve_linkset(cur_linkset);
17447 curfd = link->ss7.numsigchans;
17450 link->ss7.fds[curfd] = open(
"/dev/dahdi/channel", O_RDWR, 0600);
17451 if (link->ss7.fds[curfd] < 0) {
17456 if (ioctl(link->ss7.fds[curfd], DAHDI_SPECIFY, &sigchan) == -1) {
17457 dahdi_close_ss7_fd(link, curfd);
17464 memset(¶ms, 0,
sizeof(params));
17465 res = ioctl(link->ss7.fds[curfd], DAHDI_GET_PARAMS, ¶ms);
17467 dahdi_close_ss7_fd(link, curfd);
17468 ast_log(
LOG_ERROR,
"Unable to get parameters for sigchan %d (%s)\n", sigchan,
17472 if (params.sigtype != DAHDI_SIG_HDLCFCS
17473 && params.sigtype != DAHDI_SIG_HARDHDLC
17474 && params.sigtype != DAHDI_SIG_MTP2) {
17475 dahdi_close_ss7_fd(link, curfd);
17481 memset(&bi, 0,
sizeof(bi));
17482 bi.txbufpolicy = DAHDI_POLICY_IMMEDIATE;
17483 bi.rxbufpolicy = DAHDI_POLICY_IMMEDIATE;
17486 if (ioctl(link->ss7.fds[curfd], DAHDI_SET_BUFINFO, &bi)) {
17487 ast_log(
LOG_ERROR,
"Unable to set appropriate buffering on channel %d: %s\n",
17488 sigchan, strerror(
errno));
17489 dahdi_close_ss7_fd(link, curfd);
17494 memset(&si, 0,
sizeof(si));
17495 res = ioctl(link->ss7.fds[curfd], DAHDI_SPANSTAT, &si);
17497 dahdi_close_ss7_fd(link, curfd);
17498 ast_log(
LOG_ERROR,
"Unable to get span state for sigchan %d (%s)\n", sigchan,
17503 (params.sigtype == DAHDI_SIG_MTP2)
17504 ? SS7_TRANSPORT_DAHDIMTP2
17505 : SS7_TRANSPORT_DAHDIDCHAN,
17506 si.
alarms, cur_networkindicator, cur_pointcode, cur_adjpointcode, cur_slc);
17508 dahdi_close_ss7_fd(link, curfd);
17512 ++link->ss7.numsigchans;
17518#if defined(HAVE_SS7)
17524 e->
command =
"ss7 set debug {on|off} linkset";
17526 "Usage: ss7 set debug {on|off} linkset <linkset>\n"
17527 " Enables debugging on a given SS7 linkset\n";
17537 span = atoi(
a->argv[5]);
17538 if ((span < 1) || (span >
NUM_SPANS)) {
17539 ast_cli(
a->fd,
"Invalid linkset %s. Should be a number from %d to %d\n",
a->argv[5], 1,
NUM_SPANS);
17542 if (!linksets[span-1].ss7.ss7) {
17543 ast_cli(
a->fd,
"No SS7 running on linkset %d\n", span);
17545 if (!strcasecmp(
a->argv[3],
"on")) {
17546 linksets[span - 1].ss7.debug = 1;
17548 ast_cli(
a->fd,
"Enabled debugging on linkset %d\n", span);
17550 linksets[span - 1].ss7.debug = 0;
17551 ss7_set_debug(linksets[span-1].ss7.ss7, 0);
17552 ast_cli(
a->fd,
"Disabled debugging on linkset %d\n", span);
17560#if defined(HAVE_SS7)
17570 e->
command =
"ss7 {block|unblock} cic";
17572 "Usage: ss7 {block|unblock} cic <linkset> <dpc> <CIC>\n"
17573 " Sends a remote {blocking|unblocking} request for the given CIC on the specified linkset\n";
17579 if (
a->argc == 6) {
17580 linkset = atoi(
a->argv[3]);
17585 if (!strcasecmp(
a->argv[1],
"block")) {
17587 }
else if (strcasecmp(
a->argv[1],
"unblock")) {
17591 if ((linkset < 1) || (linkset >
NUM_SPANS)) {
17592 ast_cli(
a->fd,
"Invalid linkset %s. Should be a number %d to %d\n",
a->argv[3], 1,
NUM_SPANS);
17596 if (!linksets[linkset-1].ss7.ss7) {
17597 ast_cli(
a->fd,
"No SS7 running on linkset %d\n", linkset);
17601 cic = atoi(
a->argv[5]);
17603 ast_cli(
a->fd,
"Invalid CIC specified!\n");
17607 dpc = atoi(
a->argv[4]);
17609 ast_cli(
a->fd,
"Invalid DPC specified!\n");
17613 for (i = 0; i < linksets[linkset-1].ss7.numchans; i++) {
17614 if (linksets[linkset-1].ss7.pvts[i] && linksets[linkset-1].ss7.pvts[i]->cic == cic && linksets[linkset-1].ss7.pvts[i]->dpc == dpc) {
17615 blocked = linksets[linkset-1].ss7.pvts[i]->locallyblocked;
17618 ast_cli(
a->fd,
"Unable to allocate new ss7call\n");
17620 ast_cli(
a->fd,
"Sent %sblocking request for linkset %d on CIC %d DPC %d\n", (do_block) ?
"" :
"un", linkset, cic, dpc);
17622 }
else if (!do_block && blocked) {
17623 ast_cli(
a->fd,
"CIC %d is hardware locally blocked!\n", cic);
17625 ast_cli(
a->fd,
"CIC %d %s locally blocked\n", cic, do_block ?
"already" :
"is not");
17631 ast_cli(
a->fd,
"Invalid CIC specified!\n");
17636#if defined(HAVE_SS7)
17648 e->
command =
"ss7 {reset|block|unblock} linkset";
17650 "Usage: ss7 {reset|block|unblock} linkset <linkset number>\n"
17651 " Sends a remote {reset|blocking|unblocking} request for all CICs on the given linkset\n";
17657 if (
a->argc == 4) {
17658 linkset = atoi(
a->argv[3]);
17663 if (!strcasecmp(
a->argv[1],
"block")) {
17664 do_what = DO_BLOCK;
17665 }
else if (!strcasecmp(
a->argv[1],
"unblock")) {
17666 do_what = DO_UNBLOCK;
17667 }
else if (!strcasecmp(
a->argv[1],
"reset")) {
17668 do_what = DO_RESET;
17673 if ((linkset < 1) || (linkset >
NUM_SPANS)) {
17674 ast_cli(
a->fd,
"Invalid linkset %s. Should be a number %d to %d\n",
a->argv[3], 1,
NUM_SPANS);
17678 if (!linksets[linkset - 1].ss7.ss7) {
17679 ast_cli(
a->fd,
"No SS7 running on linkset %d\n", linkset);
17683 for (i = 0; i < linksets[linkset - 1].ss7.numchans; i++) {
17685 if (linksets[linkset - 1].ss7.pvts[i]) {
17690 ast_cli(
a->fd,
"Sent remote %s request on CIC %d\n",
17691 (do_what == DO_BLOCK) ?
"blocking" :
"unblocking",
17692 linksets[linkset - 1].ss7.
pvts[i]->cic);
17697 linksets[linkset - 1].ss7.pvts[i]->cic,
17698 linksets[linkset - 1].ss7.pvts[i]->dpc)) {
17699 ast_cli(
a->fd,
"Sent reset request on CIC %d\n",
17700 linksets[linkset - 1].ss7.pvts[i]->cic);
17711#if defined(HAVE_SS7)
17714 int linkset, cic, range, chanpos;
17715 int i, dpc, orient = 0;
17717 unsigned char state[255];
17721 e->
command =
"ss7 {block|unblock} group";
17723 "Usage: ss7 {block|unblock} group <linkset> <dpc> <1st. CIC> <range> [H]\n"
17724 " Sends a remote {blocking|unblocking} request for CIC range on the specified linkset\n";
17730 if (
a->argc == 7 ||
a->argc == 8) {
17731 linkset = atoi(
a->argv[3]);
17736 if (!strcasecmp(
a->argv[1],
"block")) {
17738 }
else if (strcasecmp(
a->argv[1],
"unblock")) {
17742 if (
a->argc == 8) {
17743 if (!strcasecmp(
a->argv[7],
"H")) {
17750 if ((linkset < 1) || (linkset >
NUM_SPANS)) {
17751 ast_cli(
a->fd,
"Invalid linkset %s. Should be a number %d to %d\n",
a->argv[4], 1,
NUM_SPANS);
17755 if (!linksets[linkset-1].ss7.ss7) {
17756 ast_cli(
a->fd,
"No SS7 running on linkset %d\n", linkset);
17760 cic = atoi(
a->argv[5]);
17762 ast_cli(
a->fd,
"Invalid CIC specified!\n");
17766 range = atoi(
a->argv[6]);
17768 if (range < 1 || range > (linksets[linkset - 1].ss7.type == SS7_ANSI ? 24 : 31)) {
17769 ast_cli(
a->fd,
"Invalid range specified!\n");
17773 dpc = atoi(
a->argv[4]);
17775 ast_cli(
a->fd,
"Invalid DPC specified!\n");
17782 ast_cli(
a->fd,
"Invalid CIC/RANGE\n");
17787 for (i = 0; i <= range; ++i) {
17794 ast_cli(
a->fd,
"Unable allocate new ss7call\n");
17796 ast_cli(
a->fd,
"Sending remote%s %sblocking request linkset %d on CIC %d range %d\n",
17797 orient ?
" hardware" :
"", do_block ?
"" :
"un", linkset, cic, range);
17804 pthread_kill(linksets[linkset-1].ss7.master, SIGURG);
17810#if defined(HAVE_SS7)
17813 int linkset, cic, range;
17818 e->
command =
"ss7 reset group";
17820 "Usage: ss7 reset group <linkset> <dpc> <1st CIC> <range>\n"
17821 " Send a GRS for the given CIC range on the specified linkset\n";
17827 if (
a->argc == 7) {
17828 linkset = atoi(
a->argv[3]);
17833 if ((linkset < 1) || (linkset >
NUM_SPANS)) {
17834 ast_cli(
a->fd,
"Invalid linkset %s. Should be a number %d to %d\n",
a->argv[4], 1,
NUM_SPANS);
17838 if (!linksets[linkset-1].ss7.ss7) {
17839 ast_cli(
a->fd,
"No SS7 running on linkset %d\n", linkset);
17843 cic = atoi(
a->argv[5]);
17846 ast_cli(
a->fd,
"Invalid CIC specified!\n");
17850 range = atoi(
a->argv[6]);
17851 if (range < 1 || range > (linksets[linkset - 1].ss7.type == SS7_ANSI ? 24 : 31)) {
17852 ast_cli(
a->fd,
"Invalid range specified!\n");
17856 dpc = atoi(
a->argv[4]);
17858 ast_cli(
a->fd,
"Invalid DPC specified!\n");
17865 ast_cli(
a->fd,
"Invalid CIC/RANGE\n");
17870 ast_cli(
a->fd,
"Unable to allocate new ss7call\n");
17872 ast_cli(
a->fd,
"GRS sent ... \n");
17879 pthread_kill(linksets[linkset-1].ss7.master, SIGURG);
17885#if defined(HAVE_SS7)
17892 e->
command =
"ss7 show calls";
17894 "Usage: ss7 show calls <linkset>\n"
17895 " Show SS7 calls on the specified linkset\n";
17901 if (
a->argc == 4) {
17902 linkset = atoi(
a->argv[3]);
17907 if ((linkset < 1) || (linkset >
NUM_SPANS)) {
17908 ast_cli(
a->fd,
"Invalid linkset %s. Should be a number %d to %d\n",
a->argv[3], 1,
NUM_SPANS);
17912 if (!linksets[linkset-1].ss7.ss7) {
17913 ast_cli(
a->fd,
"No SS7 running on linkset %d\n", linkset);
17918 isup_show_calls(linksets[linkset-1].ss7.ss7, &
ast_cli,
a->fd);
17925#if defined(HAVE_SS7)
17928 int linkset, cic, res;
17933 e->
command =
"ss7 reset cic";
17935 "Usage: ss7 reset cic <linkset> <dpc> <CIC>\n"
17936 " Send a RSC for the given CIC on the specified linkset\n";
17942 if (
a->argc == 6) {
17943 linkset = atoi(
a->argv[3]);
17948 if ((linkset < 1) || (linkset >
NUM_SPANS)) {
17949 ast_cli(
a->fd,
"Invalid linkset %s. Should be a number %d to %d\n",
a->argv[3], 1,
NUM_SPANS);
17953 if (!linksets[linkset-1].ss7.ss7) {
17954 ast_cli(
a->fd,
"No SS7 running on linkset %d\n", linkset);
17958 cic = atoi(
a->argv[5]);
17961 ast_cli(
a->fd,
"Invalid CIC specified!\n");
17965 dpc = atoi(
a->argv[4]);
17967 ast_cli(
a->fd,
"Invalid DPC specified!\n");
17973 ast_cli(
a->fd,
"%s RSC for linkset %d on CIC %d DPC %d\n", res ?
"Sent" :
"Failed", linkset, cic, dpc);
17979#if defined(HAVE_SS7)
17984 unsigned int arg = 0;
17991 "Usage: ss7 mtp3 <linkset> <slc> coo|coa|cbd|cba|eco|eca|tfp|tfa|lin|lun|lia|lua|lid|lfu <arg>\n"
17992 " Send a NET MNG message\n"
17993 " WARNING!!! WARNING!!! We are not a STP, just for testing/development purposes\n";
18003 linkset = atoi(
a->argv[2]);
18004 if ((linkset < 1) || (linkset >
NUM_SPANS)) {
18005 ast_cli(
a->fd,
"Invalid linkset %s. Should be a number %d to %d\n",
a->argv[2], 1,
NUM_SPANS);
18008 if (!linksets[linkset-1].ss7.ss7) {
18009 ast_cli(
a->fd,
"No SS7 running on linkset %d\n", linkset);
18013 slc = atoi(
a->argv[3]);
18015 if (
a->argc == 6) {
18016 arg = atoi(
a->argv[5]);
18020 res = mtp3_net_mng(linksets[linkset-1].ss7.ss7, slc,
a->argv[4], arg);
18025 pthread_kill(linksets[linkset-1].ss7.master, SIGURG);
18034#if defined(HAVE_SS7)
18038 unsigned int slc = 0;
18042 e->
command =
"ss7 restart mtp3";
18044 "Usage: ss7 restart mtp3 <linkset> <slc>\n"
18055 linkset = atoi(
a->argv[3]);
18056 if ((linkset < 1) || (linkset >
NUM_SPANS)) {
18057 ast_cli(
a->fd,
"Invalid linkset %s. Should be a number %d to %d\n",
a->argv[2], 1,
NUM_SPANS);
18060 if (!linksets[linkset-1].ss7.ss7) {
18061 ast_cli(
a->fd,
"No SS7 running on linkset %d\n", linkset);
18065 slc = atoi(
a->argv[4]);
18068 mtp3_init_restart(linksets[linkset-1].ss7.ss7, slc);
18073 pthread_kill(linksets[linkset-1].ss7.master, SIGURG);
18080#if defined(HAVE_SS7)
18087 e->
command =
"ss7 show linkset";
18089 "Usage: ss7 show linkset <span>\n"
18090 " Shows the status of an SS7 linkset.\n";
18100 linkset = atoi(
a->argv[3]);
18101 if ((linkset < 1) || (linkset >
NUM_SPANS)) {
18102 ast_cli(
a->fd,
"Invalid linkset %s. Should be a number %d to %d\n",
a->argv[3], 1,
NUM_SPANS);
18105 ss7 = &linksets[linkset - 1].ss7;
18107 ast_cli(
a->fd,
"No SS7 running on linkset %d\n", linkset);
18113 ast_cli(
a->fd,
"SS7 calling nai: %i\n",
ss7->calling_nai);
18114 ast_cli(
a->fd,
"SS7 called nai: %i\n",
ss7->called_nai);
18115 ast_cli(
a->fd,
"SS7 nationalprefix: %s\n",
ss7->nationalprefix);
18116 ast_cli(
a->fd,
"SS7 internationalprefix: %s\n",
ss7->internationalprefix);
18117 ast_cli(
a->fd,
"SS7 unknownprefix: %s\n",
ss7->unknownprefix);
18118 ast_cli(
a->fd,
"SS7 networkroutedprefix: %s\n",
ss7->networkroutedprefix);
18119 ast_cli(
a->fd,
"SS7 subscriberprefix: %s\n",
ss7->subscriberprefix);
18126#if defined(HAVE_SS7)
18133 e->
command =
"ss7 show channels";
18135 "Usage: ss7 show channels\n"
18136 " Displays SS7 channel information at a glance.\n";
18142 if (
a->argc != 3) {
18147 for (linkset = 0; linkset <
NUM_SPANS; ++linkset) {
18148 if (linksets[linkset].
ss7.ss7) {
18156#if defined(HAVE_SS7)
18159#define FORMAT "%5s %5s %6s %12s %-12s\n"
18160#define FORMAT2 "%5i %5i %6i %12s %-12s\n"
18161 int i, linkset, dpc = 0;
18168 e->
command =
"ss7 show cics";
18170 "Usage: ss7 show cics <linkset> [dpc]\n"
18171 " Shows the cics of an SS7 linkset.\n";
18177 if (
a->argc < 4 ||
a->argc > 5) {
18181 linkset = atoi(
a->argv[3]);
18183 if ((linkset < 1) || (linkset >
NUM_SPANS)) {
18184 ast_cli(
a->fd,
"Invalid linkset %s. Should be a number %d to %d\n",
a->argv[3], 1,
NUM_SPANS);
18188 if (!linksets[linkset-1].
ss7.ss7) {
18189 ast_cli(
a->fd,
"No SS7 running on linkset %d\n", linkset);
18192 ss7 = &linksets[linkset-1].ss7;
18194 if (
a->argc == 5) {
18195 dpc = atoi(
a->argv[4]);
18197 ast_cli(
a->fd,
"Invalid DPC specified!\n");
18202 ast_cli(
a->fd,
FORMAT,
"CIC",
"DPC",
"DAHDI",
"STATE",
"BLOCKING");
18204 for (i = 0; i <
ss7->numchans; i++) {
18205 if (!dpc || (
ss7->pvts[i] &&
ss7->pvts[i]->dpc == dpc)) {
18213 state =
"NotInServ";
18219 strcpy(blocking,
"L:");
18221 strcat(blocking,
"M");
18223 strcat(blocking,
" ");
18227 strcat(blocking,
"H");
18229 strcat(blocking,
" ");
18232 strcpy(blocking,
" ");
18236 strcat(blocking,
" R:");
18238 strcat(blocking,
"M");
18240 strcat(blocking,
" ");
18244 strcat(blocking,
"H");
18246 strcat(blocking,
" ");
18260#if defined(HAVE_SS7)
18265 e->
command =
"ss7 show version";
18267 "Usage: ss7 show version\n"
18268 " Show the libss7 version\n";
18274 ast_cli(
a->fd,
"libss7 version: %s\n", ss7_get_version());
18280#if defined(HAVE_SS7)
18282 AST_CLI_DEFINE(handle_ss7_debug,
"Enables SS7 debugging on a linkset"),
18283 AST_CLI_DEFINE(handle_ss7_cic_blocking,
"Blocks/Unblocks the given CIC"),
18284 AST_CLI_DEFINE(handle_ss7_linkset_mng,
"Resets/Blocks/Unblocks all CICs on a linkset"),
18285 AST_CLI_DEFINE(handle_ss7_group_blocking,
"Blocks/Unblocks the given CIC range"),
18287 AST_CLI_DEFINE(handle_ss7_group_reset,
"Resets the given CIC range"),
18290 AST_CLI_DEFINE(handle_ss7_show_linkset,
"Shows the status of a linkset"),
18291 AST_CLI_DEFINE(handle_ss7_show_channels,
"Displays SS7 channel information"),
18298#if defined(HAVE_PRI)
18299#if defined(HAVE_PRI_CCSS)
18346#if defined(HAVE_PRI)
18347#if defined(HAVE_PRI_CCSS)
18359static void dahdi_pri_cc_agent_destructor(
struct ast_cc_agent *agent)
18368#if defined(HAVE_PRI)
18369#if defined(HAVE_PRI_CCSS)
18371 .
type = dahdi_pri_cc_type,
18372 .init = dahdi_pri_cc_agent_init,
18381 .destructor = dahdi_pri_cc_agent_destructor,
18386#if defined(HAVE_PRI)
18387#if defined(HAVE_PRI_CCSS)
18389 .
type = dahdi_pri_cc_type,
18403#if defined(HAVE_PRI) || defined(HAVE_SS7)
18410 pthread_cancel(pris[i].pri.
master);
18411 pthread_kill(pris[i].pri.
master, SIGURG);
18416#ifdef HAVE_PRI_PROG_W_CAUSE
18420#if defined(HAVE_SS7)
18423 pthread_cancel(linksets[i].ss7.
master);
18424 pthread_kill(linksets[i].ss7.
master, SIGURG);
18429#if defined(HAVE_OPENR2)
18430 dahdi_r2_destroy_links();
18447#if defined(HAVE_PRI)
18474#if defined(HAVE_PRI)
18480 dahdi_close_pri_fd(&(pris[i]), j);
18484#if defined(HAVE_PRI_CCSS)
18491#if defined(HAVE_SS7)
18497 dahdi_close_ss7_fd(&(linksets[i]), j);
18499 if (linksets[i].ss7.
ss7) {
18500 ss7_destroy(linksets[i].ss7.
ss7);
18501 linksets[i].ss7.ss7 =
NULL;
18517#if defined(HAVE_PRI) || defined(HAVE_SS7)
18524#if defined(HAVE_SS7)
18534 int x, start, finish;
18537 if ((
reload == 0) && (
conf->chan.sig < 0) && !
conf->is_sig_auto) {
18538 ast_log(
LOG_ERROR,
"Signalling must be specified before any channels are.\n");
18544 while ((chan =
strsep(&
c,
","))) {
18545 if (sscanf(chan,
"%30d-%30d", &start, &finish) == 2) {
18547 }
else if (sscanf(chan,
"%30d", &start)) {
18550 }
else if (!strcasecmp(chan,
"pseudo")) {
18556 if (finish < start) {
18563 for (x = start; x <= finish; x++) {
18564 if (
conf->wanted_channels_start &&
18565 (x < conf->wanted_channels_start ||
18566 x >
conf->wanted_channels_end)
18576 (
reload == 1) ?
"reconfigure" :
"register",
value);
18590#define MAX_CHANLIST_LEN 80
18595 char *
params[DAHDI_MAX_ECHOCANPARAMS + 1];
18596 unsigned int param_count;
18608 if ((x == 32) || (x == 64) || (x == 128) || (x == 256) || (x == 512) || (x == 1024))
18615 for (x = 1; x < param_count; x++) {
18622 ast_log(
LOG_WARNING,
"Invalid echocancel parameter supplied at line %u: '%s'\n", line, params[x]);
18627 ast_log(
LOG_WARNING,
"Invalid echocancel parameter supplied at line %u: '%s'\n", line, param.name);
18635 ast_log(
LOG_WARNING,
"Invalid echocancel parameter value supplied at line %u: '%s'\n", line, param.value);
18643#if defined(HAVE_PRI)
18644#if defined(HAVE_PRI_DISPLAY_TEXT)
18654static unsigned long dahdi_display_text_option(
const char *
value)
18664 opt_str =
strsep(&val_str,
",");
18673 if (!strcasecmp(opt_str,
"block")) {
18674 options |= PRI_DISPLAY_OPTION_BLOCK;
18675 }
else if (!strcasecmp(opt_str,
"name_initial")) {
18676 options |= PRI_DISPLAY_OPTION_NAME_INITIAL;
18677 }
else if (!strcasecmp(opt_str,
"name_update")) {
18678 options |= PRI_DISPLAY_OPTION_NAME_UPDATE;
18679 }
else if (!strcasecmp(opt_str,
"name")) {
18680 options |= (PRI_DISPLAY_OPTION_NAME_INITIAL | PRI_DISPLAY_OPTION_NAME_UPDATE);
18681 }
else if (!strcasecmp(opt_str,
"text")) {
18682 options |= PRI_DISPLAY_OPTION_TEXT;
18690#if defined(HAVE_PRI)
18691#if defined(HAVE_PRI_DATETIME_SEND)
18701static int dahdi_datetime_send_option(
const char *
value)
18705 option = PRI_DATE_TIME_SEND_DEFAULT;
18708 option = PRI_DATE_TIME_SEND_NO;
18709 }
else if (!strcasecmp(
value,
"date")) {
18710 option = PRI_DATE_TIME_SEND_DATE;
18711 }
else if (!strcasecmp(
value,
"date_hh")) {
18712 option = PRI_DATE_TIME_SEND_DATE_HH;
18713 }
else if (!strcasecmp(
value,
"date_hhmm")) {
18714 option = PRI_DATE_TIME_SEND_DATE_HHMM;
18715 }
else if (!strcasecmp(
value,
"date_hhmmss")) {
18716 option = PRI_DATE_TIME_SEND_DATE_HHMMSS;
18725#define PROC_DAHDI_OPT_NOCHAN (1 << 0)
18727#define PROC_DAHDI_OPT_NOWARN (1 << 1)
18731 int count_pattern = 0;
18733 const char *temp =
NULL;
18737 if (!sscanf(v->
value,
"%30d", &norval) && count_pattern == 0) {
18738 ast_log(
LOG_ERROR,
"busypattern= expects either busypattern=tonelength,quietlength or busypattern=t1length, q1length, t2length, q2length at line %d.\n", v->
lineno);
18742 busy_cadence->
pattern[count_pattern] = norval;
18745 if (count_pattern == 4) {
18749 temp = strchr(v->
value,
',');
18750 if (temp ==
NULL) {
18753 v->
value = temp + 1;
18755 busy_cadence->
length = count_pattern;
18757 if (count_pattern % 2 != 0) {
18759 ast_log(
LOG_ERROR,
"busypattern= expects either busypattern=tonelength,quietlength or busypattern=t1length, q1length, t2length, q2length at line %d.\n", v->
lineno);
18773 for (; v; v = v->
next) {
18778 if (!strcasecmp(v->
name,
"channel") || !strcasecmp(v->
name,
"channels")) {
18792 }
else if (!strcasecmp(v->
name,
"ignore_failed_channels")) {
18794 }
else if (!strcasecmp(v->
name,
"buffers")) {
18800 }
else if (!strcasecmp(v->
name,
"faxbuffers")) {
18804 }
else if (!strcasecmp(v->
name,
"dahdichan")) {
18807 }
else if (!strcasecmp(v->
name,
"usedistinctiveringdetection")) {
18809 }
else if (!strcasecmp(v->
name,
"distinctiveringaftercid")) {
18811 }
else if (!strcasecmp(v->
name,
"dring1context")) {
18813 }
else if (!strcasecmp(v->
name,
"dring2context")) {
18815 }
else if (!strcasecmp(v->
name,
"dring3context")) {
18817 }
else if (!strcasecmp(v->
name,
"dring1range")) {
18819 }
else if (!strcasecmp(v->
name,
"dring2range")) {
18821 }
else if (!strcasecmp(v->
name,
"dring3range")) {
18823 }
else if (!strcasecmp(v->
name,
"dring1")) {
18825 }
else if (!strcasecmp(v->
name,
"dring2")) {
18827 }
else if (!strcasecmp(v->
name,
"dring3")) {
18829 }
else if (!strcasecmp(v->
name,
"usecallerid")) {
18831 }
else if (!strcasecmp(v->
name,
"cidsignalling")) {
18832 if (!strcasecmp(v->
value,
"bell"))
18834 else if (!strcasecmp(v->
value,
"v23"))
18836 else if (!strcasecmp(v->
value,
"dtmf"))
18838 else if (!strcasecmp(v->
value,
"smdi"))
18840 else if (!strcasecmp(v->
value,
"v23_jp"))
18844 }
else if (!strcasecmp(v->
name,
"cidstart")) {
18845 if (!strcasecmp(v->
value,
"ring"))
18847 else if (!strcasecmp(v->
value,
"polarity_in"))
18849 else if (!strcasecmp(v->
value,
"polarity"))
18851 else if (!strcasecmp(v->
value,
"dtmf"))
18855 }
else if (!strcasecmp(v->
name,
"threewaycalling")) {
18857 }
else if (!strcasecmp(v->
name,
"threewaysilenthold")) {
18859 }
else if (!strcasecmp(v->
name,
"cancallforward")) {
18861 }
else if (!strcasecmp(v->
name,
"relaxdtmf")) {
18866 }
else if (!strcasecmp(v->
name,
"mailbox")) {
18868 }
else if (!strcasecmp(v->
name,
"description")) {
18870 }
else if (!strcasecmp(v->
name,
"adsi")) {
18872 }
else if (!strcasecmp(v->
name,
"usesmdi")) {
18874 }
else if (!strcasecmp(v->
name,
"smdiport")) {
18876 }
else if (!strcasecmp(v->
name,
"transfer")) {
18878 }
else if (!strcasecmp(v->
name,
"canpark")) {
18880 }
else if (!strcasecmp(v->
name,
"echocancelwhenbridged")) {
18882 }
else if (!strcasecmp(v->
name,
"busydetect")) {
18884 }
else if (!strcasecmp(v->
name,
"busycount")) {
18886 }
else if (!strcasecmp(v->
name,
"busypattern")) {
18888 }
else if (!strcasecmp(v->
name,
"calledsubscriberheld")) {
18890 }
else if (!strcasecmp(v->
name,
"lastnumredial")) {
18892 }
else if (!strcasecmp(v->
name,
"callprogress")) {
18896 }
else if (!strcasecmp(v->
name,
"waitfordialtone")) {
18898 }
else if (!strcasecmp(v->
name,
"dialtone_detect")) {
18899 if (!strcasecmp(v->
value,
"always")) {
18908 }
else if (!strcasecmp(v->
name,
"faxdetect")) {
18910 if (!strcasecmp(v->
value,
"incoming")) {
18912 }
else if (!strcasecmp(v->
value,
"outgoing")) {
18916 }
else if (!strcasecmp(v->
name,
"faxdetect_timeout")) {
18920 }
else if (!strcasecmp(v->
name,
"firstdigit_timeout")) {
18925 }
else if (!strcasecmp(v->
name,
"interdigit_timeout")) {
18930 }
else if (!strcasecmp(v->
name,
"matchdigit_timeout")) {
18935 }
else if (!strcasecmp(v->
name,
"echocancel")) {
18937 }
else if (!strcasecmp(v->
name,
"echotraining")) {
18938 if (sscanf(v->
value,
"%30d", &y) == 1) {
18939 if ((y < 10) || (y > 4000)) {
18948 }
else if (!strcasecmp(v->
name,
"hidecallerid")) {
18950 }
else if (!strcasecmp(v->
name,
"hidecalleridname")) {
18952 }
else if (!strcasecmp(v->
name,
"pulsedial")) {
18954 }
else if (!strcasecmp(v->
name,
"callreturn")) {
18956 }
else if (!strcasecmp(v->
name,
"callwaiting")) {
18958 }
else if (!strcasecmp(v->
name,
"callwaitingcallerid")) {
18960 }
else if (!strcasecmp(v->
name,
"callwaitingdeluxe")) {
18962 }
else if (!strcasecmp(v->
name,
"context")) {
18964 }
else if (!strcasecmp(v->
name,
"language")) {
18966 }
else if (!strcasecmp(v->
name,
"progzone")) {
18968 }
else if (!strcasecmp(v->
name,
"mohinterpret")
18969 ||!strcasecmp(v->
name,
"musiconhold") || !strcasecmp(v->
name,
"musicclass")) {
18971 }
else if (!strcasecmp(v->
name,
"mohsuggest")) {
18973 }
else if (!strcasecmp(v->
name,
"parkinglot")) {
18975 }
else if (!strcasecmp(v->
name,
"stripmsd")) {
18976 ast_log(
LOG_NOTICE,
"Configuration option \"%s\" has been deprecated. Please use dialplan instead\n", v->
name);
18978 }
else if (!strcasecmp(v->
name,
"jitterbuffers")) {
18980 }
else if (!strcasecmp(v->
name,
"group")) {
18982 }
else if (!strcasecmp(v->
name,
"callgroup")) {
18986 if (!strcasecmp(v->
value,
"none"))
18990 }
else if (!strcasecmp(v->
name,
"pickupgroup")) {
18994 if (!strcasecmp(v->
value,
"none"))
18998 }
else if (!strcasecmp(v->
name,
"namedcallgroup")) {
19000 ast_log(
LOG_WARNING,
"Only FXO signalled channels may belong to a named call group\n");
19003 }
else if (!strcasecmp(v->
name,
"namedpickupgroup")) {
19005 ast_log(
LOG_WARNING,
"Only FXO signalled channels may belong to a named pickup group\n");
19008 }
else if (!strcasecmp(v->
name,
"setvar")) {
19010 char *varval =
NULL;
19012 char varname[strlen(v->
value) + 1];
19013 strcpy(varname, v->
value);
19014 if ((varval = strchr(varname,
'='))) {
19024 }
else if (!strcasecmp(v->
name,
"immediate")) {
19026 }
else if (!strcasecmp(v->
name,
"immediatering")) {
19028 }
else if (!strcasecmp(v->
name,
"transfertobusy")) {
19030 }
else if (!strcasecmp(v->
name,
"dialmode")) {
19031 if (!strcasecmp(v->
value,
"pulse")) {
19033 }
else if (!strcasecmp(v->
value,
"dtmf") || !strcasecmp(v->
value,
"tone")) {
19035 }
else if (!strcasecmp(v->
value,
"none")) {
19040 }
else if (!strcasecmp(v->
name,
"mwimonitor")) {
19057 }
else if (!strcasecmp(v->
name,
"hwrxgain")) {
19059 if (strcasecmp(v->
value,
"disabled")) {
19066 }
else if (!strcasecmp(v->
name,
"hwtxgain")) {
19068 if (strcasecmp(v->
value,
"disabled")) {
19075 }
else if (!strcasecmp(v->
name,
"cid_rxgain")) {
19079 }
else if (!strcasecmp(v->
name,
"rxgain")) {
19083 }
else if (!strcasecmp(v->
name,
"txgain")) {
19087 }
else if (!strcasecmp(v->
name,
"txdrc")) {
19091 }
else if (!strcasecmp(v->
name,
"rxdrc")) {
19095 }
else if (!strcasecmp(v->
name,
"tonezone")) {
19099 }
else if (!strcasecmp(v->
name,
"callerid")) {
19100 if (!strcasecmp(v->
value,
"asreceived")) {
19106 }
else if (!strcasecmp(v->
name,
"fullname")) {
19108 }
else if (!strcasecmp(v->
name,
"cid_number")) {
19110 }
else if (!strcasecmp(v->
name,
"cid_tag")) {
19112 }
else if (!strcasecmp(v->
name,
"useincomingcalleridondahditransfer")) {
19114 }
else if (!strcasecmp(v->
name,
"restrictcid")) {
19116 }
else if (!strcasecmp(v->
name,
"usecallingpres")) {
19118 }
else if (!strcasecmp(v->
name,
"accountcode")) {
19120 }
else if (!strcasecmp(v->
name,
"amaflags")) {
19126 }
else if (!strcasecmp(v->
name,
"polarityonanswerdelay")) {
19128 }
else if (!strcasecmp(v->
name,
"answeronpolarityswitch")) {
19130 }
else if (!strcasecmp(v->
name,
"ani_info_digits")) {
19132 }
else if (!strcasecmp(v->
name,
"ani_wink_time")) {
19134 }
else if (!strcasecmp(v->
name,
"ani_timeout")) {
19136 }
else if (!strcasecmp(v->
name,
"hanguponpolarityswitch")) {
19138 }
else if (!strcasecmp(v->
name,
"autoreoriginate")) {
19140 }
else if (!strcasecmp(v->
name,
"sendcalleridafter")) {
19142 }
else if (!strcasecmp(v->
name,
"mwimonitornotify")) {
19146 }
else if (!strcasecmp(v->
name,
"mwisendtype")) {
19147#ifndef HAVE_DAHDI_LINEREVERSE_VMWI
19148 if (!strcasecmp(v->
value,
"rpas")) {
19155 memset(&confp->
chan.mwisend_setting, 0,
sizeof(confp->
chan.mwisend_setting));
19157 confp->
chan.mwisend_fsk = 0;
19159 confp->
chan.mwisend_fsk = 1;
19162 confp->
chan.mwisend_rpas = 1;
19164 confp->
chan.mwisend_rpas = 0;
19167 confp->
chan.mwisend_setting.vmwi_type |= DAHDI_VMWI_LREV;
19170 confp->
chan.mwisend_setting.vmwi_type |= DAHDI_VMWI_HVDC;
19173 confp->
chan.mwisend_setting.vmwi_type |= DAHDI_VMWI_HVAC;
19176 }
else if (
reload != 1) {
19177 if (!strcasecmp(v->
name,
"signalling") || !strcasecmp(v->
name,
"signaling")) {
19185 if (!strcasecmp(v->
value,
"em")) {
19187 }
else if (!strcasecmp(v->
value,
"em_e1")) {
19189 }
else if (!strcasecmp(v->
value,
"em_w")) {
19191 }
else if (!strcasecmp(v->
value,
"fxs_ls")) {
19193 }
else if (!strcasecmp(v->
value,
"fxs_gs")) {
19195 }
else if (!strcasecmp(v->
value,
"fxs_ks")) {
19197 }
else if (!strcasecmp(v->
value,
"fxo_ls")) {
19199 }
else if (!strcasecmp(v->
value,
"fxo_gs")) {
19201 }
else if (!strcasecmp(v->
value,
"fxo_ks")) {
19203 }
else if (!strcasecmp(v->
value,
"fxs_rx")) {
19206 }
else if (!strcasecmp(v->
value,
"fxo_rx")) {
19209 }
else if (!strcasecmp(v->
value,
"fxs_tx")) {
19212 }
else if (!strcasecmp(v->
value,
"fxo_tx")) {
19215 }
else if (!strcasecmp(v->
value,
"em_rx")) {
19218 }
else if (!strcasecmp(v->
value,
"em_tx")) {
19221 }
else if (!strcasecmp(v->
value,
"em_rxtx")) {
19224 }
else if (!strcasecmp(v->
value,
"em_txrx")) {
19227 }
else if (!strcasecmp(v->
value,
"sf")) {
19229 }
else if (!strcasecmp(v->
value,
"sf_w")) {
19231 }
else if (!strcasecmp(v->
value,
"sf_featd")) {
19233 }
else if (!strcasecmp(v->
value,
"sf_featdmf")) {
19235 }
else if (!strcasecmp(v->
value,
"sf_featb")) {
19237 }
else if (!strcasecmp(v->
value,
"sf")) {
19239 }
else if (!strcasecmp(v->
value,
"sf_rx")) {
19242 }
else if (!strcasecmp(v->
value,
"sf_tx")) {
19245 }
else if (!strcasecmp(v->
value,
"sf_rxtx")) {
19248 }
else if (!strcasecmp(v->
value,
"sf_txrx")) {
19251 }
else if (!strcasecmp(v->
value,
"featd")) {
19253 }
else if (!strcasecmp(v->
value,
"featdmf")) {
19255 }
else if (!strcasecmp(v->
value,
"featdmf_ta")) {
19257 }
else if (!strcasecmp(v->
value,
"e911")) {
19259 }
else if (!strcasecmp(v->
value,
"fgccama")) {
19261 }
else if (!strcasecmp(v->
value,
"fgccamamf")) {
19263 }
else if (!strcasecmp(v->
value,
"featb")) {
19266 }
else if (!strcasecmp(v->
value,
"pri_net")) {
19268 confp->pri.pri.nodetype = PRI_NETWORK;
19269 }
else if (!strcasecmp(v->
value,
"pri_cpe")) {
19271 confp->pri.pri.nodetype = PRI_CPE;
19272 }
else if (!strcasecmp(v->
value,
"bri_cpe")) {
19274 confp->pri.pri.nodetype = PRI_CPE;
19275 }
else if (!strcasecmp(v->
value,
"bri_net")) {
19277 confp->pri.pri.nodetype = PRI_NETWORK;
19278 }
else if (!strcasecmp(v->
value,
"bri_cpe_ptmp")) {
19280 confp->pri.pri.nodetype = PRI_CPE;
19281 }
else if (!strcasecmp(v->
value,
"bri_net_ptmp")) {
19282#if defined(HAVE_PRI_CALL_HOLD)
19284 confp->pri.pri.nodetype = PRI_NETWORK;
19286 ast_log(
LOG_WARNING,
"How cool would it be if someone implemented this mode! For now, sucks for you. (line %d)\n", v->
lineno);
19289#if defined(HAVE_SS7)
19290 }
else if (!strcasecmp(v->
value,
"ss7")) {
19294 }
else if (!strcasecmp(v->
value,
"mfcr2")) {
19297 }
else if (!strcasecmp(v->
value,
"auto")) {
19305 }
else if (!strcasecmp(v->
name,
"outsignalling") || !strcasecmp(v->
name,
"outsignaling")) {
19306 if (!strcasecmp(v->
value,
"em")) {
19308 }
else if (!strcasecmp(v->
value,
"em_e1")) {
19310 }
else if (!strcasecmp(v->
value,
"em_w")) {
19312 }
else if (!strcasecmp(v->
value,
"sf")) {
19314 }
else if (!strcasecmp(v->
value,
"sf_w")) {
19316 }
else if (!strcasecmp(v->
value,
"sf_featd")) {
19318 }
else if (!strcasecmp(v->
value,
"sf_featdmf")) {
19320 }
else if (!strcasecmp(v->
value,
"sf_featb")) {
19322 }
else if (!strcasecmp(v->
value,
"sf")) {
19324 }
else if (!strcasecmp(v->
value,
"featd")) {
19326 }
else if (!strcasecmp(v->
value,
"featdmf")) {
19328 }
else if (!strcasecmp(v->
value,
"featdmf_ta")) {
19330 }
else if (!strcasecmp(v->
value,
"e911")) {
19332 }
else if (!strcasecmp(v->
value,
"fgccama")) {
19334 }
else if (!strcasecmp(v->
value,
"fgccamamf")) {
19336 }
else if (!strcasecmp(v->
value,
"featb")) {
19342 }
else if (!strcasecmp(v->
name,
"pridialplan")) {
19343 if (!strcasecmp(v->
value,
"national")) {
19344 confp->pri.pri.dialplan = PRI_NATIONAL_ISDN + 1;
19345 }
else if (!strcasecmp(v->
value,
"unknown")) {
19346 confp->pri.pri.dialplan = PRI_UNKNOWN + 1;
19347 }
else if (!strcasecmp(v->
value,
"private")) {
19348 confp->pri.pri.dialplan = PRI_PRIVATE + 1;
19349 }
else if (!strcasecmp(v->
value,
"international")) {
19350 confp->pri.pri.dialplan = PRI_INTERNATIONAL_ISDN + 1;
19351 }
else if (!strcasecmp(v->
value,
"local")) {
19352 confp->pri.pri.dialplan = PRI_LOCAL_ISDN + 1;
19353 }
else if (!strcasecmp(v->
value,
"dynamic")) {
19354 confp->pri.pri.dialplan = -1;
19355 }
else if (!strcasecmp(v->
value,
"redundant")) {
19356 confp->pri.pri.dialplan = -2;
19360 }
else if (!strcasecmp(v->
name,
"prilocaldialplan")) {
19361 if (!strcasecmp(v->
value,
"national")) {
19362 confp->pri.pri.localdialplan = PRI_NATIONAL_ISDN + 1;
19363 }
else if (!strcasecmp(v->
value,
"unknown")) {
19364 confp->pri.pri.localdialplan = PRI_UNKNOWN + 1;
19365 }
else if (!strcasecmp(v->
value,
"private")) {
19366 confp->pri.pri.localdialplan = PRI_PRIVATE + 1;
19367 }
else if (!strcasecmp(v->
value,
"international")) {
19368 confp->pri.pri.localdialplan = PRI_INTERNATIONAL_ISDN + 1;
19369 }
else if (!strcasecmp(v->
value,
"local")) {
19370 confp->pri.pri.localdialplan = PRI_LOCAL_ISDN + 1;
19371 }
else if (!strcasecmp(v->
value,
"from_channel")) {
19372 confp->pri.pri.localdialplan = 0;
19373 }
else if (!strcasecmp(v->
value,
"dynamic")) {
19374 confp->pri.pri.localdialplan = -1;
19375 }
else if (!strcasecmp(v->
value,
"redundant")) {
19376 confp->pri.pri.localdialplan = -2;
19380 }
else if (!strcasecmp(v->
name,
"pricpndialplan")) {
19381 if (!strcasecmp(v->
value,
"national")) {
19382 confp->pri.pri.cpndialplan = PRI_NATIONAL_ISDN + 1;
19383 }
else if (!strcasecmp(v->
value,
"unknown")) {
19384 confp->pri.pri.cpndialplan = PRI_UNKNOWN + 1;
19385 }
else if (!strcasecmp(v->
value,
"private")) {
19386 confp->pri.pri.cpndialplan = PRI_PRIVATE + 1;
19387 }
else if (!strcasecmp(v->
value,
"international")) {
19388 confp->pri.pri.cpndialplan = PRI_INTERNATIONAL_ISDN + 1;
19389 }
else if (!strcasecmp(v->
value,
"local")) {
19390 confp->pri.pri.cpndialplan = PRI_LOCAL_ISDN + 1;
19391 }
else if (!strcasecmp(v->
value,
"from_channel")) {
19392 confp->pri.pri.cpndialplan = 0;
19393 }
else if (!strcasecmp(v->
value,
"dynamic")) {
19394 confp->pri.pri.cpndialplan = -1;
19395 }
else if (!strcasecmp(v->
value,
"redundant")) {
19396 confp->pri.pri.cpndialplan = -2;
19400 }
else if (!strcasecmp(v->
name,
"switchtype")) {
19401 if (!strcasecmp(v->
value,
"national"))
19402 confp->pri.pri.switchtype = PRI_SWITCH_NI2;
19403 else if (!strcasecmp(v->
value,
"ni1"))
19404 confp->pri.pri.switchtype = PRI_SWITCH_NI1;
19405 else if (!strcasecmp(v->
value,
"dms100"))
19406 confp->pri.pri.switchtype = PRI_SWITCH_DMS100;
19407 else if (!strcasecmp(v->
value,
"4ess"))
19408 confp->pri.pri.switchtype = PRI_SWITCH_ATT4ESS;
19409 else if (!strcasecmp(v->
value,
"5ess"))
19410 confp->pri.pri.switchtype = PRI_SWITCH_LUCENT5E;
19411 else if (!strcasecmp(v->
value,
"euroisdn"))
19412 confp->pri.pri.switchtype = PRI_SWITCH_EUROISDN_E1;
19413 else if (!strcasecmp(v->
value,
"qsig"))
19414 confp->pri.pri.switchtype = PRI_SWITCH_QSIG;
19419 }
else if (!strcasecmp(v->
name,
"msn")) {
19421 sizeof(confp->pri.pri.msn_list));
19422 }
else if (!strcasecmp(v->
name,
"nsf")) {
19423 if (!strcasecmp(v->
value,
"sdn"))
19424 confp->pri.pri.nsf = PRI_NSF_SDN;
19425 else if (!strcasecmp(v->
value,
"megacom"))
19426 confp->pri.pri.nsf = PRI_NSF_MEGACOM;
19427 else if (!strcasecmp(v->
value,
"tollfreemegacom"))
19428 confp->pri.pri.nsf = PRI_NSF_TOLL_FREE_MEGACOM;
19429 else if (!strcasecmp(v->
value,
"accunet"))
19430 confp->pri.pri.nsf = PRI_NSF_ACCUNET;
19431 else if (!strcasecmp(v->
value,
"none"))
19432 confp->pri.pri.nsf = PRI_NSF_NONE;
19435 confp->pri.pri.nsf = PRI_NSF_NONE;
19437 }
else if (!strcasecmp(v->
name,
"priindication")) {
19438 if (!strcasecmp(v->
value,
"outofband"))
19440 else if (!strcasecmp(v->
value,
"inband"))
19443 ast_log(
LOG_WARNING,
"'%s' is not a valid pri indication value, should be 'inband' or 'outofband' at line %d.\n",
19445 }
else if (!strcasecmp(v->
name,
"priexclusive")) {
19447 }
else if (!strcasecmp(v->
name,
"internationalprefix")) {
19448 ast_copy_string(confp->pri.pri.internationalprefix, v->
value,
sizeof(confp->pri.pri.internationalprefix));
19449 }
else if (!strcasecmp(v->
name,
"nationalprefix")) {
19450 ast_copy_string(confp->pri.pri.nationalprefix, v->
value,
sizeof(confp->pri.pri.nationalprefix));
19451 }
else if (!strcasecmp(v->
name,
"localprefix")) {
19453 }
else if (!strcasecmp(v->
name,
"privateprefix")) {
19454 ast_copy_string(confp->pri.pri.privateprefix, v->
value,
sizeof(confp->pri.pri.privateprefix));
19455 }
else if (!strcasecmp(v->
name,
"unknownprefix")) {
19456 ast_copy_string(confp->pri.pri.unknownprefix, v->
value,
sizeof(confp->pri.pri.unknownprefix));
19457 }
else if (!strcasecmp(v->
name,
"resetinterval")) {
19458 if (!strcasecmp(v->
value,
"never"))
19459 confp->pri.pri.resetinterval = -1;
19460 else if (atoi(v->
value) >= 60)
19461 confp->pri.pri.resetinterval = atoi(v->
value);
19463 ast_log(
LOG_WARNING,
"'%s' is not a valid reset interval, should be >= 60 seconds or 'never' at line %d.\n",
19465 }
else if (!strcasecmp(v->
name,
"force_restart_unavailable_chans")) {
19466 confp->pri.pri.force_restart_unavailable_chans =
ast_true(v->
value);
19467 }
else if (!strcasecmp(v->
name,
"minunused")) {
19468 confp->pri.pri.minunused = atoi(v->
value);
19469 }
else if (!strcasecmp(v->
name,
"minidle")) {
19470 confp->pri.pri.minidle = atoi(v->
value);
19471 }
else if (!strcasecmp(v->
name,
"idleext")) {
19473 }
else if (!strcasecmp(v->
name,
"idledial")) {
19475 }
else if (!strcasecmp(v->
name,
"overlapdial")) {
19478 }
else if (!strcasecmp(v->
value,
"incoming")) {
19480 }
else if (!strcasecmp(v->
value,
"outgoing")) {
19487#ifdef HAVE_PRI_PROG_W_CAUSE
19488 }
else if (!strcasecmp(v->
name,
"qsigchannelmapping")) {
19489 if (!strcasecmp(v->
value,
"logical")) {
19491 }
else if (!strcasecmp(v->
value,
"physical")) {
19497 }
else if (!strcasecmp(v->
name,
"discardremoteholdretrieval")) {
19498 confp->pri.pri.discardremoteholdretrieval =
ast_true(v->
value);
19499#if defined(HAVE_PRI_SERVICE_MESSAGES)
19500 }
else if (!strcasecmp(v->
name,
"service_message_support")) {
19502 if ((confp->pri.pri.switchtype == PRI_SWITCH_ATT4ESS
19503 || confp->pri.pri.switchtype == PRI_SWITCH_LUCENT5E
19504 || confp->pri.pri.switchtype == PRI_SWITCH_NI2) &&
ast_true(v->
value)) {
19505 confp->pri.pri.enable_service_message_support = 1;
19507 confp->pri.pri.enable_service_message_support = 0;
19510#ifdef HAVE_PRI_INBANDDISCONNECT
19511 }
else if (!strcasecmp(v->
name,
"inbanddisconnect")) {
19514 }
else if (!strcasecmp(v->
name,
"pritimer")) {
19515#ifdef PRI_GETSET_TIMERS
19526 timeridx = pri_timer2idx(timerc);
19528 if (timeridx < 0 || PRI_MAX_TIMERS <= timeridx) {
19530 "'%s' is not a valid ISDN timer at line %d.\n", timerc,
19532 }
else if (!
timer) {
19534 "'%s' is not a valid value for ISDN timer '%s' at line %d.\n",
19537 confp->pri.pri.pritimers[timeridx] =
timer;
19541 "'%s' is not a valid ISDN timer configuration string at line %d.\n",
19545 }
else if (!strcasecmp(v->
name,
"facilityenable")) {
19547#if defined(HAVE_PRI_AOC_EVENTS)
19548 }
else if (!strcasecmp(v->
name,
"aoc_enable")) {
19549 confp->pri.pri.aoc_passthrough_flag = 0;
19550 if (strchr(v->
value,
's') || strchr(v->
value,
'S')) {
19553 if (strchr(v->
value,
'd') || strchr(v->
value,
'D')) {
19556 if (strchr(v->
value,
'e') || strchr(v->
value,
'E')) {
19559 }
else if (!strcasecmp(v->
name,
"aoce_delayhangup")) {
19562#if defined(HAVE_PRI_CALL_HOLD)
19563 }
else if (!strcasecmp(v->
name,
"hold_disconnect_transfer")) {
19564 confp->pri.pri.hold_disconnect_transfer =
ast_true(v->
value);
19566 }
else if (!strcasecmp(v->
name,
"moh_signaling")
19567 || !strcasecmp(v->
name,
"moh_signalling")) {
19568 if (!strcasecmp(v->
value,
"moh")) {
19570 }
else if (!strcasecmp(v->
value,
"notify")) {
19572#if defined(HAVE_PRI_CALL_HOLD)
19573 }
else if (!strcasecmp(v->
value,
"hold")) {
19574 confp->pri.pri.moh_signaling = SIG_PRI_MOH_SIGNALING_HOLD;
19579#if defined(HAVE_PRI_CCSS)
19580 }
else if (!strcasecmp(v->
name,
"cc_ptmp_recall_mode")) {
19581 if (!strcasecmp(v->
value,
"global")) {
19582 confp->pri.pri.cc_ptmp_recall_mode = 0;
19583 }
else if (!strcasecmp(v->
value,
"specific")) {
19584 confp->pri.pri.cc_ptmp_recall_mode = 1;
19586 confp->pri.pri.cc_ptmp_recall_mode = 1;
19588 }
else if (!strcasecmp(v->
name,
"cc_qsig_signaling_link_req")) {
19589 if (!strcasecmp(v->
value,
"release")) {
19590 confp->pri.pri.cc_qsig_signaling_link_req = 0;
19591 }
else if (!strcasecmp(v->
value,
"retain")) {
19592 confp->pri.pri.cc_qsig_signaling_link_req = 1;
19593 }
else if (!strcasecmp(v->
value,
"do_not_care")) {
19594 confp->pri.pri.cc_qsig_signaling_link_req = 2;
19596 confp->pri.pri.cc_qsig_signaling_link_req = 1;
19598 }
else if (!strcasecmp(v->
name,
"cc_qsig_signaling_link_rsp")) {
19599 if (!strcasecmp(v->
value,
"release")) {
19600 confp->pri.pri.cc_qsig_signaling_link_rsp = 0;
19601 }
else if (!strcasecmp(v->
value,
"retain")) {
19602 confp->pri.pri.cc_qsig_signaling_link_rsp = 1;
19604 confp->pri.pri.cc_qsig_signaling_link_rsp = 1;
19607#if defined(HAVE_PRI_CALL_WAITING)
19608 }
else if (!strcasecmp(v->
name,
"max_call_waiting_calls")) {
19609 confp->pri.pri.max_call_waiting_calls = atoi(v->
value);
19610 if (confp->pri.pri.max_call_waiting_calls < 0) {
19612 confp->pri.pri.max_call_waiting_calls = 0;
19614 }
else if (!strcasecmp(v->
name,
"allow_call_waiting_calls")) {
19615 confp->pri.pri.allow_call_waiting_calls =
ast_true(v->
value);
19617#if defined(HAVE_PRI_MWI)
19618 }
else if (!strcasecmp(v->
name,
"mwi_mailboxes")) {
19620 sizeof(confp->pri.pri.mwi_mailboxes));
19621 }
else if (!strcasecmp(v->
name,
"mwi_vm_boxes")) {
19623 sizeof(confp->pri.pri.mwi_vm_boxes));
19624 }
else if (!strcasecmp(v->
name,
"mwi_vm_numbers")) {
19626 sizeof(confp->pri.pri.mwi_vm_numbers));
19628 }
else if (!strcasecmp(v->
name,
"append_msn_to_cid_tag")) {
19629 confp->pri.pri.append_msn_to_user_tag =
ast_true(v->
value);
19630 }
else if (!strcasecmp(v->
name,
"inband_on_setup_ack")) {
19632 }
else if (!strcasecmp(v->
name,
"inband_on_proceeding")) {
19634#if defined(HAVE_PRI_DISPLAY_TEXT)
19635 }
else if (!strcasecmp(v->
name,
"display_send")) {
19636 confp->pri.pri.display_flags_send = dahdi_display_text_option(v->
value);
19637 }
else if (!strcasecmp(v->
name,
"display_receive")) {
19638 confp->pri.pri.display_flags_receive = dahdi_display_text_option(v->
value);
19640#if defined(HAVE_PRI_MCID)
19641 }
else if (!strcasecmp(v->
name,
"mcid_send")) {
19644#if defined(HAVE_PRI_DATETIME_SEND)
19645 }
else if (!strcasecmp(v->
name,
"datetime_send")) {
19646 confp->pri.pri.datetime_send = dahdi_datetime_send_option(v->
value);
19648 }
else if (!strcasecmp(v->
name,
"layer1_presence")) {
19649 if (!strcasecmp(v->
value,
"required")) {
19650 confp->pri.pri.layer1_ignored = 0;
19651 }
else if (!strcasecmp(v->
value,
"ignore")) {
19652 confp->pri.pri.layer1_ignored = 1;
19655 confp->pri.pri.layer1_ignored = 0;
19657#if defined(HAVE_PRI_L2_PERSISTENCE)
19658 }
else if (!strcasecmp(v->
name,
"layer2_persistence")) {
19659 if (!strcasecmp(v->
value,
"keep_up")) {
19660 confp->pri.pri.l2_persistence = PRI_L2_PERSISTENCE_KEEP_UP;
19661 }
else if (!strcasecmp(v->
value,
"leave_down")) {
19662 confp->pri.pri.l2_persistence = PRI_L2_PERSISTENCE_LEAVE_DOWN;
19664 confp->pri.pri.l2_persistence = PRI_L2_PERSISTENCE_DEFAULT;
19667 }
else if (!strcasecmp(v->
name,
"colp_send")) {
19668 if (!strcasecmp(v->
value,
"block")) {
19670 }
else if (!strcasecmp(v->
value,
"connect")) {
19672 }
else if (!strcasecmp(v->
value,
"update")) {
19678#if defined(HAVE_SS7)
19679 }
else if (!strcasecmp(v->
name,
"ss7type")) {
19680 if (!strcasecmp(v->
value,
"itu")) {
19681 cur_ss7type = SS7_ITU;
19682 }
else if (!strcasecmp(v->
value,
"ansi")) {
19683 cur_ss7type = SS7_ANSI;
19687 }
else if (!strcasecmp(v->
name,
"slc")) {
19688 cur_slc = atoi(v->
value);
19689 }
else if (!strcasecmp(v->
name,
"linkset")) {
19690 cur_linkset = atoi(v->
value);
19691 }
else if (!strcasecmp(v->
name,
"pointcode")) {
19692 cur_pointcode = parse_pointcode(v->
value);
19693 }
else if (!strcasecmp(v->
name,
"adjpointcode")) {
19694 cur_adjpointcode = parse_pointcode(v->
value);
19695 }
else if (!strcasecmp(v->
name,
"defaultdpc")) {
19696 cur_defaultdpc = parse_pointcode(v->
value);
19697 }
else if (!strcasecmp(v->
name,
"cicbeginswith")) {
19698 cur_cicbeginswith = atoi(v->
value);
19699 }
else if (!strcasecmp(v->
name,
"networkindicator")) {
19700 if (!strcasecmp(v->
value,
"national")) {
19701 cur_networkindicator = SS7_NI_NAT;
19702 }
else if (!strcasecmp(v->
value,
"national_spare")) {
19703 cur_networkindicator = SS7_NI_NAT_SPARE;
19704 }
else if (!strcasecmp(v->
value,
"international")) {
19705 cur_networkindicator = SS7_NI_INT;
19706 }
else if (!strcasecmp(v->
value,
"international_spare")) {
19707 cur_networkindicator = SS7_NI_INT_SPARE;
19709 cur_networkindicator = -1;
19711 }
else if (!strcasecmp(v->
name,
"ss7_internationalprefix")) {
19712 ast_copy_string(confp->ss7.ss7.internationalprefix, v->
value,
sizeof(confp->ss7.ss7.internationalprefix));
19713 }
else if (!strcasecmp(v->
name,
"ss7_nationalprefix")) {
19714 ast_copy_string(confp->ss7.ss7.nationalprefix, v->
value,
sizeof(confp->ss7.ss7.nationalprefix));
19715 }
else if (!strcasecmp(v->
name,
"ss7_subscriberprefix")) {
19716 ast_copy_string(confp->ss7.ss7.subscriberprefix, v->
value,
sizeof(confp->ss7.ss7.subscriberprefix));
19717 }
else if (!strcasecmp(v->
name,
"ss7_unknownprefix")) {
19718 ast_copy_string(confp->ss7.ss7.unknownprefix, v->
value,
sizeof(confp->ss7.ss7.unknownprefix));
19719 }
else if (!strcasecmp(v->
name,
"ss7_networkroutedprefix")) {
19720 ast_copy_string(confp->ss7.ss7.networkroutedprefix, v->
value,
sizeof(confp->ss7.ss7.networkroutedprefix));
19721 }
else if (!strcasecmp(v->
name,
"ss7_called_nai")) {
19722 if (!strcasecmp(v->
value,
"national")) {
19723 confp->ss7.ss7.called_nai = SS7_NAI_NATIONAL;
19724 }
else if (!strcasecmp(v->
value,
"international")) {
19725 confp->ss7.ss7.called_nai = SS7_NAI_INTERNATIONAL;
19726 }
else if (!strcasecmp(v->
value,
"subscriber")) {
19727 confp->ss7.ss7.called_nai = SS7_NAI_SUBSCRIBER;
19728 }
else if (!strcasecmp(v->
value,
"unknown")) {
19729 confp->ss7.ss7.called_nai = SS7_NAI_UNKNOWN;
19730 }
else if (!strcasecmp(v->
value,
"dynamic")) {
19735 }
else if (!strcasecmp(v->
name,
"ss7_calling_nai")) {
19736 if (!strcasecmp(v->
value,
"national")) {
19737 confp->ss7.ss7.calling_nai = SS7_NAI_NATIONAL;
19738 }
else if (!strcasecmp(v->
value,
"international")) {
19739 confp->ss7.ss7.calling_nai = SS7_NAI_INTERNATIONAL;
19740 }
else if (!strcasecmp(v->
value,
"subscriber")) {
19741 confp->ss7.ss7.calling_nai = SS7_NAI_SUBSCRIBER;
19742 }
else if (!strcasecmp(v->
value,
"unknown")) {
19743 confp->ss7.ss7.calling_nai = SS7_NAI_UNKNOWN;
19744 }
else if (!strcasecmp(v->
value,
"dynamic")) {
19749 }
else if (!strcasecmp(v->
name,
"sigchan")) {
19751 sigchan = atoi(v->
value);
19752 res = linkset_addsigchan(sigchan);
19756 }
else if (!strcasecmp(v->
name,
"ss7_explicitacm")) {
19757 struct dahdi_ss7 *link;
19758 link = ss7_resolve_linkset(cur_linkset);
19766 link->ss7.flags &= ~LINKSET_FLAG_EXPLICITACM;
19768 }
else if (!strcasecmp(v->
name,
"ss7_autoacm")) {
19769 struct dahdi_ss7 *link;
19770 link = ss7_resolve_linkset(cur_linkset);
19778 link->ss7.flags &= ~LINKSET_FLAG_AUTOACM;
19780 }
else if (!strcasecmp(v->
name,
"ss7_initialhwblo")) {
19781 struct dahdi_ss7 *link;
19782 link = ss7_resolve_linkset(cur_linkset);
19790 link->ss7.flags &= ~LINKSET_FLAG_INITIALHWBLO;
19792 }
else if (!strcasecmp(v->
name,
"ss7_use_echocontrol")) {
19793 struct dahdi_ss7 *link;
19794 link = ss7_resolve_linkset(cur_linkset);
19802 link->ss7.flags &= ~LINKSET_FLAG_USEECHOCONTROL;
19804 }
else if (!strcasecmp(v->
name,
"ss7_default_echocontrol")) {
19805 struct dahdi_ss7 *link;
19806 link = ss7_resolve_linkset(cur_linkset);
19814 link->ss7.flags &= ~LINKSET_FLAG_DEFAULTECHOCONTROL;
19816 }
else if (!strncasecmp(v->
name,
"isup_timer.", 11)) {
19817 struct dahdi_ss7 *link;
19818 link = ss7_resolve_linkset(cur_linkset);
19823 if (!link->ss7.ss7) {
19826 }
else if (!ss7_set_isup_timer(link->ss7.ss7, (
char*) strstr(v->
name,
".") + 1, atoi(v->
value))) {
19829 }
else if (!strncasecmp(v->
name,
"mtp3_timer.", 11)) {
19830 struct dahdi_ss7 *link;
19831 link = ss7_resolve_linkset(cur_linkset);
19836 if (!link->ss7.ss7) {
19839 }
else if (!ss7_set_mtp3_timer(link->ss7.ss7, (
char*) strstr(v->
name,
".") + 1, atoi(v->
value))) {
19842 }
else if (!strcasecmp(v->
name,
"inr_if_no_calling")) {
19843 struct dahdi_ss7 *link;
19844 link = ss7_resolve_linkset(cur_linkset);
19849 if (!link->ss7.ss7) {
19852 ss7_set_flags(link->ss7.ss7, SS7_INR_IF_NO_CALLING);
19854 ss7_clear_flags(link->ss7.ss7, SS7_INR_IF_NO_CALLING);
19856 }
else if (!strcasecmp(v->
name,
"non_isdn_access")) {
19857 struct dahdi_ss7 *link;
19858 link = ss7_resolve_linkset(cur_linkset);
19863 if (!link->ss7.ss7) {
19866 ss7_clear_flags(link->ss7.ss7, SS7_ISDN_ACCESS_INDICATOR);
19868 ss7_set_flags(link->ss7.ss7, SS7_ISDN_ACCESS_INDICATOR);
19870 }
else if (!strcasecmp(v->
name,
"sls_shift")) {
19871 struct dahdi_ss7 *link;
19872 int sls_shift = atoi(v->
value);
19874 if (sls_shift < 0 || sls_shift > 7) {
19879 link = ss7_resolve_linkset(cur_linkset);
19884 if (!link->ss7.ss7) {
19887 ss7_set_sls_shift(link->ss7.ss7, sls_shift);
19889 }
else if (!strcasecmp(v->
name,
"cause_location")) {
19890 struct dahdi_ss7 *link;
19891 int cause_location = atoi(v->
value);
19893 if (cause_location < 0 || cause_location > 15) {
19894 ast_log(
LOG_ERROR,
"Invalid cause_location value. Must be between 0 and 15\n");
19897 link = ss7_resolve_linkset(cur_linkset);
19902 if (!link->ss7.ss7) {
19905 ss7_set_cause_location(link->ss7.ss7, cause_location);
19909 }
else if (!strcasecmp(v->
name,
"mfcr2_advanced_protocol_file")) {
19911 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);
19912 }
else if (!strcasecmp(v->
name,
"mfcr2_logdir")) {
19914 }
else if (!strcasecmp(v->
name,
"mfcr2_variant")) {
19915 confp->mfcr2.variant = openr2_proto_get_variant(v->
value);
19916 if (OR2_VAR_UNKNOWN == confp->mfcr2.variant) {
19918 confp->mfcr2.variant = OR2_VAR_ITU;
19920 }
else if (!strcasecmp(v->
name,
"mfcr2_mfback_timeout")) {
19921 confp->mfcr2.mfback_timeout = atoi(v->
value);
19922 if (!confp->mfcr2.mfback_timeout) {
19923 ast_log(
LOG_WARNING,
"MF timeout of 0? hum, I will protect you from your ignorance. Setting default.\n");
19924 confp->mfcr2.mfback_timeout = -1;
19925 }
else if (confp->mfcr2.mfback_timeout > 0 && confp->mfcr2.mfback_timeout < 500) {
19926 ast_log(
LOG_WARNING,
"MF timeout less than 500ms is not recommended, you have been warned!\n");
19928 }
else if (!strcasecmp(v->
name,
"mfcr2_metering_pulse_timeout")) {
19929 confp->mfcr2.metering_pulse_timeout = atoi(v->
value);
19930 if (confp->mfcr2.metering_pulse_timeout > 500) {
19931 ast_log(
LOG_WARNING,
"Metering pulse timeout greater than 500ms is not recommended, you have been warned!\n");
19933#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 2
19934 }
else if (!strcasecmp(v->
name,
"mfcr2_dtmf_detection")) {
19936 }
else if (!strcasecmp(v->
name,
"mfcr2_dtmf_dialing")) {
19938 }
else if (!strcasecmp(v->
name,
"mfcr2_dtmf_time_on")) {
19939 confp->mfcr2.dtmf_time_on = atoi(v->
value);
19940 }
else if (!strcasecmp(v->
name,
"mfcr2_dtmf_time_off")) {
19941 confp->mfcr2.dtmf_time_off = atoi(v->
value);
19943#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 3
19944 }
else if (!strcasecmp(v->
name,
"mfcr2_dtmf_end_timeout")) {
19945 confp->mfcr2.dtmf_end_timeout = atoi(v->
value);
19947 }
else if (!strcasecmp(v->
name,
"mfcr2_get_ani_first")) {
19949 }
else if (!strcasecmp(v->
name,
"mfcr2_double_answer")) {
19951 }
else if (!strcasecmp(v->
name,
"mfcr2_charge_calls")) {
19953 }
else if (!strcasecmp(v->
name,
"mfcr2_accept_on_offer")) {
19955 }
else if (!strcasecmp(v->
name,
"mfcr2_allow_collect_calls")) {
19956 confp->mfcr2.allow_collect_calls =
ast_true(v->
value) ? 1 : 0;
19957 }
else if (!strcasecmp(v->
name,
"mfcr2_forced_release")) {
19959 }
else if (!strcasecmp(v->
name,
"mfcr2_immediate_accept")) {
19960 confp->mfcr2.immediate_accept =
ast_true(v->
value) ? 1 : 0;
19961#if defined(OR2_LIB_INTERFACE) && OR2_LIB_INTERFACE > 1
19962 }
else if (!strcasecmp(v->
name,
"mfcr2_skip_category")) {
19963 confp->mfcr2.skip_category_request =
ast_true(v->
value) ? 1 : 0;
19965 }
else if (!strcasecmp(v->
name,
"mfcr2_call_files")) {
19967 }
else if (!strcasecmp(v->
name,
"mfcr2_max_ani")) {
19968 confp->mfcr2.max_ani = atoi(v->
value);
19972 }
else if (!strcasecmp(v->
name,
"mfcr2_max_dnis")) {
19973 confp->mfcr2.max_dnis = atoi(v->
value);
19977 }
else if (!strcasecmp(v->
name,
"mfcr2_category")) {
19978 confp->mfcr2.category = openr2_proto_get_category(v->
value);
19979 if (OR2_CALLING_PARTY_CATEGORY_UNKNOWN == confp->mfcr2.category) {
19980 confp->mfcr2.category = OR2_CALLING_PARTY_CATEGORY_NATIONAL_SUBSCRIBER;
19981 ast_log(
LOG_WARNING,
"Invalid MFC/R2 caller category '%s' at line %d. Using national subscriber as default.\n",
19984 }
else if (!strcasecmp(v->
name,
"mfcr2_logging")) {
19985 openr2_log_level_t tmplevel;
19992 clevel =
strsep(&logval,
",");
19993 if (-1 == (tmplevel = openr2_log_get_level(clevel))) {
19997 confp->mfcr2.loglevel |= tmplevel;
20000 }
else if (!strcasecmp(v->
name,
"cadence")) {
20002 int element_count,
c[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
20004 struct dahdi_ring_cadence new_cadence;
20005 int cid_location = -1;
20006 int firstcadencepos = 0;
20007 char original_args[80];
20008 int cadence_is_ok = 1;
20012 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]);
20015 if (element_count % 2 == 1) {
20016 ast_log(
LOG_ERROR,
"Must be a silence duration for each ring duration: %s at line %d.\n", original_args, v->
lineno);
20026 for (i = 0; i < element_count; i++) {
20028 ast_log(
LOG_ERROR,
"Ring or silence duration cannot be zero: %s at line %d.\n", original_args, v->
lineno);
20031 }
else if (
c[i] < 0) {
20034 if (cid_location == -1) {
20043 if (firstcadencepos == 0) {
20044 firstcadencepos = i;
20047 ast_log(
LOG_ERROR,
"First cadence position specified twice: %s at line %d.\n", original_args, v->
lineno);
20056 for (i = 0; i < 16; i++) {
20057 new_cadence.ringcadence[i] =
c[i];
20060 if (cadence_is_ok) {
20062 if (element_count < 2) {
20065 if (cid_location == -1) {
20070 cid_location = (cid_location + 1) / 2;
20085 }
else if (!strcasecmp(v->
name,
"ringtimeout")) {
20087 }
else if (!strcasecmp(v->
name,
"prewink")) {
20089 }
else if (!strcasecmp(v->
name,
"preflash")) {
20091 }
else if (!strcasecmp(v->
name,
"wink")) {
20093 }
else if (!strcasecmp(v->
name,
"flash")) {
20095 }
else if (!strcasecmp(v->
name,
"start")) {
20097 }
else if (!strcasecmp(v->
name,
"rxwink")) {
20099 }
else if (!strcasecmp(v->
name,
"rxflash")) {
20101 }
else if (!strcasecmp(v->
name,
"debounce")) {
20103 }
else if (!strcasecmp(v->
name,
"toneduration")) {
20107 struct dahdi_dialparams dps;
20109 ctlfd = open(
"/dev/dahdi/ctl", O_RDWR);
20115 toneduration = atoi(v->
value);
20116 if (toneduration > -1) {
20117 memset(&dps, 0,
sizeof(dps));
20119 dps.dtmf_tonelen = dps.mfv1_tonelen = toneduration;
20120 res = ioctl(ctlfd, DAHDI_SET_DIALPARAMS, &dps);
20128 }
else if (!strcasecmp(v->
name,
"defaultcic")) {
20130 }
else if (!strcasecmp(v->
name,
"defaultozz")) {
20132 }
else if (!strcasecmp(v->
name,
"mwilevel")) {
20134 }
else if (!strcasecmp(v->
name,
"dtmfcidlevel")) {
20136 }
else if (!strcasecmp(v->
name,
"reportalarms")) {
20137 if (!strcasecmp(v->
value,
"all"))
20139 if (!strcasecmp(v->
value,
"none"))
20141 else if (!strcasecmp(v->
value,
"channels"))
20143 else if (!strcasecmp(v->
value,
"spans"))
20155 "Dahdichan '%s' failure ignored: ignore_failed_channels.\n",
20173 for (tmp =
iflist, y=-1; tmp; tmp = tmp->
next) {
20191 if (
conf.chan.cc_params) {
20197 ast_verb(3,
"Automatically generated pseudo channel\n");
20261 static int had_cfg_before = 1;
20264 have_cfg_now = !!cfg;
20267 if (had_cfg_before) {
20278 have_cfg_now = !!cfg;
20280 if (had_cfg_before) {
20299 had_cfg_before = have_cfg_now;
20308 if (!strcasecmp(v->
name,
"trunkgroup")) {
20309 trunkgroup = atoi(v->
value);
20310 if (trunkgroup > 0) {
20311 if ((
c = strchr(v->
value,
','))) {
20313 memset(dchannels, 0,
sizeof(dchannels));
20315 dchannels[i] = atoi(
c + 1);
20316 if (dchannels[i] < 0) {
20317 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);
20320 c = strchr(
c + 1,
',');
20323 if (pri_create_trunkgroup(trunkgroup, dchannels)) {
20324 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);
20326 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");
20328 ast_log(
LOG_WARNING,
"Trunk group %d lacks any valid D-channels at line %d of chan_dahdi.conf\n", trunkgroup, v->
lineno);
20330 ast_log(
LOG_WARNING,
"Trunk group %d lacks a primary D-channel at line %d of chan_dahdi.conf\n", trunkgroup, v->
lineno);
20332 ast_log(
LOG_WARNING,
"Trunk group identifier must be a positive integer at line %d of chan_dahdi.conf\n", v->
lineno);
20333 }
else if (!strcasecmp(v->
name,
"spanmap")) {
20334 spanno = atoi(v->
value);
20336 if ((
c = strchr(v->
value,
','))) {
20337 trunkgroup = atoi(
c + 1);
20338 if (trunkgroup > 0) {
20339 if ((
c = strchr(
c + 1,
',')))
20340 logicalspan = atoi(
c + 1);
20343 if (logicalspan >= 0) {
20344 if (pri_create_spanmap(spanno - 1, trunkgroup, logicalspan)) {
20345 ast_log(
LOG_WARNING,
"Failed to map span %d to trunk group %d (logical span %d)\n", spanno, trunkgroup, logicalspan);
20347 ast_verb(2,
"Mapped span %d to trunk group %d (logical span %d)\n", spanno, trunkgroup, logicalspan);
20349 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);
20383 if (!strcasecmp(cat,
"general") ||
20384 !strcasecmp(cat,
"trunkgroups") ||
20385 !strcasecmp(cat,
"globals") ||
20386 !strcasecmp(cat,
"channels")) {
20413 if (pris[x].pri.
pvts[0] &&
20415 prepare_pri(pris + x);
20420 ast_verb(2,
"Starting D-Channel on span %d\n", x + 1);
20425#if defined(HAVE_SS7)
20429 if (linksets[x].ss7.
ss7) {
20434 ast_verb(2,
"Starting SS7 linkset on span %d\n", x + 1);
20441 struct r2link_entry *cur;
20445 struct dahdi_mfcr2 *r2 = &cur->mfcr2;
20448 ast_log(
LOG_ERROR,
"Unable to start R2 monitor on channel group %d\n", x + 1);
20451 ast_verb(2,
"Starting R2 monitor on channel group %d\n", x + 1);
20505#if defined(HAVE_PRI) || defined(HAVE_SS7)
20526 memset(pris, 0,
sizeof(pris));
20530 pri_set_error(dahdi_pri_error);
20531 pri_set_message(dahdi_pri_message);
20533#ifdef HAVE_PRI_PROG_W_CAUSE
20536#if defined(HAVE_PRI_CCSS)
20544#
if defined(HAVE_PRI_CCSS)
20554#if defined(HAVE_SS7)
20555 memset(linksets, 0,
sizeof(linksets));
20559 ss7_set_error(dahdi_ss7_error);
20560 ss7_set_message(dahdi_ss7_message);
20579#if defined(HAVE_SS7)
20600#if defined(HAVE_PRI)
20614#define END_SILENCE_LEN 400
20615#define HEADER_MS 50
20616#define TRAILER_MS 5
20617#define HEADER_LEN ((HEADER_MS + TRAILER_MS) * 8)
20618#define ASCII_BYTES_PER_CHAR 80
20620 unsigned char *
buf,*mybuf;
20622 struct pollfd fds[1];
20623 int size,res,fd,
len,x;
20645 if ((!p->
tdd) && (!p->
mate)) {
20646#if defined(HAVE_PRI)
20647#if defined(HAVE_PRI_DISPLAY_TEXT)
20672 for (x = 0;
text[x]; x++) {
20700 fds[0].events = POLLOUT | POLLPRI;
20701 fds[0].revents = 0;
20702 res = poll(fds, 1, -1);
20708 if (fds[0].revents & POLLPRI) {
20712 if (!(fds[0].revents & POLLOUT)) {
20716 res = write(fd,
buf, size);
20755 .
requires =
"ccss",
20756 .optional_modules =
"res_smdi",
Common implementation-independent jitterbuffer stuff.
void ast_jb_configure(struct ast_channel *chan, const struct ast_jb_conf *conf)
Configures a jitterbuffer on a channel.
int ast_jb_read_conf(struct ast_jb_conf *conf, const char *varname, const char *value)
Sets jitterbuffer configuration property.
ADSI Support (built upon Caller*ID)
void ast_cli_unregister_multiple(void)
A-Law to Signed linear conversion.
struct sla_ringing_trunk * last
static int copy(char *infile, char *outfile)
Utility function to copy a file.
Persistent data storage (akin to *doze registry)
int ast_db_put(const char *family, const char *key, const char *value)
Store value addressed by family/key.
int ast_db_get(const char *family, const char *key, char *value, int valuelen)
Get key value specified by family/key.
int ast_db_del(const char *family, const char *key)
Delete entry in astdb.
char * strsep(char **str, const char *delims)
char * strcasestr(const char *, const char *)
Asterisk main include file. File version handling, generic pbx functions.
#define ast_alloca(size)
call __builtin_alloca to ensure we get gcc builtin semantics
#define ast_strdup(str)
A wrapper for strdup()
#define ast_strdupa(s)
duplicate a string in memory from the stack
#define ast_asprintf(ret, fmt,...)
A wrapper for asprintf()
#define ast_calloc(num, len)
A wrapper for calloc()
#define ast_malloc(len)
A wrapper for malloc()
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
@ AST_BRIDGE_TRANSFER_SUCCESS
enum ast_transfer_result ast_bridge_transfer_attended(struct ast_channel *to_transferee, struct ast_channel *to_transfer_target)
Attended transfer.
void dahdi_native_unload(void)
int dahdi_native_load(const struct ast_channel_tech *tech)
Native DAHDI bridging support.
CallerID (and other GR30) management and generation Includes code and algorithms from the Zapata libr...
int ast_callerid_callwaiting_full_generate(unsigned char *buf, const char *name, const char *number, const char *ddn, int redirecting, int pres, int qualifier, struct ast_format *codec)
Generate Caller-ID spill but in a format suitable for Call Waiting(tm)'s Caller*ID(tm)
#define CID_UNKNOWN_NUMBER
int ast_gen_cas(unsigned char *outbuf, int sas, int len, struct ast_format *codec)
Generate a CAS (CPE Alert Signal) tone for 'n' samples.
int ast_callerid_full_generate(unsigned char *buf, const char *name, const char *number, const char *ddn, int redirecting, int pres, int qualifier, int format, struct ast_format *codec)
Generate Caller-ID spill from the "callerid" field of asterisk (in e-mail address like format)
int callerid_feed_jp(struct callerid_state *cid, unsigned char *ubuf, int samples, struct ast_format *codec)
Read samples into the state machine.
#define AST_PRES_USER_NUMBER_UNSCREENED
#define AST_PRES_UNAVAILABLE
int ast_callerid_vmwi_generate(unsigned char *buf, int active, int type, struct ast_format *codec, const char *name, const char *number, int flags)
Generate message waiting indicator.
#define AST_PRES_RESTRICTED
void callerid_free(struct callerid_state *cid)
This function frees callerid_state cid.
void callerid_get_with_redirecting(struct callerid_state *cid, char **name, char **number, int *flags, int *redirecting)
Extract info out of callerID state machine. Flags are listed above.
#define MAX_CALLERID_SIZE
const char * ast_redirecting_reason_name(const struct ast_party_redirecting_reason *data)
Convert redirecting reason value to text code.
void ast_shrink_phone_number(char *n)
Shrink a phone number in place to just digits (more accurately it just removes ()'s,...
int ast_callerid_callwaiting_generate(unsigned char *buf, const char *name, const char *number, struct ast_format *codec)
Generate Caller-ID spill but in a format suitable for Call Waiting(tm)'s Caller*ID(tm)
#define CID_PRIVATE_NUMBER
struct callerid_state * callerid_new(int cid_signalling)
Create a callerID state machine.
int callerid_feed(struct callerid_state *cid, unsigned char *ubuf, int samples, struct ast_format *codec)
Read samples into the state machine.
#define CID_MWI_TYPE_MDMF_FULL
void callerid_get_dtmf(char *cidstring, char *number, int *flags)
Get and parse DTMF-based callerid.
#define CID_START_POLARITY
void callerid_get(struct callerid_state *cid, char **number, char **name, int *flags)
Extract info out of callerID state machine. Flags are listed above.
#define CID_START_POLARITY_IN
int ast_callerid_split(const char *src, char *name, int namelen, char *num, int numlen)
#define CID_START_DTMF_NOALERT
Internal Asterisk hangup causes.
#define AST_CAUSE_SWITCH_CONGESTION
#define AST_CAUSE_CONGESTION
#define AST_CAUSE_UNALLOCATED
#define AST_CAUSE_INTERWORKING
#define AST_CAUSE_PROTOCOL_ERROR
#define AST_CAUSE_DESTINATION_OUT_OF_ORDER
#define AST_CAUSE_NO_USER_RESPONSE
#define AST_CAUSE_NORMAL_CIRCUIT_CONGESTION
#define AST_CAUSE_NOTDEFINED
#define AST_CAUSE_CALL_REJECTED
#define AST_CAUSE_NETWORK_OUT_OF_ORDER
#define AST_CAUSE_UNREGISTERED
#define AST_CAUSE_NO_ANSWER
#define AST_CAUSE_NORMAL_CLEARING
#define AST_CAUSE_USER_BUSY
Call Completion Supplementary Services API.
#define ast_cc_config_params_init()
Allocate and initialize an ast_cc_config_params structure.
#define AST_CC_GENERIC_MONITOR_TYPE
int ast_cc_monitor_register(const struct ast_cc_monitor_callbacks *callbacks)
Register a set of monitor callbacks with the core.
void ast_cc_config_params_destroy(struct ast_cc_config_params *params)
Free memory from CCSS configuration params.
void(* ast_cc_callback_fn)(struct ast_channel *chan, struct ast_cc_config_params *cc_params, const char *monitor_type, const char *const device_name, const char *const dialstring, void *private_data)
Callback made from ast_cc_callback for certain channel types.
int ast_cc_agent_register(const struct ast_cc_agent_callbacks *callbacks)
Register a set of agent callbacks with the core.
void ast_cc_copy_config_params(struct ast_cc_config_params *dest, const struct ast_cc_config_params *src)
copy CCSS configuration parameters from one structure to another
void ast_cc_monitor_unregister(const struct ast_cc_monitor_callbacks *callbacks)
Unregister a set of monitor callbacks with the core.
enum ast_cc_monitor_policies ast_get_cc_monitor_policy(struct ast_cc_config_params *config)
Get the cc_monitor_policy.
void ast_cc_agent_unregister(const struct ast_cc_agent_callbacks *callbacks)
Unregister a set of agent callbacks with the core.
int ast_cc_is_config_param(const char *const name)
Is this a CCSS configuration parameter?
int ast_cc_set_param(struct ast_cc_config_params *params, const char *const name, const char *value)
set a CCSS configuration parameter, given its name
static struct ao2_container * pvts
#define CALLPROGRESS_FAX_INCOMING
static int dahdi_create_channel_range(int start, int end)
static int dahdi_confmute(struct dahdi_pvt *p, int muted)
static ast_mutex_t ss_thread_lock
static int calc_energy(const unsigned char *buf, int len, struct ast_format *law)
#define CALLWAITING_SUPPRESS_SAMPLES
static int isourconf(struct dahdi_pvt *p, struct dahdi_subchannel *c)
static void release_doomed_pris(void)
static struct dahdi_pvt * round_robin[64]
static void my_set_new_owner(void *pvt, struct ast_channel *new_owner)
static int restore_gains(struct dahdi_pvt *p)
static void publish_channel_alarm_clear(int channel)
static int conf_del(struct dahdi_pvt *p, struct dahdi_subchannel *c, int index)
static char * dahdi_show_channels(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static void my_set_confirmanswer(void *pvt, int flag)
#define CIDCW_EXPIRE_SAMPLES
static int my_dahdi_write(struct dahdi_pvt *p, unsigned char *buf, int len, int idx, int linear)
static int my_callwait(void *pvt)
static int restore_conference(struct dahdi_pvt *p)
static void publish_span_alarm_clear(int span)
static ast_mutex_t iflock
Protect the interface list (of dahdi_pvt's)
static int dahdi_indicate(struct ast_channel *chan, int condition, const void *data, size_t datalen)
static void notify_message(char *mailbox, int thereornot)
Send MWI state change.
static struct dahdi_pvt * mkintf(int channel, const struct dahdi_chan_conf *conf, int reloading)
static int conf_add(struct dahdi_pvt *p, struct dahdi_subchannel *c, int index, int slavechannel)
static int unalloc_sub(struct dahdi_pvt *p, int x)
static int my_check_confirmanswer(void *pvt)
static const char *const events[]
static int reset_conf(struct dahdi_pvt *p)
static int my_is_dialing(void *pvt, enum analog_sub sub)
static int my_dial_digits(void *pvt, enum analog_sub sub, struct analog_dialoperation *dop)
static struct ast_manager_event_blob * dahdichannel_to_ami(struct stasis_message *msg)
static void my_cancel_cidspill(void *pvt)
static int isslavenative(struct dahdi_pvt *p, struct dahdi_pvt **out)
static int my_set_echocanceller(void *pvt, int enable)
static int dahdi_wink(struct dahdi_pvt *p, int index)
static char mwimonitornotify[PATH_MAX]
static char * alarm2str(int alm)
static void my_hangup_polarityswitch(void *pvt)
static int is_group_or_channel_match(struct dahdi_pvt *p, int span, ast_group_t groupmatch, int *groupmatched, int channelmatch, int *channelmatched)
static int dahdi_ring_phone(struct dahdi_pvt *p)
static char * dahdi_show_status(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
#define CALLWAITING_REPEAT_SAMPLES
static void dahdi_lock_sub_owner(struct dahdi_pvt *pvt, int sub_idx)
#define CALLPROGRESS_FAX_OUTGOING
static int dahdi_call(struct ast_channel *ast, const char *rdest, int timeout)
static int my_stop_cid_detect(void *pvt)
static int my_get_sub_fd(void *pvt, enum analog_sub sub)
static void my_set_needringing(void *pvt, int value)
static char * dahdi_destroy_channels(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static struct ast_jb_conf default_jbconf
static int dahdi_cc_callback(struct ast_channel *inbound, const char *dest, ast_cc_callback_fn callback)
Callback made when dial failed to get a channel out of dahdi_request().
static struct dahdi_pvt * find_channel_from_str(const char *channel)
static int __unload_module(void)
static void dahdi_softhangup_all(void)
static void dahdi_train_ec(struct dahdi_pvt *p)
static int build_channels(struct dahdi_chan_conf *conf, const char *value, int reload, int lineno)
static int dahdi_write(struct ast_channel *ast, struct ast_frame *frame)
static enum analog_event dahdievent_to_analogevent(int event)
static int dahdi_digit_begin(struct ast_channel *ast, char digit)
static void my_unlock_private(void *pvt)
static int dahdichan_helper(struct ast_channel *chan, char *data, const char *value, char *buffer, size_t buflen)
static int dahdi_fixup(struct ast_channel *oldchan, struct ast_channel *newchan)
static void my_set_dialing(void *pvt, int is_dialing)
static void my_handle_dtmf(void *pvt, struct ast_channel *ast, enum analog_sub analog_index, struct ast_frame **dest)
static void publish_dnd_state(int channel, const char *status)
static int my_on_hook(void *pvt)
static int attempt_transfer(struct dahdi_pvt *p)
static int cidrings[NUM_CADENCE_MAX]
cidrings says in which pause to transmit the cid information, where the first pause is 1,...
static void my_set_pulsedial(void *pvt, int flag)
static int dahdi_digit_end(struct ast_channel *ast, char digit, unsigned int duration)
static char * dahdi_set_hwgain(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static int dahdi_wait_event(int fd)
Avoid the silly dahdi_waitevent which ignores a bunch of events.
static void publish_channel_alarm(int channel, const char *alarm_txt)
static int canmatch_featurecode(const char *pickupexten, const char *exten)
static void dahdi_queue_frame(struct dahdi_pvt *p, struct ast_frame *f)
static int set_actual_gain(int fd, float rxgain, float txgain, float rxdrc, float txdrc, int law)
struct analog_callback analog_callbacks
static void dahdi_destroy_channel_range(int start, int end)
static char * dahdi_show_channel(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static int my_unallocate_sub(void *pvt, enum analog_sub analogsub)
static void my_set_alarm(void *pvt, int in_alarm)
static int num_restart_pending
static int my_dsp_set_digitmode(void *pvt, enum analog_dsp_digitmode mode)
static int my_get_event(void *pvt)
static int available(struct dahdi_pvt **pvt, int is_specific_channel)
static int dahdi_devicestate(const char *data)
static int user_has_defined_cadences
static int dahdi_callwait(struct ast_channel *ast)
static void wakeup_sub(struct dahdi_pvt *p, int a)
static void my_set_callwaiting(void *pvt, int callwaiting_enable)
static int distinctiveringaftercid
static int my_is_off_hook(void *pvt)
static int mwi_send_init(struct dahdi_pvt *pvt)
static int dahdi_open(char *fn)
static void publish_dahdichannel(struct ast_channel *chan, ast_group_t group, int span, const char *dahdi_channel)
Sends a DAHDIChannel channel blob used to produce DAHDIChannel AMI messages.
static int my_check_waitingfordt(void *pvt)
static int setup_dahdi_int(int reload, struct dahdi_chan_conf *default_conf, struct dahdi_chan_conf *base_conf, struct dahdi_chan_conf *conf)
static void publish_span_alarm(int span, const char *alarm_txt)
static int dahdichan_write(struct ast_channel *chan, const char *cmd, char *data, const char *value)
static void my_set_outgoing(void *pvt, int is_outgoing)
static int dahdi_fake_event(struct dahdi_pvt *p, int mode)
static void my_set_inthreeway(void *pvt, enum analog_sub sub, int inthreeway)
static void destroy_dahdi_pvt(struct dahdi_pvt *pvt)
static int dahdi_hangup(struct ast_channel *ast)
static void * analog_ss_thread(void *data)
static int dahdi_sendtext(struct ast_channel *c, const char *text)
static void dahdi_ami_channel_event(struct dahdi_pvt *p, struct ast_channel *chan)
static int dahdichan_read_property(struct dahdi_pvt *p, struct dahdi_params *dahdip, const char *property, char *buffer, size_t len)
static void my_swap_subchannels(void *pvt, enum analog_sub a, struct ast_channel *ast_a, enum analog_sub b, struct ast_channel *ast_b)
#define PROC_DAHDI_OPT_NOCHAN
static void parse_busy_pattern(struct ast_variable *v, struct ast_dsp_busy_pattern *busy_cadence)
static int analogsub_to_dahdisub(enum analog_sub analogsub)
static void my_get_and_handle_alarms(void *pvt)
static void my_lock_private(void *pvt)
static int dahdi_answer(struct ast_channel *ast)
static const char tdesc[]
static void fill_txgain(struct dahdi_gains *g, float gain, float drc, int law)
static int dahdi_restart(void)
static int action_transfer(struct mansession *s, const struct message *m)
static int bump_gains(struct dahdi_pvt *p)
static void * do_monitor(void *data)
static int save_conference(struct dahdi_pvt *p)
static char * dahdi_set_dnd(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static void handle_clear_alarms(struct dahdi_pvt *p)
static int dahdi_queryoption(struct ast_channel *chan, int option, void *data, int *datalen)
static char * dahdi_sig2str(int sig)
static int dahdi_set_hook(int fd, int hs)
static int my_stop_callwait(void *pvt)
static struct ast_channel * dahdi_new_callid_clean(struct dahdi_pvt *i, int state, int startpbx, int idx, int law, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, ast_callid callid, int callid_created)
static int check_for_conference(struct dahdi_pvt *p)
static struct dahdi_ring_cadence AS_RP_cadence
static int dahdichan_read(struct ast_channel *chan, const char *cmd, char *data, char *buffer, size_t buflen)
static int my_distinctive_ring(struct ast_channel *chan, void *pvt, int idx, int *ringdata)
void dahdi_ec_enable(struct dahdi_pvt *p)
static int dahdi_setlinear(int dfd, int linear)
static int restart_monitor(void)
static void my_handle_notify_message(struct ast_channel *chan, void *pvt, int cid_flags, int neon_mwievent)
static int my_confmute(void *pvt, int mute)
static void * mwi_thread(void *data)
static int my_send_callerid(void *pvt, int cwcid, struct ast_party_caller *caller)
static int sigtype_to_signalling(int sigtype)
static void my_decrease_ss_count(void)
static char * handle_dahdi_show_cadences(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static int has_voicemail(struct dahdi_pvt *p)
static void dahdi_iflist_extract(struct dahdi_pvt *pvt)
void dahdi_conf_update(struct dahdi_pvt *p)
static int alloc_sub(struct dahdi_pvt *p, int x)
static void my_start_polarityswitch(void *pvt)
static int digit_to_dtmfindex(char digit)
static int setup_dahdi(int reload)
static char * dahdi_set_mwi(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static int action_dahdidndon(struct mansession *s, const struct message *m)
static struct dahdi_pvt * iflist
#define NEED_MFDETECT(p)
Signaling types that need to use MF detection should be placed in this macro.
static int dahdi_setoption(struct ast_channel *chan, int option, void *data, int datalen)
static int set_actual_txgain(int fd, float gain, float drc, int law)
static int dahdi_func_write(struct ast_channel *chan, const char *function, char *data, const char *value)
static int my_wait_event(void *pvt)
static int my_getsigstr(struct ast_channel *chan, char *str, const char *term, int ms)
static struct ast_channel * my_new_analog_ast_channel(void *pvt, int state, int startpbx, enum analog_sub sub, const struct ast_channel *requestor)
static int analog_tone_to_dahditone(enum analog_tone tone)
static struct ast_str * create_channel_name(struct dahdi_pvt *i)
static int my_get_callerid(void *pvt, char *namebuf, char *numbuf, enum analog_event *ev, size_t timeout)
static int set_actual_rxgain(int fd, float gain, float drc, int law)
static int my_start(void *pvt)
static ast_mutex_t restart_lock
static struct ast_frame * dahdi_handle_event(struct ast_channel *ast)
static char defaultcic[64]
static const char config[]
static int action_dahdishowchannels(struct mansession *s, const struct message *m)
void dahdi_dtmf_detect_enable(struct dahdi_pvt *p)
static struct dahdi_pvt * find_next_iface_in_span(struct dahdi_pvt *cur)
static ast_cond_t ss_thread_complete
static void process_echocancel(struct dahdi_chan_conf *confp, const char *data, unsigned int line)
static void dahdi_iflist_insert(struct dahdi_pvt *pvt)
static struct ast_frame * dahdi_exception(struct ast_channel *ast)
static void my_answer_polarityswitch(void *pvt)
static struct ast_channel * dahdi_request(const char *type, struct ast_format_cap *cap, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, const char *data, int *cause)
#define SMDI_MD_WAIT_TIMEOUT
static int my_have_progressdetect(void *pvt)
static char * dahdi_set_swgain(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static int dahdi_func_read(struct ast_channel *chan, const char *function, char *data, char *buf, size_t len)
#define CANPROGRESSDETECT(p)
static char * dahdi_create_channels(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static void fill_rxgain(struct dahdi_gains *g, float gain, float drc, int law)
static int my_train_echocanceller(void *pvt)
static const char * event2str(int event)
#define CALLPROGRESS_PROGRESS
static void dahdi_close_sub(struct dahdi_pvt *chan_pvt, int sub_num)
static void my_set_polarity(void *pvt, int value)
void dahdi_ec_disable(struct dahdi_pvt *p)
static struct ast_frame * __dahdi_exception(struct ast_channel *ast)
static void handle_alarms(struct dahdi_pvt *p, int alms)
static void dahdi_handle_dtmf(struct ast_channel *ast, int idx, struct ast_frame **dest)
static struct dahdi_chan_conf dahdi_chan_conf_default(void)
static struct dahdi_pvt * duplicate_pseudo(struct dahdi_pvt *src)
static void swap_subs(struct dahdi_pvt *p, int a, int b)
static int my_set_linear_mode(void *pvt, enum analog_sub sub, int linear_mode)
static int dahdi_dnd(struct dahdi_pvt *dahdichan, int flag)
enable or disable the chan_dahdi Do-Not-Disturb mode for a DAHDI channel
static struct ast_channel * dahdi_new(struct dahdi_pvt *i, int state, int startpbx, int idx, int law, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, ast_callid callid)
static int drc_sample(int sample, float drc)
static int dahdi_get_event(int fd)
Avoid the silly dahdi_getevent which ignores a bunch of events.
static int ringt_base
Configured ring timeout base.
void dahdi_master_slave_unlink(struct dahdi_pvt *slave, struct dahdi_pvt *master, int needlock)
static ast_mutex_t monlock
Protect the monitoring thread, so only one process can kill or start it, and not when it's doing some...
#define ASCII_BYTES_PER_CHAR
static void my_all_subchannels_hungup(void *pvt)
static int my_ring(void *pvt)
static int my_start_cid_detect(void *pvt, int cid_signalling)
static int parse_buffers_policy(const char *parse, int *num_buffers, int *policy)
static struct dahdi_pvt * ifend
static char * dahdi_show_version(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static int my_complete_conference_update(void *pvt, int needconference)
#define DEFAULT_DIALTONE_DETECT_TIMEOUT
static int mwi_send_process_buffer(struct dahdi_pvt *pvt, int num_read)
static void my_set_cadence(void *pvt, int *cid_rings, struct ast_channel *ast)
static void my_increase_ss_count(void)
#define REPORT_CHANNEL_ALARMS
static int my_play_tone(void *pvt, enum analog_sub sub, enum analog_tone tone)
static int my_wink(void *pvt, enum analog_sub sub)
static struct ast_channel_tech dahdi_tech
static struct ast_jb_conf global_jbconf
#define REQUIRE_FXO_SIG()
static int my_conf_add(void *pvt, enum analog_sub sub)
static int my_dsp_reset_and_flush_digits(void *pvt)
void dahdi_dtmf_detect_disable(struct dahdi_pvt *p)
#define PROC_DAHDI_OPT_NOWARN
#define MIN_MS_SINCE_FLASH
static int my_has_voicemail(void *pvt)
static int load_module(void)
Load the module.
static struct ast_custom_function dahdichan_function
static struct ast_frame * dahdi_read(struct ast_channel *ast)
static const char * my_get_orig_dialstring(void *pvt)
static int action_dahdirestart(struct mansession *s, const struct message *m)
static struct ast_custom_function polarity_function
static int get_alarms(struct dahdi_pvt *p)
static struct dahdi_pvt * determine_starting_point(const char *data, struct dahdi_starting_point *param)
#define gen_pvt_field_callback(type, field)
static int polarity_read(struct ast_channel *chan, const char *cmd, char *data, char *buffer, size_t buflen)
static int send_cwcidspill(struct dahdi_pvt *p)
static int my_conf_del(void *pvt, enum analog_sub sub)
static struct dahdi_ring_cadence cadences[NUM_CADENCE_MAX]
static int action_dahdidndoff(struct mansession *s, const struct message *m)
static int unload_module(void)
static int process_dahdi(struct dahdi_chan_conf *confp, const char *cat, struct ast_variable *v, int reload, int options)
static struct ast_cli_entry dahdi_cli[]
#define DEFAULT_CIDRINGS
Typically, how many rings before we should send Caller*ID.
static int dahdichan_write_property(struct dahdi_pvt *p, struct dahdi_params *dahdip, const char *property, const char *value)
static enum analog_sigtype dahdisig_to_analogsig(int sig)
static void dahdi_close(int fd)
static char defaultozz[64]
void dahdi_master_slave_link(struct dahdi_pvt *slave, struct dahdi_pvt *master)
static int my_off_hook(void *pvt)
const char *const subnames[]
static int my_allocate_sub(void *pvt, enum analog_sub analogsub)
static int usedistinctiveringdetection
static int polarity_write(struct ast_channel *chan, const char *cmd, char *data, const char *value)
static int print_subchannel(struct dahdi_pvt *p, int subchan, char *buffer, size_t len)
static char * dahdi_restart_cmd(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
static struct dahdi_pvt * find_channel(int channel)
static void * my_get_sigpvt_bridged_channel(struct ast_channel *chan)
static int send_callerid(struct dahdi_pvt *p)
static int set_hwgain(int fd, float gain, int tx_direction)
static void my_set_waitingfordt(void *pvt, struct ast_channel *ast)
static void build_alarm_info(char *restrict alarmstr, struct dahdi_spaninfo *spaninfo)
static struct @116 alarms[]
static int my_check_for_conference(void *pvt)
static int mwi_send_process_event(struct dahdi_pvt *pvt, int event)
static int my_flash(void *pvt)
static int ss_thread_count
static const char *const lbostr[]
int _dahdi_get_index(struct ast_channel *ast, struct dahdi_pvt *p, int nullok, const char *fname, unsigned long line)
#define REPORT_SPAN_ALARMS
static void deep_copy_dahdi_chan_conf(struct dahdi_chan_conf *dest, const struct dahdi_chan_conf *src)
static void my_deadlock_avoidance_private(void *pvt)
static struct dahdi_pvt * handle_init_event(struct dahdi_pvt *i, int event)
static void destroy_channel(struct dahdi_pvt *cur, int now)
static void my_set_ringtimeout(void *pvt, int ringt)
static void monitor_pfds_clean(void *arg)
static int action_dahdidialoffhook(struct mansession *s, const struct message *m)
static int dahdi_dial_str(struct dahdi_pvt *pvt, int operation, const char *dial_str)
static pthread_t monitor_thread
This is the thread for the monitor which checks for input on the channels which are not currently in ...
static int action_transferhangup(struct mansession *s, const struct message *m)
static int revert_fax_buffers(struct dahdi_pvt *p, struct ast_channel *ast)
static void destroy_all_channels(void)
static int action_dahdishowstatus(struct mansession *s, const struct message *m)
DAHDI internal API definitions.
static int dahdi_sig_pri_lib_handles(int signaling)
static int dahdi_analog_lib_handles(int signalling, int radio, int oprmode)
#define SIG_PRI_LIB_HANDLE_CASES
#define dahdi_get_index(ast, p, nullok)
static struct ast_timer * timer
General Asterisk PBX channel definitions.
void ast_channel_exten_set(struct ast_channel *chan, const char *value)
int ast_waitfordigit(struct ast_channel *c, int ms)
Waits for a digit.
const char * ast_channel_name(const struct ast_channel *chan)
static int ast_fdisset(struct pollfd *pfds, int fd, int maximum, int *start)
Helper function for migrating select to poll.
void ast_channel_rings_set(struct ast_channel *chan, int value)
void ast_channel_named_pickupgroups_set(struct ast_channel *chan, struct ast_namedgroups *value)
void ast_party_name_init(struct ast_party_name *init)
Initialize the given name structure.
void * ast_channel_tech_pvt(const struct ast_channel *chan)
struct ast_format * ast_channel_rawreadformat(struct ast_channel *chan)
void ast_party_number_init(struct ast_party_number *init)
Initialize the given number structure.
void ast_hangup(struct ast_channel *chan)
Hang up a channel.
#define ast_channel_alloc(needqueue, state, cid_num, cid_name, acctcode, exten, context, assignedids, requestor, amaflag,...)
Create a channel structure.
struct ast_channel * ast_channel_bridge_peer(struct ast_channel *chan)
Get the channel's bridge peer only if the bridge is two-party.
int ast_party_id_presentation(const struct ast_party_id *id)
Determine the overall presentation value for the given party.
#define CHECK_BLOCKING(c)
Set the blocking indication on the channel.
void ast_channel_nativeformats_set(struct ast_channel *chan, struct ast_format_cap *value)
#define ast_channel_lock(chan)
struct ast_party_redirecting * ast_channel_redirecting(struct ast_channel *chan)
void ast_channel_unregister(const struct ast_channel_tech *tech)
Unregister a channel technology.
unsigned short ast_channel_transfercapability(const struct ast_channel *chan)
struct ast_namedgroups * ast_ref_namedgroups(struct ast_namedgroups *groups)
int ast_waitfor(struct ast_channel *chan, int ms)
Wait for input on a channel.
int ast_channel_cc_params_init(struct ast_channel *chan, const struct ast_cc_config_params *base_params)
Set up datastore with CCSS parameters for a channel.
struct ast_flags * ast_channel_flags(struct ast_channel *chan)
unsigned long long ast_group_t
#define ast_channel_ref(c)
Increase channel reference count.
struct ast_party_connected_line * ast_channel_connected(struct ast_channel *chan)
int ast_queue_frame(struct ast_channel *chan, struct ast_frame *f)
Queue one or more frames to a channel's frame queue.
const char * ast_channel_uniqueid(const struct ast_channel *chan)
const char * ast_channel_accountcode(const struct ast_channel *chan)
const char * ast_channel_context(const struct ast_channel *chan)
void ast_party_caller_set(struct ast_party_caller *dest, const struct ast_party_caller *src, const struct ast_set_party_caller *update)
Set the caller information based on another caller source.
struct ast_frame * ast_read(struct ast_channel *chan)
Reads a frame.
#define ast_channel_trylock(chan)
int ast_queue_control_data(struct ast_channel *chan, enum ast_control_frame_type control, const void *data, size_t datalen)
Queue a control frame with payload.
void ast_party_caller_set_init(struct ast_party_caller *init, const struct ast_party_caller *guide)
Initialize the given caller structure using the given guide for a set update operation.
void ast_party_name_free(struct ast_party_name *doomed)
Destroy the party name contents.
void ast_set_callerid(struct ast_channel *chan, const char *cid_num, const char *cid_name, const char *cid_ani)
Set caller ID number, name and ANI and generate AMI event.
int ast_channel_fd(const struct ast_channel *chan, int which)
void ast_channel_internal_fd_set(struct ast_channel *chan, int which, int value)
@ AST_SOFTHANGUP_EXPLICIT
@ AST_SOFTHANGUP_APPUNLOAD
int ast_queue_hangup_with_cause(struct ast_channel *chan, int cause)
Queue a hangup frame with hangupcause set.
void ast_channel_set_rawreadformat(struct ast_channel *chan, struct ast_format *format)
void ast_channel_tech_pvt_set(struct ast_channel *chan, void *value)
void ast_party_caller_free(struct ast_party_caller *doomed)
Destroy the caller party contents.
int ast_active_channels(void)
returns number of active/allocated channels
struct ast_namedgroups * ast_get_namedgroups(const char *s)
Create an ast_namedgroups set with group names from comma separated string.
void ast_channel_callgroup_set(struct ast_channel *chan, ast_group_t value)
int ast_check_hangup(struct ast_channel *chan)
Check to see if a channel is needing hang up.
int ast_channel_hangupcause(const struct ast_channel *chan)
void ast_channel_set_rawwriteformat(struct ast_channel *chan, struct ast_format *format)
struct ast_party_dialed * ast_channel_dialed(struct ast_channel *chan)
void ast_set_hangupsource(struct ast_channel *chan, const char *source, int force)
Set the source of the hangup in this channel and it's bridge.
int ast_softhangup(struct ast_channel *chan, int cause)
Softly hangup up a channel.
void ast_channel_named_callgroups_set(struct ast_channel *chan, struct ast_namedgroups *value)
void ast_channel_hangupcause_hash_set(struct ast_channel *chan, const struct ast_control_pvt_cause_code *cause_code, int datalen)
Sets the HANGUPCAUSE hash and optionally the SIP_CAUSE hash on the given channel.
int ast_queue_unhold(struct ast_channel *chan)
Queue an unhold frame.
int ast_queue_hold(struct ast_channel *chan, const char *musicclass)
Queue a hold frame.
void ast_channel_set_readformat(struct ast_channel *chan, struct ast_format *format)
int ast_channel_register(const struct ast_channel_tech *tech)
Register a channel technology (a new channel driver) Called by a channel module to register the kind ...
void ast_channel_softhangup_internal_flag_add(struct ast_channel *chan, int value)
#define ast_channel_unref(c)
Decrease channel reference count.
void ast_party_number_free(struct ast_party_number *doomed)
Destroy the party number contents.
int ast_channel_get_up_time(struct ast_channel *chan)
Obtain how long it has been since the channel was answered.
void ast_channel_amaflags_set(struct ast_channel *chan, enum ama_flags value)
const char * ast_channel_language(const struct ast_channel *chan)
struct ast_bridge_channel * ast_channel_get_bridge_channel(struct ast_channel *chan)
Get a reference to the channel's bridge pointer.
void ast_channel_context_set(struct ast_channel *chan, const char *value)
void ast_channel_set_fd(struct ast_channel *chan, int which, int fd)
int ast_softhangup_nolock(struct ast_channel *chan, int cause)
Softly hangup up a channel (no channel lock)
enum ama_flags ast_channel_string2amaflag(const char *flag)
Convert a string to a detail record AMA flag.
@ AST_FLAG_DISABLE_DEVSTATE_CACHE
struct ast_pbx * ast_channel_pbx(const struct ast_channel *chan)
struct ast_namedgroups * ast_unref_namedgroups(struct ast_namedgroups *groups)
int ast_channel_setoption(struct ast_channel *channel, int option, void *data, int datalen, int block)
Sets an option on a channel.
struct ast_party_caller * ast_channel_caller(struct ast_channel *chan)
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, int rdlock)
Standard Command Line Interface.
#define AST_CLI_DEFINE(fn, txt,...)
void ast_cli(int fd, const char *fmt,...)
#define ast_cli_register_multiple(e, len)
Register multiple commands.
static struct channel_usage channels
#define container_of(ptr, type, member)
@ AST_DEVSTATE_NOT_CACHABLE
int ast_devstate_changed(enum ast_device_state state, enum ast_devstate_cache cachable, const char *fmt,...)
Tells Asterisk the State for Device is changed.
int ast_devstate_changed_literal(enum ast_device_state state, enum ast_devstate_cache cachable, const char *device)
Tells Asterisk the State for Device is changed.
ast_device_state
Device States.
Convenient Signal Processing routines.
void ast_dsp_free(struct ast_dsp *dsp)
int ast_dsp_get_tcount(struct ast_dsp *dsp)
Get tcount (Threshold counter)
#define DSP_FEATURE_WAITDIALTONE
#define DSP_FEATURE_BUSY_DETECT
#define DSP_TONE_STATE_DIALTONE
void ast_dsp_digitreset(struct ast_dsp *dsp)
Reset DTMF detector.
#define DSP_DIGITMODE_MUTEMAX
void ast_dsp_set_busy_pattern(struct ast_dsp *dsp, const struct ast_dsp_busy_pattern *cadence)
Set expected lengths of the busy tone.
struct ast_frame * ast_dsp_process(struct ast_channel *chan, struct ast_dsp *dsp, struct ast_frame *inf)
Return AST_FRAME_NULL frames when there is silence, AST_FRAME_BUSY on busies, and call progress,...
#define DSP_FEATURE_DIGIT_DETECT
#define DSP_FEATURE_FAX_DETECT
#define DSP_FEATURE_CALL_PROGRESS
int ast_dsp_set_digitmode(struct ast_dsp *dsp, int digitmode)
Set digit mode.
#define DSP_DIGITMODE_MUTECONF
int ast_dsp_get_tstate(struct ast_dsp *dsp)
Get tstate (Tone State)
int ast_dsp_was_muted(struct ast_dsp *dsp)
Returns true if DSP code was muting any fragment of the last processed frame. Muting (squelching) hap...
#define DSP_TONE_STATE_RINGING
void ast_dsp_set_busy_count(struct ast_dsp *dsp, int cadences)
Set number of required cadences for busy.
void ast_dsp_set_features(struct ast_dsp *dsp, int features)
Select feature set.
#define DSP_DIGITMODE_DTMF
struct ast_dsp * ast_dsp_new(void)
Allocates a new dsp, assumes 8khz for internal sample rate.
#define DSP_DIGITMODE_RELAXDTMF
int ast_dsp_set_call_progress_zone(struct ast_dsp *dsp, char *zone)
Set zone for doing progress detection.
Call Parking and Pickup API Includes code and algorithms from the Zapata library.
Generic File Format Support. Should be included by clients of the file handling routines....
int ast_streamfile(struct ast_channel *c, const char *filename, const char *preflang)
Streams a file.
int ast_waitstream(struct ast_channel *c, const char *breakon)
Waits for a stream to stop or digit to be pressed.
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
void astman_send_listack(struct mansession *s, const struct message *m, char *msg, char *listflag)
Send ack in manager transaction to begin a list.
void astman_send_error(struct mansession *s, const struct message *m, char *error)
Send error in manager transaction.
void ast_manager_publish_event(const char *type, int class_type, struct ast_json *obj)
Publish an event to AMI.
void astman_send_list_complete_start(struct mansession *s, const struct message *m, const char *event_name, int count)
Start the list complete event.
void astman_send_ack(struct mansession *s, const struct message *m, char *msg)
Send ack in manager transaction.
const char * astman_get_header(const struct message *m, char *var)
Get header from manager transaction.
void astman_send_list_complete_end(struct mansession *s)
End the list complete event.
void astman_append(struct mansession *s, const char *fmt,...)
int ast_manager_unregister(const char *action)
Unregister a registered manager command.
void ast_channel_stage_snapshot_done(struct ast_channel *chan)
Clear flag to indicate channel snapshot is being staged, and publish snapshot.
void ast_channel_publish_blob(struct ast_channel *chan, struct stasis_message_type *type, struct ast_json *blob)
Publish a channel blob message.
void ast_channel_stage_snapshot(struct ast_channel *chan)
Set flag to indicate channel snapshot is being staged.
#define AST_APP_ARG(name)
Define an application argument.
#define ast_app_separate_args(a, b, c, d)
int ast_app_has_voicemail(const char *mailboxes, const char *folder)
Determine if a given mailbox has any voicemail If folder is NULL, defaults to "INBOX"....
#define AST_DECLARE_APP_ARGS(name, arglist)
Declare a structure to hold an application's arguments.
int ast_safe_system(const char *s)
Safely spawn an OS shell command while closing file descriptors.
#define AST_STANDARD_APP_ARGS(args, parse)
Performs the 'standard' argument separation process for an application.
#define AST_NONSTANDARD_APP_ARGS(args, parse, sep)
Performs the 'nonstandard' argument separation process for an application.
Configuration File Parser.
#define ast_config_load(filename, flags)
Load a config file.
char * ast_category_browse(struct ast_config *config, const char *prev_name)
Browse categories.
struct ast_config * ast_config_new(void)
Create a new base configuration structure.
#define ast_variable_new(name, value, filename)
#define CONFIG_STATUS_FILEUNCHANGED
@ CONFIG_FLAG_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.
struct ast_variable * ast_variable_browse(const struct ast_config *config, const char *category_name)
struct ast_features_pickup_config * ast_get_chan_features_pickup_config(struct ast_channel *chan)
Get the pickup configuration options for a channel.
#define AST_OPTION_RELAXDTMF
#define AST_OPTION_TONE_VERIFY
#define AST_OPTION_RXGAIN
#define AST_OPTION_DIGIT_DETECT
#define AST_OPTION_OPRMODE
#define AST_OPTION_CC_AGENT_TYPE
#define AST_OPTION_FAX_DETECT
#define AST_OPTION_TXGAIN
#define AST_OPTION_ECHOCAN
#define AST_FRIENDLY_OFFSET
Offset into a frame's data buffer.
@ AST_CONTROL_RADIO_UNKEY
@ AST_CONTROL_PVT_CAUSE_CODE
#define AST_OPTION_AUDIO_MODE
struct ast_frame ast_null_frame
void ast_callid_threadstorage_auto_clean(ast_callid callid, int callid_created)
Use in conjunction with ast_callid_threadstorage_auto. Cleans up the references and if the callid was...
#define DEBUG_ATLEAST(level)
#define ast_debug(level,...)
Log a DEBUG message.
int ast_callid_threadstorage_auto(ast_callid *callid)
Checks thread storage for a callid and stores a reference if it exists. If not, then a new one will b...
void ast_log_callid(int level, const char *file, int line, const char *function, ast_callid callid, const char *fmt,...)
Used for sending a log message with a known call_id This is a modified logger function which is funct...
#define ast_verb(level,...)
#define ast_verbose_callid(callid,...)
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
struct ast_json * ast_json_pack(char const *format,...)
Helper for creating complex JSON values.
const char * ast_json_string_get(const struct ast_json *string)
Get the value of a JSON string.
struct ast_json * ast_json_object_get(struct ast_json *object, const char *key)
Get a field from a JSON object.
intmax_t ast_json_integer_get(const struct ast_json *integer)
Get the value from a JSON integer.
AST_JSON_INT_T ast_json_int_t
Primarily used to cast when packing to an "I" type.
#define AST_LIST_HEAD_STATIC(name, type)
Defines a structure to be used to hold a list of specified type, statically initialized.
#define AST_LIST_LAST(head)
Returns the last entry contained in a list.
#define AST_LIST_TRAVERSE(head, var, field)
Loops over (traverses) the entries in a list.
#define AST_LIST_HEAD_INIT_VALUE
Defines initial values for a declaration of AST_LIST_HEAD.
#define AST_LIST_EMPTY(head)
Checks whether the specified list contains any entries.
#define AST_LIST_INSERT_TAIL(head, elm, field)
Appends a list entry to the tail of a list.
#define AST_LIST_ENTRY(type)
Declare a forward link structure inside a list entry.
#define AST_LIST_TRAVERSE_SAFE_END
Closes a safe loop traversal block.
#define AST_LIST_MOVE_CURRENT(newhead, field)
Move the current list entry to another list.
#define AST_LIST_LOCK(head)
Locks a list.
#define AST_LIST_REMOVE(head, elm, field)
Removes a specific entry from a list.
#define AST_LIST_TRAVERSE_SAFE_BEGIN(head, var, field)
Loops safely over (traverses) the entries in a list.
#define AST_LIST_REMOVE_HEAD(head, field)
Removes and returns the head entry from a list.
#define AST_LIST_UNLOCK(head)
Attempts to unlock a list.
Asterisk locking-related definitions:
#define ast_cond_destroy(cond)
#define ast_cond_wait(cond, mutex)
#define AST_PTHREADT_NULL
#define ast_cond_init(cond, attr)
#define ast_mutex_init(pmutex)
#define CHANNEL_DEADLOCK_AVOIDANCE(chan)
#define DEADLOCK_AVOIDANCE(lock)
#define AST_PTHREADT_STOP
#define ast_mutex_unlock(a)
int ast_atomic_fetchadd_int(volatile int *p, int v)
Atomically add v to *p and return the previous value of *p.
#define ast_mutex_trylock(a)
pthread_cond_t ast_cond_t
#define ast_mutex_destroy(a)
#define ast_mutex_lock(a)
#define AST_MUTEX_DEFINE_STATIC(mutex)
#define ast_cond_signal(cond)
The AMI - Asterisk Manager Interface - is a TCP protocol created to manage Asterisk with third-party ...
struct ast_str * ast_manager_build_channel_state_string(const struct ast_channel_snapshot *snapshot)
Generate the AMI message body from a channel snapshot.
#define EVENT_FLAG_SYSTEM
#define ast_manager_register_xml(action, authority, func)
Register a manager callback using XML documentation to describe the manager.
struct ast_manager_event_blob * ast_manager_event_blob_create(int event_flags, const char *manager_event, const char *extra_fields_fmt,...)
Construct a ast_manager_event_blob.
Asterisk module definitions.
#define ast_module_unref(mod)
Release a reference to the module.
#define ast_module_ref(mod)
Hold a reference to the module.
#define AST_MODULE_INFO(keystr, flags_to_set, desc, fields...)
@ AST_MODPRI_CHANNEL_DRIVER
@ AST_MODULE_SUPPORT_CORE
#define ASTERISK_GPL_KEY
The text the key() function should return.
int ast_unregister_application(const char *app)
Unregister an application.
@ AST_MODULE_LOAD_DECLINE
Module has failed to load, may be in an inconsistent state.
#define ast_register_application_xml(app, execute)
Register an application using XML documentation.
int ast_moh_start(struct ast_channel *chan, const char *mclass, const char *interpclass)
Turn on music on hold on a given channel.
void ast_moh_stop(struct ast_channel *chan)
Turn off music on hold on a given channel.
struct stasis_message_type * ast_mwi_state_type(void)
Get the Stasis Message Bus API message type for MWI messages.
void * ast_mwi_unsubscribe(struct ast_mwi_subscriber *sub)
Unsubscribe from the stasis topic and MWI.
struct stasis_cache * ast_mwi_state_cache(void)
Backend cache for ast_mwi_topic_cached().
struct ast_mwi_subscriber * ast_mwi_subscribe_pool(const char *mailbox, stasis_subscription_cb callback, void *data)
Add an MWI state subscriber, and stasis subscription to the mailbox.
#define ast_publish_mwi_state(mailbox, context, new_msgs, old_msgs)
Publish a MWI state update via stasis.
int ast_parking_blind_transfer_park(struct ast_bridge_channel *parker, const char *context, const char *exten, transfer_channel_cb parked_channel_cb, struct transfer_channel_data *parked_channel_data)
Perform a blind transfer to a parking extension.
int ast_parking_is_exten_park(const char *context, const char *exten)
Determine if the context/exten is a "parking" extension.
int ast_parking_provider_registered(void)
Check whether a parking provider is registered.
Asterisk file paths, configured in asterisk.conf.
const char * ast_config_AST_LOG_DIR
Core PBX routines and definitions.
enum ast_pbx_result ast_pbx_run(struct ast_channel *c)
Execute the PBX in the current thread.
const char * pbx_builtin_getvar_helper(struct ast_channel *chan, const char *name)
Return a pointer to the value of the corresponding channel variable.
int ast_exists_extension(struct ast_channel *c, const char *context, const char *exten, int priority, const char *callerid)
Determine whether an extension exists.
int pbx_builtin_setvar_helper(struct ast_channel *chan, const char *name, const char *value)
Add a variable to the channel variable stack, removing the most recently set value for the same name.
#define ast_custom_function_register(acf)
Register a custom function.
int ast_canmatch_extension(struct ast_channel *c, const char *context, const char *exten, int priority, const char *callerid)
Looks for a valid matching extension.
int ast_custom_function_unregister(struct ast_custom_function *acf)
Unregister a custom function.
enum ast_pbx_result ast_pbx_start(struct ast_channel *c)
Create a new thread and start the PBX.
int ast_ignore_pattern(const char *context, const char *pattern)
Checks to see if a number should be ignored.
int ast_matchmore_extension(struct ast_channel *c, const char *context, const char *exten, int priority, const char *callerid)
Looks to see if adding anything to this extension might match something. (exists ^ canmatch)
int ast_async_goto(struct ast_channel *chan, const char *context, const char *exten, int priority)
Set the channel to next execute the specified dialplan location.
int ast_pickup_call(struct ast_channel *chan)
Pickup a call.
static struct stasis_subscription * sub
Statsd channel stats. Exmaple of how to subscribe to Stasis events.
static void to_ami(struct ast_sip_subscription *sub, struct ast_str **buf)
static int debug
Global debug status.
Say numbers and dates (maybe words one day too)
int analog_hangup(struct analog_pvt *p, struct ast_channel *ast)
int analog_available(struct analog_pvt *p)
struct ast_frame * analog_exception(struct analog_pvt *p, struct ast_channel *ast)
int analog_dnd(struct analog_pvt *p, int flag)
int analog_callwaiting_deluxe(struct analog_pvt *p, int option)
int analog_config_complete(struct analog_pvt *p)
void analog_handle_dtmf(struct analog_pvt *p, struct ast_channel *ast, enum analog_sub idx, struct ast_frame **dest)
int analog_call(struct analog_pvt *p, struct ast_channel *ast, const char *rdest, int timeout)
void analog_delete(struct analog_pvt *doomed)
Delete the analog private structure.
struct analog_pvt * analog_new(enum analog_sigtype signallingtype, void *private_data)
int analog_fixup(struct ast_channel *oldchan, struct ast_channel *newchan, void *newp)
enum analog_sigtype sigtype
struct ast_channel * analog_request(struct analog_pvt *p, int *callwait, const struct ast_channel *requestor)
void * analog_handle_init_event(struct analog_pvt *i, int event)
int analog_answer(struct analog_pvt *p, struct ast_channel *ast)
int analog_ss_thread_start(struct analog_pvt *p, struct ast_channel *chan)
Interface header for analog signaling module.
#define ANALOG_INTER_DIGIT_TIMEOUT
Default time (ms) to detect following digits.
#define ANALOG_MATCH_DIGIT_TIMEOUT
Default time (ms) to wait, in case of ambiguous match.
@ ANALOG_EVENT_HOOKCOMPLETE
@ ANALOG_EVENT_PULSE_START
@ ANALOG_EVENT_TX_CED_DETECTED
@ ANALOG_EVENT_NEONMWI_ACTIVE
@ ANALOG_EVENT_EC_DISABLED
@ ANALOG_EVENT_PULSEDIGIT
@ ANALOG_EVENT_RX_CED_DETECTED
@ ANALOG_EVENT_DIALCOMPLETE
@ ANALOG_EVENT_EC_NLP_ENABLED
@ ANALOG_EVENT_NEONMWI_INACTIVE
@ ANALOG_EVENT_EC_NLP_DISABLED
@ ANALOG_EVENT_RINGOFFHOOK
#define ANALOG_FIRST_DIGIT_TIMEOUT
Default time (ms) to detect first digit.
@ ANALOG_CID_START_DTMF_NOALERT
@ ANALOG_CID_START_POLARITY
@ ANALOG_CID_START_POLARITY_IN
Interface header for PRI signaling module.
int sig_pri_is_chan_available(struct sig_pri_chan *pvt)
void sig_pri_unload(void)
#define SIG_PRI_DEBUG_NORMAL
int pri_send_callrerouting_facility_exec(struct sig_pri_chan *p, enum ast_channel_state chanstate, const char *destination, const char *original, const char *reason)
int sig_pri_ami_show_spans(struct mansession *s, const char *show_cmd, struct sig_pri_span *pri, const int *dchannels, const char *action_id)
int sig_pri_cc_agent_status_req(struct ast_cc_agent *agent)
struct sig_pri_callback sig_pri_callbacks
int sig_pri_indicate(struct sig_pri_chan *p, struct ast_channel *chan, int condition, const void *data, size_t datalen)
void sig_pri_extract_called_num_subaddr(struct sig_pri_chan *p, const char *rdest, char *called, size_t called_buff_size)
#define SIG_PRI_NUM_DCHANS
int sig_pri_cc_agent_start_offer_timer(struct ast_cc_agent *agent)
int sig_pri_hangup(struct sig_pri_chan *p, struct ast_channel *ast)
int sig_pri_cc_monitor_unsuspend(struct ast_cc_monitor *monitor)
int sig_pri_available(struct sig_pri_chan **pvt, int is_specific_channel)
int sig_pri_call(struct sig_pri_chan *p, struct ast_channel *ast, const char *rdest, int timeout, int layer1)
#define DAHDI_OVERLAPDIAL_OUTGOING
int sig_pri_is_alarm_ignored(struct sig_pri_span *pri)
int sig_pri_cc_monitor_req_cc(struct ast_cc_monitor *monitor, int *available_timer_id)
int sig_pri_start_pri(struct sig_pri_span *pri)
int sig_pri_cc_monitor_cancel_available_timer(struct ast_cc_monitor *monitor, int *sched_id)
void sig_pri_cli_show_channels(int fd, struct sig_pri_span *pri)
void sig_pri_cc_agent_req_rsp(struct ast_cc_agent *agent, enum ast_cc_agent_response_reason reason)
int sig_pri_cc_monitor_suspend(struct ast_cc_monitor *monitor)
@ SIG_PRI_RESET_IDLE
The channel is not being RESTARTed.
#define DAHDI_OVERLAPDIAL_BOTH
void sig_pri_stop_pri(struct sig_pri_span *pri)
void sig_pri_cc_agent_destructor(struct ast_cc_agent *agent)
void sig_pri_cli_show_spans(int fd, int span, struct sig_pri_span *pri)
void sig_pri_init_pri(struct sig_pri_span *pri)
#define SIG_PRI_AOC_GRANT_D
#define DAHDI_OVERLAPDIAL_NONE
int sig_pri_cc_agent_start_monitoring(struct ast_cc_agent *agent)
#define DAHDI_CHAN_MAPPING_LOGICAL
int sig_pri_cc_agent_init(struct ast_cc_agent *agent, struct sig_pri_chan *pvt_chan)
void sig_pri_chan_alarm_notify(struct sig_pri_chan *p, int noalarm)
int sig_pri_load(const char *cc_type_name)
@ SIG_PRI_CALL_LEVEL_PROCEEDING
@ SIG_PRI_MOH_SIGNALING_MOH
@ SIG_PRI_MOH_SIGNALING_NOTIFY
int sig_pri_cc_agent_callee_available(struct ast_cc_agent *agent)
#define DAHDI_OVERLAPDIAL_INCOMING
struct ast_channel * sig_pri_request(struct sig_pri_chan *p, enum sig_pri_law law, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, int transfercapability)
#define SIG_PRI_AOC_GRANT_E
void sig_pri_fixup(struct ast_channel *oldchan, struct ast_channel *newchan, struct sig_pri_chan *pchan)
void sig_pri_cc_monitor_destructor(void *monitor_pvt)
void sig_pri_dial_complete(struct sig_pri_chan *pvt, struct ast_channel *ast)
struct sig_pri_chan * sig_pri_chan_new(void *pvt_data, struct sig_pri_span *pri, int logicalspan, int channo, int trunkgroup)
void pri_event_noalarm(struct sig_pri_span *pri, int index, int before_start_pri)
void sig_pri_cli_show_span(int fd, int *dchannels, struct sig_pri_span *pri)
void sig_pri_chan_delete(struct sig_pri_chan *doomed)
int sig_pri_answer(struct sig_pri_chan *p, struct ast_channel *ast)
#define SIG_PRI_AOC_GRANT_S
@ SIG_PRI_TONE_CONGESTION
@ SIG_PRI_TONE_DIALRECALL
void pri_event_alarm(struct sig_pri_span *pri, int index, int before_start_pri)
int sig_pri_cc_agent_stop_offer_timer(struct ast_cc_agent *agent)
void sig_pri_cli_show_channels_header(int fd)
void sig_pri_set_alarm(struct sig_pri_chan *p, int in_alarm)
int sig_pri_cc_agent_party_b_free(struct ast_cc_agent *agent)
int sig_pri_cc_monitor_status_rsp(struct ast_cc_monitor *monitor, enum ast_device_state devstate)
#define DAHDI_CHAN_MAPPING_PHYSICAL
int sig_pri_cc_agent_stop_ringing(struct ast_cc_agent *agent)
int sig_pri_digit_begin(struct sig_pri_chan *pvt, struct ast_channel *ast, char digit)
int pri_send_keypad_facility_exec(struct sig_pri_chan *p, const char *digits)
Interface header for SS7 signaling module.
void sig_ss7_cb_call_null(struct ss7 *ss7, struct isup_call *c, int lock)
void sig_ss7_link_noalarm(struct sig_ss7_linkset *linkset, int which)
void sig_ss7_cli_show_channels_header(int fd)
struct ast_channel * sig_ss7_request(struct sig_ss7_chan *p, enum sig_ss7_law law, const struct ast_assigned_ids *assignedids, const struct ast_channel *requestor, int transfercapability)
void sig_ss7_init_linkset(struct sig_ss7_linkset *ss7)
void sig_ss7_link_alarm(struct sig_ss7_linkset *linkset, int which)
#define LINKSET_FLAG_EXPLICITACM
#define LINKSET_FLAG_AUTOACM
int sig_ss7_reset_group(struct sig_ss7_linkset *linkset, int cic, unsigned int dpc, int range)
int sig_ss7_available(struct sig_ss7_chan *p)
void sig_ss7_cb_notinservice(struct ss7 *ss7, int cic, unsigned int dpc)
int sig_ss7_reset_cic(struct sig_ss7_linkset *linkset, int cic, unsigned int dpc)
int sig_ss7_call(struct sig_ss7_chan *p, struct ast_channel *ast, const char *rdest)
void * ss7_linkset(void *data)
int sig_ss7_indicate(struct sig_ss7_chan *p, struct ast_channel *chan, int condition, const void *data, size_t datalen)
#define SS7_BLOCKED_MAINTENANCE
int sig_ss7_group_blocking(struct sig_ss7_linkset *linkset, int do_block, int startcic, int endcic, unsigned char state[], int type)
int sig_ss7_find_cic(struct sig_ss7_linkset *linkset, int cic, unsigned int dpc)
struct sig_ss7_callback sig_ss7_callbacks
void sig_ss7_set_alarm(struct sig_ss7_chan *p, int in_alarm)
@ SIG_SS7_TONE_DIALRECALL
@ SIG_SS7_TONE_CONGESTION
struct sig_ss7_chan * sig_ss7_chan_new(void *pvt_data, struct sig_ss7_linkset *ss7)
void sig_ss7_cli_show_channels(int fd, struct sig_ss7_linkset *linkset)
int sig_ss7_cic_blocking(struct sig_ss7_linkset *linkset, int do_block, int cic)
#define LINKSET_FLAG_DEFAULTECHOCONTROL
#define LINKSET_FLAG_USEECHOCONTROL
void sig_ss7_chan_delete(struct sig_ss7_chan *doomed)
#define LINKSET_FLAG_INITIALHWBLO
int sig_ss7_cb_hangup(struct ss7 *ss7, int cic, unsigned int dpc, int cause, int do_hangup)
int sig_ss7_add_sigchan(struct sig_ss7_linkset *linkset, int which, int ss7type, int transport, int inalarm, int networkindicator, int pointcode, int adjpointcode, int cur_slc)
int sig_ss7_hangup(struct sig_ss7_chan *p, struct ast_channel *ast)
void sig_ss7_fixup(struct ast_channel *oldchan, struct ast_channel *newchan, struct sig_ss7_chan *pchan)
#define SS7_BLOCKED_HARDWARE
#define SIG_SS7_NUM_DCHANS
int sig_ss7_answer(struct sig_ss7_chan *p, struct ast_channel *ast)
int sig_ss7_find_cic_range(struct sig_ss7_linkset *linkset, int startcic, int endcic, unsigned int dpc)
SMDI support for Asterisk.
#define SMDI_MAX_FILENAME_LEN
struct ast_smdi_interface *AST_OPTIONAL_API_NAME() ast_smdi_interface_find(const char *iface_name)
Find an SMDI interface with the specified name.
struct ast_smdi_md_message *AST_OPTIONAL_API_NAME() ast_smdi_md_message_wait(struct ast_smdi_interface *iface, int timeout)
Get the next SMDI message from the queue.
#define STASIS_MESSAGE_TYPE_CLEANUP(name)
Boiler-plate messaging macro for cleaning up message types.
#define STASIS_MESSAGE_TYPE_DEFN_LOCAL(name,...)
Boiler-plate messaging macro for defining local message types.
void stasis_subscription_cb_noop(void *data, struct stasis_subscription *sub, struct stasis_message *message)
Stasis subscription callback function that does nothing.
#define STASIS_MESSAGE_TYPE_INIT(name)
Boiler-plate messaging macro for initializing message types.
void * stasis_message_data(const struct stasis_message *msg)
Get the data contained in a message.
struct stasis_message * stasis_cache_get(struct stasis_cache *cache, struct stasis_message_type *type, const char *id)
Retrieve an item from the cache for the ast_eid_default entity.
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one.
int attribute_pure ast_true(const char *val)
Make sure something is true. Determine if a string containing a boolean value is "true"....
#define S_COR(a, b, c)
returns the equivalent of logic or for strings, with an additional boolean check: second one if not e...
static force_inline int attribute_pure ast_strlen_zero(const char *s)
int attribute_pure ast_false(const char *val)
Make sure something is false. Determine if a string containing a boolean value is "false"....
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
char *attribute_pure ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
char * ast_strip(char *s)
Strip leading/trailing whitespace from a string.
int(*const play_tone)(void *pvt, enum analog_sub sub, enum analog_tone tone)
int(*const start)(void *pvt)
unsigned int immediatering
unsigned int permcallwaiting
unsigned int callwaitingdeluxepending
TRUE if a Call Waiting Deluxe action is currently pending.
unsigned int dahditrcallerid
char lastexten[AST_MAX_EXTENSION]
int polarityonanswerdelay
char cid_num[AST_MAX_EXTENSION]
unsigned int permhidecallerid
unsigned int callwaitingcallerid
unsigned int ani_wink_time
enum analog_sigtype outsigmod
unsigned int usedistinctiveringdetection
unsigned int answeronpolarityswitch
unsigned int threewaycalling
int msgstate
-1 = unknown, 0 = no messages, 1 = new messages available
unsigned int hanguponpolarityswitch
enum analog_dialmode permdialmode
unsigned int callwaitingdeluxe
char call_forward[AST_MAX_EXTENSION]
enum analog_cid_start cid_start
struct ast_channel * owner
unsigned int use_smdi
TRUE if SMDI (Simplified Message Desk Interface) is enabled.
unsigned int call_qualifier
unsigned int lastnumredial
unsigned int ani_info_digits
enum analog_dialmode dialmode
unsigned int cancallforward
struct analog_subchannel subs[3]
unsigned int transfertobusy
char cid_name[AST_MAX_EXTENSION]
unsigned int calledsubscriberheld
char mohsuggest[MAX_MUSICCLASS]
unsigned int use_callerid
struct ast_channel * ss_astchan
struct ast_smdi_interface * smdi_iface
The SMDI interface to get SMDI messages from.
struct ast_party_caller caller
struct ast_channel * owner
Structure to pass both assignedid values to channel drivers.
Structure that contains information regarding a channel in a bridge.
struct ast_channel * chan
const char * type
Type of agent the callbacks belong to.
Callbacks defined by CC monitors.
const char * type
Type of monitor the callbacks belong to.
Blob of data associated with a channel.
struct ast_channel_snapshot * snapshot
Structure to describe a channel "technology", ie a channel driver See for examples:
struct ast_format_cap * capabilities
Main Channel structure associated with a channel.
char exten[AST_MAX_EXTENSION]
struct ast_party_redirecting redirecting
Redirecting/Diversion information.
descriptor for a cli entry.
char chan_name[AST_CHANNEL_NAME]
Data structure associated with a custom dialplan function.
Configuration relating to call pickup.
Structure used to handle boolean flags.
struct ast_format * format
Data structure associated with a single frame of data.
struct ast_frame_subclass subclass
enum ast_frame_type frametype
union ast_frame::@235 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::@217 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.
unsigned int hidecallerid
TRUE if the outgoing caller ID is blocked/hidden.
unsigned int echobreak
XXX BOOLEAN Purpose???
struct dahdi_pvt::@117 echocancel
Echo cancel parameters.
struct dahdi_echocanparam params[DAHDI_MAX_ECHOCANPARAMS]
unsigned int callreturn
TRUE if call return is enabled. (*69, if your dialplan doesn't catch this first)
struct ast_namedgroups * named_pickupgroups
Named pickup groups this belongs to.
struct ast_channel * owner
char rdnis[AST_MAX_EXTENSION]
Redirecting Directory Number Information Service (RDNIS) number.
unsigned int faxhandled
TRUE if a fax tone has already been handled.
unsigned int use_smdi
TRUE if SMDI (Simplified Message Desk Interface) is enabled.
struct callerid_state * cs
int cid_ani2
Automatic Number Identification code from PRI.
struct ast_namedgroups * named_callgroups
Named call groups this belongs to.
int callwaitrings
Number of call waiting rings.
unsigned int mwimonitor_neon
TRUE if the FXO port monitors for neon type MWI indications from the other end.
unsigned int dialednone
TRUE if analog type line dialed no digits in Dial()
unsigned int hwrxgain_enabled
TRUE if hardware Rx gain set by Asterisk.
int law_default
Default call PCM encoding format: DAHDI_LAW_ALAW or DAHDI_LAW_MULAW.
int fake_event
Holding place for event injected from outside normal operation.
char echorest[20]
Filled with 'w'. XXX Purpose??
struct dahdi_pvt * slaves[MAX_SLAVES]
unsigned int ani_timeout
INTEGER, length of ANI failure timeout in ms.
int dtmfcid_holdoff_state
unsigned int lastnumredial
TRUE if last number redial enabled.
unsigned int mwioverride_active
TRUE if a manual MWI override is active for a channel.
unsigned int mwimonitor_fsk
TRUE if the FXO port monitors for fsk type MWI indications from the other end.
int ringt_base
Ring timeout base.
unsigned int destroy
TRUE if the channel is to be destroyed on hangup. (Used by pseudo channels.)
unsigned int restrictcid
TRUE if caller ID is restricted.
char defcontext[AST_MAX_CONTEXT]
Default distinctive ring context.
unsigned int priindication_oob
TRUE if PRI congestion/busy indications are sent out-of-band.
unsigned int ani_info_digits
INTEGER, number of ANI INFO digits on a CAMA trunk. older switches use 1 INFO digit,...
unsigned int busydetect
TRUE if busy detection is enabled. (Listens for the beep-beep busy pattern.)
unsigned int hidecalleridname
TRUE if hide just the name not the number for legacy PBX use.
struct timeval waitingfordt
struct ast_dsp * dsp
Opaque DSP configuration structure.
ast_group_t pickupgroup
Bitmapped pickup groups this belongs to.
unsigned int reoriginate
TRUE if FXS (FXO-signalled) channel should reoriginate for user to make a new call.
int cidpos
Position in the cidspill buffer to send out next.
char context[AST_MAX_CONTEXT]
The configured context for incoming calls.
unsigned int cancallforward
TRUE if support for call forwarding enabled. Dial *72 to enable call forwarding. Dial *73 to disable ...
int radio
Nonzero if the signaling type is sent over a radio.
char parkinglot[AST_MAX_EXTENSION]
unsigned int hardwaredtmf
TRUE if DTMF detection needs to be done by hardware.
char begindigit
DTMF digit in progress. 0 when no digit in progress.
struct ast_cc_config_params * cc_params
unsigned int mate
TRUE if TDD in MATE mode.
float txgain
Software Tx gain set by chan_dahdi.conf.
int firstdigit_timeout
Time (ms) to detect first digit (in an analog phone)
struct dahdi_echocanparams head
unsigned int echocanbridged
TRUE if echo cancellation enabled when bridged.
char finaldial[64]
Second part of SIG_FEATDMF_TA wink operation.
unsigned int transfer
TRUE if call transfer is enabled.
unsigned int transfertobusy
TRUE if allowed to flash-transfer to busy channels.
unsigned int inalarm
TRUE if in an alarm condition.
char cid_name[AST_MAX_EXTENSION]
Caller ID name from an incoming call.
unsigned int inservice
TRUE if channel is out of reset and ready.
char language[MAX_LANGUAGE]
Language configured for calls.
unsigned int digital
TRUE if the transfer capability of the call is digital.
char accountcode[AST_MAX_ACCOUNT_CODE]
unsigned int mwioverride_disposition
Manual MWI disposition (on/off)
struct ast_dsp_busy_pattern busy_cadence
Busy cadence pattern description.
int stripmsd
Number of most significant digits/characters to strip from the dialed number.
unsigned int pulsedial
TRUE if a pulsed digit was detected. (Pulse dial phone detected)
unsigned int calledsubscriberheld
TRUE if Called Subscriber held is enabled. This allows a single incoming call to hold a DAHDI channel...
int muting
TRUE if confrence is muted.
char cid_tag[AST_MAX_EXTENSION]
Caller ID tag from incoming call.
int matchdigit_timeout
Time (ms) to wait, in case of ambiguous match (in an analog phone)
char mohsuggest[MAX_MUSICCLASS]
Suggested music-on-hold class for peer channel to use for calls.
unsigned int use_callerid
TRUE if caller ID is used on this channel.
float rxgain
Software Rx gain set by chan_dahdi.conf.
int polarity
Current line interface polarity. POLARITY_IDLE, POLARITY_REV.
ast_group_t callgroup
Bitmapped call groups this belongs to.
unsigned int dialing
TRUE if in the process of dialing digits or sending something.
unsigned int usefaxbuffers
char callwait_name[AST_MAX_EXTENSION]
Call waiting name.
char mohinterpret[MAX_MUSICCLASS]
The configured music-on-hold class to use for calls.
int dialtone_detect
Number of frames to watch for dialtone in incoming calls.
struct ast_smdi_interface * smdi_iface
The SMDI interface to get SMDI messages from.
int cid_ton
Caller ID Q.931 TON/NPI field values. Set by PRI. Zero otherwise.
struct ast_channel * owner
struct dahdi_confinfo curconf
short buffer[AST_FRIENDLY_OFFSET/2+READ_SIZE]
unsigned int needcongestion
In case you didn't read that giant block of text above the mansession_session struct,...
unsigned char buf[READ_SIZE]
mwisend_states mwisend_current
struct ast_channel * peer
char contextData[AST_MAX_CONTEXT]
void(*const handle_dchan_exception)(struct sig_pri_span *pri, int index)
struct sig_pri_span * pri
enum sig_pri_reset_state resetting
Channel reset/restart state.
unsigned int allocated
TRUE when this channel is allocated.
unsigned int use_callingpres
unsigned int priexclusive
unsigned int hidecallerid
unsigned int priindication_oob
unsigned int hidecalleridname
char context[AST_MAX_CONTEXT]
unsigned int no_b_channel
TRUE if this interface has no B channel. (call hold and call waiting)
unsigned int use_callerid
char mohinterpret[MAX_MUSICCLASS]
struct sig_pri_chan * pvts[SIG_PRI_MAX_CHANNELS]
char idleext[AST_MAX_EXTENSION]
int fds[SIG_PRI_NUM_DCHANS]
int congestion_devstate
Congestion device state of the span.
char idledial[AST_MAX_EXTENSION]
void(*const lock_private)(void *pvt)
unsigned int locallyblocked
Bitmask for the channel being locally blocked.
unsigned int use_callingpres
TRUE if we will use the calling presentation setting from the Asterisk channel for outgoing calls.
struct isup_call * ss7call
Opaque libss7 call control structure.
unsigned int remotelyblocked
Bitmask for the channel being remotely blocked.
unsigned int hidecallerid
TRUE if the outgoing caller ID is blocked/hidden.
struct ast_channel * owner
char context[AST_MAX_CONTEXT]
unsigned int inalarm
TRUE if channel is associated with a link that is down.
unsigned int inservice
TRUE if channel is in service.
int stripmsd
Number of most significant digits/characters to strip from the dialed number.
unsigned int use_callerid
TRUE if caller ID is used on this channel.
char mohinterpret[MAX_MUSICCLASS]
int fds[SIG_SS7_NUM_DCHANS]
enum sig_ss7_linkset::@148 state
struct sig_ss7_chan * pvts[SIG_SS7_MAX_CHANNELS]
struct sla_ringing_trunk * next
TTY/TDD Generation support.
#define TDD_BYTES_PER_CHAR
int tdd_generate(struct tdd_state *tdd, unsigned char *buf, const char *string)
struct tdd_state * tdd_new(void)
void tdd_free(struct tdd_state *tdd)
int ast_tdd_gen_ecdisa(unsigned char *outbuf, int len)
int tdd_feed(struct tdd_state *tdd, unsigned char *ubuf, int samples)
Handy terminal functions for vt* terms.
char * term_color(char *outbuf, const char *inbuf, int fgcolor, int bgcolor, int maxout)
Colorize a specified string by adding terminal color codes.
int ast_remaining_ms(struct timeval start, int max_ms)
Calculate remaining milliseconds given a starting timestamp and upper bound.
int64_t ast_tvdiff_ms(struct timeval end, struct timeval start)
Computes the difference (in milliseconds) between two struct timeval instances.
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
struct timeval ast_tv(ast_time_t sec, ast_suseconds_t usec)
Returns a timeval from sec, usec.
General Asterisk channel transcoding definitions.
#define AST_TRANS_CAP_DIGITAL
u-Law to Signed linear conversion
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
#define ast_pthread_create(a, b, c, d)
#define ast_pthread_create_background(a, b, c, d)
#define ast_clear_flag(p, flag)
long int ast_random(void)
#define ast_pthread_create_detached(a, b, c, d)
#define ast_set_flag(p, flag)