00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef _ASTERISK_SIG_SS7_H
00031 #define _ASTERISK_SIG_SS7_H
00032
00033 #include "asterisk/channel.h"
00034 #include <libss7.h>
00035
00036 #ifdef __cplusplus
00037 extern "C" {
00038 #endif
00039
00040
00041
00042
00043 #define SIG_SS7_DEBUG \
00044 (SS7_DEBUG_MTP2 | SS7_DEBUG_MTP3 | SS7_DEBUG_ISUP)
00045
00046 #if 0
00047
00048 #define SIG_SS7_DEBUG_DEFAULT SIG_SS7_DEBUG
00049 #else
00050
00051 #define SIG_SS7_DEBUG_DEFAULT 0
00052 #endif
00053
00054
00055
00056 #define SIG_SS7_NUM_DCHANS 4
00057 #define SIG_SS7_MAX_CHANNELS 672
00058
00059 #define SIG_SS7 (0x1000000 | DAHDI_SIG_CLEAR)
00060
00061 #define LINKSTATE_INALARM (1 << 0)
00062 #define LINKSTATE_STARTING (1 << 1)
00063 #define LINKSTATE_UP (1 << 2)
00064 #define LINKSTATE_DOWN (1 << 3)
00065
00066 #define SS7_NAI_DYNAMIC -1
00067
00068 #define LINKSET_FLAG_EXPLICITACM (1 << 0)
00069
00070
00071 enum sig_ss7_tone {
00072 SIG_SS7_TONE_RINGTONE = 0,
00073 SIG_SS7_TONE_STUTTER,
00074 SIG_SS7_TONE_CONGESTION,
00075 SIG_SS7_TONE_DIALTONE,
00076 SIG_SS7_TONE_DIALRECALL,
00077 SIG_SS7_TONE_INFO,
00078 SIG_SS7_TONE_BUSY,
00079 };
00080
00081 enum sig_ss7_law {
00082 SIG_SS7_DEFLAW = 0,
00083 SIG_SS7_ULAW,
00084 SIG_SS7_ALAW
00085 };
00086
00087
00088 enum sig_ss7_call_level {
00089
00090 SIG_SS7_CALL_LEVEL_IDLE,
00091
00092
00093
00094
00095 SIG_SS7_CALL_LEVEL_ALLOCATED,
00096
00097
00098
00099
00100 SIG_SS7_CALL_LEVEL_CONTINUITY,
00101
00102
00103
00104
00105 SIG_SS7_CALL_LEVEL_SETUP,
00106
00107
00108
00109
00110 SIG_SS7_CALL_LEVEL_PROCEEDING,
00111
00112
00113
00114
00115 SIG_SS7_CALL_LEVEL_ALERTING,
00116
00117
00118
00119
00120 SIG_SS7_CALL_LEVEL_CONNECT,
00121
00122 SIG_SS7_CALL_LEVEL_GLARE,
00123 };
00124
00125 struct sig_ss7_linkset;
00126
00127 struct sig_ss7_callback {
00128
00129 void (* const unlock_private)(void *pvt);
00130
00131 void (* const lock_private)(void *pvt);
00132
00133 void (* const deadlock_avoidance_private)(void *pvt);
00134
00135 int (* const set_echocanceller)(void *pvt, int enable);
00136 void (* const set_loopback)(void *pvt, int enable);
00137
00138 struct ast_channel * (* const new_ast_channel)(void *pvt, int state, enum sig_ss7_law law, char *exten, const struct ast_channel *requestor);
00139 int (* const play_tone)(void *pvt, enum sig_ss7_tone tone);
00140
00141 void (* const handle_link_exception)(struct sig_ss7_linkset *linkset, int which);
00142 void (* const set_alarm)(void *pvt, int in_alarm);
00143 void (* const set_dialing)(void *pvt, int is_dialing);
00144 void (* const set_digital)(void *pvt, int is_digital);
00145 void (* const set_outgoing)(void *pvt, int is_outgoing);
00146 void (* const set_inservice)(void *pvt, int is_inservice);
00147 void (* const set_locallyblocked)(void *pvt, int is_blocked);
00148 void (* const set_remotelyblocked)(void *pvt, int is_blocked);
00149 void (* const set_callerid)(void *pvt, const struct ast_party_caller *caller);
00150 void (* const set_dnid)(void *pvt, const char *dnid);
00151
00152 void (* const queue_control)(void *pvt, int subclass);
00153 void (* const open_media)(void *pvt);
00154 };
00155
00156
00157 extern struct sig_ss7_callback sig_ss7_callbacks;
00158
00159 struct sig_ss7_chan {
00160 void *chan_pvt;
00161 struct sig_ss7_linkset *ss7;
00162 struct ast_channel *owner;
00163
00164
00165 struct isup_call *ss7call;
00166
00167
00168 enum sig_ss7_call_level call_level;
00169
00170 int channel;
00171 int cic;
00172 unsigned int dpc;
00173
00174
00175
00176
00177
00178
00179 int stripmsd;
00180
00181
00182
00183 unsigned int hidecallerid:1;
00184
00185 unsigned int use_callerid:1;
00186
00187
00188
00189
00190 unsigned int use_callingpres:1;
00191 unsigned int immediate:1;
00192
00193
00194 unsigned int locallyblocked:1;
00195
00196 unsigned int remotelyblocked:1;
00197
00198 char context[AST_MAX_CONTEXT];
00199 char mohinterpret[MAX_MUSICCLASS];
00200
00201
00202 int cid_ani2;
00203 int cid_ton;
00204 int callingpres;
00205 char cid_num[AST_MAX_EXTENSION];
00206 char cid_subaddr[AST_MAX_EXTENSION];
00207 char cid_name[AST_MAX_EXTENSION];
00208 char cid_ani[AST_MAX_EXTENSION];
00209 char exten[AST_MAX_EXTENSION];
00210
00211
00212 char charge_number[50];
00213 char gen_add_number[50];
00214 char gen_dig_number[50];
00215 char orig_called_num[50];
00216 char redirecting_num[50];
00217 char generic_name[50];
00218 unsigned char gen_add_num_plan;
00219 unsigned char gen_add_nai;
00220 unsigned char gen_add_pres_ind;
00221 unsigned char gen_add_type;
00222 unsigned char gen_dig_type;
00223 unsigned char gen_dig_scheme;
00224 char jip_number[50];
00225 #if 0
00226 unsigned char lspi_type;
00227 unsigned char lspi_scheme;
00228 unsigned char lspi_context;
00229 #endif
00230 char lspi_ident[50];
00231 unsigned int call_ref_ident;
00232 unsigned int call_ref_pc;
00233 unsigned char calling_party_cat;
00234
00235
00236
00237
00238
00239 unsigned int inalarm:1;
00240
00241 unsigned int outgoing:1;
00242
00243 unsigned int progress:1;
00244
00245 unsigned int alreadyhungup:1;
00246
00247 unsigned int rlt:1;
00248
00249 unsigned int loopedback:1;
00250 };
00251
00252 struct sig_ss7_linkset {
00253 pthread_t master;
00254 ast_mutex_t lock;
00255 struct ss7 *ss7;
00256 struct sig_ss7_chan *pvts[SIG_SS7_MAX_CHANNELS];
00257 int fds[SIG_SS7_NUM_DCHANS];
00258 int numsigchans;
00259 int linkstate[SIG_SS7_NUM_DCHANS];
00260 int numchans;
00261 int span;
00262 int debug;
00263 enum {
00264 LINKSET_STATE_DOWN = 0,
00265 LINKSET_STATE_UP
00266 } state;
00267
00268
00269 int flags;
00270 int type;
00271 char called_nai;
00272 char calling_nai;
00273 char internationalprefix[10];
00274 char nationalprefix[10];
00275 char subscriberprefix[20];
00276 char unknownprefix[20];
00277 };
00278
00279 void sig_ss7_set_alarm(struct sig_ss7_chan *p, int in_alarm);
00280
00281 void *ss7_linkset(void *data);
00282
00283 void sig_ss7_link_alarm(struct sig_ss7_linkset *linkset, int which);
00284 void sig_ss7_link_noalarm(struct sig_ss7_linkset *linkset, int which);
00285 int sig_ss7_add_sigchan(struct sig_ss7_linkset *linkset, int which, int ss7type, int transport, int inalarm, int networkindicator, int pointcode, int adjpointcode);
00286
00287 int sig_ss7_available(struct sig_ss7_chan *p);
00288 int sig_ss7_call(struct sig_ss7_chan *p, struct ast_channel *ast, const char *rdest);
00289 int sig_ss7_hangup(struct sig_ss7_chan *p, struct ast_channel *ast);
00290 int sig_ss7_answer(struct sig_ss7_chan *p, struct ast_channel *ast);
00291 void sig_ss7_fixup(struct ast_channel *oldchan, struct ast_channel *newchan, struct sig_ss7_chan *pchan);
00292 int sig_ss7_indicate(struct sig_ss7_chan *p, struct ast_channel *chan, int condition, const void *data, size_t datalen);
00293 struct ast_channel *sig_ss7_request(struct sig_ss7_chan *p, enum sig_ss7_law law, const struct ast_channel *requestor, int transfercapability);
00294 void sig_ss7_chan_delete(struct sig_ss7_chan *doomed);
00295 struct sig_ss7_chan *sig_ss7_chan_new(void *pvt_data, struct sig_ss7_linkset *ss7);
00296 void sig_ss7_init_linkset(struct sig_ss7_linkset *ss7);
00297
00298 void sig_ss7_cli_show_channels_header(int fd);
00299 void sig_ss7_cli_show_channels(int fd, struct sig_ss7_linkset *linkset);
00300
00301
00302
00303
00304 #ifdef __cplusplus
00305 }
00306 #endif
00307
00308 #endif
00309
00310