<div class="gmail_quote">  Hi all!  <br><br>  I&#39;m trying to make Opensips 1.4.4 work as proxy and presence server. Proxy, with NAT support, seems to work - calls are redirected, voice is transmitted in both directions.<br>
<br>  Now I try to configure presence - it would be nice, if X-Lite shows user&#39;s availability and status. So, I&#39;ve got 2 questions:<br>  1) What options regarding to presence should be configured in X-Lite (Peer-to-peer, Presence agent)?<br>
  2) What&#39;s wrong and/or missing in my OpenSips configuration file?  As I see from logs, SUBSCRIBE, PUBLISH and NOTIFY messages are received by OpenSips, but X-Lite does not show user&#39;s availability/status.<br><br>
  My OpenSips configuration file is below. Note, that authorization is done via db_oracle, and in presence module I try to use db_berkeley. It&#39;s done dueto some reasons.  <br><br>  Thanks in advance!<br><br>  ===============================================================================<br>
<br># Run rtpproxy like this:<br># /usr/local/bin/rtpproxy -l xx.xxx.xxx.xx -s udp:*:7877 -F<br><br># For details, visit:<br># - <a href="http://voip.rus.net">http://voip.rus.net</a><br># - <a href="http://voip.rus.net/tiki-index.php?page=Sip+Express+Router">http://voip.rus.net/tiki-index.php?page=Sip+Express+Router</a><br>
<br># ------------------ module loading ---------------------------------<br><br># Set module path.<br># ----------------<br>mpath=&quot;/usr/local/lib/opensips/modules/&quot;<br><br>debug        = 2<br>fork         = yes<br>
log_stderror = no<br>log_facility = LOG_DAEMON<br>log_name     = &quot;opensips&quot;<br><br>listen       = udp:xx.xxx.xxx.xx:5060<br><br>dns          = no    # (cmd. line: -r)<br>rev_dns      = no    # (cmd. line: -R)<br>
<br><br># ------------------- Load modules  ----------------------------------<br><br>loadmodule &quot;db_oracle.so&quot;<br>loadmodule &quot;db_berkeley.so&quot;<br>loadmodule &quot;sl.so&quot;<br>loadmodule &quot;tm.so&quot;<br>
loadmodule &quot;rr.so&quot;<br>loadmodule &quot;maxfwd.so&quot;<br>loadmodule &quot;usrloc.so&quot;<br>loadmodule &quot;registrar.so&quot;<br>loadmodule &quot;auth.so&quot;<br>loadmodule &quot;auth_db.so&quot;<br>loadmodule &quot;uri.so&quot;<br>
loadmodule &quot;uri_db.so&quot;<br>loadmodule &quot;nathelper.so&quot;<br>loadmodule &quot;nat_traversal.so&quot;<br>loadmodule &quot;textops.so&quot;<br>loadmodule &quot;dialog.so&quot;<br>loadmodule &quot;xlog.so&quot;<br>
loadmodule &quot;uac.so&quot;<br>loadmodule &quot;avpops.so&quot;<br>loadmodule &quot;presence.so&quot;<br>loadmodule &quot;presence_mwi.so&quot;<br>loadmodule &quot;presence_xml.so&quot;<br>loadmodule &quot;xcap_client.so&quot;<br>
<br><br># ------------------- Set module-specific parameters -----------------<br><br># usrloc params<br># -------------<br>modparam(&quot;usrloc&quot;,    &quot;db_mode&quot;,   0)<br>modparam(&quot;usrloc&quot;,    &quot;nat_bflag&quot;, 6)<br>
<br># nathelper params<br># ----------------<br>modparam(&quot;nathelper&quot;, &quot;natping_interval&quot;, 20)<br>modparam(&quot;nathelper&quot;, &quot;ping_nated_only&quot;,  1)<br>modparam(&quot;nathelper&quot;, &quot;rtpproxy_sock&quot;,    &quot;udp:xx.xxx.xxx.xx:7877&quot;)<br>
modparam(&quot;nathelper&quot;, &quot;received_avp&quot;,     &quot;$avp(i:42)&quot;)<br><br># nat_traversal params<br># --------------------<br>modparam(&quot;nat_traversal&quot;, &quot;keepalive_interval&quot;,   30)<br>
modparam(&quot;nat_traversal&quot;, &quot;keepalive_method&quot;,     &quot;NOTIFY&quot;)<br>modparam(&quot;nat_traversal&quot;, &quot;keepalive_state_file&quot;, &quot;/var/run/opensips/keepalive_state&quot;)<br><br># dialog params<br>
# -------------<br>modparam(&quot;dialog&quot;, &quot;dlg_flag&quot;, 4)<br><br># rr params<br># ---------<br># add value to ;lr param to make some broken UAs happy<br>modparam(&quot;rr&quot;, &quot;enable_full_lr&quot;, 1)<br>
<br># auth db params<br># --------------<br>modparam(&quot;auth_db&quot;, &quot;db_url&quot;,        &quot;oracle://user:password@localhost/work&quot;)<br>modparam(&quot;auth_db&quot;, &quot;calculate_ha1&quot;, yes)<br>modparam(&quot;auth_db&quot;, &quot;use_domain&quot;,    0)<br>
<br># auth params<br># -----------<br>modparam(&quot;auth&quot;, &quot;rpid_suffix&quot;, &quot;;party=calling;id-type=subscriber;screen=yes&quot;)<br><br># uri db params<br># -------------<br>modparam(&quot;uri_db&quot;, &quot;use_uri_table&quot;, 0)<br>
modparam(&quot;uri_db&quot;, &quot;db_url&quot;,        &quot;&quot;)<br><br># registrar params<br># ----------------<br>modparam(&quot;registrar&quot;, &quot;default_expires&quot;, 60)<br>modparam(&quot;registrar&quot;, &quot;min_expires&quot;,     30)<br>
modparam(&quot;registrar&quot;, &quot;received_avp&quot;,    &quot;$avp(s:rcv)&quot;)<br><br># presense params<br># ---------------<br>modparam(&quot;presence&quot;,     &quot;db_url&quot;, &quot;berkeley:///usr/local/etc/opensips/db_berkeley/&quot;)<br>
modparam(&quot;presence_xml&quot;, &quot;force_active&quot;, 1)<br>modparam(&quot;presence&quot;, &quot;server_address&quot;, &quot;sip:xx.xxx.xxx.xx:5060&quot;)<br>modparam(&quot;presence&quot;, &quot;fallback2db&quot;, 0)<br>
modparam(&quot;presence&quot;, &quot;presentity_table&quot;, &quot;presentity&quot;)<br>modparam(&quot;presence&quot;, &quot;active_watchers_table&quot;, &quot;active_watchers&quot;)<br>modparam(&quot;presence&quot;, &quot;watchers_table&quot;, &quot;watchers&quot;)<br>
modparam(&quot;presence&quot;, &quot;clean_period&quot;, 100)<br>modparam(&quot;presence&quot;, &quot;to_tag_pref&quot;, &#39;pres&#39;)<br>modparam(&quot;presence&quot;, &quot;expires_offset&quot;, 10)<br><br># xcap params<br>
# -----------<br>modparam(&quot;xcap_client&quot;, &quot;db_url&quot;, &quot;berkeley:///usr/local/etc/opensips/db_berkeley/&quot;)<br>modparam(&quot;xcap_client&quot;, &quot;xcap_table&quot;,&quot;xcap&quot;)<br><br># presense_xml params<br>
# -------------------<br>modparam(&quot;presence_xml&quot;, &quot;db_url&quot;, &quot;berkeley:///usr/local/etc/opensips/db_berkeley/&quot;)<br>modparam(&quot;presence_xml&quot;, &quot;force_active&quot;, 0)<br>modparam(&quot;presence_xml&quot;, &quot;xcap_table&quot;, &quot;xcap&quot;)<br>
modparam(&quot;presence_xml&quot;, &quot;pidf_manipulation&quot;, 1)<br>modparam(&quot;presence_xml&quot;, &quot;integrated_xcap_server&quot;, 1)<br><br># -------------------------  request routing logic -------------------<br>
<br># main routing logic<br><br>route<br>{<br>    xlog(&quot;L_DBG&quot;, &quot;Main route\n&quot;);<br><br>    # Prevent buffer overflow.<br>    # ------------------------<br>    if (msg:len &gt; max_len)<br>    {<br>        sl_send_reply(&quot;513&quot;, &quot;Message Overflow&quot;);<br>
        return(0);<br>    };<br><br>    # Attempt to prevent eternal loop when failures occur.<br>    # ----------------------------------------------------<br>    if (!mf_process_maxfwd_header(&quot;10&quot;))<br>    {<br>
        sl_send_reply(&quot;483&quot;, &quot;Too Many Hops&quot;);<br>        return(0);<br>    };<br><br>    # Record route and NAT preset.<br>    # ----------------------------<br>    if (method == &quot;INVITE&quot; &amp;&amp; client_nat_test(&quot;3&quot;))<br>
    {<br>    xlog(&quot;L_INFO&quot;, &quot;DBG [$Tf] Got INVITE from NATed client\n&quot;);<br>        <br>        # Put the string into Record-Route section (Switch&#39;s IP and SIP-port).<br>        # -----------------------------------------------------------------------<br>
    record_route_preset(&quot;xx.xxx.xxx.xx:5060;nat=yes&quot;);<br>    }<br>    else if (method != &quot;REGISTER&quot; &amp;&amp; method != &quot;MESSAGE&quot;)<br>    {<br>        # Insert OpenSips address as a via header entry in the SIP message.<br>
        # -----------------------------------------------------------------<br>        record_route();<br>    }<br><br>    # Call tear down.<br>    # ---------------<br>    if ((method == &quot;BYE&quot; || method == &quot;CANCEL&quot;))<br>
    {<br>    xlog(&quot;L_INFO&quot;, &quot;DBG [$Tf] Unforcing RTP proxy - call tear down\n&quot;);<br>        <br>        # Stop RTP proxy session for current call.<br>        # ----------------------------------------<br>
        unforce_rtp_proxy();<br>    }<br><br>    # Loose Route.<br>    # loose_route() returns true if route headers are present.<br>    # It also removes any route header entries that match OpenSips own address(es).<br>    # -----------------------------------------------------------------------------<br>
    if (loose_route())<br>    {<br>        if (has_totag() &amp;&amp; (method == &quot;INVITE&quot; || method == &quot;ACK&quot;))<br>    {<br>            if (client_nat_test(&quot;3&quot;) || search(&quot;^Route:.*;nat=yes&quot;))<br>
        {<br>                setflag(6);<br>        force_rtp_proxy();<br>            };<br>        };<br><br>        route(1);<br>        return(0);<br>    };<br><br>    # Call type processing.<br>    # ---------------------<br>
    if (uri != myself)<br>    {<br>        route(1);<br>        return(0);<br>    };<br><br>    # Incoming messages handling.<br>    # ---------------------------<br>    if (uri == myself)<br>    {<br>        if (method == &quot;BYE&quot;)<br>
    {<br>            route(4);<br>            return(0);<br>        }<br>    else if (method == &quot;CANCEL&quot;)<br>    {<br>            route(4);<br>            return(0);<br>        }<br>    else if (method == &quot;INVITE&quot;)<br>
    {<br>            route(3);<br>            return(0);<br>        }<br>    else  if (method == &quot;REGISTER&quot;)<br>    {<br>            route(2);<br>            return(0);<br>        }<br>    else if (method == &quot;OPTIONS&quot;)<br>
    {<br>            sl_send_reply(&quot;200&quot;, &quot;Got it&quot;);<br>            return(0);<br>        }<br>    else if (method == &quot;SUBSCRIBE&quot; || method == &quot;PUBLISH&quot; || method == &quot;NOTIFY&quot;)<br>
    {<br>        route(5);<br>            return(0);<br>    }<br>    else if (method == &quot;MESSAGE&quot;)<br>    {<br>        xdbg(&quot;script: message not for room, from [$fu] r-uri [$ru] msg [$rb]\n&quot;);<br>        if (!lookup(&quot;location&quot;))<br>
        {<br>            sl_send_reply(&quot;404&quot;, &quot;not found&quot;);<br>            return(0);<br>        }<br>        <br>        t_relay();<br>    <br>        return(0);<br>    }<br>    };<br>    <br>    route(1);<br>
}<br><br><br># Default Message Handling<br># -----------------------<br>route[1]<br>{<br>    xlog(&quot;L_DBG&quot;, &quot;Route 1\n&quot;);<br><br>    t_on_reply(&quot;1&quot;);<br>    <br>    if (!t_relay())<br>    {<br>
        if ((method == &quot;INVITE&quot; || method == &quot;ACK&quot;) &amp;&amp; isflagset(6))<br>    {<br>        xlog(&quot;L_INFO&quot;, &quot;DBG [$Tf] Unforcing RTP proxy - NAT flag is set\n&quot;);<br>            unforce_rtp_proxy();<br>
    }<br><br>        sl_reply_error();<br>    };<br>}<br><br><br># REGISTER Message Handling<br># -------------------------<br>route[2]<br>{<br>    xlog(&quot;L_DBG&quot;, &quot;Route 4\n&quot;);<br><br>    if (!search(&quot;^Contact:\ +\*&quot;) &amp;&amp; client_nat_test(&quot;7&quot;))<br>
    {<br>    xlog(&quot;L_INFO&quot;, &quot;DBG [$Tf] Client registers behind NAT - fix URI and force rport\n&quot;);<br>        setflag(6);<br>        <br>        # Create URI consisting of the source IP, port, and protocol and store<br>
        # the URI in an Attribute-Value-Pair. The URI will be appended as &quot;received&quot;<br>        # parameter to Contact in 200 OK and registrar will store it in the user location database.<br>        # -----------------------------------------------------------------------------------------<br>
        fix_nated_register();<br>        <br>        # Add public port to the top-most Via header.<br>        # -------------------------------------------<br>        force_rport();<br>    <br>        # Ping NAT endpoints to keep them alive.<br>
        # --------------------------------------<br>        nat_keepalive();<br>    };<br><br>    sl_send_reply(&quot;100&quot;, &quot;Trying&quot;);<br><br>    # Perform authorization.<br>    # ----------------------<br>
    if (!www_authorize(&quot;&quot;, &quot;subscriber&quot;))<br>    {<br>        www_challenge(&quot;&quot;,&quot;0&quot;);<br>        return(0);<br>    };<br>    <br>    if (!check_to())<br>    {<br>        sl_send_reply(&quot;401&quot;, &quot;Unauthorized&quot;);<br>
        return(0);<br>    };<br>    <br>    consume_credentials();<br>    <br>    if (!save(&quot;location&quot;))<br>        sl_reply_error();<br>}<br><br># INVITE Message Handling<br># -----------------------<br>route[3]<br>
{<br>    xlog(&quot;L_DBG&quot;, &quot;Route 3\n&quot;);<br><br>    # Test for NAT, perhaps fix headers<br>    if (client_nat_test(&quot;3&quot;))<br>    {<br>    xlog(&quot;L_DBG&quot;, &quot;DBG [$Tf] NAT detected for caller\n&quot;);<br>
<br>        setflag(7);<br><br>        force_rport();<br><br>    force_rtp_proxy();<br>        <br>        # Rewrite Contact header to contain request&#39;s source address:port.<br>        # ----------------------------------------------------------------<br>
        fix_nated_contact();<br>    }<br>    <br>    xlog(&quot;L_INFO&quot;, &quot;Vars: fd = $fd, fu = $fu, od = $od, pd = $pd, rd = $rd, si = $si\n&quot;);<br><br>    # Calls from every IP (except of TelcoBridges&#39;s one) go to TelcoBridges.<br>
    # ----------------------------------------------------------------------<br>    if ((uri =~ &quot;sip:*@*&quot;) &amp;&amp; ($si != &quot;xx.xxx.xxx.xxy&quot;))<br>    {<br>    xlog(&quot;L_DBG&quot;, &quot;DBG [$Tf] Trying to authorize caller\n&quot;);<br>
<br>        # Perform authorization.<br>        # ----------------------    <br>        if (!proxy_authorize(&quot;&quot;, &quot;subscriber&quot;))<br>    {<br>        proxy_challenge(&quot;&quot;, &quot;0&quot;);<br>            return(0);<br>
        }<br>    else if (!check_from())<br>    {<br>        sl_send_reply(&quot;403&quot;, &quot;Use From ID&quot;);<br>            return(0);<br>        };<br><br>        consume_credentials();<br>    <br>    xlog(&quot;L_DBG&quot;, &quot;DBG [$Tf] Redirecting call to TelcoBridges\n&quot;);<br>
    rewritehostport(&quot;xx.xxx.xxx.xxy:5061&quot;);<br>    route(1);<br>    return(0);<br>    }<br><br>    # Rewrite SDP body to ensure that media is passed through an RTP proxy.<br>    # ---------------------------------------------------------------------<br>
    force_rtp_proxy();<br><br>    xlog(&quot;L_DBG&quot;, &quot;DBG [$Tf] Try to find user in usrloc\n&quot;);<br>    <br>    if (!lookup(&quot;location&quot;))<br>    {<br>        sl_send_reply(&quot;404&quot;, &quot;User not found, sorry&quot;);<br>
        return(0);<br>    }<br><br>    # If NAT is previously detected, proxy<br>    if (isflagset(6) || isflagset(7))<br>    {<br>    xlog(&quot;L_DBG&quot;, &quot;DBG [$Tf] NAT flag was previously set, force the use of RTP proxy\n&quot;);<br>
        force_rtp_proxy();<br>    }<br><br>    route(1);<br>}<br><br><br># CANCEL and BYE Message Handling<br># ----------------------------------<br>route[4]<br>{<br>    xlog(&quot;L_DBG&quot;, &quot;Route 4\n&quot;);<br>
<br>    if (client_nat_test(&quot;3&quot;))<br>    {<br>    xlog(&quot;L_DBG&quot;, &quot;DBG [$Tf] Handling CANCEL or BYE for NATed client, unforcing RTP proxy\n&quot;);<br>        setflag(7);<br>        force_rport();<br>
        fix_nated_contact();<br>    unforce_rtp_proxy();<br>    };<br>    <br>    route(1);<br><br>}<br><br># SUBSCRIBE and PUBLISH Message Handling<br># --------------------------------------<br>route[5]<br>{<br>    xlog(&quot;L_DBG&quot;, &quot;Route 5\n&quot;);<br>
    <br>    if (!t_newtran())<br>    {<br>    xlog(&quot;L_DBG&quot;, &quot;Failed to create transaction\n&quot;);<br>    sl_reply_error();<br>    exit;<br>    }<br>    <br>    if (is_method(&quot;PUBLISH&quot;))<br>    {<br>
        xlog(&quot;L_DBG&quot;, &quot;Route 5 - PUBLISH \n&quot;);<br>        handle_publish();<br>        t_release();<br>    }  <br>    else if (is_method(&quot;SUBSCRIBE&quot;))<br>    {<br>        xlog(&quot;L_DBG&quot;, &quot;Route 5 - SUBSCRIBE\n&quot;);<br>
        handle_subscribe();<br>        t_release();<br>    }<br>    else if (is_method(&quot;NOTIFY&quot;))<br>    {<br>    xlog(&quot;L_DBG&quot;, &quot;Route 5 - NOTIFY\n&quot;);<br>    t_reply(&quot;200&quot;, &quot;OK&quot;);<br>
    exit;        <br>    }<br>    <br>    <br>    exit; <br>}<br><br>onreply_route[1]<br>{<br>    xlog(&quot;L_DBG&quot;, &quot;OnReply route\n&quot;);<br><br>    if ((isflagset(6) || isflagset(7)) &amp;&amp; (status =~ &quot;(180)|(183)|2[0-9][0-9]&quot;))<br>
    {<br>    xlog(&quot;L_DBG&quot;, &quot;DBG [$Tf] OnReply: NAT flags are set\n&quot;);<br>    <br>        if (!search(&quot;^Content-Length:[ ]*0&quot;))<br>    {<br>        xlog(&quot;L_DBG&quot;, &quot;DBG [$Tf] Callee answered behind NAT, forcing RTP proxy\n&quot;);<br>
    <br>        force_rtp_proxy();<br>    }<br>    };<br>    <br>    if (nat_uac_test(&quot;19&quot;) &amp;&amp; search(&quot;Content-Type: application/sdp&quot;))<br>    {<br>        xlog(&quot;L_DBG&quot;, &quot;DBG [$Tf] OnReply: callee is behind NAT, forcing RTP proxy on reply\n&quot;);<br>
        force_rtp_proxy();<br>    }<br>    <br>    xlog(&quot;L_DBG&quot;, &quot;DBG [$Tf] Callee has answered\n&quot;);<br>    <br>    if (isflagset(6) || isflagset(7))<br>    {<br>    xlog(&quot;L_DBG&quot;, &quot;DBG [$Tf] OnReply: callee answered behind NAT, fix it\n&quot;);<br>
    fix_nated_contact();<br>    };<br>}<br><br></div><br>