Merge branch 'master' of ssh://jolly@www.mISDN.org/var/git/lcr
[lcr.git] / mISDN.h
1 /*****************************************************************************\
2 **                                                                           **
3 ** Linux Call Router                                                         **
4 **                                                                           **
5 **---------------------------------------------------------------------------**
6 ** Copyright: Andreas Eversberg                                              **
7 **                                                                           **
8 ** mISDN-port header file                                                    **
9 **                                                                           **
10 \*****************************************************************************/ 
11
12 #define FROMUP_BUFFER_SIZE 1024
13 #define FROMUP_BUFFER_MASK 1023
14
15 extern int entity;
16 extern int mISDNdevice;
17
18 extern int mISDNsocket;
19
20 enum {
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 */
30 };
31
32 /* mISDN port structure list */
33 struct mISDNport {
34         struct mlayer3 *ml3;
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         time_t 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         int b_socket[128];
59         int b_mode[128]; /* B_MODE_* */
60         int b_state[128]; /* statemachine, 0 = IDLE */
61         double b_timer[128]; /* timer for 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;
66
67         /* gsm */
68         int gsm; /* this is the (only) GSM interface */
69         int lcr_sock; /* socket of loopback on LCR side */
70
71         /* ss5 */
72         unsigned int ss5; /* set, if SS5 signalling enabled, also holds feature bits */
73 };
74 extern mISDNport *mISDNport_first;
75
76 /*
77
78    notes on bchannels:
79
80 if a b-channel is in use, the b_port[channel] is linked to the port using it.
81 also each used b-channel counts b_inuse.
82 to assign a bchannel, that is not jet defined due to remote channel assignment,
83 the b_inuse is also increased to reserve channel
84
85 'use' is the number of port instances using this mISDNport. this counts also
86 calls with no bchannel (call waiting, call on hold).
87
88 */
89
90
91 /* mISDN none-object functions */
92 int mISDN_initialize(void);
93 void mISDN_deinitialize(void);
94 int mISDN_getportbyname(int sock, int cnt, char *portname);
95 struct mISDNport *mISDNport_open(int port, char *portname, int ptp, int force_nt, int te_special, int l1hold, int l2hold, struct interface *interface, int gsm, unsigned int ss5);
96 void mISDNport_static(struct mISDNport *mISDNport);
97 void mISDNport_close_all(void);
98 void mISDNport_close(struct mISDNport *mISDNport);
99 void mISDN_port_reorder(void);
100 int mISDN_handler(void);
101 void enc_ie_cause_standalone(struct l3_msg *l3m, int location, int cause);
102 int stack2manager(struct mISDNport *mISDNport, unsigned int cmd, unsigned int pid, struct l3_msg *l3m);
103 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);
104 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);
105 void chan_trace_header(struct mISDNport *mISDNport, class PmISDN *port, const char *msgtext, int direction);
106 void l1l2l3_trace_header(struct mISDNport *mISDNport, class PmISDN *port, unsigned int prim, int direction);
107 void bchannel_event(struct mISDNport *mISDNport, int i, int event);
108 void message_bchannel_from_remote(class JoinRemote *joinremote, int type, unsigned int handle);
109
110
111 /* mISDN port classes */
112 class PmISDN : public Port
113 {
114         public:
115         PmISDN(int type, struct mISDNport *mISDNport, char *portname, struct port_settings *settings, int channel, int exclusive, int mode);
116         ~PmISDN();
117         void bchannel_receive(struct mISDNhead *hh, unsigned char *data, int len);
118         int handler(void);
119         void transmit(unsigned char *buffer, int length);
120         int message_epoint(unsigned int epoint_id, int message, union parameter *param);
121         void message_mISDNsignal(unsigned int epoint_id, int message_id, union parameter *param);
122         void message_crypt(unsigned int epoint_id, int message_id, union parameter *param);
123         struct mISDNport *p_m_mISDNport;        /* pointer to port */
124         int p_m_delay;                          /* use delay instead of dejitter */
125         int p_m_tx_gain, p_m_rx_gain;           /* volume shift (0 = no change) */
126         char p_m_pipeline[256];                 /* filter pipeline */
127         int p_m_echo, p_m_conf;                 /* remote echo, conference number */
128         int p_m_mute;                           /* if set, conf is disconnected */
129         int p_m_tone;                           /* current kernel space tone */
130         int p_m_rxoff;                          /* rx from driver is disabled */
131 //      int p_m_nodata;                         /* all parties within a conf are isdn ports, so pure bridging is possible */
132         int p_m_txdata;                         /* get what we transmit */
133         int p_m_dtmf;                           /* dtmf decoding is enabled */
134         int p_m_joindata;                       /* the call requires data due to no briging capability */
135
136         int p_m_load;                           /* current data in dsp tx buffer */
137         unsigned int p_m_last_tv_sec;           /* time stamp of last handler call, (to sync audio data */
138         unsigned int p_m_last_tv_msec;
139 //      int p_m_fromup_buffer_readp;            /* buffer for audio from remote endpoint */
140 //      int p_m_fromup_buffer_writep;
141 //      unsigned char p_m_fromup_buffer[FROMUP_BUFFER_SIZE];
142         void txfromup(unsigned char *data, int length);
143
144         int p_m_crypt;                          /* encryption is enabled */
145         int p_m_crypt_msg_loops;                /* sending a message */
146         int p_m_crypt_msg_len;
147         unsigned char p_m_crypt_msg[1100];
148         int p_m_crypt_msg_current;
149         unsigned char p_m_crypt_key[128];
150         int p_m_crypt_key_len;
151         int p_m_crypt_listen;
152         int p_m_crypt_listen_state;
153         int p_m_crypt_listen_len;
154         unsigned char p_m_crypt_listen_msg[1100];
155         unsigned int p_m_crypt_listen_crc;
156         void cryptman_listen_bch(unsigned char *p, int l);
157
158         void set_tone(const char *dir, const char *name);
159         void set_echotest(int echotest);
160         void set_conf(int oldconf, int newconf);
161
162         int p_m_portnum;                        /* used port number (1...n) */
163         int p_m_b_index;                        /* index 0,1 0..29 */
164         int p_m_b_channel;                      /* number 1,2 1..15,17... */
165         int p_m_b_exclusive;                    /* if bchannel is exclusive */
166         int p_m_b_reserve;                      /* set if channel is reserved */
167 //      long long p_m_jittercheck;              /* time of audio data */
168 //      long long p_m_jitterdropped;            /* number of bytes dropped */
169         int p_m_b_mode;                         /* bchannel mode */
170         int p_m_delete;                         /* true if obj. must del. */
171         int p_m_hold;                           /* if port is on hold */
172         unsigned int p_m_timeout;               /* timeout of timers */
173         time_t p_m_timer;                       /* start of timer */
174         unsigned int p_m_remote_ref;            /* join to export bchannel to */
175         int p_m_remote_id;                      /* sock to export bchannel to */
176
177         int p_m_inband_send_on;                 /* triggers optional send function */
178         int p_m_inband_receive_on;              /* triggers optional receive function */
179         int p_m_mute_on;                        /* if mute is on, bridge is removed */
180         virtual int inband_send(unsigned char *buffer, int len);
181         void inband_send_on(void);
182         void inband_send_off(void);
183         virtual void inband_receive(unsigned char *buffer, int len);
184         void inband_receive_on(void);
185         void inband_receive_off(void);
186         void mute_on(void);
187         void mute_off(void);
188
189         int seize_bchannel(int channel, int exclusive); /* requests / reserves / links bchannels, but does not open it! */
190         void drop_bchannel(void);
191 };
192
193 extern unsigned char mISDN_rand[256]; /* noisy randomizer */
194