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