diff --git a/core/AmConfig.cpp b/core/AmConfig.cpp index 2891da91..afd04871 100644 --- a/core/AmConfig.cpp +++ b/core/AmConfig.cpp @@ -70,6 +70,10 @@ unsigned int AmConfig::SessionLimit = 0; unsigned int AmConfig::SessionLimitErrCode = 503; string AmConfig::SessionLimitErrReason = "Server overload"; +unsigned int AmConfig::OptionsSessionLimit = 0; +unsigned int AmConfig::OptionsSessionLimitErrCode = 503; +string AmConfig::OptionsSessionLimitErrReason = "Server overload"; + vector AmConfig::CodecOrder; Dtmf::InbandDetectorType @@ -368,6 +372,18 @@ int AmConfig::readConfiguration() } } + if(cfg.hasParameter("options_session_limit")){ + vector limit = explode(cfg.getParameter("options_session_limit"), ";"); + if (limit.size() != 3) { + ERROR("invalid options_session_limit specified.\n"); + } else { + if (str2i(limit[0], OptionsSessionLimit) || str2i(limit[1], OptionsSessionLimitErrCode)) { + ERROR("invalid options_session_limit specified.\n"); + } + OptionsSessionLimitErrReason = limit[2]; + } + } + return 0; } diff --git a/core/AmConfig.h b/core/AmConfig.h index f99d7408..1ef51aaf 100644 --- a/core/AmConfig.h +++ b/core/AmConfig.h @@ -110,6 +110,10 @@ struct AmConfig static unsigned int SessionLimitErrCode; static string SessionLimitErrReason; + static unsigned int OptionsSessionLimit; + static unsigned int OptionsSessionLimitErrCode; + static string OptionsSessionLimitErrReason; + /** Time of no RTP after which Session is regarded as dead, 0 for no Timeout */ static unsigned int DeadRtpTime; diff --git a/core/AmSipDispatcher.cpp b/core/AmSipDispatcher.cpp index c44ddd27..9b18831c 100644 --- a/core/AmSipDispatcher.cpp +++ b/core/AmSipDispatcher.cpp @@ -92,7 +92,15 @@ void AmSipDispatcher::handleSipMsg(AmSipRequest &req) else if(req.method == "OPTIONS"){ // Basic OPTIONS support - AmSipDialog::reply_error(req,200,"OK"); + if (!AmConfig::OptionsSessionLimit || + (AmSession::getSessionNum() < AmConfig::OptionsSessionLimit)) { + AmSipDialog::reply_error(req, 200, "OK"); + } else { + // return error code if near to overload + AmSipDialog::reply_error(req, + AmConfig::OptionsSessionLimitErrCode, + AmConfig::OptionsSessionLimitErrReason); + } return; } else if( (req.method == "CANCEL") || diff --git a/core/etc/sems.conf.sample b/core/etc/sems.conf.sample index abfccd05..8d581306 100644 --- a/core/etc/sems.conf.sample +++ b/core/etc/sems.conf.sample @@ -244,6 +244,18 @@ loglevel=2 # Example: # session_limit="1000;503;Server overload" +# optional parameter: options_session_limit=;; +# +# - this sets a custom response to OPTIONS, if the session count reaches +# a certain limit. This way health monitor could raise an alarm to syste +# administrator. +# +# Default: 0 (None) +# +# Example: +# options_session_limit="900;503;Warning, server soon overloaded" + + # optional parameter: dead_rtp_time= # # - if != 0, after this time (in seconds) of no RTP