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