mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-11-03 04:16:43 +00:00 
			
		
		
		
	Adds an information element for ANI2 so that Originating Line Information can be transmitted over IAX2 channels. ASTERISK-29605 #close Change-Id: Iaeacdf6ccde18eaff7f776a0f49fee87dcb549d2
		
			
				
	
	
		
			181 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			181 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * Asterisk -- An open source telephony toolkit.
 | 
						|
 *
 | 
						|
 * Implementation of Inter-Asterisk eXchange
 | 
						|
 *
 | 
						|
 * Copyright (C) 2003, Digium
 | 
						|
 *
 | 
						|
 * Mark Spencer <markster@digium.com>
 | 
						|
 *
 | 
						|
 * This program is free software, distributed under the terms of
 | 
						|
 * the GNU General Public License
 | 
						|
 */
 | 
						|
 | 
						|
/*!\file
 | 
						|
 * \brief Implementation of the IAX2 protocol
 | 
						|
 */
 | 
						|
 | 
						|
#ifndef _IAX2_PARSER_H
 | 
						|
#define _IAX2_PARSER_H
 | 
						|
 | 
						|
#include "asterisk/frame.h"
 | 
						|
#include "asterisk/linkedlists.h"
 | 
						|
#include "asterisk/crypto.h"
 | 
						|
#include "asterisk/netsock2.h"
 | 
						|
#include "iax2.h"
 | 
						|
 | 
						|
struct iax_ies {
 | 
						|
	char *called_number;
 | 
						|
	char *calling_number;
 | 
						|
	char *calling_ani;
 | 
						|
	char *calling_name;
 | 
						|
	int calling_ton;
 | 
						|
	int calling_tns;
 | 
						|
	int calling_pres;
 | 
						|
	int calling_ani2;
 | 
						|
	char *called_context;
 | 
						|
	char *username;
 | 
						|
	char *password;
 | 
						|
	iax2_format capability;
 | 
						|
	iax2_format format;
 | 
						|
	char *codec_prefs;
 | 
						|
	char *language;
 | 
						|
	int version;
 | 
						|
	unsigned short adsicpe;
 | 
						|
	char *dnid;
 | 
						|
	char *rdnis;
 | 
						|
	unsigned int authmethods;
 | 
						|
	unsigned int encmethods;
 | 
						|
	char *challenge;
 | 
						|
	char *md5_result;
 | 
						|
	char *rsa_result;
 | 
						|
	struct ast_sockaddr apparent_addr;
 | 
						|
	unsigned short refresh;
 | 
						|
	unsigned short dpstatus;
 | 
						|
	unsigned short callno;
 | 
						|
	char *cause;
 | 
						|
	unsigned char causecode;
 | 
						|
	unsigned char iax_unknown;
 | 
						|
	int msgcount;
 | 
						|
	int autoanswer;
 | 
						|
	int musiconhold;
 | 
						|
	unsigned int transferid;
 | 
						|
	unsigned int datetime;
 | 
						|
	char *devicetype;
 | 
						|
	char *serviceident;
 | 
						|
	int firmwarever;
 | 
						|
	unsigned int fwdesc;
 | 
						|
	unsigned char *fwdata;
 | 
						|
	unsigned char fwdatalen;
 | 
						|
	unsigned char *enckey;
 | 
						|
	unsigned char enckeylen;
 | 
						|
	unsigned int provver;
 | 
						|
	unsigned short samprate;
 | 
						|
	int provverpres;
 | 
						|
	unsigned int rr_jitter;
 | 
						|
	unsigned int rr_loss;
 | 
						|
	unsigned int rr_pkts;
 | 
						|
	unsigned short rr_delay;
 | 
						|
	unsigned int rr_dropped;
 | 
						|
	unsigned int rr_ooo;
 | 
						|
	struct ast_variable *vars;
 | 
						|
	char *osptokenblock[IAX_MAX_OSPBLOCK_NUM];
 | 
						|
	unsigned int ospblocklength[IAX_MAX_OSPBLOCK_NUM];
 | 
						|
	unsigned char calltoken;
 | 
						|
	unsigned char *calltokendata;
 | 
						|
};
 | 
						|
 | 
						|
#define DIRECTION_INGRESS 1
 | 
						|
#define DIRECTION_OUTGRESS 2
 | 
						|
 | 
						|
struct iax_frame {
 | 
						|
#ifdef LIBIAX
 | 
						|
	struct iax_session *session;
 | 
						|
	struct iax_event *event;
 | 
						|
#else
 | 
						|
	int sockfd;
 | 
						|
#endif
 | 
						|
 | 
						|
	/*! /Our/ call number */
 | 
						|
	unsigned short callno;
 | 
						|
	/*! /Their/ call number */
 | 
						|
	unsigned short dcallno;
 | 
						|
	/*! Start of raw frame (outgoing only) */
 | 
						|
	void *data;
 | 
						|
	/*! Length of frame (outgoing only) */
 | 
						|
	int datalen;
 | 
						|
	/*! How many retries so far? */
 | 
						|
	int retries;
 | 
						|
	/*! Outgoing relative timestamp (ms) */
 | 
						|
	unsigned int ts;
 | 
						|
	/*! How long to wait before retrying */
 | 
						|
	int retrytime;
 | 
						|
	/*! Are we received out of order?  */
 | 
						|
	unsigned int outoforder:1;
 | 
						|
	/*! Have we been sent at all yet? */
 | 
						|
	unsigned int sentyet:1;
 | 
						|
	/*! Non-zero if should be sent to transfer peer */
 | 
						|
	unsigned int transfer:1;
 | 
						|
	/*! Non-zero if this is the final message */
 | 
						|
	unsigned int final:1;
 | 
						|
	/*! Ingress or outgres */
 | 
						|
	unsigned int direction:2;
 | 
						|
	/*! Can this frame be cached? */
 | 
						|
	unsigned int cacheable:1;
 | 
						|
	/*! Outgoing Packet sequence number */
 | 
						|
	int oseqno;
 | 
						|
	/*! Next expected incoming packet sequence number */
 | 
						|
	int iseqno;
 | 
						|
	/*! Retransmission ID */
 | 
						|
	int retrans;
 | 
						|
	/*! is this packet encrypted or not. if set this varible holds encryption methods*/
 | 
						|
	int encmethods;
 | 
						|
	/*! store encrypt key */
 | 
						|
	ast_aes_encrypt_key ecx;
 | 
						|
	/*! store decrypt key which corresponds to ecx */
 | 
						|
	ast_aes_decrypt_key mydcx;
 | 
						|
	/*! random data for encryption pad */
 | 
						|
	unsigned char semirand[32];
 | 
						|
	/*! Easy linking */
 | 
						|
	AST_LIST_ENTRY(iax_frame) list;
 | 
						|
	/*! Actual, isolated frame header */
 | 
						|
	struct ast_frame af;
 | 
						|
	/*! Amount of space _allocated_ for data */
 | 
						|
	size_t afdatalen;
 | 
						|
	unsigned char unused[AST_FRIENDLY_OFFSET];
 | 
						|
	unsigned char afdata[0];	/* Data for frame */
 | 
						|
};
 | 
						|
 | 
						|
struct iax_ie_data {
 | 
						|
	unsigned char buf[1024];
 | 
						|
	int pos;
 | 
						|
};
 | 
						|
 | 
						|
/* Choose a different function for output */
 | 
						|
void iax_set_output(void (*output)(const char *data));
 | 
						|
/* Choose a different function for errors */
 | 
						|
void iax_set_error(void (*output)(const char *data));
 | 
						|
void iax_showframe(struct iax_frame *f, struct ast_iax2_full_hdr *fhi, int rx, struct ast_sockaddr *addr, int datalen);
 | 
						|
void iax_frame_subclass2str(enum iax_frame_subclass subclass, char *str, size_t len);
 | 
						|
 | 
						|
const char *iax_ie2str(int ie);
 | 
						|
 | 
						|
int iax_ie_append_raw(struct iax_ie_data *ied, unsigned char ie, const void *data, int datalen);
 | 
						|
int iax_ie_append_addr(struct iax_ie_data *ied, unsigned char ie, const struct ast_sockaddr *addr);
 | 
						|
int iax_ie_append_versioned_uint64(struct iax_ie_data *ied, unsigned char ie, unsigned char version, uint64_t value);
 | 
						|
int iax_ie_append_int(struct iax_ie_data *ied, unsigned char ie, unsigned int value);
 | 
						|
int iax_ie_append_short(struct iax_ie_data *ied, unsigned char ie, unsigned short value);
 | 
						|
int iax_ie_append_str(struct iax_ie_data *ied, unsigned char ie, const char *str);
 | 
						|
int iax_ie_append_byte(struct iax_ie_data *ied, unsigned char ie, unsigned char dat);
 | 
						|
int iax_ie_append(struct iax_ie_data *ied, unsigned char ie);
 | 
						|
int iax_parse_ies(struct iax_ies *ies, unsigned char *data, int datalen);
 | 
						|
 | 
						|
int iax_get_frames(void);
 | 
						|
int iax_get_iframes(void);
 | 
						|
int iax_get_oframes(void);
 | 
						|
 | 
						|
void iax_frame_wrap(struct iax_frame *fr, struct ast_frame *f);
 | 
						|
struct iax_frame *iax_frame_new(int direction, int datalen, unsigned int cacheable);
 | 
						|
void iax_frame_free(struct iax_frame *fr);
 | 
						|
#endif
 |