Add GSM full rate codec to LCR's source repository
[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 bchannel */
22         B_EVENT_ACTIVATED,      /* DL_ESTABLISH received */
23         B_EVENT_DROP,           /* deactivate bchannel */
24         B_EVENT_DEACTIVATED,    /* DL_RELEASE received */
25         B_EVENT_TIMEOUT,        /* timeout happed during (de)activation */
26 };
27
28 /* mISDN port structure list */
29 struct mISDNport {
30         struct mlayer3 *ml3;
31         struct mISDNport *next;
32         char name[64]; /* name of port, if available */
33         struct interface_port *ifport; /* link to interface_port */
34 //      int iftype; /* IF_* */
35 //      int multilink; /* if set, this port will not support callwaiting */
36         int portnum; /* port number 1..n */
37         int ptp; /* if ptp is set, we keep track of l2link */
38         int l1link; /* if l1 is available (only works with nt-mode) */
39         int l2link; /* if l2 is available (at PTP we take this serious) */
40         unsigned char l2mask[16]; /* 128 bits for each tei */
41         int l1hold; /* set, if layer 1 should be holt */
42         int l2hold; /* set, if layer 2 must be hold/checked */
43         struct lcr_timer l2establish; /* time until establishing after link failure */
44         int use; /* counts the number of port that uses this port */
45         int ntmode; /* is TRUE if port is NT mode */
46         int tespecial; /* is TRUE if port uses special TE mode */
47         int pri; /* is TRUE if port is a primary rate interface */
48         int pots; /* is TRUE if port is of type POTS */
49         struct lcr_fd pots_sock; /* socket for L1 */
50         int tones; /* TRUE if tones are sent outside connect state */
51         int earlyb; /* TRUE if tones are received outside connect state */
52         int b_num; /* number of bchannels */
53         int b_reserved; /* number of bchannels reserved or in use */
54         class PmISDN *b_port[128]; /* bchannel assigned to port object */
55         struct mqueue upqueue;
56         struct lcr_fd b_sock[128]; /* socket list elements */
57         int b_mode[128]; /* B_MODE_* */
58         int b_state[128]; /* statemachine, 0 = IDLE */
59         struct lcr_timer b_timer[128]; /* timer for bchannel state machine */
60         int locally; /* local causes are sent as local causes not remote */
61         int los, ais, rdi, slip_rx, slip_tx;
62
63         /* ss5 */
64         unsigned int ss5; /* set, if SS5 signalling enabled, also holds feature bits */
65 };
66 extern mISDNport *mISDNport_first;
67
68 /*
69
70    notes on bchannels:
71
72 if a b-channel is in use, the b_port[channel] is linked to the port using it.
73 also each used b-channel counts b_inuse.
74 to assign a bchannel, that is not jet defined due to remote channel assignment,
75 the b_inuse is also increased to reserve channel
76
77 'use' is the number of port instances using this mISDNport. this counts also
78 calls with no bchannel (call waiting, call on hold).
79
80 */
81
82
83 /* mISDN none-object functions */
84 int mISDN_initialize(void);
85 void mISDN_deinitialize(void);
86 int mISDN_getportbyname(int sock, int cnt, char *portname);
87 struct mISDNport *mISDNport_open(struct interface_port *ifport);
88 void mISDNport_static(struct mISDNport *mISDNport);
89 void mISDNport_close_all(void);
90 void mISDNport_close(struct mISDNport *mISDNport);
91 void mISDN_port_reorder(void);
92 void enc_ie_cause_standalone(struct l3_msg *l3m, int location, int cause);
93 int stack2manager(struct mISDNport *mISDNport, unsigned int cmd, unsigned int pid, struct l3_msg *l3m);
94 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);
95 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);
96 void chan_trace_header(struct mISDNport *mISDNport, class PmISDN *port, const char *msgtext, int direction);
97 void l1l2l3_trace_header(struct mISDNport *mISDNport, class PmISDN *port, unsigned int prim, int direction);
98 void bchannel_event(struct mISDNport *mISDNport, int i, int event);
99
100
101 /* mISDN port classes */
102 class PmISDN : public Port
103 {
104         public:
105         PmISDN(int type, struct mISDNport *mISDNport, char *portname, struct port_settings *settings, struct interface *interface, int channel, int exclusive, int mode);
106         ~PmISDN();
107         void bchannel_receive(struct mISDNhead *hh, unsigned char *data, int len);
108         void transmit(unsigned char *buffer, int length);
109         int message_epoint(unsigned int epoint_id, int message, union parameter *param);
110         void message_mISDNsignal(unsigned int epoint_id, int message_id, union parameter *param);
111         void message_crypt(unsigned int epoint_id, int message_id, union parameter *param);
112         struct mISDNport *p_m_mISDNport;        /* pointer to port */
113         int p_m_delay;                          /* use delay instead of dejitter */
114         int p_m_tx_dejitter;                    /* use dejitter on transmit data to DSP */
115         int p_m_disable_dejitter;               /* usefull to send fax via bridge */
116         int p_m_preload;                        /* set to ISDN_LOAD, but may be changed later */
117         int p_m_tx_gain, p_m_rx_gain;           /* volume shift (0 = no change) */
118         char p_m_pipeline[256];                 /* filter pipeline */
119         int p_m_echo, p_m_conf;                 /* remote echo, conference number */
120         int p_m_mute;                           /* if set, conf is disconnected */
121         int p_m_tone;                           /* current kernel space tone */
122         int p_m_rxoff;                          /* rx from driver is disabled */
123         int p_m_txdata;                         /* get what we transmit */
124         int p_m_dtmf;                           /* dtmf decoding is enabled */
125         int p_m_dtmf_threshold;                 /* dtmf level threshold */
126
127         int bridge_rx(unsigned char *data, int len);
128
129         struct lcr_timer p_m_loadtimer;         /* timer for audio transmission */
130         virtual void update_load(void);
131         void load_tx(void);
132         int p_m_load;                           /* current data in dsp tx buffer */
133         unsigned int p_m_last_tv_sec;           /* time stamp of last tx_load call, (to sync audio data */
134         unsigned int p_m_last_tv_msec;
135
136         int p_m_crypt;                          /* encryption is enabled */
137         int p_m_crypt_msg_loops;                /* sending a message */
138         int p_m_crypt_msg_len;
139         unsigned char p_m_crypt_msg[1100];
140         int p_m_crypt_msg_current;
141         unsigned char p_m_crypt_key[128];
142         int p_m_crypt_key_len;
143         int p_m_crypt_listen;
144         int p_m_crypt_listen_state;
145         int p_m_crypt_listen_len;
146         unsigned char p_m_crypt_listen_msg[1100];
147         unsigned int p_m_crypt_listen_crc;
148         void cryptman_listen_bch(unsigned char *p, int l);
149
150         void set_tone(const char *dir, const char *name);
151         void set_echotest(int echotest);
152         void set_conf(int oldconf, int newconf);
153
154         int p_m_portnum;                        /* used port number (1...n) */
155         int p_m_b_index;                        /* index 0,1 0..29 */
156         int p_m_b_channel;                      /* number 1,2 1..15,17... */
157         int p_m_b_exclusive;                    /* if bchannel is exclusive */
158         int p_m_b_reserve;                      /* set if channel is reserved */
159         int p_m_b_mode;                         /* bchannel mode */
160         int p_m_hold;                           /* if port is on hold */
161         struct lcr_timer p_m_timeout;           /* timeout of timers */
162
163         int p_m_inband_send_on;                 /* triggers optional send function */
164         int p_m_inband_receive_on;              /* triggers optional receive function */
165         int p_m_mute_on;                        /* if mute is on, bridge is removed */
166         virtual int inband_send(unsigned char *buffer, int len);
167         void inband_send_on(void);
168         void inband_send_off(void);
169         virtual void inband_receive(unsigned char *buffer, int len);
170         void inband_receive_on(void);
171         void inband_receive_off(void);
172         void mute_on(void);
173         void mute_off(void);
174         void update_rxoff(void);
175
176         int seize_bchannel(int channel, int exclusive); /* requests / reserves / links bchannels, but does not open it! */
177         void drop_bchannel(void);
178 };
179
180 extern unsigned char mISDN_rand[256]; /* noisy randomizer */
181