kamailio6.0默认配置文件中文注释说明

#!KAMAILIO  // 声明这是一个Kamailio配置文件

import_file "kamailio-local.cfg"  // 导入本地配置文件(如果存在)

#!ifdef WITH_DEBUG  // 如果定义了WITH_DEBUG
#!define DBGLEVEL 3  // 设置调试级别为3
#!else  // 否则
#!define DBGLEVEL 2  // 设置调试级别为2
#!endif

#!ifdef WITH_MYSQL  // 如果定义了WITH_MYSQL
#!trydef DBURL "mysql://kamailio:kamailiorw@localhost/kamailio"  // 尝试定义数据库连接URL
#!endif

#!ifdef WITH_MULTIDOMAIN  // 如果定义了WITH_MULTIDOMAIN
#!define MULTIDOMAIN 1  // 启用多域支持
#!else  // 否则
#!define MULTIDOMAIN 0  // 禁用多域支持
#!endif

#!ifdef WITH_ANTIFLOOD  // 如果定义了WITH_ANTIFLOOD
#!trydef WITH_HTABLE  // 尝试定义WITH_HTABLE
#!endif

#!define FLT_ACC 1  // 定义标志FLT_ACC为1(用于计费)
#!define FLT_ACCMISSED 2  // 定义标志FLT_ACCMISSED为2(用于未接来电计费)
#!define FLT_ACCFAILED 3  // 定义标志FLT_ACCFAILED为3(用于失败计费)
#!define FLT_NATS 5  // 定义标志FLT_NATS为5(用于NAT检测)

#!define FLB_NATB 6  // 定义分支标志FLB_NATB为6(用于NAT分支)
#!define FLB_NATSIPPING 7  // 定义分支标志FLB_NATSIPPING为7(用于NAT SIP PING)

debug=DBGLEVEL  // 设置调试级别为DBGLEVEL

log_stderror=no  // 不将日志输出到标准错误

memdbg=5  // 设置内存调试级别为5
memlog=5  // 设置内存日志级别为5

log_facility=LOG_LOCAL0  // 设置日志设施为LOG_LOCAL0
log_prefix="{$mt $hdr(CSeq) $ci} "  // 设置日志前缀格式

children=8  // 设置每个UDP套接字的SIP路由进程数为8

# disable_tcp=yes  // 禁用TCP(默认启用)

# tcp_children=8  // 设置所有TCP/TLS套接字的SIP路由进程数为8

# async_workers_group="name=udp;workers=8"  // 设置异步工作线程组
# udp_receiver_mode = 1  // 设置UDP接收模式为1(多线程异步)

# auto_aliases=no  // 禁用基于IP反向DNS的本地别名自动发现

# alias="sip.mydomain.com"  // 添加本地域名别名

# listen=udp:10.0.0.10:5060  // 监听指定IP和端口的UDP套接字

tcp_connection_lifetime=3605  // 设置TCP连接生命周期为3605秒

tcp_max_connections=2048  // 设置TCP连接的最大数量为2048

#tcp_accept_iplimit=1024  // 设置每个IP地址的TCP连接上限为1024

#!ifdef WITH_JSONRPC  // 如果定义了WITH_JSONRPC
tcp_accept_no_cl=yes  // 允许没有Content-Length头的TCP连接
#!endif

#!ifdef WITH_TLS  // 如果定义了WITH_TLS
enable_tls=yes  // 启用TLS支持

tls_max_connections=2048  // 设置TLS连接的最大数量为2048

tls_threads_mode=2  // 设置TLS线程模式为2
#!endif

enable_sctp=no  // 禁用SCTP支持

#!ifdef WITH_PSTN  // 如果定义了WITH_PSTN
pstn.gw_ip = "" desc "PSTN GW Address"  // 设置PSTN网关IP地址
pstn.gw_port = "" desc "PSTN GW Port"  // 设置PSTN网关端口
#!endif

#!ifdef WITH_VOICEMAIL  // 如果定义了WITH_VOICEMAIL
voicemail.srv_ip = "" desc "VoiceMail IP Address"  // 设置语音邮件服务器IP地址
voicemail.srv_port = "5060" desc "VoiceMail Port"  // 设置语音邮件服务器端口
#!endif

# mpath="/usr/local/kamailio/lib64/kamailio/modules/"  // 设置模块路径

#!ifdef WITH_TLS  // 如果定义了WITH_TLS
loadmodule "tls.so"  // 加载TLS模块
#!endif

#!ifdef WITH_MYSQL  // 如果定义了WITH_MYSQL
loadmodule "db_mysql.so"  // 加载MySQL数据库模块
#!endif

#!ifdef WITH_JSONRPC  // 如果定义了WITH_JSONRPC
loadmodule "xhttp.so"  // 加载xhttp模块
#!endif
loadmodule "jsonrpcs.so"  // 加载jsonrpcs模块
loadmodule "kex.so"  // 加载kex模块
loadmodule "corex.so"  // 加载corex模块
loadmodule "tm.so"  // 加载tm模块
loadmodule "tmx.so"  // 加载tmx模块
loadmodule "sl.so"  // 加载sl模块
loadmodule "rr.so"  // 加载rr模块
loadmodule "pv.so"  // 加载pv模块
loadmodule "maxfwd.so"  // 加载maxfwd模块
loadmodule "usrloc.so"  // 加载usrloc模块
loadmodule "registrar.so"  // 加载registrar模块
loadmodule "textops.so"  // 加载textops模块
loadmodule "textopsx.so"  // 加载textopsx模块
loadmodule "siputils.so"  // 加载siputils模块
loadmodule "xlog.so"  // 加载xlog模块
loadmodule "sanity.so"  // 加载sanity模块
loadmodule "ctl.so"  // 加载ctl模块
loadmodule "cfg_rpc.so"  // 加载cfg_rpc模块
loadmodule "acc.so"  // 加载acc模块
loadmodule "counters.so"  // 加载counters模块
loadmodule "dlgs.so"  // 加载dlgs模块

#!ifdef WITH_AUTH  // 如果定义了WITH_AUTH
loadmodule "auth.so"  // 加载auth模块
loadmodule "auth_db.so"  // 加载auth_db模块
#!ifdef WITH_IPAUTH  // 如果定义了WITH_IPAUTH
loadmodule "permissions.so"  // 加载permissions模块
#!endif
#!endif

#!ifdef WITH_ALIASDB  // 如果定义了WITH_ALIASDB
loadmodule "alias_db.so"  // 加载alias_db模块
#!endif

#!ifdef WITH_SPEEDDIAL  // 如果定义了WITH_SPEEDDIAL
loadmodule "speeddial.so"  // 加载speeddial模块
#!endif

#!ifdef WITH_MULTIDOMAIN  // 如果定义了WITH_MULTIDOMAIN
loadmodule "domain.so"  // 加载domain模块
#!endif

#!ifdef WITH_PRESENCE  // 如果定义了WITH_PRESENCE
loadmodule "presence.so"  // 加载presence模块
loadmodule "presence_xml.so"  // 加载presence_xml模块
#!endif

#!ifdef WITH_NAT  // 如果定义了WITH_NAT
loadmodule "nathelper.so"  // 加载nathelper模块
#!ifdef WITH_RTPENGINE  // 如果定义了WITH_RTPENGINE
loadmodule "rtpengine.so"  // 加载rtpengine模块
#!else  // 否则
loadmodule "rtpproxy.so"  // 加载rtpproxy模块
#!endif
#!endif

#!ifdef WITH_HTABLE  // 如果定义了WITH_HTABLE
loadmodule "htable.so"  // 加载htable模块
#!endif

#!ifdef WITH_ANTIFLOOD  // 如果定义了WITH_ANTIFLOOD
loadmodule "pike.so"  // 加载pike模块
#!endif

#!ifdef WITH_DEBUG  // 如果定义了WITH_DEBUG
loadmodule "debugger.so"  // 加载debugger模块
#!endif

modparam("jsonrpcs", "pretty_format", 1)  // 设置jsonrpcs模块的pretty_format参数为1
# modparam("jsonrpcs", "fifo_name", "/run/kamailio/kamailio_rpc.fifo")  // 设置RPC fifo控制文件路径
# modparam("jsonrpcs", "dgram_socket", "/run/kamailio/kamailio_rpc.sock")  // 设置RPC unix socket控制文件路径
#!ifdef WITH_JSONRPC  // 如果定义了WITH_JSONRPC
modparam("jsonrpcs", "transport", 7)  // 设置jsonrpcs模块的transport参数为7
#!endif

# modparam("ctl", "binrpc", "unix:/run/kamailio/kamailio_ctl")  // 设置RPC unix socket控制文件路径

modparam("sanity", "autodrop", 0)  // 设置sanity模块的autodrop参数为0

modparam("tm", "failure_reply_mode", 3)  // 设置tm模块的failure_reply_mode参数为3
modparam("tm", "fr_timer", 30000)  // 设置tm模块的fr_timer参数为30000毫秒
modparam("tm", "fr_inv_timer", 120000)  // 设置tm模块的fr_inv_timer参数为120000毫秒

modparam("rr", "enable_full_lr", 0)  // 设置rr模块的enable_full_lr参数为0
modparam("rr", "append_fromtag", 0)  // 设置rr模块的append_fromtag参数为0

modparam("dlgs", "timer_interval", 10)  // 设置dlgs模块的timer_interval参数为10秒
modparam("dlgs", "init_lifetime", 180)  // 设置dlgs模块的init_lifetime参数为180秒
modparam("dlgs", "active_lifetime", 7200)  // 设置dlgs模块的active_lifetime参数为7200秒
modparam("dlgs", "finish_lifetime", 10)  // 设置dlgs模块的finish_lifetime参数为10秒

modparam("registrar", "method_filtering", 1)  // 设置registrar模块的method_filtering参数为1
# modparam("registrar", "append_branches", 0)  // 设置registrar模块的append_branches参数为0
# modparam("registrar", "max_contacts", 10)  // 设置registrar模块的max_contacts参数为10
modparam("registrar", "max_expires", 3600)  // 设置registrar模块的max_expires参数为3600秒
modparam("registrar", "gruu_enabled", 0)  // 设置registrar模块的gruu_enabled参数为0
modparam("registrar", "use_path", 1)  // 设置registrar模块的use_path参数为1
modparam("registrar", "path_mode", 0)  // 设置registrar模块的path_mode参数为0

modparam("acc", "early_media", 0)  // 设置acc模块的early_media参数为0
modparam("acc", "report_ack", 0)  // 设置acc模块的report_ack参数为0
modparam("acc", "report_cancels", 0)  // 设置acc模块的report_cancels参数为0
modparam("acc", "detect_direction", 0)  // 设置acc模块的detect_direction参数为0
modparam("acc", "log_flag", FLT_ACC)  // 设置acc模块的log_flag参数为FLT_ACC
modparam("acc", "log_missed_flag", FLT_ACCMISSED)  // 设置acc模块的log_missed_flag参数为FLT_ACCMISSED
modparam("acc", "log_extra",
	"src_user=$fU;src_domain=$fd;src_ip=$si;"
	"dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")  // 设置acc模块的log_extra参数
modparam("acc", "failed_transaction_flag", FLT_ACCFAILED)  // 设置acc模块的failed_transaction_flag参数为FLT_ACCFAILED
#!ifdef WITH_ACCDB  // 如果定义了WITH_ACCDB
modparam("acc", "db_flag", FLT_ACC)  // 设置acc模块的db_flag参数为FLT_ACC
modparam("acc", "db_missed_flag", FLT_ACCMISSED)  // 设置acc模块的db_missed_flag参数为FLT_ACCMISSED
modparam("acc", "db_url", DBURL)  // 设置acc模块的db_url参数为DBURL
modparam("acc", "db_extra",
	"src_user=$fU;src_domain=$fd;src_ip=$si;"
	"dst_ouser=$tU;dst_user=$rU;dst_domain=$rd")  // 设置acc模块的db_extra参数
#!endif

modparam("usrloc", "timer_interval", 60)  // 设置usrloc模块的timer_interval参数为60秒
modparam("usrloc", "timer_procs", 1)  // 设置usrloc模块的timer_procs参数为1
modparam("usrloc", "use_domain", MULTIDOMAIN)  // 设置usrloc模块的use_domain参数为MULTIDOMAIN
#!ifdef WITH_USRLOCDB  // 如果定义了WITH_USRLOCDB
modparam("usrloc", "db_url", DBURL)  // 设置usrloc模块的db_url参数为DBURL
modparam("usrloc", "db_mode", 2)  // 设置usrloc模块的db_mode参数为2
#!endif

#!ifdef WITH_AUTH  // 如果定义了WITH_AUTH
modparam("auth_db", "db_url", DBURL)  // 设置auth_db模块的db_url参数为DBURL
modparam("auth_db", "calculate_ha1", yes)  // 设置auth_db模块的calculate_ha1参数为yes
modparam("auth_db", "password_column", "password")  // 设置auth_db模块的password_column参数为password
modparam("auth_db", "load_credentials", "")  // 设置auth_db模块的load_credentials参数为空
modparam("auth_db", "use_domain", MULTIDOMAIN)  // 设置auth_db模块的use_domain参数为MULTIDOMAIN

#!ifdef WITH_IPAUTH  // 如果定义了WITH_IPAUTH
modparam("permissions", "db_url", DBURL)  // 设置permissions模块的db_url参数为DBURL
modparam("permissions", "load_backends", 1)  // 设置permissions模块的load_backends参数为1
#!endif

#!endif

#!ifdef WITH_ALIASDB  // 如果定义了WITH_ALIASDB
modparam("alias_db", "db_url", DBURL)  // 设置alias_db模块的db_url参数为DBURL
modparam("alias_db", "use_domain", MULTIDOMAIN)  // 设置alias_db模块的use_domain参数为MULTIDOMAIN
#!endif

#!ifdef WITH_SPEEDDIAL  // 如果定义了WITH_SPEEDDIAL
modparam("speeddial", "db_url", DBURL)  // 设置speeddial模块的db_url参数为DBURL
modparam("speeddial", "use_domain", MULTIDOMAIN)  // 设置speeddial模块的use_domain参数为MULTIDOMAIN
#!endif

#!ifdef WITH_MULTIDOMAIN  // 如果定义了WITH_MULTIDOMAIN
modparam("domain", "db_url", DBURL)  // 设置domain模块的db_url参数为DBURL
modparam("domain", "register_myself", 1)  // 设置domain模块的register_myself参数为1
#!endif

#!ifdef WITH_PRESENCE  // 如果定义了WITH_PRESENCE
modparam("presence", "db_url", DBURL)  // 设置presence模块的db_url参数为DBURL

modparam("presence_xml", "db_url", DBURL)  // 设置presence_xml模块的db_url参数为DBURL
modparam("presence_xml", "force_active", 1)  // 设置presence_xml模块的force_active参数为1
#!endif

#!ifdef WITH_NAT  // 如果定义了WITH_NAT
#!ifdef WITH_RTPENGINE  // 如果定义了WITH_RTPENGINE
modparam("rtpengine", "rtpengine_sock", "udp:127.0.0.1:2223")  // 设置rtpengine模块的rtpengine_sock参数
#!else  // 否则
modparam("rtpproxy", "rtpproxy_sock", "udp:127.0.0.1:7722")  // 设置rtpproxy模块的rtpproxy_sock参数
#!endif
modparam("nathelper", "natping_interval", 30)  // 设置nathelper模块的natping_interval参数为30秒
modparam("nathelper", "ping_nated_only", 1)  // 设置nathelper模块的ping_nated_only参数为1
modparam("nathelper", "sipping_bflag", FLB_NATSIPPING)  // 设置nathelper模块的sipping_bflag参数为FLB_NATSIPPING
modparam("nathelper", "sipping_from", "sip:pinger@kamailio.org")  // 设置nathelper模块的sipping_from参数

modparam("nathelper|registrar", "received_avp", "$avp(RECEIVED)")  // 设置nathelper和registrar模块的received_avp参数
modparam("usrloc", "nat_bflag", FLB_NATB)  // 设置usrloc模块的nat_bflag参数为FLB_NATB
#!endif

#!ifdef WITH_TLS  // 如果定义了WITH_TLS
modparam("tls", "config", "/usr/local/kamailio/etc/kamailio/tls.cfg")  // 设置tls模块的config参数为TLS配置文件路径
#!endif

#!ifdef WITH_ANTIFLOOD  // 如果定义了WITH_ANTIFLOOD
modparam("pike", "sampling_time_unit", 2)  // 设置pike模块的sampling_time_unit参数为2秒
modparam("pike", "reqs_density_per_unit", 16)  // 设置pike模块的reqs_density_per_unit参数为16
modparam("pike", "remove_latency", 4)  // 设置pike模块的remove_latency参数为4秒
#!endif

#!ifdef WITH_HTABLE  // 如果定义了WITH_HTABLE
#!ifdef WITH_ANTIFLOOD  // 如果定义了WITH_ANTIFLOOD
modparam("htable", "htable", "ipban=>size=8;autoexpire=300;")  // 设置htable模块的ipban表参数
#!endif
#!endif

#!ifdef WITH_DEBUG  // 如果定义了WITH_DEBUG
modparam("debugger", "cfgtrace", 1)  // 设置debugger模块的cfgtrace参数为1
modparam("debugger", "log_level_name", "exec")  // 设置debugger模块的log_level_name参数为exec
#!endif

request_route {  // 主SIP请求路由逻辑

	route(REQINIT);  // 执行请求初始化检查

	route(NATDETECT);  // 执行NAT检测

	if (is_method("CANCEL")) {  // 如果是CANCEL请求
		dlgs_update();  // 更新对话状态
		if (t_check_trans()) {  // 检查事务是否存在
			route(RELAY);  // 转发请求
		}
		exit;  // 退出
	}

	if (!is_method("ACK")) {  // 如果不是ACK请求
		if(t_precheck_trans()) {  // 预检查事务
			t_check_trans();  // 检查事务
			exit;  // 退出
		}
		t_check_trans();  // 检查事务
	}

	route(WITHINDLG);  // 处理SIP对话内的请求

	remove_hf("Route");  // 移除预加载的Route头
	if (is_method("INVITE|SUBSCRIBE|REFER")) {  // 如果是INVITE、SUBSCRIBE或REFER请求
		record_route();  // 记录路由
	}

	if (is_method("INVITE")) {  // 如果是INVITE请求
		setflag(FLT_ACC);  // 设置计费标志
	}

	route(SIPOUT);  // 转发请求到外部域

	route(PRESENCE);  // 处理Presence相关请求

	route(REGISTRAR);  // 处理注册请求

	if ($rU==$null) {  // 如果RURI中没有用户名
		sl_send_reply("484", "Address Incomplete");  // 发送484响应
		exit;  // 退出
	}

	if(is_method("INVITE")) {  // 如果是INVITE请求
		dlgs_init("$fu", "$tu", "srcip=$si");  // 初始化对话
	}

	route(PSTN);  // 转发请求到PSTN

	route(LOCATION);  // 处理用户位置服务

	return;  // 返回
}

route[RELAY] {  // 转发请求的封装

	if (is_method("INVITE|BYE|SUBSCRIBE|UPDATE")) {  // 如果是INVITE、BYE、SUBSCRIBE或UPDATE请求
		if(!t_is_set("branch_route")) t_on_branch("MANAGE_BRANCH");  // 设置分支路由
	}
	if (is_method("INVITE|SUBSCRIBE|UPDATE")) {  // 如果是INVITE、SUBSCRIBE或UPDATE请求
		if(!t_is_set("onreply_route")) t_on_reply("MANAGE_REPLY");  // 设置回复路由
	}
	if (is_method("INVITE")) {  // 如果是INVITE请求
		if(!t_is_set("failure_route")) t_on_failure("MANAGE_FAILURE");  // 设置失败路由
	}

	if (!t_relay()) {  // 如果转发失败
		sl_reply_error();  // 发送错误响应
	}
	exit;  // 退出
}

route[REQINIT] {  // 请求初始化检查
	set_reply_no_connect();  // 设置不连接回复
	force_rport();  // 强制使用请求的源端口

#!ifdef WITH_ANTIFLOOD  // 如果定义了WITH_ANTIFLOOD
	if(src_ip!=myself) {  // 如果请求源IP不是本机
		if($sht(ipban=>$si)!=$null) {  // 如果IP已被封禁
			xdbg("request from blocked IP - $rm from $fu (IP:$si:$sp)\n");  // 记录调试信息
			exit;  // 退出
		}
		if (!pike_check_req()) {  // 如果检测到洪水攻击
			xalert("ALERT: pike blocking $rm from $fu (IP:$si:$sp)\n");  // 记录警报信息
			$sht(ipban=>$si) = 1;  // 封禁IP
			exit;  // 退出
		}
	}
#!endif
	if($ua =~ "friendly|scanner|sipcli|sipvicious|VaxSIPUserAgent|pplsip") {  // 如果User-Agent匹配已知扫描器
		exit;  // 退出
	}

	if (!mf_process_maxfwd_header("10")) {  // 如果Max-Forwards头超过10跳
		sl_send_reply("483", "Too Many Hops");  // 发送483响应
		exit;  // 退出
	}

	if(is_method("OPTIONS") && uri==myself && $rU==$null) {  // 如果是OPTIONS请求且URI为本机且无用户名
		sl_send_reply("200", "Keepalive");  // 发送200响应
		exit;  // 退出
	}

	if(!sanity_check("17895", "7")) {  // 如果请求格式不合法
		xlog("Malformed SIP request from $si:$sp\n");  // 记录错误日志
		exit;  // 退出
	}
}

route[WITHINDLG] {  // 处理SIP对话内的请求
	if (!has_totag()) return;  // 如果没有To标签,返回

	if (loose_route()) {  // 如果松散路由
		route(DLGURI);  // 更新对话URI
		dlgs_update();  // 更新对话状态
		if (is_method("BYE")) {  // 如果是BYE请求
			setflag(FLT_ACC);  // 设置计费标志
			setflag(FLT_ACCFAILED);  // 设置失败计费标志
		} else if ( is_method("ACK") ) {  // 如果是ACK请求
			route(NATMANAGE);  // 处理NAT
		} else if ( is_method("NOTIFY|REFER") ) {  // 如果是NOTIFY或REFER请求
			record_route();  // 记录路由
		}
		route(RELAY);  // 转发请求
		exit;  // 退出
	}

	if (is_method("SUBSCRIBE") && uri == myself) {  // 如果是SUBSCRIBE请求且URI为本机
		route(PRESENCE);  // 处理Presence请求
		exit;  // 退出
	}
	if ( is_method("ACK") ) {  // 如果是ACK请求
		if ( t_check_trans() ) {  // 如果事务存在
			route(RELAY);  // 转发请求
			exit;  // 退出
		} else {  // 否则
			exit;  // 退出
		}
	}
	sl_send_reply("404", "Not here");  // 发送404响应
	exit;  // 退出
}

route[REGISTRAR] {  // 处理注册请求
	if (!is_method("REGISTER")) return;  // 如果不是REGISTER请求,返回

	if(isflagset(FLT_NATS)) {  // 如果NAT标志已设置
		setbflag(FLB_NATB);  // 设置NAT分支标志
#!ifdef WITH_NATSIPPING  // 如果定义了WITH_NATSIPPING
		setbflag(FLB_NATSIPPING);  // 设置NAT SIP PING标志
#!endif
	}
	if (!save("location")) {  // 如果保存位置失败
		sl_reply_error();  // 发送错误响应
	}
	exit;  // 退出
}

route[LOCATION] {  // 处理用户位置服务

#!ifdef WITH_SPEEDDIAL  // 如果定义了WITH_SPEEDDIAL
	if($rU=~"^[0-9][0-9]$") {  // 如果RURI是2位数字
		if(sd_lookup("speed_dial")) {  // 查找速拨号码
			route(SIPOUT);  // 转发请求
		}
	}
#!endif

#!ifdef WITH_ALIASDB  // 如果定义了WITH_ALIASDB
	if(alias_db_lookup("dbaliases")) {  // 查找数据库别名
		route(SIPOUT);  // 转发请求
	}
#!endif

	$avp(oexten) = $rU;  // 设置AVP变量
	if (!lookup("location")) {  // 如果查找位置失败
		$var(rc) = $rc;  // 保存返回码
		route(TOVOICEMAIL);  // 转发到语音邮件
		t_newtran();  // 创建新事务
		switch ($var(rc)) {  // 根据返回码处理
			case -1:
			case -3:
				send_reply("404", "Not Found");  // 发送404响应
				exit;  // 退出
			case -2:
				send_reply("405", "Method Not Allowed");  // 发送405响应
				exit;  // 退出
		}
	}

	if (is_method("INVITE")) {  // 如果是INVITE请求
		setflag(FLT_ACCMISSED);  // 设置未接来电计费标志
	}

	route(RELAY);  // 转发请求
	exit;  // 退出
}

route[PRESENCE] {  // 处理Presence相关请求
	if(!is_method("PUBLISH|SUBSCRIBE")) return;  // 如果不是PUBLISH或SUBSCRIBE请求,返回

	if(is_method("SUBSCRIBE") && $hdr(Event)=="message-summary") {  // 如果是SUBSCRIBE请求且Event头为message-summary
		route(TOVOICEMAIL);  // 转发到语音邮件
		sl_send_reply("404", "No voicemail service");  // 发送404响应
		exit;  // 退出
	}

#!ifdef WITH_PRESENCE  // 如果定义了WITH_PRESENCE
#!ifdef WITH_MSGREBUILD  // 如果定义了WITH_MSGREBUILD
	msg_apply_changes();  // 应用消息更改
#!endif
	if (!t_newtran()) {  // 如果创建新事务失败
		sl_reply_error();  // 发送错误响应
		exit;  // 退出
	}

	if(is_method("PUBLISH")) {  // 如果是PUBLISH请求
		handle_publish();  // 处理PUBLISH请求
		t_release();  // 释放事务
	} else if(is_method("SUBSCRIBE")) {  // 如果是SUBSCRIBE请求
		handle_subscribe();  // 处理SUBSCRIBE请求
		t_release();  // 释放事务
	}
	exit;  // 退出
#!endif

	if (is_method("PUBLISH") || $rU==$null) {  // 如果是PUBLISH请求或RURI为空
		sl_send_reply("404", "Not here");  // 发送404响应
		exit;  // 退出
	}
	return;  // 返回
}

route[AUTH] {  // 处理认证
#!ifdef WITH_AUTH  // 如果定义了WITH_AUTH

#!ifdef WITH_IPAUTH  // 如果定义了WITH_IPAUTH
	if((!is_method("REGISTER")) && allow_source_address()) {  // 如果不是REGISTER请求且源IP允许
		return;  // 返回
	}
#!endif

	if (is_method("REGISTER") || from_uri==myself) {  // 如果是REGISTER请求或来自本机
		if (!auth_check("$fd", "subscriber", "1")) {  // 如果认证失败
			auth_challenge("$fd", "0");  // 发送认证挑战
			exit;  // 退出
		}
		if(!is_method("REGISTER|PUBLISH"))
			consume_credentials();  // 消耗认证凭证
	}
	if (from_uri!=myself && uri!=myself) {  // 如果请求不是来自本机且URI不是本机
		sl_send_reply("403", "Not relaying");  // 发送403响应
		exit;  // 退出
	}

#!else  // 否则

	if(uri!=myself) {  // 如果URI不是本机
		sl_send_reply("403", "Not relaying");  // 发送403响应
		exit;  // 退出
	}

#!endif
	return;  // 返回
}

route[NATDETECT] {  // 检测NAT
#!ifdef WITH_NAT  // 如果定义了WITH_NAT

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值