Merged revisions 136062 via svnmerge from
[asterisk/asterisk.git] / channels / iax2-parser.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@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/linkedlists.h"
22
23 struct iax_ies {
24         char *called_number;
25         char *calling_number;
26         char *calling_ani;
27         char *calling_name;
28         int calling_ton;
29         int calling_tns;
30         int calling_pres;
31         char *called_context;
32         char *username;
33         char *password;
34         unsigned int capability;
35         unsigned int format;
36         char *codec_prefs;
37         char *language;
38         int version;
39         unsigned short adsicpe;
40         char *dnid;
41         char *rdnis;
42         unsigned int authmethods;
43         unsigned int encmethods;
44         char *challenge;
45         char *md5_result;
46         char *rsa_result;
47         struct sockaddr_in *apparent_addr;
48         unsigned short refresh;
49         unsigned short dpstatus;
50         unsigned short callno;
51         char *cause;
52         unsigned char causecode;
53         unsigned char iax_unknown;
54         int msgcount;
55         int autoanswer;
56         int musiconhold;
57         unsigned int transferid;
58         unsigned int datetime;
59         char *devicetype;
60         char *serviceident;
61         int firmwarever;
62         unsigned int fwdesc;
63         unsigned char *fwdata;
64         unsigned char fwdatalen;
65         unsigned char *enckey;
66         unsigned char enckeylen;
67         unsigned int provver;
68         unsigned short samprate;
69         int provverpres;
70         unsigned int rr_jitter;
71         unsigned int rr_loss;
72         unsigned int rr_pkts;
73         unsigned short rr_delay;
74         unsigned int rr_dropped;
75         unsigned int rr_ooo;
76         struct ast_variable *vars;
77         char *osptokenblock[IAX_MAX_OSPBLOCK_NUM];
78         unsigned int ospblocklength[IAX_MAX_OSPBLOCK_NUM];
79 };
80
81 #define DIRECTION_INGRESS 1
82 #define DIRECTION_OUTGRESS 2
83
84 struct iax_frame {
85 #ifdef LIBIAX
86         struct iax_session *session;
87         struct iax_event *event;
88 #else
89         int sockfd;
90 #endif
91
92         /* /Our/ call number */
93         unsigned short callno;
94         /* /Their/ call number */
95         unsigned short dcallno;
96         /* Start of raw frame (outgoing only) */
97         void *data;
98         /* Length of frame (outgoing only) */
99         int datalen;
100         /* How many retries so far? */
101         int retries;
102         /* Outgoing relative timestamp (ms) */
103         unsigned int ts;
104         /* How long to wait before retrying */
105         int retrytime;
106         /* Are we received out of order?  */
107         unsigned int outoforder:1;
108         /* Have we been sent at all yet? */
109         unsigned int sentyet:1;
110         /* Non-zero if should be sent to transfer peer */
111         unsigned int transfer:1;
112         /* Non-zero if should be sent to media peer */
113         unsigned int media:1;
114         /* Non-zero if this is the final message */
115         unsigned int final:1;
116         /* Ingress or outgres */
117         unsigned int direction:2;
118         /* Can this frame be cached? */
119         unsigned int cacheable:1;
120         /* Outgoing Packet sequence number */
121         int oseqno;
122         /* Next expected incoming packet sequence number */
123         int iseqno;
124         /* Retransmission ID */
125         int retrans;
126         /* Easy linking */
127         AST_LIST_ENTRY(iax_frame) list;
128         /* Actual, isolated frame header */
129         struct ast_frame af;
130         /*! Amount of space _allocated_ for data */
131         size_t afdatalen;
132         unsigned char unused[AST_FRIENDLY_OFFSET];
133         unsigned char afdata[0];        /* Data for frame */
134 };
135
136 struct iax_ie_data {
137         unsigned char buf[1024];
138         int pos;
139 };
140
141 /* Choose a different function for output */
142 void iax_set_output(void (*output)(const char *data));
143 /* Choose a different function for errors */
144 void iax_set_error(void (*output)(const char *data));
145 void iax_showframe(struct iax_frame *f, struct ast_iax2_full_hdr *fhi, int rx, struct sockaddr_in *sin, int datalen);
146
147 const char *iax_ie2str(int ie);
148
149 int iax_ie_append_raw(struct iax_ie_data *ied, unsigned char ie, const void *data, int datalen);
150 int iax_ie_append_addr(struct iax_ie_data *ied, unsigned char ie, const struct sockaddr_in *sin);
151 int iax_ie_append_int(struct iax_ie_data *ied, unsigned char ie, unsigned int value);
152 int iax_ie_append_short(struct iax_ie_data *ied, unsigned char ie, unsigned short value);
153 int iax_ie_append_str(struct iax_ie_data *ied, unsigned char ie, const char *str);
154 int iax_ie_append_byte(struct iax_ie_data *ied, unsigned char ie, unsigned char dat);
155 int iax_ie_append(struct iax_ie_data *ied, unsigned char ie);
156 int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen);
157
158 int iax_get_frames(void);
159 int iax_get_iframes(void);
160 int iax_get_oframes(void);
161
162 void iax_frame_wrap(struct iax_frame *fr, struct ast_frame *f);
163 struct iax_frame *iax_frame_new(int direction, int datalen, unsigned int cacheable);
164 void iax_frame_free(struct iax_frame *fr);
165 #endif