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@domain.com -> receptionist@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@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@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@columbia\.edu"             |uri=~"^sip:vm@columbia\.edu"             |uri=~"^sip:voicemail@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@columbia.edu -> sip:vm*uUSER@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@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@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@jsbc.cc                              ICQ UIN:  1695089     |
+---------------------------------------------------------------------------+
|  Reply problems ?  Turn off the "sign" function in email prog.  Blame MS. |
+---------------------------------------------------------------------------+