首页 > 解决方案 > 如何制作 kamailio 串行分叉?

问题描述


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

我是 kamailio 服务器开发的初学者,我想进行串行分叉,但这不起作用。

我的 kamailio 服务器回复Too Many Hops(代码:483)并结束通话。有人可以帮助我吗?


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

我使用这段代码:

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:1001@192.168.50.131: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:1002@192.168.50.131: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;
    }
}

标签: kamailio

解决方案


问题是在您的配置中,您的串行分叉路线在查看 Kamailio 位置数据库之前运行。因此,在第一次分叉之后,1001@192.168.50.131您需要以某种方式将呼叫路由到 Kamailio 查找位置数据库的部分,在默认配置中它是路由(位置)。像这样的东西:

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

不要忘记添加route(location)到您的配置中。


推荐阅读