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