//--------------------------------------------------------------------- // Static members /// <summary> /// Constructs an instance from settings loaded from the application configuration. /// </summary> /// <param name="keyPrefix">The configuration key prefix.</param> /// <remarks> /// <para> /// The RADIUS client settings are loaded from the application /// configuration, using the specified key prefix. The following /// settings are recognized by the class: /// </para> /// <div class="tablediv"> /// <table class="dtTABLE" cellspacing="0" ID="Table1"> /// <tr valign="top"> /// <th width="1">Setting</th> /// <th width="1">Default</th> /// <th width="90%">Description</th> /// </tr> /// <tr valign="top"> /// <td>Type</td> /// <td>UDP</td> /// <td> /// Specifies the transport type. This must be one /// of the following values: <b>UDP</b>, <b>TCP</b>, or <b>TLS</b>. /// </td> /// </tr> /// <tr valign="top"> /// <td>Binding</td> /// <td>ANY:SIP</td> /// <td> /// The <see cref="NetworkBinding" /> the transport should use /// when binding to the network interface. /// </td> /// </tr> /// <tr valign="top"> /// <td>ExternalBinding</td> /// <td>(see note)</td> /// <td> /// The <see cref="NetworkBinding" /> that specifies how external clients /// will access the transport. This will typically be set to the IP /// address and port on the WAN side of the firewall/router that is /// mapped to the <b>Binding</b> specified above. This defaults to /// <b>Binding</b> unless its IP address is <see cref="IPAddress.Any" />. /// If this is the case, then <b>ExternalBinding</b> will default to /// the IP address of the first active network adapter found and the /// port specified in <b>Binding</b>. /// </td> /// </tr> /// <tr valign="top"> /// <td>BufferSize</td> /// <td>32K</td> /// <td> /// Byte size of the socket's send and receive buffers. /// </td> /// </tr> /// <tr valign="top"> /// <td>Timers.*</td> /// <td>(see note)</td> /// <td> /// This subsection can be used to override the default /// timers used by user agents for this transport. /// See the <see cref="SipBaseTimers" /> class' <see cref="SipBaseTimers.LoadConfig" /> /// method for more information. /// </td> /// </tr> /// </table> /// </div> /// <para> /// Transport settings can be specified in an application configuration /// section. Applications will often use a configuration array so that /// multiple transports can be specified. /// </para> /// </remarks> public static SipTransportSettings LoadConfig(string keyPrefix) { var settings = new SipTransportSettings(); var config = new Config(keyPrefix); settings.TransportType = config.Get <SipTransportType>("Type", settings.TransportType); settings.Binding = config.Get("Binding", settings.Binding); settings.ExternalBinding = config.Get("ExternalBinding", settings.Binding); settings.BufferSize = config.Get("BufferSize", settings.BufferSize); settings.BaseTimers = SipBaseTimers.LoadConfig(config.KeyPrefix + "Timers"); return(settings); }
//--------------------------------------------------------------------- // Static members /// <summary> /// Loads the settings from the application configuration. /// </summary> /// <param name="keyPrefix">The configuration key prefix.</param> /// <returns>The loaded <see cref="SipCoreSettings" />.</returns>\ /// <remarks> /// <div class="tablediv"> /// <table class="dtTABLE" cellspacing="0" ID="Table1"> /// <tr valign="top"> /// <th width="1">Setting</th> /// <th width="1">Default</th> /// <th width="90%">Description</th> /// </tr> /// <tr valign="top"> /// <td>LocalContact</td> /// <td>(see note)</td> /// <td> /// <para> /// Specifies necessary information to be included in the <b>Contact</b> header in /// requests and responses generated by the core. This can be a full contact heading /// with a display name, SIP URI, and contact parameters, or just an IP address or /// host name. Full SIP URIs will be used <i>as is</i> when used in a <b>Contact</b> /// header. A SIP URI will be generated on the fly from an IP address or host by adding /// the port and transport parameter based on the actual transport used. This defaults to /// the first active IP address found on the machine. /// </para> /// <note> /// SIP URIs with parameters (such as "transport=tcp") <b>must be surrounded by angle brackets:</b> /// "<" and ">". /// </note> /// </td> /// </tr> /// <tr valign="top"> /// <td>OutboundProxy</td> /// <td>(none)</td> /// <td> /// Specifies outbound proxy SIP URI where the core should route all /// outbound SIP requests. Set this to <c>null</c> to route requests /// directly to their destination. /// </td> /// </tr> /// <tr valign="top"> /// <td>UserAgent</td> /// <td>LillTek SIP <version></td> /// <td> /// Specifies the value to use as the <b>User-Agent</b> header for SIP messages. /// </td> /// </tr> /// <tr valign="top"> /// <td>ServerAgent</td> /// <td>LillTek SIP <version></td> /// <td> /// Specifies the value to use as the <b>Server</b> header for SIP messages. /// </td> /// </tr> /// <tr valign="top"> /// <td>AutoAuthenticate</td> /// <td>yes</td> /// <td> /// Indicates that the core should automatically handle authentication /// challenges from proxies and remote SIP endpoints by computing /// appropriate response and resubmitting the request. /// </td> /// </tr> /// <tr valign="top"> /// <td>UserName</td> /// <td>(none)</td> /// <td> /// The account name used for authenticating with downstream SIP trunking proxies. /// </td> /// </tr> /// <tr valign="top"> /// <td>Password</td> /// <td>(none)</td> /// <td> /// The password name to use for authentication purposes. /// </td> /// </tr> /// <tr valign="top"> /// <td>TraceMode</td> /// <td><see cref="SipTraceMode.None" /></td> /// <td> /// Indicates whether the SIP core should generate <see cref="NetTrace" /> /// diagnostics. Note that <b>Diagnostics.TraceEnable[#]=0:LillTek.SIP</b> must /// also be set for this to work. Valid values are: <see cref="SipTraceMode.None" />, /// <see cref="SipTraceMode.Send" />, <see cref="SipTraceMode.Receive" />, and /// <see cref="SipTraceMode.All" />. /// </td> /// </tr> /// <tr valign="top"> /// <td>ServerTransactionTTL</td> /// <td>15m</td> /// <td> /// The maximum time a server side transaction will be maintained. Transactions /// that have existed for longer than this will be terminated. This helps /// prevent memory leaks due to hung or crashed server transaction handlers. /// </td> /// </tr> /// <tr valign="top"> /// <td>EarlyDialogTTL</td> /// <td>90s</td> /// <td> /// The maximum time an early dialog will be maintained by the core if the /// dialog isn't confirmed by the client. /// </td> /// </tr> /// <tr valign="top"> /// <td>BkInterval</td> /// <td>250ms</td> /// <td> /// The interval which the core should wake up to perform background tasks. /// </td> /// </tr> /// <tr valign="top"> /// <td>TransportBkInterval</td> /// <td>1s</td> /// <td> /// The interval at which transport background activities should be performed. /// </td> /// </tr> /// <tr valign="top"> /// <td>Transport[#]</td> /// <td>(see note)</td> /// <td> /// <para> /// The transport settings are loaded from the "Transport" subsection /// array. See <see cref="SipTransportSettings.LoadConfig" /> for /// information on the settings loaded from each of these subsections. /// </para> /// <para> /// This defaults to a single UDP transport binding to all network /// interfaces on port 5060. /// </para> /// </td> /// </tr> /// </table> /// </div> /// </remarks> public static SipCoreSettings LoadConfig(string keyPrefix) { var config = new Config(keyPrefix); var settings = new SipCoreSettings(); var transports = config.GetSectionKeyArray("Transport"); settings.LocalContact = config.Get("LocalContact", settings.LocalContact); settings.AutoAuthenticate = config.Get("AutoAuthenticate", settings.AutoAuthenticate); settings.UserName = config.Get("UserName", settings.UserName); settings.Password = config.Get("Password", settings.Password); settings.TraceMode = config.Get <SipTraceMode>("TraceMode", settings.TraceMode); settings.UserAgent = config.Get("UserAgent", settings.UserAgent); settings.ServerAgent = config.Get("ServerAgent", settings.ServerAgent); settings.ServerTransactionTTL = config.Get("ServerTransactionTTL", settings.ServerTransactionTTL); settings.EarlyDialogTTL = config.Get("EarlyDialogTTL", settings.EarlyDialogTTL); settings.BkInterval = config.Get("BkInterval", settings.BkInterval); settings.TransportBkInterval = config.Get("TransportBkInterval", settings.TransportBkInterval); string uri; uri = config.Get("OutboundProxy", (string)settings.OutboundProxyUri); if (string.IsNullOrWhiteSpace(uri)) { settings.OutboundProxyUri = null; // Treat blank as null } else { try { settings.OutboundProxyUri = new SipUri(uri); } catch (Exception e) { SysLog.LogException(e, "Cannot parse SIP Core setting [OutboundProxy]."); } } settings.TransportSettings = new SipTransportSettings[transports.Length]; for (int i = 0; i < transports.Length; i++) { settings.TransportSettings[i] = SipTransportSettings.LoadConfig(transports[i]); } return(settings); }
/// <summary> /// Starts the transport. /// </summary> /// <param name="settings">The <see cref="SipTransportSettings" />.</param> /// <param name="router">The <see cref="ISipMessageRouter" /> instance that will handle the routing of received messages.</param> /// <exception cref="SocketException">Thrown if there's a conflict with the requested and existing socket bindings.</exception> public void Start(SipTransportSettings settings, ISipMessageRouter router) { this.settings = settings; Start(settings.Binding, settings.BufferSize, router); }