2 * Asterisk -- An open source telephony toolkit.
4 * Implementation of Inter-Asterisk eXchange
6 * Copyright (C) 2003, Digium
8 * Mark Spencer <markster@digium.com>
10 * This program is free software, distributed under the terms of
11 * the GNU General Public License
15 * \brief Implementation of the IAX2 protocol
18 #ifndef _IAX2_PARSER_H
19 #define _IAX2_PARSER_H
21 #include "asterisk/frame.h"
22 #include "asterisk/linkedlists.h"
23 #include "asterisk/crypto.h"
24 #include "asterisk/netsock2.h"
38 iax2_format capability;
43 unsigned short adsicpe;
46 unsigned int authmethods;
47 unsigned int encmethods;
51 struct ast_sockaddr apparent_addr;
52 unsigned short refresh;
53 unsigned short dpstatus;
54 unsigned short callno;
56 unsigned char causecode;
57 unsigned char iax_unknown;
61 unsigned int transferid;
62 unsigned int datetime;
67 unsigned char *fwdata;
68 unsigned char fwdatalen;
69 unsigned char *enckey;
70 unsigned char enckeylen;
72 unsigned short samprate;
74 unsigned int rr_jitter;
77 unsigned short rr_delay;
78 unsigned int rr_dropped;
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;
87 #define DIRECTION_INGRESS 1
88 #define DIRECTION_OUTGRESS 2
92 struct iax_session *session;
93 struct iax_event *event;
98 /*! /Our/ call number */
99 unsigned short callno;
100 /*! /Their/ call number */
101 unsigned short dcallno;
102 /*! Start of raw frame (outgoing only) */
104 /*! Length of frame (outgoing only) */
106 /*! How many retries so far? */
108 /*! Outgoing relative timestamp (ms) */
110 /*! How long to wait before retrying */
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 */
126 /*! Next expected incoming packet sequence number */
128 /*! Retransmission ID */
130 /*! is this packet encrypted or not. if set this varible holds encryption methods*/
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];
139 AST_LIST_ENTRY(iax_frame) list;
140 /*! Actual, isolated frame header */
142 /*! Amount of space _allocated_ for data */
144 unsigned char unused[AST_FRIENDLY_OFFSET];
145 unsigned char afdata[0]; /* Data for frame */
149 unsigned char buf[1024];
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);
160 const char *iax_ie2str(int ie);
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);
172 int iax_get_frames(void);
173 int iax_get_iframes(void);
174 int iax_get_oframes(void);
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);