Asterisk - The Open Source Telephony Project  GIT-master-a24979a
Data Structures | Macros | Enumerations | Functions | Variables
sig_analog.h File Reference

Interface header for analog signaling module. More...

#include "asterisk/channel.h"
#include "asterisk/frame.h"
#include "asterisk/smdi.h"
Include dependency graph for sig_analog.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  analog_callback
 
struct  analog_dialoperation
 
struct  analog_pvt
 
struct  analog_subchannel
 

Macros

#define ANALOG_FIRST_DIGIT_TIMEOUT   16000
 Default time (ms) to detect first digit. More...
 
#define ANALOG_INTER_DIGIT_TIMEOUT   8000
 Default time (ms) to detect following digits. More...
 
#define ANALOG_MATCH_DIGIT_TIMEOUT   3000
 Default time (ms) to wait, in case of ambiguous match. More...
 
#define ANALOG_MAX_CID   300
 
#define ANALOG_SMDI_MD_WAIT_TIMEOUT   1500 /* 1.5 seconds */
 
#define READ_SIZE   160
 
#define RING_PATTERNS   3
 

Enumerations

enum  analog_cid_start { ANALOG_CID_START_POLARITY = 1 , ANALOG_CID_START_POLARITY_IN , ANALOG_CID_START_RING , ANALOG_CID_START_DTMF_NOALERT }
 
enum  analog_dsp_digitmode { ANALOG_DIGITMODE_DTMF = 1 , ANALOG_DIGITMODE_MF }
 
enum  analog_event {
  ANALOG_EVENT_NONE = 0 , ANALOG_EVENT_ONHOOK , ANALOG_EVENT_RINGOFFHOOK , ANALOG_EVENT_WINKFLASH ,
  ANALOG_EVENT_ALARM , ANALOG_EVENT_NOALARM , ANALOG_EVENT_DIALCOMPLETE , ANALOG_EVENT_RINGERON ,
  ANALOG_EVENT_RINGEROFF , ANALOG_EVENT_HOOKCOMPLETE , ANALOG_EVENT_PULSE_START , ANALOG_EVENT_POLARITY ,
  ANALOG_EVENT_RINGBEGIN , ANALOG_EVENT_EC_DISABLED , ANALOG_EVENT_REMOVED , ANALOG_EVENT_NEONMWI_ACTIVE ,
  ANALOG_EVENT_NEONMWI_INACTIVE , ANALOG_EVENT_TX_CED_DETECTED , ANALOG_EVENT_RX_CED_DETECTED , ANALOG_EVENT_EC_NLP_DISABLED ,
  ANALOG_EVENT_EC_NLP_ENABLED , ANALOG_EVENT_ERROR , ANALOG_EVENT_DTMFCID , ANALOG_EVENT_PULSEDIGIT = (1 << 16) ,
  ANALOG_EVENT_DTMFDOWN = (1 << 17) , ANALOG_EVENT_DTMFUP = (1 << 18)
}
 
enum  analog_sigtype {
  ANALOG_SIG_NONE = -1 , ANALOG_SIG_FXOLS = 1 , ANALOG_SIG_FXOKS , ANALOG_SIG_FXOGS ,
  ANALOG_SIG_FXSLS , ANALOG_SIG_FXSKS , ANALOG_SIG_FXSGS , ANALOG_SIG_EMWINK ,
  ANALOG_SIG_EM , ANALOG_SIG_EM_E1 , ANALOG_SIG_FEATD , ANALOG_SIG_FEATDMF ,
  ANALOG_SIG_E911 , ANALOG_SIG_FGC_CAMA , ANALOG_SIG_FGC_CAMAMF , ANALOG_SIG_FEATB ,
  ANALOG_SIG_SFWINK , ANALOG_SIG_SF , ANALOG_SIG_SF_FEATD , ANALOG_SIG_SF_FEATDMF ,
  ANALOG_SIG_FEATDMF_TA , ANALOG_SIG_SF_FEATB
}
 
enum  analog_sub { ANALOG_SUB_REAL = 0 , ANALOG_SUB_CALLWAIT , ANALOG_SUB_THREEWAY }
 
enum  analog_tone {
  ANALOG_TONE_RINGTONE = 0 , ANALOG_TONE_STUTTER , ANALOG_TONE_CONGESTION , ANALOG_TONE_DIALTONE ,
  ANALOG_TONE_DIALRECALL , ANALOG_TONE_INFO
}
 
enum  dialop { ANALOG_DIAL_OP_REPLACE = 2 }
 

Functions

int analog_answer (struct analog_pvt *p, struct ast_channel *ast)
 
int analog_available (struct analog_pvt *p)
 
int analog_call (struct analog_pvt *p, struct ast_channel *ast, const char *rdest, int timeout)
 
const char * analog_cidstart_to_str (enum analog_cid_start cid_start)
 
const char * analog_cidtype_to_str (unsigned int cid_type)
 
int analog_config_complete (struct analog_pvt *p)
 
void analog_delete (struct analog_pvt *doomed)
 Delete the analog private structure. More...
 
int analog_dnd (struct analog_pvt *p, int flag)
 
struct ast_frameanalog_exception (struct analog_pvt *p, struct ast_channel *ast)
 
int analog_fixup (struct ast_channel *oldchan, struct ast_channel *newchan, void *newp)
 
void analog_free (struct analog_pvt *p)
 
void analog_handle_dtmf (struct analog_pvt *p, struct ast_channel *ast, enum analog_sub index, struct ast_frame **dest)
 
void * analog_handle_init_event (struct analog_pvt *i, int event)
 
int analog_hangup (struct analog_pvt *p, struct ast_channel *ast)
 
struct analog_pvtanalog_new (enum analog_sigtype signallingtype, void *private_data)
 
struct ast_channelanalog_request (struct analog_pvt *p, int *callwait, const struct ast_channel *requestor)
 
const char * analog_sigtype_to_str (enum analog_sigtype sigtype)
 
int analog_ss_thread_start (struct analog_pvt *p, struct ast_channel *ast)
 
enum analog_cid_start analog_str_to_cidstart (const char *value)
 
unsigned int analog_str_to_cidtype (const char *name)
 
enum analog_sigtype analog_str_to_sigtype (const char *name)
 

Variables

struct analog_callback analog_callbacks
 

Detailed Description

Interface header for analog signaling module.

Author
Matthew Fredrickson cresl.nosp@m.in@d.nosp@m.igium.nosp@m..com

Definition in file sig_analog.h.

Macro Definition Documentation

◆ ANALOG_FIRST_DIGIT_TIMEOUT

#define ANALOG_FIRST_DIGIT_TIMEOUT   16000

Default time (ms) to detect first digit.

Definition at line 38 of file sig_analog.h.

◆ ANALOG_INTER_DIGIT_TIMEOUT

#define ANALOG_INTER_DIGIT_TIMEOUT   8000

Default time (ms) to detect following digits.

Definition at line 40 of file sig_analog.h.

◆ ANALOG_MATCH_DIGIT_TIMEOUT

#define ANALOG_MATCH_DIGIT_TIMEOUT   3000

Default time (ms) to wait, in case of ambiguous match.

Definition at line 42 of file sig_analog.h.

◆ ANALOG_MAX_CID

#define ANALOG_MAX_CID   300

Definition at line 33 of file sig_analog.h.

◆ ANALOG_SMDI_MD_WAIT_TIMEOUT

#define ANALOG_SMDI_MD_WAIT_TIMEOUT   1500 /* 1.5 seconds */

Definition at line 32 of file sig_analog.h.

◆ READ_SIZE

#define READ_SIZE   160

Definition at line 34 of file sig_analog.h.

◆ RING_PATTERNS

#define RING_PATTERNS   3

Definition at line 35 of file sig_analog.h.

Enumeration Type Documentation

◆ analog_cid_start

Enumerator
ANALOG_CID_START_POLARITY 
ANALOG_CID_START_POLARITY_IN 
ANALOG_CID_START_RING 
ANALOG_CID_START_DTMF_NOALERT 

Definition at line 119 of file sig_analog.h.

119  {
124 };
@ ANALOG_CID_START_RING
Definition: sig_analog.h:122
@ ANALOG_CID_START_DTMF_NOALERT
Definition: sig_analog.h:123
@ ANALOG_CID_START_POLARITY
Definition: sig_analog.h:120
@ ANALOG_CID_START_POLARITY_IN
Definition: sig_analog.h:121

◆ analog_dsp_digitmode

Enumerator
ANALOG_DIGITMODE_DTMF 
ANALOG_DIGITMODE_MF 

Definition at line 114 of file sig_analog.h.

114  {
117 };
@ ANALOG_DIGITMODE_DTMF
Definition: sig_analog.h:115
@ ANALOG_DIGITMODE_MF
Definition: sig_analog.h:116

◆ analog_event

Enumerator
ANALOG_EVENT_NONE 
ANALOG_EVENT_ONHOOK 
ANALOG_EVENT_RINGOFFHOOK 
ANALOG_EVENT_WINKFLASH 
ANALOG_EVENT_ALARM 
ANALOG_EVENT_NOALARM 
ANALOG_EVENT_DIALCOMPLETE 
ANALOG_EVENT_RINGERON 
ANALOG_EVENT_RINGEROFF 
ANALOG_EVENT_HOOKCOMPLETE 
ANALOG_EVENT_PULSE_START 
ANALOG_EVENT_POLARITY 
ANALOG_EVENT_RINGBEGIN 
ANALOG_EVENT_EC_DISABLED 
ANALOG_EVENT_REMOVED 
ANALOG_EVENT_NEONMWI_ACTIVE 
ANALOG_EVENT_NEONMWI_INACTIVE 
ANALOG_EVENT_TX_CED_DETECTED 
ANALOG_EVENT_RX_CED_DETECTED 
ANALOG_EVENT_EC_NLP_DISABLED 
ANALOG_EVENT_EC_NLP_ENABLED 
ANALOG_EVENT_ERROR 
ANALOG_EVENT_DTMFCID 
ANALOG_EVENT_PULSEDIGIT 
ANALOG_EVENT_DTMFDOWN 
ANALOG_EVENT_DTMFUP 

Definition at line 79 of file sig_analog.h.

79  {
101  ANALOG_EVENT_ERROR, /* not a DAHDI event */
102  ANALOG_EVENT_DTMFCID, /* not a DAHDI event */
103  ANALOG_EVENT_PULSEDIGIT = (1 << 16),
104  ANALOG_EVENT_DTMFDOWN = (1 << 17),
105  ANALOG_EVENT_DTMFUP = (1 << 18),
106 };
@ ANALOG_EVENT_NONE
Definition: sig_analog.h:80
@ ANALOG_EVENT_HOOKCOMPLETE
Definition: sig_analog.h:89
@ ANALOG_EVENT_DTMFDOWN
Definition: sig_analog.h:104
@ ANALOG_EVENT_RINGEROFF
Definition: sig_analog.h:88
@ ANALOG_EVENT_PULSE_START
Definition: sig_analog.h:90
@ ANALOG_EVENT_DTMFCID
Definition: sig_analog.h:102
@ ANALOG_EVENT_TX_CED_DETECTED
Definition: sig_analog.h:97
@ ANALOG_EVENT_NEONMWI_ACTIVE
Definition: sig_analog.h:95
@ ANALOG_EVENT_RINGBEGIN
Definition: sig_analog.h:92
@ ANALOG_EVENT_ONHOOK
Definition: sig_analog.h:81
@ ANALOG_EVENT_EC_DISABLED
Definition: sig_analog.h:93
@ ANALOG_EVENT_WINKFLASH
Definition: sig_analog.h:83
@ ANALOG_EVENT_ERROR
Definition: sig_analog.h:101
@ ANALOG_EVENT_PULSEDIGIT
Definition: sig_analog.h:103
@ ANALOG_EVENT_RINGERON
Definition: sig_analog.h:87
@ ANALOG_EVENT_RX_CED_DETECTED
Definition: sig_analog.h:98
@ ANALOG_EVENT_ALARM
Definition: sig_analog.h:84
@ ANALOG_EVENT_DIALCOMPLETE
Definition: sig_analog.h:86
@ ANALOG_EVENT_EC_NLP_ENABLED
Definition: sig_analog.h:100
@ ANALOG_EVENT_POLARITY
Definition: sig_analog.h:91
@ ANALOG_EVENT_NEONMWI_INACTIVE
Definition: sig_analog.h:96
@ ANALOG_EVENT_DTMFUP
Definition: sig_analog.h:105
@ ANALOG_EVENT_EC_NLP_DISABLED
Definition: sig_analog.h:99
@ ANALOG_EVENT_RINGOFFHOOK
Definition: sig_analog.h:82
@ ANALOG_EVENT_REMOVED
Definition: sig_analog.h:94
@ ANALOG_EVENT_NOALARM
Definition: sig_analog.h:85

◆ analog_sigtype

Enumerator
ANALOG_SIG_NONE 
ANALOG_SIG_FXOLS 
ANALOG_SIG_FXOKS 
ANALOG_SIG_FXOGS 
ANALOG_SIG_FXSLS 
ANALOG_SIG_FXSKS 
ANALOG_SIG_FXSGS 
ANALOG_SIG_EMWINK 
ANALOG_SIG_EM 
ANALOG_SIG_EM_E1 
ANALOG_SIG_FEATD 
ANALOG_SIG_FEATDMF 
ANALOG_SIG_E911 
ANALOG_SIG_FGC_CAMA 
ANALOG_SIG_FGC_CAMAMF 
ANALOG_SIG_FEATB 
ANALOG_SIG_SFWINK 
ANALOG_SIG_SF 
ANALOG_SIG_SF_FEATD 
ANALOG_SIG_SF_FEATDMF 
ANALOG_SIG_FEATDMF_TA 
ANALOG_SIG_SF_FEATB 

Definition at line 45 of file sig_analog.h.

45  {
46  ANALOG_SIG_NONE = -1,
47  ANALOG_SIG_FXOLS = 1,
68 };
@ ANALOG_SIG_FEATD
Definition: sig_analog.h:56
@ ANALOG_SIG_FEATDMF_TA
Definition: sig_analog.h:66
@ ANALOG_SIG_FGC_CAMAMF
Definition: sig_analog.h:60
@ ANALOG_SIG_FXOLS
Definition: sig_analog.h:47
@ ANALOG_SIG_FEATDMF
Definition: sig_analog.h:57
@ ANALOG_SIG_EM_E1
Definition: sig_analog.h:55
@ ANALOG_SIG_EMWINK
Definition: sig_analog.h:53
@ ANALOG_SIG_FXOKS
Definition: sig_analog.h:48
@ ANALOG_SIG_SF
Definition: sig_analog.h:63
@ ANALOG_SIG_FGC_CAMA
Definition: sig_analog.h:59
@ ANALOG_SIG_FXSLS
Definition: sig_analog.h:50
@ ANALOG_SIG_EM
Definition: sig_analog.h:54
@ ANALOG_SIG_FXOGS
Definition: sig_analog.h:49
@ ANALOG_SIG_SF_FEATB
Definition: sig_analog.h:67
@ ANALOG_SIG_NONE
Definition: sig_analog.h:46
@ ANALOG_SIG_FXSGS
Definition: sig_analog.h:52
@ ANALOG_SIG_SF_FEATDMF
Definition: sig_analog.h:65
@ ANALOG_SIG_SFWINK
Definition: sig_analog.h:62
@ ANALOG_SIG_E911
Definition: sig_analog.h:58
@ ANALOG_SIG_FEATB
Definition: sig_analog.h:61
@ ANALOG_SIG_SF_FEATD
Definition: sig_analog.h:64
@ ANALOG_SIG_FXSKS
Definition: sig_analog.h:51

◆ analog_sub

enum analog_sub
Enumerator
ANALOG_SUB_REAL 

Active call

ANALOG_SUB_CALLWAIT 

Call-Waiting call on hold

ANALOG_SUB_THREEWAY 

Three-way call

Definition at line 108 of file sig_analog.h.

108  {
109  ANALOG_SUB_REAL = 0, /*!< Active call */
110  ANALOG_SUB_CALLWAIT, /*!< Call-Waiting call on hold */
111  ANALOG_SUB_THREEWAY, /*!< Three-way call */
112 };
@ ANALOG_SUB_THREEWAY
Definition: sig_analog.h:111
@ ANALOG_SUB_REAL
Definition: sig_analog.h:109
@ ANALOG_SUB_CALLWAIT
Definition: sig_analog.h:110

◆ analog_tone

Enumerator
ANALOG_TONE_RINGTONE 
ANALOG_TONE_STUTTER 
ANALOG_TONE_CONGESTION 
ANALOG_TONE_DIALTONE 
ANALOG_TONE_DIALRECALL 
ANALOG_TONE_INFO 

Definition at line 70 of file sig_analog.h.

70  {
77 };
@ ANALOG_TONE_CONGESTION
Definition: sig_analog.h:73
@ ANALOG_TONE_INFO
Definition: sig_analog.h:76
@ ANALOG_TONE_DIALTONE
Definition: sig_analog.h:74
@ ANALOG_TONE_DIALRECALL
Definition: sig_analog.h:75
@ ANALOG_TONE_STUTTER
Definition: sig_analog.h:72
@ ANALOG_TONE_RINGTONE
Definition: sig_analog.h:71

◆ dialop

enum dialop
Enumerator
ANALOG_DIAL_OP_REPLACE 

Definition at line 126 of file sig_analog.h.

126  {
128 };
@ ANALOG_DIAL_OP_REPLACE
Definition: sig_analog.h:127

Function Documentation

◆ analog_answer()

int analog_answer ( struct analog_pvt p,
struct ast_channel ast 
)

Definition at line 1463 of file sig_analog.c.

1464 {
1465  int res = 0;
1466  int idx;
1467  int oldstate = ast_channel_state(ast);
1468 
1469  ast_debug(1, "%s %d\n", __FUNCTION__, p->channel);
1470  ast_setstate(ast, AST_STATE_UP);
1471  idx = analog_get_index(ast, p, 1);
1472  if (idx < 0) {
1473  idx = ANALOG_SUB_REAL;
1474  }
1475  switch (p->sig) {
1476  case ANALOG_SIG_FXSLS:
1477  case ANALOG_SIG_FXSGS:
1478  case ANALOG_SIG_FXSKS:
1479  analog_set_ringtimeout(p, 0);
1480  /* Fall through */
1481  case ANALOG_SIG_EM:
1482  case ANALOG_SIG_EM_E1:
1483  case ANALOG_SIG_EMWINK:
1484  case ANALOG_SIG_FEATD:
1485  case ANALOG_SIG_FEATDMF:
1486  case ANALOG_SIG_FEATDMF_TA:
1487  case ANALOG_SIG_E911:
1488  case ANALOG_SIG_FGC_CAMA:
1489  case ANALOG_SIG_FGC_CAMAMF:
1490  case ANALOG_SIG_FEATB:
1491  case ANALOG_SIG_SF:
1492  case ANALOG_SIG_SFWINK:
1493  case ANALOG_SIG_SF_FEATD:
1494  case ANALOG_SIG_SF_FEATDMF:
1495  case ANALOG_SIG_SF_FEATB:
1496  case ANALOG_SIG_FXOLS:
1497  case ANALOG_SIG_FXOGS:
1498  case ANALOG_SIG_FXOKS:
1499  /* Pick up the line */
1500  ast_debug(1, "Took %s off hook\n", ast_channel_name(ast));
1501  if (p->hanguponpolarityswitch) {
1502  gettimeofday(&p->polaritydelaytv, NULL);
1503  }
1504  res = analog_off_hook(p);
1505  analog_play_tone(p, idx, -1);
1506  analog_set_dialing(p, 0);
1507  if ((idx == ANALOG_SUB_REAL) && p->subs[ANALOG_SUB_THREEWAY].inthreeway) {
1508  if (oldstate == AST_STATE_RINGING) {
1509  ast_debug(1, "Finally swapping real and threeway\n");
1513  }
1514  }
1515 
1516  switch (p->sig) {
1517  case ANALOG_SIG_FXSLS:
1518  case ANALOG_SIG_FXSKS:
1519  case ANALOG_SIG_FXSGS:
1522  break;
1523  case ANALOG_SIG_FXOLS:
1524  case ANALOG_SIG_FXOKS:
1525  case ANALOG_SIG_FXOGS:
1527  break;
1528  default:
1529  break;
1530  }
1531  break;
1532  default:
1533  ast_log(LOG_WARNING, "Don't know how to answer signalling %d (channel %d)\n", p->sig, p->channel);
1534  res = -1;
1535  break;
1536  }
1537  ast_setstate(ast, AST_STATE_UP);
1538  return res;
1539 }
#define ast_log
Definition: astobj2.c:42
const char * ast_channel_name(const struct ast_channel *chan)
ast_channel_state
ast_channel states
Definition: channelstate.h:35
@ AST_STATE_RINGING
Definition: channelstate.h:41
@ AST_STATE_UP
Definition: channelstate.h:42
int ast_setstate(struct ast_channel *chan, enum ast_channel_state)
Change the state of a channel.
Definition: channel.c:7469
#define ast_debug(level,...)
Log a DEBUG message.
#define LOG_WARNING
#define NULL
Definition: resample.c:96
static void analog_set_new_owner(struct analog_pvt *p, struct ast_channel *new_owner)
Definition: sig_analog.c:446
static int analog_train_echocanceller(struct analog_pvt *p)
Definition: sig_analog.c:481
static void analog_set_dialing(struct analog_pvt *p, int is_dialing)
Definition: sig_analog.c:890
static void analog_set_ringtimeout(struct analog_pvt *p, int ringt)
Definition: sig_analog.c:906
#define analog_get_index(ast, p, nullok)
Definition: sig_analog.c:407
static void analog_answer_polarityswitch(struct analog_pvt *p)
Definition: sig_analog.c:645
static int analog_off_hook(struct analog_pvt *p)
Definition: sig_analog.c:615
static int analog_play_tone(struct analog_pvt *p, enum analog_sub sub, enum analog_tone tone)
Definition: sig_analog.c:438
static int analog_set_echocanceller(struct analog_pvt *p, int enable)
Definition: sig_analog.c:473
static void analog_swap_subs(struct analog_pvt *p, enum analog_sub a, enum analog_sub b)
Definition: sig_analog.c:348
struct timeval polaritydelaytv
Definition: sig_analog.h:346
unsigned int hanguponpolarityswitch
Definition: sig_analog.h:289
enum analog_sigtype sig
Definition: sig_analog.h:266
struct analog_subchannel subs[3]
Definition: sig_analog.h:272
unsigned int inthreeway
Definition: sig_analog.h:259
struct ast_channel * owner
Definition: sig_analog.h:257

References analog_answer_polarityswitch(), analog_get_index, analog_off_hook(), analog_play_tone(), analog_set_dialing(), analog_set_echocanceller(), analog_set_new_owner(), analog_set_ringtimeout(), ANALOG_SIG_E911, ANALOG_SIG_EM, ANALOG_SIG_EM_E1, ANALOG_SIG_EMWINK, ANALOG_SIG_FEATB, ANALOG_SIG_FEATD, ANALOG_SIG_FEATDMF, ANALOG_SIG_FEATDMF_TA, ANALOG_SIG_FGC_CAMA, ANALOG_SIG_FGC_CAMAMF, ANALOG_SIG_FXOGS, ANALOG_SIG_FXOKS, ANALOG_SIG_FXOLS, ANALOG_SIG_FXSGS, ANALOG_SIG_FXSKS, ANALOG_SIG_FXSLS, ANALOG_SIG_SF, ANALOG_SIG_SF_FEATB, ANALOG_SIG_SF_FEATD, ANALOG_SIG_SF_FEATDMF, ANALOG_SIG_SFWINK, ANALOG_SUB_REAL, ANALOG_SUB_THREEWAY, analog_swap_subs(), analog_train_echocanceller(), ast_channel_name(), ast_debug, ast_log, ast_setstate(), AST_STATE_RINGING, AST_STATE_UP, analog_pvt::channel, analog_pvt::hanguponpolarityswitch, analog_subchannel::inthreeway, LOG_WARNING, NULL, analog_subchannel::owner, analog_pvt::polaritydelaytv, analog_pvt::sig, and analog_pvt::subs.

Referenced by dahdi_answer().

◆ analog_available()

int analog_available ( struct analog_pvt p)

Definition at line 793 of file sig_analog.c.

794 {
795  int offhook;
796 
797  ast_debug(1, "%s %d\n", __FUNCTION__, p->channel);
798 
799  /* If do not disturb, definitely not */
800  if (p->dnd) {
801  return 0;
802  }
803  /* If guard time, definitely not */
804  if (p->guardtime && (time(NULL) < p->guardtime)) {
805  return 0;
806  }
807 
808  /* If no owner definitely available */
809  if (!p->owner) {
810  offhook = analog_is_off_hook(p);
811 
812  /* TDM FXO card, "onhook" means out of service (no battery on the line) */
813  if ((p->sig == ANALOG_SIG_FXSLS) || (p->sig == ANALOG_SIG_FXSKS) || (p->sig == ANALOG_SIG_FXSGS)) {
814 #ifdef DAHDI_CHECK_HOOKSTATE
815  if (offhook) {
816  return 1;
817  }
818  return 0;
819 #endif
820  /* TDM FXS card, "offhook" means someone took the hook off so it's unavailable! */
821  } else if (offhook) {
822  ast_debug(1, "Channel %d off hook, can't use\n", p->channel);
823  /* Not available when the other end is off hook */
824  return 0;
825  }
826  return 1;
827  }
828 
829  /* If it's not an FXO, forget about call wait */
830  if ((p->sig != ANALOG_SIG_FXOKS) && (p->sig != ANALOG_SIG_FXOLS) && (p->sig != ANALOG_SIG_FXOGS)) {
831  return 0;
832  }
833 
834  if (!p->callwaiting) {
835  /* If they don't have call waiting enabled, then for sure they're unavailable at this point */
836  return 0;
837  }
838 
839  if (p->subs[ANALOG_SUB_CALLWAIT].allocd) {
840  /* If there is already a call waiting call, then we can't take a second one */
841  return 0;
842  }
843 
844  if ((ast_channel_state(p->owner) != AST_STATE_UP) &&
846  /* If the current call is not up, then don't allow the call */
847  return 0;
848  }
850  /* Can't take a call wait when the three way calling hasn't been merged yet. */
851  return 0;
852  }
853  /* We're cool */
854  return 1;
855 }
static int analog_is_off_hook(struct analog_pvt *p)
Definition: sig_analog.c:489
unsigned int dnd
Definition: sig_analog.h:325
unsigned int outgoing
Definition: sig_analog.h:328
unsigned int callwaiting
Definition: sig_analog.h:322
time_t guardtime
Definition: sig_analog.h:348
struct ast_channel * owner
Definition: sig_analog.h:270
unsigned int allocd
Definition: sig_analog.h:261

References analog_subchannel::allocd, analog_is_off_hook(), ANALOG_SIG_FXOGS, ANALOG_SIG_FXOKS, ANALOG_SIG_FXOLS, ANALOG_SIG_FXSGS, ANALOG_SIG_FXSKS, ANALOG_SIG_FXSLS, ANALOG_SUB_CALLWAIT, ANALOG_SUB_THREEWAY, ast_debug, AST_STATE_RINGING, AST_STATE_UP, analog_pvt::callwaiting, analog_pvt::channel, analog_pvt::dnd, analog_pvt::guardtime, analog_subchannel::inthreeway, NULL, analog_pvt::outgoing, analog_subchannel::owner, analog_pvt::owner, analog_pvt::sig, and analog_pvt::subs.

Referenced by available().

◆ analog_call()

int analog_call ( struct analog_pvt p,
struct ast_channel ast,
const char *  rdest,
int  timeout 
)

Definition at line 985 of file sig_analog.c.

986 {
987  int res, idx, mysig;
988  char *c, *n, *l;
989  char dest[256]; /* must be same length as p->dialdest */
990 
991  ast_debug(1, "CALLING CID_NAME: %s CID_NUM:: %s\n",
992  S_COR(ast_channel_connected(ast)->id.name.valid, ast_channel_connected(ast)->id.name.str, ""),
993  S_COR(ast_channel_connected(ast)->id.number.valid, ast_channel_connected(ast)->id.number.str, ""));
994 
995  ast_copy_string(dest, rdest, sizeof(dest));
996  ast_copy_string(p->dialdest, rdest, sizeof(p->dialdest));
997 
998  if ((ast_channel_state(ast) == AST_STATE_BUSY)) {
1000  return 0;
1001  }
1002 
1004  ast_log(LOG_WARNING, "analog_call called on %s, neither down nor reserved\n", ast_channel_name(ast));
1005  return -1;
1006  }
1007 
1008  p->dialednone = 0;
1009  analog_set_outgoing(p, 1);
1010 
1011  mysig = p->sig;
1012  if (p->outsigmod > -1) {
1013  mysig = p->outsigmod;
1014  }
1015 
1016  switch (mysig) {
1017  case ANALOG_SIG_FXOLS:
1018  case ANALOG_SIG_FXOGS:
1019  case ANALOG_SIG_FXOKS:
1020  if (p->owner == ast) {
1021  /* Normal ring, on hook */
1022 
1023  /* Don't send audio while on hook, until the call is answered */
1024  analog_set_dialing(p, 1);
1025  analog_set_cadence(p, ast); /* and set p->cidrings */
1026 
1027  /* nick@dccinc.com 4/3/03 mods to allow for deferred dialing */
1028  c = strchr(dest, '/');
1029  if (c) {
1030  c++;
1031  }
1032  if (c && (strlen(c) < p->stripmsd)) {
1033  ast_log(LOG_WARNING, "Number '%s' is shorter than stripmsd (%d)\n", c, p->stripmsd);
1034  c = NULL;
1035  }
1036  if (c && (strlen(c) > sizeof(p->dop.dialstr) - 3 /* "Tw\0" */)) {
1037  ast_log(LOG_WARNING, "Number '%s' is longer than %d bytes\n", c, (int)sizeof(p->dop.dialstr) - 2);
1038  c = NULL;
1039  }
1040  if (c) {
1042  snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "Tw%s", c);
1043  ast_debug(1, "FXO: setup deferred dialstring: %s\n", c);
1044  } else {
1045  p->dop.dialstr[0] = '\0';
1046  }
1047 
1048  if (analog_ring(p)) {
1049  ast_log(LOG_WARNING, "Unable to ring phone: %s\n", strerror(errno));
1050  return -1;
1051  }
1052  analog_set_dialing(p, 1);
1053  } else {
1054  /* Call waiting call */
1055  if (ast_channel_connected(ast)->id.number.valid && ast_channel_connected(ast)->id.number.str) {
1057  } else {
1058  p->callwait_num[0] = '\0';
1059  }
1060  if (ast_channel_connected(ast)->id.name.valid && ast_channel_connected(ast)->id.name.str) {
1062  } else {
1063  p->callwait_name[0] = '\0';
1064  }
1065 
1066  /* Call waiting tone instead */
1067  if (analog_callwait(p)) {
1068  return -1;
1069  }
1070  /* Make ring-back */
1072  ast_log(LOG_WARNING, "Unable to generate call-wait ring-back on channel %s\n", ast_channel_name(ast));
1073  }
1074 
1075  }
1078  if (l) {
1079  ast_copy_string(p->lastcid_num, l, sizeof(p->lastcid_num));
1080  } else {
1081  p->lastcid_num[0] = '\0';
1082  }
1083  if (n) {
1084  ast_copy_string(p->lastcid_name, n, sizeof(p->lastcid_name));
1085  } else {
1086  p->lastcid_name[0] = '\0';
1087  }
1088 
1089  if (p->use_callerid) {
1090  p->caller.id.name.str = p->lastcid_name;
1091  p->caller.id.number.str = p->lastcid_num;
1092  }
1093 
1095  idx = analog_get_index(ast, p, 0);
1096  if (idx > -1) {
1097  struct ast_cc_config_params *cc_params;
1098 
1099  /* This is where the initial ringing frame is queued for an analog call.
1100  * As such, this is a great time to offer CCNR to the caller if it's available.
1101  */
1102  cc_params = ast_channel_get_cc_config_params(p->subs[idx].owner);
1103  if (cc_params) {
1104  switch (ast_get_cc_monitor_policy(cc_params)) {
1105  case AST_CC_MONITOR_NEVER:
1106  break;
1107  case AST_CC_MONITOR_NATIVE:
1108  case AST_CC_MONITOR_ALWAYS:
1112  break;
1113  }
1114  }
1116  }
1117  break;
1118  case ANALOG_SIG_FXSLS:
1119  case ANALOG_SIG_FXSGS:
1120  case ANALOG_SIG_FXSKS:
1122  ast_debug(1, "Ignore possible polarity reversal on line seizure\n");
1123  p->polaritydelaytv = ast_tvnow();
1124  }
1125  /* fall through */
1126  case ANALOG_SIG_EMWINK:
1127  case ANALOG_SIG_EM:
1128  case ANALOG_SIG_EM_E1:
1129  case ANALOG_SIG_FEATD:
1130  case ANALOG_SIG_FEATDMF:
1131  case ANALOG_SIG_E911:
1132  case ANALOG_SIG_FGC_CAMA:
1133  case ANALOG_SIG_FGC_CAMAMF:
1134  case ANALOG_SIG_FEATB:
1135  case ANALOG_SIG_SFWINK:
1136  case ANALOG_SIG_SF:
1137  case ANALOG_SIG_SF_FEATD:
1138  case ANALOG_SIG_SF_FEATDMF:
1139  case ANALOG_SIG_FEATDMF_TA:
1140  case ANALOG_SIG_SF_FEATB:
1141  c = strchr(dest, '/');
1142  if (c) {
1143  c++;
1144  } else {
1145  c = "";
1146  }
1147  if (strlen(c) < p->stripmsd) {
1148  ast_log(LOG_WARNING, "Number '%s' is shorter than stripmsd (%d)\n", c, p->stripmsd);
1149  return -1;
1150  }
1151  res = analog_start(p);
1152  if (res < 0) {
1153  if (errno != EINPROGRESS) {
1154  return -1;
1155  }
1156  }
1157  ast_debug(1, "Dialing '%s'\n", c);
1159 
1160  c += p->stripmsd;
1161 
1162  switch (mysig) {
1163  case ANALOG_SIG_FEATD:
1165  if (l) {
1166  snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "T*%s*%s*", l, c);
1167  } else {
1168  snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "T**%s*", c);
1169  }
1170  break;
1171  case ANALOG_SIG_FEATDMF:
1173  if (l) {
1174  snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*00%s#*%s#", l, c);
1175  } else {
1176  snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*02#*%s#", c);
1177  }
1178  break;
1179  case ANALOG_SIG_FEATDMF_TA:
1180  {
1181  const char *cic = "", *ozz = "";
1182 
1183  /* If you have to go through a Tandem Access point you need to use this */
1184 #ifndef STANDALONE
1185  ozz = pbx_builtin_getvar_helper(p->owner, "FEATDMF_OZZ");
1186  if (!ozz) {
1187  ozz = analog_defaultozz;
1188  }
1189  cic = pbx_builtin_getvar_helper(p->owner, "FEATDMF_CIC");
1190  if (!cic) {
1191  cic = analog_defaultcic;
1192  }
1193 #endif
1194  if (!ozz || !cic) {
1195  ast_log(LOG_WARNING, "Unable to dial channel of type feature group D MF tandem access without CIC or OZZ set\n");
1196  return -1;
1197  }
1198  snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*%s%s#", ozz, cic);
1199  snprintf(p->finaldial, sizeof(p->finaldial), "M*%s#", c);
1200  p->whichwink = 0;
1201  }
1202  break;
1203  case ANALOG_SIG_E911:
1204  ast_copy_string(p->dop.dialstr, "M*911#", sizeof(p->dop.dialstr));
1205  break;
1206  case ANALOG_SIG_FGC_CAMA:
1207  snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "P%s", c);
1208  break;
1209  case ANALOG_SIG_FGC_CAMAMF:
1210  case ANALOG_SIG_FEATB:
1211  snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "M*%s#", c);
1212  break;
1213  default:
1214  if (p->pulse) {
1215  snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "P%sw", c);
1216  } else {
1217  snprintf(p->dop.dialstr, sizeof(p->dop.dialstr), "T%sw", c);
1218  }
1219  break;
1220  }
1221 
1222  if (p->echotraining && (strlen(p->dop.dialstr) > 4)) {
1223  memset(p->echorest, 'w', sizeof(p->echorest) - 1);
1224  strcpy(p->echorest + (p->echotraining / 400) + 1, p->dop.dialstr + strlen(p->dop.dialstr) - 2);
1225  p->echorest[sizeof(p->echorest) - 1] = '\0';
1226  p->echobreak = 1;
1227  p->dop.dialstr[strlen(p->dop.dialstr)-2] = '\0';
1228  } else {
1229  p->echobreak = 0;
1230  }
1231  analog_set_waitingfordt(p, ast);
1232  if (!res) {
1233  if (analog_dial_digits(p, ANALOG_SUB_REAL, &p->dop)) {
1234  analog_on_hook(p);
1235  return -1;
1236  }
1237  } else {
1238  ast_debug(1, "Deferring dialing...\n");
1239  }
1240  analog_set_dialing(p, 1);
1241  if (ast_strlen_zero(c)) {
1242  p->dialednone = 1;
1243  }
1245  break;
1246  default:
1247  ast_debug(1, "not yet implemented\n");
1248  return -1;
1249  }
1250  return 0;
1251 }
#define AST_CC_GENERIC_MONITOR_TYPE
Definition: ccss.h:471
@ AST_CC_CCNR
Definition: ccss.h:38
@ AST_CC_MONITOR_NEVER
Definition: ccss.h:76
@ AST_CC_MONITOR_ALWAYS
Definition: ccss.h:87
@ AST_CC_MONITOR_NATIVE
Definition: ccss.h:78
@ AST_CC_MONITOR_GENERIC
Definition: ccss.h:83
enum ast_cc_monitor_policies ast_get_cc_monitor_policy(struct ast_cc_config_params *config)
Get the cc_monitor_policy.
Definition: ccss.c:884
int ast_queue_cc_frame(struct ast_channel *chan, const char *const monitor_type, const char *const dialstring, enum ast_cc_service_type service, void *private_data)
Queue an AST_CONTROL_CC frame.
Definition: ccss.c:4147
struct ast_party_connected_line * ast_channel_connected(struct ast_channel *chan)
int ast_queue_control(struct ast_channel *chan, enum ast_control_frame_type control)
Queue a control frame without payload.
Definition: channel.c:1225
struct ast_cc_config_params * ast_channel_get_cc_config_params(struct ast_channel *chan)
Get the CCSS parameters from a channel.
Definition: channel.c:10660
@ AST_STATE_DOWN
Definition: channelstate.h:36
@ AST_STATE_BUSY
Definition: channelstate.h:43
@ AST_STATE_DIALING
Definition: channelstate.h:39
@ AST_STATE_RESERVED
Definition: channelstate.h:37
@ AST_CONTROL_BUSY
@ AST_CONTROL_RINGING
int errno
const char * pbx_builtin_getvar_helper(struct ast_channel *chan, const char *name)
Return a pointer to the value of the corresponding channel variable.
static char analog_defaultozz[64]
Definition: sig_analog.c:66
static int analog_callwait(struct analog_pvt *p)
Definition: sig_analog.c:866
static void analog_set_outgoing(struct analog_pvt *p, int is_outgoing)
Definition: sig_analog.c:537
static char analog_defaultcic[64]
Definition: sig_analog.c:65
static int analog_dial_digits(struct analog_pvt *p, enum analog_sub sub, struct analog_dialoperation *dop)
Definition: sig_analog.c:521
static int analog_ring(struct analog_pvt *p)
Definition: sig_analog.c:497
static void analog_set_cadence(struct analog_pvt *p, struct ast_channel *chan)
Definition: sig_analog.c:883
const char * name
Definition: sig_analog.c:70
static int analog_on_hook(struct analog_pvt *p)
Definition: sig_analog.c:529
static int analog_start(struct analog_pvt *p)
Definition: sig_analog.c:513
static void analog_set_waitingfordt(struct analog_pvt *p, struct ast_channel *ast)
Definition: sig_analog.c:914
static const char * analog_get_orig_dialstring(struct analog_pvt *p)
Definition: sig_analog.c:186
#define S_COR(a, b, c)
returns the equivalent of logic or for strings, with an additional boolean check: second one if not e...
Definition: strings.h:87
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
void ast_copy_string(char *dst, const char *src, size_t size)
Size-limited null-terminating string copy.
Definition: strings.h:406
char dialdest[256]
Definition: sig_analog.h:347
struct analog_dialoperation dop
Definition: sig_analog.h:273
int whichwink
Definition: sig_analog.h:350
enum analog_sigtype outsigmod
Definition: sig_analog.h:310
unsigned int answeronpolarityswitch
Definition: sig_analog.h:284
unsigned int pulse
Definition: sig_analog.h:293
int echotraining
Definition: sig_analog.h:311
char callwait_num[AST_MAX_EXTENSION]
Definition: sig_analog.h:338
unsigned int echobreak
Definition: sig_analog.h:326
char lastcid_name[AST_MAX_EXTENSION]
Definition: sig_analog.h:341
unsigned int dialednone
Definition: sig_analog.h:323
char echorest[20]
Definition: sig_analog.h:344
char lastcid_num[AST_MAX_EXTENSION]
Definition: sig_analog.h:340
char finaldial[64]
Definition: sig_analog.h:351
int stripmsd
Definition: sig_analog.h:314
unsigned int use_callerid
Definition: sig_analog.h:297
char callwait_name[AST_MAX_EXTENSION]
Definition: sig_analog.h:339
struct ast_party_caller caller
Definition: sig_analog.h:342
struct ast_party_id id
Caller party ID.
Definition: channel.h:420
struct ast_party_id id
Connected party ID.
Definition: channel.h:458
struct ast_party_name name
Subscriber name.
Definition: channel.h:340
struct ast_party_number number
Subscriber phone number.
Definition: channel.h:342
unsigned char valid
TRUE if the name information is valid/present.
Definition: channel.h:279
char * str
Subscriber name (Malloced)
Definition: channel.h:264
unsigned char valid
TRUE if the number information is valid/present.
Definition: channel.h:297
char * str
Subscriber phone number (Malloced)
Definition: channel.h:291
Number structure.
Definition: app_followme.c:154
static struct test_val c
struct timeval ast_tvnow(void)
Returns current timeval. Meant to replace calls to gettimeofday().
Definition: time.h:157

References analog_callwait(), analog_defaultcic, analog_defaultozz, analog_dial_digits(), ANALOG_DIAL_OP_REPLACE, analog_get_index, analog_get_orig_dialstring(), analog_on_hook(), analog_play_tone(), analog_ring(), analog_set_cadence(), analog_set_dialing(), analog_set_outgoing(), analog_set_waitingfordt(), ANALOG_SIG_E911, ANALOG_SIG_EM, ANALOG_SIG_EM_E1, ANALOG_SIG_EMWINK, ANALOG_SIG_FEATB, ANALOG_SIG_FEATD, ANALOG_SIG_FEATDMF, ANALOG_SIG_FEATDMF_TA, ANALOG_SIG_FGC_CAMA, ANALOG_SIG_FGC_CAMAMF, ANALOG_SIG_FXOGS, ANALOG_SIG_FXOKS, ANALOG_SIG_FXOLS, ANALOG_SIG_FXSGS, ANALOG_SIG_FXSKS, ANALOG_SIG_FXSLS, ANALOG_SIG_SF, ANALOG_SIG_SF_FEATB, ANALOG_SIG_SF_FEATD, ANALOG_SIG_SF_FEATDMF, ANALOG_SIG_SFWINK, analog_start(), ANALOG_SUB_CALLWAIT, ANALOG_SUB_REAL, ANALOG_TONE_RINGTONE, analog_pvt::answeronpolarityswitch, AST_CC_CCNR, AST_CC_GENERIC_MONITOR_TYPE, AST_CC_MONITOR_ALWAYS, AST_CC_MONITOR_GENERIC, AST_CC_MONITOR_NATIVE, AST_CC_MONITOR_NEVER, ast_channel_connected(), ast_channel_get_cc_config_params(), ast_channel_name(), AST_CONTROL_BUSY, AST_CONTROL_RINGING, ast_copy_string(), ast_debug, ast_get_cc_monitor_policy(), ast_log, ast_queue_cc_frame(), ast_queue_control(), ast_setstate(), AST_STATE_BUSY, AST_STATE_DIALING, AST_STATE_DOWN, AST_STATE_RESERVED, AST_STATE_RINGING, ast_strlen_zero(), ast_tvnow(), c, analog_pvt::caller, analog_pvt::callwait_name, analog_pvt::callwait_num, analog_pvt::dialdest, analog_pvt::dialednone, analog_dialoperation::dialstr, analog_pvt::dop, analog_pvt::echobreak, analog_pvt::echorest, analog_pvt::echotraining, errno, analog_pvt::finaldial, analog_pvt::hanguponpolarityswitch, ast_party_caller::id, ast_party_connected_line::id, analog_pvt::lastcid_name, analog_pvt::lastcid_num, LOG_WARNING, name, ast_party_id::name, NULL, ast_party_id::number, analog_dialoperation::op, analog_pvt::outsigmod, analog_subchannel::owner, analog_pvt::owner, pbx_builtin_getvar_helper(), analog_pvt::polaritydelaytv, analog_pvt::pulse, S_COR, analog_pvt::sig, ast_party_name::str, ast_party_number::str, analog_pvt::stripmsd, analog_pvt::subs, analog_pvt::use_callerid, ast_party_name::valid, ast_party_number::valid, and analog_pvt::whichwink.

Referenced by dahdi_call().

◆ analog_cidstart_to_str()

const char* analog_cidstart_to_str ( enum analog_cid_start  cid_start)

Definition at line 249 of file sig_analog.c.

250 {
251  switch (cid_start) {
253  return "Ring";
255  return "Polarity";
257  return "Polarity_In";
259  return "DTMF";
260  }
261 
262  return "Unknown";
263 }

References ANALOG_CID_START_DTMF_NOALERT, ANALOG_CID_START_POLARITY, ANALOG_CID_START_POLARITY_IN, and ANALOG_CID_START_RING.

◆ analog_cidtype_to_str()

const char* analog_cidtype_to_str ( unsigned int  cid_type)

Definition at line 149 of file sig_analog.c.

150 {
151  int i;
152 
153  for (i = 0; i < ARRAY_LEN(cidtypes); i++) {
154  if (cid_type == cidtypes[i].cid_type) {
155  return cidtypes[i].name;
156  }
157  }
158 
159  return "Unknown";
160 }
static const struct @154 cidtypes[]
unsigned int cid_type
Definition: sig_analog.c:96
#define ARRAY_LEN(a)
Definition: utils.h:661

References ARRAY_LEN, cid_type, and cidtypes.

◆ analog_config_complete()

int analog_config_complete ( struct analog_pvt p)

Definition at line 4005 of file sig_analog.c.

4006 {
4007  /* No call waiting on non FXS channels */
4008  if ((p->sig != ANALOG_SIG_FXOKS) && (p->sig != ANALOG_SIG_FXOLS) && (p->sig != ANALOG_SIG_FXOGS)) {
4009  p->permcallwaiting = 0;
4010  }
4011 
4013 
4014  return 0;
4015 }
static void analog_set_callwaiting(struct analog_pvt *p, int callwaiting_enable)
Definition: sig_analog.c:875
unsigned int permcallwaiting
Definition: sig_analog.h:291

References analog_set_callwaiting(), ANALOG_SIG_FXOGS, ANALOG_SIG_FXOKS, ANALOG_SIG_FXOLS, analog_pvt::permcallwaiting, and analog_pvt::sig.

Referenced by mkintf().

◆ analog_delete()

void analog_delete ( struct analog_pvt doomed)

Delete the analog private structure.

Since
1.8
Parameters
doomedAnalog private structure to delete.

Definition at line 4000 of file sig_analog.c.

4001 {
4002  ast_free(doomed);
4003 }
#define ast_free(a)
Definition: astmm.h:180

References ast_free.

Referenced by destroy_dahdi_pvt().

◆ analog_dnd()

int analog_dnd ( struct analog_pvt p,
int  flag 
)

Definition at line 4061 of file sig_analog.c.

4062 {
4063  if (flag == -1) {
4064  return p->dnd;
4065  }
4066 
4067  p->dnd = flag;
4068 
4069  ast_verb(3, "%s DND on channel %d\n",
4070  flag ? "Enabled" : "Disabled",
4071  p->channel);
4072  analog_publish_dnd_state(p->channel, flag ? "enabled" : "disabled");
4073 
4074  return 0;
4075 }
long int flag
Definition: f2c.h:83
#define ast_verb(level,...)
static void analog_publish_dnd_state(int channel, const char *status)
Definition: sig_analog.c:4041

References analog_publish_dnd_state(), ast_verb, analog_pvt::channel, and analog_pvt::dnd.

Referenced by __analog_ss_thread(), and dahdi_dnd().

◆ analog_exception()

struct ast_frame* analog_exception ( struct analog_pvt p,
struct ast_channel ast 
)

Definition at line 3599 of file sig_analog.c.

3600 {
3601  int res;
3602  int idx;
3603  struct ast_frame *f;
3604 
3605  ast_debug(1, "%s %d\n", __FUNCTION__, p->channel);
3606 
3607  idx = analog_get_index(ast, p, 1);
3608  if (idx < 0) {
3609  idx = ANALOG_SUB_REAL;
3610  }
3611 
3612  p->subs[idx].f.frametype = AST_FRAME_NULL;
3613  p->subs[idx].f.datalen = 0;
3614  p->subs[idx].f.samples = 0;
3615  p->subs[idx].f.mallocd = 0;
3616  p->subs[idx].f.offset = 0;
3617  p->subs[idx].f.subclass.integer = 0;
3618  p->subs[idx].f.delivery = ast_tv(0,0);
3619  p->subs[idx].f.src = "dahdi_exception";
3620  p->subs[idx].f.data.ptr = NULL;
3621 
3622  if (!p->owner) {
3623  /* If nobody owns us, absorb the event appropriately, otherwise
3624  we loop indefinitely. This occurs when, during call waiting, the
3625  other end hangs up our channel so that it no longer exists, but we
3626  have neither FLASH'd nor ONHOOK'd to signify our desire to
3627  change to the other channel. */
3628  res = analog_get_event(p);
3629 
3630  /* Switch to real if there is one and this isn't something really silly... */
3631  if ((res != ANALOG_EVENT_RINGEROFF) && (res != ANALOG_EVENT_RINGERON) &&
3632  (res != ANALOG_EVENT_HOOKCOMPLETE)) {
3633  ast_debug(1, "Restoring owner of channel %d on event %d\n", p->channel, res);
3635  if (p->owner && ast != p->owner) {
3636  /*
3637  * Could this even happen?
3638  * Possible deadlock because we do not have the real-call lock.
3639  */
3640  ast_log(LOG_WARNING, "Event %s on %s is not restored owner %s\n",
3642  }
3643  if (p->owner) {
3644  ast_queue_unhold(p->owner);
3645  }
3646  }
3647  switch (res) {
3648  case ANALOG_EVENT_ONHOOK:
3650  if (p->owner) {
3651  ast_verb(3, "Channel %s still has call, ringing phone\n", ast_channel_name(p->owner));
3652  analog_ring(p);
3654  } else {
3655  ast_log(LOG_WARNING, "Absorbed %s, but nobody is left!?!?\n",
3656  analog_event2str(res));
3657  }
3658  analog_update_conf(p);
3659  break;
3662  analog_off_hook(p);
3663  if (p->owner && (ast_channel_state(p->owner) == AST_STATE_RINGING)) {
3665  analog_set_dialing(p, 0);
3666  }
3667  break;
3669  case ANALOG_EVENT_RINGERON:
3671  /* Do nothing */
3672  break;
3674  gettimeofday(&p->flashtime, NULL);
3675  if (p->owner) {
3676  ast_verb(3, "Channel %d flashed to other channel %s\n", p->channel, ast_channel_name(p->owner));
3677  if (ast_channel_state(p->owner) != AST_STATE_UP) {
3678  /* Answer if necessary */
3681  }
3683  ast_queue_unhold(p->owner);
3684  } else {
3685  ast_log(LOG_WARNING, "Absorbed %s, but nobody is left!?!?\n",
3686  analog_event2str(res));
3687  }
3688  analog_update_conf(p);
3689  break;
3690  default:
3691  ast_log(LOG_WARNING, "Don't know how to absorb event %s\n", analog_event2str(res));
3692  break;
3693  }
3694  f = &p->subs[idx].f;
3695  return f;
3696  }
3697  ast_debug(1, "Exception on %d, channel %d\n", ast_channel_fd(ast, 0), p->channel);
3698  /* If it's not us, return NULL immediately */
3699  if (ast != p->owner) {
3700  ast_log(LOG_WARNING, "We're %s, not %s\n", ast_channel_name(ast), ast_channel_name(p->owner));
3701  f = &p->subs[idx].f;
3702  return f;
3703  }
3704 
3705  f = __analog_handle_event(p, ast);
3706  if (!f) {
3707  const char *name = ast_strdupa(ast_channel_name(ast));
3708 
3709  /* Tell the CDR this DAHDI device hung up */
3711  ast_channel_unlock(ast);
3712  ast_set_hangupsource(ast, name, 0);
3713  ast_channel_lock(ast);
3715  }
3716  return f;
3717 }
#define ast_strdupa(s)
duplicate a string in memory from the stack
Definition: astmm.h:298
#define ast_channel_lock(chan)
Definition: channel.h:2922
int ast_channel_fd(const struct ast_channel *chan, int which)
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.
Definition: channel.c:2498
int ast_queue_unhold(struct ast_channel *chan)
Queue an unhold frame.
Definition: channel.c:1210
#define ast_channel_unlock(chan)
Definition: channel.h:2923
@ AST_FRAME_NULL
@ AST_CONTROL_ANSWER
static int analog_update_conf(struct analog_pvt *p)
Definition: sig_analog.c:743
static void analog_unlock_private(struct analog_pvt *p)
Definition: sig_analog.c:560
static void analog_lock_private(struct analog_pvt *p)
Definition: sig_analog.c:567
static int analog_stop_callwait(struct analog_pvt *p)
Definition: sig_analog.c:857
static char * analog_event2str(enum analog_event event)
Definition: sig_analog.c:265
static int analog_get_event(struct analog_pvt *p)
Definition: sig_analog.c:194
static struct ast_frame * __analog_handle_event(struct analog_pvt *p, struct ast_channel *ast)
Definition: sig_analog.c:2729
struct timeval flashtime
Definition: sig_analog.h:349
struct ast_frame f
Definition: sig_analog.h:258
Data structure associated with a single frame of data.
struct ast_frame_subclass subclass
union ast_frame::@254 data
struct timeval delivery
enum ast_frame_type frametype
const char * src
struct timeval ast_tv(ast_time_t sec, ast_suseconds_t usec)
Returns a timeval from sec, usec.
Definition: time.h:233

References __analog_handle_event(), analog_event2str(), ANALOG_EVENT_HOOKCOMPLETE, ANALOG_EVENT_ONHOOK, ANALOG_EVENT_RINGEROFF, ANALOG_EVENT_RINGERON, ANALOG_EVENT_RINGOFFHOOK, ANALOG_EVENT_WINKFLASH, analog_get_event(), analog_get_index, analog_lock_private(), analog_off_hook(), analog_ring(), analog_set_dialing(), analog_set_echocanceller(), analog_set_new_owner(), analog_stop_callwait(), ANALOG_SUB_REAL, analog_unlock_private(), analog_update_conf(), ast_channel_fd(), ast_channel_lock, ast_channel_name(), ast_channel_unlock, AST_CONTROL_ANSWER, ast_debug, AST_FRAME_NULL, ast_log, ast_queue_control(), ast_queue_unhold(), ast_set_hangupsource(), ast_setstate(), AST_STATE_RINGING, AST_STATE_UP, ast_strdupa, ast_tv(), ast_verb, analog_pvt::channel, ast_frame::data, ast_frame::datalen, ast_frame::delivery, analog_subchannel::f, analog_pvt::flashtime, ast_frame::frametype, ast_frame_subclass::integer, LOG_WARNING, ast_frame::mallocd, name, NULL, ast_frame::offset, analog_subchannel::owner, analog_pvt::owner, ast_frame::ptr, ast_frame::samples, ast_frame::src, ast_frame::subclass, and analog_pvt::subs.

Referenced by dahdi_exception(), and dahdi_read().

◆ analog_fixup()

int analog_fixup ( struct ast_channel oldchan,
struct ast_channel newchan,
void *  newp 
)

Definition at line 4023 of file sig_analog.c.

4024 {
4025  struct analog_pvt *new_pvt = newp;
4026  int x;
4027  ast_debug(1, "New owner for channel %d is %s\n", new_pvt->channel, ast_channel_name(newchan));
4028  if (new_pvt->owner == oldchan) {
4029  analog_set_new_owner(new_pvt, newchan);
4030  }
4031  for (x = 0; x < 3; x++) {
4032  if (new_pvt->subs[x].owner == oldchan) {
4033  new_pvt->subs[x].owner = newchan;
4034  }
4035  }
4036 
4037  analog_update_conf(new_pvt);
4038  return 0;
4039 }

References analog_set_new_owner(), analog_update_conf(), ast_channel_name(), ast_debug, analog_pvt::channel, analog_subchannel::owner, analog_pvt::owner, and analog_pvt::subs.

Referenced by dahdi_fixup().

◆ analog_free()

void analog_free ( struct analog_pvt p)

Definition at line 4017 of file sig_analog.c.

4018 {
4019  ast_free(p);
4020 }

References ast_free.

◆ analog_handle_dtmf()

void analog_handle_dtmf ( struct analog_pvt p,
struct ast_channel ast,
enum analog_sub  index,
struct ast_frame **  dest 
)

Definition at line 1566 of file sig_analog.c.

1567 {
1568  struct ast_frame *f = *dest;
1569 
1570  ast_debug(1, "%s DTMF digit: 0x%02X '%c' on %s\n",
1571  f->frametype == AST_FRAME_DTMF_BEGIN ? "Begin" : "End",
1572  (unsigned)f->subclass.integer, f->subclass.integer, ast_channel_name(ast));
1573 
1574  if (analog_check_confirmanswer(p)) {
1575  if (f->frametype == AST_FRAME_DTMF_END) {
1576  ast_debug(1, "Confirm answer on %s!\n", ast_channel_name(ast));
1577  /* Upon receiving a DTMF digit, consider this an answer confirmation instead
1578  of a DTMF digit */
1579  p->subs[idx].f.frametype = AST_FRAME_CONTROL;
1581  /* Reset confirmanswer so DTMF's will behave properly for the duration of the call */
1583  } else {
1584  p->subs[idx].f.frametype = AST_FRAME_NULL;
1585  p->subs[idx].f.subclass.integer = 0;
1586  }
1587  *dest = &p->subs[idx].f;
1588  } else if (p->callwaitcas) {
1589  if (f->frametype == AST_FRAME_DTMF_END) {
1590  if ((f->subclass.integer == 'A') || (f->subclass.integer == 'D')) {
1591  ast_debug(1, "Got some DTMF, but it's for the CAS\n");
1592  p->caller.id.name.str = p->callwait_name;
1593  p->caller.id.number.str = p->callwait_num;
1594  analog_send_callerid(p, 1, &p->caller);
1595  }
1596  if (analog_handles_digit(f)) {
1597  p->callwaitcas = 0;
1598  }
1599  }
1600  p->subs[idx].f.frametype = AST_FRAME_NULL;
1601  p->subs[idx].f.subclass.integer = 0;
1602  *dest = &p->subs[idx].f;
1603  } else {
1604  analog_cb_handle_dtmf(p, ast, idx, dest);
1605  }
1606 }
@ AST_FRAME_DTMF_END
@ AST_FRAME_DTMF_BEGIN
@ AST_FRAME_CONTROL
static int analog_send_callerid(struct analog_pvt *p, int cwcid, struct ast_party_caller *caller)
Definition: sig_analog.c:391
static void analog_set_confirmanswer(struct analog_pvt *p, int flag)
Definition: sig_analog.c:930
static void analog_cb_handle_dtmf(struct analog_pvt *p, struct ast_channel *ast, enum analog_sub analog_index, struct ast_frame **dest)
Definition: sig_analog.c:667
static int analog_handles_digit(struct ast_frame *f)
Definition: sig_analog.c:1541
static int analog_check_confirmanswer(struct analog_pvt *p)
Definition: sig_analog.c:937
unsigned int callwaitcas
TRUE if Call Waiting (CW) CPE Alert Signal (CAS) is being sent.
Definition: sig_analog.h:336

References analog_cb_handle_dtmf(), analog_check_confirmanswer(), analog_handles_digit(), analog_send_callerid(), analog_set_confirmanswer(), ast_channel_name(), AST_CONTROL_ANSWER, ast_debug, AST_FRAME_CONTROL, AST_FRAME_DTMF_BEGIN, AST_FRAME_DTMF_END, AST_FRAME_NULL, analog_pvt::caller, analog_pvt::callwait_name, analog_pvt::callwait_num, analog_pvt::callwaitcas, analog_subchannel::f, ast_frame::frametype, ast_party_caller::id, ast_frame_subclass::integer, ast_party_id::name, ast_party_id::number, ast_party_name::str, ast_party_number::str, ast_frame::subclass, and analog_pvt::subs.

Referenced by __analog_handle_event(), and dahdi_read().

◆ analog_handle_init_event()

void* analog_handle_init_event ( struct analog_pvt i,
int  event 
)

Definition at line 3719 of file sig_analog.c.

3720 {
3721  int res;
3722  pthread_t threadid;
3723  struct ast_channel *chan;
3724  ast_callid callid = 0;
3725  int callid_created;
3726 
3727  ast_debug(1, "channel (%d) - signaling (%d) - event (%s)\n",
3728  i->channel, i->sig, analog_event2str(event));
3729 
3730  /* Handle an event on a given channel for the monitor thread. */
3731  switch (event) {
3734  if (i->inalarm) {
3735  break;
3736  }
3737  /* Got a ring/answer. What kind of channel are we? */
3738  switch (i->sig) {
3739  case ANALOG_SIG_FXOLS:
3740  case ANALOG_SIG_FXOGS:
3741  case ANALOG_SIG_FXOKS:
3742  res = analog_off_hook(i);
3743  i->fxsoffhookstate = 1;
3744  if (res && (errno == EBUSY)) {
3745  break;
3746  }
3747  callid_created = ast_callid_threadstorage_auto(&callid);
3748 
3749  /* Cancel VMWI spill */
3751 
3752  if (i->immediate) {
3754  /* The channel is immediately up. Start right away */
3757  if (!chan) {
3758  ast_log(LOG_WARNING, "Unable to start PBX on channel %d\n", i->channel);
3760  if (res < 0) {
3761  ast_log(LOG_WARNING, "Unable to play congestion tone on channel %d\n", i->channel);
3762  }
3763  }
3764  } else {
3765  /* Check for callerid, digits, etc */
3767  i->ss_astchan = chan;
3768  if (chan) {
3769  if (analog_has_voicemail(i)) {
3771  } else {
3773  }
3774  if (res < 0)
3775  ast_log(LOG_WARNING, "Unable to play dialtone on channel %d, do you have defaultzone and loadzone defined?\n", i->channel);
3776 
3777  if (ast_pthread_create_detached(&threadid, NULL, __analog_ss_thread, i)) {
3778  ast_log(LOG_WARNING, "Unable to start simple switch thread on channel %d\n", i->channel);
3780  if (res < 0) {
3781  ast_log(LOG_WARNING, "Unable to play congestion tone on channel %d\n", i->channel);
3782  }
3783  ast_hangup(chan);
3784  }
3785  } else
3786  ast_log(LOG_WARNING, "Unable to create channel\n");
3787  }
3789  break;
3790  case ANALOG_SIG_FXSLS:
3791  case ANALOG_SIG_FXSGS:
3792  case ANALOG_SIG_FXSKS:
3794  /* Fall through */
3795  case ANALOG_SIG_EMWINK:
3796  case ANALOG_SIG_FEATD:
3797  case ANALOG_SIG_FEATDMF:
3798  case ANALOG_SIG_FEATDMF_TA:
3799  case ANALOG_SIG_E911:
3800  case ANALOG_SIG_FGC_CAMA:
3801  case ANALOG_SIG_FGC_CAMAMF:
3802  case ANALOG_SIG_FEATB:
3803  case ANALOG_SIG_EM:
3804  case ANALOG_SIG_EM_E1:
3805  case ANALOG_SIG_SFWINK:
3806  case ANALOG_SIG_SF_FEATD:
3807  case ANALOG_SIG_SF_FEATDMF:
3808  case ANALOG_SIG_SF_FEATB:
3809  case ANALOG_SIG_SF:
3810  callid_created = ast_callid_threadstorage_auto(&callid);
3811  /* Check for callerid, digits, etc */
3814  } else {
3816  }
3817  i->ss_astchan = chan;
3818  if (!chan) {
3819  ast_log(LOG_WARNING, "Cannot allocate new structure on channel %d\n", i->channel);
3820  } else if (ast_pthread_create_detached(&threadid, NULL, __analog_ss_thread, i)) {
3821  ast_log(LOG_WARNING, "Unable to start simple switch thread on channel %d\n", i->channel);
3823  if (res < 0) {
3824  ast_log(LOG_WARNING, "Unable to play congestion tone on channel %d\n", i->channel);
3825  }
3826  ast_hangup(chan);
3827  }
3829  break;
3830  default:
3831  ast_log(LOG_WARNING, "Don't know how to handle ring/answer with signalling %s on channel %d\n", analog_sigtype_to_str(i->sig), i->channel);
3833  if (res < 0) {
3834  ast_log(LOG_WARNING, "Unable to play congestion tone on channel %d\n", i->channel);
3835  }
3836  return NULL;
3837  }
3838  break;
3839  case ANALOG_EVENT_NOALARM:
3840  analog_set_alarm(i, 0);
3842  break;
3843  case ANALOG_EVENT_ALARM:
3844  analog_set_alarm(i, 1);
3846  /* fall thru intentionally */
3847  case ANALOG_EVENT_ONHOOK:
3848  /* Back on hook. Hang up. */
3849  switch (i->sig) {
3850  case ANALOG_SIG_FXOLS:
3851  case ANALOG_SIG_FXOGS:
3852  i->fxsoffhookstate = 0;
3854  /* Fall through */
3855  case ANALOG_SIG_FEATD:
3856  case ANALOG_SIG_FEATDMF:
3857  case ANALOG_SIG_FEATDMF_TA:
3858  case ANALOG_SIG_E911:
3859  case ANALOG_SIG_FGC_CAMA:
3860  case ANALOG_SIG_FGC_CAMAMF:
3861  case ANALOG_SIG_FEATB:
3862  case ANALOG_SIG_EM:
3863  case ANALOG_SIG_EM_E1:
3864  case ANALOG_SIG_EMWINK:
3865  case ANALOG_SIG_SF_FEATD:
3866  case ANALOG_SIG_SF_FEATDMF:
3867  case ANALOG_SIG_SF_FEATB:
3868  case ANALOG_SIG_SF:
3869  case ANALOG_SIG_SFWINK:
3870  case ANALOG_SIG_FXSLS:
3871  case ANALOG_SIG_FXSGS:
3872  case ANALOG_SIG_FXSKS:
3874  res = analog_play_tone(i, ANALOG_SUB_REAL, -1);
3875  analog_on_hook(i);
3876  break;
3877  case ANALOG_SIG_FXOKS:
3878  i->fxsoffhookstate = 0;
3881  /* Diddle the battery for the zhone */
3882 #ifdef ZHONE_HACK
3883  analog_off_hook(i);
3884  usleep(1);
3885 #endif
3886  res = analog_play_tone(i, ANALOG_SUB_REAL, -1);
3887  analog_on_hook(i);
3888  break;
3889  default:
3890  ast_log(LOG_WARNING, "Don't know how to handle on hook with signalling %s on channel %d\n", analog_sigtype_to_str(i->sig), i->channel);
3891  res = analog_play_tone(i, ANALOG_SUB_REAL, -1);
3892  return NULL;
3893  }
3894  break;
3895  case ANALOG_EVENT_POLARITY:
3896  switch (i->sig) {
3897  case ANALOG_SIG_FXSLS:
3898  case ANALOG_SIG_FXSKS:
3899  case ANALOG_SIG_FXSGS:
3900  callid_created = ast_callid_threadstorage_auto(&callid);
3901  /* We have already got a PR before the channel was
3902  created, but it wasn't handled. We need polarity
3903  to be REV for remote hangup detection to work.
3904  At least in Spain */
3905  if (i->hanguponpolarityswitch) {
3906  i->polarity = POLARITY_REV;
3907  }
3909  i->polarity = POLARITY_REV;
3910  ast_verb(2, "Starting post polarity CID detection on channel %d\n",
3911  i->channel);
3913  i->ss_astchan = chan;
3914  if (!chan) {
3915  ast_log(LOG_WARNING, "Cannot allocate new structure on channel %d\n", i->channel);
3916  } else if (ast_pthread_create_detached(&threadid, NULL, __analog_ss_thread, i)) {
3917  ast_log(LOG_WARNING, "Unable to start simple switch thread on channel %d\n", i->channel);
3918  ast_hangup(chan);
3919  }
3920  }
3922  break;
3923  default:
3925  "handle_init_event detected polarity reversal on non-FXO (ANALOG_SIG_FXS) interface %d\n",
3926  i->channel);
3927  break;
3928  }
3929  break;
3930  case ANALOG_EVENT_DTMFCID:
3931  switch (i->sig) {
3932  case ANALOG_SIG_FXSLS:
3933  case ANALOG_SIG_FXSKS:
3934  case ANALOG_SIG_FXSGS:
3935  callid_created = ast_callid_threadstorage_auto(&callid);
3937  ast_verb(2, "Starting DTMF CID detection on channel %d\n",
3938  i->channel);
3940  i->ss_astchan = chan;
3941  if (!chan) {
3942  ast_log(LOG_WARNING, "Cannot allocate new structure on channel %d\n", i->channel);
3943  } else if (ast_pthread_create_detached(&threadid, NULL, __analog_ss_thread, i)) {
3944  ast_log(LOG_WARNING, "Unable to start simple switch thread on channel %d\n", i->channel);
3945  ast_hangup(chan);
3946  }
3947  }
3949  break;
3950  default:
3952  "handle_init_event detected dtmfcid generation event on non-FXO (ANALOG_SIG_FXS) interface %d\n",
3953  i->channel);
3954  break;
3955  }
3956  break;
3957  case ANALOG_EVENT_REMOVED: /* destroy channel, will actually do so in do_monitor */
3958  ast_log(LOG_NOTICE, "Got ANALOG_EVENT_REMOVED. Destroying channel %d\n",
3959  i->channel);
3960  return i->chan_pvt;
3963  break;
3966  break;
3967  }
3968  return NULL;
3969 }
void ast_hangup(struct ast_channel *chan)
Hang up a channel.
Definition: channel.c:2542
@ AST_STATE_RING
Definition: channelstate.h:40
@ AST_STATE_PRERING
Definition: channelstate.h:45
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...
Definition: logger.c:2128
unsigned int ast_callid
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...
Definition: logger.c:2106
#define LOG_NOTICE
static void analog_publish_channel_alarm_clear(int channel)
Definition: sig_analog.c:2716
static void * __analog_ss_thread(void *data)
Definition: sig_analog.c:1713
static void analog_set_alarm(struct analog_pvt *p, int in_alarm)
Definition: sig_analog.c:898
static int analog_handle_notify_message(struct ast_channel *chan, struct analog_pvt *p, int cid_flags, int neon_mwievent)
Definition: sig_analog.c:1628
static struct ast_channel * analog_new_ast_channel(struct analog_pvt *p, int state, int startpbx, enum analog_sub sub, const struct ast_channel *requestor)
Definition: sig_analog.c:454
const char * analog_sigtype_to_str(enum analog_sigtype sigtype)
Definition: sig_analog.c:123
static void analog_get_and_handle_alarms(struct analog_pvt *p)
Definition: sig_analog.c:1663
static int analog_has_voicemail(struct analog_pvt *p)
Definition: sig_analog.c:682
static void analog_cancel_cidspill(struct analog_pvt *p)
Definition: sig_analog.c:946
#define POLARITY_REV
Definition: sig_analog.c:63
static void analog_start_polarityswitch(struct analog_pvt *p)
Definition: sig_analog.c:639
unsigned int immediate
Definition: sig_analog.h:290
void * chan_pvt
Definition: sig_analog.h:268
enum analog_cid_start cid_start
Definition: sig_analog.h:315
int ringt_base
Definition: sig_analog.h:361
int fxsoffhookstate
Definition: sig_analog.h:275
unsigned int inalarm
Definition: sig_analog.h:329
int polarity
Definition: sig_analog.h:345
struct ast_channel * ss_astchan
Definition: sig_analog.h:357
Main Channel structure associated with a channel.
Definition: astman.c:222
#define ast_pthread_create_detached(a, b, c, d)
Definition: utils.h:583

References __analog_ss_thread(), analog_cancel_cidspill(), ANALOG_CID_START_DTMF_NOALERT, ANALOG_CID_START_POLARITY, ANALOG_CID_START_POLARITY_IN, analog_event2str(), ANALOG_EVENT_ALARM, ANALOG_EVENT_DTMFCID, ANALOG_EVENT_NEONMWI_ACTIVE, ANALOG_EVENT_NEONMWI_INACTIVE, ANALOG_EVENT_NOALARM, ANALOG_EVENT_ONHOOK, ANALOG_EVENT_POLARITY, ANALOG_EVENT_REMOVED, ANALOG_EVENT_RINGOFFHOOK, ANALOG_EVENT_WINKFLASH, analog_get_and_handle_alarms(), analog_handle_notify_message(), analog_has_voicemail(), analog_new_ast_channel(), analog_off_hook(), analog_on_hook(), analog_play_tone(), analog_publish_channel_alarm_clear(), analog_set_alarm(), analog_set_echocanceller(), analog_set_ringtimeout(), ANALOG_SIG_E911, ANALOG_SIG_EM, ANALOG_SIG_EM_E1, ANALOG_SIG_EMWINK, ANALOG_SIG_FEATB, ANALOG_SIG_FEATD, ANALOG_SIG_FEATDMF, ANALOG_SIG_FEATDMF_TA, ANALOG_SIG_FGC_CAMA, ANALOG_SIG_FGC_CAMAMF, ANALOG_SIG_FXOGS, ANALOG_SIG_FXOKS, ANALOG_SIG_FXOLS, ANALOG_SIG_FXSGS, ANALOG_SIG_FXSKS, ANALOG_SIG_FXSLS, ANALOG_SIG_SF, ANALOG_SIG_SF_FEATB, ANALOG_SIG_SF_FEATD, ANALOG_SIG_SF_FEATDMF, ANALOG_SIG_SFWINK, analog_sigtype_to_str(), analog_start_polarityswitch(), ANALOG_SUB_REAL, ANALOG_TONE_CONGESTION, ANALOG_TONE_DIALTONE, ANALOG_TONE_RINGTONE, ANALOG_TONE_STUTTER, ast_callid_threadstorage_auto(), ast_callid_threadstorage_auto_clean(), ast_debug, ast_hangup(), ast_log, ast_pthread_create_detached, AST_STATE_PRERING, AST_STATE_RESERVED, AST_STATE_RING, ast_verb, ast_channel::callid, analog_pvt::chan_pvt, analog_pvt::channel, analog_pvt::cid_start, errno, analog_pvt::fxsoffhookstate, analog_pvt::hanguponpolarityswitch, analog_pvt::immediate, analog_pvt::inalarm, LOG_NOTICE, LOG_WARNING, NULL, analog_pvt::polarity, POLARITY_REV, analog_pvt::ringt_base, analog_pvt::sig, and analog_pvt::ss_astchan.

Referenced by do_monitor().

◆ analog_hangup()

int analog_hangup ( struct analog_pvt p,
struct ast_channel ast 
)

Definition at line 1253 of file sig_analog.c.

1254 {
1255  int res;
1256  int idx, x;
1257 
1258  ast_debug(1, "%s %d\n", __FUNCTION__, p->channel);
1259  if (!ast_channel_tech_pvt(ast)) {
1260  ast_log(LOG_WARNING, "Asked to hangup channel not connected\n");
1261  return 0;
1262  }
1263 
1264  idx = analog_get_index(ast, p, 1);
1265 
1266  x = 0;
1267  if (p->origcid_num) {
1268  ast_copy_string(p->cid_num, p->origcid_num, sizeof(p->cid_num));
1269  ast_free(p->origcid_num);
1270  p->origcid_num = NULL;
1271  }
1272  if (p->origcid_name) {
1273  ast_copy_string(p->cid_name, p->origcid_name, sizeof(p->cid_name));
1274  ast_free(p->origcid_name);
1275  p->origcid_name = NULL;
1276  }
1277 
1279 
1280  ast_debug(1, "Hangup: channel: %d index = %d, normal = %d, callwait = %d, thirdcall = %d\n",
1282  if (idx > -1) {
1283  /* Real channel, do some fixup */
1284  p->subs[idx].owner = NULL;
1285  p->polarity = POLARITY_IDLE;
1286  analog_set_linear_mode(p, idx, 0);
1287  switch (idx) {
1288  case ANALOG_SUB_REAL:
1290  ast_debug(1, "Normal call hung up with both three way call and a call waiting call in place?\n");
1292  /* We had flipped over to answer a callwait and now it's gone */
1293  ast_debug(1, "We were flipped over to the callwait, moving back and not owning.\n");
1294  /* Move to the call-wait, but un-own us until they flip back. */
1298  } else {
1299  /* The three way hung up, but we still have a call wait */
1300  ast_debug(1, "We were in the threeway and have a callwait still. Ditching the threeway.\n");
1303  if (p->subs[ANALOG_SUB_REAL].inthreeway) {
1304  /* This was part of a three way call. Immediately make way for
1305  another call */
1306  ast_debug(1, "Call was complete, setting owner to former third call\n");
1309  } else {
1310  /* This call hasn't been completed yet... Set owner to NULL */
1311  ast_debug(1, "Call was incomplete, setting owner to NULL\n");
1313  }
1314  }
1315  } else if (p->subs[ANALOG_SUB_CALLWAIT].allocd) {
1316  /* Need to hold the lock for real-call, private, and call-waiting call */
1318  if (!p->subs[ANALOG_SUB_CALLWAIT].owner) {
1319  /* The call waiting call dissappeared. */
1321  break;
1322  }
1323 
1324  /* Move to the call-wait and switch back to them. */
1328  if (ast_channel_state(p->owner) != AST_STATE_UP) {
1330  }
1332  /* Unlock the call-waiting call that we swapped to real-call. */
1334  } else if (p->subs[ANALOG_SUB_THREEWAY].allocd) {
1337  if (p->subs[ANALOG_SUB_REAL].inthreeway) {
1338  /* This was part of a three way call. Immediately make way for
1339  another call */
1340  ast_debug(1, "Call was complete, setting owner to former third call\n");
1343  } else {
1344  /* This call hasn't been completed yet... Set owner to NULL */
1345  ast_debug(1, "Call was incomplete, setting owner to NULL\n");
1347  }
1348  }
1349  break;
1350  case ANALOG_SUB_CALLWAIT:
1351  /* Ditch the holding callwait call, and immediately make it available */
1353  /* Need to hold the lock for call-waiting call, private, and 3-way call */
1355 
1356  /* This is actually part of a three way, placed on hold. Place the third part
1357  on music on hold now */
1358  if (p->subs[ANALOG_SUB_THREEWAY].owner) {
1360  }
1362  /* Make it the call wait now */
1365  if (p->subs[ANALOG_SUB_CALLWAIT].owner) {
1366  /* Unlock the 3-way call that we swapped to call-waiting call. */
1368  }
1369  } else {
1371  }
1372  break;
1373  case ANALOG_SUB_THREEWAY:
1374  /* Need to hold the lock for 3-way call, private, and call-waiting call */
1377  /* The other party of the three way call is currently in a call-wait state.
1378  Start music on hold for them, and take the main guy out of the third call */
1380  if (p->subs[ANALOG_SUB_CALLWAIT].owner) {
1382  }
1383  }
1384  if (p->subs[ANALOG_SUB_CALLWAIT].owner) {
1386  }
1388  /* If this was part of a three way call index, let us make
1389  another three way call */
1391  break;
1392  default:
1393  /*
1394  * Should never happen.
1395  * This wasn't any sort of call, so how are we an index?
1396  */
1397  ast_log(LOG_ERROR, "Index found but not any type of call?\n");
1398  break;
1399  }
1400  }
1401 
1404  analog_set_ringtimeout(p, 0);
1406  analog_set_pulsedial(p, 0);
1407  analog_set_outgoing(p, 0);
1408  p->onhooktime = time(NULL);
1409  p->cidrings = 1;
1410 
1411  /* Perform low level hangup if no owner left */
1412  res = analog_on_hook(p);
1413  if (res < 0) {
1414  ast_log(LOG_WARNING, "Unable to hangup line %s\n", ast_channel_name(ast));
1415  }
1416  switch (p->sig) {
1417  case ANALOG_SIG_FXOGS:
1418  case ANALOG_SIG_FXOLS:
1419  case ANALOG_SIG_FXOKS:
1420  /* If they're off hook, try playing congestion */
1421  if (analog_is_off_hook(p)) {
1424  } else {
1426  }
1427  break;
1428  case ANALOG_SIG_FXSGS:
1429  case ANALOG_SIG_FXSLS:
1430  case ANALOG_SIG_FXSKS:
1431  /* Make sure we're not made available for at least two seconds assuming
1432  we were actually used for an inbound or outbound call. */
1433  if (ast_channel_state(ast) != AST_STATE_RESERVED) {
1434  time(&p->guardtime);
1435  p->guardtime += 2;
1436  }
1437  break;
1438  default:
1440  break;
1441  }
1442 
1444 
1445  x = 0;
1446  ast_channel_setoption(ast,AST_OPTION_TONE_VERIFY,&x,sizeof(char),0);
1447  ast_channel_setoption(ast,AST_OPTION_TDD,&x,sizeof(char),0);
1448  p->callwaitcas = 0;
1451  analog_set_dialing(p, 0);
1452  analog_update_conf(p);
1454  }
1455 
1457 
1458  ast_verb(3, "Hanging up on '%s'\n", ast_channel_name(ast));
1459 
1460  return 0;
1461 }
void * ast_channel_tech_pvt(const struct ast_channel *chan)
int ast_queue_hold(struct ast_channel *chan, const char *musicclass)
Queue a hold frame.
Definition: channel.c:1185
int ast_channel_setoption(struct ast_channel *channel, int option, void *data, int datalen, int block)
Sets an option on a channel.
Definition: channel.c:7505
#define AST_OPTION_TONE_VERIFY
#define AST_OPTION_TDD
#define LOG_ERROR
static int analog_unalloc_sub(struct analog_pvt *p, enum analog_sub x)
Definition: sig_analog.c:381
static int analog_set_linear_mode(struct analog_pvt *p, enum analog_sub sub, int linear_mode)
Definition: sig_analog.c:968
static void analog_hangup_polarityswitch(struct analog_pvt *p)
Definition: sig_analog.c:652
static void analog_lock_sub_owner(struct analog_pvt *pvt, enum analog_sub sub_idx)
Definition: sig_analog.c:599
static int analog_dsp_set_digitmode(struct analog_pvt *p, enum analog_dsp_digitmode mode)
Definition: sig_analog.c:659
static void analog_set_pulsedial(struct analog_pvt *p, int flag)
Definition: sig_analog.c:961
static void analog_set_inthreeway(struct analog_pvt *p, enum analog_sub sub, int inthreeway)
Definition: sig_analog.c:977
#define POLARITY_IDLE
Definition: sig_analog.c:62
static void analog_all_subchannels_hungup(struct analog_pvt *p)
Definition: sig_analog.c:553
char cid_num[AST_MAX_EXTENSION]
Definition: sig_analog.h:317
unsigned int permhidecallerid
Definition: sig_analog.h:292
char * origcid_name
Definition: sig_analog.h:353
char * origcid_num
Definition: sig_analog.h:352
int onhooktime
Definition: sig_analog.h:274
int cidrings
Definition: sig_analog.h:343
unsigned int hidecallerid
Definition: sig_analog.h:327
char cid_name[AST_MAX_EXTENSION]
Definition: sig_analog.h:318
char mohsuggest[MAX_MUSICCLASS]
Definition: sig_analog.h:316

References analog_subchannel::allocd, analog_all_subchannels_hungup(), ANALOG_DIGITMODE_DTMF, analog_dsp_set_digitmode(), analog_get_index, analog_hangup_polarityswitch(), analog_is_off_hook(), analog_lock_sub_owner(), analog_on_hook(), analog_play_tone(), analog_set_callwaiting(), analog_set_confirmanswer(), analog_set_dialing(), analog_set_echocanceller(), analog_set_inthreeway(), analog_set_linear_mode(), analog_set_new_owner(), analog_set_outgoing(), analog_set_pulsedial(), analog_set_ringtimeout(), ANALOG_SIG_FXOGS, ANALOG_SIG_FXOKS, ANALOG_SIG_FXOLS, ANALOG_SIG_FXSGS, ANALOG_SIG_FXSKS, ANALOG_SIG_FXSLS, analog_stop_callwait(), ANALOG_SUB_CALLWAIT, ANALOG_SUB_REAL, ANALOG_SUB_THREEWAY, analog_swap_subs(), ANALOG_TONE_CONGESTION, analog_unalloc_sub(), analog_update_conf(), ast_channel_name(), ast_channel_setoption(), ast_channel_tech_pvt(), ast_channel_unlock, AST_CONTROL_ANSWER, ast_copy_string(), ast_debug, ast_free, ast_log, AST_OPTION_TDD, AST_OPTION_TONE_VERIFY, ast_queue_control(), ast_queue_hold(), ast_queue_unhold(), AST_STATE_RESERVED, AST_STATE_UP, ast_verb, analog_pvt::callwaitcas, analog_pvt::channel, analog_pvt::cid_name, analog_pvt::cid_num, analog_pvt::cidrings, analog_pvt::guardtime, analog_pvt::hidecallerid, analog_subchannel::inthreeway, LOG_ERROR, LOG_WARNING, analog_pvt::mohsuggest, NULL, analog_pvt::onhooktime, analog_pvt::origcid_name, analog_pvt::origcid_num, analog_subchannel::owner, analog_pvt::owner, analog_pvt::permcallwaiting, analog_pvt::permhidecallerid, analog_pvt::polarity, POLARITY_IDLE, analog_pvt::sig, and analog_pvt::subs.

Referenced by dahdi_hangup().

◆ analog_new()

struct analog_pvt* analog_new ( enum analog_sigtype  signallingtype,
void *  private_data 
)

Definition at line 3972 of file sig_analog.c.

3973 {
3974  struct analog_pvt *p;
3975 
3976  p = ast_calloc(1, sizeof(*p));
3977  if (!p) {
3978  return p;
3979  }
3980 
3982  p->sig = signallingtype;
3983  p->chan_pvt = private_data;
3984 
3985  /* Some defaults for values */
3988  /* Sub real is assumed to always be alloc'd */
3989  p->subs[ANALOG_SUB_REAL].allocd = 1;
3990 
3991  return p;
3992 }
#define ast_calloc(num, len)
A wrapper for calloc()
Definition: astmm.h:202
#define CID_SIG_BELL
Definition: callerid.h:59
int cid_signalling
Definition: sig_analog.h:312

References analog_subchannel::allocd, ANALOG_CID_START_RING, ANALOG_SIG_NONE, ANALOG_SUB_REAL, ast_calloc, analog_pvt::chan_pvt, CID_SIG_BELL, analog_pvt::cid_signalling, analog_pvt::cid_start, analog_pvt::outsigmod, analog_pvt::sig, and analog_pvt::subs.

Referenced by mkintf().

◆ analog_request()

struct ast_channel* analog_request ( struct analog_pvt p,
int *  callwait,
const struct ast_channel requestor 
)

Definition at line 770 of file sig_analog.c.

771 {
772  struct ast_channel *ast;
773 
774  ast_debug(1, "%s %d\n", __FUNCTION__, p->channel);
775  *callwait = (p->owner != NULL);
776 
777  if (p->owner) {
779  ast_log(LOG_ERROR, "Unable to alloc subchannel\n");
780  return NULL;
781  }
782  }
783 
784  analog_set_outgoing(p, 1);
786  p->owner ? ANALOG_SUB_CALLWAIT : ANALOG_SUB_REAL, requestor);
787  if (!ast) {
788  analog_set_outgoing(p, 0);
789  }
790  return ast;
791 }
static int analog_alloc_sub(struct analog_pvt *p, enum analog_sub x)
Definition: sig_analog.c:368

References analog_alloc_sub(), analog_new_ast_channel(), analog_set_outgoing(), ANALOG_SUB_CALLWAIT, ANALOG_SUB_REAL, ast_debug, ast_log, AST_STATE_RESERVED, analog_pvt::channel, LOG_ERROR, NULL, and analog_pvt::owner.

Referenced by dahdi_request().

◆ analog_sigtype_to_str()

const char* analog_sigtype_to_str ( enum analog_sigtype  sigtype)

Definition at line 123 of file sig_analog.c.

124 {
125  int i;
126 
127  for (i = 0; i < ARRAY_LEN(sigtypes); i++) {
128  if (sigtype == sigtypes[i].sigtype) {
129  return sigtypes[i].name;
130  }
131  }
132 
133  return "Unknown";
134 }
static const struct @153 sigtypes[]
enum analog_sigtype sigtype
Definition: sig_analog.c:69

References ARRAY_LEN, sigtype, and sigtypes.

Referenced by __analog_ss_thread(), and analog_handle_init_event().

◆ analog_ss_thread_start()

int analog_ss_thread_start ( struct analog_pvt p,
struct ast_channel ast 
)

Definition at line 2709 of file sig_analog.c.

2710 {
2711  pthread_t threadid;
2712 
2713  return ast_pthread_create_detached(&threadid, NULL, __analog_ss_thread, p);
2714 }

References __analog_ss_thread(), ast_pthread_create_detached, and NULL.

Referenced by mwi_thread().

◆ analog_str_to_cidstart()

enum analog_cid_start analog_str_to_cidstart ( const char *  value)

Definition at line 230 of file sig_analog.c.

235 {
236  if (!strcasecmp(value, "ring")) {
237  return ANALOG_CID_START_RING;
238  } else if (!strcasecmp(value, "polarity")) {
240  } else if (!strcasecmp(value, "polarity_in")) {
242  } else if (!strcasecmp(value, "dtmf")) {
244  }
245 
246  return 0;
247 }
int value
Definition: syslog.c:37

◆ analog_str_to_cidtype()

unsigned int analog_str_to_cidtype ( const char *  name)

Definition at line 136 of file sig_analog.c.

137 {
138  int i;
139 
140  for (i = 0; i < ARRAY_LEN(cidtypes); i++) {
141  if (!strcasecmp(cidtypes[i].name, name)) {
142  return cidtypes[i].cid_type;
143  }
144  }
145 
146  return 0;
147 }

References ARRAY_LEN, cidtypes, and name.

◆ analog_str_to_sigtype()

enum analog_sigtype analog_str_to_sigtype ( const char *  name)

Definition at line 66 of file sig_analog.c.

111 {
112  int i;
113 
114  for (i = 0; i < ARRAY_LEN(sigtypes); i++) {
115  if (!strcasecmp(sigtypes[i].name, name)) {
116  return sigtypes[i].sigtype;
117  }
118  }
119 
120  return 0;
121 }

Variable Documentation

◆ analog_callbacks

struct analog_callback analog_callbacks
extern

Global analog callbacks to the upper layer.

Definition at line 3388 of file chan_dahdi.c.

Referenced by analog_all_subchannels_hungup(), analog_alloc_sub(), analog_answer_polarityswitch(), analog_callwait(), analog_cancel_cidspill(), analog_cb_handle_dtmf(), analog_check_confirmanswer(), analog_check_for_conference(), analog_check_waitingfordt(), analog_confmute(), analog_deadlock_avoidance_private(), analog_decrease_ss_count(), analog_dial_digits(), analog_distinctive_ring(), analog_dsp_reset_and_flush_digits(), analog_dsp_set_digitmode(), analog_flash(), analog_get_and_handle_alarms(), analog_get_bridged_channel(), analog_get_callerid(), analog_get_event(), analog_get_orig_dialstring(), analog_get_sub_fd(), analog_handle_notify_message(), analog_hangup_polarityswitch(), analog_has_voicemail(), analog_have_progressdetect(), analog_increase_ss_count(), analog_is_dialing(), analog_is_off_hook(), analog_lock_private(), analog_new_ast_channel(), analog_off_hook(), analog_on_hook(), analog_play_tone(), analog_ring(), analog_send_callerid(), analog_set_alarm(), analog_set_cadence(), analog_set_callwaiting(), analog_set_confirmanswer(), analog_set_dialing(), analog_set_echocanceller(), analog_set_inthreeway(), analog_set_linear_mode(), analog_set_needringing(), analog_set_new_owner(), analog_set_outgoing(), analog_set_pulsedial(), analog_set_ringtimeout(), analog_set_waitingfordt(), analog_start(), analog_start_cid_detect(), analog_start_polarityswitch(), analog_stop_callwait(), analog_stop_cid_detect(), analog_swap_subs(), analog_train_echocanceller(), analog_unalloc_sub(), analog_unlock_private(), analog_update_conf(), analog_wait_event(), and analog_wink().