I am having a problem with calls that are parallel forked.  The problem happens when a call comes in, gets forked using multiple aliases and one UA is unavailable.  The question is, how do I handle the offline call leg?

I can't do if (!lookup("location")) { break; (or sl_send_reply("404") } because then the whole call dies since each branch of the call uses the same callid.

If I t_relay them both, then the fork works but I the offline leg gets repeatedly relayed unltil I get a 483 "Too many hops".  This scenario would be OK [althought certainly not ideal], except it does not allow me to add a condition to hunt to the next number upon a failed lookup("location"). If I do, the online UA will ring once and the offline UA will get routed immediately to voicemail which picks up after just one ring.

How are other handling these problems?  I think the answer lies in letting failure_route handle everything, but I don't know how to get that to work because if I don't handle the offline users in the (!lookup("location"), I end up with routing loops and eventualluy a 483.  Anybody that has no online contacts whatsoever never makes it to failure_route (where the forward to VM is handled).

Below is my ser.cfg.  I've been playing around with things like if (isflagset(6)) { route(x) } but I still need some way to handle the failed portion of the fork.  Is there a way to "null route" the failed portion or something?



route {

/* Registration and other logic snipped for brevity */

        # Translate local address according to aliases table
        xlog("L_INFO", "%ci: Preparing to look up alias for %ru\n");
        if(lookup("aliases")) {
                xlog("L_NOTICE", "%ci: alias lookup changed uri to %ru\n");

                if (!(uri==myself)) {
                        xlog("L_NOTICE", "%ci: Outbound aliases %ru\n");
                        route(4);
                        break;
                };

        };


        if ( (uri=~"^sip:411@.*") | (uri=~"^sip:911@.*") | (uri=~"^sip:011[0-9]+@.*") | (uri=~"^sip:1[0-9]{10}@.*") ) {
                        route(3);   # 3: PSTN with authentication
                        break;
        };

        # Anything left is a local call.

        xlog("L_INFO", "%ci: Preparing to look up location for %ru\n");
        if (!lookup("location")) {
                xlog("L_NOTICE", "%ci: no location for %ru\n");
                setflag(5);
        } else {
                # Had a sucessful lookup
                setflag(6);
        };

        route(4);

}



route[4] {
        # If an invitation, we want to hunt on failure

        if(method == "INVITE") {
                t_on_failure("1");  # first hunt
        };

        append_hf("P-hint: relay\r\n");

        xlog("L_NOTICE", "%ci: r4: t_relay %ru\n");
        if (!t_relay()) {
                xlog("L_NOTICE", "%ci: %ru r4: Relay Failed\n");
                sl_reply_error();
                break;
        };

}


failure_route[1] { revert_uri();  route(7); }   ### Handle hunt sequences.