<!-- Module User's Guide -->

<chapter>
	
	<title>&adminguide;</title>
	
	<section id="overview" xreflabel="Overview">
	<title>Overview</title>
	<para>
		The module implements all the operations regarding MaX-Forward header 
		field, like adding it (if not present) or decrementing and checking 
		the value of the existent one.
	</para>
	</section>
	<section id="dependencies" xreflabel="Dependencies">
	<title>Dependencies</title>
	<section>
		<title>&osips; Modules</title>
		<para>
		The following modules must be loaded before this module:
			<itemizedlist>
			<listitem>
			<para>
				<emphasis>No dependencies on other &osips; modules</emphasis>.
			</para>
			</listitem>
			</itemizedlist>
		</para>
	</section>
	<section>
		<title>External Libraries or Applications</title>
		<para>
		The following libraries or applications must be installed before 
		running &osips; with this module loaded:
			<itemizedlist>
			<listitem>
			<para>
				<emphasis>None</emphasis>.
			</para>
			</listitem>
			</itemizedlist>
		</para>
	</section>
	</section>

	<section id="exported_parameters" xreflabel="Exported Parameters">
	<title>Exported Parameters</title>
	<section id="param_max_limit" xreflabel="max_limit">
		<title><varname>max_limit</varname> (integer)</title>
		<para>
		Set an upper limit for the max-forward value in the outgoing requests.
		If the header is present, the decremented value is not allowed to 
		exceed this max_limits - if it does, the header value will by 
		decreased to <quote>max_limit</quote>.
		</para>
		<para>Note: This check is done when calling the 
		mf_process_maxfwd_header() header.
		</para>
		<para>
		The range of values stretches from 1 to 256, which is the maximum 
		MAX-FORWARDS value allowed by RFC 3261.
		</para>
		<para>
		<emphasis>
			Default value is <quote>256</quote>.
		</emphasis>
		</para>
		<example>
		<title>Set <varname>max_limit</varname> parameter</title>
		<programlisting format="linespecific">
...
modparam("maxfwd", "max_limit", 32)
...
</programlisting>
		</example>
	</section>
	</section>


	<section id="exported_functions" xreflabel="exported_functions">
	<title>Exported Functions</title>
	<section id="func_mf_process_maxfwd_header" xreflabel="mf_process_maxfwd_header()">
		<title>
		<function moreinfo="none">mf_process_maxfwd_header(max_value)</function>
		</title>
		<para>
		If no Max-Forward header is present in the received request, a header 
		will be added having the original value equal with 
		<quote>max_value</quote>. If a Max-Forward header is already present,
		its value will be decremented (if not 0).
		</para>
		<para>Retuning codes:</para>
		<itemizedlist>
		<listitem>
			<para><emphasis>2 (true)</emphasis> - header was not found and
			a new header was successfully added.
			</para>
		</listitem>
		<listitem>
			<para><emphasis>1 (true)</emphasis> - header was found and its 
			value was successfully decremented (had a non-0 value).
			</para>
		</listitem>
		<listitem>
			<para><emphasis>-1 (false)</emphasis> - the header was found and
			its value is 0 (cannot be decremented).
			</para>
		</listitem>
		<listitem>
			<para><emphasis>-2 (false)</emphasis> - error during processing.
			</para>
		</listitem>
		</itemizedlist>
		<para>
		The return code may be extensivly tested via script variable 
		<quote>retcode</quote> (or <quote>$?</quote>).
		</para>
		<para>Meaning of the parameters is as follows:</para>
		<itemizedlist>
		<listitem>
			<para><emphasis>max_value</emphasis> (int) - Value to be added if 
			there is no Max-Forwards header field in the message.
			</para>
		</listitem>
		</itemizedlist>
		<para>
		This function can be used from REQUEST_ROUTE.
		</para>
		<example>
		<title><function>mx_process_maxfwd_header</function> usage</title>
		<programlisting format="linespecific">
...
# initial sanity checks -- messages with
# max_forwards==0, or excessively long requests
if (!mf_process_maxfwd_header(10) &amp;&amp; $retcode==-1) {
	sl_send_reply(483,"Too Many Hops");
	exit;
};
...
</programlisting>
		</example>
	</section>

	<section id="func_is_maxfwd_lt" xreflabel="is_maxfwd_lt()">
		<title>
		<function moreinfo="none">is_maxfwd_lt(max_value)</function>
		</title>
		<para>
		Checks if the Max-Forward header value is less then the 
		<quote>max_value</quote> parameter value. It considers also the value
		of the new inserted header (if locally added).
		</para>
		<para>Retuning codes:</para>
		<itemizedlist>
		<listitem>
			<para><emphasis>1 (true)</emphasis> - header was found or set and 
			its value is strictly less than <quote>max_value</quote>.
			</para>
		</listitem>
		<listitem>
			<para><emphasis>-1 (false)</emphasis> - the header was found or 
			set and its value is greater or equal to <quote>max_value</quote>.
			</para>
		</listitem>
		<listitem>
			<para><emphasis>-2 (false)</emphasis> - header was not found or
			not set.
			</para>
		</listitem>
		<listitem>
			<para><emphasis>-3 (false)</emphasis> - error during processing.
			</para>
		</listitem>
		</itemizedlist>
		<para>
		The return code may be extensivly tested via script variable 
		<quote>retcode</quote> (or <quote>$?</quote>).
		</para>
		<para>Meaning of the parameters is as follows:</para>
		<itemizedlist>
		<listitem>
			<para><emphasis>max_value</emphasis> (int) - value to check the 
			Max-Forward.value against (as less than).
			</para>
		</listitem>
		</itemizedlist>
		<example>
		<title><function>is_maxfwd_lt</function> usage</title>
		<programlisting format="linespecific">
...
# next hope is a gateway, so make no sens to
# forward if MF is 0 (after decrement)
if ( is_maxfwd_lt(1) ) {
	sl_send_reply(483,"Too Many Hops");
	exit;
};
...
</programlisting>
		</example>
	</section>

	</section>
</chapter>

