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