mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-26 06:26:41 +00:00 
			
		
		
		
	There are some situations in Asterisk where ast_frame and/or iax_frame structures are rapidly allocatted and freed (at least 50 times per second for one call). This code significantly improves the performance of ast_frame_header_new(), ast_frdup(), ast_frfree(), iax_frame_new(), and iax_frame_free() by keeping a thread-local cache of these structures and using frames from the cache whenever possible instead of calling malloc/free every time. This commit also converts the ast_frame and iax_frame structures to use the linked list macros. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@41278 65c4cc65-6c06-0410-ace0-fbb531ad65f3
		
			
				
	
	
		
			159 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Asterisk -- A telephony toolkit for Linux.
 | |
|  *
 | |
|  * 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/linkedlists.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;
 | |
| 	char *called_context;
 | |
| 	char *username;
 | |
| 	char *password;
 | |
| 	unsigned int capability;
 | |
| 	unsigned int 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 sockaddr_in *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;
 | |
| };
 | |
| 
 | |
| #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?  */
 | |
| 	int outoforder;
 | |
| 	/* Have we been sent at all yet? */
 | |
| 	int sentyet;
 | |
| 	/* Outgoing Packet sequence number */
 | |
| 	int oseqno;
 | |
| 	/* Next expected incoming packet sequence number */
 | |
| 	int iseqno;
 | |
| 	/* Non-zero if should be sent to transfer peer */
 | |
| 	int transfer;
 | |
| 	/* Non-zero if this is the final message */
 | |
| 	int final;
 | |
| 	/* Ingress or outgres */
 | |
| 	int direction;
 | |
| 	/* Retransmission ID */
 | |
| 	int retrans;
 | |
| 	/* Easy linking */
 | |
| 	AST_LIST_ENTRY(iax_frame) list;
 | |
| 	/* Actual, isolated frame header */
 | |
| 	struct ast_frame af;
 | |
| 	/*! Amount of space _allocated_ for data */
 | |
| 	size_t mallocd_datalen;
 | |
| 	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 sockaddr_in *sin, int datalen);
 | |
| 
 | |
| 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 sockaddr_in *sin);
 | |
| 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);
 | |
| void iax_frame_free(struct iax_frame *fr);
 | |
| #endif
 |