Merged revisions 55954 via svnmerge from
[asterisk/asterisk.git] / channels / iax2.h
1 /*
2  * Asterisk -- A telephony toolkit for Linux.
3  *
4  * Implementation of Inter-Asterisk eXchange
5  * 
6  * Copyright (C) 2003, Digium
7  *
8  * Mark Spencer <markster@linux-support.net>
9  *
10  * This program is free software, distributed under the terms of
11  * the GNU General Public License
12  */
13  
14 #ifndef _IAX2_H
15 #define _IAX2_H
16
17 /* Max version of IAX protocol we support */
18 #define IAX_PROTO_VERSION 2
19
20 #define IAX_MAX_CALLS 32768
21
22 #define IAX_FLAG_FULL           0x8000
23
24 #define IAX_FLAG_RETRANS        0x8000
25
26 #define IAX_FLAG_SC_LOG         0x80
27
28 #define IAX_MAX_SHIFT           0x1F
29
30 #define IAX_WINDOW                      64
31
32 /* Subclass for AST_FRAME_IAX */
33 #define IAX_COMMAND_NEW         1
34 #define IAX_COMMAND_PING        2
35 #define IAX_COMMAND_PONG        3
36 #define IAX_COMMAND_ACK         4
37 #define IAX_COMMAND_HANGUP      5
38 #define IAX_COMMAND_REJECT      6
39 #define IAX_COMMAND_ACCEPT      7
40 #define IAX_COMMAND_AUTHREQ     8
41 #define IAX_COMMAND_AUTHREP     9
42 #define IAX_COMMAND_INVAL       10
43 #define IAX_COMMAND_LAGRQ       11
44 #define IAX_COMMAND_LAGRP       12
45 #define IAX_COMMAND_REGREQ      13      /* Registration request */
46 #define IAX_COMMAND_REGAUTH     14      /* Registration authentication required */
47 #define IAX_COMMAND_REGACK      15      /* Registration accepted */
48 #define IAX_COMMAND_REGREJ      16      /* Registration rejected */
49 #define IAX_COMMAND_REGREL      17      /* Force release of registration */
50 #define IAX_COMMAND_VNAK        18      /* If we receive voice before valid first voice frame, send this */
51 #define IAX_COMMAND_DPREQ       19      /* Request status of a dialplan entry */
52 #define IAX_COMMAND_DPREP       20      /* Request status of a dialplan entry */
53 #define IAX_COMMAND_DIAL        21      /* Request a dial on channel brought up TBD */
54 #define IAX_COMMAND_TXREQ       22      /* Transfer Request */
55 #define IAX_COMMAND_TXCNT       23      /* Transfer Connect */
56 #define IAX_COMMAND_TXACC       24      /* Transfer Accepted */
57 #define IAX_COMMAND_TXREADY     25      /* Transfer ready */
58 #define IAX_COMMAND_TXREL       26      /* Transfer release */
59 #define IAX_COMMAND_TXREJ       27      /* Transfer reject */
60 #define IAX_COMMAND_QUELCH      28      /* Stop audio/video transmission */
61 #define IAX_COMMAND_UNQUELCH 29 /* Resume audio/video transmission */
62 #define IAX_COMMAND_POKE    30  /* Like ping, but does not require an open connection */
63 #define IAX_COMMAND_PAGE        31      /* Paging description */
64 #define IAX_COMMAND_MWI 32      /* Stand-alone message waiting indicator */
65 #define IAX_COMMAND_UNSUPPORT   33      /* Unsupported message received */
66 #define IAX_COMMAND_TRANSFER    34      /* Request remote transfer */
67 #define IAX_COMMAND_PROVISION   35      /* Provision device */
68 #define IAX_COMMAND_FWDOWNL     36      /* Download firmware */
69 #define IAX_COMMAND_FWDATA      37      /* Firmware Data */
70 #define IAX_COMMAND_TXMEDIA 38  /* Transfer media only */
71
72 #define IAX_DEFAULT_REG_EXPIRE  60      /* By default require re-registration once per minute */
73
74 #define IAX_LINGER_TIMEOUT              10 /* How long to wait before closing bridged call */
75
76 #define IAX_DEFAULT_PORTNO              4569
77
78 /* IAX Information elements */
79 #define IAX_IE_CALLED_NUMBER            1               /* Number/extension being called - string */
80 #define IAX_IE_CALLING_NUMBER           2               /* Calling number - string */
81 #define IAX_IE_CALLING_ANI                      3               /* Calling number ANI for billing  - string */
82 #define IAX_IE_CALLING_NAME                     4               /* Name of caller - string */
83 #define IAX_IE_CALLED_CONTEXT           5               /* Context for number - string */
84 #define IAX_IE_USERNAME                         6               /* Username (peer or user) for authentication - string */
85 #define IAX_IE_PASSWORD                         7               /* Password for authentication - string */
86 #define IAX_IE_CAPABILITY                       8               /* Actual codec capability - unsigned int */
87 #define IAX_IE_FORMAT                           9               /* Desired codec format - unsigned int */
88 #define IAX_IE_LANGUAGE                         10              /* Desired language - string */
89 #define IAX_IE_VERSION                          11              /* Protocol version - short */
90 #define IAX_IE_ADSICPE                          12              /* CPE ADSI capability - short */
91 #define IAX_IE_DNID                                     13              /* Originally dialed DNID - string */
92 #define IAX_IE_AUTHMETHODS                      14              /* Authentication method(s) - short */
93 #define IAX_IE_CHALLENGE                        15              /* Challenge data for MD5/RSA - string */
94 #define IAX_IE_MD5_RESULT                       16              /* MD5 challenge result - string */
95 #define IAX_IE_RSA_RESULT                       17              /* RSA challenge result - string */
96 #define IAX_IE_APPARENT_ADDR            18              /* Apparent address of peer - struct sockaddr_in */
97 #define IAX_IE_REFRESH                          19              /* When to refresh registration - short */
98 #define IAX_IE_DPSTATUS                         20              /* Dialplan status - short */
99 #define IAX_IE_CALLNO                           21              /* Call number of peer - short */
100 #define IAX_IE_CAUSE                            22              /* Cause - string */
101 #define IAX_IE_IAX_UNKNOWN                      23              /* Unknown IAX command - byte */
102 #define IAX_IE_MSGCOUNT                         24              /* How many messages waiting - short */
103 #define IAX_IE_AUTOANSWER                       25              /* Request auto-answering -- none */
104 #define IAX_IE_MUSICONHOLD                      26              /* Request musiconhold with QUELCH -- none or string */
105 #define IAX_IE_TRANSFERID                       27              /* Transfer Request Identifier -- int */
106 #define IAX_IE_RDNIS                            28              /* Referring DNIS -- string */
107 #define IAX_IE_PROVISIONING                     29              /* Provisioning info */
108 #define IAX_IE_AESPROVISIONING          30              /* AES Provisioning info */
109 #define IAX_IE_DATETIME                         31              /* Date/Time */
110 #define IAX_IE_DEVICETYPE                       32              /* Device Type -- string */
111 #define IAX_IE_SERVICEIDENT                     33              /* Service Identifier -- string */
112 #define IAX_IE_FIRMWAREVER                      34              /* Firmware revision -- u16 */
113 #define IAX_IE_FWBLOCKDESC                      35              /* Firmware block description -- u32 */
114 #define IAX_IE_FWBLOCKDATA                      36              /* Firmware block of data -- raw */
115 #define IAX_IE_PROVVER                          37              /* Provisioning Version (u32) */
116 #define IAX_IE_CALLINGPRES                      38              /* Calling presentation (u8) */
117 #define IAX_IE_CALLINGTON                       39              /* Calling type of number (u8) */
118 #define IAX_IE_CALLINGTNS                       40              /* Calling transit network select (u16) */
119 #define IAX_IE_SAMPLINGRATE                     41              /* Supported sampling rates (u16) */
120 #define IAX_IE_CAUSECODE                        42              /* Hangup cause (u8) */
121 #define IAX_IE_ENCRYPTION                       43              /* Encryption format (u16) */
122 #define IAX_IE_ENCKEY                           44              /* Encryption key (raw) */
123 #define IAX_IE_CODEC_PREFS          45      /* Codec Negotiation */
124
125 #define IAX_IE_RR_JITTER                        46              /* Received jitter (as in RFC1889) u32 */
126 #define IAX_IE_RR_LOSS                          47              /* Received loss (high byte loss pct, low 24 bits loss count, as in rfc1889 */
127 #define IAX_IE_RR_PKTS                          48              /* Received frames (total frames received) u32 */
128 #define IAX_IE_RR_DELAY                         49              /* Max playout delay for received frames (in ms) u16 */
129 #define IAX_IE_RR_DROPPED                       50              /* Dropped frames (presumably by jitterbuf) u32 */
130 #define IAX_IE_RR_OOO                           51              /* Frames received Out of Order u32 */
131 #define IAX_IE_VARIABLE                         52              /* Remote variables */
132
133
134 #define IAX_AUTH_PLAINTEXT                      (1 << 0)
135 #define IAX_AUTH_MD5                            (1 << 1)
136 #define IAX_AUTH_RSA                            (1 << 2)
137
138 #define IAX_ENCRYPT_AES128                      (1 << 0)
139
140 #define IAX_META_TRUNK                          1               /* Trunk meta-message */
141 #define IAX_META_VIDEO                          2               /* Video frame */
142
143 #define IAX_META_TRUNK_SUPERMINI                0       /* This trunk frame contains classic supermini frames */
144 #define IAX_META_TRUNK_MINI                     1       /* This trunk frame contains trunked mini frames */
145
146 #define IAX_RATE_8KHZ                           (1 << 0) /* 8khz sampling (default if absent) */
147 #define IAX_RATE_11KHZ                          (1 << 1) /* 11.025khz sampling */
148 #define IAX_RATE_16KHZ                          (1 << 2) /* 16khz sampling */
149 #define IAX_RATE_22KHZ                          (1 << 3) /* 22.05khz sampling */
150 #define IAX_RATE_44KHZ                          (1 << 4) /* 44.1khz sampling */
151 #define IAX_RATE_48KHZ                          (1 << 5) /* 48khz sampling */
152
153 #define IAX_DPSTATUS_EXISTS                     (1 << 0)
154 #define IAX_DPSTATUS_CANEXIST           (1 << 1)
155 #define IAX_DPSTATUS_NONEXISTENT        (1 << 2)
156 #define IAX_DPSTATUS_IGNOREPAT          (1 << 14)
157 #define IAX_DPSTATUS_MATCHMORE          (1 << 15)
158
159 /* Full frames are always delivered reliably */
160 struct ast_iax2_full_hdr {
161         unsigned short scallno; /* Source call number -- high bit must be 1 */
162         unsigned short dcallno; /* Destination call number -- high bit is 1 if retransmission */
163         unsigned int ts;                /* 32-bit timestamp in milliseconds (from 1st transmission) */
164         unsigned char oseqno;   /* Packet number (outgoing) */
165         unsigned char iseqno;   /* Packet number (next incoming expected) */
166         unsigned char type;             /* Frame type */
167         unsigned char csub;             /* Compressed subclass */
168         unsigned char iedata[0];
169 } __attribute__ ((__packed__));
170
171 /* Full frames are always delivered reliably */
172 struct ast_iax2_full_enc_hdr {
173         unsigned short scallno; /* Source call number -- high bit must be 1 */
174         unsigned short dcallno; /* Destination call number -- high bit is 1 if retransmission */
175         unsigned char encdata[0];
176 } __attribute__ ((__packed__));
177
178 /* Mini header is used only for voice frames -- delivered unreliably */
179 struct ast_iax2_mini_hdr {
180         unsigned short callno;  /* Source call number -- high bit must be 0, rest must be non-zero */
181         unsigned short ts;              /* 16-bit Timestamp (high 16 bits from last ast_iax2_full_hdr) */
182                                                         /* Frametype implicitly VOICE_FRAME */
183                                                         /* subclass implicit from last ast_iax2_full_hdr */
184         unsigned char data[0];
185 } __attribute__ ((__packed__));
186
187 /* Mini header is used only for voice frames -- delivered unreliably */
188 struct ast_iax2_mini_enc_hdr {
189         unsigned short callno;  /* Source call number -- high bit must be 0, rest must be non-zero */
190         unsigned char encdata[0];
191 } __attribute__ ((__packed__));
192
193 struct ast_iax2_meta_hdr {
194         unsigned short zeros;                   /* Zeros field -- must be zero */
195         unsigned char metacmd;                  /* Meta command */
196         unsigned char cmddata;                  /* Command Data */
197         unsigned char data[0];
198 } __attribute__ ((__packed__));
199
200 struct ast_iax2_video_hdr {
201         unsigned short zeros;                   /* Zeros field -- must be zero */
202         unsigned short callno;                  /* Video call number */
203         unsigned short ts;                              /* Timestamp and mark if present */
204         unsigned char data[0];
205 } __attribute__ ((__packed__));
206
207 struct ast_iax2_meta_trunk_hdr {
208         unsigned int ts;                                /* 32-bit timestamp for all messages */
209         unsigned char data[0];
210 } __attribute__ ((__packed__));
211
212 struct ast_iax2_meta_trunk_entry {
213         unsigned short callno;                  /* Call number */
214         unsigned short len;                             /* Length of data for this callno */
215 } __attribute__ ((__packed__));
216
217 /* When trunktimestamps are used, we use this format instead */
218 struct ast_iax2_meta_trunk_mini {
219         unsigned short len;
220         struct ast_iax2_mini_hdr mini;          /* this is an actual miniframe */
221 } __attribute__ ((__packed__));
222
223 #define IAX_FIRMWARE_MAGIC 0x69617879
224
225 struct ast_iax2_firmware_header {
226         unsigned int magic;             /* Magic number */
227         unsigned short version;         /* Software version */
228         unsigned char devname[16];      /* Device */
229         unsigned int datalen;           /* Data length of file beyond header */
230         unsigned char chksum[16];       /* Checksum of all data */
231         unsigned char data[0];
232 } __attribute__ ((__packed__));
233 #endif