Hi!
I have problems accounting ACK (e2e ACKs after INVITE-200 Ok). I have the following setup:
client1 proxy1 proxy2 proxy3 client2 |---INVITE--->| | | | | rewritehostport | | | | t_relay | | | | |--INVITE->| | | | | enum_lookup | | | | t_relay | | | | |-INVITE-->| | | | | lookup() | | | | t_relay | | | | |-----INVITE->| | | | | | | | | |<----200 OK--| | | |<--200 OK-| | | |<--200 OK-| | | | <--200 OK---| | | | | | | | | | ---ACK----> | | | | | loose_route | | | | |----ACK-> | | | | | loose_route | | | | |---ACK--->| | | | | loose_route | | | | |---ACK------>| | | | | |
All proxies do accounting. I do see the INVITE and BYE requests accountend by all proxies, but the ACK is only accounted by proxy1. All proxies are configured nearly identical:
# accounting parameters modparam("acc", "early_media", 1) modparam("acc", "report_ack", 1) modparam("acc", "report_cancels", 0) modparam("acc", "multi_leg_enabled", 0) modparam("acc", "failed_transaction_flag", 4) # radius, syslog and DB modparam("acc", "log_flag", 1) # syslog modparam("acc", "db_flag", 2) # DB modparam("acc", "db_missed_flag", 3) # DB missed calles table modparam("acc", "swap_direction", 1)
and all the flags are set for sure: route{ setflag(1);setflag(2); setflag(3);setflag(4);
Does somebody had a similar problem? Are there any known issues how ACKs are handled? Studying the debug log. it looks like proxy 1 identifies the ACK as belonging to a transaction, whereas proxy 2 does not find the transaction (full debug at the end of the mail):
proxy 1: ----------- t_lookup_request: start searching: hash=6242, isACK=1 parse_headers: flags=38 DEBUG: t_lookup_request: e2e proxy ACK found parse_headers: flags=8 DEBUG: totag for e2e ACK found: 0 DBG: trans=0x406b1940, callback type 4, id 0 entered parse_headers: flags=258 ACC: request acknowledged: method=ACK, i-uri=sip:user201@.....
proxy 2: ----------- t_lookup_request: start searching: hash=6242, isACK=1 DEBUG: proceeding to pre-RFC3261 transaction matching DEBUG: t_lookup_request: no transaction found DEBUG:tm:t_relay: forwarding ACK statelessly DEBUG: mk_proxy: doing DNS lookup... parse_headers: flags=1000 check_via_address(10.10.0.41, 10.10.0.41, 0) Sending: ACK sip:user201@10.10.1.50:8737 SIP/2.0^M To: <sip:+43201@proxy1
Thus, why is there a matching transaction in proxy 1, but not in proxy 2?
Why are ACKs not accounting in every case?
Thanks Klaus
proxy 1 (full debug): ------------------- SIP Request: method: <ACK> uri: sip:user201@10.10.1.50:8737 version: <SIP/2.0> parse_headers: flags=2 DEBUG: add_param: tag=2b4e3b2d DEBUG:parse_to:end of header reached, state=29 DEBUG: get_hdr_field: <To> [52]; uri=[sip:+43201@proxy1.ienum.labs.nic.at] DEBUG: to body [sip:+43201@proxy1.ienum.labs.nic.at] Found param type 232, <branch> = <z9hG4bK-d87543-685643142-1--d87543->; state=6 Found param type 235, <rport> = <n/a>; state=17 end of header reached, state=5 parse_headers: Via found, flags=2 parse_headers: this is the first via After parse_msg... preparing to run routing scripts... DEBUG : sl_filter_ACK: to late to be a local ACK! DEBUG: add_param: tag=f937ab7a DEBUG:parse_to:end of header reached, state=29 xl_printf: final buffer length 186 parse_headers: flags=100 get_hdr_field: cseq <CSeq>: <2> <ACK> DEBUG:maxfwd:is_maxfwd_present: value = 70 parse_headers: flags=200 is_preloaded: No grep_sock_info - checking if host==us: 10==10 && [10.10.1.50] == [10.10.0.41] grep_sock_info - checking if port 5060 matches port 8737 grep_sock_info - checking if host==us: 10==10 && [10.10.1.50] == [10.10.0.41] grep_sock_info - checking if port 5060 matches port 8737 grep_sock_info - checking if host==us: 10==10 && [10.10.1.50] == [10.10.0.41] grep_sock_info - checking if port 5061 matches port 8737 check_self: host != me grep_sock_info - checking if host==us: 10==10 && [10.10.0.41] == [10.10.0.41] grep_sock_info - checking if port 5060 matches port 5060 after_loose: Topmost route URI: 'sip:10.10.0.41;lr;ftag=f937ab7a' is me after_loose: URI to be processed: 'sip:10.10.0.41:5062;r2=on;ftag=f937ab7a;lr=on' after_loose: Next URI is a loose router parse_headers: flags=ffffffffffffffff DEBUG: get_hdr_body : content_length=0 found end of header DEBUG: t_newtran: msg id=2 , global msg id=0 , T on entrance=0xffffffff parse_headers: flags=ffffffffffffffff parse_headers: flags=78 t_lookup_request: start searching: hash=6242, isACK=1 parse_headers: flags=38 DEBUG: t_lookup_request: e2e proxy ACK found parse_headers: flags=8 DEBUG: totag for e2e ACK found: 0 DBG: trans=0x406b1940, callback type 4, id 0 entered parse_headers: flags=258 ACC: request acknowledged: method=ACK, i-uri=sip:user201@10.10.1.50:8737, o-uri=sip:user201@10.10.1.50:8737, call_id=9c5e0930eb2b8e5a, from="user101"sip:user101@proxy1.ienum.labs.nic.at;tag=f937ab7a, code=200 parse_headers: flags=258 grep_sock_info - checking if host==us: 10==10 && [10.10.1.50] == [10.10.0.41] grep_sock_info - checking if port 5060 matches port 8737 grep_sock_info - checking if host==us: 10==10 && [10.10.1.50] == [10.10.0.41] grep_sock_info - checking if port 5060 matches port 8737 grep_sock_info - checking if host==us: 10==10 && [10.10.1.50] == [10.10.0.41] grep_sock_info - checking if port 5061 matches port 8737 check_self: host != me Route ftag and From tag are same DEBUG:tm:t_relay: forwarding ACK statelessly DEBUG: mk_proxy: doing DNS lookup... check_via_address(10.10.1.51, 10.10.1.51, 0) Sending: ACK sip:user201@10.10.1.50:8737 SIP/2.0^M To: <sip:+43201@proxy1
proxy 2 (full debug): ------------------- SIP Request: method: <ACK> uri: sip:user201@10.10.1.50:8737 version: <SIP/2.0> parse_headers: flags=2 DEBUG: add_param: tag=2b4e3b2d DEBUG:parse_to:end of header reached, state=29 DEBUG: get_hdr_field: <To> [52]; uri=[sip:+43201@proxy1.ienum.labs.nic.at] DEBUG: to body [sip:+43201@proxy1.ienum.labs.nic.at] Found param type 232, <branch> = <0>; state=16 end of header reached, state=5 parse_headers: Via found, flags=2 parse_headers: this is the first via After parse_msg... preparing to run routing scripts... DEBUG : sl_filter_ACK: to late to be a local ACK! DEBUG: add_param: tag=f937ab7a DEBUG:parse_to:end of header reached, state=29 xl_printf: final buffer length 186 parse_headers: flags=100 Found param type 232, <branch> = <z9hG4bK-d87543-685643142-1--d87543->; state=6 Found param type 235, <rport> = <6477>; state=16 end of header reached, state=5 parse_headers: Via found, flags=100 parse_headers: this is the second via get_hdr_field: cseq <CSeq>: <2> <ACK> DEBUG:maxfwd:is_maxfwd_present: value = 69 parse_headers: flags=200 is_preloaded: No grep_sock_info - checking if host==us: 10==10 && [10.10.1.50] == [10.10.0.41] grep_sock_info - checking if port 5062 matches port 8737 grep_sock_info - checking if host==us: 10==10 && [10.10.1.50] == [10.10.0.41] grep_sock_info - checking if port 5062 matches port 8737 grep_sock_info - checking if host==us: 10==10 && [10.10.1.50] == [10.10.0.41] grep_sock_info - checking if port 5063 matches port 8737 check_self: host != me grep_sock_info - checking if host==us: 10==10 && [10.10.0.41] == [10.10.0.41] grep_sock_info - checking if port 5062 matches port 5062 after_loose: Topmost route URI: 'sip:10.10.0.41:5062;r2=on;ftag=f937ab7a;lr=on' is me grep_sock_info - checking if host==us: 10==10 && [10.10.0.41] == [10.10.0.41] grep_sock_info - checking if port 5063 matches port 5063 after_loose: URI to be processed: 'sip:10.10.0.42:5063;transport=tls;r2=on;ftag=f937ab7a;lr=on' after_loose: Next URI is a loose router DEBUG: has_totag: totag found parse_headers: flags=ffffffffffffffff DEBUG: get_hdr_body : content_length=0 found end of header DEBUG: t_newtran: msg id=1 , global msg id=0 , T on entrance=0xffffffff parse_headers: flags=ffffffffffffffff parse_headers: flags=78 t_lookup_request: start searching: hash=6242, isACK=1 DEBUG: proceeding to pre-RFC3261 transaction matching DEBUG: t_lookup_request: no transaction found DEBUG:tm:t_relay: forwarding ACK statelessly DEBUG: mk_proxy: doing DNS lookup... parse_headers: flags=1000 check_via_address(10.10.0.41, 10.10.0.41, 0) Sending: ACK sip:user201@10.10.1.50:8737 SIP/2.0^M To: <sip:+43201@proxy1