ConfigLogger::log_value("max_uri_len", config->maxUriLen);
ConfigLogger::log_value("max_via_len", config->maxViaLen);
ConfigLogger::log_list("methods", methods.c_str());
+ ConfigLogger::log_value("sip_timeout", config->sip_timeout);
+ ConfigLogger::log_value("sip_media_timeout", config->sip_media_timeout);
+ ConfigLogger::log_value("sip_invite_timeout", config->sip_invite_timeout);
+ ConfigLogger::log_value("sip_disconnect_timeout", config->sip_disconnect_timeout);
}
void Sip::eval(Packet* p)
uint16_t maxViaLen; // Maximum Via field size
uint16_t maxContactLen; // Maximum Contact field size
uint16_t maxContentLen; // Maximum Content length
+ uint64_t sip_timeout;
+ uint64_t sip_media_timeout;
+ uint64_t sip_invite_timeout;
+ uint64_t sip_disconnect_timeout;
bool ignoreChannel; // Whether to ignore media channels found by SIP PP
};
switch (methodFlag)
{
case SIP_METHOD_INVITE:
-
+ {
ret = SIP_processInvite(sipMsg, dialog, dList);
+ if (ret and (config->sip_invite_timeout))
+ {
+ p->flow->set_idle_timeout(config->sip_invite_timeout);
+ }
break;
-
+ }
case SIP_METHOD_CANCEL:
-
+ {
if (nullptr == dialog)
return false;
/*dialog can be deleted in the early state*/
if ((SIP_DLG_EARLY == dialog->state)||(SIP_DLG_INVITING == dialog->state)
|| (SIP_DLG_CREATE == dialog->state))
SIP_deleteDialog(dialog, dList);
-
+ if (config->sip_disconnect_timeout)
+ p->flow->set_idle_timeout(config->sip_disconnect_timeout);
break;
+ }
case SIP_METHOD_ACK:
-
+ {
SIP_processACK(sipMsg, dialog, dList, p, config);
+ if (config->sip_timeout)
+ p->flow->set_idle_timeout(config->sip_timeout);
break;
+ }
case SIP_METHOD_BYE:
-
+ {
if (SIP_DLG_ESTABLISHED == dialog->state)
dialog->state = SIP_DLG_TERMINATING;
+
+ if (config->sip_disconnect_timeout)
+ p->flow->session_state |= STREAM_STATE_CLOSED;
break;
+ }
default:
// media session
if ( !SIP_checkMediaChange(sipMsg, dialog) )
{
+ if (config->sip_media_timeout)
+ p->flow->set_idle_timeout(config->sip_media_timeout);
SIP_updateMedias(sipMsg.mediaSession, dialog->mediaSessions);
SIP_ignoreChannels(*currDialog, p,config);
sipMsg.mediaUpdated = true;
#include "config.h"
#endif
+#include "log/messages.h"
#include "sip_module.h"
#include <cassert>
{ "methods", Parameter::PT_STRING, nullptr, default_methods,
"list of methods to check in SIP messages" },
+ { "sip_timeout", Parameter::PT_INT, "0:", "0",
+ "SIP Timeout value in milliseconds" },
+
+ { "sip_media_timeout", Parameter::PT_INT, "0:", "0",
+ "SIP Media timeout milliseconds" },
+
+ { "sip_invite_timeout", Parameter::PT_INT, "0:", "0",
+ "SIP Invite timeout milliseconds" },
+
+ { "sip_disconnect_timeout", Parameter::PT_INT, "0:", "0",
+ "SIP Disconnect timeout milliseconds" },
+
{ nullptr, Parameter::PT_MAX, nullptr, nullptr, nullptr }
};
else if ( v.is("methods") )
sip_methods = v.get_string();
+ else if ( v.is("sip_timeout") )
+ conf->sip_timeout = v.get_uint64()/1000;
+
+ else if ( v.is("sip_invite_timeout") )
+ conf->sip_invite_timeout = v.get_uint64()/1000;
+
+ else if ( v.is("sip_media_timeout") )
+ conf->sip_media_timeout = v.get_uint64()/1000;
+
+ else if ( v.is("sip_disconnect_timeout") )
+ conf->sip_disconnect_timeout = v.get_uint64()/1000;
+
return true;
}