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