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 int (* const set_echocanceller)(void *pvt, int enable);
00134 void (* const set_loopback)(void *pvt, int enable);
00135
00136 struct ast_channel * (* const new_ast_channel)(void *pvt, int state, enum sig_ss7_law law, char *exten, const struct ast_channel *requestor);
00137 int (* const play_tone)(void *pvt, enum sig_ss7_tone tone);
00138
00139 void (* const handle_link_exception)(struct sig_ss7_linkset *linkset, int which);
00140 void (* const set_alarm)(void *pvt, int in_alarm);
00141 void (* const set_dialing)(void *pvt, int is_dialing);
00142 void (* const set_digital)(void *pvt, int is_digital);
00143 void (* const set_inservice)(void *pvt, int is_inservice);
00144 void (* const set_locallyblocked)(void *pvt, int is_blocked);
00145 void (* const set_remotelyblocked)(void *pvt, int is_blocked);
00146 void (* const set_callerid)(void *pvt, const struct ast_party_caller *caller);
00147 void (* const set_dnid)(void *pvt, const char *dnid);
00148
00149 void (* const queue_control)(void *pvt, int subclass);
00150 };
00151
00152 struct sig_ss7_chan {
00153 struct sig_ss7_callback *calls;
00154 void *chan_pvt;
00155 struct sig_ss7_linkset *ss7;
00156 struct ast_channel *owner;
00157
00158
00159 struct isup_call *ss7call;
00160
00161
00162 enum sig_ss7_call_level call_level;
00163
00164 int channel;
00165 int cic;
00166 unsigned int dpc;
00167
00168
00169
00170
00171
00172
00173 int stripmsd;
00174
00175
00176
00177 unsigned int hidecallerid:1;
00178
00179 unsigned int use_callerid:1;
00180
00181
00182
00183
00184 unsigned int use_callingpres:1;
00185 unsigned int immediate:1;
00186
00187
00188 unsigned int locallyblocked:1;
00189
00190 unsigned int remotelyblocked:1;
00191
00192 char context[AST_MAX_CONTEXT];
00193 char mohinterpret[MAX_MUSICCLASS];
00194
00195
00196 int cid_ani2;
00197 int cid_ton;
00198 int callingpres;
00199 char cid_num[AST_MAX_EXTENSION];
00200 char cid_subaddr[AST_MAX_EXTENSION];
00201 char cid_name[AST_MAX_EXTENSION];
00202 char cid_ani[AST_MAX_EXTENSION];
00203 char exten[AST_MAX_EXTENSION];
00204
00205
00206 char charge_number[50];
00207 char gen_add_number[50];
00208 char gen_dig_number[50];
00209 char orig_called_num[50];
00210 char redirecting_num[50];
00211 char generic_name[50];
00212 unsigned char gen_add_num_plan;
00213 unsigned char gen_add_nai;
00214 unsigned char gen_add_pres_ind;
00215 unsigned char gen_add_type;
00216 unsigned char gen_dig_type;
00217 unsigned char gen_dig_scheme;
00218 char jip_number[50];
00219 #if 0
00220 unsigned char lspi_type;
00221 unsigned char lspi_scheme;
00222 unsigned char lspi_context;
00223 #endif
00224 char lspi_ident[50];
00225 unsigned int call_ref_ident;
00226 unsigned int call_ref_pc;
00227 unsigned char calling_party_cat;
00228
00229
00230
00231
00232
00233 unsigned int inalarm:1;
00234
00235 unsigned int outgoing:1;
00236
00237 unsigned int progress:1;
00238
00239 unsigned int alreadyhungup:1;
00240
00241 unsigned int rlt:1;
00242
00243 unsigned int loopedback:1;
00244 };
00245
00246 struct sig_ss7_linkset {
00247 pthread_t master;
00248 ast_mutex_t lock;
00249 struct sig_ss7_callback *calls;
00250 struct ss7 *ss7;
00251 struct sig_ss7_chan *pvts[SIG_SS7_MAX_CHANNELS];
00252 int fds[SIG_SS7_NUM_DCHANS];
00253 int numsigchans;
00254 int linkstate[SIG_SS7_NUM_DCHANS];
00255 int numchans;
00256 int span;
00257 int debug;
00258 enum {
00259 LINKSET_STATE_DOWN = 0,
00260 LINKSET_STATE_UP
00261 } state;
00262
00263
00264 int flags;
00265 int type;
00266 char called_nai;
00267 char calling_nai;
00268 char internationalprefix[10];
00269 char nationalprefix[10];
00270 char subscriberprefix[20];
00271 char unknownprefix[20];
00272 };
00273
00274 void sig_ss7_set_alarm(struct sig_ss7_chan *p, int in_alarm);
00275
00276 void *ss7_linkset(void *data);
00277
00278 void sig_ss7_link_alarm(struct sig_ss7_linkset *linkset, int which);
00279 void sig_ss7_link_noalarm(struct sig_ss7_linkset *linkset, int which);
00280 int sig_ss7_add_sigchan(struct sig_ss7_linkset *linkset, int which, int ss7type, int transport, int inalarm, int networkindicator, int pointcode, int adjpointcode);
00281
00282 int sig_ss7_available(struct sig_ss7_chan *p);
00283 int sig_ss7_call(struct sig_ss7_chan *p, struct ast_channel *ast, char *rdest);
00284 int sig_ss7_hangup(struct sig_ss7_chan *p, struct ast_channel *ast);
00285 int sig_ss7_answer(struct sig_ss7_chan *p, struct ast_channel *ast);
00286 void sig_ss7_fixup(struct ast_channel *oldchan, struct ast_channel *newchan, struct sig_ss7_chan *pchan);
00287 int sig_ss7_indicate(struct sig_ss7_chan *p, struct ast_channel *chan, int condition, const void *data, size_t datalen);
00288 struct ast_channel *sig_ss7_request(struct sig_ss7_chan *p, enum sig_ss7_law law, const struct ast_channel *requestor, int transfercapability);
00289 void sig_ss7_chan_delete(struct sig_ss7_chan *doomed);
00290 struct sig_ss7_chan *sig_ss7_chan_new(void *pvt_data, struct sig_ss7_callback *callback, struct sig_ss7_linkset *ss7);
00291 void sig_ss7_init_linkset(struct sig_ss7_linkset *ss7);
00292
00293 void sig_ss7_cli_show_channels_header(int fd);
00294 void sig_ss7_cli_show_channels(int fd, struct sig_ss7_linkset *linkset);
00295
00296
00297
00298
00299 #ifdef __cplusplus
00300 }
00301 #endif
00302
00303 #endif
00304
00305