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

David R. Kompel drk at drkngs.net
Thu Jan 29 20:04:40 CET 2004


I'm glad this issue was brought up when it was, cause I was just about
to post on it :) I am using the same trick for voice mail. The problem
is, if the user is busy, there is no way to detect it, since
t_on_failure doesn't call the failure_route[x], if only one of the forks
in the dset gets an error from the UAS.

It would be nice to see a way that the failure_route could get called if
any fork gets an error, and had a way to test for other existing forks,
and cancel them, and then re-direct the call.

The other way (feature) would be to allow onreply_route[x] to be able to
start a new fork. So if it sees that the user agent returned a 1xx
response, it could then start the second branch to the voice mail
server, with the delay answer.

Am I missing something in the current version? Is there a way to do this
now with some trick? Please let me know if any of you have figured a way
around this limitation.

Thanks,
--Dave

-----Original Message-----
From: serusers-bounces at iptel.org [mailto:serusers-bounces at lists.iptel.org] On
Behalf Of Jim Burwell
Sent: Wednesday, January 28, 2004 5:16 PM
To: Alan Crosswell
Cc: serusers at lists.iptel.org
Subject: Re: [Serusers] failure route and ERROR: t_should_relay: status
rewriteby UAS: stored: 408, received: 487

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"^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"^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. |
+-----------------------------------------------------------------------
----+




More information about the sr-users mailing list