#include "asterisk.h"
#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <signal.h>
#include <sys/file.h>
#include <semaphore.h>
#include "asterisk/channel.h"
#include "asterisk/config.h"
#include "asterisk/logger.h"
#include "asterisk/module.h"
#include "asterisk/pbx.h"
#include "asterisk/options.h"
#include "asterisk/io.h"
#include "asterisk/frame.h"
#include "asterisk/translate.h"
#include "asterisk/cli.h"
#include "asterisk/musiconhold.h"
#include "asterisk/dsp.h"
#include "asterisk/file.h"
#include "asterisk/callerid.h"
#include "asterisk/indications.h"
#include "asterisk/app.h"
#include "asterisk/features.h"
#include "asterisk/term.h"
#include "asterisk/sched.h"
#include "asterisk/stringfields.h"
#include "asterisk/causes.h"
#include "chan_misdn_config.h"
#include "isdn_lib.h"
#include "asterisk/strings.h"
Include dependency graph for chan_misdn.c:

Go to the source code of this file.
Data Structures | |
| struct | allowed_bearers |
| struct | chan_list |
| struct | hold_info |
| struct | misdn_jb |
| struct | robin_list |
| struct | state_struct |
Defines | |
| #define | MISDN_ASTERISK_PVT(ast) 1 |
| #define | MISDN_ASTERISK_TECH_PVT(ast) ast->tech_pvt |
| #define | ORG_AST 1 |
| #define | ORG_MISDN 2 |
Enumerations | |
| enum | misdn_chan_state { MISDN_NOTHING = 0, MISDN_WAITING4DIGS, MISDN_EXTCANTMATCH, MISDN_INCOMING_SETUP, MISDN_DIALING, MISDN_PROGRESS, MISDN_PROCEEDING, MISDN_CALLING, MISDN_CALLING_ACKNOWLEDGE, MISDN_ALERTING, MISDN_BUSY, MISDN_CONNECTED, MISDN_PRECONNECTED, MISDN_DISCONNECTED, MISDN_RELEASED, MISDN_BRIDGED, MISDN_CLEANING, MISDN_HUNGUP_FROM_MISDN, MISDN_HUNGUP_FROM_AST, MISDN_HOLDED, MISDN_HOLD_DISCONNECT } |
Functions | |
| static int | _misdn_tasks_add_variable (int timeout, ast_sched_cb callback, const void *data, int variable) |
| int | add_in_calls (int port) |
| int | add_out_calls (int port) |
| AST_MODULE_INFO (ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT,"Channel driver for mISDN Support (BRI/PRI)",.load=load_module,.unload=unload_module,.reload=reload,) | |
| static const char * | bearer2str (int cap) |
| static enum event_response_e | cb_events (enum event_e event, struct misdn_bchannel *bc, void *user_data) |
| int | chan_misdn_jb_empty (struct misdn_bchannel *bc, char *buf, int len) |
| static void | chan_misdn_log (int level, int port, char *tmpl,...) __attribute__((format(printf |
| static void | cl_dequeue_chan (struct chan_list **list, struct chan_list *chan) |
| static void | cl_queue_chan (struct chan_list **list, struct chan_list *chan) |
| static char * | complete_ch (const char *line, const char *word, int pos, int state) |
| static char * | complete_ch_helper (const char *line, const char *word, int pos, int state, int rpos) |
| static char * | complete_debug_port (const char *line, const char *word, int pos, int state) |
| static char * | complete_show_config (const char *line, const char *word, int pos, int state) |
| static void | config_jitterbuffer (struct chan_list *ch) |
| void | debug_numplan (int port, int numplan, char *type) |
| static int | dialtone_indicate (struct chan_list *cl) |
| static void | do_immediate_setup (struct misdn_bchannel *bc, struct chan_list *ch, struct ast_channel *ast) |
| static void | export_aoc_vars (int originator, struct ast_channel *ast, struct misdn_bchannel *bc) |
| void | export_ch (struct ast_channel *chan, struct misdn_bchannel *bc, struct chan_list *ch) |
| static struct chan_list * | find_chan_by_bc (struct chan_list *list, struct misdn_bchannel *bc) |
| static struct chan_list * | find_chan_by_pid (struct chan_list *list, int pid) |
| static struct chan_list * | find_holded (struct chan_list *list, struct misdn_bchannel *bc) |
| static struct chan_list * | find_holded_l3 (struct chan_list *list, unsigned long l3_id, int w) |
| static void | free_robin_list (void) |
| static void | free_robin_list_r (struct robin_list *r) |
| static struct chan_list * | get_chan_by_ast (struct ast_channel *ast) |
| static struct chan_list * | get_chan_by_ast_name (char *name) |
| static struct robin_list * | get_robin_position (char *group) |
| static void | hangup_chan (struct chan_list *ch) |
| static int | hanguptone_indicate (struct chan_list *cl) |
| void | import_ch (struct ast_channel *chan, struct misdn_bchannel *bc, struct chan_list *ch) |
| static struct chan_list * | init_chan_list (int orig) |
| static int | load_module (void) |
| static int | misdn_answer (struct ast_channel *ast) |
| static enum ast_bridge_result | misdn_bridge (struct ast_channel *c0, struct ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc, int timeoutms) |
| static int | misdn_call (struct ast_channel *ast, char *dest, int timeout) |
| static int | misdn_check_l2l1 (struct ast_channel *chan, void *data) |
| static int | misdn_digit_begin (struct ast_channel *chan, char digit) |
| static int | misdn_digit_end (struct ast_channel *ast, char digit, unsigned int duration) |
| static int | misdn_facility_exec (struct ast_channel *chan, void *data) |
| static int | misdn_fixup (struct ast_channel *oldast, struct ast_channel *ast) |
| static const char * | misdn_get_ch_state (struct chan_list *p) |
| static int | misdn_hangup (struct ast_channel *ast) |
| static int | misdn_indication (struct ast_channel *ast, int cond, const void *data, size_t datalen) |
| void | misdn_jb_destroy (struct misdn_jb *jb) |
| frees the data and destroys the given jitterbuffer struct | |
| int | misdn_jb_empty (struct misdn_jb *jb, char *data, int len) |
| gets len bytes out of the jitterbuffer if available, else only the available data is returned and the return value indicates the number of data. | |
| int | misdn_jb_fill (struct misdn_jb *jb, const char *data, int len) |
| fills the jitterbuffer with len data returns < 0 if there was an error (buffer overrun). | |
| misdn_jb * | misdn_jb_init (int size, int upper_threshold) |
| allocates the jb-structure and initialize the elements | |
| static int | misdn_l1_task (const void *data) |
| static void static struct ast_channel * | misdn_new (struct chan_list *cl, int state, char *exten, char *callerid, int format, int port, int c) |
| static int | misdn_overlap_dial_task (const void *data) |
| static int | misdn_port_block (int fd, int argc, char *argv[]) |
| static int | misdn_port_down (int fd, int argc, char *argv[]) |
| static int | misdn_port_unblock (int fd, int argc, char *argv[]) |
| static int | misdn_port_up (int fd, int argc, char *argv[]) |
| static struct ast_frame * | misdn_read (struct ast_channel *ast) |
| static int | misdn_reload (int fd, int argc, char *argv[]) |
| static struct ast_channel * | misdn_request (const char *type, int format, void *data, int *cause) |
| static int | misdn_restart_pid (int fd, int argc, char *argv[]) |
| static int | misdn_restart_port (int fd, int argc, char *argv[]) |
| static int | misdn_send_cd (int fd, int argc, char *argv[]) |
| static int | misdn_send_digit (int fd, int argc, char *argv[]) |
| static int | misdn_send_display (int fd, int argc, char *argv[]) |
| static int | misdn_send_restart (int fd, int argc, char *argv[]) |
| static int | misdn_send_text (struct ast_channel *chan, const char *text) |
| static int | misdn_set_crypt_debug (int fd, int argc, char *argv[]) |
| static int | misdn_set_debug (int fd, int argc, char *argv[]) |
| static int | misdn_set_opt_exec (struct ast_channel *chan, void *data) |
| static int | misdn_set_tics (int fd, int argc, char *argv[]) |
| static int | misdn_show_cl (int fd, int argc, char *argv[]) |
| static int | misdn_show_cls (int fd, int argc, char *argv[]) |
| static int | misdn_show_config (int fd, int argc, char *argv[]) |
| static int | misdn_show_port (int fd, int argc, char *argv[]) |
| static int | misdn_show_ports_stats (int fd, int argc, char *argv[]) |
| static int | misdn_show_stacks (int fd, int argc, char *argv[]) |
| static int | misdn_tasks_add (int timeout, ast_sched_cb callback, const void *data) |
| static int | misdn_tasks_add_variable (int timeout, ast_sched_cb callback, const void *data) |
| static void | misdn_tasks_destroy (void) |
| static void | misdn_tasks_init (void) |
| static void | misdn_tasks_remove (int task_id) |
| static void * | misdn_tasks_thread_func (void *data) |
| static void | misdn_tasks_wakeup (void) |
| static int | misdn_toggle_echocancel (int fd, int argc, char *argv[]) |
| static void | misdn_transfer_bc (struct chan_list *tmp_ch, struct chan_list *holded_chan) |
| static int | misdn_write (struct ast_channel *ast, struct ast_frame *frame) |
| static int | pbx_start_chan (struct chan_list *ch) |
| static void | print_bc_info (int fd, struct chan_list *help, struct misdn_bchannel *bc) |
| static void | print_bearer (struct misdn_bchannel *bc) |
| static void | print_facility (struct FacParm *fac, struct misdn_bchannel *bc) |
| static struct ast_frame * | process_ast_dsp (struct chan_list *tmp, struct ast_frame *frame) |
| static int | read_config (struct chan_list *ch, int orig) |
| static void | release_chan (struct misdn_bchannel *bc) |
| static int | reload (void) |
| static void | reload_config (void) |
| static void | send_cause2ast (struct ast_channel *ast, struct misdn_bchannel *bc, struct chan_list *ch) |
| static void | send_digit_to_chan (struct chan_list *cl, char digit) |
| static void | show_config_description (int fd, enum misdn_cfg_elements elem) |
| static void | sighandler (int sig) |
| static int | start_bc_tones (struct chan_list *cl) |
| static void | start_pbx (struct chan_list *ch, struct misdn_bchannel *bc, struct ast_channel *chan) |
| static int | stop_bc_tones (struct chan_list *cl) |
| static int | stop_indicate (struct chan_list *cl) |
| static int | unload_module (void) |
| static int | update_config (struct chan_list *ch, int orig) |
| static int | update_ec_config (struct misdn_bchannel *bc) |
| static void | update_name (struct ast_channel *tmp, int port, int c) |
| static void | wait_for_digits (struct chan_list *ch, struct misdn_bchannel *bc, struct ast_channel *chan) |
Variables | |
| static struct allowed_bearers | allowed_bearers_array [] |
| static struct ast_cli_entry | chan_misdn_clis [] |
| chan_list * | cl_te = NULL |
| ast_mutex_t | cl_te_lock |
| chan_list | dummy_cl |
| static int | g_config_initialized = 0 |
| static int | glob_channel = 0 |
| char | global_tracefile [BUFFERSIZE+1] |
| ast_mutex_t | lock |
| static int | max_ports |
| int | MAXTICS = 8 |
| static int * | misdn_debug |
| static int * | misdn_debug_only |
| static int * | misdn_in_calls |
| static int * | misdn_out_calls |
| static int * | misdn_ports |
| static struct sched_context * | misdn_tasks = NULL |
| the main schedule context for stuff like l1 watcher, overlap dial, ... | |
| static pthread_t | misdn_tasks_thread |
| static struct ast_channel_tech | misdn_tech |
| static struct ast_channel_tech | misdn_tech_wo_bridge |
| static const char | misdn_type [] = "mISDN" |
| static int | prefformat = AST_FORMAT_ALAW |
| Only alaw and mulaw is allowed for now. | |
| ast_mutex_t | release_lock |
| static struct robin_list * | robin = NULL |
| static struct state_struct | state_array [] |
| static int | tracing = 0 |
MISDN http://www.misdn.org/
Definition in file chan_misdn.c.
| #define MISDN_ASTERISK_PVT | ( | ast | ) | 1 |
| #define MISDN_ASTERISK_TECH_PVT | ( | ast | ) | ast->tech_pvt |
Definition at line 302 of file chan_misdn.c.
Referenced by cb_events(), do_immediate_setup(), misdn_answer(), misdn_call(), misdn_digit_end(), misdn_facility_exec(), misdn_fixup(), misdn_hangup(), misdn_indication(), misdn_read(), misdn_set_opt_exec(), misdn_write(), and release_chan().
| #define ORG_AST 1 |
Definition at line 146 of file chan_misdn.c.
Referenced by cb_events(), export_aoc_vars(), misdn_call(), misdn_hangup(), misdn_request(), print_bc_info(), read_config(), and release_chan().
| #define ORG_MISDN 2 |
| enum misdn_chan_state |
Definition at line 121 of file chan_misdn.c.
00121 { 00122 MISDN_NOTHING=0, /*!< at beginning */ 00123 MISDN_WAITING4DIGS, /*!< when waiting for infos */ 00124 MISDN_EXTCANTMATCH, /*!< when asterisk couldn't match our ext */ 00125 MISDN_INCOMING_SETUP, /*!< for incoming setups*/ 00126 MISDN_DIALING, /*!< when pbx_start */ 00127 MISDN_PROGRESS, /*!< we got a progress */ 00128 MISDN_PROCEEDING, /*!< we got a progress */ 00129 MISDN_CALLING, /*!< when misdn_call is called */ 00130 MISDN_CALLING_ACKNOWLEDGE, /*!< when we get SETUP_ACK */ 00131 MISDN_ALERTING, /*!< when Alerting */ 00132 MISDN_BUSY, /*!< when BUSY */ 00133 MISDN_CONNECTED, /*!< when connected */ 00134 MISDN_PRECONNECTED, /*!< when connected */ 00135 MISDN_DISCONNECTED, /*!< when connected */ 00136 MISDN_RELEASED, /*!< when connected */ 00137 MISDN_BRIDGED, /*!< when bridged */ 00138 MISDN_CLEANING, /*!< when hangup from * but we were connected before */ 00139 MISDN_HUNGUP_FROM_MISDN, /*!< when DISCONNECT/RELEASE/REL_COMP came from misdn */ 00140 MISDN_HUNGUP_FROM_AST, /*!< when DISCONNECT/RELEASE/REL_COMP came out of misdn_hangup */ 00141 MISDN_HOLDED, /*!< if this chan is holded */ 00142 MISDN_HOLD_DISCONNECT, /*!< if this chan is holded */ 00143 00144 };
| static int _misdn_tasks_add_variable | ( | int | timeout, | |
| ast_sched_cb | callback, | |||
| const void * | data, | |||
| int | variable | |||
| ) | [inline, static] |
Definition at line 604 of file chan_misdn.c.
References ast_sched_add_variable(), misdn_tasks, misdn_tasks_init(), and misdn_tasks_wakeup().
Referenced by misdn_tasks_add(), and misdn_tasks_add_variable().
00605 { 00606 int task_id; 00607 00608 if (!misdn_tasks) { 00609 misdn_tasks_init(); 00610 } 00611 task_id = ast_sched_add_variable(misdn_tasks, timeout, callback, data, variable); 00612 misdn_tasks_wakeup(); 00613 00614 return task_id; 00615 }
| int add_in_calls | ( | int | port | ) |
Definition at line 3723 of file chan_misdn.c.
References ast_log(), LOG_NOTICE, misdn_cfg_get(), MISDN_CFG_MAX_IN, and misdn_in_calls.
Referenced by cb_events().
03724 { 03725 int max_in_calls; 03726 03727 misdn_cfg_get(port, MISDN_CFG_MAX_IN, &max_in_calls, sizeof(max_in_calls)); 03728 misdn_in_calls[port]++; 03729 03730 if (max_in_calls >= 0 && max_in_calls < misdn_in_calls[port]) { 03731 ast_log(LOG_NOTICE, "Marking Incoming Call on port[%d]\n", port); 03732 return misdn_in_calls[port] - max_in_calls; 03733 } 03734 03735 return 0; 03736 }
| int add_out_calls | ( | int | port | ) |
Definition at line 3738 of file chan_misdn.c.
References ast_log(), LOG_NOTICE, misdn_cfg_get(), MISDN_CFG_MAX_OUT, and misdn_out_calls.
Referenced by misdn_call().
03739 { 03740 int max_out_calls; 03741 03742 misdn_cfg_get(port, MISDN_CFG_MAX_OUT, &max_out_calls, sizeof(max_out_calls)); 03743 03744 if (max_out_calls >= 0 && max_out_calls <= misdn_out_calls[port]) { 03745 ast_log(LOG_NOTICE, "Rejecting Outgoing Call on port[%d]\n", port); 03746 return (misdn_out_calls[port] + 1) - max_out_calls; 03747 } 03748 03749 misdn_out_calls[port]++; 03750 03751 return 0; 03752 }
| AST_MODULE_INFO | ( | ASTERISK_GPL_KEY | , | |
| AST_MODFLAG_DEFAULT | , | |||
| "Channel driver for mISDN Support (BRI/PRI)" | , | |||
| . | load = load_module, |
|||
| . | unload = unload_module, |
|||
| . | reload = reload | |||
| ) |
| static const char* bearer2str | ( | int | cap | ) | [static] |
Definition at line 416 of file chan_misdn.c.
References allowed_bearers_array, ARRAY_LEN, and allowed_bearers::display.
Referenced by cb_events(), misdn_lib_log_ies(), print_bc_info(), and print_bearer().
00417 { 00418 unsigned index; 00419 00420 for (index = 0; index < ARRAY_LEN(allowed_bearers_array); ++index) { 00421 if (allowed_bearers_array[index].cap == cap) { 00422 return allowed_bearers_array[index].display; 00423 } 00424 } /* end for */ 00425 00426 return "Unknown Bearer"; 00427 }
| static enum event_response_e cb_events | ( | enum event_e | event, | |
| struct misdn_bchannel * | bc, | |||
| void * | user_data | |||
| ) | [static] |
Definition at line 3778 of file chan_misdn.c.
References add_in_calls(), misdn_bchannel::addr, chan_list::addr, chan_list::allowed_bearers, allowed_bearers_array, misdn_bchannel::AOCD, misdn_bchannel::AOCDtype, ARRAY_LEN, chan_list::ast, ast_bridged_channel(), ast_canmatch_extension(), AST_CAUSE_DESTINATION_OUT_OF_ORDER, AST_CAUSE_INCOMPATIBLE_DESTINATION, AST_CAUSE_NORMAL_CLEARING, AST_CAUSE_UNALLOCATED, AST_CAUSE_USER_BUSY, ast_cdr_update(), AST_CONTROL_ANSWER, AST_CONTROL_BUSY, AST_CONTROL_PROCEEDING, AST_CONTROL_PROGRESS, AST_CONTROL_RINGING, ast_deactivate_generator(), ast_exists_extension(), AST_FORMAT_ALAW, AST_FRAME_DTMF, AST_FRAME_VOICE, ast_log(), ast_moh_start(), ast_moh_stop(), ast_mutex_lock(), ast_mutex_unlock(), ast_pickup_call(), ast_pickup_ext(), AST_PRES_ALLOWED, AST_PRES_NETWORK_NUMBER, AST_PRES_RESTRICTED, AST_PRES_UNAVAILABLE, AST_PRES_USER_NUMBER_FAILED_SCREEN, AST_PRES_USER_NUMBER_PASSED_SCREEN, AST_PRES_USER_NUMBER_UNSCREENED, ast_queue_control(), ast_queue_frame(), ast_setstate(), AST_STATE_DOWN, AST_STATE_RESERVED, AST_STATE_RINGING, ast_strlen_zero(), ast_transfercapability2str(), chan_list::bc, misdn_bchannel::bc_state, bc_state2str(), bearer2str(), misdn_bchannel::bframe, misdn_bchannel::bframe_len, misdn_bchannel::cad, misdn_bchannel::capability, misdn_bchannel::cause, cb_log, chan_misdn_log(), hold_info::channel, misdn_bchannel::channel, misdn_bchannel::chargingUnit, ast_channel::cid, ast_callerid::cid_pres, cl_queue_chan(), cl_te, chan_list::context, misdn_bchannel::cpnnumplan, misdn_bchannel::currency, misdn_bchannel::cw, misdn_bchannel::dad, ast_frame::data, ast_frame::datalen, ast_frame::delivery, do_immediate_setup(), misdn_bchannel::dtmf, misdn_bchannel::dummy, errno, EVENT_ALERTING, EVENT_BCHAN_ACTIVATED, EVENT_BCHAN_DATA, EVENT_BCHAN_ERROR, EVENT_CLEANUP, EVENT_CONNECT, EVENT_CONNECT_ACKNOWLEDGE, EVENT_DISCONNECT, EVENT_DTMF_TONE, EVENT_FACILITY, EVENT_HOLD, EVENT_HOLD_ACKNOWLEDGE, EVENT_HOLD_REJECT, EVENT_INFORMATION, EVENT_NEW_BC, EVENT_NEW_CHANNEL, EVENT_NEW_L3ID, EVENT_PORT_ALARM, EVENT_PROCEEDING, EVENT_PROGRESS, EVENT_RELEASE, EVENT_RELEASE_COMPLETE, EVENT_RESTART, EVENT_RETRIEVE, EVENT_RETRIEVE_ACKNOWLEDGE, EVENT_RETRIEVE_REJECT, EVENT_SETUP, EVENT_SETUP_ACKNOWLEDGE, EVENT_STATUS, EVENT_TIMEOUT, EVENT_TONE_GENERATE, export_aoc_vars(), export_ch(), ast_channel::exten, misdn_bchannel::fac_in, chan_list::far_alerting, find_chan_by_bc(), find_holded(), find_holded_l3(), ast_frame::frametype, ast_generator::generate, ast_channel::generator, ast_channel::generatordata, hangup_chan(), ast_channel::hangupcause, hanguptone_indicate(), chan_list::hold_info, chan_list::ignore_dtmf, INFO_CAPABILITY_DIGITAL_UNRESTRICTED, misdn_bchannel::info_dad, INFO_PI_INBAND_AVAILABLE, misdn_bchannel::infos_pending, init_chan_list(), misdn_bchannel::keypad, misdn_bchannel::l3_id, chan_list::l3id, LOG_ERROR, LOG_NOTICE, LOG_WARNING, ast_frame::mallocd, manager_isdn_get_info(), MISDN_ALERTING, MISDN_ASTERISK_PVT, MISDN_ASTERISK_TECH_PVT, MISDN_CALLING, MISDN_CALLING_ACKNOWLEDGE, misdn_cap_is_speech(), MISDN_CFG_ALARM_BLOCK, MISDN_CFG_ALWAYS_IMMEDIATE, misdn_cfg_get(), MISDN_CFG_HOLD_ALLOWED, MISDN_CFG_IMMEDIATE, misdn_cfg_is_msn_valid(), MISDN_CFG_REJECT_CAUSE, MISDN_CLEANING, MISDN_CONNECTED, MISDN_DIALING, MISDN_DISCONNECTED, MISDN_EXTCANTMATCH, MISDN_GEN_APPEND_DIGITS2EXTEN, misdn_get_ch_state(), MISDN_HOLDED, misdn_inband_avail(), MISDN_INCOMING_SETUP, misdn_lib_is_ptp(), misdn_lib_log_ies(), misdn_lib_port_block(), misdn_lib_send_event(), misdn_new(), MISDN_NOTHING, misdn_overlap_dial_task(), MISDN_PROCEEDING, MISDN_PROGRESS, misdn_tasks_add_variable(), misdn_transfer_bc(), MISDN_WAITING4DIGS, allowed_bearers::name, chan_list::need_busy, misdn_bchannel::need_disconnect, misdn_bchannel::need_more_infos, misdn_bchannel::need_release, misdn_bchannel::need_release_complete, chan_list::noautorespond_on_setup, misdn_bchannel::nt, chan_list::nttimeout, misdn_bchannel::oad, ast_frame::offset, ORG_AST, ORG_MISDN, chan_list::originator, misdn_bchannel::out_cause, chan_list::overlap_dial, chan_list::overlap_dial_task, chan_list::overlap_tv, chan_list::overlap_tv_lock, pbx_builtin_setvar_helper(), pbx_start_chan(), misdn_bchannel::pid, chan_list::pipe, hold_info::port, misdn_bchannel::port, misdn_bchannel::pres, print_bearer(), print_facility(), misdn_bchannel::progress_indicator, read_config(), release_chan(), RESPONSE_IGNORE_SETUP, RESPONSE_IGNORE_SETUP_WITHOUT_CLOSE, RESPONSE_OK, RESPONSE_RELEASE_SETUP, ast_channel::rings, ast_frame::samples, misdn_bchannel::screen, misdn_bchannel::sending_complete, ast_frame::src, start_bc_tones(), start_pbx(), chan_list::state, stop_bc_tones(), stop_indicate(), ast_frame::subclass, t, ast_channel::tech, misdn_bchannel::tone_cnt, ast_channel::transfercapability, ast_channel_tech::type, update_name(), and wait_for_digits().
Referenced by load_module().
03779 { 03780 int msn_valid; 03781 struct chan_list *ch = find_chan_by_bc(cl_te, bc); 03782 03783 if (event != EVENT_BCHAN_DATA && event != EVENT_TONE_GENERATE) { /* Debug Only Non-Bchan */ 03784 int debuglevel = 1; 03785 if ( event == EVENT_CLEANUP && !user_data) 03786 debuglevel = 5; 03787 03788 chan_misdn_log(debuglevel, bc->port, "I IND :%s oad:%s dad:%s pid:%d state:%s\n", manager_isdn_get_info(event), bc->oad, bc->dad, bc->pid, ch ? misdn_get_ch_state(ch) : "none"); 03789 if (debuglevel == 1) { 03790 misdn_lib_log_ies(bc); 03791 chan_misdn_log(4, bc->port, " --> bc_state:%s\n", bc_state2str(bc->bc_state)); 03792 } 03793 } 03794 03795 if (!ch) { 03796 switch(event) { 03797 case EVENT_SETUP: 03798 case EVENT_DISCONNECT: 03799 case EVENT_PORT_ALARM: 03800 case EVENT_RETRIEVE: 03801 case EVENT_NEW_BC: 03802 case EVENT_FACILITY: 03803 break; 03804 case EVENT_RELEASE_COMPLETE: 03805 chan_misdn_log(1, bc->port, " --> no Ch, so we've already released.\n"); 03806 break; 03807 case EVENT_CLEANUP: 03808 case EVENT_TONE_GENERATE: 03809 case EVENT_BCHAN_DATA: 03810 return -1; 03811 default: 03812 chan_misdn_log(1, bc->port, "Chan not existing at the moment bc->l3id:%x bc:%p event:%s port:%d channel:%d\n", bc->l3_id, bc, manager_isdn_get_info(event), bc->port, bc->channel); 03813 return -1; 03814 } 03815 } 03816 03817 if (ch) { 03818 switch (event) { 03819 case EVENT_TONE_GENERATE: 03820 break; 03821 case EVENT_DISCONNECT: 03822 case EVENT_RELEASE: 03823 case EVENT_RELEASE_COMPLETE: 03824 case EVENT_CLEANUP: 03825 case EVENT_TIMEOUT: 03826 if (!ch->ast) 03827 chan_misdn_log(3, bc->port, "ast_hangup already called, so we have no ast ptr anymore in event(%s)\n", manager_isdn_get_info(event)); 03828 break; 03829 default: 03830 if (!ch->ast || !MISDN_ASTERISK_PVT(ch->ast) || !MISDN_ASTERISK_TECH_PVT(ch->ast)) { 03831 if (event != EVENT_BCHAN_DATA) 03832 ast_log(LOG_NOTICE, "No Ast or No private Pointer in Event (%d:%s)\n", event, manager_isdn_get_info(event)); 03833 return -1; 03834 } 03835 } 03836 } 03837 03838 03839 switch (event) { 03840 case EVENT_PORT_ALARM: 03841 { 03842 int boa = 0; 03843 misdn_cfg_get(bc->port, MISDN_CFG_ALARM_BLOCK, &boa, sizeof(int)); 03844 if (boa) { 03845 cb_log(1, bc->port, " --> blocking\n"); 03846 misdn_lib_port_block(bc->port); 03847 } 03848 } 03849 break; 03850 case EVENT_BCHAN_ACTIVATED: 03851 break; 03852 03853 case EVENT_NEW_CHANNEL: 03854 update_name(ch->ast,bc->port,bc->channel); 03855 break; 03856 03857 case EVENT_NEW_L3ID: 03858 ch->l3id=bc->l3_id; 03859 ch->addr=bc->addr; 03860 break; 03861 03862 case EVENT_NEW_BC: 03863 if (!ch) { 03864 ch = find_holded(cl_te,bc); 03865 } 03866 03867 if (!ch) { 03868 ast_log(LOG_WARNING, "NEW_BC without chan_list?\n"); 03869 break; 03870 } 03871 03872 if (bc) 03873 ch->bc = (struct misdn_bchannel *)user_data; 03874 break; 03875 03876 case EVENT_DTMF_TONE: 03877 { 03878 /* sending INFOS as DTMF-Frames :) */ 03879 struct ast_frame fr; 03880 03881 memset(&fr, 0, sizeof(fr)); 03882 fr.frametype = AST_FRAME_DTMF; 03883 fr.subclass = bc->dtmf ; 03884 fr.src = NULL; 03885 fr.data = NULL; 03886 fr.datalen = 0; 03887 fr.samples = 0; 03888 fr.mallocd = 0; 03889 fr.offset = 0; 03890 fr.delivery = ast_tv(0,0); 03891 03892 if (!ch->ignore_dtmf) { 03893 chan_misdn_log(2, bc->port, " --> DTMF:%c\n", bc->dtmf); 03894 ast_queue_frame(ch->ast, &fr); 03895 } else { 03896 chan_misdn_log(2, bc->port, " --> Ignoring DTMF:%c due to bridge flags\n", bc->dtmf); 03897 } 03898 } 03899 break; 03900 case EVENT_STATUS: 03901 break; 03902 03903 case EVENT_INFORMATION: 03904 { 03905 if ( ch->state !=