Search code examples
kamailio

how to make kamailio serial forking?



@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

I am a beginner in kamailio server development, and I want to make serial forking, but that doesn't work.

My kamailio server replies Too Many Hops (code: 483) and end the call. can someone helps me please.


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

I use this code :

request_route {
    
    # per request initial checks
    route(REQINIT);

    
    # CANCEL processing
    if (is_method("CANCEL")) {
        if (t_check_trans()) {
            t_relay();
        }
        exit;
    }

    # handle retransmissions
    if (!is_method("ACK")) {
        if(t_precheck_trans()) {
            t_check_trans();
            exit;
        }
        t_check_trans();
    }

    if (is_method("INVITE|SUBSCRIBE")) {
        record_route();
    }

    if(is_method("REGISTER"))
        save("location");

    # test serial forking

    if (method=="INVITE") {
        
        if(!t_is_set("branch_route")) route(SERIAL);
    };

    if(lookup("location")){
        if (!t_relay()) {
            sl_reply_error();
        }                 
        exit;
    }
}



route[SERIAL]{
    $ru = "sip:[email protected]:5060";
    xlog("ALERT : new request uri $ru \n");
    t_on_failure("1");
    t_relay();
}

failure_route[1] {
    if(t_is_canceled()) {
        exit;
    }
    
    xlog(" an other alternative \n");

    if(t_check_status("486|408")){
        $ru = "sip:[email protected]:5060";
        xlog(" an other uri $ru \n");
        t_on_failure("2");
        t_relay();
        exit;
    }
}

failure_route[2] {
    if(t_is_canceled()) {
        exit;
    }

    xlog( "nobody available \n");
    t_reply("500", "Server error"); 
}


# Per SIP request initial checks

route[REQINIT] {
    # no connect for sending replies
    set_reply_no_connect();

#!ifdef WITH_ANTIFLOOD
    # flood detection from same IP and traffic ban for a while
    # be sure you exclude checking trusted peers, such as pstn gateways
    # - local host excluded (e.g., loop to self)
    if(src_ip!=myself) {
        if($sht(ipban=>$si)!=$null) {
            # ip is already blocked
            xdbg("request from blocked IP - $rm from $fu (IP:$si:$sp)\n");
            exit;
        }
        if (!pike_check_req()) {
            xlog("L_ALERT","ALERT: pike blocking $rm from $fu (IP:$si:$sp)\n");
            $sht(ipban=>$si) = 1;
            exit;
        }
    }
#!endif
    if($ua =~ "friendly-scanner|sipcli|sipvicious|VaxSIPUserAgent") {
        # silent drop for scanners - uncomment next line if want to reply
        # sl_send_reply("200", "OK");
        exit;
    }

    if (!mf_process_maxfwd_header("10")) {
        sl_send_reply("483","Too Many Hops");
        exit;
    }

    if(is_method("OPTIONS") && uri==myself && $rU==$null) {
        sl_send_reply("200","Keepalive");
        exit;
    }

    if(!sanity_check("17895", "7")) {
        xlog("Malformed SIP request from $si:$sp\n");
        exit;
    }
}


Solution

  • Problem is that in your config your serial forking route runs before looking into Kamailio location DB. So after first fork to [email protected] you need somehow to route call to part where Kamailio looks into location DB, in default config it is route(LOCATION). Something like this:

    route[SERIAL]{
        $ru = "sip:[email protected]:5060";
        xlog("ALERT : new request uri $ru \n");
        t_on_failure("1");
        route(location);
    }
    

    Don't forget to add route(location) to your config.