Add IAX2 firmware upgrade support
[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@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_PARSER_H
15 #define _IAX2_PARSER_H
16
17 struct iax_ies {
18         char *called_number;
19         char *calling_number;
20         char *calling_ani;
21         char *calling_name;
22         char *called_context;
23         char *username;
24         char *password;
25         unsigned int capability;
26         unsigned int format;
27         char *language;
28         int version;
29         unsigned short adsicpe;
30         char *dnid;
31         char *rdnis;
32         unsigned int authmethods;
33         char *challenge;
34         char *md5_result;
35         char *rsa_result;
36         struct sockaddr_in *apparent_addr;
37         unsigned short refresh;
38         unsigned short dpstatus;
39         unsigned short callno;
40         char *cause;
41         unsigned char iax_unknown;
42         int msgcount;
43         int autoanswer;
44         int musiconhold;
45         unsigned int transferid;
46         unsigned int datetime;
47         char *devicetype;
48         char *serviceident;
49         int firmwarever;
50         unsigned int fwdesc;
51         unsigned char *fwdata;
52         unsigned char fwdatalen;
53 };
54
55 #define DIRECTION_INGRESS 1
56 #define DIRECTION_OUTGRESS 2
57
58 struct iax_frame {
59 #ifdef LIBIAX
60         struct iax_session *session;
61         struct iax_event *event;
62 #endif
63
64         /* /Our/ call number */
65         unsigned short callno;
66         /* /Their/ call number */
67         unsigned short dcallno;
68         /* Start of raw frame (outgoing only) */
69         void *data;
70         /* Length of frame (outgoing only) */
71         int datalen;
72         /* How many retries so far? */
73         int retries;
74         /* Outgoing relative timestamp (ms) */
75         unsigned int ts;
76         /* How long to wait before retrying */
77         int retrytime;
78         /* Are we received out of order?  */
79         int outoforder;
80         /* Have we been sent at all yet? */
81         int sentyet;
82         /* Outgoing Packet sequence number */
83         int oseqno;
84         /* Next expected incoming packet sequence number */
85         int iseqno;
86         /* Non-zero if should be sent to transfer peer */
87         int transfer;
88         /* Non-zero if this is the final message */
89         int final;
90         /* Ingress or outgres */
91         int direction;
92         /* Retransmission ID */
93         int retrans;
94         /* Easy linking */
95         struct iax_frame *next;
96         struct iax_frame *prev;
97         /* Actual, isolated frame header */
98         struct ast_frame af;
99         unsigned char unused[AST_FRIENDLY_OFFSET];
100         unsigned char afdata[0];        /* Data for frame */
101 };
102
103 struct iax_ie_data {
104         unsigned char buf[1024];
105         int pos;
106 };
107
108 /* Choose a different function for output */
109 extern void iax_set_output(void (*output)(const char *data));
110 /* Choose a different function for errors */
111 extern void iax_set_error(void (*output)(const char *data));
112 extern void iax_showframe(struct iax_frame *f, struct ast_iax2_full_hdr *fhi, int rx, struct sockaddr_in *sin, int datalen);
113
114 extern const char *iax_ie2str(int ie);
115
116 extern int iax_ie_append_raw(struct iax_ie_data *ied, unsigned char ie, void *data, int datalen);
117 extern int iax_ie_append_addr(struct iax_ie_data *ied, unsigned char ie, struct sockaddr_in *sin);
118 extern int iax_ie_append_int(struct iax_ie_data *ied, unsigned char ie, unsigned int value);
119 extern int iax_ie_append_short(struct iax_ie_data *ied, unsigned char ie, unsigned short value);
120 extern int iax_ie_append_str(struct iax_ie_data *ied, unsigned char ie, unsigned char *str);
121 extern int iax_ie_append_byte(struct iax_ie_data *ied, unsigned char ie, unsigned char dat);
122 extern int iax_ie_append(struct iax_ie_data *ied, unsigned char ie);
123 extern int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen);
124
125 extern int iax_get_frames(void);
126 extern int iax_get_iframes(void);
127 extern int iax_get_oframes(void);
128
129 extern void iax_frame_wrap(struct iax_frame *fr, struct ast_frame *f);
130 extern struct iax_frame *iax_frame_new(int direction, int datalen);
131 extern void iax_frame_free(struct iax_frame *fr);
132 #endif