1 /*****************************************************************************\
3 ** Linux Call Router **
5 **---------------------------------------------------------------------------**
6 ** Copyright: Andreas Eversberg **
8 ** mISDN-port header file **
10 \*****************************************************************************/
12 #define FROMUP_BUFFER_SIZE 1024
13 #define FROMUP_BUFFER_MASK 1023
16 extern int mISDNdevice;
18 extern int mISDNsocket;
21 B_EVENT_USE, /* activate/export bchannel */
22 B_EVENT_EXPORTREQUEST, /* remote app requests bchannel */
23 B_EVENT_IMPORTREQUEST, /* remote app releases bchannel */
24 B_EVENT_ACTIVATED, /* DL_ESTABLISH received */
25 B_EVENT_DROP, /* deactivate/re-import bchannel */
26 B_EVENT_DEACTIVATED, /* DL_RELEASE received */
27 B_EVENT_EXPORTED, /* BCHANNEL_ASSIGN received */
28 B_EVENT_IMPORTED, /* BCHANNEL_REMOVE received */
29 B_EVENT_TIMEOUT, /* timeout for bchannel state */
32 /* mISDN port structure list */
35 struct mISDNport *next;
36 char name[64]; /* name of port, if available */
37 struct interface_port *ifport; /* link to interface_port */
38 // int iftype; /* IF_* */
39 // int multilink; /* if set, this port will not support callwaiting */
40 int portnum; /* port number 1..n */
41 int ptp; /* if ptp is set, we keep track of l2link */
42 int l1link; /* if l1 is available (only works with nt-mode) */
43 int l2link; /* if l2 is available (at PTP we take this serious) */
44 unsigned char l2mask[16]; /* 128 bits for each tei */
45 int l1hold; /* set, if layer 1 should be holt */
46 int l2hold; /* set, if layer 2 must be hold/checked */
47 struct lcr_timer l2establish; /* time until establishing after link failure */
48 int use; /* counts the number of port that uses this port */
49 int ntmode; /* is TRUE if port is NT mode */
50 int tespecial; /* is TRUE if port uses special TE mode */
51 int pri; /* is TRUE if port is a primary rate interface */
52 int tones; /* TRUE if tones are sent outside connect state */
53 int earlyb; /* TRUE if tones are received outside connect state */
54 int b_num; /* number of bchannels */
55 int b_reserved; /* number of bchannels reserved or in use */
56 class PmISDN *b_port[128]; /* bchannel assigned to port object */
57 struct mqueue upqueue;
58 struct lcr_fd b_sock[128]; /* socket list elements */
59 int b_mode[128]; /* B_MODE_* */
60 int b_state[128]; /* statemachine, 0 = IDLE */
61 struct lcr_timer b_timer[128]; /* timer for bchannel state machine */
62 int b_remote_id[128]; /* the socket currently exported (0=none) */
63 unsigned int b_remote_ref[128]; /* the ref currently exported */
64 int locally; /* local causes are sent as local causes not remote */
65 int los, ais, rdi, slip_rx, slip_tx;
69 int gsm_bs; /* this is the (only) GSM BS interface */
72 int gsm_ms; /* this is an GSM MS interface */
74 int lcr_sock; /* socket of loopback on LCR side */
75 int isloopback; /* will be set on open, in case it is a loopback if */
78 unsigned int ss5; /* set, if SS5 signalling enabled, also holds feature bits */
80 extern mISDNport *mISDNport_first;
86 if a b-channel is in use, the b_port[channel] is linked to the port using it.
87 also each used b-channel counts b_inuse.
88 to assign a bchannel, that is not jet defined due to remote channel assignment,
89 the b_inuse is also increased to reserve channel
91 'use' is the number of port instances using this mISDNport. this counts also
92 calls with no bchannel (call waiting, call on hold).
97 /* mISDN none-object functions */
98 int mISDN_initialize(void);
99 void mISDN_deinitialize(void);
100 int mISDN_getportbyname(int sock, int cnt, char *portname);
101 struct mISDNport *mISDNport_open(struct interface_port *ifport);
102 void mISDNport_static(struct mISDNport *mISDNport);
103 void mISDNport_close_all(void);
104 void mISDNport_close(struct mISDNport *mISDNport);
105 void mISDN_port_reorder(void);
106 void enc_ie_cause_standalone(struct l3_msg *l3m, int location, int cause);
107 int stack2manager(struct mISDNport *mISDNport, unsigned int cmd, unsigned int pid, struct l3_msg *l3m);
108 void ph_control(struct mISDNport *mISDNport, class PmISDN *isdnport, unsigned int handle, unsigned int c1, unsigned int c2, const char *trace_name, int trace_value);
109 void ph_control_block(struct mISDNport *mISDNport, unsigned int handle, unsigned int c1, void *c2, int c2_len, const char *trace_name, int trace_value);
110 void chan_trace_header(struct mISDNport *mISDNport, class PmISDN *port, const char *msgtext, int direction);
111 void l1l2l3_trace_header(struct mISDNport *mISDNport, class PmISDN *port, unsigned int prim, int direction);
112 void bchannel_event(struct mISDNport *mISDNport, int i, int event);
113 void message_bchannel_from_remote(class JoinRemote *joinremote, int type, unsigned int handle);
116 /* mISDN port classes */
117 class PmISDN : public Port
120 PmISDN(int type, struct mISDNport *mISDNport, char *portname, struct port_settings *settings, int channel, int exclusive, int mode);
122 void bchannel_receive(struct mISDNhead *hh, unsigned char *data, int len);
123 void transmit(unsigned char *buffer, int length);
124 int message_epoint(unsigned int epoint_id, int message, union parameter *param);
125 void message_mISDNsignal(unsigned int epoint_id, int message_id, union parameter *param);
126 void message_crypt(unsigned int epoint_id, int message_id, union parameter *param);
127 struct mISDNport *p_m_mISDNport; /* pointer to port */
128 int p_m_delay; /* use delay instead of dejitter */
129 int p_m_tx_gain, p_m_rx_gain; /* volume shift (0 = no change) */
130 char p_m_pipeline[256]; /* filter pipeline */
131 int p_m_echo, p_m_conf; /* remote echo, conference number */
132 int p_m_mute; /* if set, conf is disconnected */
133 int p_m_tone; /* current kernel space tone */
134 int p_m_rxoff; /* rx from driver is disabled */
135 int p_m_txdata; /* get what we transmit */
136 int p_m_dtmf; /* dtmf decoding is enabled */
138 int bridge_rx(unsigned char *data, int len);
140 struct lcr_timer p_m_loadtimer; /* timer for audio transmission */
141 virtual void update_load(void);
143 int p_m_load; /* current data in dsp tx buffer */
144 unsigned int p_m_last_tv_sec; /* time stamp of last tx_load call, (to sync audio data */
145 unsigned int p_m_last_tv_msec;
147 int p_m_crypt; /* encryption is enabled */
148 int p_m_crypt_msg_loops; /* sending a message */
149 int p_m_crypt_msg_len;
150 unsigned char p_m_crypt_msg[1100];
151 int p_m_crypt_msg_current;
152 unsigned char p_m_crypt_key[128];
153 int p_m_crypt_key_len;
154 int p_m_crypt_listen;
155 int p_m_crypt_listen_state;
156 int p_m_crypt_listen_len;
157 unsigned char p_m_crypt_listen_msg[1100];
158 unsigned int p_m_crypt_listen_crc;
159 void cryptman_listen_bch(unsigned char *p, int l);
161 void set_tone(const char *dir, const char *name);
162 void set_echotest(int echotest);
163 void set_conf(int oldconf, int newconf);
165 int p_m_portnum; /* used port number (1...n) */
166 int p_m_b_index; /* index 0,1 0..29 */
167 int p_m_b_channel; /* number 1,2 1..15,17... */
168 int p_m_b_exclusive; /* if bchannel is exclusive */
169 int p_m_b_reserve; /* set if channel is reserved */
170 int p_m_b_mode; /* bchannel mode */
171 int p_m_hold; /* if port is on hold */
172 struct lcr_timer p_m_timeout; /* timeout of timers */
173 unsigned int p_m_remote_ref; /* join to export bchannel to */
174 int p_m_remote_id; /* sock to export bchannel to */
176 int p_m_inband_send_on; /* triggers optional send function */
177 int p_m_inband_receive_on; /* triggers optional receive function */
178 int p_m_mute_on; /* if mute is on, bridge is removed */
179 virtual int inband_send(unsigned char *buffer, int len);
180 void inband_send_on(void);
181 void inband_send_off(void);
182 virtual void inband_receive(unsigned char *buffer, int len);
183 void inband_receive_on(void);
184 void inband_receive_off(void);
187 void update_rxoff(void);
189 int seize_bchannel(int channel, int exclusive); /* requests / reserves / links bchannels, but does not open it! */
190 void drop_bchannel(void);
193 extern unsigned char mISDN_rand[256]; /* noisy randomizer */