[Serusers] Fw: turning 30x blind forward to INVITE

Antanas Masevicius admin at ntt.lt
Fri Aug 12 12:55:00 CEST 2005


Hello, 


this topic was last discussed here: 
http://lists.iptel.org/pipermail/serusers/2005-May/019551.html

last few days i was trying to apply juha's move() function with almost no success to 0.9.3 stable branch. 

i added such code to my ser.cfg:

onreply_route[1] {
        xlog("L_NOTICE", "Reply status %rs: Reason %rr\n");
        if (t_check_status("30[12]")) {
                xlog("L_NOTICE", "We got a 30[12]!!!!!\n");
                t_move();  # custom function by juha
                #t_reply();
        };
}

and modified move() code like this: 

inline static int move(struct sip_msg* _m, char *_foo, char *_bar)
{
        //struct sip_msg* reply;
        regmatch_t pmatch[2];
        struct hdr_field hf;
        contact_t* first;
        regex_t contact_re;

        // What is it? didn't find anywere.
        //reply = _m->final_reply;
        // MOD HERE
        if (!_m) {
                LOG(L_ERR, "move(): No reply found\n");
                return -1;
        }


        LOG(L_ERR, "move(): unparsed part of reply: %s\n", _m->unparsed);
        // FIXME: where to put this? initialisation?
        // MOD HERE
        regcomp(&contact_re, "^Contact:(.*)$", REG_EXTENDED|REG_NEWLINE);
        if ( ( regexec(&contact_re, _m->unparsed, 2, &(pmatch[0]), 0) != 0) || (pmatch[1].rm_so == -1)) {
                LOG(L_ERR, "move(): No Contact header found\n");
                return -1;
        }

        hf.type = HDR_CONTACT;
        hf.name.len = 0;
        hf.body.len = pmatch[1].rm_eo - pmatch[1].rm_so - 1;
        hf.body.s = &(_m->unparsed[pmatch[1].rm_so]);
        hf.len = hf.body.len + 2;
        hf.parsed = NULL;
        hf.next = NULL;

        // this prints out redirected contact
        LOG(L_ERR, "hf.body: '%.*s'\n", hf.body.len, hf.body.s);

        if (parse_contact(&hf) < 0) {
                LOG(L_ERR, "move(): Error while parsing Contact\n");
                goto failure;
        }

        if (((contact_body_t*)hf.parsed)->star == 1) {
                LOG(L_ERR, "move(): Contact is *\n");
                goto failure;
        }
        first = ((contact_body_t*)hf.parsed)->contacts;
        if (first) {
                // MOD HERE
                if (append_branch(_m, first->uri.s, first->uri.len, 0, 0, Q_UNSPECIFIED) == 1) {
                        goto success;
                } else {
                        LOG(L_ERR, "move(): Appending branch failed\n");
                }
        } else {
                LOG(L_ERR, "move(): No contacts in Contact header\n");
        }

failure:
        if (hf.parsed) {
                free_contact((contact_body_t**)(&(hf.parsed)));
        }
        return -1;

success:
        free_contact((contact_body_t**)(&(hf.parsed)));
        return 1;
}


it seems that t_move succeeds(), contact gets parsed and append_branch() gets execuded. But then, nothing happens. 302 is replied back to call originator. It is function build_res_buf_from_sip_res is called() which builds 302 message back to call originator..
It seems that after getting contact from 302 message, INVITE sould be generatated somehow. I suspect that i am passing wrong message to append_branch, but i didn't found how to access INVITE from tm module while in onreply_route[]. 

Can anybody with deeper ser knowledge help? 


Antanas 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sip-router.org/pipermail/sr-users/attachments/20050812/82f64f97/attachment.htm>


More information about the sr-users mailing list