iax2.h 10.6 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/*
 * Asterisk -- A telephony toolkit for Linux.
 *
 * Implementation of Inter-Asterisk eXchange
 * 
 * Copyright (C) 2003, Digium
 *
 * Mark Spencer <markster@linux-support.net>
 *
 * This program is free software, distributed under the terms of
 * the GNU Lesser (Library) General Public License
 */
 
#ifndef _IAX2_H
#define _IAX2_H

/* Max version of IAX protocol we support */
#define IAX_PROTO_VERSION 2

#define IAX_MAX_CALLS 32768

#define IAX_FLAG_FULL		0x8000

#define IAX_FLAG_RETRANS	0x8000

#define IAX_FLAG_SC_LOG		0x80

#define IAX_MAX_SHIFT		0x1F

#define IAX_WINDOW			64

/* Subclass for AST_FRAME_IAX */
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#define IAX_COMMAND_NEW         1       /** Initiate a new call */
#define IAX_COMMAND_PING        2       /** Ping request */
#define IAX_COMMAND_PONG        3       /** Ping or poke reply */
#define IAX_COMMAND_ACK         4       /** Explicit acknowledgment */
#define IAX_COMMAND_HANGUP      5       /** Initiate call teardown */
#define IAX_COMMAND_REJECT      6       /** Reject a call */
#define IAX_COMMAND_ACCEPT      7       /** Accept a call */
#define IAX_COMMAND_AUTHREQ     8       /** Authentication request */
#define IAX_COMMAND_AUTHREP     9       /** Authentication reply */
#define IAX_COMMAND_INVAL       10      /** Invalid message */
#define IAX_COMMAND_LAGRQ       11      /** Lag request */
#define IAX_COMMAND_LAGRP       12      /** Lag reply */
#define IAX_COMMAND_REGREQ      13	/** Registration request */
#define IAX_COMMAND_REGAUTH     14	/** Registration authentication required */
#define IAX_COMMAND_REGACK      15	/** Registration accepted */
#define IAX_COMMAND_REGREJ      16	/** Registration rejected */
#define IAX_COMMAND_REGREL      17	/** Force release of registration */
#define IAX_COMMAND_VNAK        18	/** If we receive voice before valid first voice frame, send this */
#define IAX_COMMAND_DPREQ       19	/** Request status of a dialplan entry */
#define IAX_COMMAND_DPREP       20	/** Request status of a dialplan entry */
#define IAX_COMMAND_DIAL        21	/** Request a dial on channel brought up TBD */
#define IAX_COMMAND_TXREQ       22	/** Transfer Request */
#define IAX_COMMAND_TXCNT       23	/** Transfer Connect */
#define IAX_COMMAND_TXACC       24	/** Transfer Accepted */
#define IAX_COMMAND_TXREADY     25	/** Transfer ready */
#define IAX_COMMAND_TXREL       26	/** Transfer release */
#define IAX_COMMAND_TXREJ       27	/** Transfer reject */
#define IAX_COMMAND_QUELCH      28	/** Stop audio/video transmission */
#define IAX_COMMAND_UNQUELCH    29	/** Resume audio/video transmission */
#define IAX_COMMAND_POKE        30      /** Like ping, but does not require an open connection */
#define IAX_COMMAND_PAGE        31	/** Paging description */
#define IAX_COMMAND_MWI         32	/** Stand-alone message waiting indicator */
#define IAX_COMMAND_UNSUPPORT   33	/** Unsupported message received */
#define IAX_COMMAND_TRANSFER    34	/** Request remote transfer */
#define IAX_COMMAND_PROVISION   35	/** Provision an IAX2 device */
#define IAX_COMMAND_FWDOWNL     36      /** Download firmware request */
#define IAX_COMMAND_FWDATA      37      /** Transmit firmware data */

#define IAX_DEFAULT_REG_EXPIRE  60	/** By default require re-registration once per minute */

#define IAX_LINGER_TIMEOUT		10 /** How long to wait before closing bridged call */
74
75
76
77

#define IAX_DEFAULT_PORTNO		4569

/* IAX Information elements */
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#define IAX_IE_CALLED_NUMBER            1  /** Number/extension being called - string */
#define IAX_IE_CALLING_NUMBER           2  /** Calling number - string */
#define IAX_IE_CALLING_ANI              3  /** Calling number ANI for billing  - string */
#define IAX_IE_CALLING_NAME             4  /** Name of caller - string */
#define IAX_IE_CALLED_CONTEXT           5  /** Context for number - string */
#define IAX_IE_USERNAME                 6  /** Username (peer or user) for authentication - string */
#define IAX_IE_PASSWORD                 7  /** Password for authentication - string */
#define IAX_IE_CAPABILITY               8  /** Actual codec capability - unsigned int */
#define IAX_IE_FORMAT                   9  /** Desired codec format - unsigned int */
#define IAX_IE_LANGUAGE                 10 /** Desired language - string */
#define IAX_IE_VERSION                  11 /** Protocol version - short */
#define IAX_IE_ADSICPE                  12 /** CPE ADSI capability - short */
#define IAX_IE_DNID                     13 /** Originally dialed DNID - string */
#define IAX_IE_AUTHMETHODS              14 /** Authentication method(s) - short */
#define IAX_IE_CHALLENGE                15 /** Challenge data for MD5/RSA - string */
#define IAX_IE_MD5_RESULT               16 /** MD5 challenge result - string */
#define IAX_IE_RSA_RESULT               17 /** RSA challenge result - string */
#define IAX_IE_APPARENT_ADDR            18 /** Apparent address of peer - struct sockaddr_in */
#define IAX_IE_REFRESH                  19 /** When to refresh registration - short */
#define IAX_IE_DPSTATUS                 20 /** Dialplan status - short */
#define IAX_IE_CALLNO                   21 /** Call number of peer - short */
#define IAX_IE_CAUSE                    22 /** Cause - string */
#define IAX_IE_IAX_UNKNOWN              23 /** Unknown IAX command - byte */
#define IAX_IE_MSGCOUNT                 24 /** How many messages waiting - short */
#define IAX_IE_AUTOANSWER               25 /** Request auto-answering -- none */
#define IAX_IE_MUSICONHOLD              26 /** Request musiconhold with QUELCH -- none or string */
#define IAX_IE_TRANSFERID               27 /** Transfer Request Identifier -- int */
#define IAX_IE_RDNIS                    28 /** Referring DNIS -- string */
#define IAX_IE_PROVISIONING             29 /** Provisioning info */
#define IAX_IE_AESPROVISIONING          30 /** AES Provisioning info */
#define IAX_IE_DATETIME                 31 /** Date/Time */
#define IAX_IE_DEVICETYPE               32 /** Device Type -- string */
#define IAX_IE_SERVICEIDENT             33 /** Service Identifier -- string */
#define IAX_IE_FIRMWAREVER              34 /** Firmware revision -- u16 */
#define IAX_IE_FWBLOCKDESC              35 /** Firmware block description -- u32 */
#define IAX_IE_FWBLOCKDATA              36 /** Firmware block of data -- raw */
#define IAX_IE_PROVVER                  37 /** Provisioning Version (u32) */
#define IAX_IE_CALLINGPRES              38 /** Calling presentation (u8) */
#define IAX_IE_CALLINGTON               39 /** Calling type of number (u8) */
#define IAX_IE_CALLINGTNS               40 /** Calling transit network select (u16) */
#define IAX_IE_SAMPLINGRATE             41 /** Supported sampling rates (u16) */
#define IAX_IE_CAUSECODE                42 /** Hangup cause (u8) */
#define IAX_IE_ENCRYPTION               43 /** Encryption format (u16) */
#define IAX_IE_ENCKEY                   44 /** Encryption key (raw) */
#define IAX_IE_CODEC_PREFS              45 /** Codec Negotiation */
#define IAX_IE_RR_JITTER                46 /** Received jitter (as in RFC1889) u32 */
#define IAX_IE_RR_LOSS                  47 /** Received loss (high byte loss pct, low 24 bits loss count, as in rfc1889 */
#define IAX_IE_RR_PKTS                  48 /** Received frames (total frames received) u32 */
#define IAX_IE_RR_DELAY                 49 /** Max playout delay for received frames (in ms) u16 */
#define IAX_IE_RR_DROPPED               50 /** Dropped frames (presumably by jitterbuf) u32 */
#define IAX_IE_RR_OOO                   51 /** Frames received Out of Order u32 */
129
130
131
132
133
134
135



#define IAX_AUTH_PLAINTEXT			(1 << 0)
#define IAX_AUTH_MD5				(1 << 1)
#define IAX_AUTH_RSA				(1 << 2)

136
137
#define IAX_META_TRUNK				1		/** Trunk meta-message */
#define IAX_META_VIDEO				2		/** Video frame */
138

139
140
141
142
143
144
#define IAX_RATE_8KHZ                          (1 << 0) /** 8khz sampling (default if absent) */
#define IAX_RATE_11KHZ                         (1 << 1) /** 11.025khz sampling */
#define IAX_RATE_16KHZ                         (1 << 2) /** 16khz sampling */
#define IAX_RATE_22KHZ                         (1 << 3) /** 22.05khz sampling */
#define IAX_RATE_44KHZ                         (1 << 4) /** 44.1khz sampling */
#define IAX_RATE_48KHZ                         (1 << 5) /** 48khz sampling */
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160

#define IAX_DPSTATUS_EXISTS			(1 << 0)
#define IAX_DPSTATUS_CANEXIST		(1 << 1)
#define IAX_DPSTATUS_NONEXISTANT	(1 << 2)
#define IAX_DPSTATUS_IGNOREPAT		(1 << 14)
#define IAX_DPSTATUS_MATCHMORE		(1 << 15)

#if defined(_MSC_VER)
#pragma pack(push,1)
#define __PACKED
#else
#define __PACKED __attribute__ ((__packed__))
#endif

/* Full frames are always delivered reliably */
struct ast_iax2_full_hdr {
161
162
163
164
165
166
167
	unsigned short scallno;	/** Source call number -- high bit must be 1 */
	unsigned short dcallno;	/** Destination call number -- high bit is 1 if retransmission */
	unsigned int ts;		/** 32-bit timestamp in milliseconds (from 1st transmission) */
	unsigned char oseqno;	/** Packet number (outgoing) */
	unsigned char iseqno;	/** Packet number (next incoming expected) */
	char type;				/** Frame type */
	unsigned char csub;		/** Compressed subclass */
168
169
170
171
172
	unsigned char iedata[0];
} __PACKED;

/* Mini header is used only for voice frames -- delivered unreliably */
struct ast_iax2_mini_hdr {
173
174
175
176
	unsigned short callno;	/** Source call number -- high bit must be 0, rest must be non-zero */
	unsigned short ts;	/** 16-bit Timestamp (high 16 bits from last ast_iax2_full_hdr) */
				/** Frametype implicitly VOICE_FRAME */
				/** subclass implicit from last ast_iax2_full_hdr */
177
178
179
180
	unsigned char data[0];
} __PACKED;

struct ast_iax2_meta_hdr {
181
182
183
	unsigned short zeros;			/** Zeros field -- must be zero */
	unsigned char metacmd;			/** Meta command */
	unsigned char cmddata;			/** Command Data */
184
185
186
187
	unsigned char data[0];
} __PACKED;

struct ast_iax2_video_hdr {
188
189
190
	unsigned short zeros;			/** Zeros field -- must be zero */
	unsigned short callno;			/** Video call number */
	unsigned short ts;			/** Timestamp and mark if present */
191
192
193
194
	unsigned char data[0];
} __PACKED;

struct ast_iax2_meta_trunk_hdr {
195
	unsigned int ts;			/** 32-bit timestamp for all messages */
196
197
198
199
	unsigned char data[0];
} __PACKED;

struct ast_iax2_meta_trunk_entry {
200
201
	unsigned short callno;			/** Call number */
	unsigned short len;			/** Length of data for this callno */
202
203
204
205
206
} __PACKED;

#define IAX_FIRMWARE_MAGIC 0x69617879

struct ast_iax2_firmware_header {
207
208
209
210
211
       unsigned int magic;             /** Magic number */
       unsigned short version;         /** Software version */
       unsigned char devname[16];      /** Device */
       unsigned int datalen;           /** Data length of file beyond header */
       unsigned char chksum[16];       /** Checksum of all data */
212
213
214
215
216
217
218
219
220
221
222
       unsigned char data[0];
} __PACKED;


#if defined(_MSC_VER)
#pragma pack(pop)
#endif

#undef __PACKED

#endif