b14ea6859aa5e558b5f58ba0e004064dfbc83803
[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 /* mISDN port structure list */
19 struct mISDNport {
20 #ifdef SOCKET_MISDN
21         struct mlayer3 *ml3;
22 #else
23         net_stack_t nst; /* MUST be the first entry, so &nst equals &mISDNlist */
24         manager_t mgr;
25         int upper_id; /* id to transfer data down */
26         int lower_id; /* id to transfer data up */
27         int d_stid;
28         msg_queue_t downqueue;          /* l4->l3 */
29 #endif
30         struct mISDNport *next;
31         char name[64]; /* name of port, if available */
32         struct interface_port *ifport; /* link to interface_port */
33 //      int iftype; /* IF_* */
34 //      int multilink; /* if set, this port will not support callwaiting */
35         int portnum; /* port number 1..n */
36         int ptp; /* if ptp is set, we keep track of l2link */
37         int l1link; /* if l1 is available (only works with nt-mode) */
38         int l2link; /* if l2 is available (at PTP we take this serious) */
39 //      time_t l1timeout; /* timout when establishing link */
40         time_t l2establish; /* time until establishing after link failure */
41         int use; /* counts the number of port that uses this port */
42         int ntmode; /* is TRUE if port is nt mode */
43         int pri; /* is TRUE if port is a primary rate interface */
44         int tones; /* TRUE if tones are sent outside connect state */
45         int earlyb; /* TRUE if tones are received outside connect state */
46         int b_num; /* number of bchannels */
47         int b_reserved; /* number of bchannels reserved or in use */
48         class PmISDN *b_port[128]; /* bchannel assigned to port object */
49 #ifdef SOCKET_MISDN
50         int b_socket[128];
51 #else
52         int b_stid[128];
53         unsigned long b_addr[128];
54 #endif
55         int b_state[128]; /* statemachine, 0 = IDLE */
56         double b_timer[128]; /* timer for state machine */
57         unsigned long b_remote_id[128]; /* the socket currently exported */
58         unsigned long b_remote_ref[128]; /* the ref currently exported */
59         int procids[128]; /* keep track of free ids */
60         int locally; /* local causes are sent as local causes not remote */
61 };
62 extern mISDNport *mISDNport_first;
63
64 /*
65
66    notes on bchannels:
67
68 if a b-channel is in use, the b_port[channel] is linked to the port using it.
69 also each used b-channel counts b_inuse.
70 to assign a bchannel, that is not jet defined due to remote channel assignment,
71 the b_inuse is also increased to reserve channel
72
73 'use' is the number of port instances using this mISDNport. this counts also
74 calls with no bchannel (call waiting, call on hold).
75
76 */
77
78
79 /* mISDN none-object functions */
80 int mISDN_initialize(void);
81 void mISDN_deinitialize(void);
82 void mISDN_port_info(void);
83 struct mISDNport *mISDNport_open(int port, int ptp, int ptmp, int force_nt, struct interface *interface);
84 void mISDNport_close_all(void);
85 void mISDNport_close(struct mISDNport *mISDNport);
86 void mISDN_port_reorder(void);
87 int mISDN_handler(void);
88 #ifdef SOCKET_MISDN
89 void enc_ie_cause_standalone(struct l3_msg *l3m, int location, int cause);
90 int stack2manager_te(struct mISDNport *mISDNport,l3_msg *l3m);
91 #else
92 void enc_ie_cause_standalone(unsigned char **ntmode, msg_t *msg, int location, int cause);
93 int stack2manager_te(struct mISDNport *mISDNport, msg_t *msg);
94 msg_t *create_l2msg(int prim, int dinfo, int size);
95 #endif
96 void ph_control(struct mISDNport *mISDNport, class PmISDN *isdnport, unsigned long handle, unsigned long c1, unsigned long c2, char *trace_name, int trace_value);
97 void ph_control_block(struct mISDNport *mISDNport, unsigned long handle, unsigned long c1, void *c2, int c2_len, char *trace_name, int trace_value);
98 void setup_queue(struct mISDNport *mISDNport, int link);
99 int stack2manager_nt(void *dat, void *arg);
100 void chan_trace_header(struct mISDNport *mISDNport, class PmISDN *port, char *msgtext, int direction);
101 void l1l2l3_trace_header(struct mISDNport *mISDNport, class PmISDN *port, unsigned long prim, int direction);
102 void bchannel_event(struct mISDNport *mISDNport, int i, int event);
103 void message_bchannel_from_join(class JoinRemote *joinremote, int type, unsigned long handle);
104
105
106 /* mISDN port classes */
107 class PmISDN : public Port
108 {
109         public:
110         PmISDN(int type, struct mISDNport *mISDNport, char *portname, struct port_settings *settings, int channel, int exclusive);
111         ~PmISDN();
112 #ifdef SOCKET_MISDN
113         void bchannel_receive(unsigned char *frm, int len);
114 #else
115         void bchannel_receive(iframe_t *frm);
116 #endif
117         int handler(void);
118         void transmit(unsigned char *buffer, int length);
119         int message_epoint(unsigned long epoint_id, int message, union parameter *param);
120         void message_mISDNsignal(unsigned long epoint_id, int message_id, union parameter *param);
121         void message_crypt(unsigned long epoint_id, int message_id, union parameter *param);
122         struct mISDNport *p_m_mISDNport;        /* pointer to port */
123         int p_m_delay;                          /* use delay instead of dejitter */
124         int p_m_tx_gain, p_m_rx_gain;           /* volume shift (0 = no change) */
125         char p_m_pipeline[256];                 /* filter pipeline */
126         int p_m_echo, p_m_conf;                 /* remote echo, conference number */
127         int p_m_tone;                           /* current kernel space tone */
128         int p_m_rxoff;                          /* rx from driver is disabled */
129 //      int p_m_nodata;                         /* all parties within a conf are isdn ports, so pure bridging is possible */
130         int p_m_txdata;                         /* get what we transmit */
131         int p_m_dtmf;                           /* dtmf decoding is enabled */
132         int p_m_joindata;                       /* the call requires data due to no briging capability */
133
134         int p_m_load;                           /* current data in dsp tx buffer */
135         unsigned long p_m_last_tv_sec;          /* time stamp of last handler call, (to sync audio data */
136         unsigned long p_m_last_tv_msec;
137 //      int p_m_fromup_buffer_readp;            /* buffer for audio from remote endpoint */
138 //      int p_m_fromup_buffer_writep;
139 //      unsigned char p_m_fromup_buffer[FROMUP_BUFFER_SIZE];
140         void txfromup(unsigned char *data, int length);
141
142         int p_m_crypt;                          /* encryption is enabled */
143         int p_m_crypt_msg_loops;                /* sending a message */
144         int p_m_crypt_msg_len;
145         unsigned char p_m_crypt_msg[1100];
146         int p_m_crypt_msg_current;
147         unsigned char p_m_crypt_key[128];
148         int p_m_crypt_key_len;
149         int p_m_crypt_listen;
150         int p_m_crypt_listen_state;
151         int p_m_crypt_listen_len;
152         unsigned char p_m_crypt_listen_msg[1100];
153         unsigned long p_m_crypt_listen_crc;
154         void cryptman_listen_bch(unsigned char *p, int l);
155
156         void set_tone(char *dir, char *name);
157         void set_echotest(int echotest);
158
159         int p_m_portnum;                        /* used port number (1...n) */
160         int p_m_b_index;                        /* index 0,1 0..29 */
161         int p_m_b_channel;                      /* number 1,2 1..15,17... */
162         int p_m_b_exclusive;                    /* if bchannel is exclusive */
163         int p_m_b_reserve;                      /* set if channel is reserved */
164 //      long long p_m_jittercheck;              /* time of audio data */
165 //      long long p_m_jitterdropped;            /* number of bytes dropped */
166         int p_m_delete;                         /* true if obj. must del. */
167         int p_m_hold;                           /* if port is on hold */
168         unsigned long p_m_timeout;              /* timeout of timers */
169         time_t p_m_timer;                       /* start of timer */
170         unsigned char p_m_remote_ref;           /* join to export bchannel to */
171         unsigned char p_m_remote_id;            /* sock to export bchannel to */
172
173         int seize_bchannel(int channel, int exclusive); /* requests / reserves / links bchannels, but does not open it! */
174         void drop_bchannel(void);
175 };
176
177 extern unsigned char mISDN_rand[256]; /* noisy randomizer */
178