Hi all,
I’m trying to implement following routing behaviour:
- ingress INVITE is sequentially forked to 1 or more endpoints - under certain conditions sequential forking may be stopped and pre-defined error returned to the caller
Here’s is part of the config responsible for handling errors:
failure_route[ROUTE_ELEMENT_FINAL_FAILURE_HELPER] { route(ROUTE_ELEMENT_FINAL_FAILURE); }
route[ROUTE_ELEMENT_FINAL_FAILURE] { # We need to check if the error happens before the first egress, because T-state is not defined yet so we can not use t_reply if ($var(before_first_egress) == 0) { t_reply("$var(sipCode)", "$var(sipMessage)"); } else { sl_send_reply("$var(sipCode)", "$var(sipMessage)"); } }
Here is a simple scenario where delivering call to first endpoint times out after receiving 180 Ringing (using custom fr_inv_timer value) where: - .33 is caller - .208 is Kamailio - .138 is callee
Notice that 504 is retransmitted by Kamailio. Here is a comparison of 180 and 504 returned by Kamailio:
As can be seen, 180 was proxied from the callee and has callee’s to-tag (tag=CALLEE1), however 504 that was generated by Kamailio using t_reply() has a different to-tag (presumably generated by Kamailio).
How can I tell Kamailio not to generate new to-tag but to use the last one that proxied back to the caller?
Thanks in advance for any help!
Regards, Ivan
Hello,
actually you are wrong that you think it is a wrong to tag. The entity that generates the final reply sets the to-tag (e.g.,to be able to match ack). Even here where you talk about the serial forking, you are going to face the case of different to-tag values for each branch sent out and replied. But also think about parallel forking, that timed out with many active branches, which to-tag to use?!?
So think that kamailio itself is the branch of the incoming request, and can create many outgoing branches. If it generates a final reply, it does it to the incoming branch. It is not forwarding (sending back) a reply from an outgoing branch.
Obviously, being open source, one can code a specific behaviour for some specific needs, but is not SIP specs compliant. If the upstream cannot deal with different to-tags, it won't really work with serial/parallel forking anyhow.
As a side remark, seeing the comments, if route(ROUTE_ELEMENT_FINAL_FAILURE) is used only in failure_route, then transaction is always defined there, because failure_route is executed only in the transaction context. Anyhow, if you are using in many places, not knowing if transaction was created, you can use send_reply() to avoid any test in the config.
Cheers, Daniel
On 11.12.20 11:04, Ivan Ribakov wrote:
Hi all,
I’m trying to implement following routing behaviour:
- ingress INVITE is sequentially forked to 1 or more endpoints
- under certain conditions sequential forking may be stopped and
pre-defined error returned to the caller
Here’s is part of the config responsible for handling errors:
failure_route[ROUTE_ELEMENT_FINAL_FAILURE_HELPER] { route(ROUTE_ELEMENT_FINAL_FAILURE); } route[ROUTE_ELEMENT_FINAL_FAILURE] { # We need to check if the error happens before the first egress, because T-state is not defined yet so we can not use t_reply if ($var(before_first_egress) == 0) { t_reply("$var(sipCode)", "$var(sipMessage)"); } else { sl_send_reply("$var(sipCode)", "$var(sipMessage)"); } }
Here is a simple scenario where delivering call to first endpoint times out after receiving 180 Ringing (using custom fr_inv_timer value) where:
- .33 is caller
- .208 is Kamailio
- .138 is callee
Notice that 504 is retransmitted by Kamailio. Here is a comparison of 180 and 504 returned by Kamailio:
As can be seen, 180 was proxied from the callee and has callee’s to-tag (tag=CALLEE1), however 504 that was generated by Kamailio using t_reply() has a different to-tag (presumably generated by Kamailio).
How can I tell Kamailio not to generate new to-tag but to use the last one that proxied back to the caller?
Thanks in advance for any help!
Regards, Ivan
Kamailio (SER) - Users Mailing List sr-users@lists.kamailio.org https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-users
you can use send_reply() to avoid any test in the config.
Thanks for the tip Daniel, will give it a go!
So think that kamailio itself is the branch of the incoming request, and can create many outgoing branches. If it generates a final reply, it does it to the incoming branch. It is not forwarding (sending back) a reply from an outgoing branch.
Ok, when you put it that way it actually makes more sense - thanks for a great example!
I still have one question left about my current scenario - why does Kamailio retransmit final non-2xx response after receiving an ACK if the response is valid and, as far as I can tell, so is the ACK?
Just to provide more context: 1) Ingress INVITE vs 504 response from Kamailio
2) 504 response from Kamailio vs Caller ACK
Regards, Ivan
On 11 Dec 2020, at 14:06, Daniel-Constantin Mierla miconda@gmail.com wrote:
Hello,
actually you are wrong that you think it is a wrong to tag. The entity that generates the final reply sets the to-tag (e.g.,to be able to match ack). Even here where you talk about the serial forking, you are going to face the case of different to-tag values for each branch sent out and replied. But also think about parallel forking, that timed out with many active branches, which to-tag to use?!?
So think that kamailio itself is the branch of the incoming request, and can create many outgoing branches. If it generates a final reply, it does it to the incoming branch. It is not forwarding (sending back) a reply from an outgoing branch.
Obviously, being open source, one can code a specific behaviour for some specific needs, but is not SIP specs compliant. If the upstream cannot deal with different to-tags, it won't really work with serial/parallel forking anyhow.
As a side remark, seeing the comments, if route(ROUTE_ELEMENT_FINAL_FAILURE) is used only in failure_route, then transaction is always defined there, because failure_route is executed only in the transaction context. Anyhow, if you are using in many places, not knowing if transaction was created, you can use send_reply() to avoid any test in the config.
Cheers, Daniel
On 11.12.20 11:04, Ivan Ribakov wrote:
Hi all,
I’m trying to implement following routing behaviour:
- ingress INVITE is sequentially forked to 1 or more endpoints
- under certain conditions sequential forking may be stopped and pre-defined error returned to the caller
Here’s is part of the config responsible for handling errors:
failure_route[ROUTE_ELEMENT_FINAL_FAILURE_HELPER] { route(ROUTE_ELEMENT_FINAL_FAILURE); }
route[ROUTE_ELEMENT_FINAL_FAILURE] { # We need to check if the error happens before the first egress, because T-state is not defined yet so we can not use t_reply if ($var(before_first_egress) == 0) { t_reply("$var(sipCode)", "$var(sipMessage)"); } else { sl_send_reply("$var(sipCode)", "$var(sipMessage)"); } }
Here is a simple scenario where delivering call to first endpoint times out after receiving 180 Ringing (using custom fr_inv_timer value) where:
- .33 is caller
- .208 is Kamailio
- .138 is callee
Notice that 504 is retransmitted by Kamailio. Here is a comparison of 180 and 504 returned by Kamailio:
As can be seen, 180 was proxied from the callee and has callee’s to-tag (tag=CALLEE1), however 504 that was generated by Kamailio using t_reply() has a different to-tag (presumably generated by Kamailio).
How can I tell Kamailio not to generate new to-tag but to use the last one that proxied back to the caller?
Thanks in advance for any help!
Regards, Ivan
Kamailio (SER) - Users Mailing List sr-users@lists.kamailio.org mailto:sr-users@lists.kamailio.org https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-users https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-users
-- Daniel-Constantin Mierla -- www.asipto.com http://www.asipto.com/ www.twitter.com/miconda http://www.twitter.com/miconda -- www.linkedin.com/in/miconda http://www.linkedin.com/in/miconda Funding: https://www.paypal.me/dcmierla https://www.paypal.me/dcmierla