[Serusers] failure route and ERROR: t_should_relay: status rewrite by UAS: stored: 408, received: 487

Jim Burwell jimb at jsbc.cc
Thu Jan 29 02:15:32 CET 2004


Well, in doing this I never had a problem with one SER handling normal 
and voicemail calls.  You just have to implement the proper logic.  
Basically, the pseudo-code:

    IF call is for ME (my SIP domain) THEN {
        IF callee is NOT online THEN {
            IF callee is in voicemail group THEN {
               call VM system immediately with URI modified signaling
                  "answer immediately"
               break
            } ELSE (callee is NOT in voicemail group) {
               return 404 (user not found)
               break
            }
        } ELSE (callee is online) {
            IF callee is in voicemail group THEN {
               append destination set including VM system with URI
                  modified signaling "wait before answering"
            }
        }
    }

    relay call to dest set

This approach has worked in all my testing.  However, it may not be 
ideal for reasons I mentioned before.

What would be far nicer is having per branch or call timers one could 
set in the SER script.  But in all likelyhood the schizophrenia caused 
by the conflict of the value proposition of SIP being 'light weight' and 
'stateless' conflicting with the reality of SIP requiring state to give 
us basic real-world functionalities such as accounting and timed-out 
voicemail will result in this not happening any time soon, IMHO :-).

- Jim



Alan Crosswell wrote:

> Jim,
>
> I've been catching up to where you have already been with respect to 
> failure route and the single global fr_inv_timer.  It just doesn't 
> work if the same SER is fielding invites for those having voicemail 
> and those not.  Before I go ahead and add a Wait 20 to my Asterisk 
> voicemail, I had one other idea I wanted to ask about:
>
> What if I run two ser instances?  The main one checks 
> is_user_in("Request-URI", "voicemail") and then punts any Invites for 
> that user to a second ser which implements the fr_inv_timer, 
> t_on_failure, etc. transfer to voicemail. Meanwhile all the 
> non-voicemail subscribers (including stuff sent to our PSTN gateway, 
> etc.) continues to chug along without the timer stuff happening.
>
> Does this sound like a reasonable approach?
>
> /a
>
>
> Jim Burwell wrote:
>
>> I've found that the whole system works better when you don't use 
>> failure_route() to do "time out" style voicemail.
>> I have a test setup where I just add a call to Asterisk immediately 
>> if the user is registered (has location entry) with a special prefix 
>> that gets matched in the * extensions.conf file, and causes * to 
>> simply wait for X seconds before answering.  If the calee phone(s) is 
>> answered, SER cancels the call to * and any other phones registered 
>> to the user.  If no phones are answered, * answers and sends the call 
>> to voicemail.
>>
>> For whatever reason, this approach seems more stable so far, and 
>> seems more compatible with more phones, etc, than the failure_route 
>> approach.  For instance, if you have a locations entry that points a 
>> user to another user, or more than one user (e.g. mainline at domain.com 
>> -> receptionist at domain.com -> receptionist@<phone-IP:port>), SER 
>> seems to get confused and sends a CANCEL to the voicemail system 
>> you've just triggered the INVITE to in your failure_route.  When 
>> doing it the other way, it doesn't seem to have this problem.
>> As for mapping user names to numeric extensions in Asterisk, I wrote 
>> an AGI script which does this by reverse-mapping the username to 
>> aliases in the SER script.  It requires that your users have 
>> numerical extensions assigned in the SER aliases database (e.g. 1234 
>> -> joe at domain.com).  If there are multiple #s mapped to the user, it 
>> just returns the lowest one.  Not sure if I can give this out though, 
>> since I wrote it for a client.
>>
>> - Jim
>>
>>
>> Alan Crosswell wrote:
>>
>>> I'm trying to do failure route to voicemail (which is working) but 
>>> this error is logged:
>>>
>>> ERROR: t_should_relay: status rewrite by UAS: stored: 408, received: 
>>> 487
>>>
>>> I googled this and see that this came up last in October 
>>> (http://lists.iptel.org/pipermail/serusers/2003-October/002921.html) 
>>> but I don't see any evidence of a solution in the thread.
>>>
>>> I suspect mine is the same problem as I have two UAs registered so 
>>> the initial dset is two places and then the append_branch on timeout 
>>> is just the voicemail uri.
>>>
>>> BTW, I am doing this with asterisk for the usual DTMF access reasons 
>>> (altough I haven't yet figured out how to map sip:alan at columbia.edu 
>>> to DTMF.  Maybe I'll have to give up and do numeric mailboxes:-(
>>> I am rewriting with a prefix of "vm*u" before punting over to 
>>> asterisk which has
>>> exten => _vm*u.,1,Wait,1
>>> exten => _vm*u.,2,Voicemail(${EXTEN:3})   exten => _vm*u.,3,Goto(#,1)
>>>
>>> Any pointers would be appreciated.  My not-yet-complete ser.cfg is 
>>> attached (not yet punting voicemail for unregistered subscribers; 
>>> just registered subscribers who time out the invite).
>>>
>>> /a
>>>
>>> ------------------------------------------------------------------------ 
>>>
>>>
>>> #
>>> # $Id: ser.cfg,v 1.21.2.1 2003/07/30 16:46:18 andrei Exp $
>>> #
>>> # simple quick-start config script
>>> #
>>>
>>> # ----------- global configuration parameters ------------------------
>>>
>>> debug=2         # debug level (cmd line: -dddddddddd)
>>> fork=yes
>>> log_stderror=no    # (cmd line: -E)
>>> #listen=128.59.39.127
>>>
>>> check_via=yes    # (cmd. line: -v)
>>> dns=no           # (cmd. line: -r)
>>> rev_dns=no      # (cmd. line: -R)
>>> port=5060
>>> children=4
>>> fifo="/tmp/ser_fifo"
>>> alias="columbia.edu"
>>> # ------------------ module loading ----------------------------------
>>>
>>> # Uncomment this if you want to use SQL database
>>> loadmodule "/usr/lib/ser/modules/mysql.so"
>>> loadmodule "/usr/lib/ser/modules/acc.so"
>>> loadmodule "/usr/lib/ser/modules/sl.so"
>>> loadmodule "/usr/lib/ser/modules/tm.so"
>>> loadmodule "/usr/lib/ser/modules/rr.so"
>>> loadmodule "/usr/lib/ser/modules/maxfwd.so"
>>> loadmodule "/usr/lib/ser/modules/usrloc.so"
>>> loadmodule "/usr/lib/ser/modules/registrar.so"
>>>
>>> # Uncomment this if you want digest authentication
>>> # mysql.so must be loaded !
>>> loadmodule "/usr/lib/ser/modules/auth.so"
>>> loadmodule "/usr/lib/ser/modules/auth_db.so"
>>>
>>> loadmodule "/usr/lib/ser/modules/exec.so"
>>>
>>> # ----------------- setting module-specific parameters ---------------
>>> # -- transaction timers --
>>> modparam("tm", "fr_inv_timer", 15 )
>>> modparam("tm", "fr_timer", 10 )
>>>
>>> # -- usrloc params --
>>> #
>>> modparam("usrloc", "db_mode", 2)
>>> modparam("usrloc", "timer_interval", 10)
>>>
>>> # -- auth params --
>>> modparam("auth_db", "calculate_ha1", yes)
>>> modparam("auth_db", "password_column", "password")
>>>
>>> # -- rr params --
>>> # add value to ;lr param to make some broken UAs happy
>>> modparam("rr", "enable_full_lr", 1)
>>>
>>> # -- acc params --
>>> modparam("acc", "log_level", 1)
>>> modparam("acc", "log_flag", 1 )
>>> modparam("acc", "log_missed_flag", 2)
>>> # -------------------------  request routing logic -------------------
>>>
>>> # main routing logic
>>>
>>> route{
>>>
>>>        /* ********* ROUTINE CHECKS  
>>> ********************************** */
>>>     # initial sanity checks -- messages with
>>>     # max_forwards==0, or excessively long requests
>>>     if (!mf_process_maxfwd_header("10")) {
>>>         sl_send_reply("483","Too Many Hops");
>>>         break;
>>>     };
>>>     if (msg:len > max_len ) {
>>>         sl_send_reply("513", "Message too big");
>>>         break;
>>>     };
>>>
>>>     lookup("aliases");
>>>
>>>     # we record-route all messages -- to make sure that
>>>     # subsequent messages will go through our proxy; that's
>>>     # particularly good if upstream and downstream entities
>>>     # use different transport protocol
>>>     record_route();   
>>>     
>>>     # loose-route processing
>>>     if (loose_route()) {
>>>         t_relay();
>>>         break;
>>>     };
>>>
>>>     setflag(2);
>>>
>>>     # if the request is for other domain use UsrLoc
>>>     # (in case, it does not work, use the following command
>>>     # with proper names and addresses in it)
>>>     if (uri=~"^sip:(.+@)?columbia.edu") {
>>>
>>>         if (method=="REGISTER") {
>>>             log(1, "REGISTER received\n");
>>>             if (!www_authorize("columbia.edu", "subscriber")) {
>>>                 www_challenge("columbia.edu", "0");
>>>                 break;
>>>             };
>>>
>>>             save("location");
>>>             break;
>>>         };
>>>
>>> /* ********** Dial out to PSTN logic ************* */
>>>
>>>                # 5 Digit dialing, interior calls
>>>                if (uri=~"^si"^sip:[1347][0-9]{4}@columbia\.edu") {
>>>                        rewritehostport("128.59.59.242:5060");
>>>                        log(1,"5 digit expression match");
>>>                        route(2);
>>>                        break;
>>>                };
>>>
>>>
>>>         # 10 Digit dialing with outlide line
>>>         if (uri=~"^si"^sip:931[0-9]{10}@columbia\.edu") {
>>>                 if(!(src_ip=="128.59.59.242")             & 
>>> !(proxy_authorize("columbia.edu","subscriber"))) {
>>>             proxy_challenge("columbia.edu", "1");
>>>             break;
>>>
>>>         } else {
>>>                        rewritehostport("128.59.59.242:5060");
>>>                        log(1," 93 Outside line with 10 digit 
>>> expression match");
>>>                        route(2);
>>>                        break;
>>>         };
>>>                };
>>>
>>> /* voicemail access */
>>>         if (uri=~"^sip:\*86 at columbia\.edu"             
>>> |uri=~"^sip:vm at columbia\.edu"             
>>> |uri=~"^sip:voicemail at columbia\.edu") {
>>>             route(3);
>>>             break;
>>>         };
>>>
>>>         # native SIP destinations are handled using our USRLOC DB
>>>         if (!lookup("location")) {
>>>             if (!exec_dset("/etc/ser/sipldap")) {
>>>                 sl_send_reply("404", "Not Found");
>>>                 break;
>>>             } else {
>>>                             log(1," sipldap call");
>>>             };
>>>         }; #!lookup
>>>
>>>     };
>>>     if (method == "INVITE") {
>>>             t_on_failure("1");
>>>     };
>>>     # forward to current uri now; use stateful forwarding; that
>>>     # works reliably even if we forward from TCP to UDP
>>>     if (!t_relay()) {
>>>         sl_reply_error();
>>>     };     
>>> }
>>>
>>> route[2] {              log(1,"route[2]:SIP-to-PSTN call routed");
>>>        if (!t_relay()) {
>>>                sl_reply_error();
>>>        };
>>> }
>>> # ---- voicemail user access ----
>>> route[3] {
>>>     rewritehostport("127.0.0.1:5069");
>>>     log(1,"voicemail access");
>>>        if (!t_relay()) {
>>>                sl_reply_error();
>>>        };
>>> }
>>> # ------------- handling of unregistered user ------------------
>>> route[4] {
>>>
>>>     log(1,"route[4]: user not registered");
>>>        # non-Voip -- just send "off-line"
>>>        if (!(method == "INVITE" || method == "ACK" || method == 
>>> "CANCEL")) {
>>>                sl_send_reply("404", "Not Found");
>>>                break;
>>>        };
>>>
>>>        # not voicemail subscriber
>>> #        if (!isflagset(4)) { #                sl_send_reply("404", 
>>> "Not Found and no voicemail turned on");
>>> #               break;
>>> #       };
>>>
>>>        # forward to voicemail now
>>>     prefix("vm*u");
>>>        rewritehostport("127.0.0.1:5069");
>>>        t_relay_to_udp("127.0.0.1", "5069");
>>> }
>>> failure_route[1] {
>>>     # transfer to asterisk voicemail with uMAILBOX for unavailable.
>>>     # sip:USER at columbia.edu -> sip:vm*uUSER at 127.0.0.1:5069
>>>        t_on_failure("2");
>>>     prefix("vm*u");
>>>        rewritehostport("127.0.0.1:5069");
>>>     append_branch();
>>>     log(1,"redirection to voicemail\n");
>>>     t_relay();
>>> }
>>>
>>> failure_route[2] {
>>>     # forwarding failed (voicemail down?)
>>>     log(1,"voicemail failed\n");
>>>     t_reply("500","Weasels have eaten voicemail again");
>>> }
>>>
>>>
>>>  
>>>
>>> ------------------------------------------------------------------------ 
>>>
>>>
>>> _______________________________________________
>>> Serusers mailing list
>>> serusers at lists.iptel.org
>>> http://lists.iptel.org/mailman/listinfo/serusers
>>>  
>>>
>>
>> -- 
>> +---------------------------------------------------------------------------+ 
>>
>> |         Jim Burwell - Sr. Systems/Network/Security Engineer, 
>> JSBC         |
>> +---------------------------------------------------------------------------+ 
>>
>> | "I never let my schooling get in the way of my education." - Mark 
>> Twain   |
>> | "UNIX was never designed to keep people from doing stupid things, 
>> because |
>> |  that policy would also keep them from doing clever things." - Doug 
>> Gwyn  |
>> | "Cool is only three letters away from Fool" - Mike Muir, 
>> Suicyco          |
>> | "..Government in its best state is but a necessary evil; in its 
>> worst     |
>> |  state an intolerable one.." - Thomas Paine, "Common Sense" 
>> (1776)        |
>> +---------------------------------------------------------------------------+ 
>>
>> |   Email:  jimb at jsbc.cc                              ICQ UIN:  
>> 1695089     |
>> +---------------------------------------------------------------------------+ 
>>
>> |  Reply problems ?  Turn off the "sign" function in email prog.  
>> Blame MS. |
>> +---------------------------------------------------------------------------+ 
>>
>>

-- 
+---------------------------------------------------------------------------+
|         Jim Burwell - Sr. Systems/Network/Security Engineer, JSBC         |
+---------------------------------------------------------------------------+
| "I never let my schooling get in the way of my education." - Mark Twain   |
| "UNIX was never designed to keep people from doing stupid things, because |
|  that policy would also keep them from doing clever things." - Doug Gwyn  |
| "Cool is only three letters away from Fool" - Mike Muir, Suicyco          |
| "..Government in its best state is but a necessary evil; in its worst     |
|  state an intolerable one.." - Thomas Paine, "Common Sense" (1776)        |
+---------------------------------------------------------------------------+
|   Email:  jimb at jsbc.cc                              ICQ UIN:  1695089     |
+---------------------------------------------------------------------------+
|  Reply problems ?  Turn off the "sign" function in email prog.  Blame MS. |
+---------------------------------------------------------------------------+

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sip-router.org/pipermail/sr-users/attachments/20040128/02ea6e5e/attachment.htm>


More information about the sr-users mailing list