chan_iax2: Fix compile error.
[asterisk/asterisk.git] / channels / iax2 / include / parser.h
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Implementation of Inter-Asterisk eXchange
5  * 
6  * Copyright (C) 2003, Digium
7  *
8  * Mark Spencer <markster@digium.com>
9  *
10  * This program is free software, distributed under the terms of
11  * the GNU General Public License
12  */
13
14 /*!\file
15  * \brief Implementation of the IAX2 protocol
16  */
17  
18 #ifndef _IAX2_PARSER_H
19 #define _IAX2_PARSER_H
20
21 #include "asterisk/frame.h"
22 #include "asterisk/linkedlists.h"
23 #include "asterisk/crypto.h"
24 #include "asterisk/netsock2.h"
25 #include "iax2.h"
26
27 struct iax_ies {
28         char *called_number;
29         char *calling_number;
30         char *calling_ani;
31         char *calling_name;
32         int calling_ton;
33         int calling_tns;
34         int calling_pres;
35         char *called_context;
36         char *username;
37         char *password;
38         iax2_format capability;
39         iax2_format format;
40         char *codec_prefs;
41         char *language;
42         int version;
43         unsigned short adsicpe;
44         char *dnid;
45         char *rdnis;
46         unsigned int authmethods;
47         unsigned int encmethods;
48         char *challenge;
49         char *md5_result;
50         char *rsa_result;
51         struct ast_sockaddr apparent_addr;
52         unsigned short refresh;
53         unsigned short dpstatus;
54         unsigned short callno;
55         char *cause;
56         unsigned char causecode;
57         unsigned char iax_unknown;
58         int msgcount;
59         int autoanswer;
60         int musiconhold;
61         unsigned int transferid;
62         unsigned int datetime;
63         char *devicetype;
64         char *serviceident;
65         int firmwarever;
66         unsigned int fwdesc;
67         unsigned char *fwdata;
68         unsigned char fwdatalen;
69         unsigned char *enckey;
70         unsigned char enckeylen;
71         unsigned int provver;
72         unsigned short samprate;
73         int provverpres;
74         unsigned int rr_jitter;
75         unsigned int rr_loss;
76         unsigned int rr_pkts;
77         unsigned short rr_delay;
78         unsigned int rr_dropped;
79         unsigned int rr_ooo;
80         struct ast_variable *vars;
81         char *osptokenblock[IAX_MAX_OSPBLOCK_NUM];
82         unsigned int ospblocklength[IAX_MAX_OSPBLOCK_NUM];
83         unsigned char calltoken;
84         unsigned char *calltokendata;
85 };
86
87 #define DIRECTION_INGRESS 1
88 #define DIRECTION_OUTGRESS 2
89
90 struct iax_frame {
91 #ifdef LIBIAX
92         struct iax_session *session;
93         struct iax_event *event;
94 #else
95         int sockfd;
96 #endif
97
98         /*! /Our/ call number */
99         unsigned short callno;
100         /*! /Their/ call number */
101         unsigned short dcallno;
102         /*! Start of raw frame (outgoing only) */
103         void *data;
104         /*! Length of frame (outgoing only) */
105         int datalen;
106         /*! How many retries so far? */
107         int retries;
108         /*! Outgoing relative timestamp (ms) */
109         unsigned int ts;
110         /*! How long to wait before retrying */
111         int retrytime;
112         /*! Are we received out of order?  */
113         unsigned int outoforder:1;
114         /*! Have we been sent at all yet? */
115         unsigned int sentyet:1;
116         /*! Non-zero if should be sent to transfer peer */
117         unsigned int transfer:1;
118         /*! Non-zero if this is the final message */
119         unsigned int final:1;
120         /*! Ingress or outgres */
121         unsigned int direction:2;
122         /*! Can this frame be cached? */
123         unsigned int cacheable:1;
124         /*! Outgoing Packet sequence number */
125         int oseqno;
126         /*! Next expected incoming packet sequence number */
127         int iseqno;
128         /*! Retransmission ID */
129         int retrans;
130         /*! is this packet encrypted or not. if set this varible holds encryption methods*/
131         int encmethods;
132         /*! store encrypt key */
133         ast_aes_encrypt_key ecx;
134         /*! store decrypt key which corresponds to ecx */
135         ast_aes_decrypt_key mydcx;
136         /*! random data for encryption pad */
137         unsigned char semirand[32];
138         /*! Easy linking */
139         AST_LIST_ENTRY(iax_frame) list;
140         /*! Actual, isolated frame header */
141         struct ast_frame af;
142         /*! Amount of space _allocated_ for data */
143         size_t afdatalen;
144         unsigned char unused[AST_FRIENDLY_OFFSET];
145         unsigned char afdata[0];        /* Data for frame */
146 };
147
148 struct iax_ie_data {
149         unsigned char buf[1024];
150         int pos;
151 };
152
153 /* Choose a different function for output */
154 void iax_set_output(void (*output)(const char *data));
155 /* Choose a different function for errors */
156 void iax_set_error(void (*output)(const char *data));
157 void iax_showframe(struct iax_frame *f, struct ast_iax2_full_hdr *fhi, int rx, struct ast_sockaddr *addr, int datalen);
158 void iax_frame_subclass2str(enum iax_frame_subclass subclass, char *str, size_t len);
159
160 const char *iax_ie2str(int ie);
161
162 int iax_ie_append_raw(struct iax_ie_data *ied, unsigned char ie, const void *data, int datalen);
163 int iax_ie_append_addr(struct iax_ie_data *ied, unsigned char ie, const struct ast_sockaddr *addr);
164 int iax_ie_append_versioned_uint64(struct iax_ie_data *ied, unsigned char ie, unsigned char version, uint64_t value);
165 int iax_ie_append_int(struct iax_ie_data *ied, unsigned char ie, unsigned int value);
166 int iax_ie_append_short(struct iax_ie_data *ied, unsigned char ie, unsigned short value);
167 int iax_ie_append_str(struct iax_ie_data *ied, unsigned char ie, const char *str);
168 int iax_ie_append_byte(struct iax_ie_data *ied, unsigned char ie, unsigned char dat);
169 int iax_ie_append(struct iax_ie_data *ied, unsigned char ie);
170 int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen);
171
172 int iax_get_frames(void);
173 int iax_get_iframes(void);
174 int iax_get_oframes(void);
175
176 void iax_frame_wrap(struct iax_frame *fr, struct ast_frame *f);
177 struct iax_frame *iax_frame_new(int direction, int datalen, unsigned int cacheable);
178 void iax_frame_free(struct iax_frame *fr);
179 #endif