1798b883da671b4704b999285d96fd676a29cd18
[lcr.git] / mISDN.h
1 /*****************************************************************************\
2 **                                                                           **
3 ** PBX4Linux                                                                 **
4 **                                                                           **
5 **---------------------------------------------------------------------------**
6 ** Copyright: Andreas Eversberg                                              **
7 **                                                                           **
8 ** mISDN-port header file                                                    **
9 **                                                                           **
10 \*****************************************************************************/ 
11
12 enum {
13         B_STATE_IDLE,
14         B_STATE_ACTIVATING,
15         B_STATE_ACTIVE,
16         B_STATE_DEACTIVATING,
17 };
18
19 enum {
20         B_EVENT_ACTIVATE,
21         B_EVENT_ACTIVATED,
22         B_EVENT_DEACTIVATE,
23         B_EVENT_DEACTIVATED,
24 };
25
26 #define FROMUP_BUFFER_SIZE 1024
27 #define FROMUP_BUFFER_MASK 1023
28
29 extern int entity;
30 extern int mISDNdevice;
31
32 /* mISDN port structure list */
33 struct mISDNport {
34         net_stack_t nst; /* MUST be the first entry, so &nst equals &mISDNlist */
35         manager_t mgr;
36         struct mISDNport *next;
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 */
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 //      time_t l1timeout; /* timout when establishing link */
45         time_t l2establish; /* time until establishing after link failure */
46         int use; /* counts the number of port that uses this port */
47         int ntmode; /* is TRUE if port is nt mode */
48         int pri; /* is TRUE if port is a primary rate interface */
49         int is_tones; /* TRUE if tones are sent outside connect state */
50         int is_earlyb; /* TRUE if tones are received outside connect state */
51         int upper_id; /* id to transfer data down */
52         int lower_id; /* id to transfer data up */
53         int d_stid;
54         int b_num; /* number of bchannels */
55         int b_reserved; /* number of bchannels reserved or in use */
56         class PmISDN *b_port[128]; /* maximum number of ports shall be 128 due to S0 / E1 / special E1 */
57         int b_stid[128];
58         int b_addr[128];
59         int b_state[128]; /* state 0 = IDLE */
60         int procids[128]; /* keep track of free ids */
61         msg_queue_t downqueue;          /* l4->l3 */
62 };
63 extern mISDNport *mISDNport_first;
64
65 /*
66
67    notes on bchannels:
68
69 if a b-channel is in use, the b_port[channel] is linked to the port using it.
70 also each used b-channel counts b_inuse.
71 to assign a bchannel, that is not jet defined due to remote channel assignment,
72 the b_inuse is also increased to reserve channel
73
74 'use' is the number of port instances using this mISDNport. this counts also
75 calls with no bchannel (call waiting, call on hold).
76
77 */
78
79
80 /* mISDN none-object functions */
81 void mISDN_port_info(void);
82 struct mISDNport *mISDNport_open(int port, int ptp, int ptmp);
83 void mISDNport_close_all(void);
84 void mISDNport_close(struct mISDNport *mISDNport);
85 void mISDN_port_reorder(void);
86 int mISDN_handler(void);
87 void enc_ie_cause_standalone(unsigned char **ntmode, msg_t *msg, int location, int cause);
88 void ph_control(struct mISDNport *mISDNport, class PmISDN *isdnport, unsigned long b_addr, int c1, int c2, char *trace_name, int trace_value);
89 void ph_control_block(struct mISDNport *mISDNport, unsigned long b_addr, int c1, void *c2, int c2_len, char *trace_name, int trace_value);
90 msg_t *create_l2msg(int prim, int dinfo, int size);
91 void setup_queue(struct mISDNport *mISDNport, int link);
92 int stack2manager_nt(void *dat, void *arg);
93 int stack2manager_te(struct mISDNport *mISDNport, msg_t *msg);
94 void chan_trace_header(struct mISDNport *mISDNport, class PmISDN *port, char *msgtext, int direction);
95 void l1l2l3_trace_header(struct mISDNport *mISDNport, class PmISDN *port, unsigned long prim, int direction);
96 void bchannel_event(struct mISDNport *mISDNport, int i, int event);
97
98
99 /* mISDN port classes */
100 class PmISDN : public Port
101 {
102         public:
103         PmISDN(int type, struct mISDNport *mISDNport, char *portname, struct port_settings *settings, int channel, int exclusive);
104         ~PmISDN();
105         void bchannel_receive(iframe_t *frm);
106         int handler(void);
107         void transmit(unsigned char *buffer, int length);
108         int message_epoint(unsigned long epoint_id, int message, union parameter *param);
109         void message_mISDNsignal(unsigned long epoint_id, int message_id, union parameter *param);
110         void message_crypt(unsigned long epoint_id, int message_id, union parameter *param);
111         struct mISDNport *p_m_mISDNport;        /* pointer to port */
112         int p_m_delay;                          /* use delay instead of dejitter */
113         int p_m_txvol, p_m_rxvol;               /* volume shift (0 = no change) */
114         int p_m_echo, p_m_conf;                 /* remote echo, conference number */
115         int p_m_tone;                           /* current kernel space tone */
116         int p_m_rxoff;                          /* rx from driver is disabled */
117 //      int p_m_nodata;                         /* all parties within a conf are isdn ports, so pure bridging is possible */
118         int p_m_txdata;                         /* get what we transmit */
119         int p_m_dtmf;                           /* dtmf decoding is enabled */
120         int p_m_calldata;                       /* the call requires data due to no briging capability */
121
122         int p_m_fromup_buffer_readp;            /* buffer for audio from remote endpoint */
123         int p_m_fromup_buffer_writep;
124         unsigned char p_m_fromup_buffer[FROMUP_BUFFER_SIZE];
125         void txfromup(unsigned char *data, int length);
126
127         int p_m_crypt;                          /* encryption is enabled */
128         int p_m_crypt_msg_loops;                /* sending a message */
129         int p_m_crypt_msg_len;
130         unsigned char p_m_crypt_msg[1100];
131         int p_m_crypt_msg_current;
132         unsigned char p_m_crypt_key[128];
133         int p_m_crypt_key_len;
134         int p_m_crypt_listen;
135         int p_m_crypt_listen_state;
136         int p_m_crypt_listen_len;
137         unsigned char p_m_crypt_listen_msg[1100];
138         unsigned long p_m_crypt_listen_crc;
139         void cryptman_listen_bch(unsigned char *p, int l);
140
141         void set_tone(char *dir, char *name);
142         void set_echotest(int echotest);
143
144         int p_m_portnum;                        /* used port number (1...n) */
145         int p_m_b_index;                        /* index 0,1 0..29 */
146         int p_m_b_channel;                      /* number 1,2 1..15,17... */
147         int p_m_b_exclusive;                    /* if bchannel is exclusive */
148         int p_m_b_reserve;                      /* set if channel is reserved */
149         long long p_m_jittercheck;              /* time of audio data */
150         long long p_m_jitterdropped;            /* number of bytes dropped */
151         int p_m_delete;                         /* true if obj. must del. */
152         int p_m_hold;                           /* if port is on hold */
153         unsigned long p_m_timeout;              /* timeout of timers */
154         time_t p_m_timer;                       /* start of timer */
155
156         int seize_bchannel(int channel, int exclusive); /* requests / reserves / links bchannels, but does not open it! */
157         void drop_bchannel(void);
158 };
159
160 extern unsigned char mISDN_rand[256]; /* noisy randomizer */
161