⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 h_table.h

📁 用来作为linux中SIP SERVER,完成VOIP网络电话中服务器的功能
💻 H
字号:
/* * $Id: h_table.h,v 1.79 2004/08/24 09:00:40 janakj Exp $ * * Copyright (C) 2001-2003 FhG Fokus * * This file is part of ser, a free SIP server. * * ser is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version * * For a license to use the ser software under conditions * other than those described here, or to purchase support for this * software, please contact iptel.org by e-mail at the following addresses: *    info@iptel.org * * ser is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License  * along with this program; if not, write to the Free Software  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * * History: * -------- * 2003-03-16  removed _TOTAG (jiri) * 2003-03-06  we keep a list of 200/INV to-tags now (jiri) * 2003-03-01  kr set through a function now (jiri) * 2003-12-04  callbacks per transaction added; completion callback *             merge into them as LOCAL_COMPETED (bogdan) * 2004-02-11  FIFO/CANCEL + alignments (hash=f(callid,cseq)) (uli+jiri) * 2004-02-13  t->is_invite, t->local, t->noisy_ctimer replaced *             with flags (bogdan) * 2004-08-23  avp support added - avp list linked in transaction (bogdan) */#include "defs.h"#ifndef _H_TABLE_H#define _H_TABLE_H#include <stdio.h>#include <stdlib.h>#include "../../parser/msg_parser.h"#include "../../types.h"#include "../../md5utils.h"#include "../../usr_avp.h"#include "config.h"struct s_table;struct entry;struct cell;struct timer;struct retr_buf;#include "../../mem/shm_mem.h"#include "lock.h"#include "sip_msg.h"#include "t_reply.h"#include "t_hooks.h"#include "timer.h"#define LOCK_HASH(_h) lock_hash((_h))#define UNLOCK_HASH(_h) unlock_hash((_h))void lock_hash(int i);void unlock_hash(int i);#define NO_CANCEL       ( (char*) 0 )#define EXTERNAL_CANCEL ( (char*) -1)#define TYPE_LOCAL_CANCEL -1#define TYPE_REQUEST       0/* to be able to assess whether a script writer forgot to   release a transaction and leave it for ever in memory,   we mark it with operations done over it; if none of these   flags is set and script is being left, it is a sign of   script error and we need to release on writer's   behalf   REQ_FWDED means there is a UAC with final response timer             ticking. If it hits, transaction will be completed.   REQ_RPLD means that a transaction has been replied -- either            it implies going to wait state, or for invite transactions            FR timer is ticking until ACK arrives   REQ_RLSD means that a transaction was put on wait explicitly            from t_release_transaction   REQ_EXIST means that this request is a retransmission which does not            affect transactional state*/enum kill_reason { REQ_FWDED=1, REQ_RPLD=2, REQ_RLSD=4, REQ_EXIST=8 };typedef struct retr_buf{	int activ_type;	/* set to status code if the buffer is a reply,	0 if request or -1 if local CANCEL */	char *buffer;	int   buffer_len;		struct dest_info dst;	/* a message can be linked just to retransmission and FR list */	struct timer_link retr_timer;	struct timer_link fr_timer;	enum lists retr_list;	/*the cell that contains this retrans_buff*/	struct cell* my_T;	unsigned int branch;}retr_buf_type;/* User Agent Server content */typedef struct ua_server{	struct sip_msg   *request;	char             *end_request;	struct retr_buf  response;	unsigned int     status;	/* keep to-tags for local 200 replies for INVITE -- 	 * we need them for dialog-wise matching of ACKs;	 * the pointer shows to shmem-ed reply */	str				 local_totag;}ua_server_type;/* User Agent Client content */typedef struct ua_client{	struct retr_buf  request;	/* we maintain a separate copy of cancel rather than	   reuse the structure for original request; the 	   original request is no longer needed but its delayed	   timer may fire and interfere with whoever tries to	   rewrite it	*/	struct retr_buf local_cancel;	/* pointer to retransmission buffer where uri is printed;	   good for generating ACK/CANCEL */	str              uri;	/* if we store a reply (branch picking), this is where it is */	struct sip_msg  *reply;	/* if we don't store, we at least want to know the status */	int             last_received;}ua_client_type;struct totag_elem {	str tag;	short acked;	struct totag_elem *next;};/* transaction's flags *//* is the transaction's request an INVITE? */#define T_IS_INVITE_FLAG     (1<<0)/* is this a transaction generated by local request? */#define T_IS_LOCAL_FLAG      (1<<1)/* set to one if you want to disallow silent transaction   dropping when C timer hits */#define T_NOISY_CTIMER_FLAG  (1<<2)/* transaction context */typedef struct cell{	/* linking data */	struct cell*     next_cell;	struct cell*     prev_cell;	/* tells in which hash table entry the cell lives */	unsigned int  hash_index;	/* sequence number within hash collision slot */	unsigned int  label;	/* different information about the transaction */	unsigned int flags;	/* how many processes are currently processing this transaction ;	   note that only processes working on a request/reply belonging	   to a transaction increase ref_count -- timers don't, since we	   rely on transaction state machine to clean-up all but wait timer	   when entering WAIT state and the wait timer is the only place	   from which a transaction can be deleted (if ref_count==0); good	   for protecting from conditions in which wait_timer hits and	   tries to delete a transaction whereas at the same time 	   a delayed message belonging to the transaction is received */	volatile unsigned int ref_count;	/* needed for generating local ACK/CANCEL for local	   transactions; all but cseq_n include the entire	   header field value, cseq_n only Cseq number; with	   local transactions, pointers point to outbound buffer,	   with proxied transactions to inbound request */	str from, callid, cseq_n, to;	/* method shortcut -- for local transactions, pointer to	   outbound buffer, for proxies transactions pointer to	   original message; needed for reply matching */	str method;	/* head of callback list */	struct tmcb_head_list tmcb_hl;	/* bindings to wait and delete timer */	struct timer_link wait_tl;	struct timer_link dele_tl;	/* number of forks */	int nr_of_outgoings;	/* nr of replied branch; 0..MAX_BRANCHES=branch value,	 * -1 no reply, -2 local reply */	int relaied_reply_branch;	/* UA Server */	struct ua_server  uas;	/* UA Clients */	struct ua_client  uac[ MAX_BRANCHES ];	/* protection against concurrent reply processing */	ser_lock_t   reply_mutex;	/* the route to take if no final positive reply arrived */	unsigned int on_negative;	/* the onreply_route to be processed if registered to do so */	unsigned int on_reply;	/* MD5checksum  (meaningful only if syn_branch=0 */	char md5[MD5_LEN];#ifdef	EXTRA_DEBUG	/* scheduled for deletion ? */	short damocles;#endif	/* to-tags of 200/INVITEs which were received from downstream and 	 * forwarded or passed to UAC; note that there can be arbitrarily 	 * many due to downstream forking; */	struct totag_elem *fwded_totags;	/* list with user avp */	struct usr_avp *user_avps;}cell_type;/* double-linked list of cells with hash synonyms */typedef struct entry{	struct cell*    first_cell;	struct cell*    last_cell;	/* currently highest sequence number in a synonym list */	unsigned int    next_label;	/* sync mutex */	ser_lock_t      mutex;	unsigned long acc_entries;	unsigned long cur_entries;}entry_type;/* transaction table */struct s_table{	/* table of hash entries; each of them is a list of synonyms  */	struct entry   entrys[ TABLE_ENTRIES ];};#define list_entry(ptr, type, member) \	((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))#define get_retr_timer_payload(_tl_) \	list_entry( _tl_, struct retr_buf, retr_timer)#define get_fr_timer_payload(_tl_) \	list_entry( _tl_, struct retr_buf, fr_timer)#define get_wait_timer_payload(_tl_) \	list_entry( _tl_, struct cell, wait_tl)#define get_dele_timer_payload(_tl_) \	list_entry( _tl_, struct cell, dele_tl)#define get_T_from_reply_rb(_rb_) \	list_entry( list_entry( _rb_, (struct ua_server), response),\		struct cell, uas)#define get_T_from_request_rb(_rb_, _br_) \	list_entry( list_entry( (rb_, (struct ua_client), request) - \		(_br_)*sizeof(struct retr_buf), struct cell, uas)#define get_T_from_cancel_rb(_rb_, _br_) \	list_entry( list_entry( (rb_, (struct ua_client), local_cancel) - \		(_br_)*sizeof(struct retr_buf), struct cell, uas)#define is_invite(_t_)           ((_t_)->flags&T_IS_INVITE_FLAG)#define is_local(_t_)            ((_t_)->flags&T_IS_LOCAL_FLAG)#define has_noisy_ctimer(_t_)    ((_t_)->flags&T_NOISY_CTIMER_FLAG)void set_kr( enum kill_reason kr );enum kill_reason get_kr();struct s_table* get_tm_table();struct s_table* init_hash_table();void   free_hash_table( );void   free_cell( struct cell* dead_cell );struct cell*  build_cell( struct sip_msg* p_msg );void   remove_from_hash_table_unsafe( struct cell * p_cell);#ifdef OBSOLETEDvoid   insert_into_hash_table( struct cell * p_cell, unsigned int _hash);#endifvoid   insert_into_hash_table_unsafe( struct cell * p_cell, unsigned int _hash );unsigned int transaction_count( void );int fifo_hash( FILE *stream, char *response_file );/* Unix socket variant */int unixsock_hash(str* msg);		    #endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -